From 76bfcf40ca26579a4274cc3c79404309cc86dd63 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 21 Nov 2021 00:48:13 +0300 Subject: [PATCH 01/18] Copy original togl to track changes --- public/togles/glfuncs.inl | 2 + public/togles/linuxwin/cglmbuffer.h | 262 + public/togles/linuxwin/cglmfbo.h | 104 + public/togles/linuxwin/cglmprogram.h | 458 ++ public/togles/linuxwin/cglmquery.h | 108 + public/togles/linuxwin/cglmtex.h | 547 ++ public/togles/linuxwin/dxabstract.h | 1444 ++++ public/togles/linuxwin/dxabstract_types.h | 1748 +++++ public/togles/linuxwin/glbase.h | 117 + public/togles/linuxwin/glentrypoints.h | 403 ++ public/togles/linuxwin/glfuncs.h | 277 + public/togles/linuxwin/glmdebug.h | 181 + public/togles/linuxwin/glmdisplay.h | 201 + public/togles/linuxwin/glmdisplaydb.h | 157 + public/togles/linuxwin/glmgr.h | 2435 +++++++ public/togles/linuxwin/glmgrbasics.h | 332 + public/togles/linuxwin/glmgrext.h | 123 + public/togles/rendermechanism.h | 73 + togles/linuxwin/asanstubs.cpp | 17 + togles/linuxwin/cglmbuffer.cpp | 1215 ++++ togles/linuxwin/cglmfbo.cpp | 355 + togles/linuxwin/cglmprogram.cpp | 1570 +++++ togles/linuxwin/cglmquery.cpp | 363 + togles/linuxwin/cglmtex.cpp | 1990 ++++++ togles/linuxwin/dx9asmtogl2.cpp | 3838 +++++++++++ togles/linuxwin/dx9asmtogl2.h | 261 + togles/linuxwin/dxabstract.cpp | 6845 +++++++++++++++++++ togles/linuxwin/glentrypoints.cpp | 512 ++ togles/linuxwin/glmgr.cpp | 6092 +++++++++++++++++ togles/linuxwin/glmgr_flush.inl | 622 ++ togles/linuxwin/glmgrbasics.cpp | 4688 +++++++++++++ togles/linuxwin/glmgrcocoa.mm | 34 + togles/linuxwin/glmtexinlines.h | 29 + togles/linuxwin/intelglmallocworkaround.cpp | 71 + togles/linuxwin/intelglmallocworkaround.h | 61 + togles/linuxwin/mach_override.c | 765 +++ togles/linuxwin/mach_override.h | 76 + togles/togl.vpc | 116 + togles/wscript | 62 + 39 files changed, 38554 insertions(+) create mode 100644 public/togles/glfuncs.inl create mode 100644 public/togles/linuxwin/cglmbuffer.h create mode 100644 public/togles/linuxwin/cglmfbo.h create mode 100644 public/togles/linuxwin/cglmprogram.h create mode 100644 public/togles/linuxwin/cglmquery.h create mode 100644 public/togles/linuxwin/cglmtex.h create mode 100644 public/togles/linuxwin/dxabstract.h create mode 100644 public/togles/linuxwin/dxabstract_types.h create mode 100644 public/togles/linuxwin/glbase.h create mode 100644 public/togles/linuxwin/glentrypoints.h create mode 100644 public/togles/linuxwin/glfuncs.h create mode 100644 public/togles/linuxwin/glmdebug.h create mode 100644 public/togles/linuxwin/glmdisplay.h create mode 100644 public/togles/linuxwin/glmdisplaydb.h create mode 100644 public/togles/linuxwin/glmgr.h create mode 100644 public/togles/linuxwin/glmgrbasics.h create mode 100644 public/togles/linuxwin/glmgrext.h create mode 100644 public/togles/rendermechanism.h create mode 100644 togles/linuxwin/asanstubs.cpp create mode 100644 togles/linuxwin/cglmbuffer.cpp create mode 100644 togles/linuxwin/cglmfbo.cpp create mode 100644 togles/linuxwin/cglmprogram.cpp create mode 100644 togles/linuxwin/cglmquery.cpp create mode 100644 togles/linuxwin/cglmtex.cpp create mode 100644 togles/linuxwin/dx9asmtogl2.cpp create mode 100644 togles/linuxwin/dx9asmtogl2.h create mode 100644 togles/linuxwin/dxabstract.cpp create mode 100644 togles/linuxwin/glentrypoints.cpp create mode 100644 togles/linuxwin/glmgr.cpp create mode 100644 togles/linuxwin/glmgr_flush.inl create mode 100644 togles/linuxwin/glmgrbasics.cpp create mode 100644 togles/linuxwin/glmgrcocoa.mm create mode 100644 togles/linuxwin/glmtexinlines.h create mode 100644 togles/linuxwin/intelglmallocworkaround.cpp create mode 100644 togles/linuxwin/intelglmallocworkaround.h create mode 100644 togles/linuxwin/mach_override.c create mode 100644 togles/linuxwin/mach_override.h create mode 100644 togles/togl.vpc create mode 100755 togles/wscript diff --git a/public/togles/glfuncs.inl b/public/togles/glfuncs.inl new file mode 100644 index 00000000..1f6b3b45 --- /dev/null +++ b/public/togles/glfuncs.inl @@ -0,0 +1,2 @@ +#include "togl/linuxwin/glfuncs.h" + diff --git a/public/togles/linuxwin/cglmbuffer.h b/public/togles/linuxwin/cglmbuffer.h new file mode 100644 index 00000000..10782243 --- /dev/null +++ b/public/togles/linuxwin/cglmbuffer.h @@ -0,0 +1,262 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmprogram.h +// GLMgr buffers (index / vertex) +// ... maybe add PBO later as well +//=============================================================================== + +#ifndef CGLMBUFFER_H +#define CGLMBUFFER_H + +#pragma once + +//=============================================================================== + +extern bool g_bUsePseudoBufs; + +// forward declarations + +class GLMContext; + +enum EGLMBufferType +{ + kGLMVertexBuffer, + kGLMIndexBuffer, + kGLMUniformBuffer, // for bindable uniform + kGLMPixelBuffer, // for PBO + + kGLMNumBufferTypes +}; + +// pass this in "options" to constructor to make a dynamic buffer +#define GLMBufferOptionDynamic 0x00000001 + +struct GLMBuffLockParams +{ + uint m_nOffset; + uint m_nSize; + bool m_bNoOverwrite; + bool m_bDiscard; +}; + +#define GL_STATIC_BUFFER_SIZE ( 2048 * 1024 ) +#define GL_MAX_STATIC_BUFFERS 2 + +extern void glBufferSubDataMaxSize( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data, uint nMaxSizePerCall = 128 * 1024 ); + +//===========================================================================// + +// Creates an immutable storage for a buffer object +// https://www.opengl.org/registry/specs/ARB/buffer_storage.txt +class CPersistentBuffer +{ +public: + + CPersistentBuffer(); + ~CPersistentBuffer(); + + void Init( EGLMBufferType type,uint nSize ); + void Deinit(); + + void InsertFence(); + void BlockUntilNotBusy(); + + void Append( uint nSize ); + + inline uint GetBytesRemaining() const { return m_nSize - m_nOffset; } + inline uint GetOffset() const { return m_nOffset; } + inline void *GetPtr() const { return m_pImmutablePersistentBuf; } + inline GLuint GetHandle() const { return m_nHandle; } + +private: + + CPersistentBuffer( const CPersistentBuffer & ); + CPersistentBuffer & operator= (const CPersistentBuffer &); + + uint m_nSize; + + EGLMBufferType m_type; + GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB + GLuint m_nHandle; // handle of this program in the GL context + + // Holds a pointer to the persistently mapped buffer + void* m_pImmutablePersistentBuf; + + uint m_nOffset; + +#ifdef HAVE_GL_ARB_SYNC + GLsync m_nSyncObj; +#endif +}; + +//=============================================================================== + +#if GL_ENABLE_INDEX_VERIFICATION + +struct GLDynamicBuf_t +{ + GLenum m_nGLType; + uint m_nHandle; + uint m_nActualBufSize; + uint m_nSize; + + uint m_nLockOffset; + uint m_nLockSize; +}; + +class CGLMBufferSpanManager +{ + CGLMBufferSpanManager( const CGLMBufferSpanManager& ); + CGLMBufferSpanManager& operator= ( const CGLMBufferSpanManager& ); + +public: + CGLMBufferSpanManager(); + ~CGLMBufferSpanManager(); + + void Init( GLMContext *pContext, EGLMBufferType nBufType, uint nInitialCapacity, uint nBufSize, bool bDynamic ); + void Deinit(); + + inline GLMContext *GetContext() const { return m_pCtx; } + + inline GLenum GetGLBufType() const { return ( m_nBufType == kGLMVertexBuffer ) ? GL_ARRAY_BUFFER_ARB : GL_ELEMENT_ARRAY_BUFFER_ARB; } + + struct ActiveSpan_t + { + uint m_nStart; + uint m_nEnd; + + GLDynamicBuf_t m_buf; + bool m_bOriginalAlloc; + + inline ActiveSpan_t() { } + inline ActiveSpan_t( uint nStart, uint nEnd, GLDynamicBuf_t &buf, bool bOriginalAlloc ) : m_nStart( nStart ), m_nEnd( nEnd ), m_buf( buf ), m_bOriginalAlloc( bOriginalAlloc ) { Assert( nStart <= nEnd ); } + }; + + ActiveSpan_t *AddSpan( uint nOffset, uint nMaxSize, uint nActualSize, bool bDiscard, bool bNoOverwrite ); + + void DiscardAllSpans(); + + bool IsValid( uint nOffset, uint nSize ) const; + +private: + bool AllocDynamicBuf( uint nSize, GLDynamicBuf_t &buf ); + void ReleaseDynamicBuf( GLDynamicBuf_t &buf ); + + GLMContext *m_pCtx; + + EGLMBufferType m_nBufType; + + uint m_nBufSize; + bool m_bDynamic; + + CUtlVector m_ActiveSpans; + CUtlVector m_DeletedSpans; + + int m_nSpanEndMax; + + int m_nNumAllocatedBufs; + int m_nTotalBytesAllocated; +}; + +#endif // GL_ENABLE_INDEX_VERIFICATION + +class CGLMBuffer +{ +public: + void Lock( GLMBuffLockParams *pParams, char **pAddressOut ); + void Unlock( int nActualSize = -1, const void *pActualData = NULL ); + + GLuint GetHandle() const; + + friend class GLMContext; // only GLMContext can make CGLMBuffer objects + friend class GLMTester; + friend struct IDirect3D9; + friend struct IDirect3DDevice9; + + CGLMBuffer( GLMContext *pCtx, EGLMBufferType type, uint size, uint options ); + ~CGLMBuffer(); + + void SetModes( bool bAsyncMap, bool bExplicitFlush, bool bForce = false ); + void FlushRange( uint offset, uint size ); + +#if GL_ENABLE_INDEX_VERIFICATION + bool IsSpanValid( uint nOffset, uint nSize ) const; +#endif + + GLMContext *m_pCtx; // link back to parent context + EGLMBufferType m_type; + uint m_nSize; + uint m_nActualSize; + + bool m_bDynamic; + + GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB + GLuint m_nHandle; // name of this program in the context + + uint m_nRevision; // bump anytime the size changes or buffer is orphaned + + bool m_bEnableAsyncMap; // mirror of the buffer state + bool m_bEnableExplicitFlush; // mirror of the buffer state + + bool m_bMapped; // is it currently mapped + + uint m_dirtyMinOffset; // when equal, range is empty + uint m_dirtyMaxOffset; + + float *m_pLastMappedAddress; + + int m_nPinnedMemoryOfs; + + uint m_nPersistentBufferStartOffset; + bool m_bUsingPersistentBuffer; + + bool m_bPseudo; // true if the m_name is 0, and the backing is plain RAM + + // in pseudo mode, there is just one RAM buffer that acts as the backing. + // expectation is that this mode would only be used for dynamic indices. + // since indices have to be consumed (copied to command stream) prior to return from a drawing call, + // there's no need to do any fencing or multibuffering. orphaning in particular becomes a no-op. + + char *m_pActualPseudoBuf; // storage for pseudo buffer + char *m_pPseudoBuf; // storage for pseudo buffer + char *m_pStaticBuffer; + + GLMBuffLockParams m_LockParams; + + static char ALIGN16 m_StaticBuffers[ GL_MAX_STATIC_BUFFERS ][ GL_STATIC_BUFFER_SIZE ] ALIGN16_POST; + static bool m_bStaticBufferUsed[ GL_MAX_STATIC_BUFFERS ]; + +#if GL_ENABLE_INDEX_VERIFICATION + CGLMBufferSpanManager m_BufferSpanManager; +#endif + +#if GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION + uint m_nDirtyRangeStart; + uint m_nDirtyRangeEnd; +#endif +}; + +#endif // CGLMBUFFER_H + diff --git a/public/togles/linuxwin/cglmfbo.h b/public/togles/linuxwin/cglmfbo.h new file mode 100644 index 00000000..93ebb11f --- /dev/null +++ b/public/togles/linuxwin/cglmfbo.h @@ -0,0 +1,104 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmfbo.h +// GLMgr FBO's (render targets) +// +//=============================================================================== + +#ifndef CGLMFBO_H +#define CGLMFBO_H + +#pragma once + +// good FBO references / recaps +// http://www.songho.ca/opengl/gl_fbo.html +// http://www.gamedev.net/reference/articles/article2331.asp + +// ext links + +// http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt +// http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt + +//=============================================================================== + +// tokens not in the SDK headers + +#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT + #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 +#endif + +//=============================================================================== + +// forward declarations + +class GLMContext; + +enum EGLMFBOAttachment +{ + kAttColor0, kAttColor1, kAttColor2, kAttColor3, + kAttDepth, kAttStencil, kAttDepthStencil, + kAttCount +}; + +struct GLMFBOTexAttachParams +{ + CGLMTex *m_tex; + int m_face; // keep zero if not cube map + int m_mip; // keep zero if notmip mapped + int m_zslice; // keep zero if not a 3D tex +}; + +class CGLMFBO +{ + friend class GLMContext; + friend class GLMTester; + friend class CGLMTex; + + friend struct IDirect3D9; + friend struct IDirect3DDevice9; + +public: + CGLMFBO( GLMContext *ctx ); + ~CGLMFBO( ); + +protected: + void TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT ); + void TexDetach( EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT ); + // you can also pass GL_READ_FRAMEBUFFER_EXT or GL_DRAW_FRAMEBUFFER_EXT to selectively bind the receiving FBO to one or the other. + + void TexScrub( CGLMTex *tex ); + // search and destroy any attachment for the named texture + + bool IsReady( void ); // aka FBO completeness check - ready to draw + + GLMContext *m_ctx; // link back to parent context + + GLuint m_name; // name of this FBO in the context + + GLMFBOTexAttachParams m_attach[ kAttCount ]; // indexed by EGLMFBOAttachment +}; + + +#endif \ No newline at end of file diff --git a/public/togles/linuxwin/cglmprogram.h b/public/togles/linuxwin/cglmprogram.h new file mode 100644 index 00000000..64dbc121 --- /dev/null +++ b/public/togles/linuxwin/cglmprogram.h @@ -0,0 +1,458 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmprogram.h +// GLMgr programs (ARBVP/ARBfp) +// +//=============================================================================== + +#ifndef CGLMPROGRAM_H +#define CGLMPROGRAM_H + +#include + +#pragma once + +// good ARB program references +// http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html +// http://petewarden.com/notes/archives/2005/06/fragment_progra_3.html + +// ext links + +// http://www.opengl.org/registry/specs/ARB/vertex_program.txt +// http://www.opengl.org/registry/specs/ARB/fragment_program.txt +// http://www.opengl.org/registry/specs/EXT/gpu_program_parameters.txt + + +//=============================================================================== + +// tokens not in the SDK headers + +//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT +// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 +//#endif + +//=============================================================================== + +// forward declarations + +class GLMContext; +class CGLMShaderPair; +class CGLMShaderPairCache; + +// CGLMProgram can contain two flavors of the same program, one in assembler, one in GLSL. +// these flavors are pretty different in terms of the API's that are used to activate them - +// for example, assembler programs can just get bound to the context, whereas GLSL programs +// have to be linked. To some extent we try to hide that detail inside GLM. + +// for now, make CGLMProgram a container, it does not set policy or hold a preference as to which +// flavor you want to use. GLMContext has to handle that. + +enum EGLMProgramType +{ + kGLMVertexProgram, + kGLMFragmentProgram, + + kGLMNumProgramTypes +}; + +enum EGLMProgramLang +{ + kGLMARB, + kGLMGLSL, + + kGLMNumProgramLangs +}; + +struct GLMShaderDesc +{ + union + { + GLuint arb; // ARB program object name + GLhandleARB glsl; // GLSL shader object handle (void*) + } m_object; + + // these can change if shader text is edited + bool m_textPresent; // is this flavor(lang) of text present in the buffer? + int m_textOffset; // where is it + int m_textLength; // how big + + bool m_compiled; // has this text been through a compile attempt + bool m_valid; // and if so, was the compile successful + + int m_slowMark; // has it been flagged during a non native draw batch before. increment every time it's slow. + + int m_highWater; // count of vec4's in the major uniform array ("vc" on vs, "pc" on ps) + // written by dxabstract.... gross! + int m_VSHighWaterBone; // count of vec4's in the bone-specific uniform array (only valid for vertex shaders) +}; + +GLenum GLMProgTypeToARBEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target +GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target + +#define GL_SHADER_PAIR_CACHE_STATS 0 + +class CGLMProgram +{ +public: + friend class CGLMShaderPairCache; + friend class CGLMShaderPair; + friend class GLMContext; // only GLMContext can make CGLMProgram objects + friend class GLMTester; + friend struct IDirect3D9; + friend struct IDirect3DDevice9; + + //=============================== + + // constructor is very light, it just makes one empty program object per flavor. + CGLMProgram( GLMContext *ctx, EGLMProgramType type ); + ~CGLMProgram( ); + + void SetProgramText ( char *text ); // import text to GLM object - invalidate any prev compiled program + void SetShaderName ( const char *name ); // only used for debugging/telemetry markup + + void CompileActiveSources ( void ); // compile only the flavors that were provided. + void Compile ( EGLMProgramLang lang ); + bool CheckValidity ( EGLMProgramLang lang ); + + void LogSlow ( EGLMProgramLang lang ); // detailed spew when called for first time; one liner or perhaps silence after that + + void GetLabelIndexCombo ( char *labelOut, int labelOutMaxChars, int *indexOut, int *comboOut ); + void GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ); // mmmmmmmm-nnnnnnnn-filename + +#if GLMDEBUG + bool PollForChanges( void ); // check mirror for changes. + void ReloadStringFromEditable( void ); // populate m_string from editable item (react to change) + bool SyncWithEditable( void ); +#endif + + //=============================== + + // common stuff + + GLMContext *m_ctx; // link back to parent context + + EGLMProgramType m_type; // vertex or pixel + + unsigned long m_nHashTag; // serial number for hashing + + char *m_text; // copy of text passed into constructor. Can change if editable shaders is enabled. + // note - it can contain multiple flavors, so use CGLMTextSectioner to scan it and locate them +#if GLMDEBUG + CGLMEditableTextItem *m_editable; // editable text item for debugging +#endif + + GLMShaderDesc m_descs[ kGLMNumProgramLangs ]; + + uint m_samplerMask; // (1<> 16 ); + // Apply half pixel offset to output vertices to account for the pixel center difference between D3D9 and OpenGL. + // We output vertices in clip space, which ranges from [-1,1], so 1.0/width in clip space transforms into .5/width in screenspace, see: "Viewports and Clipping (Direct3D 9)" in the DXSDK + float v[4] = { 1.0f / fWidth, 1.0f / fHeight, fWidth, fHeight }; + if ( m_locVertexScreenParams >= 0 ) + gGL->glUniform4fv( m_locVertexScreenParams, 1, v ); + } + + //=============================== + + // common stuff + + GLMContext *m_ctx; // link back to parent context + + CGLMProgram *m_vertexProg; + CGLMProgram *m_fragmentProg; + + GLhandleARB m_program; // linked program object + + // need meta data for attribs / samplers / params + // actually we only need it for samplers and params. + // attributes are hardwired. + + // vertex stage uniforms + GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention + GLint m_locVertexBoneParams; // "vcbones" + GLint m_locVertexInteger0; // "i0" + + enum { cMaxVertexShaderBoolUniforms = 4, cMaxFragmentShaderBoolUniforms = 1 }; + + GLint m_locVertexBool[cMaxVertexShaderBoolUniforms]; // "b0", etc. + GLint m_locFragmentBool[cMaxFragmentShaderBoolUniforms]; // "fb0", etc. + bool m_bHasBoolOrIntUniforms; + + // fragment stage uniforms + GLint m_locFragmentParams; // "pc" per dx9asmtogl2 convention + + int m_NumUniformBufferParams[kGLMNumProgramTypes]; + GLint m_UniformBufferParams[kGLMNumProgramTypes][256]; + + GLint m_locFragmentFakeSRGBEnable; // "flSRGBWrite" - set to 1.0 to effect sRGB encoding on output + float m_fakeSRGBEnableValue; // shadow to avoid redundant sets of the m_locFragmentFakeSRGBEnable uniform + // init it to -1.0 at link or relink, so it will trip on any legit incoming value (0.0 or 1.0) + + GLint m_locSamplers[ GLM_SAMPLER_COUNT ]; // "sampler0 ... sampler1..." + + // other stuff + bool m_valid; // true on successful link + bool m_bCheckLinkStatus; + uint m_revision; // if this pair is relinked, bump this number. + + GLint m_locVertexScreenParams; // vcscreen + uint m_nScreenWidthHeight; + +}; + +//=============================================================================== + +// N-row, M-way associative cache with LRU per row. +// still needs some metric dump ability and some parameter tuning. +// extra credit would be to make an auto-tuner. + +struct CGLMPairCacheEntry +{ + long long m_lastMark; // a mark of zero means an empty entry + CGLMProgram *m_vertexProg; + CGLMProgram *m_fragmentProg; + uint m_extraKeyBits; + CGLMShaderPair *m_pair; +}; + +class CGLMShaderPairCache // cache for linked GLSL shader pairs +{ + +public: + +protected: + friend class CGLMShaderPair; + friend class CGLMProgram; + friend class GLMContext; + + //=============================== + + CGLMShaderPairCache( GLMContext *ctx ); + ~CGLMShaderPairCache( ); + + FORCEINLINE CGLMShaderPair *SelectShaderPair ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ); + void QueryShaderPair ( int index, GLMShaderPairInfo *infoOut ); + + // shoot down linked pairs that use the program in the arg + // return true if any had to be skipped due to conflict with currently bound pair + bool PurgePairsWithShader( CGLMProgram *prog ); + + // purge everything (when would GLM know how to do this ? at context destroy time, but any other times?) + // return true if any had to be skipped due to conflict with currently bound pair + bool Purge ( void ); + + // stats + void DumpStats ( void ); + + //=============================== + + FORCEINLINE uint HashRowIndex( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ) const; + FORCEINLINE CGLMPairCacheEntry* HashRowPtr( uint hashRowIndex ) const; + + FORCEINLINE void HashRowProbe( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int &hitway, int &emptyway, int &oldestway ); + + CGLMShaderPair *SelectShaderPairInternal( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int rowIndex ); + //=============================== + + // common stuff + + GLMContext *m_ctx; // link back to parent context + + long long m_mark; + + uint m_rowsLg2; + uint m_rows; + uint m_rowsMask; + + uint m_waysLg2; + uint m_ways; + + uint m_entryCount; + + CGLMPairCacheEntry *m_entries; // array[ m_rows ][ m_ways ] + + uint *m_evictions; // array[ m_rows ]; + +#if GL_SHADER_PAIR_CACHE_STATS + uint *m_hits; // array[ m_rows ]; +#endif +}; + +FORCEINLINE uint CGLMShaderPairCache::HashRowIndex( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ) const +{ + return ( vp->m_nHashTag + fp->m_nHashTag + extraKeyBits * 7 ) & m_rowsMask; +} + +FORCEINLINE CGLMPairCacheEntry* CGLMShaderPairCache::HashRowPtr( uint hashRowIndex ) const +{ + return &m_entries[ hashRowIndex * m_ways ]; +} + +FORCEINLINE void CGLMShaderPairCache::HashRowProbe( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int& hitway, int& emptyway, int& oldestway ) +{ + hitway = -1; + emptyway = -1; + oldestway = -1; + + // scan this row to see if the desired pair is present + CGLMPairCacheEntry *cursor = row; + long long oldestmark = 0xFFFFFFFFFFFFFFFFLL; + + for( uint way = 0; way < m_ways; ++way ) + { + if ( cursor->m_lastMark != 0 ) // occupied slot + { + // check if this is the oldest one on the row - only occupied slots are checked + if ( cursor->m_lastMark < oldestmark ) + { + oldestway = way; + oldestmark = cursor->m_lastMark; + } + + if ( ( cursor->m_vertexProg == vp ) && ( cursor->m_fragmentProg == fp ) && ( cursor->m_extraKeyBits == extraKeyBits ) ) // match? + { + // found it + hitway = way; + break; + } + } + else + { + // empty way, log it if first one seen + if (emptyway<0) + { + emptyway = way; + } + } + cursor++; + } +} + +FORCEINLINE CGLMShaderPair *CGLMShaderPairCache::SelectShaderPair( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ) +{ + // select row where pair would be found if it exists + uint rowIndex = HashRowIndex( vp, fp, extraKeyBits ); + + CGLMPairCacheEntry *pCursor = HashRowPtr( rowIndex ); + + if ( ( pCursor->m_fragmentProg != fp ) || ( pCursor->m_vertexProg != vp ) || ( pCursor->m_extraKeyBits != extraKeyBits ) ) + { + CGLMPairCacheEntry *pLastCursor = pCursor + m_ways; + + ++pCursor; + + while ( pCursor != pLastCursor ) + { + if ( ( pCursor->m_fragmentProg == fp ) && ( pCursor->m_vertexProg == vp ) && ( pCursor->m_extraKeyBits == extraKeyBits ) ) // match? + break; + ++pCursor; + }; + + if ( pCursor == pLastCursor ) + return SelectShaderPairInternal( vp, fp, extraKeyBits, rowIndex ); + } + + // found it. mark it and return + pCursor->m_lastMark = m_mark++; + +#if GL_SHADER_PAIR_CACHE_STATS + // count the hit + m_hits[ rowIndex ] ++; +#endif + + return pCursor->m_pair; +} + +#endif diff --git a/public/togles/linuxwin/cglmquery.h b/public/togles/linuxwin/cglmquery.h new file mode 100644 index 00000000..168e3f7c --- /dev/null +++ b/public/togles/linuxwin/cglmquery.h @@ -0,0 +1,108 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmquery.h +// GLMgr queries +// +//=============================================================================== + +#ifndef CGLMQUERY_H +#define CGLMQUERY_H + +#pragma once + +//=============================================================================== + +// forward declarations + +class GLMContext; +class CGLMQuery; + +//=============================================================================== + +enum EGLMQueryType +{ + EOcclusion, + EFence, + EGLMQueryCount +}; + +struct GLMQueryParams +{ + EGLMQueryType m_type; +}; + +class CGLMQuery +{ + // leave everything public til it's running +public: + friend class GLMContext; // only GLMContext can make CGLMTex objects + friend struct IDirect3DDevice9; + friend struct IDirect3DQuery9; + + GLMContext *m_ctx; // link back to parent context + GLMQueryParams m_params; // params created with + + GLuint m_name; // name of the query object per se - could be fence, could be query object ... NOT USED WITH GL_ARB_sync! +#ifdef HAVE_GL_ARB_SYNC + GLsync m_syncobj; // GL_ARB_sync object. NOT USED WITH GL_NV_fence or GL_APPLE_fence! +#else + GLuint m_syncobj; +#endif + + bool m_started; + bool m_stopped; + bool m_done; + + bool m_nullQuery; // was gl_nullqueries true at Start time - if so, continue to act like a null query through Stop/IsDone/Complete time + // restated - only Start should examine the convar. + static uint s_nTotalOcclusionQueryCreatesOrDeletes; + + CGLMQuery( GLMContext *ctx, GLMQueryParams *params ); + ~CGLMQuery( ); + + // for an occlusion query: + // Start = BeginQuery query-start goes into stream + // Stop = EndQuery query-end goes into stream - a fence is also set so we can probe for completion + // IsDone = TestFence use the added fence to ask if query-end has passed (i.e. will Complete block?) + // Complete = GetQueryObjectuivARB(uint id, enum pname, uint *params) - extract the sample count + + // for a fence query: + // Start = SetFence fence goes into command stream + // Stop = NOP fences are self finishing - no need to call Stop on a fence + // IsDone = TestFence ask if fence passed + // Complete = FinishFence + + void Start ( void ); + void Stop ( void ); + bool IsDone ( void ); + void Complete ( uint *result ); + + // accessors for the started/stopped state + bool IsStarted ( void ); + bool IsStopped ( void ); +}; + + +#endif diff --git a/public/togles/linuxwin/cglmtex.h b/public/togles/linuxwin/cglmtex.h new file mode 100644 index 00000000..55321316 --- /dev/null +++ b/public/togles/linuxwin/cglmtex.h @@ -0,0 +1,547 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmtex.h +// GLMgr textures +// +//=============================================================================== + +#ifndef CGLMTEX_H +#define CGLMTEX_H + +#pragma once + +#ifdef OSX +#include "glmgrbasics.h" +#endif +#include "tier1/utlhash.h" +#include "tier1/utlmap.h" + +//=============================================================================== + +// forward declarations + +class GLMContext; +class GLMTester; +class CGLMTexLayoutTable; +class CGLMTex; +class CGLMFBO; + +struct IDirect3DSurface9; + +#if GLMDEBUG +extern CGLMTex *g_pFirstCGMLTex; +#endif + +// For GL_EXT_texture_sRGB_decode +#ifndef GL_TEXTURE_SRGB_DECODE_EXT +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#endif + +#ifndef GL_DECODE_EXT +#define GL_DECODE_EXT 0x8A49 +#endif + +#ifndef GL_SKIP_DECODE_EXT +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif + +//=============================================================================== + +struct GLMTexFormatDesc +{ + const char *m_formatSummary; // for debug visibility + + D3DFORMAT m_d3dFormat; // what D3D knows it as; see public/bitmap/imageformat.h + + GLenum m_glIntFormat; // GL internal format + GLenum m_glIntFormatSRGB; // internal format if SRGB flavor + GLenum m_glDataFormat; // GL data format + GLenum m_glDataType; // GL data type + + int m_chunkSize; // 1 or 4 - 4 is used for compressed textures + int m_bytesPerSquareChunk; // how many bytes for the smallest quantum (m_chunkSize x m_chunkSize) + // this description lets us calculate size cleanly without conditional logic for compression +}; +const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format ); + +//=============================================================================== + +// utility function for generating slabs of texels. mostly for test. +typedef struct +{ + // in + D3DFORMAT m_format; + void *m_dest; // dest address + int m_chunkCount; // square chunk count (single texels or compressed blocks) + int m_byteCountLimit; // caller expectation of max number of bytes to write out + float r,g,b,a; // color desired + + // out + int m_bytesWritten; +} GLMGenTexelParams; + +// return true if successful +bool GLMGenTexels( GLMGenTexelParams *params ); + + +//=============================================================================== + +struct GLMTexLayoutSlice +{ + int m_xSize,m_ySize,m_zSize; //texel dimensions of this slice + int m_storageOffset; //where in the storage slab does this slice live + int m_storageSize; //how much storage does this slice occupy +}; + +enum EGLMTexFlags +{ + kGLMTexMipped = 0x01, + kGLMTexMippedAuto = 0x02, + kGLMTexRenderable = 0x04, + kGLMTexIsStencil = 0x08, + kGLMTexIsDepth = 0x10, + kGLMTexSRGB = 0x20, + kGLMTexMultisampled = 0x40, // has an RBO backing it. Cannot combine with Mipped, MippedAuto. One slice maximum, only targeting GL_TEXTURE_2D. + // actually not 100% positive on the mipmapping, the RBO itself can't be mipped, but the resulting texture could + // have mipmaps generated. +}; + +//=============================================================================== + +struct GLMTexLayoutKey +{ + // input values: held const, these are the hash key for the form map + GLenum m_texGLTarget; // flavor of texture: GL_TEXTURE_2D, GL_TEXTURE_3D, GLTEXTURE_CUBE_MAP + D3DFORMAT m_texFormat; // D3D texel format + unsigned long m_texFlags; // mipped, autogen mips, render target, ... ? + unsigned long m_texSamples; // zero for a plain tex, 2/4/6/8 for "MSAA tex" (RBO backed) + int m_xSize,m_ySize,m_zSize; // size of base mip +}; + +bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b ); + +#define GLM_TEX_MAX_MIPS 14 +#define GLM_TEX_MAX_FACES 6 +#define GLM_TEX_MAX_SLICES (GLM_TEX_MAX_MIPS * GLM_TEX_MAX_FACES) + +#pragma warning( push ) +#pragma warning( disable : 4200 ) + +struct GLMTexLayout +{ + char *m_layoutSummary; // for debug visibility + + // const inputs used for hashing + GLMTexLayoutKey m_key; + + // refcount + int m_refCount; + + // derived values: + GLMTexFormatDesc *m_format; // format specific info + int m_mipCount; // derived by starying at base size and working down towards 1x1 + int m_faceCount; // 1 for 2d/3d, 6 for cubemap + int m_sliceCount; // product of faces and mips + int m_storageTotalSize; // size of storage slab required + + // slice array + GLMTexLayoutSlice m_slices[0]; // dynamically allocated 2-d array [faces][mips] +}; + +#pragma warning( pop ) + +class CGLMTexLayoutTable +{ +public: + CGLMTexLayoutTable(); + + GLMTexLayout *NewLayoutRef( GLMTexLayoutKey *pDesiredKey ); // pass in a pointer to layout key - receive ptr to completed layout + void DelLayoutRef( GLMTexLayout *layout ); // pass in pointer to completed layout. refcount is dropped. + + void DumpStats( void ); +protected: + CUtlMap< GLMTexLayoutKey, GLMTexLayout* > m_layoutMap; +}; + +//=============================================================================== + +// a sampler specifies desired state for drawing on a given sampler index +// this is the combination of a texture choice and a set of sampler parameters +// see http://msdn.microsoft.com/en-us/library/bb172602(VS.85).aspx + +struct GLMTexLockParams +{ + // input params which identify the slice of interest + CGLMTex *m_tex; + int m_face; + int m_mip; + + // identifies the region of the slice + GLMRegion m_region; + + // tells GLM to force re-read of the texels back from GL + // i.e. "I know I stepped on those texels with a draw or blit - the GLM copy is stale" + bool m_readback; +}; + +struct GLMTexLockDesc +{ + GLMTexLockParams m_req; // form of the lock request + + bool m_active; // set true at lock time. cleared at unlock time. + + int m_sliceIndex; // which slice in the layout + int m_sliceBaseOffset; // where is that in the texture data + int m_sliceRegionOffset; // offset to the start (lowest address corner) of the region requested +}; + +//=============================================================================== + +#define GLM_SAMPLER_COUNT 16 + +#define GLM_MAX_PIXEL_TEX_SAMPLERS 16 +#define GLM_MAX_VERTEX_TEX_SAMPLERS 0 +typedef CBitVec CTexBindMask; + +enum EGLMTexSliceFlag +{ + kSliceValid = 0x01, // slice has been teximage'd in whole at least once - set to 0 initially + kSliceStorageValid = 0x02, // if backing store is available, this slice's data is a valid copy - set to 0 initially + kSliceLocked = 0x04, // are one or more locks outstanding on this slice + kSliceFullyDirty = 0x08, // does the slice need to be fully downloaded at unlock time (disregard dirty rects) +}; + +//=============================================================================== + +#define GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS (2) +#define GLM_PACKED_SAMPLER_PARAMS_MIN_FILTER_BITS (2) +#define GLM_PACKED_SAMPLER_PARAMS_MAG_FILTER_BITS (2) +#define GLM_PACKED_SAMPLER_PARAMS_MIP_FILTER_BITS (2) +#define GLM_PACKED_SAMPLER_PARAMS_MIN_LOD_BITS (4) +#define GLM_PACKED_SAMPLER_PARAMS_MAX_ANISO_BITS (5) +#define GLM_PACKED_SAMPLER_PARAMS_COMPARE_MODE_BITS (1) +#define GLM_PACKED_SAMPLER_PARAMS_SRGB_BITS (1) + +struct GLMTexPackedSamplingParams +{ + uint32 m_addressU : GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS; + uint32 m_addressV : GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS; + uint32 m_addressW : GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS; + + uint32 m_minFilter : GLM_PACKED_SAMPLER_PARAMS_MIN_FILTER_BITS; + uint32 m_magFilter : GLM_PACKED_SAMPLER_PARAMS_MAG_FILTER_BITS; + uint32 m_mipFilter : GLM_PACKED_SAMPLER_PARAMS_MIP_FILTER_BITS; + + uint32 m_minLOD : GLM_PACKED_SAMPLER_PARAMS_MIN_LOD_BITS; + uint32 m_maxAniso : GLM_PACKED_SAMPLER_PARAMS_MAX_ANISO_BITS; + uint32 m_compareMode : GLM_PACKED_SAMPLER_PARAMS_COMPARE_MODE_BITS; + uint32 m_srgb : GLM_PACKED_SAMPLER_PARAMS_SRGB_BITS; + uint32 m_isValid : 1; +}; + +struct GLMTexSamplingParams +{ + union + { + GLMTexPackedSamplingParams m_packed; + uint32 m_bits; + }; + + uint32 m_borderColor; + float m_lodBias; + + FORCEINLINE bool operator== (const GLMTexSamplingParams& rhs ) const + { + return ( m_bits == rhs.m_bits ) && ( m_borderColor == rhs.m_borderColor ) && ( m_lodBias == rhs.m_lodBias ); + } + + FORCEINLINE void SetToDefaults() + { + m_bits = 0; + m_borderColor = 0; + m_lodBias = 0.0f; + m_packed.m_addressU = D3DTADDRESS_WRAP; + m_packed.m_addressV = D3DTADDRESS_WRAP; + m_packed.m_addressW = D3DTADDRESS_WRAP; + m_packed.m_minFilter = D3DTEXF_POINT; + m_packed.m_magFilter = D3DTEXF_POINT; + m_packed.m_mipFilter = D3DTEXF_NONE; + m_packed.m_maxAniso = 1; + m_packed.m_compareMode = 0; + m_packed.m_isValid = true; + } + +#ifndef OSX + FORCEINLINE void SetToSamplerObject( GLuint nSamplerObject ) const + { + static const GLenum dxtogl_addressMode[] = { GL_REPEAT, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, (GLenum)-1 }; + static const GLenum dxtogl_magFilter[4] = { GL_NEAREST, GL_NEAREST, GL_LINEAR, GL_LINEAR }; + static const GLenum dxtogl_minFilter[4][4] = // indexed by _D3DTEXTUREFILTERTYPE on both axes: [row is min filter][col is mip filter]. + { + /* min = D3DTEXF_NONE */ { GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, (GLenum)-1 }, // D3DTEXF_NONE we just treat like POINT + /* min = D3DTEXF_POINT */ { GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, (GLenum)-1 }, + /* min = D3DTEXF_LINEAR */ { GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, (GLenum)-1 }, + /* min = D3DTEXF_ANISOTROPIC */ { GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, (GLenum)-1 }, // no diff from prior row, set maxAniso to effect the sampling + }; + + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_WRAP_S, dxtogl_addressMode[m_packed.m_addressU] ); + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_WRAP_T, dxtogl_addressMode[m_packed.m_addressV] ); + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_WRAP_R, dxtogl_addressMode[m_packed.m_addressW] ); + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_MIN_FILTER, dxtogl_minFilter[m_packed.m_minFilter][m_packed.m_mipFilter] ); + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_MAG_FILTER, dxtogl_magFilter[m_packed.m_magFilter] ); + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_packed.m_maxAniso ); + + float flBorderColor[4] = { 0, 0, 0, 0 }; + if ( m_borderColor ) + { + flBorderColor[0] = ((m_borderColor >> 16) & 0xFF) * (1.0f/255.0f); //R + flBorderColor[1] = ((m_borderColor >> 8) & 0xFF) * (1.0f/255.0f); //G + flBorderColor[2] = ((m_borderColor ) & 0xFF) * (1.0f/255.0f); //B + flBorderColor[3] = ((m_borderColor >> 24) & 0xFF) * (1.0f/255.0f); //A + } + gGL->glSamplerParameterfv( nSamplerObject, GL_TEXTURE_BORDER_COLOR, flBorderColor ); // <-- this crashes ATI's driver, remark it out + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_MIN_LOD, m_packed.m_minLOD ); + gGL->glSamplerParameterfv( nSamplerObject, GL_TEXTURE_LOD_BIAS, &m_lodBias ); + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_COMPARE_MODE_ARB, m_packed.m_compareMode ? GL_COMPARE_R_TO_TEXTURE_ARB : GL_NONE ); + gGL->glSamplerParameterf( nSamplerObject, GL_TEXTURE_LOD_BIAS, m_lodBias ); + if ( m_packed.m_compareMode ) + { + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL ); + } + if ( gGL->m_bHave_GL_EXT_texture_sRGB_decode ) + { + gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_SRGB_DECODE_EXT, m_packed.m_srgb ? GL_DECODE_EXT : GL_SKIP_DECODE_EXT ); + } + } +#endif // !OSX + + inline void DeltaSetToTarget( GLenum target, const GLMTexSamplingParams &curState ) + { + static const GLenum dxtogl_addressMode[] = { GL_REPEAT, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, (GLenum)-1 }; + static const GLenum dxtogl_magFilter[4] = { GL_NEAREST, GL_NEAREST, GL_LINEAR, GL_LINEAR }; + static const GLenum dxtogl_minFilter[4][4] = // indexed by _D3DTEXTUREFILTERTYPE on both axes: [row is min filter][col is mip filter]. + { + /* min = D3DTEXF_NONE */ { GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, (GLenum)-1 }, // D3DTEXF_NONE we just treat like POINT + /* min = D3DTEXF_POINT */ { GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, (GLenum)-1 }, + /* min = D3DTEXF_LINEAR */ { GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, (GLenum)-1 }, + /* min = D3DTEXF_ANISOTROPIC */ { GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, (GLenum)-1 }, // no diff from prior row, set maxAniso to effect the sampling + }; + + if ( m_packed.m_addressU != curState.m_packed.m_addressU ) + { + gGL->glTexParameteri( target, GL_TEXTURE_WRAP_S, dxtogl_addressMode[m_packed.m_addressU] ); + } + + if ( m_packed.m_addressV != curState.m_packed.m_addressV ) + { + gGL->glTexParameteri( target, GL_TEXTURE_WRAP_T, dxtogl_addressMode[m_packed.m_addressV] ); + } + + if ( m_packed.m_addressW != curState.m_packed.m_addressW ) + { + gGL->glTexParameteri( target, GL_TEXTURE_WRAP_R, dxtogl_addressMode[m_packed.m_addressW] ); + } + + if ( ( m_packed.m_minFilter != curState.m_packed.m_minFilter ) || + ( m_packed.m_magFilter != curState.m_packed.m_magFilter ) || + ( m_packed.m_mipFilter != curState.m_packed.m_mipFilter ) || + ( m_packed.m_maxAniso != curState.m_packed.m_maxAniso ) ) + { + gGL->glTexParameteri( target, GL_TEXTURE_MIN_FILTER, dxtogl_minFilter[m_packed.m_minFilter][m_packed.m_mipFilter] ); + gGL->glTexParameteri( target, GL_TEXTURE_MAG_FILTER, dxtogl_magFilter[m_packed.m_magFilter] ); + gGL->glTexParameteri( target, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_packed.m_maxAniso ); + } + + if ( m_borderColor != curState.m_borderColor ) + { + float flBorderColor[4] = { 0, 0, 0, 0 }; + if ( m_borderColor ) + { + flBorderColor[0] = ((m_borderColor >> 16) & 0xFF) * (1.0f/255.0f); //R + flBorderColor[1] = ((m_borderColor >> 8) & 0xFF) * (1.0f/255.0f); //G + flBorderColor[2] = ((m_borderColor ) & 0xFF) * (1.0f/255.0f); //B + flBorderColor[3] = ((m_borderColor >> 24) & 0xFF) * (1.0f/255.0f); //A + } + + gGL->glTexParameterfv( target, GL_TEXTURE_BORDER_COLOR, flBorderColor ); // <-- this crashes ATI's driver, remark it out + } + + if ( m_packed.m_minLOD != curState.m_packed.m_minLOD ) + { + gGL->glTexParameteri( target, GL_TEXTURE_MIN_LOD, m_packed.m_minLOD ); + } + + if ( m_lodBias != curState.m_lodBias ) + { + // Could use TexParameterf instead, but we don't currently grab it. This works fine, too. + gGL->glTexParameterfv( target, GL_TEXTURE_LOD_BIAS, &m_lodBias ); + } + + if ( m_packed.m_compareMode != curState.m_packed.m_compareMode ) + { + gGL->glTexParameteri( target, GL_TEXTURE_COMPARE_MODE_ARB, m_packed.m_compareMode ? GL_COMPARE_R_TO_TEXTURE_ARB : GL_NONE ); + if ( m_packed.m_compareMode ) + { + gGL->glTexParameteri( target, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL ); + } + } + + if ( ( gGL->m_bHave_GL_EXT_texture_sRGB_decode ) && ( m_packed.m_srgb != curState.m_packed.m_srgb ) ) + { + gGL->glTexParameteri( target, GL_TEXTURE_SRGB_DECODE_EXT, m_packed.m_srgb ? GL_DECODE_EXT : GL_SKIP_DECODE_EXT ); + } + } + + inline void SetToTarget( GLenum target ) + { + static const GLenum dxtogl_addressMode[] = { GL_REPEAT, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, (GLenum)-1 }; + static const GLenum dxtogl_magFilter[4] = { GL_NEAREST, GL_NEAREST, GL_LINEAR, GL_LINEAR }; + static const GLenum dxtogl_minFilter[4][4] = // indexed by _D3DTEXTUREFILTERTYPE on both axes: [row is min filter][col is mip filter]. + { + /* min = D3DTEXF_NONE */ { GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, (GLenum)-1 }, // D3DTEXF_NONE we just treat like POINT + /* min = D3DTEXF_POINT */ { GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST_MIPMAP_LINEAR, (GLenum)-1 }, + /* min = D3DTEXF_LINEAR */ { GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, (GLenum)-1 }, + /* min = D3DTEXF_ANISOTROPIC */ { GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_LINEAR, (GLenum)-1 }, // no diff from prior row, set maxAniso to effect the sampling + }; + + gGL->glTexParameteri( target, GL_TEXTURE_WRAP_S, dxtogl_addressMode[m_packed.m_addressU] ); + gGL->glTexParameteri( target, GL_TEXTURE_WRAP_T, dxtogl_addressMode[m_packed.m_addressV] ); + gGL->glTexParameteri( target, GL_TEXTURE_WRAP_R, dxtogl_addressMode[m_packed.m_addressW] ); + gGL->glTexParameteri( target, GL_TEXTURE_MIN_FILTER, dxtogl_minFilter[m_packed.m_minFilter][m_packed.m_mipFilter] ); + gGL->glTexParameteri( target, GL_TEXTURE_MAG_FILTER, dxtogl_magFilter[m_packed.m_magFilter] ); + gGL->glTexParameteri( target, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_packed.m_maxAniso ); + + float flBorderColor[4] = { 0, 0, 0, 0 }; + if ( m_borderColor ) + { + flBorderColor[0] = ((m_borderColor >> 16) & 0xFF) * (1.0f/255.0f); //R + flBorderColor[1] = ((m_borderColor >> 8) & 0xFF) * (1.0f/255.0f); //G + flBorderColor[2] = ((m_borderColor ) & 0xFF) * (1.0f/255.0f); //B + flBorderColor[3] = ((m_borderColor >> 24) & 0xFF) * (1.0f/255.0f); //A + } + gGL->glTexParameterfv( target, GL_TEXTURE_BORDER_COLOR, flBorderColor ); // <-- this crashes ATI's driver, remark it out + gGL->glTexParameteri( target, GL_TEXTURE_MIN_LOD, m_packed.m_minLOD ); + gGL->glTexParameterfv( target, GL_TEXTURE_LOD_BIAS, &m_lodBias ); + gGL->glTexParameteri( target, GL_TEXTURE_COMPARE_MODE_ARB, m_packed.m_compareMode ? GL_COMPARE_R_TO_TEXTURE_ARB : GL_NONE ); + if ( m_packed.m_compareMode ) + { + gGL->glTexParameteri( target, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL ); + } + if ( gGL->m_bHave_GL_EXT_texture_sRGB_decode ) + { + gGL->glTexParameteri( target, GL_TEXTURE_SRGB_DECODE_EXT, m_packed.m_srgb ? GL_DECODE_EXT : GL_SKIP_DECODE_EXT ); + } + } +}; + +//=============================================================================== + +class CGLMTex +{ + +public: + + void Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut ); + void Unlock( GLMTexLockParams *params ); + GLuint GetTexName() { return m_texName; } + +protected: + friend class GLMContext; // only GLMContext can make CGLMTex objects + friend class GLMTester; + friend class CGLMFBO; + + friend struct IDirect3DDevice9; + friend struct IDirect3DBaseTexture9; + friend struct IDirect3DTexture9; + friend struct IDirect3DSurface9; + friend struct IDirect3DCubeTexture9; + friend struct IDirect3DVolumeTexture9; + + CGLMTex( GLMContext *ctx, GLMTexLayout *layout, uint levels, const char *debugLabel = NULL ); + ~CGLMTex( ); + + int CalcSliceIndex( int face, int mip ); + void CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut ); + + void ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice=true ); + void WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice=true, bool noDataWrite=false ); + // last param lets us send NULL data ptr (only legal with uncompressed formats, beware) + // this helps out ResetSRGB. + +#if defined( OSX ) + void HandleSRGBMismatch( bool srgb, int &srgbFlipCount ); + void ResetSRGB( bool srgb, bool noDataWrite ); + // re-specify texture format to match desired sRGB form + // noWrite means send NULL for texel source addresses instead of actual data - ideal for RT's +#endif + + bool IsRBODirty() const; + void ForceRBONonDirty(); + void ForceRBODirty(); + + // 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 + + GLuint m_texName; // name of this texture in the context + GLenum m_texGLTarget; + uint m_nSamplerType; // SAMPLER_2D, etc. + + GLMTexSamplingParams m_SamplingParams; + + GLMTexLayout *m_layout; // layout of texture (shared across all tex with same layout) + + uint m_nLastResolvedBatchCounter; + + 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. + + GLMContext *m_ctx; // link back to parent context + + + CGLMFBO *m_pBlitSrcFBO; + CGLMFBO *m_pBlitDstFBO; + GLuint m_rboName; // name of MSAA RBO backing the tex if MSAA enabled (or zero) + + int m_rtAttachCount; // how many RT's have this texture attached somewhere + + char *m_backing; // backing storage if available + + int m_lockCount; // lock reqs are stored in the GLMContext for tracking + + CUtlVector m_sliceFlags; + + char *m_debugLabel; // strdup() of debugLabel passed in, or NULL + + bool m_texClientStorage; // was CS selected for texture + bool m_texPreloaded; // has it been kicked into VRAM with GLMContext::PreloadTex yet + + int m_srgbFlipCount; +#if GLMDEBUG + CGLMTex *m_pPrevTex; + CGLMTex *m_pNextTex; +#endif +}; + +#endif diff --git a/public/togles/linuxwin/dxabstract.h b/public/togles/linuxwin/dxabstract.h new file mode 100644 index 00000000..a4dfc073 --- /dev/null +++ b/public/togles/linuxwin/dxabstract.h @@ -0,0 +1,1444 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// dxabstract.h +// +//================================================================================================== +#ifndef DXABSTRACT_H +#define DXABSTRACT_H + +#ifdef DX_TO_GL_ABSTRACTION + +#include "togl/rendermechanism.h" + +#include "tier0/platform.h" +#include "tier0/dbg.h" +#include "tier1/utlmap.h" + +// turn this on to get refcount logging from IUnknown +#define IUNKNOWN_ALLOC_SPEW 0 +#define IUNKNOWN_ALLOC_SPEW_MARK_ALL 0 + + +TOGL_INTERFACE void toglGetClientRect( VD3DHWND hWnd, RECT *destRect ); + + +struct TOGL_CLASS IUnknown +{ + int m_refcount[2]; + bool m_mark; + + IUnknown() + { + m_refcount[0] = 1; + m_refcount[1] = 0; + m_mark = (IUNKNOWN_ALLOC_SPEW_MARK_ALL != 0); // either all are marked, or only the ones that have SetMark(true) called on them + + #if IUNKNOWN_ALLOC_SPEW + if (m_mark) + { + GLMPRINTF(("-A- IUnew (%08x) refc -> (%d,%d) ",this,m_refcount[0],m_refcount[1])); + } + #endif + }; + + virtual ~IUnknown() + { + #if IUNKNOWN_ALLOC_SPEW + if (m_mark) + { + GLMPRINTF(("-A- IUdel (%08x) ",this )); + } + #endif + }; + + void AddRef( int which=0, char *comment = NULL ) + { + Assert( which >= 0 ); + Assert( which < 2 ); + m_refcount[which]++; + + #if IUNKNOWN_ALLOC_SPEW + if (m_mark) + { + GLMPRINTF(("-A- IUAddRef (%08x,%d) refc -> (%d,%d) [%s]",this,which,m_refcount[0],m_refcount[1],comment?comment:"...")) ; + if (!comment) + { + GLMPRINTF(("")) ; // place to hang a breakpoint + } + } + #endif + }; + + ULONG __stdcall Release( int which=0, char *comment = NULL ) + { + Assert( which >= 0 ); + Assert( which < 2 ); + + //int oldrefcs[2] = { m_refcount[0], m_refcount[1] }; + bool deleting = false; + + m_refcount[which]--; + if ( (!m_refcount[0]) && (!m_refcount[1]) ) + { + deleting = true; + } + + #if IUNKNOWN_ALLOC_SPEW + if (m_mark) + { + GLMPRINTF(("-A- IURelease (%08x,%d) refc -> (%d,%d) [%s] %s",this,which,m_refcount[0],m_refcount[1],comment?comment:"...",deleting?"->DELETING":"")); + if (!comment) + { + GLMPRINTF(("")) ; // place to hang a breakpoint + } + } + #endif + + if (deleting) + { + if (m_mark) + { + GLMPRINTF(("")) ; // place to hang a breakpoint + } + delete this; + return 0; + } + else + { + return m_refcount[0]; + } + }; + + void SetMark( bool markValue, char *comment=NULL ) + { + #if IUNKNOWN_ALLOC_SPEW + if (!m_mark && markValue) // leading edge detect + { + // print the same thing that the constructor would have printed if it had been marked from the beginning + // i.e. it's anticipated that callers asking for marking will do so right at create time + GLMPRINTF(("-A- IUSetMark (%08x) refc -> (%d,%d) (%s) ",this,m_refcount[0],m_refcount[1],comment?comment:"...")); + } + #endif + + m_mark = markValue; + } +}; + +// ------------------------------------------------------------------------------------------------------------------------------ // +// INTERFACES +// ------------------------------------------------------------------------------------------------------------------------------ // + +struct TOGL_CLASS IDirect3DResource9 : public IUnknown +{ + IDirect3DDevice9 *m_device; // parent device + D3DRESOURCETYPE m_restype; + + DWORD SetPriority(DWORD PriorityNew); +}; + +struct TOGL_CLASS IDirect3DBaseTexture9 : public IDirect3DResource9 // "A Texture.." +{ + D3DSURFACE_DESC m_descZero; // desc of top level. + CGLMTex *m_tex; // a CGLMTex can represent all forms of tex + + virtual ~IDirect3DBaseTexture9(); + D3DRESOURCETYPE TOGLMETHODCALLTYPE GetType(); + DWORD TOGLMETHODCALLTYPE GetLevelCount(); + HRESULT TOGLMETHODCALLTYPE GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc); +}; + +struct TOGL_CLASS IDirect3DTexture9 : public IDirect3DBaseTexture9 // "Texture 2D" +{ + IDirect3DSurface9 *m_surfZero; // surf of top level. + virtual ~IDirect3DTexture9(); + HRESULT TOGLMETHODCALLTYPE LockRect(UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags); + HRESULT TOGLMETHODCALLTYPE UnlockRect(UINT Level); + HRESULT TOGLMETHODCALLTYPE GetSurfaceLevel(UINT Level,IDirect3DSurface9** ppSurfaceLevel); +}; + +struct TOGL_CLASS IDirect3DCubeTexture9 : public IDirect3DBaseTexture9 // "Texture Cube Map" +{ + IDirect3DSurface9 *m_surfZero[6]; // surfs of top level. + virtual ~IDirect3DCubeTexture9(); + HRESULT TOGLMETHODCALLTYPE GetCubeMapSurface(D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface); + HRESULT TOGLMETHODCALLTYPE GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc); +}; + +struct TOGL_CLASS IDirect3DVolumeTexture9 : public IDirect3DBaseTexture9 // "Texture 3D" +{ + IDirect3DSurface9 *m_surfZero; // surf of top level. + D3DVOLUME_DESC m_volDescZero; // volume desc top level + virtual ~IDirect3DVolumeTexture9(); + HRESULT TOGLMETHODCALLTYPE LockBox(UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags); + HRESULT TOGLMETHODCALLTYPE UnlockBox(UINT Level); + HRESULT TOGLMETHODCALLTYPE GetLevelDesc( UINT level, D3DVOLUME_DESC *pDesc ); +}; + + +// for the moment, a "D3D surface" is modeled as a GLM tex, a face, and a mip. +// no Create method, these are filled in by the various create surface methods. + +struct TOGL_CLASS IDirect3DSurface9 : public IDirect3DResource9 +{ + virtual ~IDirect3DSurface9(); + HRESULT TOGLMETHODCALLTYPE LockRect(D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags); + HRESULT TOGLMETHODCALLTYPE UnlockRect(); + HRESULT TOGLMETHODCALLTYPE GetDesc(D3DSURFACE_DESC *pDesc); + + D3DSURFACE_DESC m_desc; + CGLMTex *m_tex; + int m_face; + int m_mip; +}; + +struct TOGL_CLASS IDirect3D9 : public IUnknown +{ + virtual ~IDirect3D9(); + + UINT TOGLMETHODCALLTYPE GetAdapterCount(); + + HRESULT TOGLMETHODCALLTYPE GetDeviceCaps (UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps); + HRESULT TOGLMETHODCALLTYPE GetAdapterIdentifier (UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier); + HRESULT TOGLMETHODCALLTYPE CheckDeviceFormat (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat); + UINT TOGLMETHODCALLTYPE GetAdapterModeCount (UINT Adapter,D3DFORMAT Format); + HRESULT TOGLMETHODCALLTYPE EnumAdapterModes (UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode); + HRESULT TOGLMETHODCALLTYPE CheckDeviceType (UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed); + HRESULT TOGLMETHODCALLTYPE GetAdapterDisplayMode (UINT Adapter,D3DDISPLAYMODE* pMode); + HRESULT TOGLMETHODCALLTYPE CheckDepthStencilMatch (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat); + HRESULT TOGLMETHODCALLTYPE CheckDeviceMultiSampleType (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels); + + HRESULT TOGLMETHODCALLTYPE CreateDevice (UINT Adapter,D3DDEVTYPE DeviceType,VD3DHWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface); +}; + +struct TOGL_CLASS IDirect3DVertexDeclaration9 : public IUnknown +{ + IDirect3DDevice9 *m_device; + uint m_elemCount; + D3DVERTEXELEMENT9_GL m_elements[ MAX_D3DVERTEXELEMENTS ]; + + uint8 m_VertexAttribDescToStreamIndex[256]; + + virtual ~IDirect3DVertexDeclaration9(); +}; + +struct TOGL_CLASS IDirect3DQuery9 : public IDirect3DResource9 //was IUnknown +{ + D3DQUERYTYPE m_type; // D3DQUERYTYPE_OCCLUSION or D3DQUERYTYPE_EVENT + GLMContext *m_ctx; + CGLMQuery *m_query; + + uint m_nIssueStartThreadID, m_nIssueEndThreadID; + uint m_nIssueStartDrawCallIndex, m_nIssueEndDrawCallIndex; + uint m_nIssueStartFrameIndex, m_nIssueEndFrameIndex; + uint m_nIssueStartQueryCreationCounter, m_nIssueEndQueryCreationCounter; + + virtual ~IDirect3DQuery9(); + + HRESULT Issue(DWORD dwIssueFlags); + HRESULT GetData(void* pData,DWORD dwSize,DWORD dwGetDataFlags); +}; + +struct TOGL_CLASS IDirect3DVertexBuffer9 : public IDirect3DResource9 //was IUnknown +{ + GLMContext *m_ctx; + CGLMBuffer *m_vtxBuffer; + D3DVERTEXBUFFER_DESC m_vtxDesc; // to satisfy GetDesc + + virtual ~IDirect3DVertexBuffer9(); + HRESULT Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags); + HRESULT Unlock(); + void UnlockActualSize( uint nActualSize, const void *pActualData = NULL ); +}; + +struct TOGL_CLASS IDirect3DIndexBuffer9 : public IDirect3DResource9 //was IUnknown +{ + GLMContext *m_ctx; + CGLMBuffer *m_idxBuffer; + D3DINDEXBUFFER_DESC m_idxDesc; // to satisfy GetDesc + + virtual ~IDirect3DIndexBuffer9(); + + HRESULT Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags); + HRESULT Unlock(); + void UnlockActualSize( uint nActualSize, const void *pActualData = NULL ); + + HRESULT GetDesc(D3DINDEXBUFFER_DESC *pDesc); +}; + +struct TOGL_CLASS IDirect3DPixelShader9 : public IDirect3DResource9 //was IUnknown +{ + CGLMProgram *m_pixProgram; + uint m_pixHighWater; // count of active constant slots referenced by shader. + uint m_pixSamplerMask; // (1< CD3DMATRIXAllocator; + typedef class TOGL_CLASS CUtlVector CD3DMATRIXStack; +#else + typedef class CUtlMemory CD3DMATRIXAllocator; + typedef class CUtlVector CD3DMATRIXStack; +#endif + +struct TOGL_CLASS ID3DXMatrixStack //: public IUnknown +{ + int m_refcount[2]; + bool m_mark; + CD3DMATRIXStack m_stack; + int m_stackTop; // top of stack is at the highest index, this is that index. push increases, pop decreases. + + ID3DXMatrixStack(); + void AddRef( int which=0, char *comment = NULL ); + ULONG Release( int which=0, char *comment = NULL ); + + HRESULT Create( void ); + + D3DXMATRIX* GetTop(); + void Push(); + void Pop(); + void LoadIdentity(); + void LoadMatrix( const D3DXMATRIX *pMat ); + void MultMatrix( const D3DXMATRIX *pMat ); + void MultMatrixLocal( const D3DXMATRIX *pMat ); + HRESULT ScaleLocal(FLOAT x, FLOAT y, FLOAT z); + + // Left multiply the current matrix with the computed rotation + // matrix, counterclockwise about the given axis with the given angle. + // (rotation is about the local origin of the object) + HRESULT RotateAxisLocal(CONST D3DXVECTOR3* pV, FLOAT Angle); + + // Left multiply the current matrix with the computed translation + // matrix. (transformation is about the local origin of the object) + HRESULT TranslateLocal(FLOAT x, FLOAT y, FLOAT z); +}; + +typedef ID3DXMatrixStack* LPD3DXMATRIXSTACK; + +struct RenderTargetState_t +{ + void clear() { V_memset( this, 0, sizeof( *this ) ); } + + CGLMTex *m_pRenderTargets[4]; + CGLMTex *m_pDepthStencil; + + inline bool RefersTo( CGLMTex * pSurf ) const + { + for ( uint i = 0; i < 4; i++ ) + if ( m_pRenderTargets[i] == pSurf ) + return true; + + if ( m_pDepthStencil == pSurf ) + return true; + + return false; + } + + static inline bool LessFunc( const RenderTargetState_t &lhs, const RenderTargetState_t &rhs ) + { + COMPILE_TIME_ASSERT( sizeof( lhs.m_pRenderTargets[0] ) == sizeof( uint32 ) ); + uint64 lhs0 = reinterpret_cast(lhs.m_pRenderTargets)[0]; + uint64 rhs0 = reinterpret_cast(rhs.m_pRenderTargets)[0]; + if ( lhs0 < rhs0 ) + return true; + else if ( lhs0 == rhs0 ) + { + uint64 lhs1 = reinterpret_cast(lhs.m_pRenderTargets)[1]; + uint64 rhs1 = reinterpret_cast(rhs.m_pRenderTargets)[1]; + if ( lhs1 < rhs1 ) + return true; + else if ( lhs1 == rhs1 ) + { + return lhs.m_pDepthStencil < rhs.m_pDepthStencil; + } + } + return false; + } + + inline bool operator < ( const RenderTargetState_t &rhs ) const + { + return LessFunc( *this, rhs ); + } +}; + +typedef CUtlMap< RenderTargetState_t, CGLMFBO *> CGLMFBOMap; + +class simple_bitmap; + +struct TOGL_CLASS IDirect3DDevice9 : public IUnknown +{ + friend class GLMContext; + friend struct IDirect3DBaseTexture9; + friend struct IDirect3DTexture9; + friend struct IDirect3DCubeTexture9; + friend struct IDirect3DVolumeTexture9; + friend struct IDirect3DSurface9; + friend struct IDirect3DVertexBuffer9; + friend struct IDirect3DIndexBuffer9; + friend struct IDirect3DPixelShader9; + friend struct IDirect3DVertexShader9; + friend struct IDirect3DQuery9; + friend struct IDirect3DVertexDeclaration9; + + IDirect3DDevice9(); + virtual ~IDirect3DDevice9(); + + // Create call invoked from IDirect3D9 + HRESULT TOGLMETHODCALLTYPE Create( IDirect3DDevice9Params *params ); + + // + // Basics + // + HRESULT TOGLMETHODCALLTYPE Reset(D3DPRESENT_PARAMETERS* pPresentationParameters); + HRESULT TOGLMETHODCALLTYPE SetViewport(CONST D3DVIEWPORT9* pViewport); + HRESULT TOGLMETHODCALLTYPE GetViewport(D3DVIEWPORT9* pViewport); + HRESULT TOGLMETHODCALLTYPE BeginScene(); + HRESULT TOGLMETHODCALLTYPE Clear(DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil); + HRESULT TOGLMETHODCALLTYPE EndScene(); + HRESULT TOGLMETHODCALLTYPE Present(CONST RECT* pSourceRect,CONST RECT* pDestRect,VD3DHWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion); + + // textures + HRESULT TOGLMETHODCALLTYPE CreateTexture(UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture9** ppTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL); + HRESULT TOGLMETHODCALLTYPE CreateCubeTexture(UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture9** ppCubeTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL); + HRESULT TOGLMETHODCALLTYPE CreateVolumeTexture(UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture9** ppVolumeTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetTexture(DWORD Stage,IDirect3DBaseTexture9* pTexture); + HRESULT TOGLMETHODCALLTYPE SetTextureNonInline(DWORD Stage,IDirect3DBaseTexture9* pTexture); + + HRESULT TOGLMETHODCALLTYPE GetTexture(DWORD Stage,IDirect3DBaseTexture9** ppTexture); + + // render targets, color and depthstencil, surfaces, blit + HRESULT TOGLMETHODCALLTYPE CreateRenderTarget(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL); + HRESULT TOGLMETHODCALLTYPE SetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9* pRenderTarget); + HRESULT TOGLMETHODCALLTYPE GetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9** ppRenderTarget); + + HRESULT TOGLMETHODCALLTYPE CreateOffscreenPlainSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle); + + HRESULT TOGLMETHODCALLTYPE CreateDepthStencilSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle); + HRESULT TOGLMETHODCALLTYPE SetDepthStencilSurface(IDirect3DSurface9* pNewZStencil); + HRESULT TOGLMETHODCALLTYPE GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface); + + HRESULT TOGLMETHODCALLTYPE GetRenderTargetData(IDirect3DSurface9* pRenderTarget,IDirect3DSurface9* pDestSurface); // ? is anyone using this ? + HRESULT TOGLMETHODCALLTYPE GetFrontBufferData(UINT iSwapChain,IDirect3DSurface9* pDestSurface); + HRESULT TOGLMETHODCALLTYPE StretchRect(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestSurface,CONST RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter); + + // pixel shaders + HRESULT TOGLMETHODCALLTYPE CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixelShader9** ppShader, const char *pShaderName, char *debugLabel = NULL, const uint32 *pCentroidMask = NULL ); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetPixelShader(IDirect3DPixelShader9* pShader); + HRESULT TOGLMETHODCALLTYPE SetPixelShaderNonInline(IDirect3DPixelShader9* pShader); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetPixelShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount); + HRESULT TOGLMETHODCALLTYPE SetPixelShaderConstantFNonInline(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount); + + HRESULT TOGLMETHODCALLTYPE SetPixelShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount); + HRESULT TOGLMETHODCALLTYPE SetPixelShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount); + + // vertex shaders + HRESULT TOGLMETHODCALLTYPE CreateVertexShader(CONST DWORD* pFunction,IDirect3DVertexShader9** ppShader, const char *pShaderName, char *debugLabel = NULL); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetVertexShader(IDirect3DVertexShader9* pShader); + HRESULT TOGLMETHODCALLTYPE SetVertexShaderNonInline(IDirect3DVertexShader9* pShader); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetVertexShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount); + HRESULT TOGLMETHODCALLTYPE SetVertexShaderConstantFNonInline(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetVertexShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount); + HRESULT TOGLMETHODCALLTYPE SetVertexShaderConstantBNonInline(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetVertexShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount); + HRESULT TOGLMETHODCALLTYPE SetVertexShaderConstantINonInline(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount); + + // POSIX only - preheating for a specific vertex/pixel shader pair - trigger GLSL link inside GLM + HRESULT TOGLMETHODCALLTYPE LinkShaderPair( IDirect3DVertexShader9* vs, IDirect3DPixelShader9* ps ); + HRESULT TOGLMETHODCALLTYPE ValidateShaderPair( IDirect3DVertexShader9* vs, IDirect3DPixelShader9* ps ); + HRESULT TOGLMETHODCALLTYPE QueryShaderPair( int index, GLMShaderPairInfo *infoOut ); + + // vertex buffers + HRESULT TOGLMETHODCALLTYPE CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements,IDirect3DVertexDeclaration9** ppDecl); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl); + HRESULT TOGLMETHODCALLTYPE SetVertexDeclarationNonInline(IDirect3DVertexDeclaration9* pDecl); + + HRESULT TOGLMETHODCALLTYPE SetFVF(DWORD FVF); // we might not be using these ? + HRESULT TOGLMETHODCALLTYPE GetFVF(DWORD* pFVF); + + HRESULT CreateVertexBuffer(UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer9** ppVertexBuffer,VD3DHANDLE* pSharedHandle); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride); + HRESULT SetStreamSourceNonInline(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride); + + // index buffers + HRESULT TOGLMETHODCALLTYPE CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBuffer,VD3DHANDLE* pSharedHandle); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetIndices(IDirect3DIndexBuffer9* pIndexData); + HRESULT TOGLMETHODCALLTYPE SetIndicesNonInline(IDirect3DIndexBuffer9* pIndexData); + + // State management. + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetRenderStateInline(D3DRENDERSTATETYPE State,DWORD Value); + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetRenderStateConstInline(D3DRENDERSTATETYPE State,DWORD Value); + HRESULT TOGLMETHODCALLTYPE SetRenderState(D3DRENDERSTATETYPE State,DWORD Value); + + FORCEINLINE HRESULT TOGLMETHODCALLTYPE SetSamplerState(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value); + HRESULT TOGLMETHODCALLTYPE SetSamplerStateNonInline(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value); + + FORCEINLINE void TOGLMETHODCALLTYPE SetSamplerStates(DWORD Sampler, DWORD AddressU, DWORD AddressV, DWORD AddressW, DWORD MinFilter, DWORD MagFilter, DWORD MipFilter, DWORD MinLod, float LodBias ); + void TOGLMETHODCALLTYPE SetSamplerStatesNonInline(DWORD Sampler, DWORD AddressU, DWORD AddressV, DWORD AddressW, DWORD MinFilter, DWORD MagFilter, DWORD MipFilter, DWORD MinLod, float LodBias ); + +#ifdef OSX + // required for 10.6 support + HRESULT TOGLMETHODCALLTYPE FlushIndexBindings(void); // push index buffer (set index ptr) + HRESULT TOGLMETHODCALLTYPE FlushVertexBindings(uint baseVertexIndex); // push vertex streams (set attrib ptrs) +#endif + + // Draw. + HRESULT TOGLMETHODCALLTYPE DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount); + HRESULT TOGLMETHODCALLTYPE DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount); + HRESULT TOGLMETHODCALLTYPE DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride); + + // misc + BOOL TOGLMETHODCALLTYPE ShowCursor(BOOL bShow); + HRESULT TOGLMETHODCALLTYPE ValidateDevice(DWORD* pNumPasses); + HRESULT TOGLMETHODCALLTYPE SetMaterial(CONST D3DMATERIAL9* pMaterial); + HRESULT TOGLMETHODCALLTYPE LightEnable(DWORD Index,BOOL Enable); + HRESULT TOGLMETHODCALLTYPE SetScissorRect(CONST RECT* pRect); + HRESULT TOGLMETHODCALLTYPE CreateQuery(D3DQUERYTYPE Type,IDirect3DQuery9** ppQuery); + HRESULT TOGLMETHODCALLTYPE GetDeviceCaps(D3DCAPS9* pCaps); + HRESULT TOGLMETHODCALLTYPE TestCooperativeLevel(); + HRESULT TOGLMETHODCALLTYPE EvictManagedResources(); + HRESULT TOGLMETHODCALLTYPE SetLight(DWORD Index,CONST D3DLIGHT9*); + void TOGLMETHODCALLTYPE SetGammaRamp(UINT iSwapChain,DWORD Flags,CONST D3DGAMMARAMP* pRamp); + + + void TOGLMETHODCALLTYPE SaveGLState(); + void TOGLMETHODCALLTYPE RestoreGLState(); + + // Talk to JasonM about this one. It's tricky in GL. + HRESULT TOGLMETHODCALLTYPE SetClipPlane(DWORD Index,CONST float* pPlane); + + // + // + // **** FIXED FUNCTION STUFF - None of this stuff needs support in GL. + // + // + HRESULT TOGLMETHODCALLTYPE SetTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix); + HRESULT TOGLMETHODCALLTYPE SetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value); + + void TOGLMETHODCALLTYPE AcquireThreadOwnership( ); + void TOGLMETHODCALLTYPE ReleaseThreadOwnership( ); + inline DWORD TOGLMETHODCALLTYPE GetCurrentOwnerThreadId() const { return m_ctx->m_nCurOwnerThreadId; } + + FORCEINLINE void TOGLMETHODCALLTYPE SetMaxUsedVertexShaderConstantsHint( uint nMaxReg ); + void TOGLMETHODCALLTYPE SetMaxUsedVertexShaderConstantsHintNonInline( uint nMaxReg ); + + void DumpStatsToConsole( const CCommand *pArgs ); + +#if GLMDEBUG + void DumpTextures( const CCommand *pArgs ); +#endif + +private: + IDirect3DDevice9( const IDirect3DDevice9& ); + IDirect3DDevice9& operator= ( const IDirect3DDevice9& ); + // Flushing changes to GL + void FlushClipPlaneEquation(); + void InitStates(); + void FullFlushStates(); + void UpdateBoundFBO(); + void ResetFBOMap(); + void ScrubFBOMap( CGLMTex *pTex ); + + // response to retired objects (when refcount goes to zero and they self-delete..) + void ReleasedVertexDeclaration( IDirect3DVertexDeclaration9 *pDecl ); + void ReleasedTexture( IDirect3DBaseTexture9 *baseTex ); // called from texture destructor - need to scrub samplers + void ReleasedCGLMTex( CGLMTex *pTex ); + void ReleasedSurface( IDirect3DSurface9 *surface ); // called from any surface destructor - need to scrub RT table if an RT + void ReleasedPixelShader( IDirect3DPixelShader9 *pixelShader ); // called from IDirect3DPixelShader9 destructor + void ReleasedVertexShader( IDirect3DVertexShader9 *vertexShader ); // called from IDirect3DVertexShader9 destructor + void ReleasedVertexBuffer( IDirect3DVertexBuffer9 *vertexBuffer ); // called from IDirect3DVertexBuffer9 destructor + void ReleasedIndexBuffer( IDirect3DIndexBuffer9 *indexBuffer ); // called from IDirect3DIndexBuffer9 destructor + void ReleasedQuery( IDirect3DQuery9 *query ); // called from IDirect3DQuery9 destructor + + // Member variables + + DWORD m_nValidMarker; +public: + IDirect3DDevice9Params m_params; // mirror of the creation inputs +private: + + // D3D flavor stuff + IDirect3DSurface9 *m_pRenderTargets[4]; + IDirect3DSurface9 *m_pDepthStencil; + + IDirect3DSurface9 *m_pDefaultColorSurface; // default color surface. + IDirect3DSurface9 *m_pDefaultDepthStencilSurface; // queried by GetDepthStencilSurface. + + IDirect3DVertexDeclaration9 *m_pVertDecl; // Set by SetVertexDeclaration... + D3DStreamDesc m_streams[ D3D_MAX_STREAMS ]; // Set by SetStreamSource.. + CGLMBuffer *m_vtx_buffers[ D3D_MAX_STREAMS ]; + CGLMBuffer *m_pDummy_vtx_buffer; + D3DIndexDesc m_indices; // Set by SetIndices.. + + IDirect3DVertexShader9 *m_vertexShader; // Set by SetVertexShader... + IDirect3DPixelShader9 *m_pixelShader; // Set by SetPixelShader... + + IDirect3DBaseTexture9 *m_textures[GLM_SAMPLER_COUNT]; // set by SetTexture... NULL if stage inactive + + // GLM flavor stuff + GLMContext *m_ctx; + CGLMFBOMap *m_pFBOs; + bool m_bFBODirty; + + struct ObjectStats_t + { + int m_nTotalFBOs; + int m_nTotalVertexShaders; + int m_nTotalPixelShaders; + int m_nTotalVertexDecls; + int m_nTotalIndexBuffers; + int m_nTotalVertexBuffers; + int m_nTotalRenderTargets; + int m_nTotalTextures; + int m_nTotalSurfaces; + int m_nTotalQueries; + + void clear() { V_memset( this, 0, sizeof(* this ) ); } + + ObjectStats_t &operator -= ( const ObjectStats_t &rhs ) + { + m_nTotalFBOs -= rhs.m_nTotalFBOs; + m_nTotalVertexShaders -= rhs.m_nTotalVertexShaders; + m_nTotalPixelShaders -= rhs.m_nTotalPixelShaders; + m_nTotalVertexDecls -= rhs.m_nTotalVertexDecls; + m_nTotalIndexBuffers -= rhs.m_nTotalIndexBuffers; + m_nTotalVertexBuffers -= rhs.m_nTotalVertexBuffers; + m_nTotalRenderTargets -= rhs.m_nTotalRenderTargets; + m_nTotalTextures -= rhs.m_nTotalTextures; + m_nTotalSurfaces -= rhs.m_nTotalSurfaces; + m_nTotalQueries -= m_nTotalQueries; + return *this; + } + }; + ObjectStats_t m_ObjectStats; + ObjectStats_t m_PrevObjectStats; + void PrintObjectStats( const ObjectStats_t &stats ); + + // GL state + struct + { + // render state buckets + GLAlphaTestEnable_t m_AlphaTestEnable; + GLAlphaTestFunc_t m_AlphaTestFunc; + + GLAlphaToCoverageEnable_t m_AlphaToCoverageEnable; + + GLDepthTestEnable_t m_DepthTestEnable; + GLDepthMask_t m_DepthMask; + GLDepthFunc_t m_DepthFunc; + + GLClipPlaneEnable_t m_ClipPlaneEnable[kGLMUserClipPlanes]; + GLClipPlaneEquation_t m_ClipPlaneEquation[kGLMUserClipPlanes]; + + GLColorMaskSingle_t m_ColorMaskSingle; + GLColorMaskMultiple_t m_ColorMaskMultiple; + + GLCullFaceEnable_t m_CullFaceEnable; + GLCullFrontFace_t m_CullFrontFace; + GLPolygonMode_t m_PolygonMode; + GLDepthBias_t m_DepthBias; + GLScissorEnable_t m_ScissorEnable; + GLScissorBox_t m_ScissorBox; + GLViewportBox_t m_ViewportBox; + GLViewportDepthRange_t m_ViewportDepthRange; + + GLBlendEnable_t m_BlendEnable; + GLBlendFactor_t m_BlendFactor; + GLBlendEquation_t m_BlendEquation; + GLBlendColor_t m_BlendColor; + GLBlendEnableSRGB_t m_BlendEnableSRGB; + + GLStencilTestEnable_t m_StencilTestEnable; + GLStencilFunc_t m_StencilFunc; + GLStencilOp_t m_StencilOp; + GLStencilWriteMask_t m_StencilWriteMask; + + GLClearColor_t m_ClearColor; + GLClearDepth_t m_ClearDepth; + GLClearStencil_t m_ClearStencil; + + bool m_FogEnable; // not really pushed to GL, just latched here + + // samplers + //GLMTexSamplingParams m_samplers[GLM_SAMPLER_COUNT]; + } gl; + +#if GL_BATCH_PERF_ANALYSIS + simple_bitmap *m_pBatch_vis_bitmap; + uint m_nBatchVisY; + uint m_nBatchVisFrameIndex, m_nBatchVisFileIdx; + uint m_nNumProgramChanges; + + uint m_nTotalD3DCalls; + double m_flTotalD3DTime; + uint m_nTotalGLCalls; + double m_flTotalGLTime; + uint m_nTotalPrims; + + uint m_nOverallProgramChanges; + uint m_nOverallDraws; + uint m_nOverallPrims; + uint m_nOverallD3DCalls; + double m_flOverallD3DTime; + uint m_nOverallGLCalls; + double m_flOverallGLTime; + + double m_flOverallPresentTime; + double m_flOverallPresentTimeSquared; + double m_flOverallSwapWindowTime; + double m_flOverallSwapWindowTimeSquared; + uint m_nOverallPresents; +#endif +}; + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetSamplerState( DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value ) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetSamplerStateNonInline( Sampler, Type, Value ); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + Assert( Sampler < GLM_SAMPLER_COUNT ); + + m_ctx->SetSamplerDirty( Sampler ); + + switch( Type ) + { + case D3DSAMP_ADDRESSU: + m_ctx->SetSamplerAddressU( Sampler, Value ); + break; + case D3DSAMP_ADDRESSV: + m_ctx->SetSamplerAddressV( Sampler, Value ); + break; + case D3DSAMP_ADDRESSW: + m_ctx->SetSamplerAddressW( Sampler, Value ); + break; + case D3DSAMP_BORDERCOLOR: + m_ctx->SetSamplerBorderColor( Sampler, Value ); + break; + case D3DSAMP_MAGFILTER: + m_ctx->SetSamplerMagFilter( Sampler, Value ); + break; + case D3DSAMP_MIPFILTER: + m_ctx->SetSamplerMipFilter( Sampler, Value ); + break; + case D3DSAMP_MINFILTER: + m_ctx->SetSamplerMinFilter( Sampler, Value ); + break; + case D3DSAMP_MIPMAPLODBIAS: + m_ctx->SetSamplerMipMapLODBias( Sampler, Value ); + break; + case D3DSAMP_MAXMIPLEVEL: + m_ctx->SetSamplerMaxMipLevel( Sampler, Value); + break; + case D3DSAMP_MAXANISOTROPY: + m_ctx->SetSamplerMaxAnisotropy( Sampler, Value); + break; + case D3DSAMP_SRGBTEXTURE: + //m_samplers[ Sampler ].m_srgb = Value; + m_ctx->SetSamplerSRGBTexture(Sampler, Value); + break; + case D3DSAMP_SHADOWFILTER: + m_ctx->SetShadowFilter(Sampler, Value); + break; + + default: DXABSTRACT_BREAK_ON_ERROR(); break; + } + return S_OK; +#endif +} + +FORCEINLINE void TOGLMETHODCALLTYPE IDirect3DDevice9::SetSamplerStates( + DWORD Sampler, DWORD AddressU, DWORD AddressV, DWORD AddressW, + DWORD MinFilter, DWORD MagFilter, DWORD MipFilter, DWORD MinLod, + float LodBias) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + SetSamplerStatesNonInline( Sampler, AddressU, AddressV, AddressW, MinFilter, MagFilter, MipFilter, MinLod, LodBias ); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + Assert( Sampler < GLM_SAMPLER_COUNT); + + m_ctx->SetSamplerDirty( Sampler ); + + m_ctx->SetSamplerStates( Sampler, AddressU, AddressV, AddressW, MinFilter, MagFilter, MipFilter, MinLod, LodBias ); +#endif +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetTexture(DWORD Stage,IDirect3DBaseTexture9* pTexture) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetTextureNonInline( Stage, pTexture ); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + Assert( Stage < GLM_SAMPLER_COUNT ); + m_textures[Stage] = pTexture; + m_ctx->SetSamplerTex( Stage, pTexture ? pTexture->m_tex : NULL ); + return S_OK; +#endif +} + +inline GLenum D3DCompareFuncToGL( DWORD function ) +{ + switch ( function ) + { + case D3DCMP_NEVER : return GL_NEVER; // Always fail the test. + case D3DCMP_LESS : return GL_LESS; // Accept the new pixel if its value is less than the value of the current pixel. + case D3DCMP_EQUAL : return GL_EQUAL; // Accept the new pixel if its value equals the value of the current pixel. + case D3DCMP_LESSEQUAL : return GL_LEQUAL; // Accept the new pixel if its value is less than or equal to the value of the current pixel. ** + case D3DCMP_GREATER : return GL_GREATER; // Accept the new pixel if its value is greater than the value of the current pixel. + case D3DCMP_NOTEQUAL : return GL_NOTEQUAL; // Accept the new pixel if its value does not equal the value of the current pixel. + case D3DCMP_GREATEREQUAL: return GL_GEQUAL; // Accept the new pixel if its value is greater than or equal to the value of the current pixel. + case D3DCMP_ALWAYS : return GL_ALWAYS; // Always pass the test. + default : DXABSTRACT_BREAK_ON_ERROR(); return 0xFFFFFFFF; + } +} + +FORCEINLINE GLenum D3DBlendOperationToGL( DWORD operation ) +{ + switch (operation) + { + case D3DBLENDOP_ADD : return GL_FUNC_ADD; // The result is the destination added to the source. Result = Source + Destination + case D3DBLENDOP_SUBTRACT : return GL_FUNC_SUBTRACT; // The result is the destination subtracted from to the source. Result = Source - Destination + case D3DBLENDOP_REVSUBTRACT : return GL_FUNC_REVERSE_SUBTRACT; // The result is the source subtracted from the destination. Result = Destination - Source + case D3DBLENDOP_MIN : return GL_MIN; // The result is the minimum of the source and destination. Result = MIN(Source, Destination) + case D3DBLENDOP_MAX : return GL_MAX; // The result is the maximum of the source and destination. Result = MAX(Source, Destination) + default: + DXABSTRACT_BREAK_ON_ERROR(); + return 0xFFFFFFFF; + break; + } +} + +FORCEINLINE GLenum D3DBlendFactorToGL( DWORD equation ) +{ + switch (equation) + { + case D3DBLEND_ZERO : return GL_ZERO; // Blend factor is (0, 0, 0, 0). + case D3DBLEND_ONE : return GL_ONE; // Blend factor is (1, 1, 1, 1). + case D3DBLEND_SRCCOLOR : return GL_SRC_COLOR; // Blend factor is (Rs, Gs, Bs, As). + case D3DBLEND_INVSRCCOLOR : return GL_ONE_MINUS_SRC_COLOR; // Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As). + case D3DBLEND_SRCALPHA : return GL_SRC_ALPHA; // Blend factor is (As, As, As, As). + case D3DBLEND_INVSRCALPHA : return GL_ONE_MINUS_SRC_ALPHA; // Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As). + case D3DBLEND_DESTALPHA : return GL_DST_ALPHA; // Blend factor is (Ad Ad Ad Ad). + case D3DBLEND_INVDESTALPHA : return GL_ONE_MINUS_DST_ALPHA; // Blend factor is (1 - Ad 1 - Ad 1 - Ad 1 - Ad). + case D3DBLEND_DESTCOLOR : return GL_DST_COLOR; // Blend factor is (Rd, Gd, Bd, Ad). + case D3DBLEND_INVDESTCOLOR : return GL_ONE_MINUS_DST_COLOR; // Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad). + case D3DBLEND_SRCALPHASAT : return GL_SRC_ALPHA_SATURATE; // Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad). + + /* + // these are weird.... break if we hit them + case D3DBLEND_BOTHSRCALPHA : Assert(0); return GL_ZERO; // Obsolete. Starting with DirectX 6, you can achieve the same effect by setting the source and destination blend factors to D3DBLEND_SRCALPHA and D3DBLEND_INVSRCALPHA in separate calls. + case D3DBLEND_BOTHINVSRCALPHA: Assert(0); return GL_ZERO; // Source blend factor is (1 - As, 1 - As, 1 - As, 1 - As), and destination blend factor is (As, As, As, As); the destination blend selection is overridden. This blend mode is supported only for the D3DRS_SRCBLEND render state. + case D3DBLEND_BLENDFACTOR : Assert(0); return GL_ZERO; // Constant color blending factor used by the frame-buffer blender. This blend mode is supported only if D3DPBLENDCAPS_BLENDFACTOR is set in the SrcBlendCaps or DestBlendCaps members of D3DCAPS9. + + dxabstract.h has not heard of these, so let them hit the debugger if they come through + case D3DBLEND_INVBLENDFACTOR: //Inverted constant color-blending factor used by the frame-buffer blender. This blend mode is supported only if the D3DPBLENDCAPS_BLENDFACTOR bit is set in the SrcBlendCaps or DestBlendCaps members of D3DCAPS9. + case D3DBLEND_SRCCOLOR2: // Blend factor is (PSOutColor[1]r, PSOutColor[1]g, PSOutColor[1]b, not used). This flag is available in Direct3D 9Ex only. + case D3DBLEND_INVSRCCOLOR2: // Blend factor is (1 - PSOutColor[1]r, 1 - PSOutColor[1]g, 1 - PSOutColor[1]b, not used)). This flag is available in Direct3D 9Ex only. + */ + default: + DXABSTRACT_BREAK_ON_ERROR(); + return 0xFFFFFFFF; + break; + } +} + + +FORCEINLINE GLenum D3DStencilOpToGL( DWORD operation ) +{ + switch( operation ) + { + case D3DSTENCILOP_KEEP : return GL_KEEP; + case D3DSTENCILOP_ZERO : return GL_ZERO; + case D3DSTENCILOP_REPLACE : return GL_REPLACE; + case D3DSTENCILOP_INCRSAT : return GL_INCR; + case D3DSTENCILOP_DECRSAT : return GL_DECR; + case D3DSTENCILOP_INVERT : return GL_INVERT; + case D3DSTENCILOP_INCR : return GL_INCR_WRAP_EXT; + case D3DSTENCILOP_DECR : return GL_DECR_WRAP_EXT; + default : DXABSTRACT_BREAK_ON_ERROR(); return 0xFFFFFFFF; + } +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetRenderStateInline( D3DRENDERSTATETYPE State, DWORD Value ) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetRenderState( State, Value ); +#else + TOGL_NULL_DEVICE_CHECK; + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + + switch (State) + { + case D3DRS_ZENABLE: // kGLDepthTestEnable + { + gl.m_DepthTestEnable.enable = Value; + m_ctx->WriteDepthTestEnable( &gl.m_DepthTestEnable ); + break; + } + case D3DRS_ZWRITEENABLE: // kGLDepthMask + { + gl.m_DepthMask.mask = Value; + m_ctx->WriteDepthMask( &gl.m_DepthMask ); + break; + } + case D3DRS_ZFUNC: + { + // kGLDepthFunc + GLenum func = D3DCompareFuncToGL( Value ); + gl.m_DepthFunc.func = func; + m_ctx->WriteDepthFunc( &gl.m_DepthFunc ); + break; + } + case D3DRS_COLORWRITEENABLE: // kGLColorMaskSingle + { + gl.m_ColorMaskSingle.r = ((Value & D3DCOLORWRITEENABLE_RED) != 0) ? 0xFF : 0x00; + gl.m_ColorMaskSingle.g = ((Value & D3DCOLORWRITEENABLE_GREEN)!= 0) ? 0xFF : 0x00; + gl.m_ColorMaskSingle.b = ((Value & D3DCOLORWRITEENABLE_BLUE) != 0) ? 0xFF : 0x00; + gl.m_ColorMaskSingle.a = ((Value & D3DCOLORWRITEENABLE_ALPHA)!= 0) ? 0xFF : 0x00; + m_ctx->WriteColorMaskSingle( &gl.m_ColorMaskSingle ); + break; + } + case D3DRS_CULLMODE: // kGLCullFaceEnable / kGLCullFrontFace + { + switch (Value) + { + case D3DCULL_NONE: + { + gl.m_CullFaceEnable.enable = false; + gl.m_CullFrontFace.value = GL_CCW; //doesn't matter + + m_ctx->WriteCullFaceEnable( &gl.m_CullFaceEnable ); + m_ctx->WriteCullFrontFace( &gl.m_CullFrontFace ); + break; + } + + case D3DCULL_CW: + { + gl.m_CullFaceEnable.enable = true; + gl.m_CullFrontFace.value = GL_CW; //origGL_CCW; + + m_ctx->WriteCullFaceEnable( &gl.m_CullFaceEnable ); + m_ctx->WriteCullFrontFace( &gl.m_CullFrontFace ); + break; + } + case D3DCULL_CCW: + { + gl.m_CullFaceEnable.enable = true; + gl.m_CullFrontFace.value = GL_CCW; //origGL_CW; + + m_ctx->WriteCullFaceEnable( &gl.m_CullFaceEnable ); + m_ctx->WriteCullFrontFace( &gl.m_CullFrontFace ); + break; + } + default: + { + DXABSTRACT_BREAK_ON_ERROR(); + break; + } + } + break; + } + //-------------------------------------------------------------------------------------------- alphablend stuff + case D3DRS_ALPHABLENDENABLE: // kGLBlendEnable + { + gl.m_BlendEnable.enable = Value; + m_ctx->WriteBlendEnable( &gl.m_BlendEnable ); + break; + } + case D3DRS_BLENDOP: // kGLBlendEquation // D3D blend-op ==> GL blend equation + { + GLenum equation = D3DBlendOperationToGL( Value ); + gl.m_BlendEquation.equation = equation; + m_ctx->WriteBlendEquation( &gl.m_BlendEquation ); + break; + } + case D3DRS_SRCBLEND: // kGLBlendFactor // D3D blend-factor ==> GL blend factor + case D3DRS_DESTBLEND: // kGLBlendFactor + { + GLenum factor = D3DBlendFactorToGL( Value ); + + if (State==D3DRS_SRCBLEND) + { + gl.m_BlendFactor.srcfactor = factor; + } + else + { + gl.m_BlendFactor.dstfactor = factor; + } + m_ctx->WriteBlendFactor( &gl.m_BlendFactor ); + break; + } + case D3DRS_SRGBWRITEENABLE: // kGLBlendEnableSRGB + { + gl.m_BlendEnableSRGB.enable = Value; + m_ctx->WriteBlendEnableSRGB( &gl.m_BlendEnableSRGB ); + break; + } + //-------------------------------------------------------------------------------------------- alphatest stuff + case D3DRS_ALPHATESTENABLE: + { + gl.m_AlphaTestEnable.enable = Value; + m_ctx->WriteAlphaTestEnable( &gl.m_AlphaTestEnable ); + break; + } + case D3DRS_ALPHAREF: + { + gl.m_AlphaTestFunc.ref = Value / 255.0f; + m_ctx->WriteAlphaTestFunc( &gl.m_AlphaTestFunc ); + break; + } + case D3DRS_ALPHAFUNC: + { + GLenum func = D3DCompareFuncToGL( Value );; + gl.m_AlphaTestFunc.func = func; + m_ctx->WriteAlphaTestFunc( &gl.m_AlphaTestFunc ); + break; + } + //-------------------------------------------------------------------------------------------- stencil stuff + case D3DRS_STENCILENABLE: // GLStencilTestEnable_t + { + gl.m_StencilTestEnable.enable = Value; + m_ctx->WriteStencilTestEnable( &gl.m_StencilTestEnable ); + break; + } + case D3DRS_STENCILFAIL: // GLStencilOp_t "what do you do if stencil test fails" + { + GLenum stencilop = D3DStencilOpToGL( Value ); + gl.m_StencilOp.sfail = stencilop; + + m_ctx->WriteStencilOp( &gl.m_StencilOp,0 ); + m_ctx->WriteStencilOp( &gl.m_StencilOp,1 ); // ********* need to recheck this + break; + } + case D3DRS_STENCILZFAIL: // GLStencilOp_t "what do you do if stencil test passes *but* depth test fails, if depth test happened" + { + GLenum stencilop = D3DStencilOpToGL( Value ); + gl.m_StencilOp.dpfail = stencilop; + + m_ctx->WriteStencilOp( &gl.m_StencilOp,0 ); + m_ctx->WriteStencilOp( &gl.m_StencilOp,1 ); // ********* need to recheck this + break; + } + case D3DRS_STENCILPASS: // GLStencilOp_t "what do you do if stencil test and depth test both pass" + { + GLenum stencilop = D3DStencilOpToGL( Value ); + gl.m_StencilOp.dppass = stencilop; + + m_ctx->WriteStencilOp( &gl.m_StencilOp,0 ); + m_ctx->WriteStencilOp( &gl.m_StencilOp,1 ); // ********* need to recheck this + break; + } + case D3DRS_STENCILFUNC: // GLStencilFunc_t + { + GLenum stencilfunc = D3DCompareFuncToGL( Value ); + gl.m_StencilFunc.frontfunc = gl.m_StencilFunc.backfunc = stencilfunc; + + m_ctx->WriteStencilFunc( &gl.m_StencilFunc ); + break; + } + case D3DRS_STENCILREF: // GLStencilFunc_t + { + gl.m_StencilFunc.ref = Value; + m_ctx->WriteStencilFunc( &gl.m_StencilFunc ); + break; + } + case D3DRS_STENCILMASK: // GLStencilFunc_t + { + gl.m_StencilFunc.mask = Value; + m_ctx->WriteStencilFunc( &gl.m_StencilFunc ); + break; + } + case D3DRS_STENCILWRITEMASK: // GLStencilWriteMask_t + { + gl.m_StencilWriteMask.mask = Value; + m_ctx->WriteStencilWriteMask( &gl.m_StencilWriteMask ); + break; + } + case D3DRS_FOGENABLE: // none of these are implemented yet... erk + { + gl.m_FogEnable = (Value != 0); + GLMPRINTF(("-D- fogenable = %d",Value )); + break; + } + case D3DRS_SCISSORTESTENABLE: // kGLScissorEnable + { + gl.m_ScissorEnable.enable = Value; + m_ctx->WriteScissorEnable( &gl.m_ScissorEnable ); + break; + } + case D3DRS_DEPTHBIAS: // kGLDepthBias + { + // the value in the dword is actually a float + float fvalue = *(float*)&Value; + gl.m_DepthBias.units = fvalue; + + m_ctx->WriteDepthBias( &gl.m_DepthBias ); + break; + } + // good ref on these: http://aras-p.info/blog/2008/06/12/depth-bias-and-the-power-of-deceiving-yourself/ + case D3DRS_SLOPESCALEDEPTHBIAS: + { + // the value in the dword is actually a float + float fvalue = *(float*)&Value; + gl.m_DepthBias.factor = fvalue; + + m_ctx->WriteDepthBias( &gl.m_DepthBias ); + break; + } + // Alpha to coverage + case D3DRS_ADAPTIVETESS_Y: + { + gl.m_AlphaToCoverageEnable.enable = Value; + m_ctx->WriteAlphaToCoverageEnable( &gl.m_AlphaToCoverageEnable ); + break; + } + case D3DRS_CLIPPLANEENABLE: // kGLClipPlaneEnable + { + // d3d packs all the enables into one word. + // we break that out so we don't do N glEnable calls to sync - + // GLM is tracking one unique enable per plane. + for( int i=0; iWriteClipPlaneEnable( &gl.m_ClipPlaneEnable[x], x ); + break; + } + //-------------------------------------------------------------------------------------------- polygon/fill mode + case D3DRS_FILLMODE: + { + GLuint mode = 0; + switch(Value) + { + case D3DFILL_POINT: mode = GL_POINT; break; + case D3DFILL_WIREFRAME: mode = GL_LINE; break; + case D3DFILL_SOLID: mode = GL_FILL; break; + default: DXABSTRACT_BREAK_ON_ERROR(); break; + } + gl.m_PolygonMode.values[0] = gl.m_PolygonMode.values[1] = mode; + m_ctx->WritePolygonMode( &gl.m_PolygonMode ); + break; + } + } + + return S_OK; +#endif +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetRenderStateConstInline( D3DRENDERSTATETYPE State, DWORD Value ) +{ + // State is a compile time constant - luckily no need to do anything special to get the compiler to optimize this case. + return SetRenderStateInline( State, Value ); +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetIndices(IDirect3DIndexBuffer9* pIndexData) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetIndicesNonInline( pIndexData ); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + // just latch it. + m_indices.m_idxBuffer = pIndexData; + return S_OK; +#endif +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetStreamSourceNonInline( StreamNumber, pStreamData, OffsetInBytes, Stride ); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + Assert( StreamNumber < D3D_MAX_STREAMS ); + Assert( ( Stride & 3 ) == 0 ); // we support non-DWORD aligned strides, but on some drivers (like AMD's) perf goes off a cliff + + // perfectly legal to see a vertex buffer of NULL get passed in here. + // so we need an array to track these. + // OK, we are being given the stride, we don't need to calc it.. + + GLMPRINTF(("-X- IDirect3DDevice9::SetStreamSource setting stream #%d to D3D buf %p (GL name %d); offset %d, stride %d", StreamNumber, pStreamData, (pStreamData) ? pStreamData->m_vtxBuffer->m_name: -1, OffsetInBytes, Stride)); + + if ( !pStreamData ) + { + OffsetInBytes = 0; + Stride = 0; + + m_vtx_buffers[ StreamNumber ] = m_pDummy_vtx_buffer; + } + else + { + // We do not support strides of 0 + Assert( Stride > 0 ); + m_vtx_buffers[ StreamNumber ] = pStreamData->m_vtxBuffer; + } + + m_streams[ StreamNumber ].m_vtxBuffer = pStreamData; + m_streams[ StreamNumber ].m_offset = OffsetInBytes; + m_streams[ StreamNumber ].m_stride = Stride; + + return S_OK; +#endif +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetVertexShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) // groups of 4 floats! +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetVertexShaderConstantFNonInline( StartRegister, pConstantData, Vector4fCount ); +#else + TOGL_NULL_DEVICE_CHECK; + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_ctx->SetProgramParametersF( kGLMVertexProgram, StartRegister, (float *)pConstantData, Vector4fCount ); + return S_OK; +#endif +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetVertexShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetVertexShaderConstantBNonInline( StartRegister, pConstantData, BoolCount ); +#else + TOGL_NULL_DEVICE_CHECK; + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_ctx->SetProgramParametersB( kGLMVertexProgram, StartRegister, (int *)pConstantData, BoolCount ); + return S_OK; +#endif +} + +FORCEINLINE HRESULT IDirect3DDevice9::SetVertexShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount) // groups of 4 ints! +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetVertexShaderConstantINonInline( StartRegister, pConstantData, Vector4iCount ); +#else + TOGL_NULL_DEVICE_CHECK; + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_ctx->SetProgramParametersI( kGLMVertexProgram, StartRegister, (int *)pConstantData, Vector4iCount ); + return S_OK; +#endif +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetPixelShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetPixelShaderConstantFNonInline(StartRegister, pConstantData, Vector4fCount); +#else + TOGL_NULL_DEVICE_CHECK; + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_ctx->SetProgramParametersF( kGLMFragmentProgram, StartRegister, (float *)pConstantData, Vector4fCount ); + return S_OK; +#endif +} + +HRESULT IDirect3DDevice9::SetVertexShader(IDirect3DVertexShader9* pShader) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetVertexShaderNonInline(pShader); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_ctx->SetVertexProgram( pShader ? pShader->m_vtxProgram : NULL ); + m_vertexShader = pShader; + return S_OK; +#endif +} + +FORCEINLINE HRESULT TOGLMETHODCALLTYPE IDirect3DDevice9::SetPixelShader(IDirect3DPixelShader9* pShader) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetPixelShaderNonInline(pShader); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_ctx->SetFragmentProgram( pShader ? pShader->m_pixProgram : NULL ); + m_pixelShader = pShader; + return S_OK; +#endif +} + +FORCEINLINE HRESULT IDirect3DDevice9::SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetVertexDeclarationNonInline(pDecl); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_pVertDecl = pDecl; + return S_OK; +#endif +} + +FORCEINLINE void IDirect3DDevice9::SetMaxUsedVertexShaderConstantsHint( uint nMaxReg ) +{ +#if GLMDEBUG || GL_BATCH_PERF_ANALYSIS + return SetMaxUsedVertexShaderConstantsHintNonInline( nMaxReg ); +#else + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + m_ctx->SetMaxUsedVertexShaderConstantsHint( nMaxReg ); +#endif +} + +// ------------------------------------------------------------------------------------------------------------------------------ // +// D3DX +// ------------------------------------------------------------------------------------------------------------------------------ // +struct ID3DXInclude +{ + virtual HRESULT Open(D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes); + virtual HRESULT Close(LPCVOID pData); +}; +typedef ID3DXInclude* LPD3DXINCLUDE; + + +struct TOGL_CLASS ID3DXBuffer : public IUnknown +{ + void* GetBufferPointer(); + DWORD GetBufferSize(); +}; + +typedef ID3DXBuffer* LPD3DXBUFFER; + +class ID3DXConstantTable : public IUnknown +{ +}; +typedef ID3DXConstantTable* LPD3DXCONSTANTTABLE; + +TOGL_INTERFACE const char* D3DXGetPixelShaderProfile( IDirect3DDevice9 *pDevice ); + +TOGL_INTERFACE D3DXMATRIX* D3DXMatrixMultiply( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM1, CONST D3DXMATRIX *pM2 ); +TOGL_INTERFACE D3DXVECTOR3* D3DXVec3TransformCoord( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM ); + +TOGL_INTERFACE HRESULT D3DXCreateMatrixStack( DWORD Flags, LPD3DXMATRIXSTACK* ppStack); +TOGL_INTERFACE void D3DXMatrixIdentity( D3DXMATRIX * ); + +TOGL_INTERFACE D3DXINLINE D3DXVECTOR3* D3DXVec3Subtract( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) +{ + pOut->x = pV1->x - pV2->x; + pOut->y = pV1->y - pV2->y; + pOut->z = pV1->z - pV2->z; + return pOut; +} + +TOGL_INTERFACE D3DXINLINE D3DXVECTOR3* D3DXVec3Cross( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) +{ + D3DXVECTOR3 v; + + v.x = pV1->y * pV2->z - pV1->z * pV2->y; + v.y = pV1->z * pV2->x - pV1->x * pV2->z; + v.z = pV1->x * pV2->y - pV1->y * pV2->x; + + *pOut = v; + return pOut; +} + +TOGL_INTERFACE D3DXINLINE FLOAT D3DXVec3Dot( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) +{ + return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z; +} + +TOGL_INTERFACE D3DXMATRIX* D3DXMatrixInverse( D3DXMATRIX *pOut, FLOAT *pDeterminant, CONST D3DXMATRIX *pM ); + +TOGL_INTERFACE D3DXMATRIX* D3DXMatrixTranspose( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM ); + +TOGL_INTERFACE D3DXPLANE* D3DXPlaneNormalize( D3DXPLANE *pOut, CONST D3DXPLANE *pP); + +TOGL_INTERFACE D3DXVECTOR4* D3DXVec4Transform( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, CONST D3DXMATRIX *pM ); + + +TOGL_INTERFACE D3DXVECTOR4* D3DXVec4Normalize( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV ); + +TOGL_INTERFACE D3DXMATRIX* D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z ); + +// Build an ortho projection matrix. (right-handed) +TOGL_INTERFACE D3DXMATRIX* D3DXMatrixOrthoOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn,FLOAT zf ); + +TOGL_INTERFACE D3DXMATRIX* D3DXMatrixPerspectiveRH( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf ); + +TOGL_INTERFACE D3DXMATRIX* D3DXMatrixPerspectiveOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf ); + +// Transform a plane by a matrix. The vector (a,b,c) must be normal. +// M should be the inverse transpose of the transformation desired. +TOGL_INTERFACE D3DXPLANE* D3DXPlaneTransform( D3DXPLANE *pOut, CONST D3DXPLANE *pP, CONST D3DXMATRIX *pM ); + +TOGL_INTERFACE IDirect3D9 *Direct3DCreate9(UINT SDKVersion); + +TOGL_INTERFACE void D3DPERF_SetOptions( DWORD dwOptions ); + +TOGL_INTERFACE HRESULT D3DXCompileShader( + LPCSTR pSrcData, + UINT SrcDataLen, + CONST D3DXMACRO* pDefines, + LPD3DXINCLUDE pInclude, + LPCSTR pFunctionName, + LPCSTR pProfile, + DWORD Flags, + LPD3DXBUFFER* ppShader, + LPD3DXBUFFER* ppErrorMsgs, + LPD3DXCONSTANTTABLE* ppConstantTable); + +// fake D3D usage constant for SRGB tex creation +#define D3DUSAGE_TEXTURE_SRGB (0x80000000L) + +#else + + //USE_ACTUAL_DX + #ifndef WIN32 + #error sorry man + #endif + + #ifdef _X360 + #include "d3d9.h" + #include "d3dx9.h" + #else + #include + #include "../../dx9sdk/include/d3d9.h" + #include "../../dx9sdk/include/d3dx9.h" + #endif + typedef HWND VD3DHWND; + +#endif // DX_TO_GL_ABSTRACTION + +#endif // DXABSTRACT_H diff --git a/public/togles/linuxwin/dxabstract_types.h b/public/togles/linuxwin/dxabstract_types.h new file mode 100644 index 00000000..9713ec71 --- /dev/null +++ b/public/togles/linuxwin/dxabstract_types.h @@ -0,0 +1,1748 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// dxabstract_types.h +// +//================================================================================================== +#ifndef DXABSTRACT_TYPES_H +#define DXABSTRACT_TYPES_H + +#pragma once + +#if GL_BATCH_PERF_ANALYSIS + class simple_bitmap; +#endif + +struct IUnknown; +struct IDirect3D9; +struct IDirect3DDevice9; +struct IDirect3DResource9; +struct IDirect3DBaseTexture9; +struct IDirect3DTexture9; +struct IDirect3DCubeTexture9; +struct IDirect3DVolumeTexture9; +struct IDirect3DSurface9; +struct IDirect3DVertexDeclaration9; +struct IDirect3DQuery9; +struct IDirect3DVertexBuffer9; +struct IDirect3DIndexBuffer9; +struct IDirect3DPixelShader9; +struct IDirect3DVertexShader9; +struct IDirect3DDevice9Params; + +class GLMContext; +struct GLMRect; +struct GLMShaderPairInfo; +class CGLMBuffer; +class CGLMQuery; +class CGLMTex; +class CGLMProgram; +class CGLMFBO; + +#ifdef TOGL_DLL_EXPORT + #define TOGL_INTERFACE DLL_EXPORT + #define TOGL_OVERLOAD DLL_GLOBAL_EXPORT + #define TOGL_CLASS DLL_CLASS_EXPORT + #define TOGL_GLOBAL DLL_GLOBAL_EXPORT +#else + #define TOGL_INTERFACE DLL_IMPORT + #define TOGL_OVERLOAD DLL_GLOBAL_IMPORT + #define TOGL_CLASS DLL_CLASS_IMPORT + #define TOGL_GLOBAL DLL_GLOBAL_IMPORT +#endif + +#define TOGLMETHODCALLTYPE __stdcall +//#define TOGLMETHODCALLTYPE + +#define DXABSTRACT_BREAK_ON_ERROR() DebuggerBreak() + +typedef void* VD3DHWND; +typedef void* VD3DHANDLE; + +#define MAKEFOURCC(ch0, ch1, ch2, ch3) ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 )) + +// +// +// Stuff that would be in windows.h +// +// +#if !defined(_WINNT_) + + typedef int INT; + typedef unsigned long ULONG; + typedef long LONG; + typedef float FLOAT; + typedef unsigned int DWORD; + typedef unsigned short WORD; + typedef long long LONGLONG; + typedef unsigned int UINT; + typedef long HRESULT; + typedef unsigned char BYTE; + #define CONST const + + #if defined(POSIX) + typedef size_t ULONG_PTR; + #else + typedef unsigned long ULONG_PTR; + #endif + + typedef ULONG_PTR SIZE_T; + + typedef const char* LPCSTR; + typedef char* LPSTR; + typedef DWORD* LPDWORD; + + #define ZeroMemory RtlZeroMemory + #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length)) + + typedef union _LARGE_INTEGER + { + struct + { + DWORD LowPart; + LONG HighPart; + }; + struct + { + DWORD LowPart; + LONG HighPart; + } u; + LONGLONG QuadPart; + } LARGE_INTEGER; + + typedef struct _GUID + { + bool operator==( const struct _GUID &other ) const; + + unsigned long Data1; + unsigned short Data2; + unsigned short Data3; + unsigned char Data4[ 8 ]; + } GUID; + + typedef struct _RECT + { + int left; + int top; + int right; + int bottom; + } RECT; + + typedef struct tagPOINT + { + LONG x; + LONG y; + } POINT, *PPOINT, *LPPOINT; + + typedef struct _MEMORYSTATUS + { + DWORD dwLength; + SIZE_T dwTotalPhys; + } MEMORYSTATUS, *LPMEMORYSTATUS; + + typedef DWORD COLORREF; + #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) + + #define MAKE_HRESULT(sev,fac,code) ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) ) + + #define S_FALSE ((HRESULT)0x00000001L) + #define S_OK 0 + #define E_FAIL ((HRESULT)0x80004005L) + #define E_OUTOFMEMORY ((HRESULT)0x8007000EL) + + #define FAILED(hr) ((HRESULT)(hr) < 0) + #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) + + struct RGNDATA + { + }; + + typedef const void* LPCVOID; +#endif + +//----------------------------------------------------------------------------- + +typedef enum _D3DFORMAT D3DFORMAT; + +#define D3DSI_OPCODE_MASK 0x0000FFFF +#define D3DSP_TEXTURETYPE_MASK 0x78000000 + +#define D3DUSAGE_AUTOGENMIPMAP 0x00000400L +#define D3DSP_DCL_USAGE_MASK 0x0000000f + +#define D3DSP_OPCODESPECIFICCONTROL_MASK 0x00ff0000 +#define D3DSP_OPCODESPECIFICCONTROL_SHIFT 16 + +// Comparison for dynamic conditional instruction opcodes (i.e. if, breakc) +typedef enum _D3DSHADER_COMPARISON +{ + // < = > + D3DSPC_RESERVED0= 0, // 0 0 0 + D3DSPC_GT = 1, // 0 0 1 + D3DSPC_EQ = 2, // 0 1 0 + D3DSPC_GE = 3, // 0 1 1 + D3DSPC_LT = 4, // 1 0 0 + D3DSPC_NE = 5, // 1 0 1 + D3DSPC_LE = 6, // 1 1 0 + D3DSPC_RESERVED1= 7 // 1 1 1 +} D3DSHADER_COMPARISON; + + +// Comparison is part of instruction opcode token: +#define D3DSHADER_COMPARISON_SHIFT D3DSP_OPCODESPECIFICCONTROL_SHIFT +#define D3DSHADER_COMPARISON_MASK (0x7<>8)&0xFF) +#define D3DSHADER_VERSION_MINOR(_Version) (((_Version)>>0)&0xFF) + +#define D3DSHADER_ADDRESSMODE_SHIFT 13 +#define D3DSHADER_ADDRESSMODE_MASK (1 << D3DSHADER_ADDRESSMODE_SHIFT) + +#define D3DPS_END() 0x0000FFFF + +// ps_2_0 texld controls +#define D3DSI_TEXLD_PROJECT (0x01 << D3DSP_OPCODESPECIFICCONTROL_SHIFT) +#define D3DSI_TEXLD_BIAS (0x02 << D3DSP_OPCODESPECIFICCONTROL_SHIFT) + + +// destination parameter write mask +#define D3DSP_WRITEMASK_0 0x00010000 // Component 0 (X;Red) +#define D3DSP_WRITEMASK_1 0x00020000 // Component 1 (Y;Green) +#define D3DSP_WRITEMASK_2 0x00040000 // Component 2 (Z;Blue) +#define D3DSP_WRITEMASK_3 0x00080000 // Component 3 (W;Alpha) +#define D3DSP_WRITEMASK_ALL 0x000F0000 // All Components + +#define D3DVS_SWIZZLE_SHIFT 16 +#define D3DVS_SWIZZLE_MASK 0x00FF0000 + +// The following bits define where to take component X from: + +#define D3DVS_X_X (0 << D3DVS_SWIZZLE_SHIFT) +#define D3DVS_X_Y (1 << D3DVS_SWIZZLE_SHIFT) +#define D3DVS_X_Z (2 << D3DVS_SWIZZLE_SHIFT) +#define D3DVS_X_W (3 << D3DVS_SWIZZLE_SHIFT) + +// The following bits define where to take component Y from: + +#define D3DVS_Y_X (0 << (D3DVS_SWIZZLE_SHIFT + 2)) +#define D3DVS_Y_Y (1 << (D3DVS_SWIZZLE_SHIFT + 2)) +#define D3DVS_Y_Z (2 << (D3DVS_SWIZZLE_SHIFT + 2)) +#define D3DVS_Y_W (3 << (D3DVS_SWIZZLE_SHIFT + 2)) + +// The following bits define where to take component Z from: + +#define D3DVS_Z_X (0 << (D3DVS_SWIZZLE_SHIFT + 4)) +#define D3DVS_Z_Y (1 << (D3DVS_SWIZZLE_SHIFT + 4)) +#define D3DVS_Z_Z (2 << (D3DVS_SWIZZLE_SHIFT + 4)) +#define D3DVS_Z_W (3 << (D3DVS_SWIZZLE_SHIFT + 4)) + +// The following bits define where to take component W from: + +#define D3DVS_W_X (0 << (D3DVS_SWIZZLE_SHIFT + 6)) +#define D3DVS_W_Y (1 << (D3DVS_SWIZZLE_SHIFT + 6)) +#define D3DVS_W_Z (2 << (D3DVS_SWIZZLE_SHIFT + 6)) +#define D3DVS_W_W (3 << (D3DVS_SWIZZLE_SHIFT + 6)) + +// source parameter modifiers +#define D3DSP_SRCMOD_SHIFT 24 +#define D3DSP_SRCMOD_MASK 0x0F000000 + +// ------------------------------------------------------------------------------------------------------------------------------ // +// ENUMS +// ------------------------------------------------------------------------------------------------------------------------------ // + +typedef enum _D3DSHADER_PARAM_SRCMOD_TYPE +{ + D3DSPSM_NONE = 0<= 2.0 + + + D3DDECLTYPE_UBYTE4N = 8, // Each of 4 bytes is normalized by dividing to 255.0 + D3DDECLTYPE_SHORT2N = 9, // 2D signed short normalized (v[0]/32767.0,v[1]/32767.0,0,1) + D3DDECLTYPE_SHORT4N = 10, // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0) + D3DDECLTYPE_USHORT2N = 11, // 2D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,0,1) + D3DDECLTYPE_USHORT4N = 12, // 4D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,v[2]/65535.0,v[3]/65535.0) + D3DDECLTYPE_UDEC3 = 13, // 3D unsigned 10 10 10 format expanded to (value, value, value, 1) + D3DDECLTYPE_DEC3N = 14, // 3D signed 10 10 10 format normalized and expanded to (v[0]/511.0, v[1]/511.0, v[2]/511.0, 1) + D3DDECLTYPE_FLOAT16_2 = 15, // Two 16-bit floating point values, expanded to (value, value, 0, 1) + D3DDECLTYPE_FLOAT16_4 = 16, // Four 16-bit floating point values + D3DDECLTYPE_UNUSED = 17, // When the type field in a decl is unused. +} D3DDECLTYPE; + +typedef enum _D3DDECLMETHOD +{ + D3DDECLMETHOD_DEFAULT = 0, + D3DDECLMETHOD_PARTIALU, + D3DDECLMETHOD_PARTIALV, + D3DDECLMETHOD_CROSSUV, // Normal + D3DDECLMETHOD_UV, + D3DDECLMETHOD_LOOKUP, // Lookup a displacement map + D3DDECLMETHOD_LOOKUPPRESAMPLED, // Lookup a pre-sampled displacement map +} D3DDECLMETHOD; + +typedef enum _D3DDECLUSAGE +{ + D3DDECLUSAGE_POSITION = 0, + D3DDECLUSAGE_BLENDWEIGHT = 1, + D3DDECLUSAGE_BLENDINDICES = 2, + D3DDECLUSAGE_NORMAL = 3, + D3DDECLUSAGE_PSIZE = 4, + D3DDECLUSAGE_TEXCOORD = 5, + D3DDECLUSAGE_TANGENT = 6, + D3DDECLUSAGE_BINORMAL = 7, + D3DDECLUSAGE_TESSFACTOR = 8, + D3DDECLUSAGE_PLUGH = 9, // mystery value + D3DDECLUSAGE_COLOR = 10, + D3DDECLUSAGE_FOG = 11, + D3DDECLUSAGE_DEPTH = 12, + D3DDECLUSAGE_SAMPLE = 13, +} D3DDECLUSAGE; + +typedef enum _D3DPRIMITIVETYPE +{ + D3DPT_POINTLIST = 1, + D3DPT_LINELIST = 2, + D3DPT_TRIANGLELIST = 4, + D3DPT_TRIANGLESTRIP = 5, + D3DPT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ +} D3DPRIMITIVETYPE; + +// ------------------------------------------------------------------------------------------------------------------------------ // +// STRUCTURES +// ------------------------------------------------------------------------------------------------------------------------------ // + +typedef struct TOGL_CLASS D3DXPLANE +{ + float& operator[]( int i ); + bool operator==( const D3DXPLANE &o ); + bool operator!=( const D3DXPLANE &o ); + operator float*(); + operator const float*() const; + + float a, b, c, d; +} D3DXPLANE; + +typedef enum _D3DVERTEXBLENDFLAGS +{ + D3DVBF_DISABLE = 0, // Disable vertex blending + D3DVBF_1WEIGHTS = 1, // 2 matrix blending + D3DVBF_2WEIGHTS = 2, // 3 matrix blending + D3DVBF_3WEIGHTS = 3, // 4 matrix blending + D3DVBF_TWEENING = 255, // blending using D3DRS_TWEENFACTOR + D3DVBF_0WEIGHTS = 256, // one matrix is used with weight 1.0 + D3DVBF_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum +} D3DVERTEXBLENDFLAGS; + +typedef struct _D3DINDEXBUFFER_DESC +{ + D3DFORMAT Format; + D3DRESOURCETYPE Type; + DWORD Usage; + D3DPOOL Pool; + UINT Size; +} D3DINDEXBUFFER_DESC; + +typedef struct _D3DVERTEXELEMENT9 +{ + WORD Stream; // Stream index + WORD Offset; // Offset in the stream in bytes + BYTE Type; // Data type + BYTE Method; // Processing method + BYTE Usage; // Semantics + BYTE UsageIndex; // Semantic index +} D3DVERTEXELEMENT9, *LPD3DVERTEXELEMENT9; + + +#define MAX_DEVICE_IDENTIFIER_STRING 512 +typedef struct _D3DADAPTER_IDENTIFIER9 +{ + char Driver[MAX_DEVICE_IDENTIFIER_STRING]; + char Description[MAX_DEVICE_IDENTIFIER_STRING]; + char DeviceName[32]; /* Device name for GDI (ex. \\.\DISPLAY1) */ + + LARGE_INTEGER DriverVersion; /* Defined for 32 bit components */ + + DWORD VendorId; + DWORD DeviceId; + DWORD SubSysId; + DWORD Revision; + DWORD VideoMemory; + +} D3DADAPTER_IDENTIFIER9; + +typedef struct _D3DCOLORVALUE +{ + float r; + float g; + float b; + float a; +} D3DCOLORVALUE; + +typedef struct _D3DMATERIAL9 +{ + D3DCOLORVALUE Diffuse; /* Diffuse color RGBA */ + D3DCOLORVALUE Ambient; /* Ambient color RGB */ + D3DCOLORVALUE Specular; /* Specular 'shininess' */ + D3DCOLORVALUE Emissive; /* Emissive color RGB */ + float Power; /* Sharpness if specular highlight */ +} D3DMATERIAL9; + +typedef struct _D3DVOLUME_DESC +{ + D3DFORMAT Format; + D3DRESOURCETYPE Type; + DWORD Usage; + D3DPOOL Pool; + + UINT Width; + UINT Height; + UINT Depth; +} D3DVOLUME_DESC; + +typedef struct _D3DVIEWPORT9 +{ + DWORD X; + DWORD Y; /* Viewport Top left */ + DWORD Width; + DWORD Height; /* Viewport Dimensions */ + float MinZ; /* Min/max of clip Volume */ + float MaxZ; +} D3DVIEWPORT9; + +typedef struct _D3DPSHADERCAPS2_0 +{ + DWORD Caps; + INT DynamicFlowControlDepth; + INT NumTemps; + INT StaticFlowControlDepth; + INT NumInstructionSlots; +} D3DPSHADERCAPS2_0; + +typedef struct _D3DCAPS9 +{ + /* Device Info */ + D3DDEVTYPE DeviceType; + + /* Caps from DX7 Draw */ + DWORD Caps; + DWORD Caps2; + + /* Cursor Caps */ + DWORD CursorCaps; + + /* 3D Device Caps */ + DWORD DevCaps; + + DWORD PrimitiveMiscCaps; + DWORD RasterCaps; + DWORD TextureCaps; + DWORD TextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DTexture9's + + DWORD MaxTextureWidth, MaxTextureHeight; + DWORD MaxVolumeExtent; + + DWORD MaxTextureAspectRatio; + DWORD MaxAnisotropy; + + DWORD TextureOpCaps; + DWORD MaxTextureBlendStages; + DWORD MaxSimultaneousTextures; + + DWORD VertexProcessingCaps; + DWORD MaxActiveLights; + DWORD MaxUserClipPlanes; + DWORD MaxVertexBlendMatrices; + DWORD MaxVertexBlendMatrixIndex; + + DWORD MaxPrimitiveCount; // max number of primitives per DrawPrimitive call + DWORD MaxStreams; + + DWORD VertexShaderVersion; + DWORD MaxVertexShaderConst; // number of vertex shader constant registers + + DWORD PixelShaderVersion; + + // Here are the DX9 specific ones + DWORD DevCaps2; + D3DPSHADERCAPS2_0 PS20Caps; + + DWORD NumSimultaneousRTs; // Will be at least 1 + DWORD MaxVertexShader30InstructionSlots; + DWORD MaxPixelShader30InstructionSlots; + + // only on Posix/GL + DWORD FakeSRGBWrite; // 1 for parts which can't support SRGB writes due to driver issues - 0 for others + DWORD MixedSizeTargets; // 1 for parts which can mix attachment sizes (RT's color vs depth) + DWORD CanDoSRGBReadFromRTs; // 0 when we're on Leopard, 1 when on Snow Leopard +} D3DCAPS9; + +typedef struct _D3DDISPLAYMODE +{ + UINT Width; + UINT Height; + UINT RefreshRate; + D3DFORMAT Format; +} D3DDISPLAYMODE; + +typedef struct _D3DGAMMARAMP +{ + WORD red [256]; + WORD green[256]; + WORD blue [256]; +} D3DGAMMARAMP; + + +/* Resize Optional Parameters */ +typedef struct _D3DPRESENT_PARAMETERS_ +{ + UINT BackBufferWidth; + UINT BackBufferHeight; + D3DFORMAT BackBufferFormat; + UINT BackBufferCount; + + D3DMULTISAMPLE_TYPE MultiSampleType; + DWORD MultiSampleQuality; + + D3DSWAPEFFECT SwapEffect; + VD3DHWND hDeviceWindow; + BOOL Windowed; + BOOL EnableAutoDepthStencil; + D3DFORMAT AutoDepthStencilFormat; + DWORD Flags; + + /* FullScreen_RefreshRateInHz must be zero for Windowed mode */ + UINT FullScreen_RefreshRateInHz; + UINT PresentationInterval; +} D3DPRESENT_PARAMETERS; + +typedef struct _D3DDEVICE_CREATION_PARAMETERS +{ + UINT AdapterOrdinal; + D3DDEVTYPE DeviceType; + VD3DHWND hFocusWindow; + DWORD BehaviorFlags; +} D3DDEVICE_CREATION_PARAMETERS; + +/* Structures for LockBox */ +typedef struct _D3DBOX +{ + UINT Left; + UINT Top; + UINT Right; + UINT Bottom; + UINT Front; + UINT Back; +} D3DBOX; + +typedef struct _D3DLOCKED_BOX +{ + INT RowPitch; + INT SlicePitch; + void* pBits; +} D3DLOCKED_BOX; + +typedef struct _D3DSURFACE_DESC +{ + D3DFORMAT Format; + D3DRESOURCETYPE Type; + DWORD Usage; + D3DPOOL Pool; + + D3DMULTISAMPLE_TYPE MultiSampleType; + DWORD MultiSampleQuality; + UINT Width; + UINT Height; +} D3DSURFACE_DESC; + + +typedef struct _D3DLOCKED_RECT +{ + INT Pitch; + void* pBits; +} D3DLOCKED_RECT; + + +typedef struct _D3DRASTER_STATUS +{ + BOOL InVBlank; + UINT ScanLine; +} D3DRASTER_STATUS; + +typedef enum _D3DLIGHTTYPE +{ + D3DLIGHT_POINT = 1, + D3DLIGHT_SPOT = 2, + D3DLIGHT_DIRECTIONAL = 3, + D3DLIGHT_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ +} D3DLIGHTTYPE; + +typedef struct TOGL_CLASS _D3DVECTOR +{ + float x; + float y; + float z; +} D3DVECTOR; + +class TOGL_CLASS D3DXVECTOR2 +{ +public: + operator FLOAT* (); + operator CONST FLOAT* () const; + + float x,y; +}; + +class TOGL_CLASS D3DXVECTOR3 : public D3DVECTOR +{ +public: + D3DXVECTOR3() {} + D3DXVECTOR3( float a, float b, float c ); + operator FLOAT* (); + operator CONST FLOAT* () const; +}; + +typedef enum _D3DXINCLUDE_TYPE +{ + D3DXINC_LOCAL, + + // force 32-bit size enum + D3DXINC_FORCE_DWORD = 0x7fffffff + +} D3DXINCLUDE_TYPE; + +typedef struct _D3DLIGHT9 +{ + D3DLIGHTTYPE Type; /* Type of light source */ + D3DCOLORVALUE Diffuse; /* Diffuse color of light */ + D3DCOLORVALUE Specular; /* Specular color of light */ + D3DCOLORVALUE Ambient; /* Ambient color of light */ + D3DVECTOR Position; /* Position in world space */ + D3DVECTOR Direction; /* Direction in world space */ + float Range; /* Cutoff range */ + float Falloff; /* Falloff */ + float Attenuation0; /* Constant attenuation */ + float Attenuation1; /* Linear attenuation */ + float Attenuation2; /* Quadratic attenuation */ + float Theta; /* Inner angle of spotlight cone */ + float Phi; /* Outer angle of spotlight cone */ +} D3DLIGHT9; + +class TOGL_CLASS D3DXVECTOR4 +{ +public: + D3DXVECTOR4() {} + D3DXVECTOR4( float a, float b, float c, float d ); + + float x,y,z,w; +}; + +//---------------------------------------------------------------------------- +// D3DXMACRO: +// ---------- +// Preprocessor macro definition. The application pass in a NULL-terminated +// array of this structure to various D3DX APIs. This enables the application +// to #define tokens at runtime, before the file is parsed. +//---------------------------------------------------------------------------- + +typedef struct _D3DXMACRO +{ + LPCSTR Name; + LPCSTR Definition; + +} D3DXMACRO, *LPD3DXMACRO; + +// ------------------------------------------------------------------------------------------------------------------------------ // +// ------------------------------------------------------------------------------------------------------------------------------ // +// **** FIXED FUNCTION STUFF - None of this stuff needs support in GL. +// +// Also look for any functions marked with "**** FIXED FUNCTION STUFF" +// +// It's only laying around here so we don't have to chop up the shader system a lot to strip out the fixed function code paths. +// ------------------------------------------------------------------------------------------------------------------------------ // +// ------------------------------------------------------------------------------------------------------------------------------ // + +// **** FIXED FUNCTION STUFF - None of this stuff needs support in GL. +typedef enum _D3DTRANSFORMSTATETYPE +{ + D3DTS_VIEW = 2, + D3DTS_PROJECTION = 3, + D3DTS_TEXTURE0 = 16, + D3DTS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ +} D3DTRANSFORMSTATETYPE; + +// **** FIXED FUNCTION STUFF - None of this stuff needs support in GL. +typedef enum _D3DTEXTUREOP +{ + // Control + D3DTOP_DISABLE = 1, // disables stage + D3DTOP_SELECTARG1 = 2, // the default + D3DTOP_SELECTARG2 = 3, + + // Modulate + D3DTOP_MODULATE = 4, // multiply args together + D3DTOP_MODULATE2X = 5, // multiply and 1 bit + D3DTOP_MODULATE4X = 6, // multiply and 2 bits + + // Add + D3DTOP_ADD = 7, // add arguments together + D3DTOP_ADDSIGNED = 8, // add with -0.5 bias + D3DTOP_ADDSIGNED2X = 9, // as above but left 1 bit + D3DTOP_SUBTRACT = 10, // Arg1 - Arg2, with no saturation + D3DTOP_ADDSMOOTH = 11, // add 2 args, subtract product + // Arg1 + Arg2 - Arg1*Arg2 + // = Arg1 + (1-Arg1)*Arg2 + + // Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha) + D3DTOP_BLENDDIFFUSEALPHA = 12, // iterated alpha + D3DTOP_BLENDTEXTUREALPHA = 13, // texture alpha + D3DTOP_BLENDFACTORALPHA = 14, // alpha from D3DRS_TEXTUREFACTOR + + // Linear alpha blend with pre-multiplied arg1 input: Arg1 + Arg2*(1-Alpha) + D3DTOP_BLENDTEXTUREALPHAPM = 15, // texture alpha + D3DTOP_BLENDCURRENTALPHA = 16, // by alpha of current color + + // Specular mapping + D3DTOP_PREMODULATE = 17, // modulate with next texture before use + D3DTOP_MODULATEALPHA_ADDCOLOR = 18, // Arg1.RGB + Arg1.A*Arg2.RGB + // COLOROP only + D3DTOP_MODULATECOLOR_ADDALPHA = 19, // Arg1.RGB*Arg2.RGB + Arg1.A + // COLOROP only + D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20, // (1-Arg1.A)*Arg2.RGB + Arg1.RGB + // COLOROP only + D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21, // (1-Arg1.RGB)*Arg2.RGB + Arg1.A + // COLOROP only + + // Bump mapping + D3DTOP_BUMPENVMAP = 22, // per pixel env map perturbation + D3DTOP_BUMPENVMAPLUMINANCE = 23, // with luminance channel + + // This can do either diffuse or specular bump mapping with correct input. + // Performs the function (Arg1.R*Arg2.R + Arg1.G*Arg2.G + Arg1.B*Arg2.B) + // where each component has been scaled and offset to make it signed. + // The result is replicated into all four (including alpha) channels. + // This is a valid COLOROP only. + D3DTOP_DOTPRODUCT3 = 24, + + // Triadic ops + D3DTOP_MULTIPLYADD = 25, // Arg0 + Arg1*Arg2 + D3DTOP_LERP = 26, // (Arg0)*Arg1 + (1-Arg0)*Arg2 + + D3DTOP_FORCE_DWORD = 0x7fffffff, +} D3DTEXTUREOP; + +// **** FIXED FUNCTION STUFF - None of this stuff needs support in GL. +typedef enum _D3DTEXTURESTAGESTATETYPE +{ + D3DTSS_COLOROP = 1, /* D3DTEXTUREOP - per-stage blending controls for color channels */ + D3DTSS_COLORARG1 = 2, /* D3DTA_* (texture arg) */ + D3DTSS_COLORARG2 = 3, /* D3DTA_* (texture arg) */ + D3DTSS_ALPHAOP = 4, /* D3DTEXTUREOP - per-stage blending controls for alpha channel */ + D3DTSS_ALPHAARG1 = 5, /* D3DTA_* (texture arg) */ + D3DTSS_ALPHAARG2 = 6, /* D3DTA_* (texture arg) */ + D3DTSS_BUMPENVMAT00 = 7, /* float (bump mapping matrix) */ + D3DTSS_BUMPENVMAT01 = 8, /* float (bump mapping matrix) */ + D3DTSS_BUMPENVMAT10 = 9, /* float (bump mapping matrix) */ + D3DTSS_BUMPENVMAT11 = 10, /* float (bump mapping matrix) */ + D3DTSS_TEXCOORDINDEX = 11, /* identifies which set of texture coordinates index this texture */ + D3DTSS_BUMPENVLOFFSET = 23, /* float offset for bump map luminance */ + D3DTSS_TEXTURETRANSFORMFLAGS = 24, /* D3DTEXTURETRANSFORMFLAGS controls texture transform */ + D3DTSS_COLORARG0 = 26, /* D3DTA_* third arg for triadic ops */ + D3DTSS_RESULTARG = 28, /* D3DTA_* arg for result (CURRENT or TEMP) */ + + + D3DTSS_FORCE_DWORD = 0x7fffffff, /* force 32-bit size enum */ +} D3DTEXTURESTAGESTATETYPE; + +//===========================================================================// + +enum GLMVertexAttributeIndex +{ + kGLMGenericAttr00 = 0, + kGLMGenericAttr01, + kGLMGenericAttr02, + kGLMGenericAttr03, + kGLMGenericAttr04, + kGLMGenericAttr05, + kGLMGenericAttr06, + kGLMGenericAttr07, + kGLMGenericAttr08, + kGLMGenericAttr09, + kGLMGenericAttr10, + kGLMGenericAttr11, + kGLMGenericAttr12, + kGLMGenericAttr13, + kGLMGenericAttr14, + kGLMGenericAttr15, + + kGLMVertexAttributeIndexMax // ideally < 32 +}; + +struct GLMVertexAttributeDesc // all the info you need to do vertex setup for one attribute +{ + CGLMBuffer *m_pBuffer; // NULL allowed in which case m_offset is the full 32-bit pointer.. so you can draw from plain RAM if desired + GLuint m_nCompCount; // comp count of the attribute (1-4) + GLenum m_datatype; // data type of the attribute (GL_FLOAT, GL_UNSIGNED_BYTE, etc) + GLuint m_stride; + GLuint m_offset; // net offset to attribute 'zero' within the buffer. + GLuint m_streamOffset; // net offset to attribute 'zero' within the buffer. + GLboolean m_normalized; // apply to any fixed point data that needs normalizing, esp color bytes + + inline uint GetDataTypeSizeInBytes() const + { + switch ( m_datatype ) + { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + return 1; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_HALF_FLOAT: + return 2; + case GL_INT: + case GL_FLOAT: + return 4; + default: + Assert( 0 ); + break; + } + return 0; + } + + inline uint GetTotalAttributeSizeInBytes() const { Assert( m_nCompCount ); return m_nCompCount * GetDataTypeSizeInBytes(); } + + // may need a seed value at some point to be able to disambiguate re-lifed buffers holding same pointer + // simpler alternative is to do shoot-down inside the vertex/index buffer free calls. + // I'd rather not have to have each attribute fiddling a ref count on the buffer to which it refers.. + +//#define EQ(fff) ( (src.fff) == (fff) ) + // test in decreasing order of likelihood of difference, but do not include the buffer revision as caller is not supplying it.. + //inline bool operator== ( const GLMVertexAttributeDesc& src ) const { return EQ( m_pBuffer ) && EQ( m_offset ) && EQ( m_stride ) && EQ( m_datatype ) && EQ( m_normalized ) && EQ( m_nCompCount ); } +//#undef EQ + + uint m_bufferRevision; // only set in GLM context's copy, to disambiguate references that are same offset / same buffer but cross an orphan event +}; + +#define MAX_D3DVERTEXELEMENTS 16 + +struct D3DVERTEXELEMENT9_GL +{ + // fields right out of the original decl element (copied) + D3DVERTEXELEMENT9 m_dxdecl; // d3d info + // WORD Stream; // Stream index + // WORD Offset; // Offset in the stream in bytes + // BYTE Type; // Data type + // BYTE Method; // Processing method + // BYTE Usage; // Semantics + // BYTE UsageIndex; // Semantic index + + GLMVertexAttributeDesc m_gldecl; + // CGLMBuffer *m_buffer; // late-dropped from selected stream desc (left NULL, will replace with stream source buffer at sync time) + // GLuint m_datasize; // component count (1,2,3,4) of the attrib + // GLenum m_datatype; // data type of the attribute (GL_FLOAT et al) + // GLuint m_stride; // late-dropped from stream desc + // GLuint m_offset; // net offset to attribute 'zero' within the stream data. Add the stream offset before passing to GL. + // GLuint m_normalized; // net offset to attribute 'zero' within the stream data. Add the stream offset before passing to GL. +}; + +struct IDirect3DDevice9Params +{ + UINT m_adapter; + D3DDEVTYPE m_deviceType; + VD3DHWND m_focusWindow; + DWORD m_behaviorFlags; + D3DPRESENT_PARAMETERS m_presentationParameters; +}; + +#define D3D_MAX_STREAMS 5 //9 +struct D3DStreamDesc +{ + IDirect3DVertexBuffer9 *m_vtxBuffer; + uint m_offset; + uint m_stride; +}; + +struct D3DIndexDesc +{ + IDirect3DIndexBuffer9 *m_idxBuffer; +}; + +// we latch sampler values until draw time and then convert them all to GL form +// note these are similar in name to the fields of a GLMTexSamplingParams but contents are not +// particularly in the texture filtering area + +struct D3DSamplerDesc +{ + DWORD m_srgb; // D3DSAMP_SRGBTEXTURE 0 = no SRGB sampling +}; + +// Tracking and naming sampler dimensions +#define SAMPLER_TYPE_2D 0 +#define SAMPLER_TYPE_CUBE 1 +#define SAMPLER_TYPE_3D 2 +#define SAMPLER_TYPE_UNUSED 3 + +#endif // DXABSTRACT_TYPES_H diff --git a/public/togles/linuxwin/glbase.h b/public/togles/linuxwin/glbase.h new file mode 100644 index 00000000..9c830e6d --- /dev/null +++ b/public/togles/linuxwin/glbase.h @@ -0,0 +1,117 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glbase.h +// +//=============================================================================== + +#ifndef GLBASE_H +#define GLBASE_H + +#ifdef DX_TO_GL_ABSTRACTION + +#undef HAVE_GL_ARB_SYNC + +#ifndef OSX +#define HAVE_GL_ARB_SYNC 1 +#endif + +#ifdef USE_SDL +#include "SDL_opengl.h" +#endif + +#ifdef OSX +#include +#include +#endif + +#ifdef DX_TO_GL_ABSTRACTION + #ifndef WIN32 + #define Debugger DebuggerBreak + #endif + #undef CurrentTime + + #if defined( USE_SDL ) + #include "SDL.h" + #endif +#endif + +//=============================================================================== +// glue to call out to Obj-C land (these are in glmgrcocoa.mm) +#ifdef OSX + typedef void _PseudoNSGLContext; // aka NSOpenGLContext + typedef _PseudoNSGLContext *PseudoNSGLContextPtr; + + CGLContextObj GetCGLContextFromNSGL( PseudoNSGLContextPtr nsglCtx ); +#endif + +// Set TOGL_SUPPORT_NULL_DEVICE to 1 to support the NULL ref device +#define TOGL_SUPPORT_NULL_DEVICE 0 + +#if TOGL_SUPPORT_NULL_DEVICE + #define TOGL_NULL_DEVICE_CHECK if( m_params.m_deviceType == D3DDEVTYPE_NULLREF ) return S_OK; + #define TOGL_NULL_DEVICE_CHECK_RET_VOID if( m_params.m_deviceType == D3DDEVTYPE_NULLREF ) return; +#else + #define TOGL_NULL_DEVICE_CHECK + #define TOGL_NULL_DEVICE_CHECK_RET_VOID +#endif + +// GL_ENABLE_INDEX_VERIFICATION enables index range verification on all dynamic IB/VB's (obviously slow) +#define GL_ENABLE_INDEX_VERIFICATION 0 + +// GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION (currently win32 only) - If 1, VirtualAlloc/VirtualProtect is used to detect cases where the app locks a buffer, copies the ptr away, unlocks, then tries to later write to the buffer. +#define GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION 0 + +#define GL_BATCH_TELEMETRY_ZONES 0 + +// GL_BATCH_PERF_ANALYSIS - Enables gl_batch_vis, and various per-batch telemetry statistics messages. +#define GL_BATCH_PERF_ANALYSIS 0 +#define GL_BATCH_PERF_ANALYSIS_WRITE_PNGS 0 + +// GL_TELEMETRY_ZONES - Causes every single OpenGL call to generate a telemetry event +#define GL_TELEMETRY_ZONES 0 + +// GL_DUMP_ALL_API_CALLS - Causes a debug message to be printed for every API call if s_bDumpCalls bool is set to 1 +#define GL_DUMP_ALL_API_CALLS 0 + +// Must also enable PIX_ENABLE to use GL_TELEMETRY_GPU_ZONES. +#define GL_TELEMETRY_GPU_ZONES 0 + +// Records global # of OpenGL calls/total cycles spent inside GL +#define GL_TRACK_API_TIME GL_BATCH_PERF_ANALYSIS + +#define GL_USE_EXECUTE_HELPER_FOR_ALL_API_CALLS ( GL_TELEMETRY_ZONES || GL_TRACK_API_TIME || GL_DUMP_ALL_API_CALLS ) + +#if GL_BATCH_PERF_ANALYSIS + #define GL_BATCH_PERF(...) __VA_ARGS__ +#else + #define GL_BATCH_PERF(...) +#endif + +#define kGLMUserClipPlanes 2 +#define kGLMScratchFBOCount 4 + +#endif // DX_TO_GL_ABSTRACTION + +#endif // GLBASE_H diff --git a/public/togles/linuxwin/glentrypoints.h b/public/togles/linuxwin/glentrypoints.h new file mode 100644 index 00000000..0f6e8616 --- /dev/null +++ b/public/togles/linuxwin/glentrypoints.h @@ -0,0 +1,403 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glentrypoints.h +// +//=============================================================================== + +#ifndef GLENTRYPOINTS_H +#define GLENTRYPOINTS_H + +#pragma once + +#ifdef DX_TO_GL_ABSTRACTION + +#include "tier0/platform.h" +#include "tier0/vprof_telemetry.h" +#include "interface.h" +#include "togl/rendermechanism.h" + +void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, void *fallback=NULL); + +#if GL_USE_EXECUTE_HELPER_FOR_ALL_API_CALLS +class CGLExecuteHelperBase +{ +public: + inline void StartCall(const char *pName); + inline void StopCall(const char *pName); +#if GL_TRACK_API_TIME + TmU64 m_nStartTime; +#endif +}; + +template < class FunctionType, typename Result > +class CGLExecuteHelper : public CGLExecuteHelperBase +{ +public: + inline CGLExecuteHelper(FunctionType pFn, const char *pName ) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c, d); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c, d, e); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c, d, e, f); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c, d, e, f, g); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g, H h) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c, d, e, f, g, h); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g, H h, I i) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c, d, e, f, g, h, i); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g, H h, I i, J j) : m_pFn( pFn ) { StartCall(pName); m_Result = (*m_pFn)(a, b, c, d, e, f, g, h, i, j); StopCall(pName); } + + inline operator Result() const { return m_Result; } + inline operator char*() const { return (char*)m_Result; } + + FunctionType m_pFn; + + Result m_Result; +}; + +template < class FunctionType> +class CGLExecuteHelper : public CGLExecuteHelperBase +{ +public: + inline CGLExecuteHelper(FunctionType pFn, const char *pName ) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c, d); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c, d, e); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c, d, e, f); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c, d, e, f, g); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g, H h) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c, d, e, f, g, h); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g, H h, I i) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c, d, e, f, g, h, i); StopCall(pName); } + template inline CGLExecuteHelper(FunctionType pFn, const char *pName, A a, B b, C c, D d, E e, F f, G g, H h, I i, J j) : m_pFn( pFn ) { StartCall(pName); (*m_pFn)(a, b, c, d, e, f, g, h, i, j); StopCall(pName); } + + FunctionType m_pFn; +}; +#endif + +template < class FunctionType, typename Result > +class CDynamicFunctionOpenGLBase +{ +public: + // Construct with a NULL function pointer. You must manually call + // Lookup() before you can call a dynamic function through this interface. + CDynamicFunctionOpenGLBase() : m_pFn(NULL) {} + + // Construct and do a lookup right away. You will need to make sure that + // the lookup actually succeeded, as the gl library might have failed to load + // or (fn) might not exist in it. + CDynamicFunctionOpenGLBase(const char *fn, FunctionType fallback=NULL) : m_pFn(NULL) + { + Lookup(fn, fallback); + } + + // Construct and do a lookup right away. See comments in Lookup() about what (okay) does. + CDynamicFunctionOpenGLBase(const char *fn, bool &okay, FunctionType fallback=NULL) : m_pFn(NULL) + { + Lookup(fn, okay, fallback); + } + + // Load library if necessary, look up symbol. Returns true and sets + // m_pFn on successful lookup, returns false otherwise. If the + // function pointer is already looked up, this return true immediately. + // Use Reset() first if you want to look up the symbol again. + // This function will return false immediately unless (okay) is true. + // This allows you to chain lookups like this: + // bool okay = true; + // x.Lookup(lib, "x", okay); + // y.Lookup(lib, "y", okay); + // z.Lookup(lib, "z", okay); + // if (okay) { printf("All functions were loaded successfully!\n"); } + // If you supply a fallback, it'll be used if the lookup fails (and if + // non-NULL, means this will always return (okay)). + bool Lookup(const char *fn, bool &okay, FunctionType fallback=NULL) + { + if (!okay) + return false; + else if (this->m_pFn == NULL) + { + this->m_pFn = (FunctionType) VoidFnPtrLookup_GlMgr(fn, okay, false, (void *) fallback); + this->SetFuncName( fn ); + } + okay = m_pFn != NULL; + return okay; + } + + // Load library if necessary, look up symbol. Returns true and sets + // m_pFn on successful lookup, returns false otherwise. If the + // function pointer is already looked up, this return true immediately. + // Use Reset() first if you want to look up the symbol again. + // This function will return false immediately unless (okay) is true. + // If you supply a fallback, it'll be used if the lookup fails (and if + // non-NULL, means this will always return true). + bool Lookup(const char *fn, FunctionType fallback=NULL) + { + bool okay = true; + return Lookup(fn, okay, fallback); + } + + // Invalidates the current lookup. Makes the function pointer NULL. You + // will need to call Lookup() before you can call a dynamic function + // through this interface again. + void Reset() { m_pFn = NULL; } + + // Force this to be a specific function pointer. + void Force(FunctionType ptr) { m_pFn = ptr; } + + // Retrieve the actual function pointer. + FunctionType Pointer() const { return m_pFn; } + +#if GL_USE_EXECUTE_HELPER_FOR_ALL_API_CALLS + #if GL_TELEMETRY_ZONES || GL_DUMP_ALL_API_CALLS + #define GL_FUNC_NAME m_szName + #else + #define GL_FUNC_NAME "" + #endif + + inline CGLExecuteHelper operator() () const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME ); } + + template + inline CGLExecuteHelper operator() (T a) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a); } + + template + inline CGLExecuteHelper operator() (T a, U b) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c ) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c, W d) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c, d); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c, W d, X e) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c, d, e); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c, W d, X e, Y f) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c, d, e, f); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c, W d, X e, Y f, Z g) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c, d, e, f, g); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c, W d, X e, Y f, Z g, A h) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c, d, e, f, g, h); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c, W d, X e, Y f, Z g, A h, B i) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c, d, e, f, g, h, i); } + + template + inline CGLExecuteHelper operator() (T a, U b, V c, W d, X e, Y f, Z g, A h, B i, C j) const { return CGLExecuteHelper(m_pFn, GL_FUNC_NAME, a, b, c, d, e, f, g, h, i, j); } +#else + operator FunctionType() const { return m_pFn; } +#endif + + // Can be used to verify that we have an actual function looked up and + // ready to call: if (!MyDynFunc) { printf("Function not found!\n"); } + operator bool () const { return m_pFn != NULL; } + bool operator !() const { return m_pFn == NULL; } + +protected: + FunctionType m_pFn; + +#if GL_TELEMETRY_ZONES || GL_DUMP_ALL_API_CALLS + char m_szName[32]; + inline void SetFuncName(const char *pFn) { V_strncpy( m_szName, pFn, sizeof( m_szName ) ); } +#else + inline void SetFuncName(const char *pFn) { (void)pFn; } +#endif +}; + +// This works a lot like CDynamicFunctionMustInit, but we use SDL_GL_GetProcAddress(). +template < const bool bRequired, class FunctionType, typename Result > +class CDynamicFunctionOpenGL : public CDynamicFunctionOpenGLBase< FunctionType, Result > +{ +private: // forbid default constructor. + CDynamicFunctionOpenGL() {} + +public: + CDynamicFunctionOpenGL(const char *fn, FunctionType fallback=NULL) + { + bool okay = true; + Lookup(fn, okay, fallback); + this->SetFuncName( fn ); + } + + CDynamicFunctionOpenGL(const char *fn, bool &okay, FunctionType fallback=NULL) + { + Lookup(fn, okay, fallback); + this->SetFuncName( fn ); + } + + // Please note this is not virtual. + // !!! FIXME: we might want to fall back and try "EXT" or "ARB" versions in some case. + bool Lookup(const char *fn, bool &okay, FunctionType fallback=NULL) + { + if (this->m_pFn == NULL) + { + this->m_pFn = (FunctionType) VoidFnPtrLookup_GlMgr(fn, okay, bRequired, (void *) fallback); + this->SetFuncName( fn ); + } + return okay; + } +}; + +enum GLDriverStrings_t +{ + cGLVendorString, + cGLRendererString, + cGLVersionString, + cGLExtensionsString, + + cGLTotalDriverStrings +}; + +enum GLDriverProvider_t +{ + cGLDriverProviderUnknown, + cGLDriverProviderNVIDIA, + cGLDriverProviderAMD, + cGLDriverProviderIntel, + cGLDriverProviderIntelOpenSource, + cGLDriverProviderApple, + + cGLTotalDriverProviders +}; + +// This provides all the entry points for a given OpenGL context. +// ENTRY POINTS ARE ONLY VALID FOR THE CONTEXT THAT WAS CURRENT WHEN +// YOU LOOKED THEM UP. 99% of the time, this is not a problem, but +// that 1% is really hard to track down. Always access the GL +// through this class! +class COpenGLEntryPoints +{ + COpenGLEntryPoints( const COpenGLEntryPoints & ); + COpenGLEntryPoints &operator= ( const COpenGLEntryPoints & ); + +public: + // The GL context you are looking up entry points for must be current when you construct this object! + COpenGLEntryPoints(); + ~COpenGLEntryPoints(); + + void ClearEntryPoints(); + uint64 m_nTotalGLCycles, m_nTotalGLCalls; + + int m_nOpenGLVersionMajor; // if GL_VERSION is 2.1.0, this will be set to 2. + int m_nOpenGLVersionMinor; // if GL_VERSION is 2.1.0, this will be set to 1. + int m_nOpenGLVersionPatch; // if GL_VERSION is 2.1.0, this will be set to 0. + bool m_bHave_OpenGL; + + char *m_pGLDriverStrings[cGLTotalDriverStrings]; + GLDriverProvider_t m_nDriverProvider; + +#ifdef OSX +#define GL_EXT(x,glmajor,glminor) bool m_bHave_##x; +#define GL_FUNC(ext,req,ret,fn,arg,call) CDynamicFunctionOpenGL< req, ret (*) arg, ret > fn; +#define GL_FUNC_VOID(ext,req,fn,arg,call) CDynamicFunctionOpenGL< req, void (*) arg, void > fn; +#else +#define GL_EXT(x,glmajor,glminor) bool m_bHave_##x; +#define GL_FUNC(ext,req,ret,fn,arg,call) CDynamicFunctionOpenGL< req, ret (APIENTRY *) arg, ret > fn; +#define GL_FUNC_VOID(ext,req,fn,arg,call) CDynamicFunctionOpenGL< req, void (APIENTRY *) arg, void > fn; +#endif + #include "togl/glfuncs.inl" + #undef GL_FUNC_VOID + #undef GL_FUNC + #undef GL_EXT + + bool HasSwapTearExtension() const + { +#ifdef _WIN32 + return m_bHave_WGL_EXT_swap_control_tear; +#else + return m_bHave_GLX_EXT_swap_control_tear; +#endif + } +}; + +// This will be set to the current OpenGL context's entry points. +extern COpenGLEntryPoints *gGL; +typedef void * (*GL_GetProcAddressCallbackFunc_t)(const char *, bool &, const bool, void *); + +#ifdef TOGL_DLL_EXPORT + DLL_EXPORT COpenGLEntryPoints *ToGLConnectLibraries( CreateInterfaceFn factory ); + DLL_EXPORT void ToGLDisconnectLibraries(); + DLL_EXPORT COpenGLEntryPoints *GetOpenGLEntryPoints(GL_GetProcAddressCallbackFunc_t callback); + DLL_EXPORT void ClearOpenGLEntryPoints(); +#else + DLL_IMPORT COpenGLEntryPoints *ToGLConnectLibraries( CreateInterfaceFn factory ); + DLL_IMPORT void ToGLDisconnectLibraries(); + DLL_IMPORT COpenGLEntryPoints *GetOpenGLEntryPoints(GL_GetProcAddressCallbackFunc_t callback); + DLL_IMPORT void ClearOpenGLEntryPoints(); +#endif + +#if GL_USE_EXECUTE_HELPER_FOR_ALL_API_CALLS +inline void CGLExecuteHelperBase::StartCall(const char *pName) +{ + (void)pName; + +#if GL_TELEMETRY_ZONES + tmEnter( TELEMETRY_LEVEL3, TMZF_NONE, pName ); +#endif + +#if GL_TRACK_API_TIME + m_nStartTime = tmFastTime(); +#endif + +#if GL_DUMP_ALL_API_CALLS + static bool s_bDumpCalls; + if ( s_bDumpCalls ) + { + char buf[128]; + buf[0] = 'G'; + buf[1] = 'L'; + buf[2] = ':'; + size_t l = strlen( pName ); + memcpy( buf + 3, pName, l ); + buf[3 + l] = '\n'; + buf[4 + l] = '\0'; + Plat_DebugString( buf ); + } +#endif +} + +inline void CGLExecuteHelperBase::StopCall(const char *pName) +{ +#if GL_TRACK_API_TIME + uint64 nTotalCycles = tmFastTime() - m_nStartTime; +#endif + +#if GL_TELEMETRY_ZONES + tmLeave( TELEMETRY_LEVEL3 ); +#endif + +#if GL_TRACK_API_TIME + //double flMilliseconds = g_Telemetry.flRDTSCToMilliSeconds * nTotalCycles; + if (gGL) + { + gGL->m_nTotalGLCycles += nTotalCycles; + gGL->m_nTotalGLCalls++; + } +#endif +} +#endif + +#endif // DX_TO_GL_ABSTRACTION + +#endif // GLENTRYPOINTS_H diff --git a/public/togles/linuxwin/glfuncs.h b/public/togles/linuxwin/glfuncs.h new file mode 100644 index 00000000..f543b4af --- /dev/null +++ b/public/togles/linuxwin/glfuncs.h @@ -0,0 +1,277 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// !!! FIXME: Some of these aren't base OpenGL...pick out the extensions. +// !!! FIXME: Also, look up these -1, -1 versions numbers. +GL_FUNC(OpenGL,true,GLenum,glGetError,(void),()) +GL_FUNC_VOID(OpenGL,true,glActiveTexture,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glAlphaFunc,(GLenum a,GLclampf b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glAttachObjectARB,(GLhandleARB a,GLhandleARB b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glBegin,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glBindAttribLocationARB,(GLhandleARB a,GLuint b,const GLcharARB *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glBindBufferARB,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glBindProgramARB,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glBindTexture,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glBlendColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glBlendEquation,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glBlendFunc,(GLenum a,GLenum b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glBufferDataARB,(GLenum a,GLsizeiptrARB b,const GLvoid *c,GLenum d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glClear,(GLbitfield a),(a)) +GL_FUNC_VOID(OpenGL,true,glClearColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glClearDepth,(GLclampd a),(a)) +GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint a),(a)) +GL_FUNC_VOID(OpenGL,true,glClipPlane,(GLenum a,const GLdouble *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glColorMask,(GLboolean a,GLboolean b,GLboolean c,GLboolean d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glCompileShaderARB,(GLhandleARB a),(a)) +GL_FUNC_VOID(OpenGL,true,glCompressedTexImage2D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLint f,GLsizei g,const GLvoid *h),(a,b,c,d,e,f,g,h)) +GL_FUNC_VOID(OpenGL,true,glCompressedTexImage3D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLsizei h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) +GL_FUNC(OpenGL,true,GLhandleARB,glCreateProgramObjectARB,(void),()) +GL_FUNC(OpenGL,true,GLhandleARB,glCreateShaderObjectARB,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glDeleteBuffersARB,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDeleteObjectARB,(GLhandleARB a),(a)) +GL_FUNC_VOID(OpenGL,true,glDeleteProgramsARB,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDeleteQueriesARB,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDeleteShader,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glDeleteTextures,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean a),(a)) +GL_FUNC_VOID(OpenGL,true,glDepthRange,(GLclampd a,GLclampd b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDetachObjectARB,(GLhandleARB a,GLhandleARB b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDisable,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glDrawBuffer,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glDrawBuffers,(GLsizei a,const GLenum *b),(a,b)) +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)) +#ifndef OSX // 10.6/GL 2.1 compatability +GL_FUNC_VOID(OpenGL,true,glDrawRangeElementsBaseVertex,(GLenum a,GLuint b,GLuint c,GLsizei d,GLenum e,const GLvoid *f, GLenum g),(a,b,c,d,e,f,g)) +#endif +GL_FUNC_VOID(OpenGL,true,glEnable,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glEnd,(void),()) +GL_FUNC_VOID(OpenGL,true,glFinish,(void),()) +GL_FUNC_VOID(OpenGL,true,glFlush,(void),()) +GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glGenBuffersARB,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGenProgramsARB,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGenQueriesARB,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGenTextures,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGetBooleanv,(GLenum a,GLboolean *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGetCompressedTexImage,(GLenum a,GLint b,GLvoid *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glGetDoublev,(GLenum a,GLdouble *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGetInfoLogARB,(GLhandleARB a,GLsizei b,GLsizei *c,GLcharARB *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glGetIntegerv,(GLenum a,GLint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGetObjectParameterivARB,(GLhandleARB a,GLenum b,GLint *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glGetProgramivARB,(GLenum a,GLenum b,GLint *c),(a,b,c)) +GL_FUNC(OpenGL,true,const GLubyte *,glGetString,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glGetTexImage,(GLenum a,GLint b,GLenum c,GLenum d,GLvoid *e),(a,b,c,d,e)) +GL_FUNC(OpenGL,true,GLint,glGetUniformLocationARB,(GLhandleARB a,const GLcharARB *b),(a,b)) +GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a)) +GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glLinkProgramARB,(GLhandleARB a),(a)) +GL_FUNC(OpenGL,true,GLvoid*,glMapBufferARB,(GLenum a,GLenum b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glOrtho,(GLdouble a,GLdouble b,GLdouble c,GLdouble d,GLdouble e,GLdouble f),(a,b,c,d,e,f)) +GL_FUNC_VOID(OpenGL,true,glPixelStorei,(GLenum a,GLint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glPolygonOffset,(GLfloat a,GLfloat b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glPopAttrib,(void),()) +GL_FUNC_VOID(OpenGL,true,glProgramStringARB,(GLenum a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glPushAttrib,(GLbitfield a),(a)) +GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glScissor,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glShaderSourceARB,(GLhandleARB a,GLsizei b,const GLcharARB **c,const GLint *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glStencilFunc,(GLenum a,GLint b,GLuint c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glStencilMask,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glStencilOp,(GLenum a,GLenum b,GLenum c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glTexCoord2f,(GLfloat a,GLfloat b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glTexImage2D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLint f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) +GL_FUNC_VOID(OpenGL,true,glTexImage3D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLenum h,GLenum i,const GLvoid *j),(a,b,c,d,e,f,g,h,i,j)) +GL_FUNC_VOID(OpenGL,true,glTexParameterfv,(GLenum a,GLenum b,const GLfloat *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glTexParameteri,(GLenum a,GLenum b,GLint c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glTexSubImage2D,(GLenum a,GLint b,GLint c,GLint d,GLsizei e,GLsizei f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) +GL_FUNC_VOID(OpenGL,true,glUniform1f,(GLint a,GLfloat b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glUniform1iARB,(GLint a,GLint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glUniform4fv,(GLint a,GLsizei b,const GLfloat *c),(a,b,c)) +GL_FUNC(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glVertex3f,(GLfloat a,GLfloat b,GLfloat c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glVertexAttribPointer,(GLuint a,GLint b,GLenum c,GLboolean d,GLsizei e,const GLvoid *f),(a,b,c,d,e,f)) +GL_FUNC_VOID(OpenGL,true,glViewport,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glEnableClientState,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glDisableClientState,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glClientActiveTexture,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glVertexPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glTexCoordPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glProgramEnvParameters4fvEXT,(GLenum a,GLuint b,GLsizei c,const GLfloat *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glColor4sv,(const GLshort *a),(a)) +GL_FUNC_VOID(OpenGL,true,glStencilOpSeparate,(GLenum a,GLenum b,GLenum c,GLenum d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glStencilFuncSeparate,(GLenum a,GLenum b,GLint c,GLuint d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glGetTexLevelParameteriv,(GLenum a,GLint b,GLenum c,GLint *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glColor4f,(GLfloat a,GLfloat b,GLfloat c,GLfloat d),(a,b,c,d)) +GL_EXT(GL_EXT_framebuffer_object,-1,-1) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindRenderbufferEXT,(GLenum a,GLuint b),(a,b)) +GL_FUNC(GL_EXT_framebuffer_object,false,GLenum,glCheckFramebufferStatusEXT,(GLenum a),(a)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteRenderbuffersEXT,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferRenderbufferEXT,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture2DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture3DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenFramebuffersEXT,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenRenderbuffersEXT,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteFramebuffersEXT,(GLsizei a,const GLuint *b),(a,b)) +GL_EXT(GL_EXT_framebuffer_blit,-1,-1) +GL_FUNC_VOID(GL_EXT_framebuffer_blit,false,glBlitFramebufferEXT,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j)) +GL_EXT(GL_EXT_framebuffer_multisample,-1,-1) +GL_FUNC_VOID(GL_EXT_framebuffer_multisample,false,glRenderbufferStorageMultisampleEXT,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e)) +GL_EXT(GL_APPLE_fence,-1,-1) +GL_FUNC(GL_APPLE_fence,false,GLboolean,glTestFenceAPPLE,(GLuint a),(a)) +GL_FUNC_VOID(GL_APPLE_fence,false,glSetFenceAPPLE,(GLuint a),(a)) +GL_FUNC_VOID(GL_APPLE_fence,false,glFinishFenceAPPLE,(GLuint a),(a)) +GL_FUNC_VOID(GL_APPLE_fence,false,glDeleteFencesAPPLE,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(GL_APPLE_fence,false,glGenFencesAPPLE,(GLsizei a,GLuint *b),(a,b)) +GL_EXT(GL_NV_fence,-1,-1) +GL_FUNC(GL_NV_fence,false,GLboolean,glTestFenceNV,(GLuint a),(a)) +GL_FUNC_VOID(GL_NV_fence,false,glSetFenceNV,(GLuint a,GLenum b),(a,b)) +GL_FUNC_VOID(GL_NV_fence,false,glFinishFenceNV,(GLuint a),(a)) +GL_FUNC_VOID(GL_NV_fence,false,glDeleteFencesNV,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(GL_NV_fence,false,glGenFencesNV,(GLsizei a,GLuint *b),(a,b)) +GL_EXT(GL_ARB_sync,3,2) +#ifdef HAVE_GL_ARB_SYNC +GL_FUNC_VOID(GL_ARB_sync,false,glGetSynciv,(GLsync a, GLenum b, GLsizei c, GLsizei *d, GLint *e),(a,b,c,d,e)) +GL_FUNC(GL_ARB_sync,false,GLenum,glClientWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c)) +GL_FUNC_VOID(GL_ARB_sync,false,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c)) +GL_FUNC_VOID(GL_ARB_sync,false,glDeleteSync,(GLsync a),(a)) +GL_FUNC(GL_ARB_sync,false,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b)) +#endif +GL_EXT(GL_EXT_draw_buffers2,-1,-1) +GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glColorMaskIndexedEXT,(GLuint a,GLboolean b,GLboolean c,GLboolean d,GLboolean e),(a,b,c,d,e)) +GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glEnableIndexedEXT,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glDisableIndexedEXT,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glGetBooleanIndexedvEXT,(GLenum a,GLuint b,GLboolean *c),(a,b,c)) +GL_EXT(GL_EXT_bindable_uniform,-1,-1) +GL_FUNC_VOID(GL_EXT_bindable_uniform,false,glUniformBufferEXT,(GLuint a,GLint b,GLuint c),(a,b,c)) +GL_FUNC(GL_EXT_bindable_uniform,false,int,glGetUniformBufferSizeEXT,(GLenum a, GLenum b),(a,b)) +GL_FUNC(GL_EXT_bindable_uniform,false,GLintptr,glGetUniformOffsetEXT,(GLenum a, GLenum b),(a,b)) +GL_EXT(GL_APPLE_flush_buffer_range,-1,-1) +GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glBufferParameteriAPPLE,(GLenum a,GLenum b,GLint c),(a,b,c)) +GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glFlushMappedBufferRangeAPPLE,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c)) +GL_EXT(GL_ARB_map_buffer_range,-1,-1) +GL_FUNC(GL_ARB_map_buffer_range,false,void*,glMapBufferRange,(GLenum a,GLintptr b,GLsizeiptr c,GLbitfield d),(a,b,c,d)) +GL_FUNC_VOID(GL_ARB_map_buffer_range,false,glFlushMappedBufferRange,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c)) +GL_EXT(GL_ARB_vertex_buffer_object,-1,-1) +GL_FUNC_VOID(GL_ARB_vertex_buffer_object,true,glBufferSubData,(GLenum a,GLintptr b,GLsizeiptr c,const GLvoid *d),(a,b,c,d)) +GL_EXT(GL_ARB_occlusion_query,-1,-1) +GL_FUNC_VOID(GL_ARB_occlusion_query,false,glBeginQueryARB,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(GL_ARB_occlusion_query,false,glEndQueryARB,(GLenum a),(a)) +GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectivARB,(GLuint a,GLenum b,GLint *c),(a,b,c)) +GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectuivARB,(GLuint a,GLenum b,GLuint *c),(a,b,c)) +GL_EXT(GL_APPLE_texture_range,-1,-1) +GL_FUNC_VOID(GL_APPLE_texture_range,false,glTextureRangeAPPLE,(GLenum a,GLsizei b,void *c),(a,b,c)) +GL_FUNC_VOID(GL_APPLE_texture_range,false,glGetTexParameterPointervAPPLE,(GLenum a,GLenum b,void* *c),(a,b,c)) +GL_EXT(GL_APPLE_client_storage,-1,-1) +GL_EXT(GL_ARB_uniform_buffer,-1,-1) +GL_EXT(GL_ARB_vertex_array_bgra,-1,-1) +GL_EXT(GL_EXT_vertex_array_bgra,-1,-1) +GL_EXT(GL_ARB_framebuffer_object,3,0) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindFramebuffer,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindRenderbuffer,(GLenum a,GLuint b),(a,b)) +GL_FUNC(GL_ARB_framebuffer_object,false,GLenum,glCheckFramebufferStatus,(GLenum a),(a)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteRenderbuffers,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferRenderbuffer,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferTexture2D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferTexture3D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glGenFramebuffers,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glGenRenderbuffers,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteFramebuffers,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBlitFramebuffer,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j)) +GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glRenderbufferStorageMultisample,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e)) +GL_EXT(GL_GREMEDY_string_marker,-1,-1) +GL_FUNC_VOID(GL_GREMEDY_string_marker,false,glStringMarkerGREMEDY,(GLsizei a,const void *b),(a,b)) +GL_EXT(GL_ARB_debug_output,-1,-1) +#ifdef OSX +GL_FUNC_VOID(GL_ARB_debug_output,false,glDebugMessageCallbackARB,(void ( *a)(GLenum, GLenum , GLuint , GLenum , GLsizei , const GLchar* , GLvoid*) ,void* b),(a,b)) +#else +GL_FUNC_VOID(GL_ARB_debug_output,false,glDebugMessageCallbackARB,(void (APIENTRY *a)(GLenum, GLenum , GLuint , GLenum , GLsizei , const GLchar* , GLvoid*) ,void* b),(a,b)) +#endif +GL_FUNC_VOID(GL_ARB_debug_output,false,glDebugMessageControlARB,(GLenum a, GLenum b, GLenum c, GLsizei d, const GLuint* e, GLboolean f),(a,b,c,d,e,f)) + +GL_EXT(GL_EXT_direct_state_access,-1,-1) +GL_FUNC_VOID(GL_EXT_direct_state_access,false,glBindMultiTextureEXT,(GLenum a,GLuint b, GLuint c),(a,b,c)) +GL_EXT(GL_NV_bindless_texture,-1,-1) + +#ifndef OSX +GL_FUNC_VOID(OpenGL, true, glGenSamplers, (GLuint a, GLuint *b), (a, b)) +GL_FUNC_VOID(OpenGL, true, glDeleteSamplers, (GLsizei a, const GLuint *b), (a, b)) +GL_FUNC_VOID(OpenGL, true, glBindSampler, (GLuint a, GLuint b), (a, b)) +GL_FUNC_VOID(OpenGL, true, glSamplerParameteri, (GLuint a, GLenum b, GLint c), (a, b, c)) +GL_FUNC_VOID(OpenGL, true, glSamplerParameterf, (GLuint a, GLenum b, GLfloat c), (a, b, c)) +GL_FUNC_VOID(OpenGL, true, glSamplerParameterfv, (GLuint a, GLenum b, const GLfloat *c), (a, b, c)) +GL_FUNC(GL_NV_bindless_texture, false, GLuint64, glGetTextureHandleNV, (GLuint texture), (texture)) +GL_FUNC(GL_NV_bindless_texture, false, GLuint64, glGetTextureSamplerHandleNV, (GLuint texture, GLuint sampler), (texture, sampler)) +GL_FUNC_VOID(GL_NV_bindless_texture, false, glMakeTextureHandleResidentNV, (GLuint64 handle), (handle)) +GL_FUNC_VOID(GL_NV_bindless_texture, false, glMakeTextureHandleNonResidentNV, (GLuint64 handle), (handle)) +GL_FUNC_VOID(GL_NV_bindless_texture, false, glUniformHandleui64NV, (GLint location, GLuint64 value), (location, value)) +GL_FUNC_VOID(GL_NV_bindless_texture, false, glUniformHandleui64vNV, (int location, GLsizei count, const GLuint64 *value), (location count, value)) +GL_FUNC_VOID(GL_NV_bindless_texture, false, glProgramUniformHandleui64NV, (GLuint program, GLint location, GLuint64 value), (program, location, value)) +GL_FUNC_VOID(GL_NV_bindless_texture, false, glProgramUniformHandleui64vNV, (GLuint program, GLint location, GLsizei count, const GLuint64 *values), (program, location, count, values)) +GL_FUNC(GL_NV_bindless_texture, false, GLboolean, glIsTextureHandleResidentNV, (GLuint64 handle), (handle)) +GL_FUNC_VOID(OpenGL,true,glGenQueries,(GLsizei n, GLuint *ids), (n, ids)) +GL_FUNC_VOID(OpenGL,true,glDeleteQueries,(GLsizei n, const GLuint *ids),(n, ids)) +GL_FUNC_VOID(OpenGL,true,glBeginQuery,(GLenum target, GLuint id), (target, id)) +GL_FUNC_VOID(OpenGL,true,glEndQuery,(GLenum target), (target)) +GL_FUNC_VOID(OpenGL,true,glQueryCounter,(GLuint id, GLenum target), (id, target)) +GL_FUNC_VOID(OpenGL,true,glGetQueryObjectiv,(GLuint id, GLenum pname, GLint *params), (id, pname, params)) +GL_FUNC_VOID(OpenGL,true,glGetQueryObjectui64v,(GLuint id, GLenum pname, GLuint64 *params), (id, pname, params)) +GL_FUNC_VOID(OpenGL,true,glCopyBufferSubData,(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size),(readtarget, writetarget, readoffset, writeoffset, size)) +#endif // !OSX + +GL_EXT(GL_AMD_pinned_memory,-1,-1) +GL_EXT(GL_EXT_framebuffer_multisample_blit_scaled,-1,-1) + +#ifndef OSX +GL_FUNC_VOID(OpenGL,true,glGenVertexArrays,(GLsizei n, GLuint *arrays),(n, arrays)) +GL_FUNC_VOID(OpenGL,true,glDeleteVertexArrays,(GLsizei n, GLuint *arrays),(n, arrays)) +GL_FUNC_VOID(OpenGL,true,glBindVertexArray,(GLuint a),(a)) +#endif // !OSX + +GL_EXT(GL_EXT_texture_sRGB_decode,-1,-1) +GL_FUNC_VOID(OpenGL,true,glPushClientAttrib,(GLbitfield a),(a)) +GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),()) +GL_EXT(GL_NVX_gpu_memory_info,-1,-1) +GL_EXT(GL_ATI_meminfo,-1,-1) +GL_EXT(GL_EXT_texture_compression_s3tc,-1,-1) +GL_EXT(GL_EXT_texture_compression_dxt1,-1,-1) +GL_EXT(GL_ANGLE_texture_compression_dxt3,-1,-1) +GL_EXT(GL_ANGLE_texture_compression_dxt5,-1,-1) + +GL_EXT( GL_ARB_buffer_storage, 4, 4 ) +GL_FUNC_VOID( GL_ARB_buffer_storage, false, glBufferStorage, (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags), (target, size, data, flags) ) + +// This one is an OS extension. We'll add a little helper function to look for it. +#ifdef _WIN32 + GL_EXT(WGL_EXT_swap_control_tear,-1,-1) +#else + GL_EXT(GLX_EXT_swap_control_tear,-1,-1) +#endif diff --git a/public/togles/linuxwin/glmdebug.h b/public/togles/linuxwin/glmdebug.h new file mode 100644 index 00000000..08cb6f91 --- /dev/null +++ b/public/togles/linuxwin/glmdebug.h @@ -0,0 +1,181 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +#ifndef GLMDEBUG_H +#define GLMDEBUG_H + +#include "tier0/platform.h" +#if defined( OSX ) +#include +#endif + +// include this anywhere you need to be able to compile-out code related specifically to GLM debugging. + +// we expect DEBUG to be driven by the build system so you can include this header anywhere. +// when we come out, GLMDEBUG will be defined to a value - 0, 1, or 2 +// 0 means no GLM debugging is possible +// 1 means it's possible and resulted from being a debug build +// 2 means it's possible and resulted from being manually forced on for a release build + +#ifdef POSIX + #ifndef GLMDEBUG + #ifdef DEBUG + #define GLMDEBUG 1 // normally 1 here, testing + #else + // #define GLMDEBUG 2 // don't check this in enabled.. + #endif + + #ifndef GLMDEBUG + #define GLMDEBUG 0 + #endif + #endif +#else + #ifndef GLMDEBUG + #define GLMDEBUG 0 + #endif +#endif + + +//=============================================================================== +// debug channels + +enum EGLMDebugChannel +{ + ePrintf, + eDebugger, + eGLProfiler +}; + +#if GLMDEBUG + // make all these prototypes disappear in non GLMDEBUG + void GLMDebugInitialize( bool forceReinit=false ); + + bool GLMDetectOGLP( void ); + bool GLMDetectGDB( void ); + uint GLMDetectAvailableChannels( void ); + + uint GLMDebugChannelMask( uint *newValue = NULL ); + // note that GDB and OGLP can both come and go during run - forceCheck will allow that to be detected. + // mask returned is in form of 1< < + eComment, // 3 one off messages --- + eMatrixData, // 4 matrix data -M- + eShaderData, // 5 shader data (params) -S- + eFrameBufData, // 6 FBO data (attachments) -F- + eDXStuff, // 7 dxabstract spew -X- + eAllocations, // 8 tracking allocs and frees -A- + eSlowness, // 9 slow things happening (srgb flips..) -Z- + eDefaultFlavor, // not specified (no marker) + eFlavorCount +}; +uint GLMDebugFlavorMask( uint *newValue = NULL ); + +// make all these prototypes disappear in non GLMDEBUG +#if GLMDEBUG + // these are unconditional outputs, they don't interrogate the string + void GLMStringOut( const char *string ); + void GLMStringOutIndented( const char *string, int indentColumns ); + + #ifdef TOGL_DLL_EXPORT + // these will look at the string to guess its flavor: <, >, ---, -M-, -S- + DLL_EXPORT void GLMPrintfVA( const char *fmt, va_list vargs ); + DLL_EXPORT void GLMPrintf( const char *fmt, ... ); + #else + DLL_IMPORT void GLMPrintfVA( const char *fmt, va_list vargs ); + DLL_IMPORT void GLMPrintf( const char *fmt, ... ); + #endif + + // these take an explicit flavor with a default value + void GLMPrintStr( const char *str, EGLMDebugFlavor flavor = eDefaultFlavor ); + + #define GLMPRINTTEXT_NUMBEREDLINES 0x80000000 + void GLMPrintText( const char *str, EGLMDebugFlavor flavor = eDefaultFlavor, uint options=0 ); // indent each newline + + int GLMIncIndent( int indentDelta ); + int GLMGetIndent( void ); + void GLMSetIndent( int indent ); + +#endif + +// helpful macro if you are in a position to call GLM functions directly (i.e. you live in materialsystem / shaderapidx9) +#if GLMDEBUG + #define GLMPRINTF(args) GLMPrintf args + #define GLMPRINTSTR(args) GLMPrintStr args + #define GLMPRINTTEXT(args) GLMPrintText args +#else + #define GLMPRINTF(args) + #define GLMPRINTSTR(args) + #define GLMPRINTTEXT(args) +#endif + + +//=============================================================================== +// knob twiddling +#ifdef TOGL_DLL_EXPORT + DLL_EXPORT float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value + DLL_EXPORT float GLMKnobToggle( char *knobname ); +#else + DLL_IMPORT float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value + DLL_IMPORT float GLMKnobToggle( char *knobname ); +#endif + +//=============================================================================== +// other stuff + +#if GLMDEBUG +void GLMTriggerDebuggerBreak(); +inline void GLMDebugger( void ) +{ + if (GLMDebugChannelMask() & (1< +#include +#include +#include +#include +#endif + +#ifdef MAC_OS_X_VERSION_10_9 +typedef uint32_t CGDirectDisplayID; +typedef uint32_t CGOpenGLDisplayMask; +typedef double CGRefreshRate; +#endif + +typedef void _PseudoNSGLContext; // aka NSOpenGLContext +typedef _PseudoNSGLContext *PseudoNSGLContextPtr; + +struct GLMDisplayModeInfoFields +{ + uint m_modePixelWidth; + uint m_modePixelHeight; + uint m_modeRefreshHz; + // are we even going to talk about bit depth... not yet +}; + +struct GLMDisplayInfoFields +{ +#ifdef OSX + CGDirectDisplayID m_cgDisplayID; + CGOpenGLDisplayMask m_glDisplayMask; // result of CGDisplayIDToOpenGLDisplayMask on the cg_displayID. +#endif + uint m_displayPixelWidth; + uint m_displayPixelHeight; +}; + +struct GLMRendererInfoFields +{ + /*properties of interest and their desired values. + + kCGLRPFullScreen = 54, true + kCGLRPAccelerated = 73, true + kCGLRPWindow = 80, true + + kCGLRPRendererID = 70, informational + kCGLRPDisplayMask = 84, informational + kCGLRPBufferModes = 100, informational + kCGLRPColorModes = 103, informational + kCGLRPAccumModes = 104, informational + kCGLRPDepthModes = 105, informational + kCGLRPStencilModes = 106, informational + kCGLRPMaxAuxBuffers = 107, informational + kCGLRPMaxSampleBuffers = 108, informational + kCGLRPMaxSamples = 109, informational + kCGLRPSampleModes = 110, informational + kCGLRPSampleAlpha = 111, informational + kCGLRPVideoMemory = 120, informational + kCGLRPTextureMemory = 121, informational + kCGLRPRendererCount = 128 number of renderers in the CGLRendererInfoObj under examination + + kCGLRPOffScreen = 53, D/C + kCGLRPRobust = 75, FALSE or D/C - aka we're asking for no-fallback + kCGLRPBackingStore = 76, D/C + kCGLRPMPSafe = 78, D/C + kCGLRPMultiScreen = 81, D/C + kCGLRPCompliant = 83, D/C + */ + + + //--------------------------- info we have from CGL renderer queries, IOKit, Gestalt + //--------------------------- these are set up in the displayDB by CocoaMgr + GLint m_fullscreen; + GLint m_accelerated; + GLint m_windowed; + + GLint m_rendererID; + GLint m_displayMask; + GLint m_bufferModes; + GLint m_colorModes; + GLint m_accumModes; + GLint m_depthModes; + GLint m_stencilModes; + + GLint m_maxAuxBuffers; + GLint m_maxSampleBuffers; + GLint m_maxSamples; + GLint m_sampleModes; + GLint m_sampleAlpha; + + GLint m_vidMemory; + GLint m_texMemory; + + uint m_pciVendorID; + uint m_pciDeviceID; + char m_pciModelString[64]; + char m_driverInfoString[64]; + + //--------------------------- OS version related - set up by CocoaMgr + + // OS version found + uint m_osComboVersion; // 0x00XXYYZZ : XX major, YY minor, ZZ minor minor : 10.6.3 --> 0x000A0603. 10.5.8 --> 0x000A0508. + + //--------------------------- shorthands - also set up by CocoaMgr - driven by vendorid / deviceid + + bool m_ati; + bool m_atiR5xx; + bool m_atiR6xx; + bool m_atiR7xx; + bool m_atiR8xx; + bool m_atiNewer; + + bool m_intel; + bool m_intel95x; + bool m_intel3100; + bool m_intelHD4000; + + bool m_nv; + bool m_nvG7x; + bool m_nvG8x; + bool m_nvNewer; + + //--------------------------- context query results - left blank in the display DB - but valid in a GLMContext (call ctx->Caps() to get a const ref) + + // booleans + bool m_hasGammaWrites; // aka glGetBooleanv(GL_FRAMEBUFFER_SRGB_CAPABLE_EXT) / glEnable(GL_FRAMEBUFFER_SRGB_EXT) + bool m_hasMixedAttachmentSizes; // aka ARB_fbo in 10.6.3 - test for min OS vers, then exported ext string + bool m_hasBGRA; // aka GL_BGRA vertex attribs in 10.6.3 - - test for min OS vers, then exported ext string + bool m_hasNewFullscreenMode; // aka 10.6.x "big window" fullscreen mode + bool m_hasNativeClipVertexMode; // aka GLSL gl_ClipVertex does not fall back to SW- OS version and folklore-based + bool m_hasOcclusionQuery; // occlusion query: do you speak it ?! + bool m_hasFramebufferBlit; // framebuffer blit: know what I'm sayin?! + bool m_hasPerfPackage1; // means new MTGL, fast OQ, fast uniform upload, NV can resolve flipped (late summer 2010 post 10.6.4 update) + + // counts + int m_maxAniso; // aniso limit - context query + + // other exts + bool m_hasBindableUniforms; + int m_maxVertexBindableUniforms; + int m_maxFragmentBindableUniforms; + int m_maxBindableUniformSize; + + bool m_hasUniformBuffers; + + // runtime options that aren't negotiable once set + bool m_hasDualShaders; // must supply CLI arg "-glmdualshaders" or we go GLSL only + + //--------------------------- " can'ts " - specific problems that need to be worked around + + bool m_cantBlitReliably; // Intel chipsets have problems blitting sRGB sometimes + bool m_cantAttachSRGB; // NV G8x on 10.5.8 can't have srgb tex on FBO color - separate issue from hasGammaWrites + bool m_cantResolveFlipped; // happens on NV in 10.6.4 and prior - console variable "gl_can_resolve_flipped" can overrule + bool m_cantResolveScaled; // happens everywhere per GL spec but may be relaxed some day - console variable "gl_can_resolve_scaled" can overrule + bool m_costlyGammaFlips; // this means that sRGB sampling state affects shader code gen, resulting in state-dependent code regen + + + //--------------------------- " bads " - known bad drivers + bool m_badDriver1064NV; // this is the bad NVIDIA driver on 10.6.4 - stutter, tex corruption, black screen issues + bool m_badDriver108Intel; // this is the bad Intel HD4000 driver on 10.8 - intermittent crash on GLSL compilation. +}; + + + +#endif diff --git a/public/togles/linuxwin/glmdisplaydb.h b/public/togles/linuxwin/glmdisplaydb.h new file mode 100644 index 00000000..2c21b9a5 --- /dev/null +++ b/public/togles/linuxwin/glmdisplaydb.h @@ -0,0 +1,157 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +#ifndef GLMDISPLAYDB_H +#define GLMDISPLAYDB_H + +#include "tier1/utlvector.h" + +//=============================================================================== +// modes, displays, and renderers +//=============================================================================== + +// GLMDisplayModeInfoFields is in glmdisplay.h + +class GLMDisplayMode +{ +public: + GLMDisplayModeInfoFields m_info; + + GLMDisplayMode( uint width, uint height, uint refreshHz ); + GLMDisplayMode() { }; + ~GLMDisplayMode( void ); + + void Init( uint width, uint height, uint refreshHz ); + void Dump( int which ); +}; + +//=============================================================================== + +// GLMDisplayInfoFields is in glmdisplay.h + +class GLMDisplayInfo +{ +public: + GLMDisplayInfoFields m_info; + CUtlVector< GLMDisplayMode* > *m_modes; // starts out NULL, set by PopulateModes + GLMDisplayMode m_DesktopMode; + +#ifdef OSX + GLMDisplayInfo( CGDirectDisplayID displayID, CGOpenGLDisplayMask displayMask ); +#else + GLMDisplayInfo( void ); +#endif + + ~GLMDisplayInfo( void ); + + void PopulateModes( void ); + + void Dump( int which ); + +#ifdef OSX +private: + int m_display; +#endif +}; + +//=============================================================================== + +// GLMRendererInfoFields is in glmdisplay.h + +class GLMRendererInfo +{ +public: + GLMRendererInfoFields m_info; +#ifdef OSX + CUtlVector< GLMDisplayInfo* > *m_displays; // starts out NULL, set by PopulateDisplays +#else + GLMDisplayInfo *m_display; +#endif + +#ifdef OSX + GLMRendererInfo ( GLMRendererInfoFields *info ); +#else + GLMRendererInfo (); +#endif + ~GLMRendererInfo ( void ); + +#ifndef OSX + void Init( GLMRendererInfoFields *info ); +#endif + void PopulateDisplays(); + void Dump( int which ); +}; + +//=============================================================================== + +#ifdef OSX +// this is just a tuple describing fake adapters which are really renderer/display pairings. +// dxabstract bridges the gap between the d3d adapter-centric world and the GL renderer+display world. +// this makes it straightforward to handle cases like two video cards with two displays on one, and one on the other - +// you get three fake adapters which represent each useful screen. + +// the constraint that dxa will have to follow though, is that if the user wants to change their +// display selection for full screen, they would only be able to pick on that has the same underlying renderer. +// can't change fakeAdapter from one to another with different GL renderer under it. Screen hop but no card hop. + +struct GLMFakeAdapter +{ + int m_rendererIndex; + int m_displayIndex; +}; +#endif + +class GLMDisplayDB +{ +public: +#ifdef OSX + CUtlVector< GLMRendererInfo* > *m_renderers; // starts out NULL, set by PopulateRenderers + CUtlVector< GLMFakeAdapter > m_fakeAdapters; +#else + GLMRendererInfo m_renderer; +#endif + + GLMDisplayDB ( void ); + ~GLMDisplayDB ( void ); + + virtual void PopulateRenderers( void ); + virtual void PopulateFakeAdapters( uint realRendererIndex ); // fake adapters = one real adapter times however many displays are on it + virtual void Populate( void ); + + // The info-get functions return false on success. + virtual int GetFakeAdapterCount( void ); + virtual bool GetFakeAdapterInfo( int fakeAdapterIndex, int *rendererOut, int *displayOut, GLMRendererInfoFields *rendererInfoOut, GLMDisplayInfoFields *displayInfoOut ); + + virtual int GetRendererCount( void ); + virtual bool GetRendererInfo( int rendererIndex, GLMRendererInfoFields *infoOut ); + + virtual int GetDisplayCount( int rendererIndex ); + virtual bool GetDisplayInfo( int rendererIndex, int displayIndex, GLMDisplayInfoFields *infoOut ); + + virtual int GetModeCount( int rendererIndex, int displayIndex ); + virtual bool GetModeInfo( int rendererIndex, int displayIndex, int modeIndex, GLMDisplayModeInfoFields *infoOut ); + + virtual void Dump( void ); +}; + +#endif // GLMDISPLAYDB_H diff --git a/public/togles/linuxwin/glmgr.h b/public/togles/linuxwin/glmgr.h new file mode 100644 index 00000000..7e76a682 --- /dev/null +++ b/public/togles/linuxwin/glmgr.h @@ -0,0 +1,2435 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glmgr.h +// singleton class, common basis for managing GL contexts +// responsible for tracking adapters and contexts +// +//=============================================================================== + +#ifndef GLMGR_H +#define GLMGR_H + +#pragma once + +#undef HAVE_GL_ARB_SYNC +#ifndef OSX +#define HAVE_GL_ARB_SYNC 1 +#endif + +#include "glbase.h" +#include "glentrypoints.h" +#include "glmdebug.h" +#include "glmdisplay.h" +#include "glmgrext.h" +#include "glmgrbasics.h" +#include "cglmtex.h" +#include "cglmfbo.h" +#include "cglmprogram.h" +#include "cglmbuffer.h" +#include "cglmquery.h" + +#include "tier0/tslist.h" +#include "tier0/vprof_telemetry.h" +#include "materialsystem/IShader.h" +#include "dxabstract_types.h" +#include "tier0/icommandline.h" + +#undef FORCEINLINE +#define FORCEINLINE inline + +//=============================================================================== + +#define GLM_OPENGL_VENDOR_ID 1 +#define GLM_OPENGL_DEFAULT_DEVICE_ID 1 +#define GLM_OPENGL_LOW_PERF_DEVICE_ID 2 + +extern void GLMDebugPrintf( const char *pMsg, ... ); + +extern uint g_nTotalDrawsOrClears, g_nTotalVBLockBytes, g_nTotalIBLockBytes; + +#if GL_TELEMETRY_GPU_ZONES +struct TelemetryGPUStats_t +{ + uint m_nTotalBufferLocksAndUnlocks; + uint m_nTotalTexLocksAndUnlocks; + uint m_nTotalBlit2; + uint m_nTotalResolveTex; + uint m_nTotalPresent; + + inline void Clear() { memset( this, 0, sizeof( *this ) ); } + inline uint GetTotal() const { return m_nTotalBufferLocksAndUnlocks + m_nTotalTexLocksAndUnlocks + m_nTotalBlit2 + m_nTotalResolveTex + m_nTotalPresent; } +}; +extern TelemetryGPUStats_t g_TelemetryGPUStats; +#endif + +struct GLMRect; +typedef void *PseudoGLContextPtr; + +// parrot the D3D present parameters, more or less... "adapter" translates into "active display index" per the m_activeDisplayCount below. +class GLMDisplayParams +{ + public: + + // presumption, these indices are in sync with the current display DB that GLMgr has handy + //int m_rendererIndex; // index of renderer (-1 if root context) + //int m_displayIndex; // index of display in renderer - for FS + //int m_modeIndex; // index of mode in display - for FS + + void *m_focusWindow; // (VD3DHWND aka WindowRef) - what window does this context display into + + bool m_fsEnable; // fullscreen on or not + bool m_vsyncEnable; // vsync on or not + + // height and width have to match the display mode info if full screen. + + uint m_backBufferWidth; // pixel width (aka screen h-resolution if full screen) + uint m_backBufferHeight; // pixel height (aka screen v-resolution if full screen) + D3DFORMAT m_backBufferFormat; // pixel format + uint m_multiSampleCount; // 0 means no MSAA, 2 means 2x MSAA, etc + // uint m_multiSampleQuality; // no MSAA quality control yet + + bool m_enableAutoDepthStencil; // generally set to 'TRUE' per CShaderDeviceDx8::SetPresentParameters + D3DFORMAT m_autoDepthStencilFormat; + + uint m_fsRefreshHz; // if full screen, this refresh rate (likely 0 for LCD's) + + //uint m_rootRendererID; // only used if m_rendererIndex is -1. + //uint m_rootDisplayMask; // only used if m_rendererIndex is -1. + + bool m_mtgl; // enable multi threaded GL driver +}; + +//=============================================================================== + +class GLMgr +{ +public: + + //=========================================================================== + // class methods - singleton + static void NewGLMgr( void ); // instantiate singleton.. + static GLMgr *aGLMgr( void ); // return singleton.. + static void DelGLMgr( void ); // tear down singleton.. + + //=========================================================================== + // plain methods + + #if 0 // turned all these off while new approach is coded + void RefreshDisplayDB( void ); // blow away old display DB, make a new one + GLMDisplayDB *GetDisplayDB( void ); // get a ptr to the one GLMgr keeps. only valid til next refresh. + + // eligible renderers will be ranked by desirability starting at index 0 within the db + // within each renderer, eligible displays will be ranked some kind of desirability (area? dist from menu bar?) + // within each display, eligible modes will be ranked by descending areas + + // calls supplying indices are implicitly making reference to the current DB + bool CaptureDisplay( int rendIndex, int displayIndex, bool captureAll ); // capture one display or all displays + void ReleaseDisplays( void ); // release all captures + + int GetDisplayMode( int rendIndex, int displayIndex ); // retrieve current display res (returns modeIndex) + void SetDisplayMode( GLMDisplayParams *params ); // set the display res (only useful for FS) + #endif + + GLMContext *NewContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ); // this will have to change + void DelContext( GLMContext *context ); + + // with usage of CGLMacro.h we could dispense with the "current context" thing + // and just declare a member variable of GLMContext, allowing each glXXX call to be routed directly + // to the correct context + void SetCurrentContext( GLMContext *context ); // make current in calling thread only + GLMContext *GetCurrentContext( void ); + +protected: + friend class GLMContext; + + GLMgr(); + ~GLMgr(); +}; + + +//===========================================================================// + +// helper function to do enable or disable in one step +FORCEINLINE void glSetEnable( GLenum which, bool enable ) +{ + if (enable) + gGL->glEnable(which); + else + gGL->glDisable(which); +} + +// helper function for int vs enum clarity +FORCEINLINE void glGetEnumv( GLenum which, GLenum *dst ) +{ + gGL->glGetIntegerv( which, (int*)dst ); +} + +//===========================================================================// +// +// types to support the GLMContext +// +//===========================================================================// + +// Each state set/get path we are providing caching for, needs its own struct and a comparison operator. +// we also provide an enum of how many such types there are, handy for building dirty masks etc. + +// shorthand macros +#define EQ(fff) ( (src.fff) == (fff) ) + +//rasterizer +struct GLAlphaTestEnable_t { GLint enable; inline bool operator==(const GLAlphaTestEnable_t& src) const { return EQ(enable); } }; +struct GLAlphaTestFunc_t { GLenum func; GLclampf ref; inline bool operator==(const GLAlphaTestFunc_t& src) const { return EQ(func) && EQ(ref); } }; +struct GLCullFaceEnable_t { GLint enable; inline bool operator==(const GLCullFaceEnable_t& src) const { return EQ(enable); } }; +struct GLCullFrontFace_t { GLenum value; inline bool operator==(const GLCullFrontFace_t& src) const { return EQ(value); } }; +struct GLPolygonMode_t { GLenum values[2]; inline bool operator==(const GLPolygonMode_t& src) const { return EQ(values[0]) && EQ(values[1]); } }; +struct GLDepthBias_t { GLfloat factor; GLfloat units; inline bool operator==(const GLDepthBias_t& src) const { return EQ(factor) && EQ(units); } }; +struct GLScissorEnable_t { GLint enable; inline bool operator==(const GLScissorEnable_t& src) const { return EQ(enable); } }; +struct GLScissorBox_t { GLint x,y; GLsizei width, height; inline bool operator==(const GLScissorBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } }; +struct GLAlphaToCoverageEnable_t{ GLint enable; inline bool operator==(const GLAlphaToCoverageEnable_t& src) const { return EQ(enable); } }; +struct GLViewportBox_t { GLint x,y; GLsizei width, height; uint widthheight; inline bool operator==(const GLViewportBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } }; +struct GLViewportDepthRange_t { GLdouble flNear,flFar; inline bool operator==(const GLViewportDepthRange_t& src) const { return EQ(flNear) && EQ(flFar); } }; +struct GLClipPlaneEnable_t { GLint enable; inline bool operator==(const GLClipPlaneEnable_t& src) const { return EQ(enable); } }; +struct GLClipPlaneEquation_t { GLfloat x,y,z,w; inline bool operator==(const GLClipPlaneEquation_t& src) const { return EQ(x) && EQ(y) && EQ(z) && EQ(w); } }; + +//blend +struct GLColorMaskSingle_t { signed char r,g,b,a; inline bool operator==(const GLColorMaskSingle_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } }; +struct GLColorMaskMultiple_t { signed char r,g,b,a; inline bool operator==(const GLColorMaskMultiple_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } }; +struct GLBlendEnable_t { GLint enable; inline bool operator==(const GLBlendEnable_t& src) const { return EQ(enable); } }; +struct GLBlendFactor_t { GLenum srcfactor,dstfactor; inline bool operator==(const GLBlendFactor_t& src) const { return EQ(srcfactor) && EQ(dstfactor); } }; +struct GLBlendEquation_t { GLenum equation; inline bool operator==(const GLBlendEquation_t& src) const { return EQ(equation); } }; +struct GLBlendColor_t { GLfloat r,g,b,a; inline bool operator==(const GLBlendColor_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } }; +struct GLBlendEnableSRGB_t { GLint enable; inline bool operator==(const GLBlendEnableSRGB_t& src) const { return EQ(enable); } }; + +//depth +struct GLDepthTestEnable_t { GLint enable; inline bool operator==(const GLDepthTestEnable_t& src) const { return EQ(enable); } }; +struct GLDepthFunc_t { GLenum func; inline bool operator==(const GLDepthFunc_t& src) const { return EQ(func); } }; +struct GLDepthMask_t { char mask; inline bool operator==(const GLDepthMask_t& src) const { return EQ(mask); } }; + +//stencil +struct GLStencilTestEnable_t { GLint enable; inline bool operator==(const GLStencilTestEnable_t& src) const { return EQ(enable); } }; +struct GLStencilFunc_t { GLenum frontfunc, backfunc; GLint ref; GLuint mask; inline bool operator==(const GLStencilFunc_t& src) const { return EQ(frontfunc) && EQ(backfunc) && EQ(ref) && EQ(mask); } }; +struct GLStencilOp_t { GLenum sfail; GLenum dpfail; GLenum dppass; inline bool operator==(const GLStencilOp_t& src) const { return EQ(sfail) && EQ(dpfail) && EQ(dppass); } }; +struct GLStencilWriteMask_t { GLint mask; inline bool operator==(const GLStencilWriteMask_t& src) const { return EQ(mask); } }; + +//clearing +struct GLClearColor_t { GLfloat r,g,b,a; inline bool operator==(const GLClearColor_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } }; +struct GLClearDepth_t { GLdouble d; inline bool operator==(const GLClearDepth_t& src) const { return EQ(d); } }; +struct GLClearStencil_t { GLint s; inline bool operator==(const GLClearStencil_t& src) const { return EQ(s); } }; + +#undef EQ + +enum EGLMStateBlockType +{ + kGLAlphaTestEnable, + kGLAlphaTestFunc, + + kGLCullFaceEnable, + kGLCullFrontFace, + + kGLPolygonMode, + + kGLDepthBias, + + kGLScissorEnable, + kGLScissorBox, + + kGLViewportBox, + kGLViewportDepthRange, + + kGLClipPlaneEnable, + kGLClipPlaneEquation, + + kGLColorMaskSingle, + kGLColorMaskMultiple, + + kGLBlendEnable, + kGLBlendFactor, + kGLBlendEquation, + kGLBlendColor, + kGLBlendEnableSRGB, + + kGLDepthTestEnable, + kGLDepthFunc, + kGLDepthMask, + + kGLStencilTestEnable, + kGLStencilFunc, + kGLStencilOp, + kGLStencilWriteMask, + + kGLClearColor, + kGLClearDepth, + kGLClearStencil, + + kGLAlphaToCoverageEnable, + + kGLMStateBlockLimit +}; + +//===========================================================================// + +// templated functions representing GL R/W bottlenecks +// one set of set/get/getdefault is instantiated for each of the GL*** types above. + +// use these from the non array state objects +template void GLContextSet( T *src ); +template void GLContextGet( T *dst ); +template void GLContextGetDefault( T *dst ); + +// use these from the array state objects +template void GLContextSetIndexed( T *src, int index ); +template void GLContextGetIndexed( T *dst, int index ); +template void GLContextGetDefaultIndexed( T *dst, int index ); + +//=============================================================================== +// template specializations for each type of state + +// --- GLAlphaTestEnable --- +FORCEINLINE void GLContextSet( GLAlphaTestEnable_t *src ) +{ + glSetEnable( GL_ALPHA_TEST, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLAlphaTestEnable_t *dst ) +{ + dst->enable = gGL->glIsEnabled( GL_ALPHA_TEST ); +} + +FORCEINLINE void GLContextGetDefault( GLAlphaTestEnable_t *dst ) +{ + dst->enable = GL_FALSE; +} + +// --- GLAlphaTestFunc --- +FORCEINLINE void GLContextSet( GLAlphaTestFunc_t *src ) +{ + gGL->glAlphaFunc( src->func, src->ref ); +} + +FORCEINLINE void GLContextGet( GLAlphaTestFunc_t *dst ) +{ + glGetEnumv( GL_ALPHA_TEST_FUNC, &dst->func ); + gGL->glGetFloatv( GL_ALPHA_TEST_REF, &dst->ref ); +} + +FORCEINLINE void GLContextGetDefault( GLAlphaTestFunc_t *dst ) +{ + dst->func = GL_ALWAYS; + dst->ref = 0.0f; +} + +// --- GLAlphaToCoverageEnable --- +FORCEINLINE void GLContextSet( GLAlphaToCoverageEnable_t *src ) +{ + glSetEnable( GL_SAMPLE_ALPHA_TO_COVERAGE_ARB, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLAlphaToCoverageEnable_t *dst ) +{ + dst->enable = gGL->glIsEnabled( GL_SAMPLE_ALPHA_TO_COVERAGE_ARB ); +} + +FORCEINLINE void GLContextGetDefault( GLAlphaToCoverageEnable_t *dst ) +{ + dst->enable = GL_FALSE; +} + +// --- GLCullFaceEnable --- +FORCEINLINE void GLContextSet( GLCullFaceEnable_t *src ) +{ + glSetEnable( GL_CULL_FACE, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLCullFaceEnable_t *dst ) +{ + dst->enable = gGL->glIsEnabled( GL_CULL_FACE ); +} + +FORCEINLINE void GLContextGetDefault( GLCullFaceEnable_t *dst ) +{ + dst->enable = GL_TRUE; +} + + +// --- GLCullFrontFace --- +FORCEINLINE void GLContextSet( GLCullFrontFace_t *src ) +{ + gGL->glFrontFace( src->value ); // legal values are GL_CW or GL_CCW +} + +FORCEINLINE void GLContextGet( GLCullFrontFace_t *dst ) +{ + glGetEnumv( GL_FRONT_FACE, &dst->value ); +} + +FORCEINLINE void GLContextGetDefault( GLCullFrontFace_t *dst ) +{ + dst->value = GL_CCW; +} + + +// --- GLPolygonMode --- +FORCEINLINE void GLContextSet( GLPolygonMode_t *src ) +{ + gGL->glPolygonMode( GL_FRONT, src->values[0] ); + gGL->glPolygonMode( GL_BACK, src->values[1] ); +} + +FORCEINLINE void GLContextGet( GLPolygonMode_t *dst ) +{ + glGetEnumv( GL_POLYGON_MODE, &dst->values[0] ); + +} + +FORCEINLINE void GLContextGetDefault( GLPolygonMode_t *dst ) +{ + dst->values[0] = dst->values[1] = GL_FILL; +} + + +// --- GLDepthBias --- +// note the implicit enable / disable. +// if you set non zero values, it is enabled, otherwise not. +FORCEINLINE void GLContextSet( GLDepthBias_t *src ) +{ + bool enable = (src->factor != 0.0f) || (src->units != 0.0f); + + glSetEnable( GL_POLYGON_OFFSET_FILL, enable ); + gGL->glPolygonOffset( src->factor, src->units ); +} + +FORCEINLINE void GLContextGet( GLDepthBias_t *dst ) +{ + gGL->glGetFloatv ( GL_POLYGON_OFFSET_FACTOR, &dst->factor ); + gGL->glGetFloatv ( GL_POLYGON_OFFSET_UNITS, &dst->units ); +} + +FORCEINLINE void GLContextGetDefault( GLDepthBias_t *dst ) +{ + dst->factor = 0.0; + dst->units = 0.0; +} + + +// --- GLScissorEnable --- +FORCEINLINE void GLContextSet( GLScissorEnable_t *src ) +{ + glSetEnable( GL_SCISSOR_TEST, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLScissorEnable_t *dst ) +{ + dst->enable = gGL->glIsEnabled( GL_SCISSOR_TEST ); +} + +FORCEINLINE void GLContextGetDefault( GLScissorEnable_t *dst ) +{ + dst->enable = GL_FALSE; +} + + +// --- GLScissorBox --- +FORCEINLINE void GLContextSet( GLScissorBox_t *src ) +{ + gGL->glScissor ( src->x, src->y, src->width, src->height ); +} + +FORCEINLINE void GLContextGet( GLScissorBox_t *dst ) +{ + gGL->glGetIntegerv ( GL_SCISSOR_BOX, &dst->x ); +} + +FORCEINLINE void GLContextGetDefault( GLScissorBox_t *dst ) +{ + // hmmmm, good question? we can't really know a good answer so we pick a silly one + // and the client better come back with a better answer later. + dst->x = dst->y = 0; + dst->width = dst->height = 16; +} + + +// --- GLViewportBox --- + +FORCEINLINE void GLContextSet( GLViewportBox_t *src ) +{ + Assert( src->width == (int)( src->widthheight & 0xFFFF ) ); + Assert( src->height == (int)( src->widthheight >> 16 ) ); + gGL->glViewport (src->x, src->y, src->width, src->height ); +} + +FORCEINLINE void GLContextGet( GLViewportBox_t *dst ) +{ + gGL->glGetIntegerv ( GL_VIEWPORT, &dst->x ); + dst->widthheight = dst->width | ( dst->height << 16 ); +} + +FORCEINLINE void GLContextGetDefault( GLViewportBox_t *dst ) +{ + // as with the scissor box, we don't know yet, so pick a silly one and change it later + dst->x = dst->y = 0; + dst->width = dst->height = 16; + dst->widthheight = dst->width | ( dst->height << 16 ); +} + + +// --- GLViewportDepthRange --- +FORCEINLINE void GLContextSet( GLViewportDepthRange_t *src ) +{ + gGL->glDepthRange ( src->flNear, src->flFar ); +} + +FORCEINLINE void GLContextGet( GLViewportDepthRange_t *dst ) +{ + gGL->glGetDoublev ( GL_DEPTH_RANGE, &dst->flNear ); +} + +FORCEINLINE void GLContextGetDefault( GLViewportDepthRange_t *dst ) +{ + dst->flNear = 0.0; + dst->flFar = 1.0; +} + +// --- GLClipPlaneEnable --- +FORCEINLINE void GLContextSetIndexed( GLClipPlaneEnable_t *src, int index ) +{ +#if GLMDEBUG + if (CommandLine()->FindParm("-caps_noclipplanes")) + { + if (GLMKnob("caps-key",NULL) > 0.0) + { + // caps ON means NO clipping + src->enable = false; + } + } +#endif + glSetEnable( GL_CLIP_PLANE0 + index, src->enable != 0 ); +} + +FORCEINLINE void GLContextGetIndexed( GLClipPlaneEnable_t *dst, int index ) +{ + dst->enable = gGL->glIsEnabled( GL_CLIP_PLANE0 + index ); +} + +FORCEINLINE void GLContextGetDefaultIndexed( GLClipPlaneEnable_t *dst, int index ) +{ + dst->enable = 0; +} + + + +// --- GLClipPlaneEquation --- +FORCEINLINE void GLContextSetIndexed( GLClipPlaneEquation_t *src, int index ) +{ + // shove into glGlipPlane + GLdouble coeffs[4] = { src->x, src->y, src->z, src->w }; + + gGL->glClipPlane( GL_CLIP_PLANE0 + index, coeffs ); +} + +FORCEINLINE void GLContextGetIndexed( GLClipPlaneEquation_t *dst, int index ) +{ + DebuggerBreak(); // do this later + // glClipPlane( GL_CLIP_PLANE0 + index, coeffs ); + // GLdouble coeffs[4] = { src->x, src->y, src->z, src->w }; +} + +FORCEINLINE void GLContextGetDefaultIndexed( GLClipPlaneEquation_t *dst, int index ) +{ + dst->x = 1.0; + dst->y = 0.0; + dst->z = 0.0; + dst->w = 0.0; +} + + +// --- GLColorMaskSingle --- +FORCEINLINE void GLContextSet( GLColorMaskSingle_t *src ) +{ + gGL->glColorMask( src->r, src->g, src->b, src->a ); +} + +FORCEINLINE void GLContextGet( GLColorMaskSingle_t *dst ) +{ + gGL->glGetBooleanv( GL_COLOR_WRITEMASK, (GLboolean*)&dst->r); +} + +FORCEINLINE void GLContextGetDefault( GLColorMaskSingle_t *dst ) +{ + dst->r = dst->g = dst->b = dst->a = 1; +} + + +// --- GLColorMaskMultiple --- +FORCEINLINE void GLContextSetIndexed( GLColorMaskMultiple_t *src, int index ) +{ + gGL->glColorMaskIndexedEXT ( index, src->r, src->g, src->b, src->a ); +} + +FORCEINLINE void GLContextGetIndexed( GLColorMaskMultiple_t *dst, int index ) +{ + gGL->glGetBooleanIndexedvEXT ( GL_COLOR_WRITEMASK, index, (GLboolean*)&dst->r ); +} + +FORCEINLINE void GLContextGetDefaultIndexed( GLColorMaskMultiple_t *dst, int index ) +{ + dst->r = dst->g = dst->b = dst->a = 1; +} + + +// --- GLBlendEnable --- +FORCEINLINE void GLContextSet( GLBlendEnable_t *src ) +{ + glSetEnable( GL_BLEND, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLBlendEnable_t *dst ) +{ + dst->enable = gGL->glIsEnabled( GL_BLEND ); +} + +FORCEINLINE void GLContextGetDefault( GLBlendEnable_t *dst ) +{ + dst->enable = GL_FALSE; +} + + +// --- GLBlendFactor --- +FORCEINLINE void GLContextSet( GLBlendFactor_t *src ) +{ + gGL->glBlendFunc ( src->srcfactor, src->dstfactor ); +} + +FORCEINLINE void GLContextGet( GLBlendFactor_t *dst ) +{ + glGetEnumv ( GL_BLEND_SRC, &dst->srcfactor ); + glGetEnumv ( GL_BLEND_DST, &dst->dstfactor ); +} + +FORCEINLINE void GLContextGetDefault( GLBlendFactor_t *dst ) +{ + dst->srcfactor = GL_ONE; + dst->dstfactor = GL_ZERO; +} + + +// --- GLBlendEquation --- +FORCEINLINE void GLContextSet( GLBlendEquation_t *src ) +{ + gGL->glBlendEquation ( src->equation ); +} + +FORCEINLINE void GLContextGet( GLBlendEquation_t *dst ) +{ + glGetEnumv ( GL_BLEND_EQUATION, &dst->equation ); +} + +FORCEINLINE void GLContextGetDefault( GLBlendEquation_t *dst ) +{ + dst->equation = GL_FUNC_ADD; +} + + +// --- GLBlendColor --- +FORCEINLINE void GLContextSet( GLBlendColor_t *src ) +{ + gGL->glBlendColor ( src->r, src->g, src->b, src->a ); +} + +FORCEINLINE void GLContextGet( GLBlendColor_t *dst ) +{ + gGL->glGetFloatv ( GL_BLEND_COLOR, &dst->r ); +} + +FORCEINLINE void GLContextGetDefault( GLBlendColor_t *dst ) +{ + //solid white + dst->r = dst->g = dst->b = dst->a = 1.0; +} + + +// --- GLBlendEnableSRGB --- + +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_COLOR_ATTACHMENT0 0x8CE0 + +FORCEINLINE void GLContextSet( GLBlendEnableSRGB_t *src ) +{ +#if GLMDEBUG + // just check in debug... this is too expensive to look at on MTGL + if (src->enable) + { + GLboolean srgb_capable = false; + gGL->glGetBooleanv( GL_FRAMEBUFFER_SRGB_CAPABLE_EXT, &srgb_capable); + + if (src->enable && !srgb_capable) + { + GLMPRINTF(("-Z- srgb-state-set FBO conflict: attempt to enable SRGB on non SRGB capable FBO config")); + } + } +#endif + // this query is not useful unless you have the ARB_framebuffer_srgb ext. + //GLint encoding = 0; + //pfnglGetFramebufferAttachmentParameteriv( GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &encoding ); + + glSetEnable( GL_FRAMEBUFFER_SRGB_EXT, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLBlendEnableSRGB_t *dst ) +{ + //dst->enable = glIsEnabled( GL_FRAMEBUFFER_SRGB_EXT ); + dst->enable = true; // wtf ? +} + +FORCEINLINE void GLContextGetDefault( GLBlendEnableSRGB_t *dst ) +{ + dst->enable = GL_FALSE; +} + + +// --- GLDepthTestEnable --- +FORCEINLINE void GLContextSet( GLDepthTestEnable_t *src ) +{ + glSetEnable( GL_DEPTH_TEST, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLDepthTestEnable_t *dst ) +{ + dst->enable = gGL->glIsEnabled( GL_DEPTH_TEST ); +} + +FORCEINLINE void GLContextGetDefault( GLDepthTestEnable_t *dst ) +{ + dst->enable = GL_FALSE; +} + + +// --- GLDepthFunc --- +FORCEINLINE void GLContextSet( GLDepthFunc_t *src ) +{ + gGL->glDepthFunc ( src->func ); +} + +FORCEINLINE void GLContextGet( GLDepthFunc_t *dst ) +{ + glGetEnumv ( GL_DEPTH_FUNC, &dst->func ); +} + +FORCEINLINE void GLContextGetDefault( GLDepthFunc_t *dst ) +{ + dst->func = GL_GEQUAL; +} + + +// --- GLDepthMask --- +FORCEINLINE void GLContextSet( GLDepthMask_t *src ) +{ + gGL->glDepthMask ( src->mask ); +} + +FORCEINLINE void GLContextGet( GLDepthMask_t *dst ) +{ + gGL->glGetBooleanv ( GL_DEPTH_WRITEMASK, (GLboolean*)&dst->mask ); +} + +FORCEINLINE void GLContextGetDefault( GLDepthMask_t *dst ) +{ + dst->mask = GL_TRUE; +} + + +// --- GLStencilTestEnable --- +FORCEINLINE void GLContextSet( GLStencilTestEnable_t *src ) +{ + glSetEnable( GL_STENCIL_TEST, src->enable != 0 ); +} + +FORCEINLINE void GLContextGet( GLStencilTestEnable_t *dst ) +{ + dst->enable = gGL->glIsEnabled( GL_STENCIL_TEST ); +} + +FORCEINLINE void GLContextGetDefault( GLStencilTestEnable_t *dst ) +{ + dst->enable = GL_FALSE; +} + + +// --- GLStencilFunc --- +FORCEINLINE void GLContextSet( GLStencilFunc_t *src ) +{ + if (src->frontfunc == src->backfunc) + gGL->glStencilFuncSeparate( GL_FRONT_AND_BACK, src->frontfunc, src->ref, src->mask); + else + { + gGL->glStencilFuncSeparate( GL_FRONT, src->frontfunc, src->ref, src->mask); + gGL->glStencilFuncSeparate( GL_BACK, src->backfunc, src->ref, src->mask); + } +} + +FORCEINLINE void GLContextGet( GLStencilFunc_t *dst ) +{ + glGetEnumv ( GL_STENCIL_FUNC, &dst->frontfunc ); + glGetEnumv ( GL_STENCIL_BACK_FUNC, &dst->backfunc ); + gGL->glGetIntegerv ( GL_STENCIL_REF, &dst->ref ); + gGL->glGetIntegerv ( GL_STENCIL_VALUE_MASK, (GLint*)&dst->mask ); +} + +FORCEINLINE void GLContextGetDefault( GLStencilFunc_t *dst ) +{ + dst->frontfunc = GL_ALWAYS; + dst->backfunc = GL_ALWAYS; + dst->ref = 0; + dst->mask = 0xFFFFFFFF; +} + + +// --- GLStencilOp --- indexed 0=front, 1=back + +FORCEINLINE void GLContextSetIndexed( GLStencilOp_t *src, int index ) +{ + GLenum face = (index==0) ? GL_FRONT : GL_BACK; + gGL->glStencilOpSeparate( face, src->sfail, src->dpfail, src->dppass ); +} + +FORCEINLINE void GLContextGetIndexed( GLStencilOp_t *dst, int index ) +{ + glGetEnumv ( (index==0) ? GL_STENCIL_FAIL : GL_STENCIL_BACK_FAIL, &dst->sfail ); + glGetEnumv ( (index==0) ? GL_STENCIL_PASS_DEPTH_FAIL : GL_STENCIL_BACK_PASS_DEPTH_FAIL, &dst->dpfail ); + glGetEnumv ( (index==0) ? GL_STENCIL_PASS_DEPTH_PASS : GL_STENCIL_BACK_PASS_DEPTH_PASS, &dst->dppass ); +} + +FORCEINLINE void GLContextGetDefaultIndexed( GLStencilOp_t *dst, int index ) +{ + dst->sfail = dst->dpfail = dst->dppass = GL_KEEP; +} + + +// --- GLStencilWriteMask --- +FORCEINLINE void GLContextSet( GLStencilWriteMask_t *src ) +{ + gGL->glStencilMask( src->mask ); +} + +FORCEINLINE void GLContextGet( GLStencilWriteMask_t *dst ) +{ + gGL->glGetIntegerv ( GL_STENCIL_WRITEMASK, &dst->mask ); +} + +FORCEINLINE void GLContextGetDefault( GLStencilWriteMask_t *dst ) +{ + dst->mask = 0xFFFFFFFF; +} + + +// --- GLClearColor --- +FORCEINLINE void GLContextSet( GLClearColor_t *src ) +{ + gGL->glClearColor( src->r, src->g, src->b, src->a ); +} + +FORCEINLINE void GLContextGet( GLClearColor_t *dst ) +{ + gGL->glGetFloatv ( GL_COLOR_CLEAR_VALUE, &dst->r ); +} + +FORCEINLINE void GLContextGetDefault( GLClearColor_t *dst ) +{ + dst->r = dst->g = dst->b = 0.5; + dst->a = 1.0; +} + + +// --- GLClearDepth --- +FORCEINLINE void GLContextSet( GLClearDepth_t *src ) +{ + gGL->glClearDepth ( src->d ); +} + +FORCEINLINE void GLContextGet( GLClearDepth_t *dst ) +{ + gGL->glGetDoublev ( GL_DEPTH_CLEAR_VALUE, &dst->d ); +} + +FORCEINLINE void GLContextGetDefault( GLClearDepth_t *dst ) +{ + dst->d = 1.0; +} + + +// --- GLClearStencil --- +FORCEINLINE void GLContextSet( GLClearStencil_t *src ) +{ + gGL->glClearStencil( src->s ); +} + +FORCEINLINE void GLContextGet( GLClearStencil_t *dst ) +{ + gGL->glGetIntegerv ( GL_STENCIL_CLEAR_VALUE, &dst->s ); +} + +FORCEINLINE void GLContextGetDefault( GLClearStencil_t *dst ) +{ + dst->s = 0; +} + +//===========================================================================// + +// caching state object template. One of these is instantiated in the context per unique struct type above +template class GLState +{ + public: + inline GLState() + { + memset( &data, 0, sizeof(data) ); + Default(); + } + + FORCEINLINE void Flush() + { + // immediately blast out the state - it makes no sense to delta it or do anything fancy because shaderapi, dxabstract, and OpenGL itself does this for us (and OpenGL calls with multithreaded drivers are very cheap) + GLContextSet( &data ); + } + + // write: client src into cache + // common case is both false. dirty is calculated, context write is deferred. + FORCEINLINE void Write( const T *src ) + { + data = *src; + Flush(); + } + + // default: write default value to cache, optionally write through + inline void Default( bool noDefer=false ) + { + GLContextGetDefault( &data ); // read default values directly to our cache copy + Flush(); + } + + // read: sel = 0 for cache, 1 for context + inline void Read( T *dst, int sel ) + { + if (sel==0) + *dst = data; + else + GLContextGet( dst ); + } + + // check: verify that context equals cache, return true if mismatched or if illegal values seen + inline bool Check ( void ) + { + T temp; + bool result; + + GLContextGet( &temp ); + result = !(temp == data); + return result; + } + + FORCEINLINE const T &GetData() const { return data; } + + protected: + T data; +}; + +// caching state object template - with multiple values behind it that are indexed +template class GLStateArray +{ + public: + inline GLStateArray() + { + memset( &data, 0, sizeof(data) ); + Default(); + } + + // write cache->context if dirty or forced. + FORCEINLINE void FlushIndex( int index ) + { + // immediately blast out the state - it makes no sense to delta it or do anything fancy because shaderapi, dxabstract, and OpenGL itself does this for us (and OpenGL calls with multithreaded drivers are very cheap) + GLContextSetIndexed( &data[index], index ); + }; + + // write: client src into cache + // common case is both false. dirty is calculated, context write is deferred. + FORCEINLINE void WriteIndex( T *src, int index ) + { + data[index] = *src; + FlushIndex( index ); // dirty becomes false + }; + + // write all slots in the array + FORCEINLINE void Flush() + { + for( int i=0; i < COUNT; i++) + { + FlushIndex( i ); + } + } + + // default: write default value to cache, optionally write through + inline void DefaultIndex( int index ) + { + GLContextGetDefaultIndexed( &data[index], index ); // read default values directly to our cache copy + Flush(); + }; + + inline void Default( void ) + { + for( int i=0; i((reinterpret_cast(m_pRawBuf) + 65535) & (~65535)); + m_nSize = nSize; + m_nOfs = 0; + + gGL->glGenBuffersARB( 1, &m_nBufferObj ); + gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_nBufferObj ); + + gGL->glBufferDataARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_nSize, m_pBuf, GL_STREAM_COPY ); + + return true; + } + + void Deinit() + { + if ( !m_pRawBuf ) + return; + + BlockUntilNotBusy(); + + gGL->glBindBufferARB(GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_nBufferObj ); + + gGL->glBufferDataARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, 0, (void*)NULL, GL_STREAM_COPY ); + + gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, 0 ); + + gGL->glDeleteBuffersARB( 1, &m_nBufferObj ); + m_nBufferObj = 0; + + free( m_pRawBuf ); + m_pRawBuf = NULL; + m_pBuf = NULL; + + m_nSize = 0; + m_nOfs = 0; + } + + inline uint GetSize() const { return m_nSize; } + inline uint GetOfs() const { return m_nOfs; } + inline uint GetBytesRemaining() const { return m_nSize - m_nOfs; } + inline void *GetPtr() const { return m_pBuf; } + inline GLuint GetHandle() const { return m_nBufferObj; } + + void InsertFence() + { +#ifdef HAVE_GL_ARB_SYNC + if ( m_nSyncObj ) + { + gGL->glDeleteSync( m_nSyncObj ); + } + + m_nSyncObj = gGL->glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 ); +#endif + } + + void BlockUntilNotBusy() + { +#ifdef HAVE_GL_ARB_SYNC + if ( m_nSyncObj ) + { + gGL->glClientWaitSync( m_nSyncObj, GL_SYNC_FLUSH_COMMANDS_BIT, 3000000000000ULL ); + + gGL->glDeleteSync( m_nSyncObj ); + + m_nSyncObj = 0; + } +#endif + m_nOfs = 0; + } + + void Append( uint nSize ) + { + m_nOfs += nSize; + Assert( m_nOfs <= m_nSize ); + } + +private: + void *m_pRawBuf; + void *m_pBuf; + uint m_nSize; + uint m_nOfs; + + GLuint m_nBufferObj; +#ifdef HAVE_GL_ARB_SYNC + GLsync m_nSyncObj; +#endif +}; +#endif // !OSX + +//===========================================================================// + +class GLMContext +{ + public: + // set/check current context (perq for many other calls) + void MakeCurrent( bool bRenderThread = false ); + void ReleaseCurrent( bool bRenderThread = false ); + + // CheckCurrent has been removed (it no longer compiled on Linux). To minimize churn I'm leaving + // the inline NOP version. + // DO NOT change this to non-inlined. It's called all over the place from very hot codepaths. + FORCEINLINE void CheckCurrent( void ) { } + + void PopulateCaps( void ); // fill out later portions of renderer info record which need context queries + void DumpCaps( void ); // printf all the caps info (you can call this in release too) + const GLMRendererInfoFields& Caps( void ); // peek at the caps record + + // state cache/mirror + void SetDefaultStates( void ); + void ForceFlushStates(); + + void VerifyStates( void ); + + // textures + // Lock and Unlock reqs go directly to the tex object + CGLMTex *NewTex( GLMTexLayoutKey *key, uint levels=1, const char *debugLabel=NULL ); + void DelTex( CGLMTex *tex ); + + // options for Blit (replacement for ResolveTex and BlitTex) + // pass NULL for dstTex if you want to target GL_BACK with the blit. You get y-flip with that, don't change the dstrect yourself. + void Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, uint filter ); + + // tex blit (via FBO blit) + void BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, uint filter, bool useBlitFB = true ); + + // MSAA resolve - we do this in GLMContext because it has to do a bunch of FBO/blit gymnastics + void ResolveTex( CGLMTex *tex, bool forceDirty=false ); + + // texture pre-load (residency forcing) - normally done one-time but you can force it + void PreloadTex( CGLMTex *tex, bool force=false ); + + // samplers + FORCEINLINE void SetSamplerTex( int sampler, CGLMTex *tex ); + + FORCEINLINE void SetSamplerDirty( int sampler ); + FORCEINLINE void SetSamplerMinFilter( int sampler, GLenum Value ); + FORCEINLINE void SetSamplerMagFilter( int sampler, GLenum Value ); + FORCEINLINE void SetSamplerMipFilter( int sampler, GLenum Value ); + FORCEINLINE void SetSamplerAddressU( int sampler, GLenum Value ); + FORCEINLINE void SetSamplerAddressV( int sampler, GLenum Value ); + FORCEINLINE void SetSamplerAddressW( int sampler, GLenum Value ); + FORCEINLINE void SetSamplerStates( int sampler, GLenum AddressU, GLenum AddressV, GLenum AddressW, GLenum minFilter, GLenum magFilter, GLenum mipFilter, int minLod, float lodBias ); + FORCEINLINE void SetSamplerBorderColor( int sampler, DWORD Value ); + FORCEINLINE void SetSamplerMipMapLODBias( int sampler, DWORD Value ); + FORCEINLINE void SetSamplerMaxMipLevel( int sampler, DWORD Value ); + FORCEINLINE void SetSamplerMaxAnisotropy( int sampler, DWORD Value ); + FORCEINLINE void SetSamplerSRGBTexture( int sampler, DWORD Value ); + FORCEINLINE void SetShadowFilter( int sampler, DWORD Value ); + + // render targets (FBO's) + CGLMFBO *NewFBO( void ); + void DelFBO( CGLMFBO *fbo ); + + // programs + CGLMProgram *NewProgram( EGLMProgramType type, char *progString, const char *pShaderName ); + void DelProgram( CGLMProgram *pProg ); + void NullProgram( void ); // de-ac all shader state + + FORCEINLINE void SetVertexProgram( CGLMProgram *pProg ); + FORCEINLINE void SetFragmentProgram( CGLMProgram *pProg ); + FORCEINLINE void SetProgram( EGLMProgramType nProgType, CGLMProgram *pProg ) { m_drawingProgram[nProgType] = pProg; m_bDirtyPrograms = true; } + + void SetDrawingLang( EGLMProgramLang lang, bool immediate=false ); // choose ARB or GLSL. immediate=false defers lang change to top of frame + + void LinkShaderPair( CGLMProgram *vp, CGLMProgram *fp ); // ensure this combo has been linked and is in the GLSL pair cache + void ValidateShaderPair( CGLMProgram *vp, CGLMProgram *fp ); + void ClearShaderPairCache( void ); // call this to shoot down all the linked pairs + void QueryShaderPair( int index, GLMShaderPairInfo *infoOut ); // this lets you query the shader pair cache for saving its state + + // buffers + // Lock and Unlock reqs go directly to the buffer object + CGLMBuffer *NewBuffer( EGLMBufferType type, uint size, uint options ); + void DelBuffer( CGLMBuffer *buff ); + + FORCEINLINE void SetIndexBuffer( CGLMBuffer *buff ) { BindIndexBufferToCtx( buff ); } + + // FIXME: Remove this, it's no longer used + FORCEINLINE void SetVertexAttributes( GLMVertexSetup *setup ) + { + // we now just latch the vert setup and then execute on it at flushdrawstatestime if shaders are enabled. + if ( setup ) + { + m_drawVertexSetup = *setup; + } + else + { + memset( &m_drawVertexSetup, 0, sizeof( m_drawVertexSetup ) ); + } + } + + // note, no API is exposed for setting a single attribute source. + // come prepared with a complete block of attributes to use. + + // Queries + CGLMQuery *NewQuery( GLMQueryParams *params ); + void DelQuery( CGLMQuery *query ); + + // "slot" means a vec4-sized thing + // these write into .env parameter space + FORCEINLINE void SetProgramParametersF( EGLMProgramType type, uint baseSlot, float *slotData, uint slotCount ); + FORCEINLINE void SetProgramParametersB( EGLMProgramType type, uint baseSlot, int *slotData, uint boolCount ); // take "BOOL" aka int + FORCEINLINE void SetProgramParametersI( EGLMProgramType type, uint baseSlot, int *slotData, uint slotCount ); // take int4s + + // state sync + // If lazyUnbinding is true, unbound samplers will not actually be unbound to the GL device. + FORCEINLINE void FlushDrawStates( uint nStartIndex, uint nEndIndex, uint nBaseVertex ); // pushes all drawing state - samplers, tex, programs, etc. + void FlushDrawStatesNoShaders(); + + // drawing +#ifndef OSX + FORCEINLINE void DrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, uint baseVertex, CGLMBuffer *pIndexBuf ); + void DrawRangeElementsNonInline( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, uint baseVertex, CGLMBuffer *pIndexBuf ); +#else + void DrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CGLMBuffer *pIndexBuf ); +#endif + + void CheckNative( void ); + + // clearing + void Clear( bool color, unsigned long colorValue, bool depth, float depthValue, bool stencil, unsigned int stencilValue, GLScissorBox_t *rect = NULL ); + + // display + //void SetVSyncEnable( bool vsyncOn ); + //void SetFullScreen( bool fsOn, int screenIndex ); // will be latched for next BeginFrame + //void ActivateFullScreen( bool fsOn, int screenIndex ); // will be called by BeginFrame + bool SetDisplayParams( GLMDisplayParams *params ); // either the first time setup, or a change to new setup + + void Present( CGLMTex *tex ); // somewhat hardwired for the time being + + // Called when IDirect3DDevice9::Reset() is called. + void Reset(); + + // writers for the state block inputs + + FORCEINLINE void WriteAlphaTestEnable( GLAlphaTestEnable_t *src ) { m_AlphaTestEnable.Write( src ); } + FORCEINLINE void WriteAlphaTestFunc( GLAlphaTestFunc_t *src ) { m_AlphaTestFunc.Write( src ); } + FORCEINLINE void WriteAlphaToCoverageEnable( GLAlphaToCoverageEnable_t *src ) { m_AlphaToCoverageEnable.Write( src ); } + FORCEINLINE void WriteCullFaceEnable( GLCullFaceEnable_t *src ) { m_CullFaceEnable.Write( src ); } + FORCEINLINE void WriteCullFrontFace( GLCullFrontFace_t *src ) { m_CullFrontFace.Write( src ); } + FORCEINLINE void WritePolygonMode( GLPolygonMode_t *src ) { m_PolygonMode.Write( src ); } + FORCEINLINE void WriteDepthBias( GLDepthBias_t *src ) { m_DepthBias.Write( src ); } + FORCEINLINE void WriteClipPlaneEnable( GLClipPlaneEnable_t *src, int which ) { m_ClipPlaneEnable.WriteIndex( src, which ); } + FORCEINLINE void WriteClipPlaneEquation( GLClipPlaneEquation_t *src, int which ) { m_ClipPlaneEquation.WriteIndex( src, which ); } + FORCEINLINE void WriteScissorEnable( GLScissorEnable_t *src ) { m_ScissorEnable.Write( src ); } + FORCEINLINE void WriteScissorBox( GLScissorBox_t *src ) { m_ScissorBox.Write( src ); } + FORCEINLINE void WriteViewportBox( GLViewportBox_t *src ) { m_ViewportBox.Write( src ); } + FORCEINLINE void WriteViewportDepthRange( GLViewportDepthRange_t *src ) { m_ViewportDepthRange.Write( src ); } + FORCEINLINE void WriteColorMaskSingle( GLColorMaskSingle_t *src ) { m_ColorMaskSingle.Write( src ); } + FORCEINLINE void WriteColorMaskMultiple( GLColorMaskMultiple_t *src, int which ) { m_ColorMaskMultiple.WriteIndex( src, which ); } + FORCEINLINE void WriteBlendEnable( GLBlendEnable_t *src ) { m_BlendEnable.Write( src ); } + FORCEINLINE void WriteBlendFactor( GLBlendFactor_t *src ) { m_BlendFactor.Write( src ); } + FORCEINLINE void WriteBlendEquation( GLBlendEquation_t *src ) { m_BlendEquation.Write( src ); } + FORCEINLINE void WriteBlendColor( GLBlendColor_t *src ) { m_BlendColor.Write( src ); } + + FORCEINLINE void WriteBlendEnableSRGB( GLBlendEnableSRGB_t *src ) + { + if (m_caps.m_hasGammaWrites) // only if caps allow do we actually push it through to the extension + { + m_BlendEnableSRGB.Write( src ); + } + else + { + m_FakeBlendEnableSRGB = src->enable != 0; + } + // note however that we're still tracking what this mode should be, so FlushDrawStates can look at it and adjust the pixel shader + // if fake SRGB mode is in place (m_caps.m_hasGammaWrites is false) + } + + FORCEINLINE void WriteDepthTestEnable( GLDepthTestEnable_t *src ) { m_DepthTestEnable.Write( src ); } + FORCEINLINE void WriteDepthFunc( GLDepthFunc_t *src ) { m_DepthFunc.Write( src ); } + FORCEINLINE void WriteDepthMask( GLDepthMask_t *src ) { m_DepthMask.Write( src ); } + FORCEINLINE void WriteStencilTestEnable( GLStencilTestEnable_t *src ) { m_StencilTestEnable.Write( src ); } + FORCEINLINE void WriteStencilFunc( GLStencilFunc_t *src ) { m_StencilFunc.Write( src ); } + FORCEINLINE void WriteStencilOp( GLStencilOp_t *src, int which ) { m_StencilOp.WriteIndex( src, which ); } + FORCEINLINE void WriteStencilWriteMask( GLStencilWriteMask_t *src ) { m_StencilWriteMask.Write( src ); } + FORCEINLINE void WriteClearColor( GLClearColor_t *src ) { m_ClearColor.Write( src ); } + FORCEINLINE void WriteClearDepth( GLClearDepth_t *src ) { m_ClearDepth.Write( src ); } + FORCEINLINE void WriteClearStencil( GLClearStencil_t *src ) { m_ClearStencil.Write( src ); } + + // debug stuff + void BeginFrame( void ); + void EndFrame( void ); + + // new interactive debug stuff +#if GLMDEBUG + void DebugDump( GLMDebugHookInfo *info, uint options, uint vertDumpMode ); + void DebugHook( GLMDebugHookInfo *info ); + void DebugPresent( void ); + void DebugClear( void ); +#endif + + FORCEINLINE void SetMaxUsedVertexShaderConstantsHint( uint nMaxConstants ); + FORCEINLINE DWORD GetCurrentOwnerThreadId() const { return m_nCurOwnerThreadId; } + + protected: + friend class GLMgr; // only GLMgr can make GLMContext objects + friend class GLMRendererInfo; // only GLMgr can make GLMContext objects + friend class CGLMTex; // tex needs to be able to do binds + friend class CGLMFBO; // fbo needs to be able to do binds + friend class CGLMProgram; + friend class CGLMShaderPair; + friend class CGLMShaderPairCache; + friend class CGLMBuffer; + friend class CGLMBufferSpanManager; + friend class GLMTester; // tester class needs access back into GLMContext + + friend struct IDirect3D9; + friend struct IDirect3DDevice9; + friend struct IDirect3DQuery9; + + // methods------------------------------------------ + + // old GLMContext( GLint displayMask, GLint rendererID, PseudoNSGLContextPtr nsglShareCtx ); + GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ); + ~GLMContext(); + +#ifndef OSX + FORCEINLINE GLuint FindSamplerObject( const GLMTexSamplingParams &desiredParams ); +#endif + + FORCEINLINE void SetBufAndVertexAttribPointer( uint nIndex, GLuint nGLName, GLuint stride, GLuint datatype, GLboolean normalized, GLuint nCompCount, const void *pBuf, uint nRevision ) + { + VertexAttribs_t &curAttribs = m_boundVertexAttribs[nIndex]; + if ( nGLName != m_nBoundGLBuffer[kGLMVertexBuffer] ) + { + m_nBoundGLBuffer[kGLMVertexBuffer] = nGLName; + gGL->glBindBufferARB( GL_ARRAY_BUFFER_ARB, nGLName ); + } + else if ( ( curAttribs.m_pPtr == pBuf ) && + ( curAttribs.m_revision == nRevision ) && + ( curAttribs.m_stride == stride ) && + ( curAttribs.m_datatype == datatype ) && + ( curAttribs.m_normalized == normalized ) && + ( curAttribs.m_nCompCount == nCompCount ) ) + { + return; + } + + curAttribs.m_nCompCount = nCompCount; + curAttribs.m_datatype = datatype; + curAttribs.m_normalized = normalized; + curAttribs.m_stride = stride; + curAttribs.m_pPtr = pBuf; + curAttribs.m_revision = nRevision; + + gGL->glVertexAttribPointer( nIndex, nCompCount, datatype, normalized, stride, pBuf ); + } + + struct CurAttribs_t + { + uint m_nTotalBufferRevision; + IDirect3DVertexDeclaration9 *m_pVertDecl; + D3DStreamDesc m_streams[ D3D_MAX_STREAMS ]; + uint64 m_vtxAttribMap[2]; + }; + + CurAttribs_t m_CurAttribs; + + FORCEINLINE void ClearCurAttribs() + { + m_CurAttribs.m_nTotalBufferRevision = 0; + m_CurAttribs.m_pVertDecl = NULL; + memset( m_CurAttribs.m_streams, 0, sizeof( m_CurAttribs.m_streams ) ); + m_CurAttribs.m_vtxAttribMap[0] = 0xBBBBBBBBBBBBBBBBULL; + m_CurAttribs.m_vtxAttribMap[1] = 0xBBBBBBBBBBBBBBBBULL; + } + + FORCEINLINE void ReleasedShader() { NullProgram(); } + + // textures + FORCEINLINE void SelectTMU( int tmu ) + { + if ( tmu != m_activeTexture ) + { + gGL->glActiveTexture( GL_TEXTURE0 + tmu ); + m_activeTexture = tmu; + } + } + + void BindTexToTMU( CGLMTex *tex, int tmu ); + + // render targets / FBO's + void BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint = GL_FRAMEBUFFER_EXT ); // you can also choose GL_READ_FRAMEBUFFER_EXT / GL_DRAW_FRAMEBUFFER_EXT + + // buffers + FORCEINLINE void BindGLBufferToCtx( GLenum nGLBufType, GLuint nGLName, bool bForce = false ) + { + Assert( ( nGLBufType == GL_ARRAY_BUFFER_ARB ) || ( nGLBufType == GL_ELEMENT_ARRAY_BUFFER_ARB ) ); + + const uint nIndex = ( nGLBufType == GL_ARRAY_BUFFER_ARB ) ? kGLMVertexBuffer : kGLMIndexBuffer; + if ( ( bForce ) || ( m_nBoundGLBuffer[nIndex] != nGLName ) ) + { + m_nBoundGLBuffer[nIndex] = nGLName; + gGL->glBindBufferARB( nGLBufType, nGLName ); + } + } + + void BindBufferToCtx( EGLMBufferType type, CGLMBuffer *buff, bool force = false ); // does not twiddle any enables. + + FORCEINLINE void BindIndexBufferToCtx( CGLMBuffer *buff ); + FORCEINLINE void BindVertexBufferToCtx( CGLMBuffer *buff ); + + GLuint CreateTex( GLenum texBind, GLenum internalFormat ); + void CleanupTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ); + void DestroyTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ); + GLuint FillTexCache( bool holdOne, int newTextures ); + void PurgeTexCache( ); + + // debug font + void GenDebugFontTex( void ); + void DrawDebugText( float x, float y, float z, float drawCharWidth, float drawCharHeight, char *string ); + +#ifndef OSX + CPinnedMemoryBuffer *GetCurPinnedMemoryBuffer( ) { return &m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer]; } +#endif + + CPersistentBuffer* GetCurPersistentBuffer( EGLMBufferType type ) { return &( m_persistentBuffer[m_nCurPersistentBuffer][type] ); } + + // members------------------------------------------ + + // context + DWORD m_nCurOwnerThreadId; + uint m_nThreadOwnershipReleaseCounter; + + bool m_bUseSamplerObjects; + bool m_bTexClientStorage; + + IDirect3DDevice9 *m_pDevice; + GLMRendererInfoFields m_caps; + + bool m_displayParamsValid; // is there a param block copied in yet + GLMDisplayParams m_displayParams; // last known display config, either via constructor, or by SetDisplayParams... + +#if defined( USE_SDL ) + int m_pixelFormatAttribs[100]; // more than enough + PseudoNSGLContextPtr m_nsctx; + void * m_ctx; +#endif + bool m_bUseBoneUniformBuffers; // if true, we use two uniform buffers for vertex shader constants vs. one + + // texture form table + CGLMTexLayoutTable *m_texLayoutTable; + + // context state mirrors + + GLState m_AlphaTestEnable; + + GLState m_AlphaTestFunc; + + GLState m_CullFaceEnable; + GLState m_CullFrontFace; + GLState m_PolygonMode; + + GLState m_DepthBias; + + GLStateArray m_ClipPlaneEnable; + GLStateArray m_ClipPlaneEquation; // dxabstract puts them directly into param slot 253(0) and 254(1) + + GLState m_ScissorEnable; + GLState m_ScissorBox; + + GLState m_AlphaToCoverageEnable; + + GLState m_ViewportBox; + GLState m_ViewportDepthRange; + + GLState m_ColorMaskSingle; + GLStateArray m_ColorMaskMultiple; // need an official constant for the color buffers limit + + GLState m_BlendEnable; + GLState m_BlendFactor; + GLState m_BlendEquation; + GLState m_BlendColor; + GLState m_BlendEnableSRGB; // write to this one to transmit intent to write SRGB encoded pixels to drawing FB + bool m_FakeBlendEnableSRGB; // writes to above will be shunted here if fake SRGB is in effect. + + GLState m_DepthTestEnable; + GLState m_DepthFunc; + GLState m_DepthMask; + + GLState m_StencilTestEnable; // global stencil test enable + GLState m_StencilFunc; // holds front and back stencil funcs + GLStateArray m_StencilOp; // indexed: 0=front 1=back + GLState m_StencilWriteMask; + + GLState m_ClearColor; + GLState m_ClearDepth; + GLState m_ClearStencil; + + // texture bindings and sampler setup + int m_activeTexture; // mirror for glActiveTexture + GLMTexSampler m_samplers[GLM_SAMPLER_COUNT]; + + uint8 m_nDirtySamplerFlags[GLM_SAMPLER_COUNT]; // 0 if the sampler is dirty, 1 if not + uint32 m_nNumDirtySamplers; // # of unique dirty sampler indices in m_nDirtySamplers + uint8 m_nDirtySamplers[GLM_SAMPLER_COUNT + 1]; // dirty sampler indices + + void MarkAllSamplersDirty(); + + struct SamplerHashEntry + { + GLuint m_samplerObject; + GLMTexSamplingParams m_params; + }; + + enum + { + cSamplerObjectHashBits = 9, cSamplerObjectHashSize = 1 << cSamplerObjectHashBits + }; + SamplerHashEntry m_samplerObjectHash[cSamplerObjectHashSize]; + uint m_nSamplerObjectHashNumEntries; + + // texture lock tracking - CGLMTex objects share usage of this + CUtlVector< GLMTexLockDesc > m_texLocks; + + // render target binding - check before draw + // similar to tex sampler mechanism, we track "bound" from "chosen for drawing" separately, + // so binding for creation/setup need not disrupt any notion of what will be used at draw time + + CGLMFBO *m_boundDrawFBO; // FBO on GL_DRAW_FRAMEBUFFER bind point + CGLMFBO *m_boundReadFBO; // FBO on GL_READ_FRAMEBUFFER bind point + // ^ both are set if you bind to GL_FRAMEBUFFER_EXT + + CGLMFBO *m_drawingFBO; // what FBO should be bound at draw time (to both read/draw bp's). + + CGLMFBO *m_blitReadFBO; + CGLMFBO *m_blitDrawFBO; // scratch FBO's for framebuffer blit + + CGLMFBO *m_scratchFBO[ kGLMScratchFBOCount ]; // general purpose FBO's for internal use + + CUtlVector< CGLMFBO* > m_fboTable; // each live FBO goes in the table + + uint m_fragDataMask; + + // program bindings + EGLMProgramLang m_drawingLangAtFrameStart; // selector for start of frame (spills into m_drawingLang) + EGLMProgramLang m_drawingLang; // selector for which language we desire to draw with on the next batch + CGLMProgram *m_drawingProgram[ kGLMNumProgramTypes ]; + bool m_bDirtyPrograms; + + GLMProgramParamsF m_programParamsF[ kGLMNumProgramTypes ]; + GLMProgramParamsB m_programParamsB[ kGLMNumProgramTypes ]; + GLMProgramParamsI m_programParamsI[ kGLMNumProgramTypes ]; // two banks, but only the vertex one is used + EGLMParamWriteMode m_paramWriteMode; + + CGLMProgram *m_pNullFragmentProgram; // write opaque black. Activate when caller asks for null FP + + CGLMProgram *m_preloadTexVertexProgram; // programs to help preload textures (dummies) + CGLMProgram *m_preload2DTexFragmentProgram; + CGLMProgram *m_preload3DTexFragmentProgram; + CGLMProgram *m_preloadCubeTexFragmentProgram; + +#if defined( OSX ) && defined( GLMDEBUG ) + CGLMProgram *m_boundProgram[ kGLMNumProgramTypes ]; +#endif + + CGLMShaderPairCache *m_pairCache; // GLSL only + CGLMShaderPair *m_pBoundPair; // GLSL only + + FORCEINLINE void NewLinkedProgram() { ClearCurAttribs(); } + + //uint m_boundPairRevision; // GLSL only + //GLhandleARB m_boundPairProgram; // GLSL only + + // buffer bindings + GLuint m_nBoundGLBuffer[kGLMNumBufferTypes]; + + struct VertexAttribs_t + { + GLuint m_nCompCount; + GLenum m_datatype; + GLboolean m_normalized; + GLuint m_stride; + const void *m_pPtr; + uint m_revision; + }; + + VertexAttribs_t m_boundVertexAttribs[ kGLMVertexAttributeIndexMax ]; // tracked per attrib for dupe-set-absorb + uint m_lastKnownVertexAttribMask; // tracked for dupe-enable-absorb + int m_nNumSetVertexAttributes; + + // FIXME: Remove this, it's no longer used + GLMVertexSetup m_drawVertexSetup; + + EGLMAttribWriteMode m_attribWriteMode; + + bool m_slowCheckEnable; // turn this on or no native checking is done ("-glmassertslow" or "-glmsspewslow") + bool m_slowAssertEnable; // turn this on to assert on a non-native batch "-glmassertslow" + bool m_slowSpewEnable; // turn this on to log non-native batches to stdout "-glmspewslow" + bool m_checkglErrorsAfterEveryBatch; // turn this on to check for GL errors after each batch (slow) ("-glcheckerrors") + + // debug font texture + CGLMTex *m_debugFontTex; // might be NULL unless you call GenDebugFontTex + CGLMBuffer *m_debugFontIndices; // up to 1024 indices (256 chars times 4) + CGLMBuffer *m_debugFontVertices; // up to 1024 verts + + // batch/frame debugging support + int m_debugFrameIndex; // init to -1. Increment at BeginFrame + + int m_nMaxUsedVertexProgramConstantsHint; + + uint32 m_dwRenderThreadId; + volatile bool m_bIsThreading; + + uint m_nCurFrame; + uint m_nBatchCounter; + + struct TextureEntry_t + { + GLenum m_nTexBind; + GLenum m_nInternalFormat; + GLuint m_nTexName; + }; + + GLuint m_destroyPBO; + CUtlVector< TextureEntry_t > m_availableTextures; + +#ifndef OSX + enum { cNumPinnedMemoryBuffers = 4 }; + CPinnedMemoryBuffer m_PinnedMemoryBuffers[cNumPinnedMemoryBuffers]; + uint m_nCurPinnedMemoryBuffer; +#endif + + enum { cNumPersistentBuffers = 3 }; + CPersistentBuffer m_persistentBuffer[cNumPersistentBuffers][kGLMNumBufferTypes]; + uint m_nCurPersistentBuffer; + + void SaveColorMaskAndSetToDefault(); + void RestoreSavedColorMask(); + GLColorMaskSingle_t m_SavedColorMask; + +#if GLMDEBUG + // interactive (DebugHook) debug support + + // using these you can implement frame advance, batch single step, and batch rewind (let it run til next frame and hold on prev batch #) + int m_holdFrameBegin; // -1 if no hold req'd, otherwise # of frame to hold at (at beginframe time) + int m_holdFrameEnd; // -1 if no hold req'd, otherwise # of frame to hold at (at endframe time) + + int m_holdBatch,m_holdBatchFrame; // -1 if no hold, else # of batch&frame to hold at (both must be set) + // these can be expired/cleared to -1 if the frame passes without a hit + // may be desirable to re-pause in that event, as user was expecting a hold to occur + + bool m_debugDelayEnable; // allow sleep delay + uint m_debugDelay; // sleep time per hook call in microseconds (for usleep()) + + // pre-draw global toggles / options + bool m_autoClearColor,m_autoClearDepth,m_autoClearStencil; + float m_autoClearColorValues[4]; + + // debug knobs + int m_selKnobIndex; + float m_selKnobMinValue,m_selKnobMaxValue,m_selKnobIncrement; +#endif + +#if GL_BATCH_PERF_ANALYSIS + uint m_nTotalVSUniformCalls; + uint m_nTotalVSUniformBoneCalls; + uint m_nTotalVSUniformsSet; + uint m_nTotalVSUniformsBoneSet; + uint m_nTotalPSUniformCalls; + uint m_nTotalPSUniformsSet; + + CFlushDrawStatesStats m_FlushStats; +#endif + + void ProcessTextureDeletes(); + CTSQueue m_DeleteTextureQueue; +}; + +#ifndef OSX + +FORCEINLINE void GLMContext::DrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, uint baseVertex, CGLMBuffer *pIndexBuf ) +{ +#if GL_ENABLE_INDEX_VERIFICATION + DrawRangeElementsNonInline( mode, start, end, count, type, indices, baseVertex, pIndexBuf ); +#else + +#if GLMDEBUG + GLM_FUNC; +#else + //tmZone( TELEMETRY_LEVEL0, TMZF_NONE, "%s %d-%d count:%d mode:%d type:%d", __FUNCTION__, start, end, count, mode, type ); +#endif + + ++m_nBatchCounter; + + SetIndexBuffer( pIndexBuf ); + + void *indicesActual = (void*)indices; + + if ( pIndexBuf->m_bPseudo ) + { + // you have to pass actual address, not offset + indicesActual = (void*)( (int)indicesActual + (int)pIndexBuf->m_pPseudoBuf ); + } + if (pIndexBuf->m_bUsingPersistentBuffer) + { + indicesActual = (void*)( (int)indicesActual + (int)pIndexBuf->m_nPersistentBufferStartOffset ); + } + +//#if GLMDEBUG +#if 0 + bool hasVP = m_drawingProgram[ kGLMVertexProgram ] != NULL; + bool hasFP = m_drawingProgram[ kGLMFragmentProgram ] != NULL; + + // init debug hook information + GLMDebugHookInfo info; + memset( &info, 0, sizeof(info) ); + info.m_caller = eDrawElements; + + // relay parameters we're operating under + info.m_drawMode = mode; + info.m_drawStart = start; + info.m_drawEnd = end; + info.m_drawCount = count; + info.m_drawType = type; + info.m_drawIndices = indices; + + do + { + // obey global options re pre-draw clear + if ( m_autoClearColor || m_autoClearDepth || m_autoClearStencil ) + { + GLMPRINTF(("-- DrawRangeElements auto clear" )); + this->DebugClear(); + } + + // always sync with editable shader text prior to draw +#if GLMDEBUG + //FIXME disengage this path if context is in GLSL mode.. + // it will need fixes to get the shader pair re-linked etc if edits happen anyway. + + if (m_drawingProgram[ kGLMVertexProgram ]) + { + m_drawingProgram[ kGLMVertexProgram ]->SyncWithEditable(); + } + else + { + AssertOnce(!"drawing with no vertex program bound"); + } + + + if (m_drawingProgram[ kGLMFragmentProgram ]) + { + m_drawingProgram[ kGLMFragmentProgram ]->SyncWithEditable(); + } + else + { + AssertOnce(!"drawing with no fragment program bound"); + } +#endif + // do the drawing + if (hasVP && hasFP) + { + gGL->glDrawRangeElementsBaseVertex( mode, start, end, count, type, indicesActual, baseVertex ); + + if ( m_slowCheckEnable ) + { + CheckNative(); + } + } + this->DebugHook( &info ); + + } while ( info.m_loop ); +#else + Assert( m_drawingLang == kGLMGLSL ); + + if ( m_pBoundPair ) + { + gGL->glDrawRangeElementsBaseVertex( mode, start, end, count, type, indicesActual, baseVertex ); + +#if GLMDEBUG + if ( m_slowCheckEnable ) + { + CheckNative(); + } +#endif + } +#endif + +#endif // GL_ENABLE_INDEX_VERIFICATION +} + +#endif // #ifndef OSX + +FORCEINLINE void GLMContext::SetVertexProgram( CGLMProgram *pProg ) +{ + m_drawingProgram[kGLMVertexProgram] = pProg; + m_bDirtyPrograms = true; +} + +FORCEINLINE void GLMContext::SetFragmentProgram( CGLMProgram *pProg ) +{ + m_drawingProgram[kGLMFragmentProgram] = pProg ? pProg : m_pNullFragmentProgram; + m_bDirtyPrograms = true; +} + +// "slot" means a vec4-sized thing +// these write into .env parameter space +FORCEINLINE void GLMContext::SetProgramParametersF( EGLMProgramType type, uint baseSlot, float *slotData, uint slotCount ) +{ +#if GLMDEBUG + GLM_FUNC; +#endif + + Assert( baseSlot < kGLMProgramParamFloat4Limit ); + Assert( baseSlot+slotCount <= kGLMProgramParamFloat4Limit ); + +#if GLMDEBUG + GLMPRINTF(("-S-GLMContext::SetProgramParametersF %s slots %d - %d: ", (type==kGLMVertexProgram) ? "VS" : "FS", baseSlot, baseSlot + slotCount - 1 )); + for( uint i=0; i DXABSTRACT_VS_LAST_BONE_SLOT ) + { + m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone = MIN( m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone, firstDirty - maxBoneSlots ); + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone = MAX( m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone, highWater - maxBoneSlots ); + } + else if ( firstDirty >= DXABSTRACT_VS_FIRST_BONE_SLOT ) + { + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterBone = DXABSTRACT_VS_LAST_BONE_SLOT + 1; + + m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone = MIN( m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone, DXABSTRACT_VS_FIRST_BONE_SLOT ); + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone = MAX( m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone, highWater - maxBoneSlots ); + } + else + { + int nNumActualBones = ( DXABSTRACT_VS_LAST_BONE_SLOT + 1 ) - DXABSTRACT_VS_FIRST_BONE_SLOT; + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterBone = MAX( m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterBone, nNumActualBones ); + + m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone = MIN( m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone, firstDirty ); + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone = MAX( m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone, highWater - maxBoneSlots ); + } + } + } + else + { + m_programParamsF[type].m_dirtySlotHighWaterNonBone = MAX( m_programParamsF[type].m_dirtySlotHighWaterNonBone, (int)(baseSlot + slotCount) ); + m_programParamsF[type].m_firstDirtySlotNonBone = MIN( m_programParamsF[type].m_firstDirtySlotNonBone, (int)baseSlot ); + } +} + +FORCEINLINE void GLMContext::SetProgramParametersB( EGLMProgramType type, uint baseSlot, int *slotData, uint boolCount ) +{ +#if GLMDEBUG + GLM_FUNC; +#endif + + Assert( m_drawingLang == kGLMGLSL ); + Assert( type==kGLMVertexProgram || type==kGLMFragmentProgram ); + + Assert( baseSlot < kGLMProgramParamBoolLimit ); + Assert( baseSlot+boolCount <= kGLMProgramParamBoolLimit ); + +#if GLMDEBUG + GLMPRINTF(("-S-GLMContext::SetProgramParametersB %s bools %d - %d: ", (type==kGLMVertexProgram) ? "VS" : "FS", baseSlot, baseSlot + boolCount - 1 )); + for( uint i=0; i m_programParamsB[type].m_dirtySlotCount) + m_programParamsB[type].m_dirtySlotCount = baseSlot+boolCount; +} + +FORCEINLINE void GLMContext::SetProgramParametersI( EGLMProgramType type, uint baseSlot, int *slotData, uint slotCount ) // groups of 4 ints... +{ +#if GLMDEBUG + GLM_FUNC; +#endif + + Assert( m_drawingLang == kGLMGLSL ); + Assert( type==kGLMVertexProgram ); + + Assert( baseSlot < kGLMProgramParamInt4Limit ); + Assert( baseSlot+slotCount <= kGLMProgramParamInt4Limit ); + +#if GLMDEBUG + GLMPRINTF(("-S-GLMContext::SetProgramParametersI %s slots %d - %d: ", (type==kGLMVertexProgram) ? "VS" : "FS", baseSlot, baseSlot + slotCount - 1 )); + for( uint i=0; i m_programParamsI[type].m_dirtySlotCount) + { + m_programParamsI[type].m_dirtySlotCount = baseSlot + slotCount; + } +} + +FORCEINLINE void GLMContext::SetSamplerDirty( int sampler ) +{ + Assert( sampler < GLM_SAMPLER_COUNT ); + m_nDirtySamplers[m_nNumDirtySamplers] = sampler; + m_nNumDirtySamplers += m_nDirtySamplerFlags[sampler]; + m_nDirtySamplerFlags[sampler] = 0; +} + +FORCEINLINE void GLMContext::SetSamplerTex( int sampler, CGLMTex *tex ) +{ + Assert( sampler < GLM_SAMPLER_COUNT ); + m_samplers[sampler].m_pBoundTex = tex; + if ( tex ) + { + if ( !gGL->m_bHave_GL_EXT_direct_state_access ) + { + if ( sampler != m_activeTexture ) + { + gGL->glActiveTexture( GL_TEXTURE0 + sampler ); + m_activeTexture = sampler; + } + + gGL->glBindTexture( tex->m_texGLTarget, tex->m_texName ); + } + else + { + gGL->glBindMultiTextureEXT( GL_TEXTURE0 + sampler, tex->m_texGLTarget, tex->m_texName ); + } + } + + if ( !m_bUseSamplerObjects ) + { + SetSamplerDirty( sampler ); + } +} + +FORCEINLINE void GLMContext::SetSamplerMinFilter( int sampler, GLenum Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MIN_FILTER_BITS ) ); + m_samplers[sampler].m_samp.m_packed.m_minFilter = Value; +} + +FORCEINLINE void GLMContext::SetSamplerMagFilter( int sampler, GLenum Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MAG_FILTER_BITS ) ); + m_samplers[sampler].m_samp.m_packed.m_magFilter = Value; +} + +FORCEINLINE void GLMContext::SetSamplerMipFilter( int sampler, GLenum Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MIP_FILTER_BITS ) ); + m_samplers[sampler].m_samp.m_packed.m_mipFilter = Value; +} + +FORCEINLINE void GLMContext::SetSamplerAddressU( int sampler, GLenum Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS) ); + m_samplers[sampler].m_samp.m_packed.m_addressU = Value; +} + +FORCEINLINE void GLMContext::SetSamplerAddressV( int sampler, GLenum Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS) ); + m_samplers[sampler].m_samp.m_packed.m_addressV = Value; +} + +FORCEINLINE void GLMContext::SetSamplerAddressW( int sampler, GLenum Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS) ); + m_samplers[sampler].m_samp.m_packed.m_addressW = Value; +} + +FORCEINLINE void GLMContext::SetSamplerStates( int sampler, GLenum AddressU, GLenum AddressV, GLenum AddressW, GLenum minFilter, GLenum magFilter, GLenum mipFilter, int minLod, float lodBias ) +{ + Assert( AddressU < ( 1 << GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS) ); + Assert( AddressV < ( 1 << GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS) ); + Assert( AddressW < ( 1 << GLM_PACKED_SAMPLER_PARAMS_ADDRESS_BITS) ); + Assert( minFilter < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MIN_FILTER_BITS ) ); + Assert( magFilter < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MAG_FILTER_BITS ) ); + Assert( mipFilter < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MIP_FILTER_BITS ) ); + Assert( minLod < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MIN_LOD_BITS ) ); + + GLMTexSamplingParams ¶ms = m_samplers[sampler].m_samp; + params.m_packed.m_addressU = AddressU; + params.m_packed.m_addressV = AddressV; + params.m_packed.m_addressW = AddressW; + params.m_packed.m_minFilter = minFilter; + params.m_packed.m_magFilter = magFilter; + params.m_packed.m_mipFilter = mipFilter; + params.m_packed.m_minLOD = minLod; + + params.m_lodBias = lodBias; +} + +FORCEINLINE void GLMContext::SetSamplerBorderColor( int sampler, DWORD Value ) +{ + m_samplers[sampler].m_samp.m_borderColor = Value; +} + +FORCEINLINE void GLMContext::SetSamplerMipMapLODBias( int sampler, DWORD Value ) +{ + typedef union { + DWORD asDword; + float asFloat; + } Convert_t; + + Convert_t c; + c.asDword = Value; + + m_samplers[sampler].m_samp.m_lodBias = c.asFloat; +} + +FORCEINLINE void GLMContext::SetSamplerMaxMipLevel( int sampler, DWORD Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MIN_LOD_BITS ) ); + m_samplers[sampler].m_samp.m_packed.m_minLOD = Value; +} + +FORCEINLINE void GLMContext::SetSamplerMaxAnisotropy( int sampler, DWORD Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_MAX_ANISO_BITS ) ); + m_samplers[sampler].m_samp.m_packed.m_maxAniso = Value; +} + +FORCEINLINE void GLMContext::SetSamplerSRGBTexture( int sampler, DWORD Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_SRGB_BITS ) ); + m_samplers[sampler].m_samp.m_packed.m_srgb = Value; +} + +FORCEINLINE void GLMContext::SetShadowFilter( int sampler, DWORD Value ) +{ + Assert( Value < ( 1 << GLM_PACKED_SAMPLER_PARAMS_COMPARE_MODE_BITS ) ); + m_samplers[sampler].m_samp.m_packed.m_compareMode = Value; +} + +FORCEINLINE void GLMContext::BindIndexBufferToCtx( CGLMBuffer *buff ) +{ + GLMPRINTF(( "--- GLMContext::BindIndexBufferToCtx buff %p, GL name %d", buff, (buff) ? buff->m_nHandle : -1 )); + + Assert( !buff || ( buff->m_buffGLTarget == GL_ELEMENT_ARRAY_BUFFER_ARB ) ); + + GLuint nGLName = buff ? buff->GetHandle() : 0; + + if ( m_nBoundGLBuffer[ kGLMIndexBuffer] == nGLName ) + return; + + m_nBoundGLBuffer[ kGLMIndexBuffer] = nGLName; + gGL->glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, nGLName ); +} + +FORCEINLINE void GLMContext::BindVertexBufferToCtx( CGLMBuffer *buff ) +{ + GLMPRINTF(( "--- GLMContext::BindVertexBufferToCtx buff %p, GL name %d", buff, (buff) ? buff->m_nHandle : -1 )); + + Assert( !buff || ( buff->m_buffGLTarget == GL_ARRAY_BUFFER_ARB ) ); + + GLuint nGLName = buff ? buff->GetHandle() : 0; + + if ( m_nBoundGLBuffer[ kGLMVertexBuffer] == nGLName ) + return; + + m_nBoundGLBuffer[ kGLMVertexBuffer] = nGLName; + gGL->glBindBufferARB( GL_ARRAY_BUFFER_ARB, nGLName ); +} + +FORCEINLINE void GLMContext::SetMaxUsedVertexShaderConstantsHint( uint nMaxConstants ) +{ + static bool bUseMaxVertexShadeConstantHints = !CommandLine()->CheckParm("-disablemaxvertexshaderconstanthints"); + if ( bUseMaxVertexShadeConstantHints ) + { + m_nMaxUsedVertexProgramConstantsHint = nMaxConstants; + } +} + +struct GLMTestParams +{ + GLMContext *m_ctx; + int *m_testList; // -1 termed + + bool m_glErrToDebugger; + bool m_glErrToConsole; + + bool m_intlErrToDebugger; + bool m_intlErrToConsole; + + int m_frameCount; // how many frames to test. +}; + +class GLMTester +{ + public: + + GLMTester(GLMTestParams *params); + ~GLMTester(); + + + // optionally callable by test routines to get basic drawables wired up + void StdSetup( void ); + void StdCleanup( void ); + + // callable by test routines to clear the frame or present it + void Clear( void ); + void Present( int seed ); + + // error reporting + void CheckGLError( const char *comment ); // obey m_params setting for console / debugger response + void InternalError( int errcode, char *comment ); // if errcode!=0, obey m_params setting for console / debugger response + + void RunTests(); + + void RunOneTest( int testindex ); + + // test routines themselves + void Test0(); + void Test1(); + void Test2(); + void Test3(); + + GLMTestParams m_params; // copy of caller's params, do not mutate... + + // std-setup stuff + int m_drawWidth, m_drawHeight; + CGLMFBO *m_drawFBO; + CGLMTex *m_drawColorTex; + CGLMTex *m_drawDepthTex; +}; + +class CShowPixelsParams +{ +public: + GLuint m_srcTexName; + int m_width,m_height; + bool m_vsyncEnable; + bool m_fsEnable; // want receiving view to be full screen. for now, just target the main screen. extend later. + bool m_useBlit; // use FBO blit - sending context says it is available. + bool m_noBlit; // the back buffer has already been populated by the caller (perhaps via direct MSAA resolve from multisampled RT tex) + bool m_onlySyncView; // react to full/windowed state change only, do not present bits +}; + +#define kMaxCrawlFrames 100 +#define kMaxCrawlText (kMaxCrawlFrames * 256) +class CStackCrawlParams +{ + public: + uint m_frameLimit; // input: max frames to retrieve + uint m_frameCount; // output: frames found + void *m_crawl[kMaxCrawlFrames]; // call site addresses + char *m_crawlNames[kMaxCrawlFrames]; // pointers into text following, one per decoded name + char m_crawlText[kMaxCrawlText]; +}; + +#endif // GLMGR_H diff --git a/public/togles/linuxwin/glmgrbasics.h b/public/togles/linuxwin/glmgrbasics.h new file mode 100644 index 00000000..a32938ad --- /dev/null +++ b/public/togles/linuxwin/glmgrbasics.h @@ -0,0 +1,332 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glmgrbasics.h +// types, common headers, forward declarations, utilities +// +//=============================================================================== + +#ifndef GLMBASICS_H +#define GLMBASICS_H + +#pragma once + +#ifdef USE_SDL +#include "SDL_opengl.h" +#endif + +#ifdef OSX + #include + #include + #include + #include + +#ifndef MAC_OS_X_VERSION_10_9 + #include + #include +#endif +#endif + +#include "tier0/platform.h" + +#include "bitmap/imageformat.h" +#include "bitvec.h" +#include "tier1/checksum_md5.h" +#include "tier1/utlvector.h" +#include "tier1/convar.h" + +#include + +#include "dxabstract_types.h" + +struct GLMRect; +typedef void *PseudoGLContextPtr; + +// types + + // 3-d integer box (used for texture lock/unlock etc) +struct GLMRegion +{ + int xmin,xmax; + int ymin,ymax; + int zmin,zmax; +}; + +struct GLMRect // follows GL convention - if coming from the D3D rect you will need to fiddle the Y's +{ + int xmin; // left + int ymin; // bottom + int xmax; // right + int ymax; // top +}; + +// macros + +//#define GLMassert(x) assert(x) + +// forward decls +class GLMgr; // singleton +class GLMContext; // GL context +class CGLMContextTester; // testing class +class CGLMTex; +class CGLMFBO; +class CGLMProgram; +class CGLMBuffer; + + +// utilities + +typedef enum +{ + // D3D codes + eD3D_DEVTYPE, + eD3D_FORMAT, + eD3D_RTYPE, + eD3D_USAGE, + eD3D_RSTATE, // render state + eD3D_SIO, // D3D shader bytecode + eD3D_VTXDECLUSAGE, + + // CGL codes + eCGL_RENDID, + + // OpenGL error codes + eGL_ERROR, + + // OpenGL enums + eGL_ENUM, + eGL_RENDERER + +} GLMThing_t; + +// these will look at the string to guess its flavor: <, >, ---, -M-, -S- +#ifdef TOGL_DLL_EXPORT + DLL_EXPORT const char* GLMDecode( GLMThing_t type, unsigned long value ); // decode a numeric const +#else + DLL_IMPORT const char* GLMDecode( GLMThing_t type, unsigned long value ); // decode a numeric const +#endif + +const char* GLMDecodeMask( GLMThing_t type, unsigned long value ); // decode a bitmask + +FORCEINLINE void GLMStop( void ) { DXABSTRACT_BREAK_ON_ERROR(); } + +void GLMEnableTrace( bool on ); + +//=============================================================================== +// output functions + +// expose these in release now +// Mimic PIX events so we can decorate debug spew +DLL_EXPORT void GLMBeginPIXEvent( const char *str ); +DLL_EXPORT void GLMEndPIXEvent( void ); + +class CScopedGLMPIXEvent +{ + CScopedGLMPIXEvent( const CScopedGLMPIXEvent & ); + CScopedGLMPIXEvent& operator= ( const CScopedGLMPIXEvent & ); +public: + inline CScopedGLMPIXEvent( const char *pName ) { GLMBeginPIXEvent( pName ); } + inline ~CScopedGLMPIXEvent() { GLMEndPIXEvent( ); } +}; + +#if GLMDEBUG + + +//=============================================================================== +// classes + +// helper class making function tracking easier to wire up + +class GLMFuncLogger +{ + public: + + // simple function log + GLMFuncLogger( const char *funcName ) + { + m_funcName = funcName; + m_earlyOut = false; + + GLMPrintf( ">%s", m_funcName ); + }; + + // more advanced version lets you pass args (i.e. called parameters or anything else of interest) + // no macro for this one, since no easy way to pass through the args as well as the funcname + GLMFuncLogger( const char *funcName, char *fmt, ... ) + { + m_funcName = funcName; + m_earlyOut = false; + + // this acts like GLMPrintf here + // all the indent policy is down in GLMPrintfVA + // which means we need to inject a ">" at the front of the format string to make this work... sigh. + + char modifiedFmt[2000]; + modifiedFmt[0] = '>'; + strcpy( modifiedFmt+1, fmt ); + + va_list vargs; + va_start(vargs, fmt); + GLMPrintfVA( modifiedFmt, vargs ); + va_end( vargs ); + } + + ~GLMFuncLogger( ) + { + if (m_earlyOut) + { + GLMPrintf( "<%s (early out)", m_funcName ); + } + else + { + GLMPrintf( "<%s", m_funcName ); + } + }; + + void EarlyOut( void ) + { + m_earlyOut = true; + }; + + const char *m_funcName; // set at construction time + bool m_earlyOut; +}; + +// handy macro to go with the function tracking class +#define GLM_FUNC GLMFuncLogger _logger_ ( __FUNCTION__ ) +#else +#define GLM_FUNC tmZone( TELEMETRY_LEVEL1, TMZF_NONE, "%s", __FUNCTION__ ) +#endif + + +// class to keep an in-memory mirror of a file which may be getting edited during run +class CGLMFileMirror +{ +public: + CGLMFileMirror( char *fullpath ); // just associates mirror with file. if file exists it will be read. + //if non existent it will be created with size zero + ~CGLMFileMirror( ); + + bool HasData( void ); // see if data avail + void GetData( char **dataPtr, uint *dataSizePtr ); // read it out + void SetData( char *data, uint dataSize ); // put data in (and write it to disk) + bool PollForChanges( void ); // check disk copy. If different, read it back in and return true. + + void UpdateStatInfo( void ); // make sure stat info is current for our file + void ReadFile( void ); + void WriteFile( void ); + + void OpenInEditor( bool foreground=false ); // pass TRUE if you would like the editor to pop to foreground + + /// how about a "wait for change" method.. + + char *m_path; // fullpath to file + bool m_exists; + struct stat m_stat; // stat results for the file (last time checked) + + char *m_data; // content of file + uint m_size; // length of content + +}; + +// class based on the file mirror, that makes it easy to edit them outside the app. + +// it receives an initial block of text from the engine, and hashes it. ("orig") +// it munges it by duplicating all the text after the "!!" line, and appending it in commented form. ("munged") +// a mirror file is activated, using a filename based on the hash from the orig text. +// if there is already content on disk matching that filename, use that content *unless* the 'blitz' parameter is set. +// (i.e. engine is instructing this subsystem to wipe out any old/modified variants of the text) + + +class CGLMEditableTextItem +{ +public: + CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix = NULL ); // create a text blob from text source, optional filename suffix + ~CGLMEditableTextItem( ); + + bool HasData( void ); + bool PollForChanges( void ); // return true if stale i.e. you need to get a new edition + void GetCurrentText( char **textOut, uint *sizeOut ); // query for read access to the active blob (could be the original, could be external edited copy) + void OpenInEditor( bool foreground=false ); // call user attention to this text + + // internal methods + void GenHashOfOrigText( void ); + void GenBaseNameAndFullPath( char *prefix, char *suffix ); + void GenMungedText( bool fromMirror ); + + // members + // orig + uint m_origSize; + char *m_origText; // what was submitted + unsigned char m_origDigest[MD5_DIGEST_LENGTH]; // digest of what was submitted + + // munged + uint m_mungedSize; + char *m_mungedText; // re-processed edition, initial content submission to the file mirror + + // mirror + char *m_mirrorBaseName; // generated from the hash of the orig text, plus the label / prefix + char *m_mirrorFullPath; // base name + CGLMFileMirror *m_mirror; // file mirror itself. holds "official" copy for GetCurrentText to return. +}; + + +// debug font +extern unsigned char g_glmDebugFontMap[16384]; + +// class for cracking multi-part text blobs +// sections are demarcated by beginning-of-line markers submitted in a table by the caller + +struct GLMTextSection +{ + int m_markerIndex; // based on table of markers passed in to constructor + uint m_textOffset; // where is the text - offset + int m_textLength; // how big is the section +}; + +class CGLMTextSectioner +{ +public: + CGLMTextSectioner( char *text, int textSize, const char **markers ); // constructor finds all the sections + ~CGLMTextSectioner( ); + + int Count( void ); // how many sections found + void GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut ); + // find section, size, what marker + // note that more than one section can be marked similarly. + // so policy isn't made here, you walk the sections and decide what to do if there are dupes. + + //members + + //section table + CUtlVector< GLMTextSection > m_sectionTable; +}; + +#ifndef OSX +void GLMGPUTimestampManagerInit(); +void GLMGPUTimestampManagerDeinit(); +void GLMGPUTimestampManagerTick(); +#endif + +#endif // GLMBASICS_H diff --git a/public/togles/linuxwin/glmgrext.h b/public/togles/linuxwin/glmgrext.h new file mode 100644 index 00000000..393942a7 --- /dev/null +++ b/public/togles/linuxwin/glmgrext.h @@ -0,0 +1,123 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glmgrext.h +// helper file for extension testing and runtime importing of entry points +// +//=============================================================================== + +#pragma once + +#ifdef OSX +#include +#include +#elif defined(DX_TO_GL_ABSTRACTION) +#include +#include +#else +#error +#endif + +#ifndef GL_EXT_framebuffer_sRGB + #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 + #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif + +#ifndef ARB_texture_rg + #define GL_COMPRESSED_RED 0x8225 + #define GL_COMPRESSED_RG 0x8226 + #define GL_RG 0x8227 + #define GL_RG_INTEGER 0x8228 + #define GL_R8 0x8229 + #define GL_R16 0x822A + #define GL_RG8 0x822B + #define GL_RG16 0x822C + #define GL_R16F 0x822D + #define GL_R32F 0x822E + #define GL_RG16F 0x822F + #define GL_RG32F 0x8230 + #define GL_R8I 0x8231 + #define GL_R8UI 0x8232 + #define GL_R16I 0x8233 + #define GL_R16UI 0x8234 + #define GL_R32I 0x8235 + #define GL_R32UI 0x8236 + #define GL_RG8I 0x8237 + #define GL_RG8UI 0x8238 + #define GL_RG16I 0x8239 + #define GL_RG16UI 0x823A + #define GL_RG32I 0x823B + #define GL_RG32UI 0x823C +#endif + +#ifndef GL_EXT_bindable_uniform + #define GL_UNIFORM_BUFFER_EXT 0x8DEE +#endif + +// unpublished extension enums (thus the "X") + +// from EXT_framebuffer_multisample_blit_scaled.. +#define XGL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define XGL_SCALED_RESOLVE_NICEST_EXT 0x90BB + +#ifndef GL_TEXTURE_MINIMIZE_STORAGE_APPLE +#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6 +#endif + +#ifndef GL_ALL_COMPLETED_NV +#define GL_ALL_COMPLETED_NV 0x84F2 +#endif + +#ifndef GL_MAP_READ_BIT +#define GL_MAP_READ_BIT 0x0001 +#endif + +#ifndef GL_MAP_WRITE_BIT +#define GL_MAP_WRITE_BIT 0x0002 +#endif + +#ifndef GL_MAP_INVALIDATE_RANGE_BIT +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#endif + +#ifndef GL_MAP_INVALIDATE_BUFFER_BIT +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#endif + +#ifndef GL_MAP_FLUSH_EXPLICIT_BIT +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#endif + +#ifndef GL_MAP_UNSYNCHRONIZED_BIT +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#endif + +#ifndef GL_MAP_PERSISTENT_BIT +#define GL_MAP_PERSISTENT_BIT 0x0040 +#endif + +#ifndef GL_MAP_COHERENT_BIT +#define GL_MAP_COHERENT_BIT 0x0080 +#endif + diff --git a/public/togles/rendermechanism.h b/public/togles/rendermechanism.h new file mode 100644 index 00000000..47be332d --- /dev/null +++ b/public/togles/rendermechanism.h @@ -0,0 +1,73 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +#ifndef RENDERMECHANISM_H +#define RENDERMECHANISM_H + +#if defined(DX_TO_GL_ABSTRACTION) + +#undef PROTECTED_THINGS_ENABLE + +#include +#include + +#include "tier0/basetypes.h" +#include "tier0/platform.h" + +#include "togl/linuxwin/glmdebug.h" +#include "togl/linuxwin/glbase.h" +#include "togl/linuxwin/glentrypoints.h" +#include "togl/linuxwin/glmdisplay.h" +#include "togl/linuxwin/glmdisplaydb.h" +#include "togl/linuxwin/glmgrbasics.h" +#include "togl/linuxwin/glmgrext.h" +#include "togl/linuxwin/cglmbuffer.h" +#include "togl/linuxwin/cglmtex.h" +#include "togl/linuxwin/cglmfbo.h" +#include "togl/linuxwin/cglmprogram.h" +#include "togl/linuxwin/cglmquery.h" +#include "togl/linuxwin/glmgr.h" +#include "togl/linuxwin/dxabstract_types.h" +#include "togl/linuxwin/dxabstract.h" + +#else + //USE_ACTUAL_DX + #ifdef WIN32 + #ifdef _X360 + #include "d3d9.h" + #include "d3dx9.h" + #else + #include + #include "../../dx9sdk/include/d3d9.h" + #include "../../dx9sdk/include/d3dx9.h" + #endif + typedef HWND VD3DHWND; + #endif + + #define GLMPRINTF(args) + #define GLMPRINTSTR(args) + #define GLMPRINTTEXT(args) +#endif // defined(DX_TO_GL_ABSTRACTION) + +#endif // RENDERMECHANISM_H diff --git a/togles/linuxwin/asanstubs.cpp b/togles/linuxwin/asanstubs.cpp new file mode 100644 index 00000000..ee4ce50b --- /dev/null +++ b/togles/linuxwin/asanstubs.cpp @@ -0,0 +1,17 @@ +typedef unsigned int uint; + +#include "../public/togl/linuxwin/glmdisplay.h" +#include "../public/togl/linuxwin/glmdisplaydb.h" + +void GLMDisplayDB::PopulateRenderers( void ) { } +void GLMDisplayDB::PopulateFakeAdapters( uint realRendererIndex ) { } // fake adapters = one real adapter times however many displays are on +void GLMDisplayDB::Populate( void ) { } +int GLMDisplayDB::GetFakeAdapterCount( void ) { return 1; } +bool GLMDisplayDB::GetFakeAdapterInfo( int fakeAdapterIndex, int *rendererOut, int *displayOut, GLMRendererInfoFields *rendererInfoOut, GLMDisplayInfoFields *displayInfoOut ) { return true; } +int GLMDisplayDB::GetRendererCount( void ) { return 1; } +bool GLMDisplayDB::GetRendererInfo( int rendererIndex, GLMRendererInfoFields *infoOut ) { return true; } +int GLMDisplayDB::GetDisplayCount( int rendererIndex ) { return 1; } +bool GLMDisplayDB::GetDisplayInfo( int rendererIndex, int displayIndex, GLMDisplayInfoFields *infoOut ) { return true; } +int GLMDisplayDB::GetModeCount( int rendererIndex, int displayIndex ) { } +bool GLMDisplayDB::GetModeInfo( int rendererIndex, int displayIndex, int modeIndex, GLMDisplayModeInfoFields *infoOut ) { return false; } +void GLMDisplayDB::Dump( void ) { } diff --git a/togles/linuxwin/cglmbuffer.cpp b/togles/linuxwin/cglmbuffer.cpp new file mode 100644 index 00000000..ecba047b --- /dev/null +++ b/togles/linuxwin/cglmbuffer.cpp @@ -0,0 +1,1215 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmbuffer.cpp +// +//=============================================================================== + +#include "togl/rendermechanism.h" + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + +// 7LS TODO : took out cmdline here +bool g_bUsePseudoBufs = false; //( Plat_GetCommandLineA() ) ? ( strstr( Plat_GetCommandLineA(), "-gl_enable_pseudobufs" ) != NULL ) : false; +#ifdef OSX +// Significant perf degradation on some OSX parts if static buffers not disabled +bool g_bDisableStaticBuffer = true; +#else +bool g_bDisableStaticBuffer = false; //( Plat_GetCommandLineA() ) ? ( strstr( Plat_GetCommandLineA(), "-gl_disable_static_buffer" ) != NULL ) : false; +#endif + +// http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt +// http://www.opengl.org/registry/specs/ARB/pixel_buffer_object.txt + +// gl_bufmode: zero means we mark all vertex/index buffers static + +// non zero means buffers are initially marked static.. +// ->but can shift to dynamic upon first 'discard' (orphaning) + +// #define REPORT_LOCK_TIME 0 + +ConVar gl_bufmode( "gl_bufmode", "1" ); + +char ALIGN16 CGLMBuffer::m_StaticBuffers[ GL_MAX_STATIC_BUFFERS ][ GL_STATIC_BUFFER_SIZE ] ALIGN16_POST; +bool CGLMBuffer::m_bStaticBufferUsed[ GL_MAX_STATIC_BUFFERS ]; + +extern bool g_bNullD3DDevice; + +//===========================================================================// + +static uint gMaxPersistentOffset[kGLMNumBufferTypes] = +{ + 0, + 0, + 0, + 0 +}; +CON_COMMAND( gl_persistent_buffer_max_offset, "" ) +{ + ConMsg( "OpenGL Persistent buffer max offset :\n" ); + ConMsg( " Vertex buffer : %d bytes (%f MB) \n", gMaxPersistentOffset[kGLMVertexBuffer], gMaxPersistentOffset[kGLMVertexBuffer] / (1024.0f*1024.0f) ); + ConMsg( " Index buffer : %d bytes (%f MB) \n", gMaxPersistentOffset[kGLMIndexBuffer], gMaxPersistentOffset[kGLMIndexBuffer] / (1024.0f*1024.0f) ); + ConMsg( " Uniform buffer : %d bytes (%f MB) \n", gMaxPersistentOffset[kGLMUniformBuffer], gMaxPersistentOffset[kGLMUniformBuffer] / (1024.0f*1024.0f) ); + ConMsg( " Pixel buffer : %d bytes (%f MB) \n", gMaxPersistentOffset[kGLMPixelBuffer], gMaxPersistentOffset[kGLMPixelBuffer] / (1024.0f*1024.0f) ); +} + +CPersistentBuffer::CPersistentBuffer() +: + m_nSize( 0 ) + , m_nHandle( 0 ) + , m_pImmutablePersistentBuf( NULL ) + , m_nOffset( 0 ) +#ifdef HAVE_GL_ARB_SYNC + , m_nSyncObj( 0 ) +#endif +{} + +CPersistentBuffer::~CPersistentBuffer() +{ + Deinit(); +} + +void CPersistentBuffer::Init( EGLMBufferType type,uint nSize ) +{ + Assert( gGL->m_bHave_GL_ARB_buffer_storage ); + Assert( gGL->m_bHave_GL_ARB_map_buffer_range ); + + m_nSize = nSize; + m_nOffset = 0; + m_type = type; + + switch ( type ) + { + case kGLMVertexBuffer: m_buffGLTarget = GL_ARRAY_BUFFER_ARB; break; + case kGLMIndexBuffer: m_buffGLTarget = GL_ELEMENT_ARRAY_BUFFER_ARB; break; + + default: Assert( nSize == 0 ); + } + + if ( m_nSize > 0 ) + { + gGL->glGenBuffersARB( 1, &m_nHandle ); + gGL->glBindBufferARB( m_buffGLTarget, m_nHandle ); + + // Create persistent immutable buffer that we will permanently map. This buffer can be written from any thread (not just + // the renderthread) + gGL->glBufferStorage( m_buffGLTarget, m_nSize, (const GLvoid *)NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT ); // V_GL_REQ: GL_ARB_buffer_storage, GL_ARB_map_buffer_range, GL_VERSION_4_4 + + // Map the buffer for all of eternity. Pointer can be used from multiple threads. + m_pImmutablePersistentBuf = gGL->glMapBufferRange( m_buffGLTarget, 0, m_nSize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT ); // V_GL_REQ: GL_ARB_map_buffer_range, GL_ARB_buffer_storage, GL_VERSION_4_4 + Assert( m_pImmutablePersistentBuf != NULL ); + } +} + +void CPersistentBuffer::Deinit() +{ + if ( !m_pImmutablePersistentBuf ) + { + return; + } + + BlockUntilNotBusy(); + + gGL->glBindBufferARB( m_buffGLTarget, m_nHandle ); + gGL->glUnmapBuffer( m_buffGLTarget ); + gGL->glBindBufferARB( m_buffGLTarget, 0 ); + + gGL->glDeleteBuffersARB( 1, &m_nHandle ); + + m_nSize = 0; + m_nHandle = 0; + m_nOffset = 0; + m_pImmutablePersistentBuf = NULL; +} + +void CPersistentBuffer::InsertFence() +{ +#ifdef HAVE_GL_ARB_SYNC + if (m_nSyncObj) + { + gGL->glDeleteSync( m_nSyncObj ); + } + + m_nSyncObj = gGL->glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 ); +#endif +} + +void CPersistentBuffer::BlockUntilNotBusy() +{ +#ifdef HAVE_GL_ARB_SYNC + if (m_nSyncObj) + { + gGL->glClientWaitSync( m_nSyncObj, GL_SYNC_FLUSH_COMMANDS_BIT, 3000000000000ULL ); + + gGL->glDeleteSync( m_nSyncObj ); + + m_nSyncObj = 0; + } +#endif + m_nOffset = 0; +} + +void CPersistentBuffer::Append( uint nSize ) +{ + m_nOffset += nSize; + Assert( m_nOffset <= m_nSize ); + + gMaxPersistentOffset[m_type] = Max( m_nOffset, gMaxPersistentOffset[m_type] ); +} + +//===========================================================================// + +#if GL_ENABLE_INDEX_VERIFICATION + +CGLMBufferSpanManager::CGLMBufferSpanManager() : + m_pCtx( NULL ), + m_nBufType( kGLMVertexBuffer ), + m_nBufSize( 0 ), + m_bDynamic( false ), + m_nSpanEndMax( -1 ), + m_nNumAllocatedBufs( 0 ), + m_nTotalBytesAllocated( 0 ) +{ +} + +CGLMBufferSpanManager::~CGLMBufferSpanManager() +{ + Deinit(); +} + +void CGLMBufferSpanManager::Init( GLMContext *pContext, EGLMBufferType nBufType, uint nInitialCapacity, uint nBufSize, bool bDynamic ) +{ + Assert( ( nBufType == kGLMIndexBuffer ) || ( nBufType == kGLMVertexBuffer ) ); + + m_pCtx = pContext; + m_nBufType = nBufType; + + m_nBufSize = nBufSize; + m_bDynamic = bDynamic; + + m_ActiveSpans.EnsureCapacity( nInitialCapacity ); + m_DeletedSpans.EnsureCapacity( nInitialCapacity ); + m_nSpanEndMax = -1; + + m_nNumAllocatedBufs = 0; + m_nTotalBytesAllocated = 0; +} + +bool CGLMBufferSpanManager::AllocDynamicBuf( uint nSize, GLDynamicBuf_t &buf ) +{ + buf.m_nGLType = GetGLBufType(); + buf.m_nActualBufSize = nSize; + buf.m_nHandle = 0; + buf.m_nSize = nSize; + + m_nNumAllocatedBufs++; + m_nTotalBytesAllocated += buf.m_nActualBufSize; + + return true; +} + +void CGLMBufferSpanManager::ReleaseDynamicBuf( GLDynamicBuf_t &buf ) +{ + Assert( m_nNumAllocatedBufs > 0 ); + m_nNumAllocatedBufs--; + + Assert( m_nTotalBytesAllocated >= (int)buf.m_nActualBufSize ); + m_nTotalBytesAllocated -= buf.m_nActualBufSize; +} + +void CGLMBufferSpanManager::Deinit() +{ + if ( !m_pCtx ) + return; + + for ( int i = 0; i < m_ActiveSpans.Count(); i++ ) + { + if ( m_ActiveSpans[i].m_bOriginalAlloc ) + ReleaseDynamicBuf( m_ActiveSpans[i].m_buf ); + } + m_ActiveSpans.SetCountNonDestructively( 0 ); + + for ( int i = 0; i < m_DeletedSpans.Count(); i++ ) + ReleaseDynamicBuf( m_DeletedSpans[i].m_buf ); + + m_DeletedSpans.SetCountNonDestructively( 0 ); + + m_pCtx->BindGLBufferToCtx( GetGLBufType(), NULL, true ); + + m_nSpanEndMax = -1; + m_pCtx = NULL; + + Assert( !m_nNumAllocatedBufs ); + Assert( !m_nTotalBytesAllocated ); +} + +void CGLMBufferSpanManager::DiscardAllSpans() +{ + for ( int i = 0; i < m_ActiveSpans.Count(); i++ ) + { + if ( m_ActiveSpans[i].m_bOriginalAlloc ) + ReleaseDynamicBuf( m_ActiveSpans[i].m_buf ); + } + m_ActiveSpans.SetCountNonDestructively( 0 ); + + for ( int i = 0; i < m_DeletedSpans.Count(); i++ ) + ReleaseDynamicBuf( m_DeletedSpans[i].m_buf ); + + m_DeletedSpans.SetCountNonDestructively( 0 ); + + m_nSpanEndMax = -1; + + Assert( !m_nNumAllocatedBufs ); + Assert( !m_nTotalBytesAllocated ); +} + +// TODO: Add logic to detect incorrect usage of bNoOverwrite. +CGLMBufferSpanManager::ActiveSpan_t *CGLMBufferSpanManager::AddSpan( uint nOffset, uint nMaxSize, uint nActualSize, bool bDiscard, bool bNoOverwrite ) +{ + (void)bDiscard; + (void)bNoOverwrite; + + const uint nStart = nOffset; + const uint nSize = nActualSize; + const uint nEnd = nStart + nSize; + + GLDynamicBuf_t newDynamicBuf; + if ( !AllocDynamicBuf( nSize, newDynamicBuf ) ) + { + DXABSTRACT_BREAK_ON_ERROR(); + return NULL; + } + + if ( (int)nStart < m_nSpanEndMax ) + { + // Lock region potentially overlaps another previously locked region (since the last discard) - this is a very rarely (if ever) taken path in Source1 games. + int i = 0; + while ( i < m_ActiveSpans.Count() ) + { + ActiveSpan_t &existingSpan = m_ActiveSpans[i]; + if ( ( nEnd <= existingSpan.m_nStart ) || ( nStart >= existingSpan.m_nEnd ) ) + { + i++; + continue; + } + + Warning( "GL performance warning: AddSpan() at offset %u max size %u actual size %u, on a %s %s buffer of total size %u, overwrites an existing active lock span at offset %u size %u!\n", + nOffset, nMaxSize, nActualSize, + m_bDynamic ? "dynamic" : "static", ( m_nBufType == kGLMVertexBuffer ) ? "vertex" : "index", m_nBufSize, + existingSpan.m_nStart, existingSpan.m_nEnd - existingSpan.m_nStart ); + + if ( ( nStart <= existingSpan.m_nStart ) && ( nEnd >= existingSpan.m_nEnd ) ) + { + if ( existingSpan.m_bOriginalAlloc ) + { + // New span totally covers existing span + // Can't immediately delete the span's buffer because it could be referred to by another (child) span. + m_DeletedSpans.AddToTail( existingSpan ); + } + + // Delete span + m_ActiveSpans[i] = m_ActiveSpans[ m_ActiveSpans.Count() - 1 ]; + m_ActiveSpans.SetCountNonDestructively( m_ActiveSpans.Count() - 1 ); + continue; + } + + // New span does NOT fully cover the existing span (partial overlap) + if ( nStart < existingSpan.m_nStart ) + { + // New span starts before existing span, but ends somewhere inside, so shrink it (start moves "right") + existingSpan.m_nStart = nEnd; + } + else if ( nEnd > existingSpan.m_nEnd ) + { + // New span ends after existing span, but starts somewhere inside (end moves "left") + existingSpan.m_nEnd = nStart; + } + else //if ( ( nStart >= existingSpan.m_nStart ) && ( nEnd <= existingSpan.m_nEnd ) ) + { + // New span lies inside of existing span + if ( nStart == existingSpan.m_nStart ) + { + // New span begins inside the existing span (start moves "right") + existingSpan.m_nStart = nEnd; + } + else + { + if ( nEnd < existingSpan.m_nEnd ) + { + // New span is completely inside existing span + m_ActiveSpans.AddToTail( ActiveSpan_t( nEnd, existingSpan.m_nEnd, existingSpan.m_buf, false ) ); + } + + existingSpan.m_nEnd = nStart; + } + } + + Assert( existingSpan.m_nStart < existingSpan.m_nEnd ); + i++; + } + } + + newDynamicBuf.m_nLockOffset = nStart; + newDynamicBuf.m_nLockSize = nSize; + + m_ActiveSpans.AddToTail( ActiveSpan_t( nStart, nEnd, newDynamicBuf, true ) ); + m_nSpanEndMax = MAX( m_nSpanEndMax, (int)nEnd ); + + return &m_ActiveSpans.Tail(); +} + +bool CGLMBufferSpanManager::IsValid( uint nOffset, uint nSize ) const +{ + const uint nEnd = nOffset + nSize; + + int nTotalBytesRemaining = nSize; + + for ( int i = m_ActiveSpans.Count() - 1; i >= 0; --i ) + { + const ActiveSpan_t &span = m_ActiveSpans[i]; + + if ( span.m_nEnd <= nOffset ) + continue; + if ( span.m_nStart >= nEnd ) + continue; + + uint nIntersectStart = MAX( span.m_nStart, nOffset ); + uint nIntersectEnd = MIN( span.m_nEnd, nEnd ); + Assert( nIntersectStart <= nIntersectEnd ); + + nTotalBytesRemaining -= ( nIntersectEnd - nIntersectStart ); + Assert( nTotalBytesRemaining >= 0 ); + if ( nTotalBytesRemaining <= 0 ) + break; + } + + return nTotalBytesRemaining == 0; +} +#endif // GL_ENABLE_INDEX_VERIFICATION + +// glBufferSubData() with a max size limit, to work around NVidia's threaded driver limits (anything > than roughly 256KB triggers a sync with the server thread). +void glBufferSubDataMaxSize( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data, uint nMaxSizePerCall ) +{ +#if TOGL_SUPPORT_NULL_DEVICE + if ( g_bNullD3DDevice ) return; +#endif + + uint nBytesLeft = size; + uint nOfs = 0; + while ( nBytesLeft ) + { + uint nBytesToCopy = MIN( nMaxSizePerCall, nBytesLeft ); + + gGL->glBufferSubData( target, offset + nOfs, nBytesToCopy, static_cast( data ) + nOfs ); + + nBytesLeft -= nBytesToCopy; + nOfs += nBytesToCopy; + } +} + +CGLMBuffer::CGLMBuffer( GLMContext *pCtx, EGLMBufferType type, uint size, uint options ) +{ + m_pCtx = pCtx; + m_type = type; + + m_bDynamic = ( options & GLMBufferOptionDynamic ) != 0; + + switch ( m_type ) + { + case kGLMVertexBuffer: m_buffGLTarget = GL_ARRAY_BUFFER_ARB; break; + case kGLMIndexBuffer: m_buffGLTarget = GL_ELEMENT_ARRAY_BUFFER_ARB; break; + case kGLMUniformBuffer: m_buffGLTarget = GL_UNIFORM_BUFFER_EXT; break; + case kGLMPixelBuffer: m_buffGLTarget = GL_PIXEL_UNPACK_BUFFER_ARB; break; + + default: Assert(!"Unknown buffer type" ); DXABSTRACT_BREAK_ON_ERROR(); + } + + m_nSize = size; + m_nActualSize = size; + m_bMapped = false; + m_pLastMappedAddress = NULL; + + m_pStaticBuffer = NULL; + m_nPinnedMemoryOfs = -1; + m_nPersistentBufferStartOffset = 0; + m_bUsingPersistentBuffer = false; + + m_bEnableAsyncMap = false; + m_bEnableExplicitFlush = false; + m_dirtyMinOffset = m_dirtyMaxOffset = 0; // adjust/grow on lock, clear on unlock + + m_pCtx->CheckCurrent(); + m_nRevision = rand(); + + m_pPseudoBuf = NULL; + m_pActualPseudoBuf = NULL; + + m_bPseudo = false; + +#if GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION + m_bPseudo = true; +#endif + +#if GL_ENABLE_INDEX_VERIFICATION + m_BufferSpanManager.Init( m_pCtx, m_type, 512, m_nSize, m_bDynamic ); + + if ( m_type == kGLMIndexBuffer ) + m_bPseudo = true; +#endif + + if ( g_bUsePseudoBufs && m_bDynamic ) + { + m_bPseudo = true; + } + + if ( m_bPseudo ) + { + m_nHandle = 0; + +#if GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION + m_nDirtyRangeStart = 0xFFFFFFFF; + m_nDirtyRangeEnd = 0; + + m_nActualSize = ALIGN_VALUE( ( m_nSize + sizeof( uint32 ) ), 4096 ); + m_pPseudoBuf = m_pActualPseudoBuf = (char *)VirtualAlloc( NULL, m_nActualSize, MEM_COMMIT, PAGE_READWRITE ); + if ( !m_pPseudoBuf ) + { + Error( "VirtualAlloc() failed!\n" ); + } + + for ( uint i = 0; i < m_nActualSize / sizeof( uint32 ); i++ ) + { + reinterpret_cast< uint32 * >( m_pPseudoBuf )[i] = 0xDEADBEEF; + } + + DWORD nOldProtect; + BOOL bResult = VirtualProtect( m_pActualPseudoBuf, m_nActualSize, PAGE_READONLY, &nOldProtect ); + if ( !bResult ) + { + Error( "VirtualProtect() failed!\n" ); + } +#else + m_nActualSize = size + 15; + m_pActualPseudoBuf = (char*)malloc( m_nActualSize ); + m_pPseudoBuf = (char*)(((intp)m_pActualPseudoBuf + 15) & ~15); +#endif + + m_pCtx->BindBufferToCtx( m_type, NULL ); // exit with no buffer bound + } + else + { + gGL->glGenBuffersARB( 1, &m_nHandle ); + + m_pCtx->BindBufferToCtx( m_type, this ); // causes glBindBufferARB + + // buffers start out static, but if they get orphaned and gl_bufmode is non zero, + // then they will get flipped to dynamic. + + GLenum hint = GL_STATIC_DRAW_ARB; + switch (m_type) + { + case kGLMVertexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; break; + case kGLMIndexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; break; + case kGLMUniformBuffer: hint = GL_DYNAMIC_DRAW_ARB; break; + case kGLMPixelBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; break; + + default: Assert(!"Unknown buffer type" ); DXABSTRACT_BREAK_ON_ERROR(); + } + + gGL->glBufferDataARB( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); // may ultimately need more hints to set the usage correctly (esp for streaming) + + SetModes( false, true, true ); + + m_pCtx->BindBufferToCtx( m_type, NULL ); // unbind me + } +} + +CGLMBuffer::~CGLMBuffer( ) +{ + m_pCtx->CheckCurrent(); + + if ( m_bPseudo ) + { +#if GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION + BOOL bResult = VirtualFree( m_pActualPseudoBuf, 0, MEM_RELEASE ); + if ( !bResult ) + { + Error( "VirtualFree() failed!\n" ); + } +#else + free( m_pActualPseudoBuf ); +#endif + m_pActualPseudoBuf = NULL; + m_pPseudoBuf = NULL; + } + else + { + gGL->glDeleteBuffersARB( 1, &m_nHandle ); + } + + m_pCtx = NULL; + m_nHandle = 0; + + m_pLastMappedAddress = NULL; + +#if GL_ENABLE_INDEX_VERIFICATION + m_BufferSpanManager.Deinit(); +#endif +} + +void CGLMBuffer::SetModes( bool bAsyncMap, bool bExplicitFlush, bool bForce ) +{ + // assumes buffer is bound. called by constructor and by Lock. + + if ( m_bPseudo ) + { + // ignore it... + } + else + { + if ( bForce || ( m_bEnableAsyncMap != bAsyncMap ) ) + { + // note the sense of the parameter, it's TRUE if you *want* serialization, so for async you turn it to false. + if ( ( gGL->m_bHave_GL_APPLE_flush_buffer_range ) && ( !gGL->m_bHave_GL_ARB_map_buffer_range ) ) + { + gGL->glBufferParameteriAPPLE( m_buffGLTarget, GL_BUFFER_SERIALIZED_MODIFY_APPLE, bAsyncMap == false ); + } + m_bEnableAsyncMap = bAsyncMap; + } + + if ( bForce || ( m_bEnableExplicitFlush != bExplicitFlush ) ) + { + // Note that the GL_ARB_map_buffer_range path handles this in the glMapBufferRange() call in Lock(). + // note the sense of the parameter, it's TRUE if you *want* auto-flush-on-unmap, so for explicit-flush, you turn it to false. + if ( ( gGL->m_bHave_GL_APPLE_flush_buffer_range ) && ( !gGL->m_bHave_GL_ARB_map_buffer_range ) ) + { + gGL->glBufferParameteriAPPLE( m_buffGLTarget, GL_BUFFER_FLUSHING_UNMAP_APPLE, bExplicitFlush == false ); + } + m_bEnableExplicitFlush = bExplicitFlush; + } + } +} + +#if GL_ENABLE_INDEX_VERIFICATION +bool CGLMBuffer::IsSpanValid( uint nOffset, uint nSize ) const +{ + return m_BufferSpanManager.IsValid( nOffset, nSize ); +} +#endif + +void CGLMBuffer::FlushRange( uint offset, uint size ) +{ + if ( m_pStaticBuffer ) + { + } + else if ( m_bPseudo ) + { + // nothing to do + } + else + { +#ifdef REPORT_LOCK_TIME + double flStart = Plat_FloatTime(); +#endif + + // assumes buffer is bound. + if ( gGL->m_bHave_GL_ARB_map_buffer_range ) + { + gGL->glFlushMappedBufferRange( m_buffGLTarget, (GLintptr)( offset - m_dirtyMinOffset ), (GLsizeiptr)size ); + } + else if ( gGL->m_bHave_GL_APPLE_flush_buffer_range ) + { + gGL->glFlushMappedBufferRangeAPPLE( m_buffGLTarget, (GLintptr)offset, (GLsizeiptr)size ); + } + +#ifdef REPORT_LOCK_TIME + double flEnd = Plat_FloatTime(); + if ( flEnd - flStart > 5.0 / 1000.0 ) + { + int nDelta = ( int )( ( flEnd - flStart ) * 1000 ); + if ( nDelta > 2 ) + { + Msg( "**** " ); + } + Msg( "glFlushMappedBufferRange Time %d: ( Name=%d BufSize=%d ) Target=%p Offset=%d FlushSize=%d\n", nDelta, m_nHandle, m_nSize, m_buffGLTarget, offset - m_dirtyMinOffset, size ); + } +#endif + + // If you don't have any extension support here, you'll flush the whole buffer on unmap. Performance loss, but it's still safe and correct. + } +} + +void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) +{ +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmPIXEvent( "CGLMBuffer::Lock" ); + g_TelemetryGPUStats.m_nTotalBufferLocksAndUnlocks++; +#endif + + char *resultPtr = NULL; + + if ( m_bMapped ) + { + DXABSTRACT_BREAK_ON_ERROR(); + return; + } + + m_pCtx->CheckCurrent(); + + Assert( pParams->m_nSize ); + + m_LockParams = *pParams; + + if ( pParams->m_nOffset >= m_nSize ) + { + DXABSTRACT_BREAK_ON_ERROR(); + return; + } + + if ( ( pParams->m_nOffset + pParams->m_nSize ) > m_nSize) + { + DXABSTRACT_BREAK_ON_ERROR(); + return; + } + +#if GL_ENABLE_INDEX_VERIFICATION + if ( pParams->m_bDiscard ) + { + m_BufferSpanManager.DiscardAllSpans(); + } +#endif + + m_pStaticBuffer = NULL; + bool bUsingPersistentBuffer = false; + + uint padding = 0; + if ( m_bDynamic && gGL->m_bHave_GL_ARB_buffer_storage ) + { + // Compute padding to add to make sure the start offset is valid + CPersistentBuffer *pTempBuffer = m_pCtx->GetCurPersistentBuffer( m_type ); + uint persistentBufferOffset = pTempBuffer->GetOffset(); + + if (pParams->m_nOffset > persistentBufferOffset) + { + // Make sure the start offset if valid (adding padding to the persistent buffer) + padding = pParams->m_nOffset - persistentBufferOffset; + } + } + + if ( m_bPseudo ) + { + if ( pParams->m_bDiscard ) + { + m_nRevision++; + } + + // async map modes are a no-op + + // calc lock address + resultPtr = m_pPseudoBuf + pParams->m_nOffset; + +#if GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION + BOOL bResult; + DWORD nOldProtect; + if ( pParams->m_bDiscard ) + { + bResult = VirtualProtect( m_pActualPseudoBuf, m_nSize, PAGE_READWRITE, &nOldProtect ); + if ( !bResult ) + { + Error( "VirtualProtect() failed!\n" ); + } + + m_nDirtyRangeStart = 0xFFFFFFFF; + m_nDirtyRangeEnd = 0; + + for ( uint i = 0; i < m_nSize / sizeof( uint32 ); i++ ) + { + reinterpret_cast< uint32 * >( m_pPseudoBuf )[i] = 0xDEADBEEF; + } + + bResult = VirtualProtect( m_pActualPseudoBuf, m_nSize, PAGE_READONLY, &nOldProtect ); + if ( !bResult ) + { + Error( "VirtualProtect() failed!\n" ); + } + } + uint nProtectOfs = m_LockParams.m_nOffset & 4095; + uint nProtectEnd = ( m_LockParams.m_nOffset + m_LockParams.m_nSize + 4095 ) & ~4095; + uint nProtectSize = nProtectEnd - nProtectOfs; + bResult = VirtualProtect( m_pActualPseudoBuf + nProtectOfs, nProtectSize, PAGE_READWRITE, &nOldProtect ); + if ( !bResult ) + { + Error( "VirtualProtect() failed!\n" ); + } +#endif + } + else if ( m_bDynamic && gGL->m_bHave_GL_ARB_buffer_storage && ( m_pCtx->GetCurPersistentBuffer( m_type )->GetBytesRemaining() >= ( pParams->m_nSize + padding ) ) ) + { + CPersistentBuffer *pTempBuffer = m_pCtx->GetCurPersistentBuffer( m_type ); + + // Make sure the start offset if valid (adding padding to the persistent buffer) + pTempBuffer->Append( padding ); + + uint persistentBufferOffset = pTempBuffer->GetOffset(); + uint startOffset = persistentBufferOffset - pParams->m_nOffset; + + if ( pParams->m_bDiscard || ( startOffset != m_nPersistentBufferStartOffset ) ) + { + m_nRevision++; + // Offset to be added to the vertex and index buffer when setting the vertex and index buffer (before drawing) + // Since we are using a immutable buffer storage, the persistent buffer is actually bigger than + // buffer size requested upon creation. We keep appending to the end of the persistent buffer + // and therefore need to keep track of the start of the actual buffer (in the persistent one) + m_nPersistentBufferStartOffset = startOffset; + + //DevMsg( "Discard (%s): startOffset = %d\n", pParams->m_bDiscard ? "true" : "false", m_nPersistentBufferStartOffset ); + } + + resultPtr = static_cast(pTempBuffer->GetPtr()) + persistentBufferOffset; + bUsingPersistentBuffer = true; + + //DevMsg( " --> buff=%x, startOffset=%d, paramsOffset=%d, persistOffset = %d\n", this, m_nPersistentBufferStartOffset, pParams->m_nOffset, persistentBufferOffset ); + } +#ifndef OSX + else if ( m_bDynamic && gGL->m_bHave_GL_AMD_pinned_memory && ( m_pCtx->GetCurPinnedMemoryBuffer()->GetBytesRemaining() >= pParams->m_nSize ) ) + { + if ( pParams->m_bDiscard ) + { + m_nRevision++; + } + + m_dirtyMinOffset = pParams->m_nOffset; + m_dirtyMaxOffset = pParams->m_nOffset + pParams->m_nSize; + + CPinnedMemoryBuffer *pTempBuffer = m_pCtx->GetCurPinnedMemoryBuffer(); + + m_nPinnedMemoryOfs = pTempBuffer->GetOfs(); + + resultPtr = static_cast( pTempBuffer->GetPtr() ) + m_nPinnedMemoryOfs; + + pTempBuffer->Append( pParams->m_nSize ); + } +#endif // OSX + else if ( !g_bDisableStaticBuffer && ( pParams->m_bDiscard || pParams->m_bNoOverwrite ) && ( pParams->m_nSize <= GL_STATIC_BUFFER_SIZE ) ) + { +#if TOGL_SUPPORT_NULL_DEVICE + if ( !g_bNullD3DDevice ) +#endif + { + if ( pParams->m_bDiscard ) + { + m_pCtx->BindBufferToCtx( m_type, this ); + + // observe gl_bufmode on any orphan event. + // if orphaned and bufmode is nonzero, flip it to dynamic. + GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; + gGL->glBufferDataARB( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); + + m_nRevision++; // revision grows on orphan event + } + } + + m_dirtyMinOffset = pParams->m_nOffset; + m_dirtyMaxOffset = pParams->m_nOffset + pParams->m_nSize; + + switch ( m_type ) + { + case kGLMVertexBuffer: + { + m_pStaticBuffer = m_StaticBuffers[ 0 ]; + break; + } + case kGLMIndexBuffer: + { + m_pStaticBuffer = m_StaticBuffers[ 1 ]; + break; + } + default: + { + DXABSTRACT_BREAK_ON_ERROR(); + return; + } + } + + resultPtr = m_pStaticBuffer; + } + else + { + // bind (yes, even for pseudo - this binds name 0) + m_pCtx->BindBufferToCtx( m_type, this ); + + // perform discard if requested + if ( pParams->m_bDiscard ) + { + // observe gl_bufmode on any orphan event. + // if orphaned and bufmode is nonzero, flip it to dynamic. + + // We always want to call glBufferData( ..., NULL ) on discards, even though we're using the GL_MAP_INVALIDATE_BUFFER_BIT flag, because this flag is actually only a hint according to AMD. + GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; + gGL->glBufferDataARB( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); + + m_nRevision++; // revision grows on orphan event + } + + // adjust async map option appropriately, leave explicit flush unchanged + SetModes( pParams->m_bNoOverwrite, m_bEnableExplicitFlush ); + + // map + char *mapPtr; + if ( gGL->m_bHave_GL_ARB_map_buffer_range ) + { + // m_bEnableAsyncMap is actually pParams->m_bNoOverwrite + GLbitfield parms = GL_MAP_WRITE_BIT | ( m_bEnableAsyncMap ? GL_MAP_UNSYNCHRONIZED_BIT : 0 ) | ( pParams->m_bDiscard ? GL_MAP_INVALIDATE_BUFFER_BIT : 0 ) | ( m_bEnableExplicitFlush ? GL_MAP_FLUSH_EXPLICIT_BIT : 0 ); + +#ifdef REPORT_LOCK_TIME + double flStart = Plat_FloatTime(); +#endif + + mapPtr = (char*)gGL->glMapBufferRange( m_buffGLTarget, pParams->m_nOffset, pParams->m_nSize, parms); + +#ifdef REPORT_LOCK_TIME + double flEnd = Plat_FloatTime(); + if ( flEnd - flStart > 5.0 / 1000.0 ) + { + int nDelta = ( int )( ( flEnd - flStart ) * 1000 ); + if ( nDelta > 2 ) + { + Msg( "**** " ); + } + Msg( "glMapBufferRange Time=%d: ( Name=%d BufSize=%d ) Target=%p Offset=%d LockSize=%d ", nDelta, m_nHandle, m_nSize, m_buffGLTarget, pParams->m_nOffset, pParams->m_nSize ); + if ( parms & GL_MAP_WRITE_BIT ) + { + Msg( "GL_MAP_WRITE_BIT "); + } + if ( parms & GL_MAP_UNSYNCHRONIZED_BIT ) + { + Msg( "GL_MAP_UNSYNCHRONIZED_BIT "); + } + if ( parms & GL_MAP_INVALIDATE_BUFFER_BIT ) + { + Msg( "GL_MAP_INVALIDATE_BUFFER_BIT "); + } + if ( parms & GL_MAP_INVALIDATE_RANGE_BIT ) + { + Msg( "GL_MAP_INVALIDATE_RANGE_BIT "); + } + if ( parms & GL_MAP_FLUSH_EXPLICIT_BIT ) + { + Msg( "GL_MAP_FLUSH_EXPLICIT_BIT "); + } + Msg( "\n" ); + } +#endif + } + else + { + mapPtr = (char*)gGL->glMapBufferARB( m_buffGLTarget, GL_WRITE_ONLY_ARB ); + } + + Assert( mapPtr ); + + // calculate offset location + resultPtr = mapPtr; + if ( !gGL->m_bHave_GL_ARB_map_buffer_range ) + { + resultPtr += pParams->m_nOffset; + } + + // set range + m_dirtyMinOffset = pParams->m_nOffset; + m_dirtyMaxOffset = pParams->m_nOffset + pParams->m_nSize; + } + + if ( m_bUsingPersistentBuffer != bUsingPersistentBuffer ) + { + // Up the revision number when switching from a persistent to a non persistent buffer (or vice versa) + // Ensure the right GL buffer is bound before drawing (and vertex attribs properly set) + m_nRevision++; + m_bUsingPersistentBuffer = bUsingPersistentBuffer; + } + + m_bMapped = true; + + m_pLastMappedAddress = (float*)resultPtr; + + *pAddressOut = resultPtr; +} + +void CGLMBuffer::Unlock( int nActualSize, const void *pActualData ) +{ +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmPIXEvent( "CGLMBuffer::Unlock" ); + g_TelemetryGPUStats.m_nTotalBufferLocksAndUnlocks++; +#endif + + m_pCtx->CheckCurrent(); + + if ( !m_bMapped ) + { + DXABSTRACT_BREAK_ON_ERROR(); + return; + } + + if ( nActualSize < 0 ) + { + nActualSize = m_LockParams.m_nSize; + } + + if ( nActualSize > (int)m_LockParams.m_nSize ) + { + DXABSTRACT_BREAK_ON_ERROR(); + return; + } + +#if GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION + if ( m_bPseudo ) + { + // Check guard DWORD to detect buffer overruns (but are still within the last 4KB page so they don't get caught via pagefaults) + if ( *reinterpret_cast< const uint32 * >( m_pPseudoBuf + m_nSize ) != 0xDEADBEEF ) + { + // If this fires the client app has overwritten the guard DWORD beyond the end of the buffer. + DXABSTRACT_BREAK_ON_ERROR(); + } + + static const uint s_nInitialValues[4] = { 0xEF, 0xBE, 0xAD, 0xDE }; + + int nActualModifiedStart, nActualModifiedEnd; + for ( nActualModifiedStart = 0; nActualModifiedStart < (int)m_LockParams.m_nSize; ++nActualModifiedStart ) + if ( reinterpret_cast< const uint8 * >( m_pLastMappedAddress )[nActualModifiedStart] != s_nInitialValues[ ( m_LockParams.m_nOffset + nActualModifiedStart ) & 3 ] ) + break; + + for ( nActualModifiedEnd = m_LockParams.m_nSize - 1; nActualModifiedEnd > nActualModifiedStart; --nActualModifiedEnd ) + if ( reinterpret_cast< const uint8 * >( m_pLastMappedAddress )[nActualModifiedEnd] != s_nInitialValues[ ( m_LockParams.m_nOffset + nActualModifiedEnd ) & 3 ] ) + break; + + int nNumActualBytesModified = 0; + + if ( nActualModifiedEnd >= nActualModifiedStart ) + { + // The modified check is conservative (i.e. it should always err on the side of detecting <= actual bytes than where actually modified, never more). + // We primarily care about the case where the user lies about the actual # of modified bytes, which can lead to difficult to debug/inconsistent problems with some drivers. + // Round up/down the modified range, because the user's data may alias with the initial buffer values (0xDEADBEEF) so we may miss some bytes that where written. + if ( m_type == kGLMIndexBuffer ) + { + nActualModifiedStart &= ~1; + nActualModifiedEnd = MIN( (int)m_LockParams.m_nSize, ( ( nActualModifiedEnd + 1 ) + 1 ) & ~1 ) - 1; + } + else + { + nActualModifiedStart &= ~3; + nActualModifiedEnd = MIN( (int)m_LockParams.m_nSize, ( ( nActualModifiedEnd + 1 ) + 3 ) & ~3 ) - 1; + } + + nNumActualBytesModified = nActualModifiedEnd + 1; + + if ( nActualSize < nNumActualBytesModified ) + { + // The caller may be lying about the # of actually modified bytes in this lock. + // Has this lock region been previously locked? If so, it may have been previously overwritten before. Otherwise, the region had to be the 0xDEADBEEF fill DWORD at lock time. + if ( ( m_nDirtyRangeStart > m_nDirtyRangeEnd ) || + ( m_LockParams.m_nOffset > m_nDirtyRangeEnd ) || ( ( m_LockParams.m_nOffset + m_LockParams.m_nSize ) <= m_nDirtyRangeStart ) ) + { + // If this fires the client has lied about the actual # of bytes they've modified in the buffer - this will cause unreliable rendering on AMD drivers (because AMD actually pays attention to the actual # of flushed bytes). + DXABSTRACT_BREAK_ON_ERROR(); + } + } + + m_nDirtyRangeStart = MIN( m_nDirtyRangeStart, m_LockParams.m_nOffset + nActualModifiedStart ); + m_nDirtyRangeEnd = MAX( m_nDirtyRangeEnd, m_LockParams.m_nOffset + nActualModifiedEnd ); + } + +#if GL_ENABLE_INDEX_VERIFICATION + if ( nActualModifiedEnd >= nActualModifiedStart ) + { + int n = nActualModifiedEnd + 1; + if ( n != nActualSize ) + { + // The actual detected modified size is < than the reported size, which is common because the last few DWORD's of the vertex format may not actually be used/written (or read by the vertex shader). So just fudge it so the batch consumption checks work. + if ( ( (int)nActualSize - n ) <= 32 ) + { + n = nActualSize; + } + } + + m_BufferSpanManager.AddSpan( m_LockParams.m_nOffset + nActualModifiedStart, m_LockParams.m_nSize, n - nActualModifiedStart, m_LockParams.m_bDiscard, m_LockParams.m_bNoOverwrite ); + } +#endif + } +#elif GL_ENABLE_INDEX_VERIFICATION + if ( nActualSize > 0 ) + { + m_BufferSpanManager.AddSpan( m_LockParams.m_nOffset, m_LockParams.m_nSize, nActualSize, m_LockParams.m_bDiscard, m_LockParams.m_bNoOverwrite ); + } +#endif + +#if GL_BATCH_PERF_ANALYSIS + if ( m_type == kGLMIndexBuffer ) + g_nTotalIBLockBytes += nActualSize; + else if ( m_type == kGLMVertexBuffer ) + g_nTotalVBLockBytes += nActualSize; +#endif + +#ifndef OSX + if ( m_nPinnedMemoryOfs >= 0 ) + { +#if TOGL_SUPPORT_NULL_DEVICE + if ( !g_bNullD3DDevice ) + { +#endif + if ( nActualSize ) + { + m_pCtx->BindBufferToCtx( m_type, this ); + + gGL->glCopyBufferSubData( + GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, + m_buffGLTarget, + m_nPinnedMemoryOfs, + m_dirtyMinOffset, + nActualSize ); + } + +#if TOGL_SUPPORT_NULL_DEVICE + } +#endif + + m_nPinnedMemoryOfs = -1; + } + else +#endif // !OSX + if ( m_bUsingPersistentBuffer ) + { + if ( nActualSize ) + { + CPersistentBuffer *pTempBuffer = m_pCtx->GetCurPersistentBuffer( m_type ); + pTempBuffer->Append( nActualSize ); + + //DevMsg( " <-- actualSize=%d, persistOffset = %d\n", nActualSize, pTempBuffer->GetOffset() ); + } + } + else if ( m_pStaticBuffer ) + { +#if TOGL_SUPPORT_NULL_DEVICE + if ( !g_bNullD3DDevice ) +#endif + { + if ( nActualSize ) + { + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "UnlockSubData" ); + + #ifdef REPORT_LOCK_TIME + double flStart = Plat_FloatTime(); + #endif + m_pCtx->BindBufferToCtx( m_type, this ); + + Assert( nActualSize <= (int)( m_dirtyMaxOffset - m_dirtyMinOffset ) ); + + glBufferSubDataMaxSize( m_buffGLTarget, m_dirtyMinOffset, nActualSize, pActualData ? pActualData : m_pStaticBuffer ); + + #ifdef REPORT_LOCK_TIME + double flEnd = Plat_FloatTime(); + if ( flEnd - flStart > 5.0 / 1000.0 ) + { + int nDelta = ( int )( ( flEnd - flStart ) * 1000 ); + if ( nDelta > 2 ) + { + Msg( "**** " ); + } + // Msg( "glBufferSubData Time=%d: ( Name=%d BufSize=%d ) Target=%p Offset=%d Size=%d\n", nDelta, m_nHandle, m_nSize, m_buffGLTarget, m_dirtyMinOffset, m_dirtyMaxOffset - m_dirtyMinOffset ); + } + #endif + } + } + + m_pStaticBuffer = NULL; + } + else if ( m_bPseudo ) + { + if ( pActualData ) + { + memcpy( m_pLastMappedAddress, pActualData, nActualSize ); + } + +#if GL_ENABLE_UNLOCK_BUFFER_OVERWRITE_DETECTION + uint nProtectOfs = m_LockParams.m_nOffset & 4095; + uint nProtectEnd = ( m_LockParams.m_nOffset + m_LockParams.m_nSize + 4095 ) & ~4095; + uint nProtectSize = nProtectEnd - nProtectOfs; + + DWORD nOldProtect; + BOOL bResult = VirtualProtect( m_pActualPseudoBuf + nProtectOfs, nProtectSize, PAGE_READONLY, &nOldProtect ); + if ( !bResult ) + { + Error( "VirtualProtect() failed!\n" ); + } +#endif + } + else + { + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "UnlockUnmap" ); + + if ( pActualData ) + { + memcpy( m_pLastMappedAddress, pActualData, nActualSize ); + } + + m_pCtx->BindBufferToCtx( m_type, this ); + + Assert( nActualSize <= (int)( m_dirtyMaxOffset - m_dirtyMinOffset ) ); + + // time to do explicit flush (currently m_bEnableExplicitFlush is always true) + if ( m_bEnableExplicitFlush ) + { + FlushRange( m_dirtyMinOffset, nActualSize ); + } + + // clear dirty range no matter what + m_dirtyMinOffset = m_dirtyMaxOffset = 0; // adjust/grow on lock, clear on unlock + +#ifdef REPORT_LOCK_TIME + double flStart = Plat_FloatTime(); +#endif + + gGL->glUnmapBuffer( m_buffGLTarget ); + +#ifdef REPORT_LOCK_TIME + double flEnd = Plat_FloatTime(); + if ( flEnd - flStart > 5.0 / 1000.0 ) + { + int nDelta = ( int )( ( flEnd - flStart ) * 1000 ); + if ( nDelta > 2 ) + { + Msg( "**** " ); + } + Msg( "glUnmapBuffer Time=%d: ( Name=%d BufSize=%d ) Target=%p\n", nDelta, m_nHandle, m_nSize, m_buffGLTarget ); + } +#endif + } + + m_bMapped = false; +} + +GLuint CGLMBuffer::GetHandle() const +{ + return ( m_bUsingPersistentBuffer ? m_pCtx->GetCurPersistentBuffer( m_type )->GetHandle() : m_nHandle ); +} diff --git a/togles/linuxwin/cglmfbo.cpp b/togles/linuxwin/cglmfbo.cpp new file mode 100644 index 00000000..ec2418d4 --- /dev/null +++ b/togles/linuxwin/cglmfbo.cpp @@ -0,0 +1,355 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmfbo.cpp +// +//=============================================================================== + +#include "togl/rendermechanism.h" + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + +CGLMFBO::CGLMFBO( GLMContext *ctx ) +{ + m_ctx = ctx; + m_ctx->CheckCurrent(); + + gGL->glGenFramebuffersEXT( 1, &m_name ); + + memset( m_attach, 0, sizeof( m_attach ) ); +} + + +CGLMFBO::~CGLMFBO( ) +{ + m_ctx->CheckCurrent(); + + // detach all known attached textures first... necessary ? + for( int index = 0; index < kAttCount; index++) + { + if (m_attach[ index ].m_tex) + { + TexDetach( (EGLMFBOAttachment)index ); + } + } + + gGL->glDeleteFramebuffersEXT( 1, &m_name ); + + m_name = 0; + m_ctx = NULL; +} + +// the tex attach path should also select a specific slice of the texture... +// and we need a way to make renderbuffers.. + +static GLenum EncodeAttachmentFBO( EGLMFBOAttachment index ) +{ + if (index < kAttDepth) + { + return GL_COLOR_ATTACHMENT0_EXT + (int) index; + } + else + { + switch( index ) + { + case kAttDepth: + return GL_DEPTH_ATTACHMENT_EXT; + break; + + case kAttStencil: + return GL_STENCIL_ATTACHMENT_EXT; + break; + + case kAttDepthStencil: + return GL_DEPTH_STENCIL_ATTACHMENT_EXT; + break; + + default: + GLMStop(); // bad news + break; + } + } + + GLMStop(); // bad news + // shouldn't get here + return GL_COLOR_ATTACHMENT0_EXT; +} + +void CGLMFBO::TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint ) +{ + // force our parent context to be current + m_ctx->MakeCurrent(); + + // bind to context (will cause FBO object creation on first use) + m_ctx->BindFBOToCtx( this, fboBindPoint ); + + // it's either a plain 2D, a 2D face of a cube map, or a slice of a 3D. + CGLMTex *tex = params->m_tex; + + // always detach what is currently there, if anything + this->TexDetach( attachIndex, fboBindPoint ); + + if (!tex) + { + // andif they pass NULL to us, then we are done. + return; + } + + GLMTexLayout *layout = tex->m_layout; + + GLenum target = tex->m_layout->m_key.m_texGLTarget; + + GLenum attachIndexGL = EncodeAttachmentFBO( attachIndex ); + + switch( target ) + { + case GL_TEXTURE_2D: + { + // we will attach the underlying RBO on a multisampled tex, iff the tex has one, **and** we're not being asked to attach it to the read buffer. + // if we get a req to attach an MSAA tex to the read buffer, chances are it's BlitTex calling, andit has already resolved the tex, so in those + // cases you really do want to attach the texture and not the RBO to the FBO in question. + + bool useRBO = false; // initial state + + if (layout->m_key.m_texFlags & kGLMTexMultisampled) + { + // it is an MSAA tex + if (fboBindPoint == GL_READ_FRAMEBUFFER_EXT) + { + // I think you just want to read a resolved tex. + // But I will check that it is resolved first.. + Assert( tex->IsRBODirty() == false ); + } + else + { + // you want to draw into it. You get the RBO bound instead of the tex. + useRBO = true; + } + } + + if (useRBO) + { + // MSAA path - attach the RBO, not the texture, and mark the RBO dirty + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + // you have to attach it both places... + // http://www.opengl.org/wiki/GL_EXT_framebuffer_object + + // bind the RBO to the GL_RENDERBUFFER_EXT target + gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); + + // attach the GL_RENDERBUFFER_EXT target to the depth and stencil attach points + gGL->glFramebufferRenderbufferEXT( fboBindPoint, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); + + gGL->glFramebufferRenderbufferEXT( fboBindPoint, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); + + // no need to leave the RBO hanging on + gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + } + else + { + // color attachment (likely 0) + gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); + + gGL->glFramebufferRenderbufferEXT( fboBindPoint, attachIndexGL, GL_RENDERBUFFER_EXT, tex->m_rboName); + + gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + } + tex->ForceRBODirty(); + } + else + { + // regular path - attaching a texture2d + + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + // you have to attach it both places... + // http://www.opengl.org/wiki/GL_EXT_framebuffer_object + + gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_DEPTH_ATTACHMENT_EXT, target, tex->m_texName, params->m_mip ); + + gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_STENCIL_ATTACHMENT_EXT, target, tex->m_texName, params->m_mip ); + } + else + { + gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip ); + } + } + } + break; + + case GL_TEXTURE_3D: + { + gGL->glFramebufferTexture3DEXT( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip, params->m_zslice ); + } + break; + + case GL_TEXTURE_CUBE_MAP: + { + // adjust target to steer to the proper face of the cube map + target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + params->m_face; + + gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip ); + } + break; + } + + // log the attached tex + m_attach[ attachIndex ] = *params; + + // indicate that the tex has been bound to an RT + tex->m_rtAttachCount++; +} + +void CGLMFBO::TexDetach( EGLMFBOAttachment attachIndex, GLenum fboBindPoint ) +{ + // force our parent context to be current + m_ctx->MakeCurrent(); + + // bind to context (will cause FBO object creation on first use) + m_ctx->BindFBOToCtx( this, fboBindPoint ); + + if (m_attach[ attachIndex ].m_tex) + { + CGLMTex *tex = m_attach[ attachIndex ].m_tex; + GLMTexLayout *layout = tex->m_layout; + GLenum target = tex->m_layout->m_key.m_texGLTarget; + + GLenum attachIndexGL = EncodeAttachmentFBO( attachIndex ); + + switch( target ) + { + case GL_TEXTURE_2D: + { + if (layout->m_key.m_texFlags & kGLMTexMultisampled) + { + // MSAA path - detach the RBO, not the texture + // (is this the right time to resolve? probably better to wait until someone tries to sample the texture) + + gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + // detach the GL_RENDERBUFFER_EXT target at depth and stencil attach points + gGL->glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + + gGL->glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + } + else + { + // color attachment (likely 0) + gGL->glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachIndexGL, GL_RENDERBUFFER_EXT, 0); + } + } + else + { + // plain tex detach + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + // you have to detach it both places... + // http://www.opengl.org/wiki/GL_EXT_framebuffer_object + + gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_DEPTH_ATTACHMENT_EXT, target, 0, 0 ); + gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_STENCIL_ATTACHMENT_EXT, target, 0, 0 ); + } + else + { + gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, 0, 0 ); + } + } + } + break; + + case GL_TEXTURE_3D: + { + gGL->glFramebufferTexture3DEXT( fboBindPoint, attachIndexGL, target, 0, 0, 0 ); + } + break; + + case GL_TEXTURE_CUBE_MAP: + { + gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, 0, 0 ); + } + break; + } + + // un-log the attached tex + memset( &m_attach[ attachIndex ], 0, sizeof( m_attach[0] ) ); + + // drop the RT attach count + tex->m_rtAttachCount--; + } + else + { + //Debugger(); // odd, but not harmful - typ comes from D3D code passing NULL into SetRenderTarget + } +} + +void CGLMFBO::TexScrub( CGLMTex *tex ) +{ + // see if it's attached anywhere + for( int attachIndex = 0; attachIndex < kAttCount; attachIndex++ ) + { + if (m_attach[ attachIndex ].m_tex == tex) + { + // blammo + TexDetach( (EGLMFBOAttachment)attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + } + } +} + + +bool CGLMFBO::IsReady( void ) +{ + bool result = false; + + // ensure our parent context is current + m_ctx->CheckCurrent(); + + // bind to context (will cause FBO object creation on first use) + m_ctx->BindFBOToCtx( this ); + + GLenum status; + status = gGL->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + switch(status) + { + case GL_FRAMEBUFFER_COMPLETE_EXT: + result = true; + break; + + case GL_FRAMEBUFFER_UNSUPPORTED_EXT: + result = false; + DebuggerBreak(); + /* choose different formats */ + break; + + default: + result = false; + DebuggerBreak(); + /* programming error; will fail on all hardware */ + break; + } + return result; +} diff --git a/togles/linuxwin/cglmprogram.cpp b/togles/linuxwin/cglmprogram.cpp new file mode 100644 index 00000000..8c0103b3 --- /dev/null +++ b/togles/linuxwin/cglmprogram.cpp @@ -0,0 +1,1570 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmprogram.cpp +// +//=============================================================================== + +#include "togl/rendermechanism.h" + +#include "filesystem.h" +#include "tier1/fmtstr.h" +#include "tier1/KeyValues.h" +#include "tier0/fasttimer.h" + +#if GLMDEBUG && defined( _MSC_VER ) +#include +#endif + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + +#if GLMDEBUG +#define GLM_FREE_SHADER_TEXT 0 +#else +#define GLM_FREE_SHADER_TEXT 1 +#endif + +//=============================================================================== + +ConVar gl_shaderpair_cacherows_lg2( "gl_paircache_rows_lg2", "10"); // 10 is minimum +ConVar gl_shaderpair_cacheways_lg2( "gl_paircache_ways_lg2", "5"); // 5 is minimum +ConVar gl_shaderpair_cachelog( "gl_shaderpair_cachelog", "0" ); + +static CCycleCount gShaderCompileTime; +static int gShaderCompileCount = 0; +static CCycleCount gShaderCompileQueryTime; +static CCycleCount gShaderLinkTime; +static int gShaderLinkCount = 0; +static CCycleCount gShaderLinkQueryTime; +CON_COMMAND( gl_shader_compile_time_dump, "Dump stats shader compile time." ) +{ + ConMsg( "Shader Compile Time: %u ms (Count: %d) / Query: %u ms \n", (uint32)gShaderCompileTime.GetMilliseconds(), gShaderCompileCount, (uint32)gShaderCompileQueryTime.GetMilliseconds() ); + ConMsg( "Shader Link Time : %u ms (Count: %d) / Query: %u ms \n", (uint32)gShaderLinkTime.GetMilliseconds(), gShaderLinkCount, (uint32)gShaderLinkQueryTime.GetMilliseconds() ); +} + +//=============================================================================== + + +GLenum GLMProgTypeToARBEnum( EGLMProgramType type ) +{ + GLenum result = 0; + switch(type) + { + case kGLMVertexProgram: result = GL_VERTEX_PROGRAM_ARB; break; + case kGLMFragmentProgram: result = GL_FRAGMENT_PROGRAM_ARB; break; + default: Assert( !"bad program type"); result = 0; break; + } + return result; +} + +GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ) +{ + GLenum result = 0; + switch(type) + { + case kGLMVertexProgram: result = GL_VERTEX_SHADER_ARB; break; + case kGLMFragmentProgram: result = GL_FRAGMENT_SHADER_ARB; break; + default: Assert( !"bad program type"); result = 0; break; + } + return result; +} + +CGLMProgram::CGLMProgram( GLMContext *ctx, EGLMProgramType type ) +{ + m_ctx = ctx; + m_ctx->CheckCurrent(); + + m_type = type; + m_nHashTag = rand() ^ ( rand() << 15 ); + m_text = NULL; // no text yet + +#if GLMDEBUG + m_editable = NULL; +#endif + + memset( &m_descs, 0, sizeof( m_descs ) ); + + m_samplerMask = 0; // dxabstract sets this field later + m_samplerTypes = 0; + m_fragDataMask = 0; + m_numDrawBuffers = 0; + memset( &m_drawBuffers, 0, sizeof( m_drawBuffers ) ); + + m_maxSamplers = GLM_SAMPLER_COUNT; + m_nNumUsedSamplers = GLM_SAMPLER_COUNT; + m_maxVertexAttrs = kGLMVertexAttributeIndexMax; + + // create an ARB vp/fp program object name. No need to bind it yet. + GLMShaderDesc *arbDesc = &m_descs[ kGLMARB ]; + Assert(gGL); + gGL->glGenProgramsARB( 1, &arbDesc->m_object.arb ); + + // create a GLSL shader object. + GLMShaderDesc *glslDesc = &m_descs[ kGLMGLSL ]; + GLenum glslStage = GLMProgTypeToGLSLEnum( m_type ); + + glslDesc->m_object.glsl = gGL->glCreateShaderObjectARB( glslStage );; + + m_shaderName[0] = '\0'; + + m_bTranslatedProgram = false; + + m_nCentroidMask = 0; + m_nShadowDepthSamplerMask = 0; + + m_labelName[0] = '\0'; + m_labelIndex = -1; + m_labelCombo = -1; + + // no text has arrived yet. That's done in SetProgramText. +} + +CGLMProgram::~CGLMProgram( ) +{ + m_ctx->CheckCurrent(); + + // if there is an arb program, delete it + GLMShaderDesc *arbDesc = &m_descs[ kGLMARB ]; + if (arbDesc->m_object.arb) + { + gGL->glDeleteProgramsARB( 1, &arbDesc->m_object.arb ); + arbDesc->m_object.arb = 0; + } + + // if there is a GLSL shader, delete it + GLMShaderDesc *glslDesc = &m_descs[kGLMGLSL]; + if (glslDesc->m_object.glsl) + { + gGL->glDeleteShader( (uint)glslDesc->m_object.glsl ); // why do I need a cast here again ? + glslDesc->m_object.glsl = 0; + } + +#if GLMDEBUG + if (m_editable) + { + delete m_editable; + m_editable = NULL; + } +#endif + + if (m_text) + { + free( m_text ); + m_text = NULL; + } + m_ctx = NULL; +} + +enum EShaderSection +{ + kGLMARBVertex, kGLMARBVertexDisabled, + kGLMARBFragment, kGLMARBFragmentDisabled, + kGLMGLSLVertex, kGLMGLSLVertexDisabled, + kGLMGLSLFragment, kGLMGLSLFragmentDisabled, + +}; + +const char *g_shaderSectionMarkers[] = // match ordering of enum +{ + "!!ARBvp", "-!!ARBvp", // enabled and disabled markers. so you can have multiple flavors in a blob and activate the one you want. + "!!ARBfp", "-!!ARBfp", + "//GLSLvp", "-//GLSLvp", + "//GLSLfp", "-//GLSLfp", + NULL +}; + +void CGLMProgram::SetShaderName( const char *name ) +{ + V_strncpy( m_shaderName, name, sizeof( m_shaderName ) ); +} + +void CGLMProgram::SetProgramText( char *text ) +{ + // free old text if any + // clone new text + // scan newtext to find sections + // walk sections, and mark descs to indicate where text is at + + if (m_text) + { + free( m_text ); + m_text = NULL; + } + + // scrub desc text references + for( int i=0; im_textPresent = false; + desc->m_textOffset = 0; + desc->m_textLength = 0; + } + + m_text = strdup( text ); + Assert( m_text != NULL ); + + #if GLMDEBUG + // create editable text item, if it does not already exist + if (!m_editable) + { + char *suffix = ""; + + switch(m_type) + { + case kGLMVertexProgram: suffix = ".vsh"; break; + case kGLMFragmentProgram: suffix = ".fsh"; break; + default: GLMDebugger(); + } + +#ifdef POSIX + CFmtStr debugShaderPath( "%s/debugshaders/", getenv( "HOME" ) ); +#else + CFmtStr debugShaderPath( "debugshaders/" ); +#endif + _mkdir( debugShaderPath.Access() ); + m_editable = new CGLMEditableTextItem( m_text, strlen(m_text), false, debugShaderPath.Access(), suffix ); + + // pull our string back from the editable (it has probably munged it) + if (m_editable->HasData()) + { + ReloadStringFromEditable(); + } + } + #endif + + + // scan the text and find sections + CGLMTextSectioner sections( m_text, strlen( m_text ), g_shaderSectionMarkers ); + + int sectionCount = sections.Count(); + for( int i=0; i < sectionCount; i++ ) + { + uint subtextOffset = 0; + uint subtextLength = 0; + int markerIndex = 0; + + sections.GetSection( i, &subtextOffset, &subtextLength, &markerIndex ); + + // act on the section + GLMShaderDesc *desc = NULL; + switch( m_type ) + { + case kGLMVertexProgram: + switch( markerIndex ) + { + case kGLMARBVertex: + case kGLMGLSLVertex: + desc = &m_descs[ (markerIndex==kGLMARBVertex) ? kGLMARB : kGLMGLSL]; + + // these steps are generic across both langs + desc->m_textPresent = true; + desc->m_textOffset = subtextOffset; + desc->m_textLength = subtextLength; + desc->m_compiled = false; + desc->m_valid = false; + break; + + case kGLMARBVertexDisabled: + case kGLMGLSLVertexDisabled: + // ignore quietly + break; + + default: Assert(!"Mismatched section marker seen in SetProgramText (VP)"); break; + } + break; + + case kGLMFragmentProgram: + switch( markerIndex ) + { + case kGLMARBFragment: + case kGLMGLSLFragment: + desc = &m_descs[ (markerIndex==kGLMARBFragment) ? kGLMARB : kGLMGLSL]; + + // these steps are generic across both langs + desc->m_textPresent = true; + desc->m_textOffset = subtextOffset; + desc->m_textLength = subtextLength; + desc->m_compiled = false; + desc->m_valid = false; + break; + + case kGLMARBFragmentDisabled: + case kGLMGLSLFragmentDisabled: + // ignore quietly + break; + + default: Assert(!"Mismatched section marker seen in SetProgramText (VP)"); break; + } + break; + } + } + + // find the label string + // example: + // trans#2871 label:vs-file vertexlit_and_unlit_generic_vs20 vs-index 294912 vs-combo 1234 + + char *lineStr = strstr( m_text, "// trans#" ); + if (lineStr) + { + int scratch = -1; + + if (this->m_type == kGLMVertexProgram) + { + sscanf( lineStr, "// trans#%d label:vs-file %s vs-index %d vs-combo %d", &scratch, m_labelName, &m_labelIndex, &m_labelCombo ); + } + else + { + sscanf( lineStr, "// trans#%d label:ps-file %s ps-index %d ps-combo %d", &scratch, m_labelName, &m_labelIndex, &m_labelCombo ); + } + } +} + +void CGLMProgram::CompileActiveSources ( void ) +{ + // compile everything we have text for + for( int i=0; iFindParm( "-gl_time_shader_compiles" ) != 0); + // If using "-gl_time_shader_compiles", keeps track of total cycle count spent on shader compiles. + CFastTimer shaderCompileTimer; + if (bTimeShaderCompiles) + { + shaderCompileTimer.Start(); + } + + bool noisy = false; noisy; + int loglevel = gl_shaderpair_cachelog.GetInt(); + + switch( lang ) + { + case kGLMARB: + { + GLMShaderDesc *arbDesc; + + arbDesc = &m_descs[ kGLMARB ]; + + // make sure no GLSL program is set up + gGL->glUseProgram(0); + // bind our program container to context + GLenum arbTarget = GLMProgTypeToARBEnum( m_type ); + + glSetEnable( arbTarget, true ); // unclear if I need this to compile or just to draw... + + gGL->glBindProgramARB( arbTarget, arbDesc->m_object.arb ); // object created or just re-bound + + char *section = m_text + arbDesc->m_textOffset; + char *lastCharOfSection = section + arbDesc->m_textLength; // actually it's one past the last textual character + lastCharOfSection; + + #if GLMDEBUG + if(noisy) + { + GLMPRINTF((">-D- CGLMProgram::Compile submitting following text for ARB %s program (name %d) ---------------------", + arbTarget == GL_FRAGMENT_PROGRAM_ARB ? "fragment" : "vertex", + arbDesc->m_object.arb )); + + // we don't have a "print this many chars" call yet + // just temporarily null terminate the text we want to print + + char saveChar = *lastCharOfSection; + + *lastCharOfSection= 0; + GLMPRINTTEXT(( section, eDebugDump )); + *lastCharOfSection= saveChar; + + GLMPRINTF(("<-D- CGLMProgram::Compile ARB EOT--" )); + } + #endif + + gGL->glProgramStringARB( arbTarget, GL_PROGRAM_FORMAT_ASCII_ARB, arbDesc->m_textLength, section ); + arbDesc->m_compiled = true; // compiled but not necessarily valid + + CheckValidity( lang ); + // leave it bound n enabled, don't care (draw will sort it all out) + } + break; + + case kGLMGLSL: + { + GLMShaderDesc *glslDesc; + + glslDesc = &m_descs[ kGLMGLSL ]; + + GLenum glslStage = GLMProgTypeToGLSLEnum( m_type ); + glslStage; + + // there's no binding to do for GLSL. but make sure no ARB stuff is bound for tidiness. + glSetEnable( GL_VERTEX_PROGRAM_ARB, false ); + glSetEnable( GL_FRAGMENT_PROGRAM_ARB, false ); // add check errors on these + + gGL->glBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 ); + gGL->glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, 0 ); + + // no GLSL program either + gGL->glUseProgram(0); + + // pump text into GLSL shader object + + char *section = m_text + glslDesc->m_textOffset; + char *lastCharOfSection = section + glslDesc->m_textLength; // actually it's one past the last textual character + lastCharOfSection; + + #if GLMDEBUG + if(noisy) + { + GLMPRINTF((">-D- CGLMProgram::Compile submitting following text for GLSL %s program (name %d) ---------------------", + glslStage == GL_FRAGMENT_SHADER_ARB ? "fragment" : "vertex", + glslDesc->m_object.glsl )); + + // we don't have a "print this many chars" call yet + // just temporarily null terminate the text we want to print + + char saveChar = *lastCharOfSection; + + *lastCharOfSection= 0; + GLMPRINTTEXT(( section, eDebugDump )); + *lastCharOfSection= saveChar; + + GLMPRINTF(("<-D- CGLMProgram::Compile GLSL EOT--" )); + } + #endif + + gGL->glShaderSourceARB( glslDesc->m_object.glsl, 1, (const GLchar **)§ion, &glslDesc->m_textLength); + +#if GLM_FREE_SHADER_TEXT + // Free the shader program text - not needed anymore (GL has its own copy) + if ( m_text && !m_descs[kGLMARB].m_textPresent ) + { + free( m_text ); + m_text = NULL; + } +#endif + + // compile + gGL->glCompileShaderARB( glslDesc->m_object.glsl ); + glslDesc->m_compiled = true; // compiled but not necessarily valid + + // Check shader validity at creation time. This will cause the driver to not be able to + // multi-thread/defer shader compiles, but it is useful for getting error messages on the + // shader when it is compiled + bool bValidateShaderEarly = (CommandLine()->FindParm( "-gl_validate_shader_early" ) != 0); + if (bValidateShaderEarly) + { + CheckValidity( lang ); + } + + if (loglevel>=2) + { + char tempname[128]; + //int tempindex = -1; + //int tempcombo = -1; + + //GetLabelIndexCombo( tempname, sizeof(tempname), &tempindex, &tempcombo ); + //printf("\ncompile: - [ %s/%d/%d ] on GL name %d ", tempname, tempindex, tempcombo, glslDesc->m_object.glsl ); + + + GetComboIndexNameString( tempname, sizeof(tempname) ); + printf("\ncompile: %s on GL name %d ", tempname, glslDesc->m_object.glsl ); + } + } + break; + } + + if (bTimeShaderCompiles) + { + shaderCompileTimer.End(); + gShaderCompileTime += shaderCompileTimer.GetDuration(); + gShaderCompileCount++; + } +} + +#if GLMDEBUG + + bool CGLMProgram::PollForChanges( void ) + { + bool result = false; + if (m_editable) + { + result = m_editable->PollForChanges(); + } + return result; + } + + void CGLMProgram::ReloadStringFromEditable( void ) + { + uint dataSize=0; + char *data=NULL; + + m_editable->GetCurrentText( &data, &dataSize ); + + char *buf = (char *)malloc( dataSize+1 ); // we will NULL terminate it, since the mirror copy might not be + memcpy( buf, data, dataSize ); + buf[dataSize] = 0; + + SetProgramText( buf ); + + free( buf ); + } + + bool CGLMProgram::SyncWithEditable( void ) + { + bool result = false; + + if (m_editable->PollForChanges()) + { + ReloadStringFromEditable(); + + CompileActiveSources(); + + // invalidate shader pair cache entries using this shader.. + m_ctx->m_pairCache->PurgePairsWithShader( this ); + + result = true; // result true means "it changed" + } + return result; + } + +#endif + + +// attributes which are general to both stages +// VP and FP: +// +// 0x88A0 PROGRAM_INSTRUCTIONS_ARB VP FP +// 0x88A1 MAX_PROGRAM_INSTRUCTIONS_ARB VP FP +// 0x88A2 PROGRAM_NATIVE_INSTRUCTIONS_ARB VP FP +// 0x88A3 MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB VP FP +// +// 0x88A4 PROGRAM_TEMPORARIES_ARB VP FP +// 0x88A5 MAX_PROGRAM_TEMPORARIES_ARB VP FP +// 0x88A6 PROGRAM_NATIVE_TEMPORARIES_ARB VP FP +// 0x88A7 MAX_PROGRAM_NATIVE_TEMPORARIES_ARB VP FP +// +// 0x88A8 PROGRAM_PARAMETERS_ARB VP FP +// 0x88A9 MAX_PROGRAM_PARAMETERS_ARB VP FP +// 0x88AA PROGRAM_NATIVE_PARAMETERS_ARB VP FP +// 0x88AB MAX_PROGRAM_NATIVE_PARAMETERS_ARB VP FP +// +// 0x88AC PROGRAM_ATTRIBS_ARB VP FP +// 0x88AD MAX_PROGRAM_ATTRIBS_ARB VP FP +// 0x88AE PROGRAM_NATIVE_ATTRIBS_ARB VP FP +// 0x88AF MAX_PROGRAM_NATIVE_ATTRIBS_ARB VP FP +// +// 0x88B4 MAX_PROGRAM_LOCAL_PARAMETERS_ARB VP FP +// 0x88B5 MAX_PROGRAM_ENV_PARAMETERS_ARB VP FP +// 0x88B6 PROGRAM_UNDER_NATIVE_LIMITS_ARB VP FP +// +// VP only: +// +// 0x88B0 PROGRAM_ADDRESS_REGISTERS_ARB VP +// 0x88B1 MAX_PROGRAM_ADDRESS_REGISTERS_ARB VP +// 0x88B2 PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB VP +// 0x88B3 MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB VP +// +// FP only: +// +// 0x8805 PROGRAM_ALU_INSTRUCTIONS_ARB FP +// 0x880B MAX_PROGRAM_ALU_INSTRUCTIONS_ARB FP +// 0x8808 PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB FP +// 0x880E MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB FP + +// 0x8806 PROGRAM_TEX_INSTRUCTIONS_ARB FP +// 0x880C MAX_PROGRAM_TEX_INSTRUCTIONS_ARB FP +// 0x8809 PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB FP +// 0x880F MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB FP + +// 0x8807 PROGRAM_TEX_INDIRECTIONS_ARB FP +// 0x880D MAX_PROGRAM_TEX_INDIRECTIONS_ARB FP +// 0x880A PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB FP +// 0x8810 MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB FP + +struct GLMShaderLimitDesc +{ + GLenum m_valueEnum; + GLenum m_limitEnum; + const char *m_debugName; + char m_flags; + // m_flags - 0x01 for VP, 0x02 for FP, or set both if applicable to both +}; + +// macro to help make the table of what to check +#ifndef LMD +#define LMD( val, flags ) { GL_PROGRAM_##val##_ARB, GL_MAX_PROGRAM_##val##_ARB, #val, flags } +#else +#error you need to use a different name for this macro. +#endif + +GLMShaderLimitDesc g_glmShaderLimitDescs[] = +{ + // VP and FP.. + LMD( INSTRUCTIONS, 3 ), + LMD( NATIVE_INSTRUCTIONS, 3 ), + LMD( NATIVE_TEMPORARIES, 3 ), + LMD( PARAMETERS, 3 ), + LMD( NATIVE_PARAMETERS, 3 ), + LMD( ATTRIBS, 3 ), + LMD( NATIVE_ATTRIBS, 3 ), + + // VP only.. + LMD( ADDRESS_REGISTERS, 1 ), + LMD( NATIVE_ADDRESS_REGISTERS, 1 ), + + // FP only.. + LMD( ALU_INSTRUCTIONS, 2 ), + LMD( NATIVE_ALU_INSTRUCTIONS, 2 ), + LMD( TEX_INSTRUCTIONS, 2 ), + LMD( NATIVE_TEX_INSTRUCTIONS, 2 ), + LMD( TEX_INDIRECTIONS, 2 ), + LMD( NATIVE_TEX_INDIRECTIONS, 2 ), + + { 0, 0, NULL, 0 } +}; + +#undef LMD + +bool CGLMProgram::CheckValidity( EGLMProgramLang lang ) +{ + static char *targnames[] = { "vertex", "fragment" }; + + bool bTimeShaderCompiles = (CommandLine()->FindParm( "-gl_time_shader_compiles" ) != 0); + // If using "-gl_time_shader_compiles", keeps track of total cycle count spent on shader compiles. + CFastTimer shaderCompileTimer; + if (bTimeShaderCompiles) + { + shaderCompileTimer.Start(); + } + + bool bValid = false; + + switch(lang) + { + case kGLMARB: + { + GLMShaderDesc *arbDesc; + arbDesc = &m_descs[ kGLMARB ]; + + GLenum arbTarget = GLMProgTypeToARBEnum( m_type ); + + Assert( arbDesc->m_compiled ); + + arbDesc->m_valid = true; // assume success til we see otherwise + + // assume program is bound. is there anything wrong with it ? + + GLint isNative=0; + gGL->glGetProgramivARB( arbTarget, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &isNative ); + + // If the program is over the hardware's limits, print out some information + if (isNative!=1) + { + arbDesc->m_valid = false; + + // check everything we can check + char checkmask = (1<m_valueEnum !=0; desc++ ) + { + if ( desc->m_flags & checkmask ) + { + // test it + GLint value = 0; + GLint limit = 0; + gGL->glGetProgramivARB(arbTarget, desc->m_valueEnum, &value); + + gGL->glGetProgramivARB(arbTarget, desc->m_limitEnum, &limit); + + if (value > limit) + { + GLMPRINTF(("-D- Invalid %s program: program has %d %s; limit is %d", targnames[ m_type ], value, desc->m_debugName, limit )); + } + } + } + } + + // syntax error check + GLint errorLine; + gGL->glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &errorLine ); + + if ( errorLine!=-1 ) + { + const GLubyte* errorString = gGL->glGetString(GL_PROGRAM_ERROR_STRING_ARB); errorString; + GLMPRINTF(( "-D- Syntax error in ARB %s program: %s",targnames[ m_type ], errorString )); + arbDesc->m_valid = false; + } + if (!arbDesc->m_valid) + { + char *temp = strdup(m_text); + temp[ arbDesc->m_textOffset + arbDesc->m_textLength ] = 0; + GLMPRINTF(("-D- ----- ARB compile failed; bad source follows -----" )); + GLMPRINTTEXT(( temp + arbDesc->m_textOffset, eDebugDump, GLMPRINTTEXT_NUMBEREDLINES )); + GLMPRINTF(("-D- -----end-----" )); + free( temp ); + } + + bValid = arbDesc->m_valid; + } + break; + + case kGLMGLSL: + { + GLMShaderDesc *glslDesc; + GLcharARB *logString = NULL; + glslDesc = &m_descs[ kGLMGLSL ]; + + GLenum glslStage = GLMProgTypeToGLSLEnum( m_type ); glslStage; + + Assert( glslDesc->m_compiled ); + + glslDesc->m_valid = true; // assume success til we see otherwise + + // GLSL error check + int compiled = 0, length = 0, laux = 0; + + gGL->glGetObjectParameterivARB( (GLhandleARB)glslDesc->m_object.glsl, GL_OBJECT_COMPILE_STATUS_ARB, &compiled); + gGL->glGetObjectParameterivARB( (GLhandleARB)glslDesc->m_object.glsl, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); + if ( length > 0 ) + { + logString = (GLcharARB *)malloc(length * sizeof(GLcharARB)); + gGL->glGetInfoLogARB((GLhandleARB)glslDesc->m_object.glsl, length, &laux, logString); + } + // we may not be able to check "native limits" stuff until link time. meh + + if (!compiled) + { + glslDesc->m_valid = false; + } + + if (!glslDesc->m_valid) + { + GLMPRINTF(("-D- ----- GLSL compile failed: \n %s \n",logString )); +#if !GLM_FREE_SHADER_TEXT + char *temp = strdup(m_text); + temp[ glslDesc->m_textOffset + glslDesc->m_textLength ] = 0; + GLMPRINTTEXT(( temp + glslDesc->m_textOffset, eDebugDump, GLMPRINTTEXT_NUMBEREDLINES )); + free( temp ); +#endif + GLMPRINTF(("-D- -----end-----" )); + } + + if ( logString ) + free( logString ); + + bValid = glslDesc->m_valid; + } + break; + } + + if ( !bValid ) + { + GLMDebugPrintf( "Compile of \"%s\" Failed:\n%s\n", m_shaderName, m_text ? m_text : "" ); + } + AssertOnce( bValid ); + + if (bTimeShaderCompiles) + { + shaderCompileTimer.End(); + gShaderCompileQueryTime += shaderCompileTimer.GetDuration(); + } + + return bValid; +} + +void CGLMProgram::LogSlow( EGLMProgramLang lang ) +{ + // find the desc, see if it's marked + GLMShaderDesc *desc = &m_descs[ lang ]; + + if (!desc->m_slowMark) + { +#if !GLM_FREE_SHADER_TEXT + // log it + printf( "\n-------------- Slow %s ( CGLMProgram @ %p, lang %s, name %d ) : \n%s \n", + m_type==kGLMVertexProgram ? "VS" : "FS", + this, + lang==kGLMGLSL ? "GLSL" : "ARB", + (int)(lang==kGLMGLSL ? (int)desc->m_object.glsl : (int)desc->m_object.arb), + m_text + ); +#endif + } + else // complain on a decreasing basis (powers of two) + { + if ( (desc->m_slowMark & (desc->m_slowMark-1)) == 0 ) + { + // short blurb + printf( "\n Slow %s ( CGLMProgram @ %p, lang %s, name %d ) (%d times)", + m_type==kGLMVertexProgram ? "VS" : "FS", + this, + lang==kGLMGLSL ? "GLSL" : "ARB", + (int)(lang==kGLMGLSL ? (int)desc->m_object.glsl : (int)desc->m_object.arb), + desc->m_slowMark+1 + ); + } + } + + // mark it + desc->m_slowMark++; + + +} + +void CGLMProgram::GetLabelIndexCombo ( char *labelOut, int labelOutMaxChars, int *indexOut, int *comboOut ) +{ + // find the label string + // example: + // trans#2871 label:vs-file vertexlit_and_unlit_generic_vs20 vs-index 294912 vs-combo 1234 + // Done in SetProgramText + + *labelOut = 0; + *indexOut = -1; + + if ((strlen( m_labelName ) != 0)) + { + Q_strncpy( labelOut, m_labelName, labelOutMaxChars ); + *indexOut = m_labelIndex; + *comboOut = m_labelCombo; + } +} + +void CGLMProgram::GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ) // mmmmmmmm-nnnnnnnn-filename +{ + // find the label string + // example: + // trans#2871 label:vs-file vertexlit_and_unlit_generic_vs20 vs-index 294912 vs-combo 1234 + // Done in SetProgramText + + *stringOut = 0; + + int len = strlen( m_labelName ); + + if ( (len+20) < stringOutMaxChars ) + { + // output formatted version + sprintf( stringOut, "%08X-%08X-%s", m_labelCombo, m_labelIndex, m_labelName ); + } +} + +//=============================================================================== + + +CGLMShaderPair::CGLMShaderPair( GLMContext *ctx ) +{ + m_ctx = ctx; + m_vertexProg = m_fragmentProg = NULL; + + m_program = gGL->glCreateProgramObjectARB(); + + m_locVertexParams = -1; + m_locVertexBoneParams = -1; + m_locVertexScreenParams = -1; + m_nScreenWidthHeight = 0xFFFFFFFF; + m_locVertexInteger0 = -1; // "i0" + memset( m_locVertexBool, 0xFF, sizeof( m_locVertexBool ) ); + memset( m_locFragmentBool, 0xFF, sizeof( m_locFragmentBool ) ); + m_bHasBoolOrIntUniforms = false; + + m_locFragmentParams = -1; + + m_locFragmentFakeSRGBEnable = -1; + m_fakeSRGBEnableValue = -1.0f; + + memset( m_locSamplers, 0xFF, sizeof( m_locSamplers ) ); + + m_valid = false; + m_bCheckLinkStatus = false; + m_revision = 0; // bumps to 1 once linked +} + +CGLMShaderPair::~CGLMShaderPair( ) +{ + if (m_program) + { + gGL->glDeleteObjectARB( (GLhandleARB)m_program ); + m_program = 0; + } +} + +bool CGLMShaderPair::ValidateProgramPair() +{ + if ( m_vertexProg && m_vertexProg->m_descs[kGLMGLSL].m_textPresent && !m_vertexProg->m_descs[kGLMGLSL].m_valid ) + { + m_vertexProg->CheckValidity( kGLMGLSL ); + } + if (m_fragmentProg && m_fragmentProg->m_descs[kGLMGLSL].m_textPresent && !m_fragmentProg->m_descs[kGLMGLSL].m_valid) + { + m_fragmentProg->CheckValidity( kGLMGLSL ); + } + + if ( !m_valid && m_bCheckLinkStatus ) + { + bool bTimeShaderCompiles = (CommandLine()->FindParm( "-gl_time_shader_compiles" ) != 0); + // If using "-gl_time_shader_compiles", keeps track of total cycle count spent on shader compiles. + CFastTimer shaderCompileTimer; + if (bTimeShaderCompiles) + { + shaderCompileTimer.Start(); + } + + // check for success + GLint result = 0; + gGL->glGetObjectParameterivARB( m_program, GL_OBJECT_LINK_STATUS_ARB, &result ); // want GL_TRUE + m_bCheckLinkStatus = false; + + if (result == GL_TRUE) + { + // success + + m_valid = true; + m_revision++; + } + else + { + GLint length = 0; + GLint laux = 0; + + // do some digging + gGL->glGetObjectParameterivARB( m_program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length ); + + GLcharARB *logString = (GLcharARB *)malloc( length * sizeof(GLcharARB) ); + gGL->glGetInfoLogARB( m_program, length, &laux, logString ); + + GLMPRINTF( ("-D- ----- GLSL link failed: \n %s ", logString) ); +#if !GLM_FREE_SHADER_TEXT + char *vtemp = strdup( m_vertexProg->m_text ); + vtemp[m_vertexProg->m_descs[kGLMGLSL].m_textOffset + m_vertexProg->m_descs[kGLMGLSL].m_textLength] = 0; + + char *ftemp = strdup( m_fragmentProg->m_text ); + ftemp[m_fragmentProg->m_descs[kGLMGLSL].m_textOffset + m_fragmentProg->m_descs[kGLMGLSL].m_textLength] = 0; + + GLMPRINTF( ("-D- ----- GLSL vertex program selected: %08x (handle %08x)", m_vertexProg, m_vertexProg->m_descs[kGLMGLSL].m_object.glsl) ); + GLMPRINTTEXT( (vtemp + m_vertexProg->m_descs[kGLMGLSL].m_textOffset, eDebugDump, GLMPRINTTEXT_NUMBEREDLINES) ); + + GLMPRINTF( ("-D- ----- GLSL fragment program selected: %08x (handle %08x)", m_fragmentProg, m_fragmentProg->m_descs[kGLMGLSL].m_object.glsl) ); + GLMPRINTTEXT( (ftemp + m_fragmentProg->m_descs[kGLMGLSL].m_textOffset, eDebugDump, GLMPRINTTEXT_NUMBEREDLINES) ); + + free( ftemp ); + free( vtemp ); +#endif + free( logString ); + + GLMPRINTF( ("-D- -----end-----") ); + } + + if (m_valid) + { + gGL->glUseProgram( m_program ); + + m_ctx->NewLinkedProgram(); + + m_locVertexParams = gGL->glGetUniformLocationARB( m_program, "vc" ); + m_locVertexBoneParams = gGL->glGetUniformLocationARB( m_program, "vcbones" ); + m_locVertexScreenParams = gGL->glGetUniformLocationARB( m_program, "vcscreen" ); + m_nScreenWidthHeight = 0xFFFFFFFF; + + m_locVertexInteger0 = gGL->glGetUniformLocationARB( m_program, "i0" ); + + m_bHasBoolOrIntUniforms = false; + if (m_locVertexInteger0 >= 0) + m_bHasBoolOrIntUniforms = true; + + for (uint i = 0; i < cMaxVertexShaderBoolUniforms; i++) + { + char buf[256]; + V_snprintf( buf, sizeof(buf), "b%d", i ); + m_locVertexBool[i] = gGL->glGetUniformLocationARB( m_program, buf ); + if (m_locVertexBool[i] != -1) + m_bHasBoolOrIntUniforms = true; + } + + for (uint i = 0; i < cMaxFragmentShaderBoolUniforms; i++) + { + char buf[256]; + V_snprintf( buf, sizeof(buf), "fb%d", i ); + m_locFragmentBool[i] = gGL->glGetUniformLocationARB( m_program, buf ); + if (m_locFragmentBool[i] != -1) + m_bHasBoolOrIntUniforms = true; + } + + m_locFragmentParams = gGL->glGetUniformLocationARB( m_program, "pc" ); + + for (uint i = 0; i < kGLMNumProgramTypes; i++) + { + m_NumUniformBufferParams[i] = 0; + + if (i == kGLMVertexProgram) + { + if (m_locVertexParams < 0) + continue; + } + else if (m_locFragmentParams < 0) + continue; + + const uint nNum = (i == kGLMVertexProgram) ? m_vertexProg->m_descs[kGLMGLSL].m_highWater : m_fragmentProg->m_descs[kGLMGLSL].m_highWater; + + uint j; + for (j = 0; j < nNum; j++) + { + char buf[256]; + V_snprintf( buf, sizeof(buf), "%cc[%i]", "vp"[i], j ); + // Grab the handle of each array element, so we can more efficiently update array elements in the middle. + int l = m_UniformBufferParams[i][j] = gGL->glGetUniformLocationARB( m_program, buf ); + if (l < 0) + break; + } + + m_NumUniformBufferParams[i] = j; + } + + m_locFragmentFakeSRGBEnable = gGL->glGetUniformLocationARB( m_program, "flSRGBWrite" ); + m_fakeSRGBEnableValue = -1.0f; + + for (int sampler = 0; sampler < 16; sampler++) + { + char tmp[16]; + sprintf( tmp, "sampler%d", sampler ); // sampler0 .. sampler1.. etc + + GLint nLoc = gGL->glGetUniformLocationARB( m_program, tmp ); + m_locSamplers[sampler] = nLoc; + if (nLoc >= 0) + { + gGL->glUniform1iARB( nLoc, sampler ); + } + } + } + else + { + m_locVertexParams = -1; + m_locVertexBoneParams = -1; + m_locVertexScreenParams = -1; + m_nScreenWidthHeight = 0xFFFFFFFF; + + m_locVertexInteger0 = -1; + memset( m_locVertexBool, 0xFF, sizeof(m_locVertexBool) ); + memset( m_locFragmentBool, 0xFF, sizeof(m_locFragmentBool) ); + m_bHasBoolOrIntUniforms = false; + + m_locFragmentParams = -1; + m_locFragmentFakeSRGBEnable = -1; + m_fakeSRGBEnableValue = -999; + + memset( m_locSamplers, 0xFF, sizeof(m_locSamplers) ); + + m_revision = 0; + } + + if (bTimeShaderCompiles) + { + shaderCompileTimer.End(); + gShaderLinkQueryTime += shaderCompileTimer.GetDuration(); + } + } + + return m_valid; +} + +// glUseProgram() will be called as a side effect! +bool CGLMShaderPair::SetProgramPair( CGLMProgram *vp, CGLMProgram *fp ) +{ + bool bTimeShaderCompiles = (CommandLine()->FindParm( "-gl_time_shader_compiles" ) != 0); + // If using "-gl_time_shader_compiles", keeps track of total cycle count spent on shader compiles. + CFastTimer shaderCompileTimer; + if (bTimeShaderCompiles) + { + shaderCompileTimer.Start(); + } + + m_valid = false; // assume failure + + // No need to check that vp and fp are valid at this point (ie shader compile succeed) + // It is permissible to attach a shader object to a program before source code has been loaded + // into the shader object or before the shader object has been compiled. The program won't + // link if one or more of the shader objects has not been successfully compiled. + // (Defer querying the compile and link status to take advantage of GLSL shaders + // building in parallels) + bool vpgood = (vp != NULL); + bool fpgood = (fp != NULL); + + if ( !fpgood ) + { + // fragment side allowed to be "null". + fp = m_ctx->m_pNullFragmentProgram; + } + + if ( vpgood && fpgood ) + { + if ( vp->m_nCentroidMask != fp->m_nCentroidMask ) + { + Warning( "CGLMShaderPair::SetProgramPair: Centroid masks differ at link time of vertex shader %s and pixel shader %s!\n", + vp->m_shaderName, fp->m_shaderName ); + } + + // attempt link. but first, detach any previously attached programs + if (m_vertexProg) + { + gGL->glDetachObjectARB(m_program, m_vertexProg->m_descs[kGLMGLSL].m_object.glsl); + m_vertexProg = NULL; + } + + if (m_fragmentProg) + { + gGL->glDetachObjectARB(m_program, m_fragmentProg->m_descs[kGLMGLSL].m_object.glsl); + m_fragmentProg = NULL; + } + + // now attach + + gGL->glAttachObjectARB( m_program, vp->m_descs[kGLMGLSL].m_object.glsl ); + m_vertexProg = vp; + + gGL->glAttachObjectARB( m_program, fp->m_descs[kGLMGLSL].m_object.glsl ); + m_fragmentProg = fp; + + // force the locations for input attributes v0-vN to be at locations 0-N + // use the vertex attrib map to know which slots are live or not... oy! we don't have that map yet... but it's OK. + // fallback - just force v0-v15 to land in locations 0-15 as a standard. + + for( int i = 0; i < 16; i++ ) + { + char tmp[16]; + sprintf(tmp, "v%d", i); // v0 v1 v2 ... et al + + gGL->glBindAttribLocationARB( m_program, i, tmp ); + } +#if !GLM_FREE_SHADER_TEXT + if (CommandLine()->CheckParm("-dumpallshaders")) + { + // Dump all shaders, for debugging. + FILE* pFile = fopen("shaderdump.txt", "a+"); + if (pFile) + { + fprintf(pFile, "--------------VP:%s\n%s\n", vp->m_shaderName, vp->m_text); + fprintf(pFile, "--------------FP:%s\n%s\n", fp->m_shaderName, fp->m_text); + fclose(pFile); + } + } +#endif + + // now link + gGL->glLinkProgramARB( m_program ); + m_bCheckLinkStatus = true; + } + else + { + // fail + Assert(!"Can't link these programs"); + } + + // Check shader validity at creation time. This will cause the driver to not be able to + // multi-thread/defer shader compiles, but it is useful for getting error messages on the + // shader when it is compiled + bool bValidateShaderEarly = (CommandLine()->FindParm( "-gl_validate_shader_early" ) != 0); + if (bValidateShaderEarly) + { + ValidateProgramPair(); + } + + if (bTimeShaderCompiles) + { + shaderCompileTimer.End(); + gShaderLinkTime += shaderCompileTimer.GetDuration(); + gShaderLinkCount++; + } + + return m_valid; +} + + +bool CGLMShaderPair::RefreshProgramPair ( void ) +{ + // re-link and re-query the uniforms. + + // since SetProgramPair knows how to detach previously attached shader objects, just pass the same ones in again. + CGLMProgram *vp = m_vertexProg; + CGLMProgram *fp = m_fragmentProg; + + bool vpgood = (vp!=NULL) && (vp->m_descs[ kGLMGLSL ].m_valid); + bool fpgood = (fp!=NULL) && (fp->m_descs[ kGLMGLSL ].m_valid); + + if (vpgood && fpgood) + { + SetProgramPair( vp, fp ); + } + else + { + DebuggerBreak(); + return false; + } + + return false; +} + + +//=============================================================================== + +CGLMShaderPairCache::CGLMShaderPairCache( GLMContext *ctx ) +{ + m_ctx = ctx; + + m_mark = 1; + + m_rowsLg2 = gl_shaderpair_cacherows_lg2.GetInt(); + if (m_rowsLg2 < 10) + m_rowsLg2 = 10; + m_rows = 1<Purge(); + (void)purgeResult; + Assert( !purgeResult ); + + if (m_entries) + { + free( m_entries ); + m_entries = NULL; + } + + if (m_evictions) + { + free( m_evictions ); + m_evictions = NULL; + } + +#if GL_SHADER_PAIR_CACHE_STATS + if (m_hits) + { + free( m_hits ); + m_hits = NULL; + } +#endif +} + +// Set this convar internally to build or add to the shader pair cache file (link hints) +// We really only expect this to work on POSIX +static ConVar glm_cacheprograms( "glm_cacheprograms", "0", FCVAR_DEVELOPMENTONLY ); + +#define PROGRAM_CACHE_FILE "program_cache.cfg" + +static void WriteToProgramCache( CGLMShaderPair *pair ) +{ + KeyValues *pProgramCache = new KeyValues( "programcache" ); + pProgramCache->LoadFromFile( g_pFullFileSystem, PROGRAM_CACHE_FILE, "MOD" ); + + if ( !pProgramCache ) + { + Warning( "Could not write to program cache file!\n" ); + return; + } + + // extract values of interest which represent a pair of shaders + + char vprogramName[128]; + int vprogramStaticIndex = -1; + int vprogramDynamicIndex = -1; + pair->m_vertexProg->GetLabelIndexCombo( vprogramName, sizeof(vprogramName), &vprogramStaticIndex, &vprogramDynamicIndex ); + + + char pprogramName[128]; + int pprogramStaticIndex = -1; + int pprogramDynamicIndex = -1; + pair->m_fragmentProg->GetLabelIndexCombo( pprogramName, sizeof(pprogramName), &pprogramStaticIndex, &pprogramDynamicIndex ); + + // make up a key - this thing is really a list of tuples, so need not be keyed by anything particular + KeyValues *pProgramKey = pProgramCache->CreateNewKey(); + Assert( pProgramKey ); + + pProgramKey->SetString ( "vs", vprogramName ); + pProgramKey->SetString ( "ps", pprogramName ); + + pProgramKey->SetInt ( "vs_static", vprogramStaticIndex ); + pProgramKey->SetInt ( "ps_static", pprogramStaticIndex ); + + pProgramKey->SetInt ( "vs_dynamic", vprogramDynamicIndex ); + pProgramKey->SetInt ( "ps_dynamic", pprogramDynamicIndex ); + + pProgramCache->SaveToFile( g_pFullFileSystem, PROGRAM_CACHE_FILE, "MOD" ); + pProgramCache->deleteThis(); +} + +// Calls glUseProgram() as a side effect +CGLMShaderPair *CGLMShaderPairCache::SelectShaderPairInternal( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int rowIndex ) +{ + CGLMShaderPair *result = NULL; + +#if GLMDEBUG + int loglevel = gl_shaderpair_cachelog.GetInt(); +#else + const int loglevel = 0; +#endif + + char vtempname[128]; + int vtempindex = -1; vtempindex; + int vtempcombo = -1; vtempcombo; + + char ptempname[128]; + int ptempindex = -1; ptempindex; + int ptempcombo = -1; ptempcombo; + + CGLMPairCacheEntry *row = HashRowPtr( rowIndex ); + + // Re-probe to find the oldest and first unoccupied entry (this func should be very rarely called if the cache is properly configured so re-scanning shouldn't matter). + int hitway, emptyway, oldestway; + HashRowProbe( row, vp, fp, extraKeyBits, hitway, emptyway, oldestway ); + Assert( hitway == -1 ); + + // we missed. if there is no empty way, then somebody's getting evicted. + int destway = -1; + + if (emptyway>=0) + { + destway = emptyway; + + if (loglevel >= 2) // misses logged at level 3 and higher + { + printf("\nSSP: miss - row %05d - ", rowIndex ); + } + } + else + { + // evict the oldest way + Assert( oldestway >= 0); // better not come back negative + + CGLMPairCacheEntry *evict = row + oldestway; + + Assert( evict->m_pair != NULL ); + Assert( evict->m_pair != m_ctx->m_pBoundPair ); // just check + + ///////////////////////FIXME may need to do a shoot-down if the pair being evicted is currently active in the context + + m_evictions[ rowIndex ]++; + + // log eviction if desired + if (loglevel >= 2) // misses logged at level 3 and higher + { + //evict->m_vertexProg->GetLabelIndexCombo( vtempname, sizeof(vtempname), &vtempindex, &vtempcombo ); + //evict->m_fragmentProg->GetLabelIndexCombo( ptempname, sizeof(ptempname), &ptempindex, &ptempcombo ); + //printf("\nSSP: miss - row %05d - [ %s/%d/%d %s/%d/%d ]'s %d'th eviction - ", rowIndex, vtempname, vtempindex, vtempcombo, ptempname, ptempindex, ptempcombo, m_evictions[ rowIndex ] ); + + evict->m_vertexProg->GetComboIndexNameString( vtempname, sizeof(vtempname) ); + evict->m_fragmentProg->GetComboIndexNameString( ptempname, sizeof(ptempname) ); + printf("\nSSP: miss - row %05d - [ %s + %s ]'s %d'th eviction - ", rowIndex, vtempname, ptempname, m_evictions[ rowIndex ] ); + } + + delete evict->m_pair; evict->m_pair = NULL; + memset( evict, 0, sizeof(*evict) ); + + destway = oldestway; + } + + // make the new entry + CGLMPairCacheEntry *newentry = row + destway; + + newentry->m_lastMark = m_mark; + newentry->m_vertexProg = vp; + newentry->m_fragmentProg = fp; + newentry->m_extraKeyBits = extraKeyBits; + newentry->m_pair = new CGLMShaderPair( m_ctx ); + Assert( newentry->m_pair ); + newentry->m_pair->SetProgramPair( vp, fp ); + + if (loglevel >= 2) // say a little bit more + { + //newentry->m_vertexProg->GetLabelIndexCombo( vtempname, sizeof(vtempname), &vtempindex, &vtempcombo ); + //newentry->m_fragmentProg->GetLabelIndexCombo( ptempname, sizeof(ptempname), &ptempindex, &ptempcombo ); + //printf("new [ %s/%d/%d %s/%d/%d ]", vtempname, vtempindex, vtempcombo, ptempname, ptempindex, ptempcombo ); + + newentry->m_vertexProg->GetComboIndexNameString( vtempname, sizeof(vtempname) ); + newentry->m_fragmentProg->GetComboIndexNameString( ptempname, sizeof(ptempname) ); + printf("new [ %s + %s ]", vtempname, ptempname ); + } + + m_mark = m_mark+1; + if (!m_mark) // somewhat unlikely this will ever be reached.. but we need to avoid zero as a mark value + { + m_mark = 1; + } + + result = newentry->m_pair; + + if (glm_cacheprograms.GetInt()) + { + WriteToProgramCache( newentry->m_pair ); + } + + return result; +} + +void CGLMShaderPairCache::QueryShaderPair( int index, GLMShaderPairInfo *infoOut ) +{ + if ( (index<0) || ( static_cast(index) >= (m_rows*m_ways) ) ) + { + // no such location + memset( infoOut, 0, sizeof(*infoOut) ); + + infoOut->m_status = -1; + } + else + { + // locate the entry, and see if an active pair is present. + // if so, extract info and return with m_status=1. + // if not, exit with m_status = 0. + + CGLMPairCacheEntry *entry = &m_entries[index]; + + if (entry->m_pair) + { + // live + // extract values of interest for caller + + entry->m_pair->m_vertexProg->GetLabelIndexCombo ( infoOut->m_vsName, sizeof(infoOut->m_vsName), &infoOut->m_vsStaticIndex, &infoOut->m_vsDynamicIndex ); + entry->m_pair->m_fragmentProg->GetLabelIndexCombo ( infoOut->m_psName, sizeof(infoOut->m_psName), &infoOut->m_psStaticIndex, &infoOut->m_psDynamicIndex ); + + infoOut->m_status = 1; + } + else + { + // not + memset( infoOut, 0, sizeof(*infoOut) ); + infoOut->m_status = 0; + } + } +} + +bool CGLMShaderPairCache::PurgePairsWithShader( CGLMProgram *prog ) +{ + bool result = false; + + // walk all rows*ways + int limit = m_rows * m_ways; + for( int i=0; i < limit; i++) + { + CGLMPairCacheEntry *entry = &m_entries[i]; + + if (entry->m_pair) + { + //scrub it, if not currently bound, and if the supplied shader matches either stage + if ( (entry->m_vertexProg==prog) || (entry->m_fragmentProg==prog) ) + { + // found it, but does it conflict with bound pair ? + if (entry->m_pair == m_ctx->m_pBoundPair) + { + m_ctx->m_pBoundPair = NULL; + m_ctx->m_bDirtyPrograms = true; + } + delete entry->m_pair; + memset( entry, 0, sizeof(*entry) ); + } + } + } + return result; +} + +bool CGLMShaderPairCache::Purge( void ) +{ + bool result = false; + + // walk all rows*ways + int limit = m_rows * m_ways; + for( int i=0; i < limit; i++) + { + CGLMPairCacheEntry *entry = &m_entries[i]; + + if (entry->m_pair) + { + //scrub it, unless the pair is the currently bound pair in our parent glm context + if (entry->m_pair != m_ctx->m_pBoundPair) + { + delete entry->m_pair; + memset( entry, 0, sizeof(*entry) ); + } + else + { + result = true; + } + } + } + return result; +} + +void CGLMShaderPairCache::DumpStats ( void ) +{ +#if GL_SHADER_PAIR_CACHE_STATS + printf("\n------------------\npair cache stats"); + int total = 0; + for( uint row=0; row < m_rows; row++ ) + { + if ( (m_evictions[row] != 0) || (m_hits[row] != 0) ) + { + printf("\n row %d : %d evictions, %d hits",row,m_evictions[row], m_hits[row]); + total += m_evictions[row]; + } + } + printf("\n\npair cache evictions: %d\n-----------------------\n",total ); +#endif +} + + //=============================== + + diff --git a/togles/linuxwin/cglmquery.cpp b/togles/linuxwin/cglmquery.cpp new file mode 100644 index 00000000..199780a4 --- /dev/null +++ b/togles/linuxwin/cglmquery.cpp @@ -0,0 +1,363 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmquery.cpp +// +//=============================================================================== + +#include "togl/rendermechanism.h" + +#ifndef _WIN32 + #include +#endif + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + +//=============================================================================== + +// http://www.opengl.org/registry/specs/ARB/occlusion_query.txt +// Workaround for "Calling either GenQueriesARB or DeleteQueriesARB while any query of any target is active causes an INVALID_OPERATION error to be generated." +uint CGLMQuery::s_nTotalOcclusionQueryCreatesOrDeletes; + +extern ConVar gl_errorcheckall; +extern ConVar gl_errorcheckqueries; +extern ConVar gl_errorchecknone; + +// how many microseconds to wait after a failed query-available test +// presently on MTGL this doesn't happen, but it could change, keep this handy +ConVar gl_nullqueries( "gl_nullqueries", "0" ); + + +//=============================================================================== + +CGLMQuery::CGLMQuery( GLMContext *ctx, GLMQueryParams *params ) +{ + // get the type of query requested + // generate name(s) needed + // set initial state appropriately + + m_ctx = ctx; + m_params = *params; + + m_name = 0; + m_syncobj = 0; + + m_started = m_stopped = m_done = false; + + m_nullQuery = false; + // assume value of convar at start time + // does not change during individual query lifetime + // started null = stays null + // started live = stays live + + switch(m_params.m_type) + { + case EOcclusion: + { + //make an occlusion query (and a fence to go with it) + gGL->glGenQueriesARB( 1, &m_name ); + s_nTotalOcclusionQueryCreatesOrDeletes++; + GLMPRINTF(("-A- CGLMQuery(OQ) created name %d", m_name)); + } + break; + + case EFence: + //make a fence - no aux fence needed + + m_syncobj = 0; + + if (gGL->m_bHave_GL_ARB_sync) + { /* GL_ARB_sync doesn't separate gen and set, so we do glFenceSync() later. */ } + else if (gGL->m_bHave_GL_NV_fence) + gGL->glGenFencesNV(1, &m_name ); + else if (gGL->m_bHave_GL_APPLE_fence) + gGL->glGenFencesAPPLE(1, &m_name ); + + GLMPRINTF(("-A- CGLMQuery(fence) created name %d", m_name)); + break; + } + +} + +CGLMQuery::~CGLMQuery() +{ + GLMPRINTF(("-A-> ~CGLMQuery")); + + // make sure query has completed (might not be necessary) + // delete the name(s) + + switch(m_params.m_type) + { + case EOcclusion: + { + // do a finish occlusion query ? + GLMPRINTF(("-A- ~CGLMQuery(OQ) deleting name %d", m_name)); + gGL->glDeleteQueriesARB(1, &m_name ); + s_nTotalOcclusionQueryCreatesOrDeletes++; + } + break; + + case EFence: + { + // do a finish fence ? + GLMPRINTF(("-A- ~CGLMQuery(fence) deleting name %llu", gGL->m_bHave_GL_ARB_sync ? (unsigned long long) m_syncobj : (unsigned long long) m_name)); +#ifdef HAVE_GL_ARB_SYNC + if (gGL->m_bHave_GL_ARB_sync) + gGL->glDeleteSync( m_syncobj ); + else +#endif + if (gGL->m_bHave_GL_NV_fence) + gGL->glDeleteFencesNV(1, &m_name ); + else if (gGL->m_bHave_GL_APPLE_fence) + gGL->glDeleteFencesAPPLE(1, &m_name ); + } + break; + } + + m_name = 0; + m_syncobj = 0; + + GLMPRINTF(("-A-< ~CGLMQuery")); +} + + + + +void CGLMQuery::Start( void ) // "start counting" +{ + m_nullQuery = (gl_nullqueries.GetInt() != 0); // latch value for remainder of query life + + m_started = true; + m_stopped = false; + m_done = false; + + switch(m_params.m_type) + { + case EOcclusion: + { + if (m_nullQuery) + { + // do nothing.. + } + else + { + gGL->glBeginQueryARB( GL_SAMPLES_PASSED_ARB, m_name ); + } + } + break; + + case EFence: +#ifdef HAVE_GL_ARB_SYNC + if (gGL->m_bHave_GL_ARB_sync) + { + if (m_syncobj != 0) gGL->glDeleteSync(m_syncobj); + m_syncobj = gGL->glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + } + else +#endif + if (gGL->m_bHave_GL_NV_fence) + gGL->glSetFenceNV( m_name, GL_ALL_COMPLETED_NV ); + else if (gGL->m_bHave_GL_APPLE_fence) + gGL->glSetFenceAPPLE( m_name ); + + m_stopped = true; // caller should not call Stop on a fence, it self-stops + break; + } +} + +void CGLMQuery::Stop( void ) // "stop counting" +{ + Assert(m_started); + + if ( m_stopped ) + return; + + switch(m_params.m_type) + { + case EOcclusion: + { + if (m_nullQuery) + { + // do nothing.. + } + else + { + gGL->glEndQueryARB( GL_SAMPLES_PASSED_ARB ); // we are only putting the request-to-stop-counting into the cmd stream. + } + } + break; + + case EFence: + // nop - you don't "end" a fence, you just test it and/or finish it out in Complete + break; + } + + m_stopped = true; +} + +bool CGLMQuery::IsDone( void ) +{ + Assert(m_started); + Assert(m_stopped); + + if(!m_done) // you can ask more than once, but we only check until it comes back as done. + { + // on occlusion: glGetQueryObjectivARB - large cost on pre SLGU, cheap after + // on fence: glTestFence* on the fence + switch(m_params.m_type) + { + case EOcclusion: // just test the fence that was set after the query begin + { + if (m_nullQuery) + { + // do almost nothing.. but claim work is complete + m_done = true; + } + else + { + // prepare to pay a big price on drivers prior to 10.6.4+SLGU + + GLint available = 0; + gGL->glGetQueryObjectivARB(m_name, GL_QUERY_RESULT_AVAILABLE_ARB, &available ); + + m_done = (available != 0); + } + } + break; + + case EFence: + { +#ifdef HAVE_GL_ARB_SYNC + if (gGL->m_bHave_GL_ARB_sync) + m_done = (gGL->glClientWaitSync( m_syncobj, 0, 0 ) == GL_ALREADY_SIGNALED); + else +#endif + if ( m_name == 0 ) + m_done = true; + else if (gGL->m_bHave_GL_NV_fence) + m_done = gGL->glTestFenceNV( m_name ) != 0; + else if (gGL->m_bHave_GL_APPLE_fence) + m_done = gGL->glTestFenceAPPLE( m_name ) != 0; + + if (m_done) + { + if (gGL->m_bHave_GL_ARB_sync) + { /* no-op; we already know it's set to GL_ALREADY_SIGNALED. */ } + else + { + if (gGL->m_bHave_GL_NV_fence) + gGL->glFinishFenceNV( m_name ); // no set fence goes un-finished + else if (gGL->m_bHave_GL_APPLE_fence) + gGL->glFinishFenceAPPLE( m_name ); // no set fence goes un-finished + } + } + } + break; + } + } + + return m_done; +} + +void CGLMQuery::Complete( uint *result ) +{ + uint resultval = 0; + //bool bogus_available = false; + + // blocking call if not done + Assert(m_started); + Assert(m_stopped); + + switch(m_params.m_type) + { + case EOcclusion: + { + if (m_nullQuery) + { + m_done = true; + resultval = 0; // we did say "null queries..." + } + else + { + gGL->glGetQueryObjectuivARB( m_name, GL_QUERY_RESULT_ARB, &resultval); + m_done = true; + } + } + break; + + case EFence: + { + if(!m_done) + { +#ifdef HAVE_GL_ARB_SYNC + if (gGL->m_bHave_GL_ARB_sync) + { + if (gGL->glClientWaitSync( m_syncobj, 0, 0 ) != GL_ALREADY_SIGNALED) + { + GLenum syncstate; + do { + const GLuint64 timeout = 10 * ((GLuint64)1000 * 1000 * 1000); // 10 seconds in nanoseconds. + (void)timeout; + syncstate = gGL->glClientWaitSync( m_syncobj, GL_SYNC_FLUSH_COMMANDS_BIT, 0 ); + } while (syncstate == GL_TIMEOUT_EXPIRED); // any errors or success break out of this loop. + } + } + else +#endif + if (gGL->m_bHave_GL_NV_fence) + gGL->glFinishFenceNV( m_name ); + else if (gGL->m_bHave_GL_APPLE_fence) + gGL->glFinishFenceAPPLE( m_name ); + + m_done = true; // for clarity or if they try to Complete twice + } + } + break; + } + + Assert( m_done ); + + // reset state for re-use - i.e. you have to call Complete if you want to re-use the object + m_started = m_stopped = m_done = false; + + if (result) // caller may pass NULL if not interested in result, for example to clear a fence + { + *result = resultval; + } +} + + + + // accessors for the started/stopped state +bool CGLMQuery::IsStarted ( void ) +{ + return m_started; +} + +bool CGLMQuery::IsStopped ( void ) +{ + return m_stopped; +} + diff --git a/togles/linuxwin/cglmtex.cpp b/togles/linuxwin/cglmtex.cpp new file mode 100644 index 00000000..30eb9e46 --- /dev/null +++ b/togles/linuxwin/cglmtex.cpp @@ -0,0 +1,1990 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// cglmtex.cpp +// +//=============================================================================== + +#include "togl/rendermechanism.h" + +#include "tier0/icommandline.h" +#include "glmtexinlines.h" + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + +#if defined(OSX) +#include "appframework/ilaunchermgr.h" +extern ILauncherMgr *g_pLauncherMgr; +#endif + +//=============================================================================== + +#if GLMDEBUG +CGLMTex *g_pFirstCGMLTex; +#endif + +ConVar gl_pow2_tempmem( "gl_pow2_tempmem", "0", FCVAR_INTERNAL_USE, + "If set, use power-of-two allocations for temporary texture memory during uploads. " + "May help with fragmentation on certain systems caused by heavy churn of large allocations." ); + +#define TEXSPACE_LOGGING 0 + +// encoding layout to an index where the bits read +// 4 : 1 if compressed +// 2 : 1 if not power of two +// 1 : 1 if mipmapped + +bool pwroftwo (int val ) +{ + return (val & (val-1)) == 0; +} + +int sEncodeLayoutAsIndex( GLMTexLayoutKey *key ) +{ + int index = 0; + + if (key->m_texFlags & kGLMTexMipped) + { + index |= 1; + } + + if ( ! ( pwroftwo(key->m_xSize) && pwroftwo(key->m_ySize) && pwroftwo(key->m_zSize) ) ) + { + // if not all power of two + index |= 2; + } + + if (GetFormatDesc( key->m_texFormat )->m_chunkSize >1 ) + { + index |= 4; + } + + return index; +} + +static unsigned long g_texGlobalBytes[8]; + +//=============================================================================== + +const GLMTexFormatDesc g_formatDescTable[] = +{ + // not yet handled by this table: + // D3DFMT_INDEX16, D3DFMT_VERTEXDATA // D3DFMT_INDEX32, + // WTF { D3DFMT_R5G6R5 ???, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 1, 2 }, + // WTF { D3DFMT_A ???, GL_ALPHA8, GL_ALPHA, GL_UNSIGNED_BYTE, 1, 1 }, + // ??? D3DFMT_V8U8, + // ??? D3DFMT_Q8W8V8U8, + // ??? D3DFMT_X8L8V8U8, + // ??? D3DFMT_R32F, + // ??? D3DFMT_D24X4S4 unsure how to handle or if it is ever used.. + // ??? D3DFMT_D15S1 ever used ? + // ??? D3DFMT_D24X8 ever used? + + // summ-name d3d-format gl-int-format gl-int-format-srgb gl-data-format gl-data-type chunksize, bytes-per-sqchunk + { "_D16", D3DFMT_D16, GL_DEPTH_COMPONENT16, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 1, 2 }, + { "_D24X8", D3DFMT_D24X8, GL_DEPTH_COMPONENT24, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 1, 4 }, // ??? unsure on this one + { "_D24S8", D3DFMT_D24S8, GL_DEPTH24_STENCIL8_EXT, 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 1, 4 }, + + { "_A8R8G8B8", D3DFMT_A8R8G8B8, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 1, 4 }, + { "_A4R4G4B4", D3DFMT_A4R4G4B4, GL_RGBA4, 0, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 1, 2 }, + { "_X8R8G8B8", D3DFMT_X8R8G8B8, GL_RGB8, GL_SRGB8_EXT, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 1, 4 }, + + { "_X1R5G5B5", D3DFMT_X1R5G5B5, GL_RGB5, 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 1, 2 }, + { "_A1R5G5B5", D3DFMT_A1R5G5B5, GL_RGB5_A1, 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 1, 2 }, + + { "_L8", D3DFMT_L8, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, GL_LUMINANCE, GL_UNSIGNED_BYTE, 1, 1 }, + { "_A8L8", D3DFMT_A8L8, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, 2 }, + + { "_DXT1", D3DFMT_DXT1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_BYTE, 4, 8 }, + { "_DXT3", D3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_BYTE, 4, 16 }, + { "_DXT5", D3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_BYTE, 4, 16 }, + + { "_A16B16G16R16F", D3DFMT_A16B16G16R16F, GL_RGBA16F_ARB, 0, GL_RGBA, GL_HALF_FLOAT_ARB, 1, 8 }, + { "_A16B16G16R16", D3DFMT_A16B16G16R16, GL_RGBA16, 0, GL_RGBA, GL_UNSIGNED_SHORT, 1, 8 }, // 16bpc integer tex + + { "_A32B32G32R32F", D3DFMT_A32B32G32R32F, GL_RGBA32F_ARB, 0, GL_RGBA, GL_FLOAT, 1, 16 }, + + { "_R8G8B8", D3DFMT_R8G8B8, GL_RGB8, GL_SRGB8_EXT, GL_BGR, GL_UNSIGNED_BYTE, 1, 3 }, + + { "_A8", D3DFMT_A8, GL_ALPHA8, 0, GL_ALPHA, GL_UNSIGNED_BYTE, 1, 1 }, + { "_R5G6B5", D3DFMT_R5G6B5, GL_RGB, GL_SRGB_EXT, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 1, 2 }, + + // fakey tex formats: the stated GL format and the memory layout may not agree (U8V8 for example) + + // _Q8W8V8U8 we just pass through as RGBA bytes. Shader does scale/bias fix + { "_Q8W8V8U8", D3DFMT_Q8W8V8U8, GL_RGBA8, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 1, 4 }, // straight ripoff of D3DFMT_A8R8G8B8 + + // U8V8 is exposed to the client as 2-bytes per texel, but we download it as 3-byte RGB. + // WriteTexels needs to do that conversion from rg8 to rgb8 in order to be able to download it correctly + { "_V8U8", D3DFMT_V8U8, GL_RGB8, 0, GL_RG, GL_BYTE, 1, 2 }, + + { "_R32F", D3DFMT_R32F, GL_R32F, GL_R32F, GL_RED, GL_FLOAT, 1, 4 }, +//$ TODO: Need to merge bitmap changes over from Dota to get these formats. +#if 0 + { "_A2R10G10B10", D3DFMT_A2R10G10B10, GL_RGB10_A2, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_10_10_10_2, 1, 4 }, + { "_A2B10G10R10", D3DFMT_A2B10G10R10, GL_RGB10_A2, GL_RGB10_A2, GL_BGRA, GL_UNSIGNED_INT_10_10_10_2, 1, 4 }, +#endif + + /* + // NV shadow depth tex + D3DFMT_NV_INTZ = 0x5a544e49, // MAKEFOURCC('I','N','T','Z') + D3DFMT_NV_RAWZ = 0x5a574152, // MAKEFOURCC('R','A','W','Z') + + // NV null tex + D3DFMT_NV_NULL = 0x4c4c554e, // MAKEFOURCC('N','U','L','L') + + // ATI shadow depth tex + D3DFMT_ATI_D16 = 0x36314644, // MAKEFOURCC('D','F','1','6') + D3DFMT_ATI_D24S8 = 0x34324644, // MAKEFOURCC('D','F','2','4') + + // ATI 1N and 2N compressed tex + D3DFMT_ATI_2N = 0x32495441, // MAKEFOURCC('A', 'T', 'I', '2') + D3DFMT_ATI_1N = 0x31495441, // MAKEFOURCC('A', 'T', 'I', '1') + */ +}; + +int g_formatDescTableCount = sizeof(g_formatDescTable) / sizeof( g_formatDescTable[0] ); + +const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format ) +{ + for( int i=0; i= range) DebuggerBreak(); + + *valuebuf = (*valuebuf << width) | scaled; +} + +// return true if successful +bool GLMGenTexels( GLMGenTexelParams *params ) +{ + unsigned char chunkbuf[256]; // can't think of any chunk this big.. + + const GLMTexFormatDesc *format = GetFormatDesc( params->m_format ); + + if (!format) + { + return FALSE; // fail + } + + // this section just generates one square chunk in the desired format + unsigned long *temp32 = (unsigned long*)chunkbuf; + unsigned int chunksize = 0; // we can sanity check against the format table with this + + switch( params->m_format ) + { + // comment shows byte order in RAM + // lowercase is bit arrangement in a byte + + case D3DFMT_A8R8G8B8: // B G R A + InsertTexelComponentFixed( params->a, 8, temp32 ); // A is inserted first and winds up at most significant bits after insertions follow + InsertTexelComponentFixed( params->r, 8, temp32 ); + InsertTexelComponentFixed( params->g, 8, temp32 ); + InsertTexelComponentFixed( params->b, 8, temp32 ); + chunksize = 4; + break; + + case D3DFMT_A4R4G4B4: // [ggggbbbb] [aaaarrrr] RA (nibbles) + InsertTexelComponentFixed( params->a, 4, temp32 ); + InsertTexelComponentFixed( params->r, 4, temp32 ); + InsertTexelComponentFixed( params->g, 4, temp32 ); + InsertTexelComponentFixed( params->b, 4, temp32 ); + chunksize = 2; + break; + + case D3DFMT_X8R8G8B8: // B G R X + InsertTexelComponentFixed( 0.0, 8, temp32 ); + InsertTexelComponentFixed( params->r, 8, temp32 ); + InsertTexelComponentFixed( params->g, 8, temp32 ); + InsertTexelComponentFixed( params->b, 8, temp32 ); + chunksize = 4; + break; + + case D3DFMT_X1R5G5B5: // [gggbbbbb] [xrrrrrgg] + InsertTexelComponentFixed( 0.0, 1, temp32 ); + InsertTexelComponentFixed( params->r, 5, temp32 ); + InsertTexelComponentFixed( params->g, 5, temp32 ); + InsertTexelComponentFixed( params->b, 5, temp32 ); + chunksize = 2; + break; + + case D3DFMT_A1R5G5B5: // [gggbbbbb] [arrrrrgg] + InsertTexelComponentFixed( params->a, 1, temp32 ); + InsertTexelComponentFixed( params->r, 5, temp32 ); + InsertTexelComponentFixed( params->g, 5, temp32 ); + InsertTexelComponentFixed( params->b, 5, temp32 ); + chunksize = 2; + break; + + case D3DFMT_L8: // L // caller, use R for L + InsertTexelComponentFixed( params->r, 8, temp32 ); + chunksize = 1; + break; + + case D3DFMT_A8L8: // L A // caller, use R for L and A for A + InsertTexelComponentFixed( params->a, 8, temp32 ); + InsertTexelComponentFixed( params->r, 8, temp32 ); + chunksize = 2; + break; + + case D3DFMT_R8G8B8: // B G R + InsertTexelComponentFixed( params->r, 8, temp32 ); + InsertTexelComponentFixed( params->g, 8, temp32 ); + InsertTexelComponentFixed( params->b, 8, temp32 ); + chunksize = 3; + break; + + case D3DFMT_A8: // A + InsertTexelComponentFixed( params->a, 8, temp32 ); + chunksize = 1; + break; + + case D3DFMT_R5G6B5: // [gggbbbbb] [rrrrrggg] + InsertTexelComponentFixed( params->r, 5, temp32 ); + InsertTexelComponentFixed( params->g, 6, temp32 ); + InsertTexelComponentFixed( params->b, 5, temp32 ); + chunksize = 2; + break; + + case D3DFMT_DXT1: + { + memset( temp32, 0, 8 ); // zap 8 bytes + + // two 565 RGB words followed by 32 bits of 2-bit interp values for a 4x4 block + // we write the same color to both slots and all zeroes for the mask (one color total) + + unsigned long dxt1_color = 0; + + // generate one such word and clone it + InsertTexelComponentFixed( params->r, 5, &dxt1_color ); + InsertTexelComponentFixed( params->g, 6, &dxt1_color ); + InsertTexelComponentFixed( params->b, 5, &dxt1_color ); + + // dupe + dxt1_color = dxt1_color | (dxt1_color<<16); + + // write into chunkbuf + *(unsigned long*)&chunkbuf[0] = dxt1_color; + + // color mask bits after that are already set to all zeroes. chunk is done. + chunksize = 8; + } + break; + + case D3DFMT_DXT3: + { + memset( temp32, 0, 16 ); // zap 16 bytes + + // eight bytes of alpha (16 4-bit alpha nibbles) + // followed by a DXT1 block + + unsigned long dxt3_alpha = 0; + for( int i=0; i<8; i++) + { + // splat same alpha through block + InsertTexelComponentFixed( params->a, 4, &dxt3_alpha ); + } + + unsigned long dxt3_color = 0; + + // generate one such word and clone it + InsertTexelComponentFixed( params->r, 5, &dxt3_color ); + InsertTexelComponentFixed( params->g, 6, &dxt3_color ); + InsertTexelComponentFixed( params->b, 5, &dxt3_color ); + + // dupe + dxt3_color = dxt3_color | (dxt3_color<<16); + + // write into chunkbuf + *(unsigned long*)&chunkbuf[0] = dxt3_alpha; + *(unsigned long*)&chunkbuf[4] = dxt3_alpha; + *(unsigned long*)&chunkbuf[8] = dxt3_color; + *(unsigned long*)&chunkbuf[12] = dxt3_color; + + chunksize = 16; + } + break; + + case D3DFMT_DXT5: + { + memset( temp32, 0, 16 ); // zap 16 bytes + + // DXT5 has 8 bytes of compressed alpha, then 8 bytes of compressed RGB like DXT1. + + // the 8 alpha bytes are 2 bytes of endpoint alpha values, then 16x3 bits of interpolants. + // so to write a single alpha value, just figure out the value, store it in both the first two bytes then store zeroes. + + InsertTexelComponentFixed( params->a, 8, (unsigned long*)&chunkbuf[0] ); + InsertTexelComponentFixed( params->a, 8, (unsigned long*)&chunkbuf[0] ); + // rest of the alpha mask was already zeroed. + + // now do colors + unsigned long dxt5_color = 0; + + // generate one such word and clone it + InsertTexelComponentFixed( params->r, 5, &dxt5_color ); + InsertTexelComponentFixed( params->g, 6, &dxt5_color ); + InsertTexelComponentFixed( params->b, 5, &dxt5_color ); + + // dupe + dxt5_color = dxt5_color | (dxt5_color<<16); + + // write into chunkbuf + *(unsigned long*)&chunkbuf[8] = dxt5_color; + *(unsigned long*)&chunkbuf[12] = dxt5_color; + + chunksize = 16; + } + break; + + + case D3DFMT_A32B32G32R32F: + { + *(float*)&chunkbuf[0] = params->r; + *(float*)&chunkbuf[4] = params->g; + *(float*)&chunkbuf[8] = params->b; + *(float*)&chunkbuf[12] = params->a; + + chunksize = 16; + } + break; + + case D3DFMT_A16B16G16R16: + memset( chunkbuf, 0, 8 ); + // R and G wind up in the first 32 bits + // B and A wind up in the second 32 bits + + InsertTexelComponentFixed( params->a, 16, (unsigned long*)&chunkbuf[4] ); // winds up as MSW of second word (note [4]) - thus last in RAM + InsertTexelComponentFixed( params->b, 16, (unsigned long*)&chunkbuf[4] ); + + InsertTexelComponentFixed( params->g, 16, (unsigned long*)&chunkbuf[0] ); + InsertTexelComponentFixed( params->r, 16, (unsigned long*)&chunkbuf[0] ); // winds up as LSW of first word, thus first in RAM + + chunksize = 8; + break; + + // not done yet + + + //case D3DFMT_D16: + //case D3DFMT_D24X8: + //case D3DFMT_D24S8: + + //case D3DFMT_A16B16G16R16F: + + default: + return FALSE; // fail + break; + } + + // once the chunk buffer is filled.. + + // sanity check the reported chunk size. + if (static_cast(chunksize) != format->m_bytesPerSquareChunk) + { + DebuggerBreak(); + return FALSE; + } + + // verify that the amount you want to write will not exceed the limit byte count + unsigned long destByteCount = chunksize * params->m_chunkCount; + + if (static_cast(destByteCount) > params->m_byteCountLimit) + { + DebuggerBreak(); + return FALSE; + } + + // write the bytes. + unsigned char *destP = (unsigned char*)params->m_dest; + for( int chunk=0; chunk < params->m_chunkCount; chunk++) + { + for( uint byteindex = 0; byteindex < chunksize; byteindex++) + { + *destP++ = chunkbuf[byteindex]; + } + } + params->m_bytesWritten = destP - (unsigned char*)params->m_dest; + + return TRUE; +} + + +//=============================================================================== +bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b ) +{ + #define DO_LESS(fff) if (a.fff != b.fff) { return (a.fff< b.fff); } + + DO_LESS(m_texGLTarget); + DO_LESS(m_texFormat); + DO_LESS(m_texFlags); + DO_LESS(m_texSamples); + DO_LESS(m_xSize); + DO_LESS(m_ySize) + DO_LESS(m_zSize); + + #undef DO_LESS + + return false; // they are equal +} + +CGLMTexLayoutTable::CGLMTexLayoutTable() +{ + m_layoutMap.SetLessFunc( LessFunc_GLMTexLayoutKey ); +} + +GLMTexLayout *CGLMTexLayoutTable::NewLayoutRef( GLMTexLayoutKey *pDesiredKey ) +{ + GLMTexLayoutKey tempKey; + GLMTexLayoutKey *key = pDesiredKey; + + // look up 'key' in the map and see if it's a hit, if so, bump the refcount and return + // if not, generate a completed layout based on the key, add to map, set refcount to 1, return that + + const GLMTexFormatDesc *formatDesc = GetFormatDesc( key->m_texFormat ); + + //bool compression = (formatDesc->m_chunkSize > 1) != 0; + if (!formatDesc) + { + GLMStop(); // bad news + } + + if ( gGL->m_bHave_GL_EXT_texture_sRGB_decode ) + { + if ( ( formatDesc->m_glIntFormatSRGB != 0 ) && ( ( key->m_texFlags & kGLMTexSRGB ) == 0 ) ) + { + tempKey = *pDesiredKey; + key = &tempKey; + + // Slam on SRGB texture flag, and we'll use GL_EXT_texture_sRGB_decode to selectively turn it off in the samplers + key->m_texFlags |= kGLMTexSRGB; + } + } + + unsigned short index = m_layoutMap.Find( *key ); + if (index != m_layoutMap.InvalidIndex()) + { + // found it + //printf(" -hit- "); + GLMTexLayout *layout = m_layoutMap[ index ]; + + // bump ref count + layout->m_refCount ++; + + return layout; + } + else + { + //printf(" -miss- "); + // need to make a new one + // to allocate it, we need to know how big to make it (slice count) + + // figure out how many mip levels are in play + int mipCount = 1; + if (key->m_texFlags & kGLMTexMipped) + { + int largestAxis = key->m_xSize; + + if (key->m_ySize > largestAxis) + largestAxis = key->m_ySize; + + if (key->m_zSize > largestAxis) + largestAxis = key->m_zSize; + + mipCount = 0; + while( largestAxis > 0 ) + { + mipCount ++; + largestAxis >>= 1; + } + } + + int faceCount = 1; + if (key->m_texGLTarget == GL_TEXTURE_CUBE_MAP) + { + faceCount = 6; + } + + int sliceCount = mipCount * faceCount; + + if (key->m_texFlags & kGLMTexMultisampled) + { + Assert( (key->m_texGLTarget == GL_TEXTURE_2D) ); + Assert( sliceCount == 1 ); + + // assume non mipped + Assert( (key->m_texFlags & kGLMTexMipped) == 0 ); + Assert( (key->m_texFlags & kGLMTexMippedAuto) == 0 ); + + // assume renderable and srgb + Assert( (key->m_texFlags & kGLMTexRenderable) !=0 ); + //Assert( (key->m_texFlags & kGLMTexSRGB) !=0 ); //FIXME don't assert on making depthstencil surfaces which are non srgb + + // double check sample count (FIXME need real limit check here against device/driver) + Assert( (key->m_texSamples==2) || (key->m_texSamples==4) || (key->m_texSamples==6) || (key->m_texSamples==8) ); + } + + // now we know enough to allocate and populate the new tex layout. + + // malloc the new layout + int layoutSize = sizeof( GLMTexLayout ) + (sliceCount * sizeof( GLMTexLayoutSlice )); + GLMTexLayout *layout = (GLMTexLayout *)malloc( layoutSize ); + memset( layout, 0, layoutSize ); + + // clone the key in there + memset( &layout->m_key, 0x00, sizeof(layout->m_key) ); + layout->m_key = *key; + + // set refcount + layout->m_refCount = 1; + + // save the format desc + layout->m_format = (GLMTexFormatDesc *)formatDesc; + + // we know the mipcount from before + layout->m_mipCount = mipCount; + + // we know the face count too + layout->m_faceCount = faceCount; + + // slice count is the product + layout->m_sliceCount = mipCount * faceCount; + + // we can now fill in the slices. + GLMTexLayoutSlice *slicePtr = &layout->m_slices[0]; + int storageOffset = 0; + + //bool compressed = (formatDesc->m_chunkSize > 1); // true if DXT + + for( int mip = 0; mip < mipCount; mip ++ ) + { + for( int face = 0; face < faceCount; face++ ) + { + // note application of chunk size which is 1 for uncompressed, and 4 for compressed tex (DXT) + // note also that the *dimensions* must scale down to 1 + // but that the *storage* cannot go below 4x4. + // we introduce the "storage sizes" which are clamped, to compute the storage footprint. + + int storage_x,storage_y,storage_z; + + slicePtr->m_xSize = layout->m_key.m_xSize >> mip; + slicePtr->m_xSize = MAX( slicePtr->m_xSize, 1 ); // dimension can't go to zero + storage_x = MAX( slicePtr->m_xSize, formatDesc->m_chunkSize ); // storage extent can't go below chunk size + + slicePtr->m_ySize = layout->m_key.m_ySize >> mip; + slicePtr->m_ySize = MAX( slicePtr->m_ySize, 1 ); // dimension can't go to zero + storage_y = MAX( slicePtr->m_ySize, formatDesc->m_chunkSize ); // storage extent can't go below chunk size + + slicePtr->m_zSize = layout->m_key.m_zSize >> mip; + slicePtr->m_zSize = MAX( slicePtr->m_zSize, 1 ); // dimension can't go to zero + storage_z = MAX( slicePtr->m_zSize, 1); // storage extent for Z cannot go below '1'. + + //if (compressed) NO NO NO do not lie about the dimensionality, just fudge the storage. + //{ + // // round up to multiple of 4 in X and Y axes + // slicePtr->m_xSize = (slicePtr->m_xSize+3) & (~3); + // slicePtr->m_ySize = (slicePtr->m_ySize+3) & (~3); + //} + + int xchunks = (storage_x / formatDesc->m_chunkSize ); + int ychunks = (storage_y / formatDesc->m_chunkSize ); + + slicePtr->m_storageSize = (xchunks * ychunks * formatDesc->m_bytesPerSquareChunk) * storage_z; + slicePtr->m_storageOffset = storageOffset; + + storageOffset += slicePtr->m_storageSize; + storageOffset = ( (storageOffset+0x0F) & (~0x0F)); // keep each MIP starting on a 16 byte boundary. + + slicePtr++; + } + } + + layout->m_storageTotalSize = storageOffset; + //printf("\n size %08x for key (x=%d y=%d z=%d, fmt=%08x, bpsc=%d)", layout->m_storageTotalSize, key->m_xSize, key->m_ySize, key->m_zSize, key->m_texFormat, formatDesc->m_bytesPerSquareChunk ); + + // generate summary + // "target, format, +/- mips, base size" + char scratch[1024]; + + char *targetname = "?"; + switch( key->m_texGLTarget ) + { + case GL_TEXTURE_2D: targetname = "2D "; break; + case GL_TEXTURE_3D: targetname = "3D "; break; + case GL_TEXTURE_CUBE_MAP: targetname = "CUBE"; break; + } + + sprintf( scratch, "[%s %s %dx%dx%d mips=%d slices=%d flags=%02lX%s]", + targetname, + formatDesc->m_formatSummary, + layout->m_key.m_xSize, layout->m_key.m_ySize, layout->m_key.m_zSize, + mipCount, + sliceCount, + layout->m_key.m_texFlags, + (layout->m_key.m_texFlags & kGLMTexSRGB) ? " SRGB" : "" + ); + layout->m_layoutSummary = strdup( scratch ); + //GLMPRINTF(("-D- new tex layout [ %s ]", scratch )); + + // then insert into map. disregard returned index. + m_layoutMap.Insert( layout->m_key, layout ); + + return layout; + } +} + +void CGLMTexLayoutTable::DelLayoutRef( GLMTexLayout *layout ) +{ + // locate layout in hash, drop refcount + // (some GC step later on will harvest expired layouts - not like it's any big challenge to re-generate them) + + unsigned short index = m_layoutMap.Find( layout->m_key ); + if (index != m_layoutMap.InvalidIndex()) + { + // found it + GLMTexLayout *layout = m_layoutMap[ index ]; + + // drop ref count + layout->m_refCount --; + + //assert( layout->m_refCount >= 0 ); + } + else + { + // that's bad + GLMStop(); + } +} + +void CGLMTexLayoutTable::DumpStats( ) +{ + for (uint i=0; im_refCount, layout->m_storageTotalSize, (layout->m_refCount*layout->m_storageTotalSize), layout->m_layoutSummary ); + } +} + +ConVar gl_texmsaalog ( "gl_texmsaalog", "0"); + +ConVar gl_rt_forcergba ( "gl_rt_forcergba", "1" ); // on teximage of a renderable tex, pass GL_RGBA in place of GL_BGRA + +ConVar gl_minimize_rt_tex ( "gl_minimize_rt_tex", "0" ); // if 1, set the GL_TEXTURE_MINIMIZE_STORAGE_APPLE texture parameter to cut off mipmaps for RT's +ConVar gl_minimize_all_tex ( "gl_minimize_all_tex", "1" ); // if 1, set the GL_TEXTURE_MINIMIZE_STORAGE_APPLE texture parameter to cut off mipmaps for textures which are unmipped +ConVar gl_minimize_tex_log ( "gl_minimize_tex_log", "0" ); // if 1, printf the names of the tex that got minimized + +CGLMTex::CGLMTex( GLMContext *ctx, GLMTexLayout *layout, uint levels, const char *debugLabel ) +{ +#if GLMDEBUG + m_pPrevTex = NULL; + m_pNextTex = g_pFirstCGMLTex; + if ( m_pNextTex ) + { + Assert( m_pNextTex->m_pPrevTex == NULL ); + m_pNextTex->m_pPrevTex = this; + } + g_pFirstCGMLTex = this; +#endif + + // caller has responsibility to make 'ctx' current, but we check to be sure. + ctx->CheckCurrent(); + + m_nLastResolvedBatchCounter = ctx->m_nBatchCounter; + + // note layout requested + m_layout = layout; + m_texGLTarget = m_layout->m_key.m_texGLTarget; + + m_nSamplerType = SAMPLER_TYPE_UNUSED; + switch ( m_texGLTarget ) + { + case GL_TEXTURE_CUBE_MAP: m_nSamplerType = SAMPLER_TYPE_CUBE; break; + case GL_TEXTURE_2D: m_nSamplerType = SAMPLER_TYPE_2D; break; + case GL_TEXTURE_3D: m_nSamplerType = SAMPLER_TYPE_3D; break; + default: + Assert( 0 ); + break; + } + + m_maxActiveMip = -1; //index of highest mip that has been written - increase as each mip arrives + m_minActiveMip = 999; //index of lowest mip that has been written - lower it as each mip arrives + + // note context owner + m_ctx = ctx; + + // clear the bind point flags + //m_bindPoints.ClearAll(); + + // clear the RT attach count + m_rtAttachCount = 0; + + // come up with a GL name for this texture. + m_texName = ctx->CreateTex( m_texGLTarget, m_layout->m_format->m_glIntFormat ); + + m_pBlitSrcFBO = NULL; + m_pBlitDstFBO = NULL; + + // Sense whether to try and apply client storage upon teximage/subimage. + // This should only be true if we're running on OSX 10.6 or it was explicitly + // enabled with -gl_texclientstorage on the command line. + m_texClientStorage = ctx->m_bTexClientStorage; + + // flag that we have not yet been explicitly kicked into VRAM.. + m_texPreloaded = false; + + // clone the debug label if there is one. + m_debugLabel = debugLabel ? strdup(debugLabel) : NULL; + + // if tex is MSAA renderable, make an RBO, else zero the RBO name and dirty bit + if (layout->m_key.m_texFlags & kGLMTexMultisampled) + { + gGL->glGenRenderbuffersEXT( 1, &m_rboName ); + + // so we have enough info to go ahead and bind the RBO and put storage on it? + // try it. + gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_rboName ); + + // quietly clamp if sample count exceeds known limit for the device + int sampleCount = layout->m_key.m_texSamples; + + if (sampleCount > ctx->Caps().m_maxSamples) + { + sampleCount = ctx->Caps().m_maxSamples; // clamp + } + + GLenum msaaFormat = (layout->m_key.m_texFlags & kGLMTexSRGB) ? layout->m_format->m_glIntFormatSRGB : layout->m_format->m_glIntFormat; + gGL->glRenderbufferStorageMultisampleEXT( GL_RENDERBUFFER_EXT, + sampleCount, // not "layout->m_key.m_texSamples" + msaaFormat, + layout->m_key.m_xSize, + layout->m_key.m_ySize ); + + if (gl_texmsaalog.GetInt()) + { + printf( "\n == MSAA Tex %p %s : MSAA RBO is intformat %s (%x)", this, m_debugLabel?m_debugLabel:"", GLMDecode( eGL_ENUM, msaaFormat ), msaaFormat ); + } + + gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + } + else + { + m_rboName = 0; + } + + // at this point we have the complete description of the texture, and a name for it, but no data and no actual GL object. + // we know this name has bever seen duty before, so we're going to hard-bind it to TMU 0, displacing any other tex that might have been bound there. + // any previously bound tex will be unbound and appropriately marked as a result. + // the active TMU will be set as a side effect. + CGLMTex *pPrevTex = ctx->m_samplers[0].m_pBoundTex; + ctx->BindTexToTMU( this, 0 ); + + m_SamplingParams.SetToDefaults(); + m_SamplingParams.SetToTarget( m_texGLTarget ); + + // OK, our texture now exists and is bound on the active TMU. Not drawable yet though. + + // Create backing storage and fill it + if ( !(layout->m_key.m_texFlags & kGLMTexRenderable) && m_texClientStorage ) + { + m_backing = (char *)malloc( m_layout->m_storageTotalSize ); + memset( m_backing, 0, m_layout->m_storageTotalSize ); + + // track bytes allocated for non-RT's + int formindex = sEncodeLayoutAsIndex( &layout->m_key ); + + g_texGlobalBytes[ formindex ] += m_layout->m_storageTotalSize; + + #if TEXSPACE_LOGGING + printf( "\n Tex %s added %d bytes in form %d which is now %d bytes", m_debugLabel ? m_debugLabel : "-", m_layout->m_storageTotalSize, formindex, g_texGlobalBytes[ formindex ] ); + printf( "\n\t\t[ %d %d %d %d %d %d %d %d ]", + g_texGlobalBytes[ 0 ],g_texGlobalBytes[ 1 ],g_texGlobalBytes[ 2 ],g_texGlobalBytes[ 3 ], + g_texGlobalBytes[ 4 ],g_texGlobalBytes[ 5 ],g_texGlobalBytes[ 6 ],g_texGlobalBytes[ 7 ] + ); + #endif + } + else + { + m_backing = NULL; + + m_texClientStorage = false; + } + + // init lock count + // lock reqs are tracked by the owning context + m_lockCount = 0; + + m_sliceFlags.SetCount( m_layout->m_sliceCount ); + for( int i=0; i< m_layout->m_sliceCount; i++) + { + m_sliceFlags[i] = 0; + // kSliceValid = false (we have not teximaged each slice yet) + // kSliceStorageValid = false (the storage allocated does not reflect what is in the tex) + // kSliceLocked = false (the slices are not locked) + // kSliceFullyDirty = false (this does not come true til first lock) + } + + // texture minimize parameter keeps driver from allocing mips when it should not, by being explicit about the ones that have no mips. + + bool setMinimizeParameter = false; + bool minimize_rt = (gl_minimize_rt_tex.GetInt()!=0); + bool minimize_all = (gl_minimize_all_tex.GetInt()!=0); + + if (layout->m_key.m_texFlags & kGLMTexRenderable) + { + // it's an RT. if mips were not explicitly requested, and "gl_minimize_rt_tex" is true, set the minimize parameter. + if ( (minimize_rt || minimize_all) && ( !(layout->m_key.m_texFlags & kGLMTexMipped) ) ) + { + setMinimizeParameter = true; + } + } + else + { + // not an RT. if mips were not requested, and "gl_minimize_all_tex" is true, set the minimize parameter. + if ( minimize_all && ( !(layout->m_key.m_texFlags & kGLMTexMipped) ) ) + { + setMinimizeParameter = true; + } + } + + if (setMinimizeParameter) + { + if (gl_minimize_tex_log.GetInt()) + { + printf("\n minimizing storage for tex '%s' [%s] ", m_debugLabel?m_debugLabel:"-", m_layout->m_layoutSummary ); + } + + if (gGL->m_bHave_GL_APPLE_texture_range) + gGL->glTexParameteri( m_layout->m_key.m_texGLTarget, GL_TEXTURE_MINIMIZE_STORAGE_APPLE, 1 ); + } + + // after a lot of pain with texture completeness... + // always push black into all slices of all newly created textures. + + #if 0 + bool pushRenderableSlices = (m_layout->m_key.m_texFlags & kGLMTexRenderable) != 0; + bool pushTexSlices = true; // just do it everywhere (m_layout->m_mipCount>1) && (m_layout->m_format->m_chunkSize !=1) ; + if (pushTexSlices) + { + // fill storage with mostly-opaque purple + + GLMGenTexelParams genp; + memset( &genp, 0, sizeof(genp) ); + + genp.m_format = m_layout->m_format->m_d3dFormat; + const GLMTexFormatDesc *format = GetFormatDesc( genp.m_format ); + + genp.m_dest = m_backing; // dest addr + genp.m_chunkCount = m_layout->m_storageTotalSize / format->m_bytesPerSquareChunk; // fill the whole slab + genp.m_byteCountLimit = m_layout->m_storageTotalSize; // limit writes to this amount + + genp.r = 1.0; + genp.g = 0.0; + genp.b = 1.0; + genp.a = 0.75; + + GLMGenTexels( &genp ); + } + #endif + + //if (pushRenderableSlices || pushTexSlices) + if ( !( ( layout->m_key.m_texFlags & kGLMTexMipped ) && ( levels == ( unsigned ) m_layout->m_mipCount ) ) ) + { + for( int face=0; face m_faceCount; face++) + { + for( int mip=0; mip m_mipCount; mip++) + { + // we're not really going to lock, we're just going to write the blank data from the backing store we just made + GLMTexLockDesc desc; + + desc.m_req.m_tex = this; + desc.m_req.m_face = face; + desc.m_req.m_mip = mip; + + desc.m_sliceIndex = CalcSliceIndex( face, mip ); + + GLMTexLayoutSlice *slice = &m_layout->m_slices[ desc.m_sliceIndex ]; + + desc.m_req.m_region.xmin = desc.m_req.m_region.ymin = desc.m_req.m_region.zmin = 0; + desc.m_req.m_region.xmax = slice->m_xSize; + desc.m_req.m_region.ymax = slice->m_ySize; + desc.m_req.m_region.zmax = slice->m_zSize; + + desc.m_sliceBaseOffset = slice->m_storageOffset; // doesn't really matter... we're just pushing zeroes.. + desc.m_sliceRegionOffset = 0; + + WriteTexels( &desc, true, (layout->m_key.m_texFlags & kGLMTexRenderable)!=0 ); // write whole slice - but disable data source if it's an RT, as there's no backing + } + } + } + GLMPRINTF(("-A- -**TEXNEW '%-60s' name=%06d size=%09d storage=%08x label=%s ", m_layout->m_layoutSummary, m_texName, m_layout->m_storageTotalSize, m_backing, m_debugLabel ? m_debugLabel : "-" )); + + ctx->BindTexToTMU( pPrevTex, 0 ); +} + +CGLMTex::~CGLMTex( ) +{ +#if GLMDEBUG + if ( m_pPrevTex ) + { + Assert( m_pPrevTex->m_pNextTex == this ); + m_pPrevTex->m_pNextTex = m_pNextTex; + } + else + { + Assert( g_pFirstCGMLTex == this ); + g_pFirstCGMLTex = m_pNextTex; + } + if ( m_pNextTex ) + { + Assert( m_pNextTex->m_pPrevTex == this ); + m_pNextTex->m_pPrevTex = m_pPrevTex; + } + m_pNextTex = m_pPrevTex = NULL; +#endif + + if ( !(m_layout->m_key.m_texFlags & kGLMTexRenderable) ) + { + int formindex = sEncodeLayoutAsIndex( &m_layout->m_key ); + + g_texGlobalBytes[ formindex ] -= m_layout->m_storageTotalSize; + + #if TEXSPACE_LOGGING + printf( "\n Tex %s freed %d bytes in form %d which is now %d bytes", m_debugLabel ? m_debugLabel : "-", m_layout->m_storageTotalSize, formindex, g_texGlobalBytes[ formindex ] ); + printf( "\n\t\t[ %d %d %d %d %d %d %d %d ]", + g_texGlobalBytes[ 0 ],g_texGlobalBytes[ 1 ],g_texGlobalBytes[ 2 ],g_texGlobalBytes[ 3 ], + g_texGlobalBytes[ 4 ],g_texGlobalBytes[ 5 ],g_texGlobalBytes[ 6 ],g_texGlobalBytes[ 7 ] + ); + #endif + } + + GLMPRINTF(("-A- -**TEXDEL '%-60s' name=%06d size=%09d storage=%08x label=%s ", m_layout->m_layoutSummary, m_texName, m_layout->m_storageTotalSize, m_backing, m_debugLabel ? m_debugLabel : "-" )); + // check first to see if we were still bound anywhere or locked... these should be failures. + + if ( m_pBlitSrcFBO ) + { + m_ctx->DelFBO( m_pBlitSrcFBO ); + m_pBlitSrcFBO = NULL; + } + + if ( m_pBlitDstFBO ) + { + m_ctx->DelFBO( m_pBlitDstFBO ); + m_pBlitDstFBO = NULL; + } + + if ( m_rboName ) + { + gGL->glDeleteRenderbuffersEXT( 1, &m_rboName ); + m_rboName = 0; + } + + // if all that is OK, then delete the underlying tex + if ( m_texName ) + { + m_ctx->DestroyTex( m_texGLTarget, m_layout, m_texName ); + m_texName = 0; + } + + // release our usage of the layout + m_ctx->m_texLayoutTable->DelLayoutRef( m_layout ); + m_layout = NULL; + + if (m_backing) + { + free( m_backing ); + m_backing = NULL; + } + + if (m_debugLabel) + { + free( m_debugLabel ); + m_debugLabel = NULL; + } + + m_ctx = NULL; +} + +int CGLMTex::CalcSliceIndex( int face, int mip ) +{ + // faces of the same mip level are adjacent. "face major" storage + int index = (mip * m_layout->m_faceCount) + face; + + return index; +} + +void CGLMTex::CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut ) +{ + int offset = 0; + int yStride = 0; + int zStride = 0; + + GLMTexFormatDesc *format = m_layout->m_format; + if (format->m_chunkSize==1) + { + // figure out row stride and layer stride + yStride = format->m_bytesPerSquareChunk * m_layout->m_slices[sliceIndex].m_xSize; // bytes per texel row (y stride) + zStride = yStride * m_layout->m_slices[sliceIndex].m_ySize; // bytes per texel layer (if 3D tex) + + offset = x * format->m_bytesPerSquareChunk; // lateral offset + offset += (y * yStride); // scanline offset + offset += (z * zStride); // should be zero for 2D tex + } + else + { + yStride = format->m_bytesPerSquareChunk * (m_layout->m_slices[sliceIndex].m_xSize / format->m_chunkSize); + zStride = yStride * (m_layout->m_slices[sliceIndex].m_ySize / format->m_chunkSize); + + // compressed format. scale the x,y,z values into chunks. + // assert if any of them are not multiples of a chunk. + int chunkx = x / format->m_chunkSize; + int chunky = y / format->m_chunkSize; + int chunkz = z / format->m_chunkSize; + + if ( (chunkx * format->m_chunkSize) != x) + { + GLMStop(); + } + + if ( (chunky * format->m_chunkSize) != y) + { + GLMStop(); + } + + if ( (chunkz * format->m_chunkSize) != z) + { + GLMStop(); + } + + offset = chunkx * format->m_bytesPerSquareChunk; // lateral offset + offset += (chunky * yStride); // chunk row offset + offset += (chunkz * zStride); // should be zero for 2D tex + } + + *offsetOut = offset; + *yStrideOut = yStride; + *zStrideOut = zStride; +} + +void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) +{ + GLMRegion readBox; + + if (readWholeSlice) + { + readBox.xmin = readBox.ymin = readBox.zmin = 0; + + readBox.xmax = m_layout->m_slices[ desc->m_sliceIndex ].m_xSize; + readBox.ymax = m_layout->m_slices[ desc->m_sliceIndex ].m_ySize; + readBox.zmax = m_layout->m_slices[ desc->m_sliceIndex ].m_zSize; + } + else + { + readBox = desc->m_req.m_region; + } + + CGLMTex *pPrevTex = m_ctx->m_samplers[0].m_pBoundTex; + m_ctx->BindTexToTMU( this, 0 ); // SelectTMU(n) is a side effect + + if (readWholeSlice) + { + // make this work first.... then write the partial path + // (Hmmmm, I don't think we will ever actually need a partial path - + // since we have no notion of a partially valid slice of storage + + GLMTexFormatDesc *format = m_layout->m_format; + GLenum target = m_layout->m_key.m_texGLTarget; + + void *sliceAddress = m_backing + m_layout->m_slices[ desc->m_sliceIndex ].m_storageOffset; // this would change for PBO + //int sliceSize = m_layout->m_slices[ desc->m_sliceIndex ].m_storageSize; + + // interestingly enough, we can use the same path for both 2D and 3D fetch + + switch( target ) + { + case GL_TEXTURE_CUBE_MAP: + + // adjust target to steer to the proper face, then fall through to the 2D texture path. + target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + desc->m_req.m_face; + + case GL_TEXTURE_2D: + case GL_TEXTURE_3D: + { + // check compressed or not + if (format->m_chunkSize != 1) + { + // compressed path + // http://www.opengl.org/sdk/docs/man/xhtml/glGetCompressedTexImage.xml + + gGL->glGetCompressedTexImage( target, // target + desc->m_req.m_mip, // level + sliceAddress ); // destination + } + else + { + // uncompressed path + // http://www.opengl.org/sdk/docs/man/xhtml/glGetTexImage.xml + + gGL->glGetTexImage( target, // target + desc->m_req.m_mip, // level + format->m_glDataFormat, // dataformat + format->m_glDataType, // datatype + sliceAddress ); // destination + } + } + break; + } + } + else + { + GLMStop(); + } + + m_ctx->BindTexToTMU( pPrevTex, 0 ); +} + +// TexSubImage should work properly on every driver stack and GPU--enabling by default. +ConVar gl_enabletexsubimage( "gl_enabletexsubimage", "1" ); + +void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDataWrite ) +{ + //if ( m_nBindlessHashNumEntries ) + // return; + + GLMRegion writeBox; + + bool needsExpand = false; + char *expandTemp = NULL; + + switch( m_layout->m_format->m_d3dFormat) + { + case D3DFMT_V8U8: + { + needsExpand = true; + writeWholeSlice = true; + + // shoot down client storage if we have to generate a new flavor of the data + m_texClientStorage = false; + } + break; + } + + if (writeWholeSlice) + { + writeBox.xmin = writeBox.ymin = writeBox.zmin = 0; + + writeBox.xmax = m_layout->m_slices[ desc->m_sliceIndex ].m_xSize; + writeBox.ymax = m_layout->m_slices[ desc->m_sliceIndex ].m_ySize; + writeBox.zmax = m_layout->m_slices[ desc->m_sliceIndex ].m_zSize; + } + else + { + writeBox = desc->m_req.m_region; + } + + // first thing is to get the GL texture bound to a TMU, or just select one if already bound + // to get this running we will just always slam TMU 0 and let the draw time code fix it back + // a later optimization would be to hoist the bind call to the caller, do it exactly once + + CGLMTex *pPrevTex = m_ctx->m_samplers[0].m_pBoundTex; + m_ctx->BindTexToTMU( this, 0 ); // SelectTMU(n) is a side effect + + GLMTexFormatDesc *format = m_layout->m_format; + + GLenum target = m_layout->m_key.m_texGLTarget; + GLenum glDataFormat = format->m_glDataFormat; // this could change if expansion kicks in + GLenum glDataType = format->m_glDataType; + + GLMTexLayoutSlice *slice = &m_layout->m_slices[ desc->m_sliceIndex ]; + void *sliceAddress = m_backing ? (m_backing + slice->m_storageOffset) : NULL; // this would change for PBO + + // allow use of subimage if the target is texture2D and it has already been teximage'd + bool mayUseSubImage = false; + if ( (target==GL_TEXTURE_2D) && (m_sliceFlags[ desc->m_sliceIndex ] & kSliceValid) ) + { + mayUseSubImage = gl_enabletexsubimage.GetInt() != 0; + } + + // check flavor, 2D, 3D, or cube map + // we also have the choice to use subimage if this is a tex already created. (open question as to benefit) + + + // SRGB select. At this level (writetexels) we firmly obey the m_texFlags. + // (mechanism not policy) + + GLenum intformat = (m_layout->m_key.m_texFlags & kGLMTexSRGB) ? format->m_glIntFormatSRGB : format->m_glIntFormat; + if (CommandLine()->FindParm("-disable_srgbtex")) + { + // force non srgb flavor - experiment to make ATI r600 happy on 10.5.8 (maybe x1600 too!) + intformat = format->m_glIntFormat; + } + + Assert( intformat != 0 ); + + if (m_layout->m_key.m_texFlags & kGLMTexSRGB) + { + Assert( m_layout->m_format->m_glDataFormat != GL_DEPTH_COMPONENT ); + Assert( m_layout->m_format->m_glDataFormat != GL_DEPTH_STENCIL_EXT ); + Assert( m_layout->m_format->m_glDataFormat != GL_ALPHA ); + } + + // adjust min and max mip written + if (desc->m_req.m_mip > m_maxActiveMip) + { + m_maxActiveMip = desc->m_req.m_mip; + + gGL->glTexParameteri( target, GL_TEXTURE_MAX_LEVEL, desc->m_req.m_mip); + } + + if (desc->m_req.m_mip < m_minActiveMip) + { + m_minActiveMip = desc->m_req.m_mip; + + gGL->glTexParameteri( target, GL_TEXTURE_BASE_LEVEL, desc->m_req.m_mip); + } + + if (needsExpand) + { + int expandSize = 0; + + switch( m_layout->m_format->m_d3dFormat) + { + case D3DFMT_V8U8: + { + // figure out new size based on 3byte RGB format + // easy, just take the two byte size and grow it by 50% + expandSize = (slice->m_storageSize * 3) / 2; + expandTemp = (char*)malloc( expandSize ); + + char *src = (char*)sliceAddress; + char *dst = expandTemp; + + // transfer RG's to RGB's + while(expandSize>0) + { + *dst = *src++; // move first byte + *dst = *src++; // move second byte + *reinterpret_cast(dst) = 0xBB; // pad third byte + + expandSize -= 3; + } + + // move the slice pointer + sliceAddress = expandTemp; + + // change the data format we tell GL about + glDataFormat = GL_RGB; + } + break; + + default: Assert(!"Don't know how to expand that format.."); + } + + } + + // set up the client storage now, one way or another + // If this extension isn't supported, we just end up with two copies of the texture, one in the GL and one in app memory. + // So it's safe to just go on as if this extension existed and hold the possibly-unnecessary extra RAM. + if (gGL->m_bHave_GL_APPLE_client_storage) + { + gGL->glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, m_texClientStorage ); + } + + switch( target ) + { + case GL_TEXTURE_CUBE_MAP: + + // adjust target to steer to the proper face, then fall through to the 2D texture path. + target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + desc->m_req.m_face; + + case GL_TEXTURE_2D: + { + // check compressed or not + if (format->m_chunkSize != 1) + { + Assert( writeWholeSlice ); //subimage not implemented in this path yet + + // compressed path + // http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexImage2D.xml + gGL->glCompressedTexImage2D( target, // target + desc->m_req.m_mip, // level + intformat, // internalformat - don't use format->m_glIntFormat because we have the SRGB select going on above + slice->m_xSize, // width + slice->m_ySize, // height + 0, // border + slice->m_storageSize, // imageSize + sliceAddress ); // data + + + } + else + { + if (mayUseSubImage) + { + // go subimage2D if it's a replacement, not a creation + + + gGL->glPixelStorei( GL_UNPACK_ROW_LENGTH, slice->m_xSize ); // in pixels + gGL->glPixelStorei( GL_UNPACK_SKIP_PIXELS, writeBox.xmin ); // in pixels + gGL->glPixelStorei( GL_UNPACK_SKIP_ROWS, writeBox.ymin ); // in pixels + + gGL->glTexSubImage2D( target, + desc->m_req.m_mip, // level + writeBox.xmin, // xoffset into dest + writeBox.ymin, // yoffset into dest + writeBox.xmax - writeBox.xmin, // width (was slice->m_xSize) + writeBox.ymax - writeBox.ymin, // height (was slice->m_ySize) + glDataFormat, // format + glDataType, // type + sliceAddress // data (will be offsetted by the SKIP_PIXELS and SKIP_ROWS - let GL do the math to find the first source texel) + ); + + gGL->glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); + gGL->glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); + gGL->glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); + + /* + //http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml + glTexSubImage2D( target, + desc->m_req.m_mip, // level + 0, // xoffset + 0, // yoffset + slice->m_xSize, // width + slice->m_ySize, // height + glDataFormat, // format + glDataType, // type + sliceAddress // data + ); + */ + } + else + { + if (m_layout->m_key.m_texFlags & kGLMTexRenderable) + { + if (gl_rt_forcergba.GetInt()) + { + if (glDataFormat == GL_BGRA) + { + // change it + glDataFormat = GL_RGBA; + } + } + } + + // uncompressed path + // http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html + gGL->glTexImage2D( target, // target + desc->m_req.m_mip, // level + intformat, // internalformat - don't use format->m_glIntFormat because we have the SRGB select going on above + slice->m_xSize, // width + slice->m_ySize, // height + 0, // border + glDataFormat, // dataformat + glDataType, // datatype + noDataWrite ? NULL : sliceAddress ); // data (optionally suppressed in case ResetSRGB desires) + + if (m_layout->m_key.m_texFlags & kGLMTexMultisampled) + { + if (gl_texmsaalog.GetInt()) + { + printf( "\n == MSAA Tex %p %s : glTexImage2D for flat tex using intformat %s (%x)", this, m_debugLabel?m_debugLabel:"", GLMDecode( eGL_ENUM, intformat ), intformat ); + printf( "\n" ); + } + } + + m_sliceFlags[ desc->m_sliceIndex ] |= kSliceValid; // for next time, we can subimage.. + } + } + } + break; + + case GL_TEXTURE_3D: + { + // check compressed or not + if (format->m_chunkSize != 1) + { + // compressed path + // http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexImage3D.xml + + gGL->glCompressedTexImage3D( target, // target + desc->m_req.m_mip, // level + intformat, // internalformat + slice->m_xSize, // width + slice->m_ySize, // height + slice->m_zSize, // depth + 0, // border + slice->m_storageSize, // imageSize + sliceAddress ); // data + } + else + { + // uncompressed path + // http://www.opengl.org/sdk/docs/man/xhtml/glTexImage3D.xml + gGL->glTexImage3D( target, // target + desc->m_req.m_mip, // level + intformat, // internalformat + slice->m_xSize, // width + slice->m_ySize, // height + slice->m_zSize, // depth + 0, // border + glDataFormat, // dataformat + glDataType, // datatype + noDataWrite ? NULL : sliceAddress ); // data (optionally suppressed in case ResetSRGB desires) + } + } + break; + } + + if (gGL->m_bHave_GL_APPLE_client_storage) + { + gGL->glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE ); + } + + if ( expandTemp ) + { + free( expandTemp ); + } + + m_ctx->BindTexToTMU( pPrevTex, 0 ); +} + + +void CGLMTex::Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut ) +{ +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmPIXEvent( "CGLMTex::Lock" ); + g_TelemetryGPUStats.m_nTotalTexLocksAndUnlocks++; +#endif + + // locate appropriate slice in layout record + int sliceIndex = CalcSliceIndex( params->m_face, params->m_mip ); + + GLMTexLayoutSlice *slice = &m_layout->m_slices[sliceIndex]; + + // obtain offset + //int sliceBaseOffset = slice->m_storageOffset; + + // cross check region req against slice bounds - figure out if it matches, exceeds, or is less than the whole slice. + char exceed = (params->m_region.xmin < 0) || (params->m_region.xmax > slice->m_xSize) || + (params->m_region.ymin < 0) || (params->m_region.ymax > slice->m_ySize) || + (params->m_region.zmin < 0) || (params->m_region.zmax > slice->m_zSize); + + char partial = (params->m_region.xmin > 0) || (params->m_region.xmax < slice->m_xSize) || + (params->m_region.ymin > 0) || (params->m_region.ymax < slice->m_ySize) || + (params->m_region.zmin > 0) || (params->m_region.zmax < slice->m_zSize); + + bool copyout = false; // set if a readback of the texture slice from GL is needed + + if (exceed) + { + // illegal rect, out of bounds + GLMStop(); + } + + // on return, these things need to be true + + // a - there needs to be storage allocated, which we will return an address within + // b - the region corresponding to the slice being locked, will have valid data there for the whole slice. + // c - the slice is marked as locked + // d - the params of the lock request have been saved in the lock table (in the context) + + // so step 1 is unambiguous. If there's no backing storage, make some. + if (!m_backing) + { + if ( gl_pow2_tempmem.GetBool() ) + { + uint32_t unStoragePow2 = m_layout->m_storageTotalSize; + // Round up to next power of 2 + unStoragePow2--; + unStoragePow2 |= unStoragePow2 >> 1; + unStoragePow2 |= unStoragePow2 >> 2; + unStoragePow2 |= unStoragePow2 >> 4; + unStoragePow2 |= unStoragePow2 >> 8; + unStoragePow2 |= unStoragePow2 >> 16; + unStoragePow2++; + m_backing = (char *)calloc( unStoragePow2, 1 ); + } + else + { + m_backing = (char *)calloc( m_layout->m_storageTotalSize, 1 ); + } + + // clear the kSliceStorageValid bit on all slices + for( int i=0; im_sliceCount; i++) + { + m_sliceFlags[i] &= ~kSliceStorageValid; + } + } + + // work on this slice now + + // storage is known to exist at this point, but we need to check if its contents are valid for this slice. + // this is tracked per-slice so we don't hoist all the texels back out of GL across all slices if caller only + // wanted to lock some of them. + + // (i.e. if we just alloced it, it's blank) + // if storage is invalid, but the texture itself is valid, hoist the texels back to the storage and mark it valid. + // if storage is invalid, and texture itself is also invalid, go ahead and mark storage as valid and fully dirty... to force teximage. + + // ???????????? we need to go over this more carefully re "slice valid" (it has been teximaged) vs "storage valid" (it has been copied out). + + unsigned char *sliceFlags = &m_sliceFlags[ sliceIndex ]; + + if (params->m_readback) + { + // caller is letting us know that it wants to readback the real texels. + *sliceFlags |= kSliceStorageValid; + *sliceFlags |= kSliceValid; + *sliceFlags &= ~(kSliceFullyDirty); + copyout = true; + } + else + { + // caller is pushing texels. + if (! (*sliceFlags & kSliceStorageValid) ) + { + // storage is invalid. check texture state + if ( *sliceFlags & kSliceValid ) + { + // kSliceValid set: the texture itself has a valid slice, but we don't have it in our backing copy, so copy it out. + copyout = true; + } + else + { + // kSliceValid not set: the texture does not have a valid slice to copy out - it hasn't been teximage'd yet. + // set the "full dirty" bit to make sure we teximage the whole thing on unlock. + *sliceFlags |= kSliceFullyDirty; + + // assert if they did not ask to lock the full slice size on this go-round + if (partial) + { + // choice here - + // 1 - stop cold, we don't know how to subimage yet. + // 2 - grin and bear it, mark whole slice dirty (ah, we already did... so, do nothing). + // choice 2: // GLMStop(); + } + } + + // one way or another, upon reaching here the slice storage is valid for read. + *sliceFlags |= kSliceStorageValid; + } + } + + + // when we arrive here, there is storage, and the content of the storage for this slice is valid + // (or zeroes if it's the first lock) + + // log the lock request in the context. + int newdesc = m_ctx->m_texLocks.AddToTail(); + + GLMTexLockDesc *desc = &m_ctx->m_texLocks[newdesc]; + + desc->m_req = *params; + desc->m_active = true; + desc->m_sliceIndex = sliceIndex; + desc->m_sliceBaseOffset = m_layout->m_slices[sliceIndex].m_storageOffset; + + // to calculate the additional offset we need to look at the rect's min corner + // combined with the per-texel size and Y/Z stride + // also cross check it for 4x multiple if there is compression in play + + int offsetInSlice = 0; + int yStride = 0; + int zStride = 0; + + CalcTexelDataOffsetAndStrides( sliceIndex, params->m_region.xmin, params->m_region.ymin, params->m_region.zmin, &offsetInSlice, &yStride, &zStride ); + + // for compressed case... + // since there is presently no way to texsubimage a DXT when the rect does not cover the whole width, + // we will probably need to inflate the dirty rect in the recorded lock req so that the entire span is + // pushed across at unlock time. + + desc->m_sliceRegionOffset = offsetInSlice + desc->m_sliceBaseOffset; + + if (copyout) + { + // read the whole slice + // (odds are we'll never request anything but a whole slice to be read..) + ReadTexels( desc, true ); + } // this would be a good place to fill with scrub value if in debug... + + *addressOut = m_backing + desc->m_sliceRegionOffset; + *yStrideOut = yStride; + *zStrideOut = zStride; + + m_lockCount++; +} + +void CGLMTex::Unlock( GLMTexLockParams *params ) +{ +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmPIXEvent( "CGLMTex::Unlock" ); + g_TelemetryGPUStats.m_nTotalTexLocksAndUnlocks++; +#endif + + // look for an active lock request on this face and mip (doesn't necessarily matter which one, if more than one) + // and mark it inactive. + // --> if you can't find one, fail. first line of defense against mismatched locks/unlocks.. + + int i=0; + bool found = false; + while( !found && (im_texLocks.Count()) ) + { + GLMTexLockDesc *desc = &m_ctx->m_texLocks[i]; + + // is lock at index 'i' targeted at the texture/face/mip in question? + if ( (desc->m_req.m_tex == this) && (desc->m_req.m_face == params->m_face) & (desc->m_req.m_mip == params->m_mip) && (desc->m_active) ) + { + // matched and active, so retire it + desc->m_active = false; + + // stop searching + found = true; + } + i++; + } + + if (!found) + { + GLMStop(); // bad news + } + + // found - so drop lock count + m_lockCount--; + + if (m_lockCount <0) + { + GLMStop(); // bad news + } + + if (m_lockCount==0) + { + // there should not be any active locks remaining on this texture. + + // motivation to defer all texel pushing til *all* open locks are closed out - + // if/when we back the texture with a PBO, we will need to unmap that PBO before teximaging from it; + // by waiting for all the locks to clear this gives us an unambiguous signal to act on. + + // scan through all the retired locks for this texture and push the texels for each one. + // after each one is dispatched, remove it from the pile. + + int j=0; + while( jm_texLocks.Count() ) + { + GLMTexLockDesc *desc = &m_ctx->m_texLocks[j]; + + if ( desc->m_req.m_tex == this ) + { + // if it's active, something is wrong + if (desc->m_active) + { + GLMStop(); + } + + // write the texels + bool fullyDirty = false; + + fullyDirty |= ((m_sliceFlags[ desc->m_sliceIndex ] & kSliceFullyDirty) != 0); + + // this is not optimal and will result in full downloads on any dirty. + // we're papering over the fact that subimage isn't done yet. + // but this is safe if the slice of storage is all valid. + + // at some point we'll need to actually compare the lock box against the slice bounds. + + // fullyDirty |= (m_sliceFlags[ desc->m_sliceIndex ] & kSliceStorageValid); + + WriteTexels( desc, fullyDirty ); + + // logical place to trigger preloading + // only do it for an RT tex, if it is not yet attached to any FBO. + // also, only do it if the slice number is the last slice in the tex. + if ( desc->m_sliceIndex == (m_layout->m_sliceCount-1) ) + { + if ( !(m_layout->m_key.m_texFlags & kGLMTexRenderable) || (m_rtAttachCount==0) ) + { + m_ctx->PreloadTex( this ); + // printf("( slice %d of %d )", desc->m_sliceIndex, m_layout->m_sliceCount ); + } + } + + m_ctx->m_texLocks.FastRemove( j ); // remove from the pile, don't advance index + } + else + { + j++; // move on to next one + } + } + + // clear the locked and full-dirty flags for all slices + for( int slice=0; slice < m_layout->m_sliceCount; slice++) + { + m_sliceFlags[slice] &= ~( kSliceLocked | kSliceFullyDirty ); + } + + // The 3D texture upload code seems to rely on the host copy, probably + // because it reuploads the whole thing each slice; we only use 3D textures + // for the 32x32x32 colorpsace conversion lookups and debugging the problem + // would not save any more memory. + if ( !m_texClientStorage && ( m_texGLTarget == GL_TEXTURE_2D ) ) + { + free(m_backing); + m_backing = NULL; + } + } +} + +#if defined( OSX ) + +void CGLMTex::HandleSRGBMismatch( bool srgb, int &srgbFlipCount ) +{ + bool srgbCapableTex = false; // not yet known + bool renderableTex = false; // not yet known. + + srgbCapableTex = m_layout->m_format->m_glIntFormatSRGB != 0; + renderableTex = ( m_layout->m_key.m_texFlags & kGLMTexRenderable ) != 0; + // we can fix it if it's not a renderable, and an sRGB enabled format variation is available. + + if ( srgbCapableTex && !renderableTex ) + { + char *texname = m_debugLabel; + if (!texname) texname = "-"; + + m_srgbFlipCount++; + +#if GLMDEBUG + //policy: print the ones that have flipped 1 or N times + static bool print_allflips = CommandLine()->FindParm("-glmspewallsrgbflips"); + static bool print_firstflips = CommandLine()->FindParm("-glmspewfirstsrgbflips"); + static bool print_freqflips = CommandLine()->FindParm("-glmspewfreqsrgbflips"); + static bool print_crawls = CommandLine()->FindParm("-glmspewsrgbcrawls"); + static bool print_maxcrawls = CommandLine()->FindParm("-glmspewsrgbmaxcrawls"); + bool print_it = false; + + if (print_allflips) + { + print_it = true; + } + if (print_firstflips) // report on first flip + { + print_it |= m_srgbFlipCount==1; + } + if (print_freqflips) // report on 50th flip + { + print_it |= m_srgbFlipCount==50; + } + + if ( print_it ) + { + char *formatStr; + formatStr = "srgb change (samp=%d): tex '%-30s' %08x %s (srgb=%d, %d times)"; + + if (strlen(texname) >= 30) + { + formatStr = "srgb change (samp=%d): tex '%s' %08x %s (srgb=%d, %d times)"; + } + + printf( "\n" ); + printf( formatStr, index, texname, m_layout->m_layoutSummary, (int)srgb, m_srgbFlipCount ); + +#ifdef POSIX + if (print_crawls) + { + static char *interesting_crawl_substrs[] = { "CShader::OnDrawElements", NULL }; // add more as needed + + CStackCrawlParams cp; + memset( &cp, 0, sizeof(cp) ); + cp.m_frameLimit = 20; + + g_pLauncherMgr->GetStackCrawl(&cp); + + for( int i=0; i< cp.m_frameCount; i++) + { + // for each row of crawl, decide if name is interesting + bool hit = print_maxcrawls; + + for( char **match = interesting_crawl_substrs; (!hit) && (*match != NULL); match++) + { + if (strstr(cp.m_crawlNames[i], *match)) + { + hit = true; + } + } + + if (hit) + { + printf( "\n\t%s", cp.m_crawlNames[i] ); + } + } + printf( "\n"); + } +#endif + } +#endif // GLMDEBUG + +#if GLMDEBUG && 0 + //"toi" = texture of interest + static char s_toi[256] = "colorcorrection"; + if (strstr( texname, s_toi )) + { + // breakpoint on this if you like + GLMPRINTF(( "srgb change %d for %s", m_srgbFlipCount, texname )); + } +#endif + + // re-submit the tex unless we're stifling it + static bool s_nosrgbflips = CommandLine()->FindParm( "-glmnosrgbflips" ); + if ( !s_nosrgbflips ) + { + ResetSRGB( srgb, false ); + } + } + else + { + //GLMPRINTF(("-Z- srgb sampling conflict: NOT fixing tex %08x [%s] (srgb req: %d) because (tex-srgb-capable=%d tex-renderable=%d)", m_textures[index], m_textures[index]->m_tex->m_layout->m_layoutSummary, (int)glsamp->m_srgb, (int)srgbCapableTex, (int)renderableTex )); + // we just leave the sampler state where it is, and that's life + } +} + + +void CGLMTex::ResetSRGB( bool srgb, bool noDataWrite ) +{ + // see if requested SRGB state differs from the known one + bool wasSRGB = (m_layout->m_key.m_texFlags & kGLMTexSRGB); + GLMTexLayout *oldLayout = m_layout; // need to m_ctx->m_texLayoutTable->DelLayoutRef on this one if we flip + + if (srgb != wasSRGB) + { + // we're going to need a new layout (though the storage size should be the same - check it) + GLMTexLayoutKey newKey = m_layout->m_key; + + newKey.m_texFlags &= (~kGLMTexSRGB); // turn off that bit + newKey.m_texFlags |= srgb ? kGLMTexSRGB : 0; // turn on that bit if it should be so + + // get new layout + GLMTexLayout *newLayout = m_ctx->m_texLayoutTable->NewLayoutRef( &newKey ); + + // if SRGB requested, verify that the layout we just got can do it. + // if it can't, delete the new layout ref and bail. + if (srgb && (newLayout->m_format->m_glIntFormatSRGB == 0)) + { + Assert( !"Can't enable SRGB mode on this format" ); + m_ctx->m_texLayoutTable->DelLayoutRef( newLayout ); + return; + } + + // check sizes and fail if no match + if( newLayout->m_storageTotalSize != oldLayout->m_storageTotalSize ) + { + Assert( !"Bug: layout sizes don't match on SRGB change" ); + m_ctx->m_texLayoutTable->DelLayoutRef( newLayout ); + return; + } + + // commit to new layout + m_layout = newLayout; + m_texGLTarget = m_layout->m_key.m_texGLTarget; + + // check same size + Assert( m_layout->m_storageTotalSize == oldLayout->m_storageTotalSize ); + + Assert( newLayout != oldLayout ); + + // release old + m_ctx->m_texLayoutTable->DelLayoutRef( oldLayout ); + oldLayout = NULL; + + // force texel re-DL + + // note this messes with TMU 0 as side effect of WriteTexels + // so we save and restore the TMU 0 binding first + + // since we're likely to be called in dxabstract when it is syncing sampler state, we can't go trampling the bindings. + // a refinement would be to have each texture make a note of which TMU they're bound on, and just use that active TMU for DL instead of 0. + CGLMTex *tmu0save = m_ctx->m_samplers[0].m_pBoundTex; + + for( int face=0; face m_faceCount; face++) + { + for( int mip=0; mip m_mipCount; mip++) + { + // we're not really going to lock, we're just going to rewrite the orig data + GLMTexLockDesc desc; + + desc.m_req.m_tex = this; + desc.m_req.m_face = face; + desc.m_req.m_mip = mip; + + desc.m_sliceIndex = CalcSliceIndex( face, mip ); + + GLMTexLayoutSlice *slice = &m_layout->m_slices[ desc.m_sliceIndex ]; + + desc.m_req.m_region.xmin = desc.m_req.m_region.ymin = desc.m_req.m_region.zmin = 0; + desc.m_req.m_region.xmax = slice->m_xSize; + desc.m_req.m_region.ymax = slice->m_ySize; + desc.m_req.m_region.zmax = slice->m_zSize; + + desc.m_sliceBaseOffset = slice->m_storageOffset; // doesn't really matter... we're just pushing zeroes.. + desc.m_sliceRegionOffset = 0; + + WriteTexels( &desc, true, noDataWrite ); // write whole slice. and avoid pushing real bits if the caller requests (RT's) + } + } + + // put it back + m_ctx->BindTexToTMU( tmu0save, 0 ); + } +} +#endif + +bool CGLMTex::IsRBODirty() const +{ + return m_nLastResolvedBatchCounter != m_ctx->m_nBatchCounter; +} + +void CGLMTex::ForceRBONonDirty() +{ + m_nLastResolvedBatchCounter = m_ctx->m_nBatchCounter; +} + +void CGLMTex::ForceRBODirty() +{ + m_nLastResolvedBatchCounter = m_ctx->m_nBatchCounter - 1; +} diff --git a/togles/linuxwin/dx9asmtogl2.cpp b/togles/linuxwin/dx9asmtogl2.cpp new file mode 100644 index 00000000..22be8fc9 --- /dev/null +++ b/togles/linuxwin/dx9asmtogl2.cpp @@ -0,0 +1,3838 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +//------------------------------------------------------------------------------ +// DX9AsmToGL2.cpp +//------------------------------------------------------------------------------ +// Immediately include gl.h, etc. here to avoid compilation warnings. +#include +#include + +#include "togl/rendermechanism.h" +#include "tier0/dbg.h" +#include "tier1/strtools.h" +#include "tier1/utlbuffer.h" +#include "dx9asmtogl2.h" + +#include "materialsystem/IShader.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +#ifdef POSIX +#define strcat_s( a, b, c) V_strcat( a, c, b ) +#endif + +#define DST_REGISTER 0 +#define SRC_REGISTER 1 + +// Flags to PrintUsageAndIndexToString. +#define SEMANTIC_OUTPUT 0x01 +#define SEMANTIC_INPUT 0x02 + +#define UNDECLARED_OUTPUT 0xFFFFFFFF +#define UNDECLARED_INPUT 0xFFFFFFFF + +#ifndef POSIX +#define Debugger() Assert(0) +#endif + +//#define Assert(n) if( !(n) ){ TranslationError(); } + + +static char *g_szVecZeros[] = { NULL, "0.0", "vec2( 0.0, 0.0 )", "vec3( 0.0, 0.0, 0.0 )", "vec4( 0.0, 0.0, 0.0, 0.0 )" }; +static char *g_szVecOnes[] = { NULL, "1.0", "vec2( 1.0, 1.0 )", "vec3( 1.0, 1.0, 1.0 )", "vec4( 1.0, 1.0, 1.0, 1.0 )" }; +static char *g_szDefaultSwizzle = "xyzw"; +static char *g_szDefaultSwizzleStrings[] = { "x", "y", "z", "w" }; +static char *g_szSamplerStrings[] = { "2D", "CUBE", "3D" }; + +static const char *g_pAtomicTempVarName = "atomic_temp_var"; +static const char *g_pTangentAttributeName = "g_tangent"; + +int __cdecl SortInts( const int *a, const int *b ) +{ + if ( *a < *b ) + return -1; + else if ( *a > *b ) + return 1; + else + return 0; +} + +void StripExtraTrailingZeros( char *pStr ) +{ + int len = (int)V_strlen( pStr ); + while ( len >= 2 && pStr[len-1] == '0' && pStr[len-2] != '.' ) + { + pStr[len-1] = 0; + --len; + } +} + +void D3DToGL::PrintToBufWithIndents( CUtlBuffer &buf, const char *pFormat, ... ) +{ + va_list marker; + va_start( marker, pFormat ); + + char szTemp[1024]; + V_vsnprintf( szTemp, sizeof( szTemp ), pFormat, marker ); + va_end( marker ); + + PrintIndentation( (char*)buf.Base(), buf.Size() ); + strcat_s( (char*)buf.Base(), buf.Size(), szTemp ); +} + +void PrintToBuf( CUtlBuffer &buf, const char *pFormat, ... ) +{ + va_list marker; + va_start( marker, pFormat ); + + char szTemp[1024]; + V_vsnprintf( szTemp, sizeof( szTemp ), pFormat, marker ); + va_end( marker ); + + strcat_s( (char*)buf.Base(), buf.Size(), szTemp ); +} + +void PrintToBuf( char *pOut, int nOutSize, const char *pFormat, ... ) +{ + int nStrlen = V_strlen( pOut ); + pOut += nStrlen; + nOutSize -= nStrlen; + + va_list marker; + va_start( marker, pFormat ); + V_vsnprintf( pOut, nOutSize, pFormat, marker ); + va_end( marker ); +} + +// Return the number of letters following the dot. +// Returns 4 if there is no dot. +// (So "r0.xy" returns 2 and "r0" returns 4). +int GetNumWriteMaskEntries( const char *pParam ) +{ + const char *pDot = strchr( pParam, '.' ); + if ( pDot ) + return V_strlen( pDot + 1 ); + else + return 4; +} + +const char* GetSwizzleDot( const char *pParam ) +{ + const char *pDot = strrchr( pParam, '.' ); + + const char *pSquareClose = strrchr( pParam, ']' ); + + if ( pSquareClose ) + { + // The test against ']' catches cases like, so we point to the last dot vc[int(va_r.x) + 29].x + if ( pDot && ( pSquareClose < pDot ) ) + return pDot; + else + return NULL; + } + + // Make sure the next character is a valid swizzle since we want to treat strings like vec4( gl_Normal, 0.0 ) as a whole param name. + if ( pDot && ( ( *(pDot+1) == 'x' ) || ( *(pDot+1) == 'y' ) || ( *(pDot+1) == 'z' ) || ( *(pDot+1) == 'w' ) || + ( *(pDot+1) == 'r' ) || ( *(pDot+1) == 'g' ) || ( *(pDot+1) == 'b' ) || ( *(pDot+1) == 'z' ) ) ) + { + return pDot; + } + + return NULL; +} + +int GetNumSwizzleComponents( const char *pParam ) +{ + // Special scalar output which won't accept a swizzle + if ( !V_stricmp( pParam, "gl_FogFragCoord" ) ) + return 1; + + // Special scalar output which won't accept a swizzle + if ( !V_stricmp( pParam, "gl_FragDepth" ) ) + return 1; + + // Special scalar output which won't accept a swizzle + if ( !V_stricmp( pParam, "a0" ) ) + return 1; + + const char *pDot = GetSwizzleDot( pParam ); + if ( pDot ) + { + pDot++; // Step over the dot + + int nNumSwizzleComponents = 0; + while ( ( *pDot == 'x' ) || ( *pDot == 'y' ) || ( *pDot == 'z' ) || ( *pDot == 'w' ) || + ( *pDot == 'r' ) || ( *pDot == 'g' ) || ( *pDot == 'b' ) || ( *pDot == 'z' ) ) + { + nNumSwizzleComponents++; + pDot++; + } + + return nNumSwizzleComponents; + } + + return 0; +} + +char GetSwizzleComponent( const char *pParam, int n ) +{ + Assert( n < 4 ); + + const char *pDot = GetSwizzleDot( pParam ); + if ( pDot ) + { + ++pDot; + int nComponents = (int)V_strlen( pDot ); + Assert( nComponents > 0 ); + + if ( n < nComponents ) + return pDot[n]; + else + return pDot[nComponents-1]; + } + + return g_szDefaultSwizzle[n]; +} + +// Replace the parameter name and leave the swizzle intact. +// So "somevar.xyz" becomes "othervar.xyz". +void ReplaceParamName( const char *pSrc, const char *pNewParamName, char *pOut, int nOutLen ) +{ + // Start with the new parameter name. + V_strncpy( pOut, pNewParamName, nOutLen ); + + // Now add the swizzle if necessary. + const char *pDot = GetSwizzleDot( pSrc ); + if ( pDot ) + { + V_strncat( pOut, pDot, nOutLen ); + } +} + +void GetParamNameWithoutSwizzle( const char *pParam, char *pOut, int nOutLen ) +{ + char *pParamStart = (char *) pParam; + const char *pDot = GetSwizzleDot( pParam ); // dot followed by valid swizzle characters + bool bAbsWrapper = false; + + // Check for abs() or -abs() wrapper and strip it off during the fixup + if ( !V_strncmp( pParam, "abs(", 4 ) || !V_strncmp( pParam, "-abs(", 5 ) ) + { + const char *pOpenParen = strchr( pParam, '(' ); // FIRST opening paren + const char *pClosingParen = strrchr( pParam, ')' ); // LAST closing paren + + Assert ( pOpenParen && pClosingParen ); + pClosingParen; // hush compiler + + pParamStart = (char *) pOpenParen; + pParamStart++; + bAbsWrapper = true; + } + + if ( pDot ) + { + int nToCopy = MIN( nOutLen-1, pDot - pParamStart ); + memcpy( pOut, pParamStart, nToCopy ); + pOut[nToCopy] = 0; + } + else + { + V_strncpy( pOut, pParamStart, bAbsWrapper ? nOutLen - 1 : nOutLen ); + } +} + +bool DoParamNamesMatch( const char *pParam1, const char *pParam2 ) +{ + char szTemp[2][256]; + GetParamNameWithoutSwizzle( pParam1, szTemp[0], sizeof( szTemp[0] ) ); + GetParamNameWithoutSwizzle( pParam2, szTemp[1], sizeof( szTemp[1] ) ); + return ( V_stricmp( szTemp[0], szTemp[1] ) == 0 ); +} + + + +// Extract the n'th component of the swizzle mask. +// If n would exceed the length of the swizzle mask, then it looks up into "xyzw". +void WriteParamWithSingleMaskEntry( const char *pParam, int n, char *pOut, int nOutLen ) +{ + bool bCloseParen = false; + if ( !V_strncmp( pParam, "-abs(", 5 ) ) + { + V_strcpy( pOut, "-abs(" ); + bCloseParen = true; + + pOut += 5; nOutLen -= 5; + } + else if ( !V_strncmp( pParam, "abs(", 4 ) ) + { + V_strcpy( pOut, "abs(" ); + bCloseParen = true; + + pOut += 4; nOutLen -= 4; + } + + GetParamNameWithoutSwizzle( pParam, pOut, nOutLen ); + PrintToBuf( pOut, nOutLen, "." ); + PrintToBuf( pOut, nOutLen, "%c", GetSwizzleComponent( pParam, n ) ); + + if ( bCloseParen ) + { + PrintToBuf( pOut, nOutLen, ")" ); + } +} + + +float uint32ToFloat( uint32 dw ) +{ + return *((float*)&dw); +} + +CUtlString EnsureNumSwizzleComponents( const char *pSrcRegisterName, int nComponents ) +{ + int nExisting = GetNumSwizzleComponents( pSrcRegisterName ); + if ( nExisting == nComponents ) + return pSrcRegisterName; + + bool bAbsWrapper = false; // Parameter wrapped in an abs() + bool bAbsNegative = false; // -abs() + char szSrcRegister[128]; + V_strncpy( szSrcRegister, pSrcRegisterName, sizeof(szSrcRegister) ); + + // Check for abs() or -abs() wrapper and strip it off during the fixup + if ( !V_strncmp( pSrcRegisterName, "abs(", 4 ) || !V_strncmp( pSrcRegisterName, "-abs(", 5 ) ) + { + bAbsWrapper = true; + bAbsNegative = pSrcRegisterName[0] == '-'; + + const char *pOpenParen = strchr( pSrcRegisterName, '(' ); // FIRST opening paren + const char *pClosingParen = strrchr( pSrcRegisterName, ')' ); // LAST closing paren + + Assert ( pOpenParen && pClosingParen ); // If we start with abs( and don't get both parens, something is very wrong + + // Copy out just the register name with no abs() + int nRegNameLength = pClosingParen - pOpenParen - 1; + V_strncpy( szSrcRegister, pOpenParen+1, nRegNameLength + 1 ); // Kind of a weird function...copy more than you need and slam the last char to NULL-terminate + } + + char szReg[256]; + GetParamNameWithoutSwizzle( szSrcRegister, szReg, sizeof( szReg ) ); + if ( nComponents == 0 ) + return szReg; + + PrintToBuf( szReg, sizeof( szReg ), "." ); + if ( nExisting > nComponents ) + { + // DX ASM will sometimes have statements like "NRM r0.xyz, r1.yzww", where it just doesn't use the last part of r1. So we won't either. + for ( int i=0; i < nComponents; i++ ) + { + PrintToBuf( szReg, sizeof( szReg ), "%c", GetSwizzleComponent( szSrcRegister, i ) ); + } + } + else + { + if ( nExisting == 0 ) + { + // We've got something like r0 and need N more components, so add as much of "xyzw" is needed. + for ( int i=0; i < nComponents; i++ ) + PrintToBuf( szReg, sizeof( szReg ), "%c", g_szDefaultSwizzle[i] ); + } + else + { + // We've got something like r0.x and need N more components, so replicate the X so it looks like r0.xxx + V_strncpy( szReg, szSrcRegister, sizeof( szReg ) ); + char cLast = szSrcRegister[ V_strlen( szSrcRegister ) - 1 ]; + for ( int i=nExisting; i < nComponents; i++ ) + { + PrintToBuf( szReg, sizeof( szReg ), "%c", cLast ); + } + } + } + + if ( bAbsWrapper ) + { + char szTemp[128]; + V_strncpy( szTemp, szReg, sizeof(szTemp) ); + V_snprintf( szReg, sizeof( szReg ), "%sabs(%s)", bAbsNegative ? "-" : "", szTemp ) ; + } + + return szReg; +} + +static void TranslationError() +{ + GLMDebugPrintf( "D3DToGL: GLSL translation error!\n" ); + DebuggerBreakIfDebugging(); + + Error( "D3DToGL: GLSL translation error!\n" ); +} + +D3DToGL::D3DToGL() +{ +} + +uint32 D3DToGL::GetNextToken( void ) +{ + uint32 dwToken = *m_pdwNextToken; + m_pdwNextToken++; + return dwToken; +} + +void D3DToGL::SkipTokens( uint32 numToSkip ) +{ + m_pdwNextToken += numToSkip; +} + +uint32 D3DToGL::Opcode( uint32 dwToken ) +{ + return ( dwToken & D3DSI_OPCODE_MASK ); +} + +uint32 D3DToGL::OpcodeSpecificData (uint32 dwToken) +{ + return ( ( dwToken & D3DSP_OPCODESPECIFICCONTROL_MASK ) >> D3DSP_OPCODESPECIFICCONTROL_SHIFT ); +} + +uint32 D3DToGL::TextureType ( uint32 dwToken ) +{ + return ( dwToken & D3DSP_TEXTURETYPE_MASK ); // Note this one doesn't shift due to weird D3DSAMPLER_TEXTURE_TYPE enum +} + + + +// Print GLSL intrinsic corresponding to particular instruction +bool D3DToGL::OpenIntrinsic( uint32 inst, char* buff, int nBufLen, uint32 destDimension, uint32 nArgumentDimension ) +{ + // Some GLSL intrinsics need type conversion, which we do in this routine + // As a result, the caller must sometimes close both parentheses, not just one + bool bDoubleClose = false; + + if ( nArgumentDimension == 0 ) + { + nArgumentDimension = 4; + } + + switch ( inst ) + { + case D3DSIO_RSQ: + V_snprintf( buff, nBufLen, "inversesqrt( " ); + break; + case D3DSIO_DP3: + case D3DSIO_DP4: + if ( destDimension == 1 ) + { + V_snprintf( buff, nBufLen, "dot( " ); + } + else + { + if ( !destDimension ) + destDimension = 4; + V_snprintf( buff, nBufLen, "vec%d( dot( ", destDimension ); + bDoubleClose = true; + } + break; + case D3DSIO_MIN: + V_snprintf( buff, nBufLen, "min( " ); + break; + case D3DSIO_MAX: + V_snprintf( buff, nBufLen, "max( " ); + break; + case D3DSIO_SLT: + if ( nArgumentDimension == 1 ) + { + V_snprintf( buff, nBufLen, "float( " ); // lessThan doesn't have a scalar version + } + else + { + Assert( nArgumentDimension > 1 ); + V_snprintf( buff, nBufLen, "vec%d( lessThan( ", nArgumentDimension ); + bDoubleClose = true; + } + break; + case D3DSIO_SGE: + if ( nArgumentDimension == 1 ) + { + V_snprintf( buff, nBufLen, "float( " ); // greaterThanEqual doesn't have a scalar version + } + else + { + Assert( nArgumentDimension > 1 ); + V_snprintf( buff, nBufLen, "vec%d( greaterThanEqual( ", nArgumentDimension ); + bDoubleClose = true; + } + break; + case D3DSIO_EXP: + V_snprintf( buff, nBufLen, "exp( " ); // exp2 ? + break; + case D3DSIO_LOG: + V_snprintf( buff, nBufLen, "log( " ); // log2 ? + break; + case D3DSIO_LIT: + TranslationError(); + V_snprintf( buff, nBufLen, "lit( " ); // gonna have to write this one + break; + case D3DSIO_DST: + V_snprintf( buff, nBufLen, "dst( " ); // gonna have to write this one + break; + case D3DSIO_LRP: + Assert( !m_bVertexShader ); + V_snprintf( buff, nBufLen, "mix( " ); + break; + case D3DSIO_FRC: + V_snprintf( buff, nBufLen, "fract( " ); + break; + case D3DSIO_M4x4: + TranslationError(); + V_snprintf( buff, nBufLen, "m4x4" ); + break; + case D3DSIO_M4x3: + case D3DSIO_M3x4: + case D3DSIO_M3x3: + case D3DSIO_M3x2: + case D3DSIO_CALL: + case D3DSIO_CALLNZ: + case D3DSIO_LOOP: + case D3DSIO_RET: + case D3DSIO_ENDLOOP: + case D3DSIO_LABEL: + case D3DSIO_DCL: + TranslationError(); + break; + case D3DSIO_POW: + V_snprintf( buff, nBufLen, "pow( " ); + break; + case D3DSIO_CRS: + V_snprintf( buff, nBufLen, "cross( " ); + break; + case D3DSIO_SGN: + TranslationError(); + V_snprintf( buff, nBufLen, "sign( " ); + break; + case D3DSIO_ABS: + V_snprintf( buff, nBufLen, "abs( " ); + break; + case D3DSIO_NRM: + TranslationError(); + V_snprintf( buff, nBufLen, "normalize( " ); + break; + case D3DSIO_SINCOS: + TranslationError(); + V_snprintf( buff, nBufLen, "sincos( " ); // gonna have to write this one + break; + case D3DSIO_REP: + case D3DSIO_ENDREP: + case D3DSIO_IF: + case D3DSIO_IFC: + case D3DSIO_ELSE: + case D3DSIO_ENDIF: + case D3DSIO_BREAK: + case D3DSIO_BREAKC: // TODO: these are the reason we even need GLSL...gotta make these work + TranslationError(); + break; + case D3DSIO_DEFB: + case D3DSIO_DEFI: + TranslationError(); + break; + case D3DSIO_TEXCOORD: + V_snprintf( buff, nBufLen, "texcoord" ); + break; + case D3DSIO_TEXKILL: + V_snprintf( buff, nBufLen, "kill( " ); // wrap the discard instruction? + break; + case D3DSIO_TEX: + TranslationError(); + V_snprintf( buff, nBufLen, "TEX" ); // We shouldn't get here + break; + case D3DSIO_TEXBEM: + case D3DSIO_TEXBEML: + case D3DSIO_TEXREG2AR: + case D3DSIO_TEXREG2GB: + case D3DSIO_TEXM3x2PAD: + case D3DSIO_TEXM3x2TEX: + case D3DSIO_TEXM3x3PAD: + case D3DSIO_TEXM3x3TEX: + case D3DSIO_TEXM3x3SPEC: + case D3DSIO_TEXM3x3VSPEC: + TranslationError(); + break; + case D3DSIO_EXPP: + V_snprintf( buff, nBufLen, "exp( " ); + break; + case D3DSIO_LOGP: + V_snprintf( buff, nBufLen, "log( " ); + break; + case D3DSIO_CND: + TranslationError(); + break; + case D3DSIO_DEF: + TranslationError(); + V_snprintf( buff, nBufLen, "DEF" ); + break; + case D3DSIO_TEXREG2RGB: + case D3DSIO_TEXDP3TEX: + case D3DSIO_TEXM3x2DEPTH: + case D3DSIO_TEXDP3: + case D3DSIO_TEXM3x3: + TranslationError(); + break; + case D3DSIO_TEXDEPTH: + V_snprintf( buff, nBufLen, "texdepth" ); + break; + case D3DSIO_CMP: + TranslationError(); + Assert( !m_bVertexShader ); + V_snprintf( buff, nBufLen, "CMP" ); + break; + case D3DSIO_BEM: + TranslationError(); + break; + case D3DSIO_DP2ADD: + TranslationError(); + break; + case D3DSIO_DSX: + case D3DSIO_DSY: + TranslationError(); + break; + case D3DSIO_TEXLDD: + V_snprintf( buff, nBufLen, "texldd" ); + break; + case D3DSIO_SETP: + TranslationError(); + break; + case D3DSIO_TEXLDL: + V_snprintf( buff, nBufLen, "texldl" ); + break; + case D3DSIO_BREAKP: + case D3DSIO_PHASE: + TranslationError(); + break; + } + + return bDoubleClose; +} + + +const char* D3DToGL::GetGLSLOperatorString( uint32 inst ) +{ + if ( inst == D3DSIO_ADD ) + return "+"; + else if ( inst == D3DSIO_SUB ) + return "-"; + else if ( inst == D3DSIO_MUL ) + return "*"; + + Error( "GetGLSLOperatorString: unknown operator" ); + return "zzzz"; +} + + +// Print ASM opcode +void D3DToGL::PrintOpcode( uint32 inst, char* buff, int nBufLen ) +{ + switch ( inst ) + { + case D3DSIO_NOP: + V_snprintf( buff, nBufLen, "NOP" ); + TranslationError(); + break; + case D3DSIO_MOV: + V_snprintf( buff, nBufLen, "MOV" ); + break; + case D3DSIO_ADD: + V_snprintf( buff, nBufLen, "ADD" ); + break; + case D3DSIO_SUB: + V_snprintf( buff, nBufLen, "SUB" ); + break; + case D3DSIO_MAD: + V_snprintf( buff, nBufLen, "MAD" ); + break; + case D3DSIO_MUL: + V_snprintf( buff, nBufLen, "MUL" ); + break; + case D3DSIO_RCP: + V_snprintf( buff, nBufLen, "RCP" ); + break; + case D3DSIO_RSQ: + V_snprintf( buff, nBufLen, "RSQ" ); + break; + case D3DSIO_DP3: + V_snprintf( buff, nBufLen, "DP3" ); + break; + case D3DSIO_DP4: + V_snprintf( buff, nBufLen, "DP4" ); + break; + case D3DSIO_MIN: + V_snprintf( buff, nBufLen, "MIN" ); + break; + case D3DSIO_MAX: + V_snprintf( buff, nBufLen, "MAX" ); + break; + case D3DSIO_SLT: + V_snprintf( buff, nBufLen, "SLT" ); + break; + case D3DSIO_SGE: + V_snprintf( buff, nBufLen, "SGE" ); + break; + case D3DSIO_EXP: + V_snprintf( buff, nBufLen, "EX2" ); + break; + case D3DSIO_LOG: + V_snprintf( buff, nBufLen, "LG2" ); + break; + case D3DSIO_LIT: + V_snprintf( buff, nBufLen, "LIT" ); + break; + case D3DSIO_DST: + V_snprintf( buff, nBufLen, "DST" ); + break; + case D3DSIO_LRP: + Assert( !m_bVertexShader ); + V_snprintf( buff, nBufLen, "LRP" ); + break; + case D3DSIO_FRC: + V_snprintf( buff, nBufLen, "FRC" ); + break; + case D3DSIO_M4x4: + V_snprintf( buff, nBufLen, "m4x4" ); + break; + case D3DSIO_M4x3: + case D3DSIO_M3x4: + case D3DSIO_M3x3: + case D3DSIO_M3x2: + case D3DSIO_CALL: + case D3DSIO_CALLNZ: + case D3DSIO_LOOP: + case D3DSIO_RET: + case D3DSIO_ENDLOOP: + case D3DSIO_LABEL: + TranslationError(); + break; + case D3DSIO_DCL: + V_snprintf( buff, nBufLen, "DCL" ); + break; + case D3DSIO_POW: + V_snprintf( buff, nBufLen, "POW" ); + break; + case D3DSIO_CRS: + V_snprintf( buff, nBufLen, "XPD" ); + break; + case D3DSIO_SGN: + TranslationError(); + V_snprintf( buff, nBufLen, "SGN" ); + break; + case D3DSIO_ABS: + V_snprintf( buff, nBufLen, "ABS" ); + break; + case D3DSIO_NRM: + TranslationError(); + V_snprintf( buff, nBufLen, "NRM" ); + break; + case D3DSIO_SINCOS: + Assert( !m_bVertexShader ); + V_snprintf( buff, nBufLen, "SCS" ); + break; + case D3DSIO_REP: + case D3DSIO_ENDREP: + case D3DSIO_IF: + case D3DSIO_IFC: + case D3DSIO_ELSE: + case D3DSIO_ENDIF: + case D3DSIO_BREAK: + case D3DSIO_BREAKC: + TranslationError(); + break; + case D3DSIO_MOVA: + Assert( m_bVertexShader ); + V_snprintf( buff, nBufLen, "MOV" ); // We're always moving into a temp instead, so this is MOV instead of ARL + break; + case D3DSIO_DEFB: + case D3DSIO_DEFI: + TranslationError(); + break; + case D3DSIO_TEXCOORD: + V_snprintf( buff, nBufLen, "texcoord" ); + break; + case D3DSIO_TEXKILL: + V_snprintf( buff, nBufLen, "KIL" ); + break; + case D3DSIO_TEX: + V_snprintf( buff, nBufLen, "TEX" ); + break; + case D3DSIO_TEXBEM: + case D3DSIO_TEXBEML: + case D3DSIO_TEXREG2AR: + case D3DSIO_TEXREG2GB: + case D3DSIO_TEXM3x2PAD: + case D3DSIO_TEXM3x2TEX: + case D3DSIO_TEXM3x3PAD: + case D3DSIO_TEXM3x3TEX: + case D3DSIO_TEXM3x3SPEC: + case D3DSIO_TEXM3x3VSPEC: + TranslationError(); + break; + case D3DSIO_EXPP: + V_snprintf( buff, nBufLen, "EXP" ); + break; + case D3DSIO_LOGP: + V_snprintf( buff, nBufLen, "LOG" ); + break; + case D3DSIO_CND: + TranslationError(); + break; + case D3DSIO_DEF: + V_snprintf( buff, nBufLen, "DEF" ); + break; + case D3DSIO_TEXREG2RGB: + case D3DSIO_TEXDP3TEX: + case D3DSIO_TEXM3x2DEPTH: + case D3DSIO_TEXDP3: + case D3DSIO_TEXM3x3: + TranslationError(); + break; + case D3DSIO_TEXDEPTH: + V_snprintf( buff, nBufLen, "texdepth" ); + break; + case D3DSIO_CMP: + Assert( !m_bVertexShader ); + V_snprintf( buff, nBufLen, "CMP" ); + break; + case D3DSIO_BEM: + TranslationError(); + break; + case D3DSIO_DP2ADD: + TranslationError(); + break; + case D3DSIO_DSX: + case D3DSIO_DSY: + TranslationError(); + break; + case D3DSIO_TEXLDD: + V_snprintf( buff, nBufLen, "texldd" ); + break; + case D3DSIO_SETP: + TranslationError(); + break; + case D3DSIO_TEXLDL: + V_snprintf( buff, nBufLen, "texldl" ); + break; + case D3DSIO_BREAKP: + case D3DSIO_PHASE: + TranslationError(); + break; + } +} + +CUtlString D3DToGL::GetUsageAndIndexString( uint32 dwToken, int fSemanticFlags ) +{ + char szTemp[1024]; + PrintUsageAndIndexToString( dwToken, szTemp, sizeof( szTemp ), fSemanticFlags ); + return szTemp; +} + +//------------------------------------------------------------------------------ +// Helper function which prints ASCII representation of usage-usageindex pair to string +// +// Strictly used by vertex shaders +// not used any more now that we have attribmap metadata +//------------------------------------------------------------------------------ +void D3DToGL::PrintUsageAndIndexToString( uint32 dwToken, char* strUsageUsageIndexName, int nBufLen, int fSemanticFlags ) +{ + uint32 dwUsage = ( dwToken & D3DSP_DCL_USAGE_MASK ); + uint32 dwUsageIndex = ( dwToken & D3DSP_DCL_USAGEINDEX_MASK ) >> D3DSP_DCL_USAGEINDEX_SHIFT; + + switch ( dwUsage ) + { + case D3DDECLUSAGE_POSITION: + if ( m_bVertexShader ) + { + if ( fSemanticFlags & SEMANTIC_OUTPUT ) + V_snprintf( strUsageUsageIndexName, nBufLen, "vTempPos" ); // effectively gl_Position + else + V_snprintf( strUsageUsageIndexName, nBufLen, "gl_Vertex" ); + } + else + { + // .xy = position in viewport coordinates + // .z = depth + V_snprintf( strUsageUsageIndexName, nBufLen, "gl_FragCoord" ); + } + + break; + case D3DDECLUSAGE_BLENDWEIGHT: + V_snprintf( strUsageUsageIndexName, nBufLen, "vertex.attrib[1]" ); // "vertex.attrib[12]" ); // or [1] + break; + case D3DDECLUSAGE_BLENDINDICES: + V_snprintf( strUsageUsageIndexName, nBufLen, "vertex.attrib[13]" ); // "vertex.attrib[13]" ); // or [ 7 ] + break; + case D3DDECLUSAGE_NORMAL: + V_snprintf( strUsageUsageIndexName, nBufLen, "vec4( gl_Normal, 0.0 )" ); + break; + case D3DDECLUSAGE_PSIZE: + TranslationError(); + V_snprintf( strUsageUsageIndexName, nBufLen, "_psize" ); // no analog + break; + case D3DDECLUSAGE_TEXCOORD: + V_snprintf( strUsageUsageIndexName, nBufLen, "oT%d", dwUsageIndex ); + break; + case D3DDECLUSAGE_TANGENT: + + NoteTangentInputUsed(); + V_strncpy( strUsageUsageIndexName, g_pTangentAttributeName, nBufLen ); + + break; + case D3DDECLUSAGE_BINORMAL: + V_snprintf( strUsageUsageIndexName, nBufLen, "vertex.attrib[14]" ); // aka texc[6] + break; +// case D3DDECLUSAGE_TESSFACTOR: +// TranslationError(); +// V_snprintf( strUsageUsageIndexName, nBufLen, "_position" ); // no analog +// break; +// case D3DDECLUSAGE_POSITIONT: +// TranslationError(); +// V_snprintf( strUsageUsageIndexName, nBufLen, "_positiont" ); // no analog +// break; + case D3DDECLUSAGE_COLOR: + + Assert( dwUsageIndex <= 1 ); +// if ( fSemanticFlags & SEMANTIC_OUTPUT ) +// V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "gl_BackColor" : "gl_FrontColor" ); +// else + V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "gl_SecondaryColor" : "gl_Color" ); + + break; + case D3DDECLUSAGE_FOG: + TranslationError(); + break; + case D3DDECLUSAGE_DEPTH: + TranslationError(); + V_snprintf( strUsageUsageIndexName, nBufLen, "_depth" ); // no analog + break; + case D3DDECLUSAGE_SAMPLE: + TranslationError(); + V_snprintf( strUsageUsageIndexName, nBufLen, "_sample" ); // no analog + break; + default: + Debugger(); + break; + } +} + +uint32 D3DToGL::GetRegType( uint32 dwRegToken ) +{ + return ( ( dwRegToken & D3DSP_REGTYPE_MASK2 ) >> D3DSP_REGTYPE_SHIFT2 ) | ( ( dwRegToken & D3DSP_REGTYPE_MASK ) >> D3DSP_REGTYPE_SHIFT ); +} + +void D3DToGL::PrintIndentation( char *pBuf, int nBufLen ) +{ + for( int i=0; i 5 && V_strcmp( &pRegister[nLen-5], ".xyzw" ) == 0 ) + pRegister[nLen-5] = 0; +} + + +// This returns 0 for x, 1 for y, 2 for z, and 3 for w. +int GetSwizzleComponentVectorIndex( char chMask ) +{ + if ( chMask == 'x' ) + return 0; + else if ( chMask == 'y' ) + return 1; + else if ( chMask == 'z' ) + return 2; + else if ( chMask == 'w' ) + return 3; + + Error( "GetSwizzleComponentVectorIndex( '%c' ) - invalid parameter.\n", chMask ); + return 0; +} + + +// GLSL needs the # of src masks to match the dest write mask. +// +// So this: +// r0.xy = r1 + r2; +// becomes: +// r0.xy = r1.xy + r2.xy; +// +// +// Also, and this is the trickier one: GLSL reads the source registers from their first component on +// whereas D3D reads them as referenced in the dest register mask! +// +// So this code in D3D: +// r0.yz = c0.x + c1.wxyz +// Really means: +// r0.y = c0.x + c1.x +// r0.z = c0.x + c1.y +// So we translate it to this in GLSL: +// r0.yz = c0.xx + c1.wx +// r0.yz = c0.xx + c1.xy +// +CUtlString D3DToGL::FixGLSLSwizzle( const char *pDestRegisterName, const char *pSrcRegisterName ) +{ + bool bAbsWrapper = false; // Parameter wrapped in an abs() + bool bAbsNegative = false; // -abs() + char szSrcRegister[128]; + V_strncpy( szSrcRegister, pSrcRegisterName, sizeof(szSrcRegister) ); + + // Check for abs() or -abs() wrapper and strip it off during the fixup + if ( !V_strncmp( pSrcRegisterName, "abs(", 4 ) || !V_strncmp( pSrcRegisterName, "-abs(", 5 ) ) + { + bAbsWrapper = true; + bAbsNegative = pSrcRegisterName[0] == '-'; + + const char *pOpenParen = strchr( pSrcRegisterName, '(' ); // FIRST opening paren + const char *pClosingParen = strrchr( pSrcRegisterName, ')' ); // LAST closing paren + + Assert ( pOpenParen && pClosingParen ); // If we start with abs( and don't get both parens, something is very wrong + + // Copy out just the register name with no abs() + int nRegNameLength = pClosingParen - pOpenParen - 1; + V_strncpy( szSrcRegister, pOpenParen+1, nRegNameLength + 1 ); // Kind of a weird function...copy more than you need and slam the last char to NULL-terminate + + } + + int nSwizzlesInDest = GetNumSwizzleComponents( pDestRegisterName ); + if ( nSwizzlesInDest == 0 ) + nSwizzlesInDest = 4; + + char szFixedSrcRegister[128]; + GetParamNameWithoutSwizzle( szSrcRegister, szFixedSrcRegister, sizeof( szFixedSrcRegister ) ); + V_strncat( szFixedSrcRegister, ".", sizeof( szFixedSrcRegister ) ); + for ( int i=0; i < nSwizzlesInDest; i++ ) + { + char chDestWriteMask = GetSwizzleComponent( pDestRegisterName, i ); + int nVectorIndex = GetSwizzleComponentVectorIndex( chDestWriteMask ); + + char ch[2]; + ch[0] = GetSwizzleComponent( szSrcRegister, nVectorIndex ); + ch[1] = 0; + V_strncat( szFixedSrcRegister, ch, sizeof( szFixedSrcRegister ) ); + } + + SimplifyFourParamRegister( szFixedSrcRegister ); + + if ( bAbsWrapper ) + { + char szTempSrcRegister[128]; + V_strncpy( szTempSrcRegister, szFixedSrcRegister, sizeof(szTempSrcRegister) ); + V_snprintf( szFixedSrcRegister, sizeof( szFixedSrcRegister ), "%sabs(%s)", bAbsNegative ? "-" : "", szTempSrcRegister ) ; + } + + return szFixedSrcRegister; +} + +// Weird encoding...bits are split apart in the dwToken +inline uint32 GetRegTypeFromToken( uint32 dwToken ) +{ + return ( ( dwToken & D3DSP_REGTYPE_MASK2 ) >> D3DSP_REGTYPE_SHIFT2 ) | ( ( dwToken & D3DSP_REGTYPE_MASK ) >> D3DSP_REGTYPE_SHIFT ); +} + +void D3DToGL::FlagIndirectRegister( uint32 dwToken, int *pARLDestReg ) +{ + if ( !pARLDestReg ) + return; + + switch ( dwToken & D3DVS_SWIZZLE_MASK & D3DVS_X_W ) + { + case D3DVS_X_X: + *pARLDestReg = ARL_DEST_X; + break; + case D3DVS_X_Y: + *pARLDestReg = ARL_DEST_Y; + break; + case D3DVS_X_Z: + *pARLDestReg = ARL_DEST_Z; + break; + case D3DVS_X_W: + *pARLDestReg = ARL_DEST_W; + break; + } +} + + +//------------------------------------------------------------------------------ +// PrintParameterToString() +// +// Helper function which prints ASCII representation of passed Parameter dwToken +// to string. Token defines parameter details. The dwSourceOrDest parameter says +// whether or not this is a source or destination register +//------------------------------------------------------------------------------ +void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, char *pRegisterName, int nBufLen, bool bForceScalarSource, int *pARLDestReg ) +{ + char buff[32]; + bool bAllowWriteMask = true; + bool bAllowSwizzle = true; + + uint32 dwRegNum = dwToken & D3DSP_REGNUM_MASK; + + uint32 dwRegType, dwSwizzle; + uint32 dwSrcModifier = D3DSPSM_NONE; + + // Clear string to zero length + pRegisterName[ 0 ] = 0; + + dwRegType = GetRegTypeFromToken( dwToken ); + + // If this is a dest register + if ( dwSourceOrDest == DST_REGISTER ) + { + // Instruction modifiers + if ( dwToken & D3DSPDM_PARTIALPRECISION ) + { +// strcat_s( pRegisterName, nBufLen, "_pp" ); + } + + if ( dwToken & D3DSPDM_MSAMPCENTROID) + { +// strcat_s( pRegisterName, nBufLen, "_centroid" ); + } + } + + // If this is a source register + if ( dwSourceOrDest == SRC_REGISTER ) + { + dwSrcModifier = dwToken & D3DSP_SRCMOD_MASK; + + // If there are any source modifiers, check to see if they're at + // least partially "prefix" and prepend appropriately + if ( dwSrcModifier != D3DSPSM_NONE ) + { + switch ( dwSrcModifier ) + { + // These four start with just minus... (some may result in "postfix" notation as well later on) + case D3DSPSM_NEG: // negate + strcat_s( pRegisterName, nBufLen, "-" ); + break; + case D3DSPSM_BIASNEG: // bias and negate + case D3DSPSM_SIGNNEG: // sign and negate + case D3DSPSM_X2NEG: // *2 and negate + TranslationError(); + strcat_s( pRegisterName, nBufLen, "-" ); + break; + case D3DSPSM_COMP: // complement + TranslationError(); + strcat_s( pRegisterName, nBufLen, "1-" ); + break; + case D3DSPSM_ABS: // abs() + strcat_s( pRegisterName, nBufLen, "abs(" ); + + break; + case D3DSPSM_ABSNEG: // -abs() + strcat_s( pRegisterName, nBufLen, "-abs(" ); + + break; + case D3DSPSM_NOT: // for predicate register: "!p0" + TranslationError(); + strcat_s( pRegisterName, nBufLen, "!" ); + break; + } + } + } + + // Register name (from type and number) + switch ( dwRegType ) + { + case D3DSPR_TEMP: + V_snprintf( buff, sizeof( buff ), "r%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + m_dwTempUsageMask |= 0x00000001 << dwRegNum; // Keep track of the use of this temp + break; + case D3DSPR_INPUT: + if ( !m_bVertexShader && ( dwSourceOrDest == SRC_REGISTER ) ) + { + if ( m_dwMajorVersion == 3 ) + { + V_snprintf( buff, sizeof( buff ), "oTempT%d", dwRegNum ); + } + else + { + V_snprintf( buff, sizeof( buff ), dwRegNum == 0 ? "gl_Color" : "gl_SecondaryColor" ); + } + strcat_s( pRegisterName, nBufLen, buff ); + } + else + { + V_snprintf( buff, sizeof( buff ), "v%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + } + break; + case D3DSPR_CONST: + if ( m_bConstantRegisterDefined[dwRegNum] ) + { + char szConstantRegName[3]; + if ( m_bVertexShader ) + { + V_snprintf( szConstantRegName, 3, "vd" ); + } + else + { + V_snprintf( szConstantRegName, 3, "pd" ); + } + + // Put defined constants into their own namespace "d" + V_snprintf( buff, sizeof( buff ), "%s%d", szConstantRegName, dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + } + else if ( dwToken & D3DSHADER_ADDRESSMODE_MASK ) // Indirect addressing (e.g. skinning in a vertex shader) + { + char szConstantRegName[16]; + if ( m_bVertexShader ) + { + V_snprintf( szConstantRegName, 3, "vc" ); + } + else // No indirect addressing in PS, this shouldn't happen + { + TranslationError(); + V_snprintf( szConstantRegName, 3, "pc" ); + } + + if ( ( m_bGenerateBoneUniformBuffer ) && ( dwRegNum >= DXABSTRACT_VS_FIRST_BONE_SLOT ) ) + { + if( dwRegNum < DXABSTRACT_VS_LAST_BONE_SLOT ) + { + dwRegNum -= DXABSTRACT_VS_FIRST_BONE_SLOT; + V_strcpy( szConstantRegName, "vcbones" ); + + m_nHighestBoneRegister = ( DXABSTRACT_VS_PARAM_SLOTS - 1 ) - DXABSTRACT_VS_FIRST_BONE_SLOT; + } + else + { + dwRegNum -= ( DXABSTRACT_VS_LAST_BONE_SLOT + 1 ) - DXABSTRACT_VS_FIRST_BONE_SLOT; + m_nHighestRegister = m_bGenerateBoneUniformBuffer ? ( ( DXABSTRACT_VS_PARAM_SLOTS - 1 ) - ( ( DXABSTRACT_VS_LAST_BONE_SLOT + 1 ) - DXABSTRACT_VS_FIRST_BONE_SLOT ) ): ( DXABSTRACT_VS_PARAM_SLOTS - 1 ); + } + } + else + { + m_nHighestRegister = m_bGenerateBoneUniformBuffer ? ( ( DXABSTRACT_VS_PARAM_SLOTS - 1 ) - ( ( DXABSTRACT_VS_LAST_BONE_SLOT + 1 ) - DXABSTRACT_VS_FIRST_BONE_SLOT ) ): ( DXABSTRACT_VS_PARAM_SLOTS - 1 ); + } + + // Index into single pc/vc[] register array with relative addressing + int nDstReg = -1; + FlagIndirectRegister( GetNextToken(), &nDstReg ); + if ( pARLDestReg ) + *pARLDestReg = nDstReg; + + Assert( nDstReg != ARL_DEST_NONE ); + int nSrcSwizzle = 'x'; + if ( nDstReg == ARL_DEST_Y ) + nSrcSwizzle = 'y'; + else if ( nDstReg == ARL_DEST_Z ) + nSrcSwizzle = 'z'; + else if ( nDstReg == ARL_DEST_W ) + nSrcSwizzle = 'w'; + V_snprintf( buff, sizeof( buff ), "%s[int(va_r.%c) + %d]", szConstantRegName, nSrcSwizzle, dwRegNum ); + + strcat_s( pRegisterName, nBufLen, buff ); + + // Must allow swizzling, otherwise this example doesn't compile right: mad r3.xyz, c27[a0.w].w, r3, r7 + //bAllowSwizzle = false; + } + else // Direct addressing of constant array + { + char szConstantRegName[16]; + V_snprintf( szConstantRegName, 3, m_bVertexShader ? "vc" : "pc" ); + + if ( ( m_bGenerateBoneUniformBuffer ) && ( dwRegNum >= DXABSTRACT_VS_FIRST_BONE_SLOT ) ) + { + if( dwRegNum < DXABSTRACT_VS_LAST_BONE_SLOT ) + { + dwRegNum -= DXABSTRACT_VS_FIRST_BONE_SLOT; + V_strcpy( szConstantRegName, "vcbones" ); + + m_nHighestBoneRegister = MAX( m_nHighestBoneRegister, (int)dwRegNum ); + } + else + { + // handles case where constants after the bones are used (c217 onwards), these are to be concatenated with those before the bones (c0-c57) + // keep track of regnum for concatenated array + dwRegNum -= ( DXABSTRACT_VS_LAST_BONE_SLOT + 1 ) - DXABSTRACT_VS_FIRST_BONE_SLOT; + m_nHighestRegister = MAX( m_nHighestRegister, dwRegNum ); + } + } + else + { + //// NOGO if (dwRegNum != 255) // have seen cases where dwRegNum is 0xFF... need to figure out where those opcodes are coming from + { + m_nHighestRegister = MAX( m_nHighestRegister, dwRegNum ); + } + + Assert( m_nHighestRegister < DXABSTRACT_VS_PARAM_SLOTS ); + } + + // Index into single pc/vc[] register array with absolute addressing, same for GLSL and ASM + V_snprintf( buff, sizeof( buff ), "%s[%d]", szConstantRegName, dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + } + break; + case D3DSPR_ADDR: // aliases to D3DSPR_TEXTURE + if ( m_bVertexShader ) + { + Assert( dwRegNum == 0 ); + + V_snprintf( buff, sizeof( buff ), "va_r" ); + } + else // D3DSPR_TEXTURE in the pixel shader + { + // If dest reg, this is an iterator/varying declaration + if ( dwSourceOrDest == DST_REGISTER ) + { + // Is this iterator centroid? + if ( m_nCentroidMask & ( 0x00000001 << dwRegNum ) ) + { + V_snprintf( buff, sizeof( buff ), "centroid varying vec4 oT%d", dwRegNum ); // centroid varying + } + else + { + V_snprintf( buff, sizeof( buff ), "varying vec4 oT%d", dwRegNum ); + } + + bAllowWriteMask = false; + } + else // source register + { + V_snprintf( buff, sizeof( buff ), "oT%d", dwRegNum ); + } + } + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_RASTOUT: // vertex shader oPos + Assert( m_bVertexShader ); + Assert( m_dwMajorVersion == 2 ); + switch( dwRegNum ) + { + case D3DSRO_POSITION: + strcat_s( pRegisterName, nBufLen, "vTempPos" ); // In GLSL, this ends up in gl_Position later on + m_bDeclareVSOPos = true; + break; + + case D3DSRO_FOG: + strcat_s( pRegisterName, nBufLen, "gl_FogFragCoord" ); + m_bDeclareVSOFog = true; + break; + + default: + printf( "\nD3DSPR_RASTOUT: dwRegNum is %08x and token is %08x", dwRegNum, dwToken ); + TranslationError(); + break; + } + break; + case D3DSPR_ATTROUT: + Assert( m_bVertexShader ); + Assert( m_dwMajorVersion == 2 ); + + if ( dwRegNum == 0 ) + { + V_snprintf( buff, sizeof( buff ), "gl_FrontColor" ); + } + else if ( dwRegNum == 1 ) + { + V_snprintf( buff, sizeof( buff ), "gl_FrontSecondaryColor" ); + } + else + { + Error( "Invalid D3DSPR_ATTROUT index" ); + } + + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_TEXCRDOUT: // aliases to D3DSPR_OUTPUT + if ( m_bVertexShader ) + { + if ( m_nVSPositionOutput == (int32) dwRegNum ) + { + V_snprintf( buff, sizeof( buff ), "vTempPos" ); // This output varying is the position + } + else if ( m_dwMajorVersion == 3 ) + { + V_snprintf( buff, sizeof( buff ), "oTempT%d", dwRegNum ); + } + else + { + V_snprintf( buff, sizeof( buff ), "oT%d", dwRegNum ); + } + + m_dwTexCoordOutMask |= ( 0x00000001 << dwRegNum ); + } + else + { + V_snprintf( buff, sizeof( buff ), "oC%d", dwRegNum ); + } + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_CONSTINT: + V_snprintf( buff, sizeof( buff ), "i%d", dwRegNum ); // Loops use these + strcat_s( pRegisterName, nBufLen, buff ); + m_dwConstIntUsageMask |= 0x00000001 << dwRegNum; // Keep track of the use of this integer constant + break; + case D3DSPR_COLOROUT: + V_snprintf( buff, sizeof( buff ), "gl_FragData[%d]", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + m_bOutputColorRegister[dwRegNum] = true; + break; + case D3DSPR_DEPTHOUT: + V_snprintf( buff, sizeof( buff ), "gl_FragDepth" ); + strcat_s( pRegisterName, nBufLen, buff ); + m_bOutputDepthRegister = true; + break; + case D3DSPR_SAMPLER: + V_snprintf( buff, sizeof( buff ), "sampler%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_CONST2: + TranslationError(); + V_snprintf( buff, sizeof( buff ), "c%d", dwRegNum+2048); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_CONST3: + TranslationError(); + V_snprintf( buff, sizeof( buff ), "c%d", dwRegNum+4096); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_CONST4: + TranslationError(); + V_snprintf( buff, sizeof( buff ), "c%d", dwRegNum+6144); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_CONSTBOOL: + V_snprintf( buff, sizeof( buff ), m_bVertexShader ? "b%d" : "fb%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + m_dwConstBoolUsageMask |= 0x00000001 << dwRegNum; // Keep track of the use of this bool constant + break; + case D3DSPR_LOOP: + TranslationError(); + V_snprintf( buff, sizeof( buff ), "aL%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_TEMPFLOAT16: + TranslationError(); + V_snprintf( buff, sizeof( buff ), "temp_float16_xxx%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_MISCTYPE: + Assert( dwRegNum == 0 ); // So far, we know that MISC[0] is gl_FragCoord (aka vPos in DX ASM parlance), but we don't know about any other MISC registers + V_snprintf( buff, sizeof( buff ), "gl_FragCoord" ); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_LABEL: + TranslationError(); + V_snprintf( buff, sizeof( buff ), "label%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + break; + case D3DSPR_PREDICATE: + TranslationError(); + V_snprintf( buff, sizeof( buff ), "p%d", dwRegNum ); + strcat_s( pRegisterName, nBufLen, buff ); + break; + } + + // If this is a dest register + if ( dwSourceOrDest == DST_REGISTER ) + { + // + // Write masks + // + // If some (not all, not none) of the write masks are set, we should include them + // + if ( bAllowWriteMask && ( !((dwToken & D3DSP_WRITEMASK_ALL) == D3DSP_WRITEMASK_ALL) || ((dwToken & D3DSP_WRITEMASK_ALL) == 0x00000000) ) ) + { + // Put the dot on there + strcat_s( pRegisterName, nBufLen, "." ); + + // Optionally put on the x, y, z or w + int nMasksWritten = 0; + if ( dwToken & D3DSP_WRITEMASK_0 ) + { + strcat_s( pRegisterName, nBufLen, "x" ); + ++nMasksWritten; + } + if ( dwToken & D3DSP_WRITEMASK_1 ) + { + strcat_s( pRegisterName, nBufLen, "y" ); + ++nMasksWritten; + } + if ( dwToken & D3DSP_WRITEMASK_2 ) + { + strcat_s( pRegisterName, nBufLen, "z" ); + ++nMasksWritten; + } + if ( dwToken & D3DSP_WRITEMASK_3 ) + { + strcat_s( pRegisterName, nBufLen, "w" ); + ++nMasksWritten; + } + } + } + else // must be a source register + { + if ( bAllowSwizzle ) // relative addressing hard-codes the swizzle on a0.x + { + uint32 dwXSwizzle, dwYSwizzle, dwZSwizzle, dwWSwizzle; + + // Mask out the swizzle modifier + dwSwizzle = dwToken & D3DVS_SWIZZLE_MASK; + + // If there are any swizzles at all, tack on the appropriate notation + if ( dwSwizzle != D3DVS_NOSWIZZLE ) + { + // Separate out the two-bit codes for each component swizzle + dwXSwizzle = dwSwizzle & D3DVS_X_W; + dwYSwizzle = dwSwizzle & D3DVS_Y_W; + dwZSwizzle = dwSwizzle & D3DVS_Z_W; + dwWSwizzle = dwSwizzle & D3DVS_W_W; + + // Put on the dot + strcat_s( pRegisterName, nBufLen, "." ); + + // See where X comes from + switch ( dwXSwizzle ) + { + case D3DVS_X_X: + strcat_s( pRegisterName, nBufLen, "x" ); + break; + case D3DVS_X_Y: + strcat_s( pRegisterName, nBufLen, "y" ); + break; + case D3DVS_X_Z: + strcat_s( pRegisterName, nBufLen, "z" ); + break; + case D3DVS_X_W: + strcat_s( pRegisterName, nBufLen, "w" ); + break; + } + + if ( !bForceScalarSource ) + { + // If the source of the remaining components are aren't + // identical to the source of x, continue with swizzle + if ( ((dwXSwizzle >> D3DVS_SWIZZLE_SHIFT) != (dwYSwizzle >> (D3DVS_SWIZZLE_SHIFT + 2))) || // X and Y sources match? + ((dwXSwizzle >> D3DVS_SWIZZLE_SHIFT) != (dwZSwizzle >> (D3DVS_SWIZZLE_SHIFT + 4))) || // X and Z sources match? + ((dwXSwizzle >> D3DVS_SWIZZLE_SHIFT) != (dwWSwizzle >> (D3DVS_SWIZZLE_SHIFT + 6)))) // X and W sources match? + { + + // OpenGL seems to want us to have either 1 or 4 components in a swizzle, so just plow on through the rest + switch ( dwYSwizzle ) + { + case D3DVS_Y_X: + strcat_s( pRegisterName, nBufLen, "x" ); + break; + case D3DVS_Y_Y: + strcat_s( pRegisterName, nBufLen, "y" ); + break; + case D3DVS_Y_Z: + strcat_s( pRegisterName, nBufLen, "z" ); + break; + case D3DVS_Y_W: + strcat_s( pRegisterName, nBufLen, "w" ); + break; + } + + switch ( dwZSwizzle ) + { + case D3DVS_Z_X: + strcat_s( pRegisterName, nBufLen, "x" ); + break; + case D3DVS_Z_Y: + strcat_s( pRegisterName, nBufLen, "y" ); + break; + case D3DVS_Z_Z: + strcat_s( pRegisterName, nBufLen, "z" ); + break; + case D3DVS_Z_W: + strcat_s( pRegisterName, nBufLen, "w" ); + break; + } + + switch ( dwWSwizzle ) + { + case D3DVS_W_X: + strcat_s( pRegisterName, nBufLen, "x" ); + break; + case D3DVS_W_Y: + strcat_s( pRegisterName, nBufLen, "y" ); + break; + case D3DVS_W_Z: + strcat_s( pRegisterName, nBufLen, "z" ); + break; + case D3DVS_W_W: + strcat_s( pRegisterName, nBufLen, "w" ); + break; + } + + } + + } // end !bForceScalarSource + } + else // dwSwizzle == D3DVS_NOSWIZZLE + { + // If this is a MOVA / ARL, GL on the Mac requires us to tack the .x onto the source register + if ( bForceScalarSource ) + { + strcat_s( pRegisterName, nBufLen, ".x" ); + } + } + } // bAllowSwizzle + + // If there are any source modifiers, check to see if they're at + // least partially "postfix" and tack them on as appropriate + if ( dwSrcModifier != D3DSPSM_NONE ) + { + switch ( dwSrcModifier ) + { + case D3DSPSM_BIAS: // bias + case D3DSPSM_BIASNEG: // bias and negate + TranslationError(); + strcat_s( pRegisterName, nBufLen, "_bx2" ); + break; + case D3DSPSM_SIGN: // sign + case D3DSPSM_SIGNNEG: // sign and negate + TranslationError(); + strcat_s( pRegisterName, nBufLen, "_sgn" ); + break; + case D3DSPSM_X2: // *2 + case D3DSPSM_X2NEG: // *2 and negate + TranslationError(); + strcat_s( pRegisterName, nBufLen, "_x2" ); + break; + case D3DSPSM_ABS: // abs() + case D3DSPSM_ABSNEG: // -abs() + strcat_s( pRegisterName, nBufLen, ")" ); + break; + case D3DSPSM_DZ: // divide through by z component + TranslationError(); + strcat_s( pRegisterName, nBufLen, "_dz" ); + break; + case D3DSPSM_DW: // divide through by w component + TranslationError(); + strcat_s( pRegisterName, nBufLen, "_dw" ); + break; + } + } // end postfix modifiers (really only ps.1.x) + } +} + +void D3DToGL::RecordInputAndOutputPositions() +{ + // Remember where we are in the token stream. + m_pRecordedInputTokenStart = m_pdwNextToken; + + // Remember where our outputs are. + m_nRecordedParamCodeStrlen = V_strlen( (char*)m_pBufParamCode->Base() ); + m_nRecordedALUCodeStrlen = V_strlen( (char*)m_pBufALUCode->Base() ); + m_nRecordedAttribCodeStrlen = V_strlen( (char*)m_pBufAttribCode->Base() ); +} +void D3DToGL::AddTokenHexCodeToBuffer( char *pBuffer, int nSize, int nLastStrlen ) +{ + int nCurStrlen = V_strlen( pBuffer ); + if ( nCurStrlen == nLastStrlen ) + return; + + // Build a string with all the hex codes of the tokens since last time. + char szHex[512]; + szHex[0] = '\n'; + V_snprintf( &szHex[1], sizeof( szHex )-1, HEXCODE_HEADER ); + int nTokens = MIN( 10, m_pdwNextToken - m_pRecordedInputTokenStart ); + for ( int i=0; i < nTokens; i++ ) + { + char szTemp[32]; + V_snprintf( szTemp, sizeof( szTemp ), "0x%x ", m_pRecordedInputTokenStart[i] ); + V_strncat( szHex, szTemp, sizeof( szHex ) ); + } + V_strncat( szHex, "\n", sizeof( szHex ) ); + + // Insert the hex codes into the string. + int nBytesToInsert = V_strlen( szHex ); + if ( nCurStrlen + nBytesToInsert + 1 >= nSize ) + Error( "Buffer overflow writing token hex codes" ); + + if ( m_bPutHexCodesAfterLines ) + { + // Put it at the end of the last line. + if ( pBuffer[nCurStrlen-1] == '\n' ) + pBuffer[nCurStrlen-1] = 0; + + V_strncat( pBuffer, &szHex[1], nSize ); + } + else + { + memmove( pBuffer + nLastStrlen + nBytesToInsert, pBuffer + nLastStrlen, nCurStrlen - nLastStrlen + 1 ); + memcpy( pBuffer + nLastStrlen, szHex, nBytesToInsert ); + } +} + +void D3DToGL::AddTokenHexCode() +{ + if ( m_pdwNextToken > m_pRecordedInputTokenStart ) + { + AddTokenHexCodeToBuffer( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size(), m_nRecordedParamCodeStrlen ); + AddTokenHexCodeToBuffer( (char*)m_pBufALUCode->Base(), m_pBufALUCode->Size(), m_nRecordedALUCodeStrlen ); + AddTokenHexCodeToBuffer( (char*)m_pBufAttribCode->Base(), m_pBufAttribCode->Size(), m_nRecordedAttribCodeStrlen ); + } +} + +uint32 D3DToGL::MaintainAttributeMap( uint32 dwToken, uint32 dwRegToken ) +{ + // Check that this reg index has not been used before - if it has, let Houston know + uint dwRegIndex = dwRegToken & D3DSP_REGNUM_MASK; + if ( m_dwAttribMap[ dwRegIndex ] == 0xFFFFFFFF ) + { + // log it + // semantic/usage in the higher nibble + // usage index in the low nibble + + uint usage = dwToken & D3DSP_DCL_USAGE_MASK; + uint usageindex = ( dwToken & D3DSP_DCL_USAGEINDEX_MASK ) >> D3DSP_DCL_USAGEINDEX_SHIFT; + + m_dwAttribMap[ dwRegIndex ] = ( usage << 4 ) | usageindex; + + // avoid writing 0xBB since runtime code uses that for an 'unused' marker + if ( m_dwAttribMap[ dwRegIndex ] == 0xBB ) + { + Debugger(); + } + } + else + { + //not OK + Debugger(); + } + + return dwRegIndex; +} + +void D3DToGL::Handle_DCL() +{ + uint32 dwToken = GetNextToken(); // What kind of dcl is this... + uint32 dwRegToken = GetNextToken(); // Look ahead to register token + + uint32 dwUsage = ( dwToken & D3DSP_DCL_USAGE_MASK ); + uint32 dwUsageIndex = ( dwToken & D3DSP_DCL_USAGEINDEX_MASK ) >> D3DSP_DCL_USAGEINDEX_SHIFT; + + uint32 dwRegNum = dwRegToken & D3DSP_REGNUM_MASK; + uint32 nRegType = GetRegTypeFromToken( dwRegToken ); + + if ( m_bVertexShader ) + { + // If this is an output, remember the index (what the ASM code calls o0, o1, o2..) and the semantic. + // When GetParameterString( DST_REGISTER ) hits this one, we'll return "oN". + // At the end of the main() function, we'll insert a bunch of statements like "gl_Color = o2" based on what we remembered here. + if ( ( m_dwMajorVersion >= 3 ) && ( nRegType == D3DSPR_OUTPUT ) ) + { +// uint32 dwRegComponents = ( dwRegToken & D3DSP_WRITEMASK_ALL ) >> 16; // Components used by the output register (1 means float, 3 means vec2, 7 means vec3, f means vec4) + + if ( dwRegNum >= MAX_DECLARED_OUTPUTS ) + Error( "Output register number (%d) too high (only %d supported).", dwRegNum, MAX_DECLARED_OUTPUTS ); + + if ( m_DeclaredOutputs[dwRegNum] != UNDECLARED_OUTPUT ) + Error( "Output dcl_ hit for register #%d more than once!", dwRegNum ); + + Assert( dwToken != UNDECLARED_OUTPUT ); + m_DeclaredOutputs[dwRegNum] = dwToken; + + //uint32 dwUsage = ( dwToken & D3DSP_DCL_USAGE_MASK ); + //uint32 dwUsageIndex = ( dwToken & D3DSP_DCL_USAGEINDEX_MASK ) >> D3DSP_DCL_USAGEINDEX_SHIFT; + + // Flag which o# output register maps to gl_Position + if ( dwUsage == D3DDECLUSAGE_POSITION ) + { + m_nVSPositionOutput = dwUsageIndex; + m_bDeclareVSOPos = true; + } + + if ( m_bAddHexCodeComments ) + { + CUtlString sParam2 = GetUsageAndIndexString( dwToken, SEMANTIC_OUTPUT ); + PrintToBuf( *m_pBufHeaderCode, "// [GL remembering that oT%d maps to %s]\n", dwRegNum, sParam2.String() ); + } + + } + else if ( GetRegType( dwRegToken ) == D3DSPR_SAMPLER ) + { + // We can support vertex texturing if necessary, but I can't find a use case in any branch. (HW morphing in L4D2 isn't enabled, and the comments indicate that r_hwmorph isn't compatible with mat_queue_mode anyway, and CS:GO/DoTA don't use vertex shader texturing.) + TranslationError(); + + int nRegNum = dwRegToken & D3DSP_REGNUM_MASK; + switch ( TextureType( dwToken ) ) + { + default: + case D3DSTT_UNKNOWN: + case D3DSTT_2D: + m_dwSamplerTypes[nRegNum] = SAMPLER_TYPE_2D; + break; + case D3DSTT_CUBE: + m_dwSamplerTypes[nRegNum] = SAMPLER_TYPE_CUBE; + break; + case D3DSTT_VOLUME: + m_dwSamplerTypes[nRegNum] = SAMPLER_TYPE_3D; + break; + } + + // Track sampler declarations + m_dwSamplerUsageMask |= 1 << nRegNum; + } + else + { + Assert( GetRegType( dwRegToken ) == D3DSPR_INPUT); + + CUtlString sParam1 = GetParameterString( dwRegToken, DST_REGISTER, false, NULL ); + CUtlString sParam2 = GetUsageAndIndexString( dwToken, SEMANTIC_INPUT ); + + sParam2 = FixGLSLSwizzle( sParam1, sParam2 ); + PrintToBuf( *m_pBufHeaderCode, "attribute vec4 %s; // ", sParam1.String() ); + + MaintainAttributeMap( dwToken, dwRegToken ); + + char temp[128]; + // regnum goes straight into the vertex.attrib[n] index + sprintf( temp, "%08x %08x\n", dwToken, dwRegToken ); + StrcatToHeaderCode( temp ); + } + } + else // Pixel shader + { + // If the register is a sampler, the dcl has a dimension decorator that we have to save for subsequent TEX instructions + uint32 nRegType = GetRegType( dwRegToken ); + if ( nRegType == D3DSPR_SAMPLER ) + { + int nRegNum = dwRegToken & D3DSP_REGNUM_MASK; + switch ( TextureType( dwToken ) ) + { + default: + case D3DSTT_UNKNOWN: + case D3DSTT_2D: + m_dwSamplerTypes[nRegNum] = SAMPLER_TYPE_2D; + break; + case D3DSTT_CUBE: + m_dwSamplerTypes[nRegNum] = SAMPLER_TYPE_CUBE; + break; + case D3DSTT_VOLUME: + m_dwSamplerTypes[nRegNum] = SAMPLER_TYPE_3D; + break; + } + + // Track sampler declarations + m_dwSamplerUsageMask |= 1 << nRegNum; + } + else // Not a sampler, we're going to generate varying declaration code + { + // In pixel shaders we only declare texture coordinate varyings since they may be using centroid + if ( ( m_dwMajorVersion == 3 ) && ( nRegType == D3DSPR_INPUT ) ) + { + Assert( m_DeclaredInputs[dwRegNum] == UNDECLARED_INPUT ); + m_DeclaredInputs[dwRegNum] = dwToken; + + if ( ( dwUsage != D3DDECLUSAGE_COLOR ) && ( dwUsage != D3DDECLUSAGE_TEXCOORD ) ) + { + TranslationError(); // Not supported yet, but can be if we need it. + } + + if ( dwUsage == D3DDECLUSAGE_TEXCOORD ) + { + char buf[256]; + if ( m_nCentroidMask & ( 0x00000001 << dwUsageIndex ) ) + { + V_snprintf( buf, sizeof( buf ), "centroid varying vec4 oT%d;\n", dwUsageIndex ); // centroid varying + } + else + { + V_snprintf( buf, sizeof( buf ), "varying vec4 oT%d;\n", dwUsageIndex ); + } + StrcatToHeaderCode( buf ); + } + } + else if ( nRegType == D3DSPR_TEXTURE ) + { + char buff[256]; + PrintParameterToString( dwRegToken, DST_REGISTER, buff, sizeof( buff ), false, NULL ); + PrintToBuf( *m_pBufHeaderCode, "%s;\n",buff ); + } + else + { + // No need to declare anything (probably D3DSPR_MISCTYPE either VPOS or VFACE) + } + } + } +} + +static bool IsFloatNaN( float f ) +{ + const uint nBits = *reinterpret_cast(&f); + const uint nExponent = ( nBits >> 23 ) & 0xFF; + + return ( nExponent == 255 ); +} + +static inline bool EqualTol( double a, double b, double t ) +{ + return fabs( a - b ) <= ( ( MAX( fabs( a ), fabs( b ) ) + 1.0 ) * t ); +} + +// Originally written by Bruce Dawson, see: +// See http://randomascii.wordpress.com/2012/03/08/float-precisionfrom-zero-to-100-digits-2/ +// This class represents a very limited high-precision number with 'count' 32-bit +// unsigned elements. +template +struct HighPrec +{ + typedef unsigned T; + typedef unsigned long long Product_t; + static const int kWordShift = 32; + HighPrec() + { + memset(m_data, 0, sizeof(m_data)); + m_nLowestNonZeroIndex = ARRAYSIZE(m_data); + } + + // Insert the bits from value into m_data, shifted in from the bottom (least + // significant end) by the specified number of bits. A shift of zero or less + // means that none of the bits will be shifted in. A shift of one means that + // the high bit of value will be in the bottom of the last element of m_data - + // the least significant bit. A shift of kWordShift means that value will be + // in the least significant element of m_data, and so on. + void InsertLowBits(T value, int shiftAmount) + { + if (shiftAmount <= 0) + return; + + int subShift = shiftAmount & (kWordShift - 1); + int bigShift = shiftAmount / kWordShift; + Product_t result = (Product_t)value << subShift; + T resultLow = (T)result; + T resultHigh = result >> kWordShift; + + // Use an unsigned type so that negative numbers will become large, + // which makes the range checking below simpler. + unsigned highIndex = ARRAYSIZE(m_data) - 1 - bigShift; + // Write the results to the data array. If the index is too large + // then that means that the data was shifted off the edge. + if ( (highIndex < ARRAYSIZE(m_data)) && ( resultHigh ) ) + { + m_data[highIndex] |= resultHigh; + m_nLowestNonZeroIndex = MIN( m_nLowestNonZeroIndex, highIndex ); + } + + if ( ( highIndex + 1 < ARRAYSIZE(m_data)) && ( resultLow ) ) + { + m_data[highIndex + 1] |= resultLow; + m_nLowestNonZeroIndex = MIN( m_nLowestNonZeroIndex, highIndex + 1 ); + } + } + + // Insert the bits from value into m_data, shifted in from the top (most + // significant end) by the specified number of bits. A shift of zero or less + // means that none of the bits will be shifted in. A shift of one means that + // the low bit of value will be in the top of the first element of m_data - + // the most significant bit. A shift of kWordShift means that value will be + // in the most significant element of m_data, and so on. + void InsertTopBits(T value, int shiftAmount) + { + InsertLowBits(value, (ARRAYSIZE(m_data) + 1) * kWordShift - shiftAmount); + } + + // Return true if all elements of m_data are zero. + bool IsZero() const + { + bool bIsZero = ( m_nLowestNonZeroIndex == ARRAYSIZE(m_data) ); + +#ifdef DEBUG + for (int i = 0; i < ARRAYSIZE(m_data); ++i) + { + if (m_data[i]) + { + Assert( !bIsZero ); + return false; + } + } + Assert( bIsZero ); +#endif + + return bIsZero; + } + + // Divide by div and return the remainder, from 0 to div-1. + // Standard long-division algorithm. + T DivReturnRemainder(T divisor) + { + T remainder = 0; + +#ifdef DEBUG + for (uint j = 0; j < m_nLowestNonZeroIndex; ++j) + { + Assert( m_data[j] == 0 ); + } +#endif + + int nNewLowestNonZeroIndex = ARRAYSIZE(m_data); + for (int i = m_nLowestNonZeroIndex; i < ARRAYSIZE(m_data); ++i) + { + Product_t dividend = ((Product_t)remainder << kWordShift) + m_data[i]; + Product_t result = dividend / divisor; + remainder = T(dividend % divisor); + + m_data[i] = T(result); + + if ( ( result ) && ( nNewLowestNonZeroIndex == ARRAYSIZE(m_data) ) ) + nNewLowestNonZeroIndex = i; + } + m_nLowestNonZeroIndex = nNewLowestNonZeroIndex; + + return remainder; + } + + // The individual 'digits' (32-bit unsigned integers actually) that + // make up the number. The most-significant digit is in m_data[0]. + T m_data[count]; + + uint m_nLowestNonZeroIndex; +}; + +union Double_t +{ + Double_t(double num = 0.0f) : f(num) {} + // Portable extraction of components. + bool Negative() const { return (i >> 63) != 0; } + int64_t RawMantissa() const { return i & ((1LL << 52) - 1); } + int64_t RawExponent() const { return (i >> 52) & 0x7FF; } + + int64_t i; + double f; +}; + +static uint PrintDoubleInt( char *pBuf, uint nBufSize, double f, uint nMinChars ) +{ + static const char *pDigits = "00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899"; + + Assert( !nMinChars || ( ( nMinChars % 6 ) == 0 ) ); + + char *pLastChar = pBuf + nBufSize - 1; + char *pDst = pLastChar; + *pDst-- = '\0'; + + // Put the double in our magic union so we can grab the components. + union Double_t num(f); + + // Get the character that represents the sign. + // Check for NaNs or infinity. + if (num.RawExponent() == 2047) + { + TranslationError(); + } + + // Adjust for the exponent bias. + int exponentValue = int(num.RawExponent() - 1023); + // Add the implied one to the mantissa. + uint64_t mantissaValue = (1ll << 52) + num.RawMantissa(); + // Special-case for denormals - no special exponent value and + // no implied one. + if (num.RawExponent() == 0) + { + exponentValue = -1022; + mantissaValue = num.RawMantissa(); + } + uint32_t mantissaHigh = mantissaValue >> 32; + uint32_t mantissaLow = mantissaValue & 0xFFFFFFFF; + + // The first bit of the mantissa has an implied value of one and this can + // be shifted 1023 positions to the left, so that's 1024 bits to the left + // of the binary point, or 32 32-bit words for the integer part. + HighPrec<32> intPart; + // When our exponentValue is zero (a number in the 1.0 to 2.0 range) + // we have a 53-bit mantissa and the implied value of the highest bit + // is 1. We need to shift 12 bits in from the bottom to get that 53rd bit + // into the ones spot in the integral portion. + // To complicate it a bit more we have to insert the mantissa as two parts. + intPart.InsertLowBits(mantissaHigh, 12 + exponentValue); + intPart.InsertLowBits(mantissaLow, 12 + exponentValue - 32); + + bool bAnyDigitsLeft; + do + { + uint remainder = intPart.DivReturnRemainder( 1000000 ); // 10^6 + uint origRemainer = remainder; (void)origRemainer; + + bAnyDigitsLeft = !intPart.IsZero(); + + if ( bAnyDigitsLeft ) + { + uint n = remainder % 100U; remainder /= 100U; *reinterpret_cast(pDst - 1) = reinterpret_cast(pDigits)[n]; + n = remainder % 100U; remainder /= 100U; *reinterpret_cast(pDst - 1 - 2) = reinterpret_cast(pDigits)[n]; + Assert( remainder < 100U ); + *reinterpret_cast(pDst - 1 - 4) = reinterpret_cast(pDigits)[remainder]; + pDst -= 6; + } + else + { + uint n = remainder % 100U; remainder /= 100U; *reinterpret_cast(pDst - 1) = reinterpret_cast(pDigits)[n]; --pDst; if ( ( n >= 10 ) || ( remainder ) ) --pDst; + if ( remainder ) + { + n = remainder % 100U; remainder /= 100U; *reinterpret_cast(pDst - 1) = reinterpret_cast(pDigits)[n]; --pDst; if ( ( n >= 10 ) || ( remainder ) ) --pDst; + + if ( remainder ) + { + Assert( remainder < 100U ); + *reinterpret_cast(pDst - 1) = reinterpret_cast(pDigits)[remainder]; --pDst; if ( remainder >= 10 ) --pDst; + } + } + } + + } while ( bAnyDigitsLeft ); + + uint l = pLastChar - pDst; + + while ( ( l - 1 ) < nMinChars ) + { + *pDst-- = '0'; + l++; + } + + Assert( (int)l == ( pLastChar - pDst ) ); + + Assert( l <= nBufSize ); + + memmove( pBuf, pDst + 1, l ); + return l - 1; +} + +// FloatToString is equivalent to sprintf( "%.12f" ), but doesn't have any dependencies on the current locale setting. +// Unfortunately, high accuracy radix conversion is actually pretty tricky to do right. +// Most importantly, this function has the same max roundtrip (IEEE->ASCII->IEEE) error as the MS CRT functions and can reliably handle extremely large inputs. +static void FloatToString( char *pBuf, uint nBufSize, double fConst ) +{ + char *pEnd = pBuf + nBufSize; + char *pDst = pBuf; + + double flVal = fConst; + if ( IsFloatNaN( flVal ) ) + { + flVal = 0; + } + + if ( flVal < 0.0f ) + { + *pDst++ = '-'; + flVal = -flVal; + } + + double flInt; + double flFract = modf( flVal, &flInt ); + + flFract = floor( flFract * 1000000000000.0 + .5 ); + + if ( !flInt ) + { + *pDst++ = '0'; + } + else + { + uint l = PrintDoubleInt( pDst, pEnd - pDst, flInt, 0 ); + pDst += l; + } + + *pDst++ = '.'; + if ( !flFract ) + { + *pDst++ = '0'; + *pDst++ = '\0'; + } + else + { + uint l = PrintDoubleInt( pDst, pEnd - pDst, flFract, 12 ); + pDst += l; + + StripExtraTrailingZeros( pBuf ); // Turn 1.00000 into 1.0 + } +} + +#if 0 +#include "vstdlib/random.h" +static void TestFloatConversion() +{ + for ( ; ; ) + { + double fConst; + switch ( rand() % 4 ) + { + case 0: + fConst = RandomFloat( -1e-30, 1e+30 ); break; + case 1: + fConst = RandomFloat( -1e-10, 1e+10 ); break; + case 2: + fConst = RandomFloat( -1e-5, 1e+5 ); break; + default: + fConst = RandomFloat( -1, 1 ); break; + } + + char szTemp[1024]; + + // FloatToString does not rely on V_snprintf(), so it can't be affected by the current locale setting. + FloatToString( szTemp, sizeof( szTemp ), fConst ); + + static double flMaxErr1; + static double flMaxErr2; + + // Compare FloatToString()'s results vs. V_snprintf()'s, also track maximum error of each. + double flCheck = atof( szTemp ); + double flErr = fabs( flCheck - fConst ); + flMaxErr1 = MAX( flMaxErr1, flErr ); + Assert( EqualTol( flCheck, fConst, .000000125 ) ); + + char szTemp2[256]; + V_snprintf( szTemp2, sizeof( szTemp2 ), "%.12f", fConst ); + StripExtraTrailingZeros( szTemp2 ); + + if ( !strchr( szTemp2, '.' ) ) + { + V_strncat( szTemp2, ".0", sizeof( szTemp2 ) ); + } + double flCheck2 = atof( szTemp2 ); + double flErr2 = fabs( flCheck2 - fConst ); + flMaxErr2 = MAX( flMaxErr2, flErr2 ); + Assert( EqualTol( flCheck2, fConst, .000000125 ) ); + + if ( flMaxErr1 > flMaxErr2 ) + { + GLMDebugPrintf( "!\n" ); + } + } +} +#endif + +void D3DToGL::Handle_DEFIB( uint32 instruction ) +{ + Assert( ( instruction == D3DSIO_DEFI ) || ( instruction == D3DSIO_DEFB ) ); + + // which register is being defined + uint32 dwToken = GetNextToken(); + + uint32 nRegNum = dwToken & D3DSP_REGNUM_MASK; + + uint32 regType = GetRegTypeFromToken( dwToken ); + + + if ( regType == D3DSPR_CONSTINT ) + { + m_dwDefConstIntUsageMask |= ( 1 << nRegNum ); + + uint x = GetNextToken(); + uint y = GetNextToken(); + uint z = GetNextToken(); + uint w = GetNextToken(); + NOTE_UNUSED(y); NOTE_UNUSED(z); NOTE_UNUSED(w); + + Assert( nRegNum < 32 ); + if ( nRegNum < 32 ) + { + m_dwDefConstIntIterCount[nRegNum] = x; + } + } + else + { + TranslationError(); + } + +} + +void D3DToGL::Handle_DEF() +{ + //TestFloatConversion(); + + // + // JasonM TODO: catch D3D's sincos-specific D3DSINCOSCONST1 and D3DSINCOSCONST2 constants and filter them out here + // + + // Which register is being defined + uint32 dwToken = GetNextToken(); + + // Note that this constant was explicitly defined + m_bConstantRegisterDefined[dwToken & D3DSP_REGNUM_MASK] = true; + CUtlString sParamName = GetParameterString( dwToken, DST_REGISTER, false, NULL ); + + PrintIndentation( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size() ); + PrintToBuf( *m_pBufParamCode, "vec4 %s = vec4( ", sParamName.String() ); + + // Run through the 4 floats + for ( int i=0; i < 4; i++ ) + { + float fConst = uint32ToFloat( GetNextToken() ); + + char szTemp[1024]; + + FloatToString( szTemp, sizeof( szTemp ), fConst ); + +#if 0 + static double flMaxErr1; + static double flMaxErr2; + + // Compare FloatToString()'s results vs. V_snprintf()'s, also track maximum error of each. + double flCheck = atof( szTemp ); + double flErr = fabs( flCheck - fConst ); + flMaxErr1 = MAX( flMaxErr1, flErr ); + Assert( EqualTol( flCheck, fConst, .000000125 ) ); + + char szTemp2[256]; + V_snprintf( szTemp2, sizeof( szTemp2 ), "%.12f", fConst ); + StripExtraTrailingZeros( szTemp2 ); + + if ( !strchr( szTemp2, '.' ) ) + { + V_strncat( szTemp2, ".0", sizeof( szTemp2 ) ); + } + double flCheck2 = atof( szTemp2 ); + double flErr2 = fabs( flCheck2 - fConst ); + flMaxErr2 = MAX( flMaxErr2, flErr2 ); + Assert( EqualTol( flCheck2, fConst, .000000125 ) ); + + if ( flMaxErr1 > flMaxErr2 ) + { + GLMDebugPrintf( "!\n" ); + } +#endif + + PrintToBuf( *m_pBufParamCode, i != 3 ? "%s, " : "%s", szTemp ); // end with comma-space + } + + PrintToBuf( *m_pBufParamCode, " );\n" ); +} + +void D3DToGL::Handle_MAD( uint32 nInstruction ) +{ + uint32 nDestToken = GetNextToken(); + CUtlString sParam1 = GetParameterString( nDestToken, DST_REGISTER, false, NULL ); + int nARLComp0 = ARL_DEST_NONE; + CUtlString sParam2 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp0 ); + int nARLComp1 = ARL_DEST_NONE; + CUtlString sParam3 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp1 ); + int nARLComp2 = ARL_DEST_NONE; + CUtlString sParam4 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp2 ); + + // This optionally inserts a move from our dummy address register to the .x component of the real one + InsertMoveFromAddressRegister( m_pBufALUCode, nARLComp0, nARLComp1, nARLComp2 ); + + sParam2 = FixGLSLSwizzle( sParam1, sParam2 ); + sParam3 = FixGLSLSwizzle( sParam1, sParam3 ); + sParam4 = FixGLSLSwizzle( sParam1, sParam4 ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s * %s + %s;\n", sParam1.String(), sParam2.String(), sParam3.String(), sParam4.String() ); + + // If the _SAT instruction modifier is used, then do a saturate here. + if ( nDestToken & D3DSPDM_SATURATE ) + { + int nComponents = GetNumSwizzleComponents( sParam1.String() ); + if ( nComponents == 0 ) + nComponents = 4; + + PrintToBufWithIndents( *m_pBufALUCode, "%s = clamp( %s, %s, %s );\n", sParam1.String(), sParam1.String(), g_szVecZeros[nComponents], g_szVecOnes[nComponents] ); + } +} + + +void D3DToGL::Handle_DP2ADD() +{ + char pDestReg[64], pSrc0Reg[64], pSrc1Reg[64], pSrc2Reg[64]; + uint32 nDestToken = GetNextToken(); + PrintParameterToString( nDestToken, DST_REGISTER, pDestReg, sizeof( pDestReg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc0Reg, sizeof( pSrc0Reg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc1Reg, sizeof( pSrc1Reg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc2Reg, sizeof( pSrc2Reg ), false, NULL ); + + // We should only be assigning to a single component of the dest. + Assert( GetNumSwizzleComponents( pDestReg ) == 1 ); + Assert( GetNumSwizzleComponents( pSrc2Reg ) == 1 ); + + // This is a 2D dot product, so we only want two entries from the middle components. + CUtlString sArg0 = EnsureNumSwizzleComponents( pSrc0Reg, 2 ); + CUtlString sArg1 = EnsureNumSwizzleComponents( pSrc1Reg, 2 ); + + PrintToBufWithIndents( *m_pBufALUCode, "%s = dot( %s, %s ) + %s;\n", pDestReg, sArg0.String(), sArg1.String(), pSrc2Reg ); + + // If the _SAT instruction modifier is used, then do a saturate here. + if ( nDestToken & D3DSPDM_SATURATE ) + { + int nComponents = GetNumSwizzleComponents( pDestReg ); + if ( nComponents == 0 ) + nComponents = 4; + + PrintToBufWithIndents( *m_pBufALUCode, "%s = clamp( %s, %s, %s );\n", pDestReg, pDestReg, g_szVecZeros[nComponents], g_szVecOnes[nComponents] ); + } +} + + +void D3DToGL::Handle_SINCOS() +{ + char pDestReg[64], pSrc0Reg[64]; + PrintParameterToString( GetNextToken(), DST_REGISTER, pDestReg, sizeof( pDestReg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc0Reg, sizeof( pSrc0Reg ), true, NULL ); + m_bNeedsSinCosDeclarations = true; + + + CUtlString sDest( pDestReg ); + CUtlString sArg0 = EnsureNumSwizzleComponents( pSrc0Reg, 1 );// Ensure input is scalar + CUtlString sResult( "vSinCosTmp.xy" ); // Always going to populate this + sResult = FixGLSLSwizzle( sDest, sResult ); // Make sure we match the desired output reg + + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.z = %s * %s;\n", sArg0.String(), sArg0.String() ); + + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.xy = vSinCosTmp.zz * scA.xy + scA.wz;\n" ); + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.xy = vSinCosTmp.xy * vSinCosTmp.zz + scB.xy;\n" ); + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.xy = vSinCosTmp.xy * vSinCosTmp.zz + scB.wz;\n" ); + + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.x = vSinCosTmp.x * %s;\n", sArg0.String() ); + + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.xy = vSinCosTmp.xy * vSinCosTmp.xx;\n" ); + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.xy = vSinCosTmp.xy + vSinCosTmp.xy;\n" ); + PrintToBufWithIndents( *m_pBufALUCode, "vSinCosTmp.x = -vSinCosTmp.x + scB.z;\n" ); + + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s;\n", sDest.String(), sResult.String() ); + + if ( m_dwMajorVersion < 3 ) + { + // Eat two more tokens since D3D defines Taylor series constants that we won't need + // Only valid for pixel and vertex shader version earlier than 3_0 + // (http://msdn.microsoft.com/en-us/library/windows/hardware/ff569710(v=vs.85).aspx) + SkipTokens( 2 ); + } +} + + +void D3DToGL::Handle_LRP( uint32 nInstruction ) +{ + uint32 nDestToken = GetNextToken(); + CUtlString sDest = GetParameterString( nDestToken, DST_REGISTER, false, NULL ); + int nARLComp0 = ARL_DEST_NONE; + CUtlString sParam0 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp0 ); + int nARLComp1 = ARL_DEST_NONE; + CUtlString sParam1 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp1 ); + int nARLComp2 = ARL_DEST_NONE; + CUtlString sParam2 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp2 ); + + // This optionally inserts a move from our dummy address register to the .x component of the real one + InsertMoveFromAddressRegister( m_pBufALUCode, nARLComp0, nARLComp1, nARLComp2 ); + + sParam0 = FixGLSLSwizzle( sDest, sParam0 ); + sParam1 = FixGLSLSwizzle( sDest, sParam1 ); + sParam2 = FixGLSLSwizzle( sDest, sParam2 ); + + // dest = src0 * (src1 - src2) + src2; + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s * ( %s - %s ) + %s;\n", sDest.String(), sParam0.String(), sParam1.String(), sParam2.String(), sParam2.String() ); + + // If the _SAT instruction modifier is used, then do a saturate here. + if ( nDestToken & D3DSPDM_SATURATE ) + { + int nComponents = GetNumSwizzleComponents( sDest.String() ); + if ( nComponents == 0 ) + nComponents = 4; + + PrintToBufWithIndents( *m_pBufALUCode, "%s = clamp( %s, %s, %s );\n", sDest.String(), sDest.String(), g_szVecZeros[nComponents], g_szVecOnes[nComponents] ); + } +} + + +void D3DToGL::Handle_TEX( uint32 dwToken, bool bIsTexLDL ) +{ + char pDestReg[64], pSrc0Reg[64], pSrc1Reg[64]; + PrintParameterToString( GetNextToken(), DST_REGISTER, pDestReg, sizeof( pDestReg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc0Reg, sizeof( pSrc0Reg ), false, NULL ); + + DWORD dwSrc1Token = GetNextToken(); + PrintParameterToString( dwSrc1Token, SRC_REGISTER, pSrc1Reg, sizeof( pSrc1Reg ), false, NULL ); + + Assert( (dwSrc1Token & D3DSP_REGNUM_MASK) < ARRAYSIZE( m_dwSamplerTypes ) ); + uint32 nSamplerType = m_dwSamplerTypes[dwSrc1Token & D3DSP_REGNUM_MASK]; + if ( nSamplerType == SAMPLER_TYPE_2D ) + { + const bool bIsShadowSampler = ( ( 1 << ( (int) ( dwSrc1Token & D3DSP_REGNUM_MASK ) ) ) & m_nShadowDepthSamplerMask ) != 0; + + if ( bIsTexLDL ) + { + CUtlString sCoordVar = EnsureNumSwizzleComponents( pSrc0Reg, bIsShadowSampler ? 3 : 2 ); + + // Strip out the W component of the pSrc0Reg and pass that as the LOD to texture2DLod. + char szLOD[128], szExtra[8]; + GetParamNameWithoutSwizzle( pSrc0Reg, szLOD, sizeof( szLOD ) ); + V_snprintf( szExtra, sizeof( szExtra ), ".%c", GetSwizzleComponent( pSrc0Reg, 3 ) ); + V_strncat( szLOD, szExtra, sizeof( szLOD ) ); + + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s( %s, %s, %s );\n", pDestReg, bIsShadowSampler ? "shadow2DLod" : "texture2DLod", pSrc1Reg, sCoordVar.String(), szLOD ); + } + else if ( bIsShadowSampler ) + { + // .z is meant to contain the object depth, while .xy contains the 2D tex coords + CUtlString sCoordVar3D = EnsureNumSwizzleComponents( pSrc0Reg, 3 ); + + PrintToBufWithIndents( *m_pBufALUCode, "%s = shadow2D( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar3D.String() ); + Assert( m_dwSamplerTypes[dwSrc1Token & D3DSP_REGNUM_MASK] == SAMPLER_TYPE_2D ); + } + else if( ( OpcodeSpecificData( dwToken ) << D3DSP_OPCODESPECIFICCONTROL_SHIFT ) == D3DSI_TEXLD_PROJECT ) + { + // This projective case is after the shadow case intentionally, due to the way that "projective" + // loads are overloaded in our D3D shaders for shadow lookups. + // + // We use the vec4 variant of texture2DProj() intentionally here, since it lines up well with Direct3D. + + CUtlString s4DProjCoords = EnsureNumSwizzleComponents( pSrc0Reg, 4 ); // Ensure vec4 variant + PrintToBufWithIndents( *m_pBufALUCode, "%s = texture2DProj( %s, %s );\n", pDestReg, pSrc1Reg, s4DProjCoords.String() ); + } + else + { + CUtlString sCoordVar = EnsureNumSwizzleComponents( pSrc0Reg, bIsShadowSampler ? 3 : 2 ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = texture2D( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); + } + } + else if ( nSamplerType == SAMPLER_TYPE_3D ) + { + if ( bIsTexLDL ) + { + TranslationError(); + } + + CUtlString sCoordVar = EnsureNumSwizzleComponents( pSrc0Reg, 3 ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = texture3D( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); + } + else if ( nSamplerType == SAMPLER_TYPE_CUBE ) + { + if ( bIsTexLDL ) + { + TranslationError(); + } + + CUtlString sCoordVar = EnsureNumSwizzleComponents( pSrc0Reg, 3 ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = textureCube( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); + } + else + { + Error( "TEX instruction: unsupported sampler type used" ); + } +} + +void D3DToGL::StrcatToHeaderCode( const char *pBuf ) +{ + strcat_s( (char*)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), pBuf ); +} + +void D3DToGL::StrcatToALUCode( const char *pBuf ) +{ + PrintIndentation( (char*)m_pBufALUCode->Base(), m_pBufALUCode->Size() ); + + strcat_s( (char*)m_pBufALUCode->Base(), m_pBufALUCode->Size(), pBuf ); +} + +void D3DToGL::StrcatToParamCode( const char *pBuf ) +{ + strcat_s( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size(), pBuf ); +} + +void D3DToGL::StrcatToAttribCode( const char *pBuf ) +{ + strcat_s( (char*)m_pBufAttribCode->Base(), m_pBufAttribCode->Size(), pBuf ); +} + +void D3DToGL::Handle_TexLDD( uint32 nInstruction ) +{ + TranslationError(); // Not supported yet, but can be if we need it. +} + + +void D3DToGL::Handle_TexCoord() +{ + TranslationError(); + + // If ps_1_4, this is texcrd + if ( (m_dwMajorVersion == 1) && (m_dwMinorVersion == 4) && (!m_bVertexShader) ) + { + StrcatToALUCode( "texcrd" ); + } + else // else it's texcoord + { + TranslationError(); + StrcatToALUCode( "texcoord" ); + } + + char buff[256]; + PrintParameterToString( GetNextToken(), DST_REGISTER, buff, sizeof( buff ), false, NULL ); + StrcatToALUCode( buff ); + + // If ps_1_4, texcrd also has a source parameter + if ((m_dwMajorVersion == 1) && (m_dwMinorVersion == 4) && (!m_bVertexShader)) + { + StrcatToALUCode( ", " ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, buff, sizeof( buff ), false, NULL ); + StrcatToALUCode( buff ); + } + + StrcatToALUCode( ";\n" ); +} + +void D3DToGL::Handle_BREAKC( uint32 dwToken ) +{ + uint nComparison = ( dwToken & D3DSHADER_COMPARISON_MASK ) >> D3DSHADER_COMPARISON_SHIFT; + + const char *pComparison = "?"; + switch ( nComparison ) + { + case D3DSPC_GT: pComparison = ">"; break; + case D3DSPC_EQ: pComparison = "=="; break; + case D3DSPC_GE: pComparison = ">="; break; + case D3DSPC_LT: pComparison = "<"; break; + case D3DSPC_NE: pComparison = "!="; break; + case D3DSPC_LE: pComparison = "<="; break; + default: + TranslationError(); + } + + char src0[256]; + uint32 src0Token = GetNextToken(); + PrintParameterToString( src0Token, SRC_REGISTER, src0, sizeof( src0 ), false, NULL ); + + char src1[256]; + uint32 src1Token = GetNextToken(); + PrintParameterToString( src1Token, SRC_REGISTER, src1, sizeof( src1 ), false, NULL ); + + PrintToBufWithIndents( *m_pBufALUCode, "if (%s %s %s) break;\n", src0, pComparison, src1 ); +} + +void D3DToGL::HandleBinaryOp_GLSL( uint32 nInstruction ) +{ + uint32 nDestToken = GetNextToken(); + CUtlString sParam1 = GetParameterString( nDestToken, DST_REGISTER, false, NULL ); + int nARLComp0 = ARL_DEST_NONE; + CUtlString sParam2 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp0 ); + int nARLComp1 = ARL_DEST_NONE; + CUtlString sParam3 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp1 ); + + // This optionally inserts a move from our dummy address register to the .x component of the real one + InsertMoveFromAddressRegister( m_pBufALUCode, nARLComp0, nARLComp1 ); + + // Since DP3 and DP4 have a scalar as the dest and vectors as the src, don't screw with the swizzle specifications. + if ( nInstruction == D3DSIO_DP3 ) + { + sParam2 = EnsureNumSwizzleComponents( sParam2, 3 ); + sParam3 = EnsureNumSwizzleComponents( sParam3, 3 ); + } + else if ( nInstruction == D3DSIO_DP4 ) + { + sParam2 = EnsureNumSwizzleComponents( sParam2, 4 ); + sParam3 = EnsureNumSwizzleComponents( sParam3, 4 ); + } + else if ( nInstruction == D3DSIO_DST ) + { + m_bUsesDSTInstruction = true; + sParam2 = EnsureNumSwizzleComponents( sParam2, 4 ); + sParam3 = EnsureNumSwizzleComponents( sParam3, 4 ); + } + else + { + sParam2 = FixGLSLSwizzle( sParam1, sParam2 ); + sParam3 = FixGLSLSwizzle( sParam1, sParam3 ); + } + + char buff[256]; + if ( nInstruction == D3DSIO_ADD || nInstruction == D3DSIO_SUB || nInstruction == D3DSIO_MUL ) + { + // These all look like x = y op z + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s %s %s;\n", sParam1.String(), sParam2.String(), GetGLSLOperatorString( nInstruction ), sParam3.String() ); + } + else + { + int nDestComponents = GetNumSwizzleComponents( sParam1.String() ); + int nSrcComponents = GetNumSwizzleComponents( sParam2.String() ); + + // All remaining instructions can use GLSL intrinsics like dot() and cross(). + bool bDoubleClose = OpenIntrinsic( nInstruction, buff, sizeof( buff ), nDestComponents, nSrcComponents ); + + if ( ( nSrcComponents == 1 ) && ( nInstruction == D3DSIO_SGE ) ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s%s >= %s );\n", sParam1.String(), buff, sParam2.String(), sParam3.String() ); + } + else if ( ( nSrcComponents == 1 ) && ( nInstruction == D3DSIO_SLT ) ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s%s < %s );\n", sParam1.String(), buff, sParam2.String(), sParam3.String() ); + } + else + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s%s, %s %s;\n", sParam1.String(), buff, sParam2.String(), sParam3.String(), bDoubleClose ? ") )" : ")" ); + } + } + + // If the _SAT instruction modifier is used, then do a saturate here. + if ( nDestToken & D3DSPDM_SATURATE ) + { + int nComponents = GetNumSwizzleComponents( sParam1.String() ); + if ( nComponents == 0 ) + nComponents = 4; + + PrintToBufWithIndents( *m_pBufALUCode, "%s = clamp( %s, %s, %s );\n", sParam1.String(), sParam1.String(), g_szVecZeros[nComponents], g_szVecOnes[nComponents] ); + } +} + +void D3DToGL::HandleBinaryOp_ASM( uint32 nInstruction ) +{ + CUtlString sParam1 = GetParameterString( GetNextToken(), DST_REGISTER, false, NULL ); + int nARLComp0 = ARL_DEST_NONE; + CUtlString sParam2 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp0 ); + int nARLComp1 = ARL_DEST_NONE; + CUtlString sParam3 = GetParameterString( GetNextToken(), SRC_REGISTER, false, &nARLComp1 ); + + // This optionally inserts a move from our dummy address register to the .x component of the real one + InsertMoveFromAddressRegister( m_pBufALUCode, nARLComp0, nARLComp1 ); + + char buff[256]; + PrintOpcode( nInstruction, buff, sizeof( buff ) ); + PrintToBufWithIndents( *m_pBufALUCode, "%s%s, %s, %s;\n", buff, sParam1.String(), sParam2.String(), sParam3.String() ); +} + +void D3DToGL::WriteGLSLCmp( const char *pDestReg, const char *pSrc0Reg, const char *pSrc1Reg, const char *pSrc2Reg ) +{ + int nWriteMaskEntries = GetNumWriteMaskEntries( pDestReg ); + for ( int i=0; i < nWriteMaskEntries; i++ ) + { + char params[4][256]; + WriteParamWithSingleMaskEntry( pDestReg, i, params[0], sizeof( params[0] ) ); + WriteParamWithSingleMaskEntry( pSrc0Reg, i, params[1], sizeof( params[1] ) ); + WriteParamWithSingleMaskEntry( pSrc1Reg, i, params[2], sizeof( params[2] ) ); + WriteParamWithSingleMaskEntry( pSrc2Reg, i, params[3], sizeof( params[3] ) ); + + PrintToBufWithIndents( *m_pBufALUCode, "%s = ( %s >= 0.0 ) ? %s : %s;\n", params[0], params[1], params[2], params[3] ); + } +} + +void D3DToGL::Handle_CMP() +{ + // In Direct3D, result = (src0 >= 0.0) ? src1 : src2 + // In OpenGL, result = (src0 < 0.0) ? src1 : src2 + // + // As a result, arguments are effectively in a different order than Direct3D! !#$&*!%#$& + char pDestReg[64], pSrc0Reg[64], pSrc1Reg[64], pSrc2Reg[64]; + uint32 nDestToken = GetNextToken(); + PrintParameterToString( nDestToken, DST_REGISTER, pDestReg, sizeof( pDestReg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc0Reg, sizeof( pSrc0Reg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc1Reg, sizeof( pSrc1Reg ), false, NULL ); + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc2Reg, sizeof( pSrc2Reg ), false, NULL ); + + // These are a tricky case.. we have to expand it out into multiple statements. + char szDestBase[256]; + GetParamNameWithoutSwizzle( pDestReg, szDestBase, sizeof( szDestBase ) ); + + V_strncpy( pSrc0Reg, FixGLSLSwizzle( pDestReg, pSrc0Reg ), sizeof( pSrc0Reg ) ); + V_strncpy( pSrc1Reg, FixGLSLSwizzle( pDestReg, pSrc1Reg ), sizeof( pSrc1Reg ) ); + V_strncpy( pSrc2Reg, FixGLSLSwizzle( pDestReg, pSrc2Reg ), sizeof( pSrc2Reg ) ); + + // This isn't reliable! + //if ( DoParamNamesMatch( pDestReg, pSrc0Reg ) && GetNumSwizzleComponents( pDestReg ) > 1 ) + if ( 1 ) + { + // So the dest register is the same as the comparand. We're in danger of screwing up our results. + // + // For example, this code: + // CMP r0.xy, r0.xx, r1, r2 + // would generate this: + // r0.x = (r0.x >= 0) ? r1.x : r2.x; + // r0.y = (r0.x >= 0) ? r1.x : r2.x; + // + // But the first lines changes r0.x and thus screws the atomicity of the CMP instruction for the second line. + // So we assign r0 to a temporary first and then write to the temporary. + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s;\n", g_pAtomicTempVarName, szDestBase ); + + char szTempVar[256]; + ReplaceParamName( pDestReg, g_pAtomicTempVarName, szTempVar, sizeof( szTempVar ) ); + WriteGLSLCmp( szTempVar, pSrc0Reg, pSrc1Reg, pSrc2Reg ); + + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s;\n", szDestBase, g_pAtomicTempVarName ); + m_bUsedAtomicTempVar = true; + } + else + { + // Just write out the simple expanded version of the CMP. No need to use atomic_temp_var. + WriteGLSLCmp( pDestReg, pSrc0Reg, pSrc1Reg, pSrc2Reg ); + } + + // If the _SAT instruction modifier is used, then do a saturate here. + if ( nDestToken & D3DSPDM_SATURATE ) + { + int nComponents = GetNumSwizzleComponents( pDestReg ); + if ( nComponents == 0 ) + nComponents = 4; + + PrintToBufWithIndents( *m_pBufALUCode, "%s = clamp( %s, %s, %s );\n", pDestReg, pDestReg, g_szVecZeros[nComponents], g_szVecOnes[nComponents] ); + } +} + +void D3DToGL::Handle_NRM() +{ + char pDestReg[64]; + char pSrc0Reg[64]; + PrintParameterToString( GetNextToken(), DST_REGISTER, pDestReg, sizeof( pDestReg ), false, NULL ); + int nARLSrcComp = ARL_DEST_NONE; + PrintParameterToString( GetNextToken(), SRC_REGISTER, pSrc0Reg, sizeof( pSrc0Reg ), false, &nARLSrcComp ); + + if ( nARLSrcComp != -1 ) + { + InsertMoveFromAddressRegister( m_pBufALUCode, nARLSrcComp, -1, -1 ); + } + + CUtlString sSrc = EnsureNumSwizzleComponents( pSrc0Reg, 3 ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = normalize( %s );\n", pDestReg, sSrc.String() ); +} + +void D3DToGL::Handle_UnaryOp( uint32 nInstruction ) +{ + uint32 nDestToken = GetNextToken(); + CUtlString sParam1 = GetParameterString( nDestToken, DST_REGISTER, false, NULL ); + CUtlString sParam2 = GetParameterString( GetNextToken(), SRC_REGISTER, false, NULL ); + sParam2 = FixGLSLSwizzle( sParam1, sParam2 ); + + + if ( nInstruction == D3DSIO_MOV ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s;\n", sParam1.String(), sParam2.String() ); + } + else if ( nInstruction == D3DSIO_RSQ ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = inversesqrt( %s );\n", sParam1.String(), sParam2.String() ); + } + else if ( nInstruction == D3DSIO_RCP ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = 1.0 / %s;\n", sParam1.String(), sParam2.String() ); + } + else if ( nInstruction == D3DSIO_EXP ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = exp2( %s );\n", sParam1.String(), sParam2.String() ); + } + else if ( nInstruction == D3DSIO_FRC ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = fract( %s );\n", sParam1.String(), sParam2.String() ); + } + else if ( nInstruction == D3DSIO_LOG ) // d3d 'log' is log base 2 + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = log2( %s );\n", sParam1.String(), sParam2.String() ); + } + else if ( nInstruction == D3DSIO_ABS ) // rbarris did this one, Jason please check + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = abs( %s );\n", sParam1.String(), sParam2.String() ); + } + else if ( nInstruction == D3DSIO_MOVA ) + { + m_bDeclareAddressReg = true; + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s;\n", sParam1.String(), sParam2.String() ); + + if ( !m_bGenerateBoneUniformBuffer ) + { + m_nHighestRegister = DXABSTRACT_VS_PARAM_SLOTS - 1; + } + } + else + { + Error( "Unsupported instruction" ); + } + + // If the _SAT instruction modifier is used, then do a saturate here. + if ( nDestToken & D3DSPDM_SATURATE ) + { + int nComponents = GetNumSwizzleComponents( sParam1.String() ); + if ( nComponents == 0 ) + { + nComponents = 4; + } + + PrintToBufWithIndents( *m_pBufALUCode, "%s = clamp( %s, %s, %s );\n", sParam1.String(), sParam1.String(), g_szVecZeros[nComponents], g_szVecOnes[nComponents] ); + } +} + +void D3DToGL::WriteGLSLSamplerDefinitions() +{ + int nSamplersWritten = 0; + for ( int i=0; i < ARRAYSIZE( m_dwSamplerTypes ); i++ ) + { + if ( m_dwSamplerTypes[i] == SAMPLER_TYPE_2D ) + { + if ( ( ( 1 << i ) & m_nShadowDepthSamplerMask ) != 0 ) + { + PrintToBuf( *m_pBufHeaderCode, "uniform sampler2DShadow sampler%d;\n", i ); + } + else + { + PrintToBuf( *m_pBufHeaderCode, "uniform sampler2D sampler%d;\n", i ); + } + ++nSamplersWritten; + } + else if ( m_dwSamplerTypes[i] == SAMPLER_TYPE_3D ) + { + PrintToBuf( *m_pBufHeaderCode, "uniform sampler3D sampler%d;\n", i ); + ++nSamplersWritten; + } + else if ( m_dwSamplerTypes[i] == SAMPLER_TYPE_CUBE ) + { + PrintToBuf( *m_pBufHeaderCode, "uniform samplerCube sampler%d;\n", i ); + ++nSamplersWritten; + } + else if ( m_dwSamplerTypes[i] != SAMPLER_TYPE_UNUSED ) + { + Error( "Unknown sampler type." ); + } + } + + if ( nSamplersWritten > 0 ) + PrintToBuf( *m_pBufHeaderCode, "\n\n" ); +} + +void D3DToGL::WriteGLSLOutputVariableAssignments() +{ + if ( m_bVertexShader ) + { + // Map output "oN" registers back to GLSL output variables. + if ( m_bAddHexCodeComments ) + { + PrintToBuf( *m_pBufAttribCode, "\n// Now we're storing the oN variables from the output dcl_ statements back into their GLSL equivalents.\n" ); + } + + for ( int i=0; i < ARRAYSIZE( m_DeclaredOutputs ); i++ ) + { + if ( m_DeclaredOutputs[i] == UNDECLARED_OUTPUT ) + continue; + + if ( ( m_dwTexCoordOutMask & ( 1 << i ) ) == 0 ) + continue; + + uint32 dwToken = m_DeclaredOutputs[i]; + + uint32 dwUsage = ( dwToken & D3DSP_DCL_USAGE_MASK ); + uint32 dwUsageIndex = ( dwToken & D3DSP_DCL_USAGEINDEX_MASK ) >> D3DSP_DCL_USAGEINDEX_SHIFT; + + if ( ( dwUsage == D3DDECLUSAGE_FOG ) || ( dwUsage == D3DDECLUSAGE_PSIZE ) ) + { + TranslationError(); // Not supported yet, but can be if we need it. + } + + if ( dwUsage == D3DDECLUSAGE_COLOR ) + { + PrintToBufWithIndents( *m_pBufALUCode, "%s = oTempT%d;\n", dwUsageIndex ? "gl_FrontSecondaryColor" : "gl_FrontColor", i ); + } + else if ( dwUsage == D3DDECLUSAGE_TEXCOORD ) + { + char buf[256]; + if ( m_nCentroidMask & ( 0x00000001 << dwUsageIndex ) ) + { + V_snprintf( buf, sizeof( buf ), "centroid varying vec4 oT%d;\n", dwUsageIndex ); // centroid varying + } + else + { + V_snprintf( buf, sizeof( buf ), "varying vec4 oT%d;\n", dwUsageIndex ); + } + StrcatToHeaderCode( buf ); + + PrintToBufWithIndents( *m_pBufALUCode, "oT%d = oTempT%d;\n", dwUsageIndex, i ); + } + } + } +} + +void D3DToGL::WriteGLSLInputVariableAssignments() +{ + if ( m_bVertexShader ) + return; + + for ( int i=0; i < ARRAYSIZE( m_DeclaredInputs ); i++ ) + { + if ( m_DeclaredInputs[i] == UNDECLARED_INPUT ) + continue; + + uint32 dwToken = m_DeclaredInputs[i]; + + uint32 dwUsage = ( dwToken & D3DSP_DCL_USAGE_MASK ); + uint32 dwUsageIndex = ( dwToken & D3DSP_DCL_USAGEINDEX_MASK ) >> D3DSP_DCL_USAGEINDEX_SHIFT; + + if ( dwUsage == D3DDECLUSAGE_COLOR ) + { + PrintToBufWithIndents( *m_pBufAttribCode, "vec4 oTempT%d = %s;\n", i, dwUsageIndex ? "gl_SecondaryColor" : "gl_Color" ); + } + else if ( dwUsage == D3DDECLUSAGE_TEXCOORD ) + { + PrintToBufWithIndents( *m_pBufAttribCode, "vec4 oTempT%d = oT%d;\n", i, dwUsageIndex ); + } + } +} + +void D3DToGL::Handle_DeclarativeNonDclOp( uint32 nInstruction ) +{ + char buff[128]; + uint32 dwToken = GetNextToken(); + PrintParameterToString( dwToken, DST_REGISTER, buff, sizeof( buff ), false, NULL ); + + if ( nInstruction == D3DSIO_TEXKILL ) + { + // TEXKILL is supposed to discard the pixel if any of the src register's X, Y, or Z components are less than zero. + // We have to translate it to something like: + // if ( r0.x < 0.0 || r0.y < 0.0 ) + // discard; + char c[3]; + c[0] = GetSwizzleComponent( buff, 0 ); + c[1] = GetSwizzleComponent( buff, 1 ); + c[2] = GetSwizzleComponent( buff, 2 ); + + // Get the unique components. + char cUnique[3]; + cUnique[0] = c[0]; + + int nUnique = 1; + if ( c[1] != c[0] ) + cUnique[nUnique++] = c[1]; + + if ( c[2] != c[1] && c[2] != c[0] ) + cUnique[nUnique++] = c[2]; + + // Get the src register base name. + char szBase[256]; + GetParamNameWithoutSwizzle( buff, szBase, sizeof( szBase ) ); + + PrintToBufWithIndents( *m_pBufALUCode, "if ( %s.%c < 0.0 ", szBase, cUnique[0] ); + for ( int i=1; i < nUnique; i++ ) + { + PrintToBuf( *m_pBufALUCode, "|| %s.%c < 0.0 ", szBase, cUnique[i] ); + } + PrintToBuf( *m_pBufALUCode, ")\n{\n\tdiscard;\n}\n" ); + } + else + { + char szOpcode[128]; + PrintOpcode( nInstruction, szOpcode, sizeof( szOpcode ) ); + StrcatToALUCode( szOpcode ); + + StrcatToALUCode( buff ); + StrcatToALUCode( ";\n" ); + } +} + + +void D3DToGL::NoteTangentInputUsed() +{ + if ( !m_bTangentInputUsed ) + { + m_bTangentInputUsed = true; +// PrintToBuf( *m_pBufParamCode, "attribute vec4 %s;\n", g_pTangentAttributeName ); + } +} + + +// These are the only ARL instructions that should appear in the instruction stream +void D3DToGL::InsertMoveInstruction( CUtlBuffer *pCode, int nARLComponent ) +{ + PrintIndentation( ( char * )pCode->Base(), pCode->Size() ); + + switch ( nARLComponent ) + { + case ARL_DEST_X: + strcat_s( ( char * )pCode->Base(), pCode->Size(), "a0 = int( va_r.x );\n" ); + break; + case ARL_DEST_Y: + strcat_s( ( char * )pCode->Base(), pCode->Size(), "a0 = int( va_r.y );\n" ); + break; + case ARL_DEST_Z: + strcat_s( ( char * )pCode->Base(), pCode->Size(), "a0 = int( va_r.z );\n" ); + break; + case ARL_DEST_W: + strcat_s( ( char * )pCode->Base(), pCode->Size(), "a0 = int( va_r.w );\n" ); + break; + } +} + +// This optionally inserts a move from our dummy address register to the .x component of the real one +void D3DToGL::InsertMoveFromAddressRegister( CUtlBuffer *pCode, int nARLComp0, int nARLComp1, int nARLComp2 /* = ARL_DEST_NONE */ ) +{ + // We no longer need to do this in GLSL - we put the cast to int from the dummy address register va_r.x, va_r.y, etc. directly into the instruction + return; +} + + +//------------------------------------------------------------------------------ +// TranslateShader() +// +// This is the main function that the outside world sees. A pointer to the +// uint32 stream returned from the D3DX compile routine is parsed and used +// to write human-readable asm code into the character array pointed to by +// pDisassembledCode. An error code is returned. +//------------------------------------------------------------------------------ + + +int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bool *bVertexShader, uint32 options, int32 nShadowDepthSamplerMask, uint32 nCentroidMask, char *debugLabel ) +{ + CUtlString sLine, sParamName; + uint32 i, dwToken, nInstruction, nNumTokensToSkip; + char buff[256]; + + // obey options + m_bUseEnvParams = (options & D3DToGL_OptionUseEnvParams) != 0; + m_bDoFixupZ = (options & D3DToGL_OptionDoFixupZ) != 0; + m_bDoFixupY = (options & D3DToGL_OptionDoFixupY) != 0; + m_bDoUserClipPlanes = (options & D3DToGL_OptionDoUserClipPlanes) != 0; + + m_bAddHexCodeComments = (options & D3DToGL_AddHexComments) != 0; + m_bPutHexCodesAfterLines = (options & D3DToGL_PutHexCommentsAfterLines) != 0; + m_bGeneratingDebugText = (options & D3DToGL_GeneratingDebugText) != 0; + m_bGenerateSRGBWriteSuffix = (options & D3DToGL_OptionSRGBWriteSuffix) != 0; + + m_NumIndentTabs = 1; // start code indented one tab + m_nLoopDepth = 0; + + // debugging + m_bSpew = (options & D3DToGL_OptionSpew) != 0; + + // These are not accessed below in a way that will cause them to glow, so + // we could overflow these and/or the buffer pointed to by pDisassembledCode + m_pBufAttribCode = new CUtlBuffer( 100, 10000, CUtlBuffer::TEXT_BUFFER ); + m_pBufParamCode = new CUtlBuffer( 100, 10000, CUtlBuffer::TEXT_BUFFER ); + m_pBufALUCode = new CUtlBuffer( 100, 60000, CUtlBuffer::TEXT_BUFFER ); + + // Pointers to text buffers for assembling sections of the program + m_pBufHeaderCode = pBufDisassembledCode; + char *pAttribMapStart = NULL; + ((char*)m_pBufHeaderCode->Base())[0] = 0; + ((char*)m_pBufAttribCode->Base())[0] = 0; + ((char*)m_pBufParamCode->Base())[0] = 0; + ((char*)m_pBufALUCode->Base())[0] = 0; + + + for ( i=0; iBase(), m_pBufHeaderCode->Size(), "#version %s\n%s", glslVersionText, glslExtText ); + m_bVertexShader = false; + } + else // vertex shader + { + m_bGenerateSRGBWriteSuffix = false; + + V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version %s\n%s//ATTRIBMAP-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx\n", glslVersionText, glslExtText ); + + // find that first '-xx' which is where the attrib map will be written later. + pAttribMapStart = strstr( (char *)m_pBufHeaderCode->Base(), "-xx" ) + 1; + + m_bVertexShader = true; + } + + *bVertexShader = m_bVertexShader; + + m_bGenerateBoneUniformBuffer = m_bVertexShader && ((options & D3DToGL_OptionGenerateBoneUniformBuffer) != 0); + + if ( m_bAddHexCodeComments ) + { + RecordInputAndOutputPositions(); + } + + if ( m_bSpew ) + { + printf("\n************* translating shader " ); + } + + int opcounter = 0; + + // Loop until we hit the end dwToken...note that D3DPS_END() == D3DVS_END() so this works for either + while ( dwToken != D3DPS_END() ) + { + if ( m_bAddHexCodeComments ) + { + AddTokenHexCode(); + RecordInputAndOutputPositions(); + } + +#ifdef POSIX + int tokenIndex = m_pdwNextToken - code; +#endif + int aluCodeLength0 = V_strlen( (char *) m_pBufALUCode->Base() ); + + dwToken = GetNextToken(); // Get next dwToken in the stream + nInstruction = Opcode( dwToken ); // Mask out the instruction opcode + + if ( m_bSpew ) + { +#ifdef POSIX + printf("\n** token# %04x inst# %04d opcode %s (%08x)", tokenIndex, opcounter, GLMDecode(eD3D_SIO, nInstruction), dwToken ); +#endif + opcounter++; + } + + switch ( nInstruction ) + { + // -- No arguments at all ----------------------------------------------- + case D3DSIO_NOP: + // D3D compiler outputs NOPs when shader debugging/optimizations are disabled. + break; + + case D3DSIO_PHASE: + case D3DSIO_RET: + case D3DSIO_ENDLOOP: + case D3DSIO_BREAK: + TranslationError(); + PrintOpcode( nInstruction, buff, sizeof( buff ) ); + StrcatToALUCode( buff ); + StrcatToALUCode( ";\n" ); + break; + + // -- "Declarative" non dcl ops ---------------------------------------- + case D3DSIO_TEXDEPTH: + case D3DSIO_TEXKILL: + Handle_DeclarativeNonDclOp( nInstruction ); + break; + + // -- Unary ops ------------------------------------------------- + case D3DSIO_BEM: + case D3DSIO_TEXBEM: + case D3DSIO_TEXBEML: + case D3DSIO_TEXDP3: + case D3DSIO_TEXDP3TEX: + case D3DSIO_TEXM3x2DEPTH: + case D3DSIO_TEXM3x2TEX: + case D3DSIO_TEXM3x3: + case D3DSIO_TEXM3x3PAD: + case D3DSIO_TEXM3x3TEX: + case D3DSIO_TEXM3x3VSPEC: + case D3DSIO_TEXREG2AR: + case D3DSIO_TEXREG2GB: + case D3DSIO_TEXREG2RGB: + case D3DSIO_LABEL: + case D3DSIO_CALL: + case D3DSIO_LOOP: + case D3DSIO_BREAKP: + case D3DSIO_DSX: + case D3DSIO_DSY: + TranslationError(); + break; + + case D3DSIO_IFC: + { + static const char *s_szCompareStrings[ 7 ] = + { + "__INVALID__", + ">", + "==", + ">=", + "<", + "!=", + "<=" + }; + + // Compare mode is encoded in instruction token + uint32 dwCompareMode = OpcodeSpecificData( dwToken ); + + Assert( ( dwCompareMode >= 1 ) && ( dwCompareMode <= 6 ) ); + + // Get left side of compare + dwToken = GetNextToken(); + char szLeftSide[32]; + PrintParameterToString( dwToken, SRC_REGISTER, szLeftSide, sizeof( szLeftSide ), false, NULL ); + + // Get right side of compare + dwToken = GetNextToken(); + char szRightSide[32]; + PrintParameterToString( dwToken, SRC_REGISTER, szRightSide, sizeof( szRightSide ), false, NULL ); + + PrintToBufWithIndents( *m_pBufALUCode, "if ( %s %s %s )\n", szLeftSide, s_szCompareStrings[dwCompareMode], szRightSide ); + StrcatToALUCode( "{\n" ); + m_NumIndentTabs++; + + break; + } + case D3DSIO_IF: + dwToken = GetNextToken(); + PrintParameterToString( dwToken, SRC_REGISTER, buff, sizeof( buff ), false, NULL ); + + PrintToBufWithIndents( *m_pBufALUCode, "if ( %s )\n", buff ); + StrcatToALUCode( "{\n" ); + m_NumIndentTabs++; + + break; + + case D3DSIO_ELSE: + m_NumIndentTabs--; + StrcatToALUCode( "}\n" ); + StrcatToALUCode( "else\n" ); + StrcatToALUCode( "{\n" ); + m_NumIndentTabs++; + + break; + + case D3DSIO_ENDIF: + m_NumIndentTabs--; + StrcatToALUCode( "}\n" ); + + break; + + case D3DSIO_REP: + dwToken = GetNextToken(); + PrintParameterToString( dwToken, SRC_REGISTER, buff, sizeof( buff ), false, NULL ); + + // In practice, this is the only form of for loop that will appear in DX asm + PrintToBufWithIndents( *m_pBufALUCode, "for( int i=0; i < %s; i++ )\n", buff ); + StrcatToALUCode( "{\n" ); + + m_nLoopDepth++; + + // For now, we don't deal with loop nesting + // Easy enough to fix later with an array of loop names i, j, k etc + Assert( m_nLoopDepth <= 1 ); + + m_NumIndentTabs++; + + break; + + case D3DSIO_ENDREP: + m_nLoopDepth--; + m_NumIndentTabs--; + StrcatToALUCode( "}\n" ); + + break; + + case D3DSIO_NRM: + Handle_NRM(); + break; + + case D3DSIO_MOVA: + + Handle_UnaryOp( nInstruction ); + + break; + + // Unary operations + case D3DSIO_MOV: + case D3DSIO_RCP: + case D3DSIO_RSQ: + case D3DSIO_EXP: + case D3DSIO_EXPP: + case D3DSIO_LOG: + case D3DSIO_LOGP: + case D3DSIO_FRC: + case D3DSIO_LIT: + case D3DSIO_ABS: + Handle_UnaryOp( nInstruction ); + break; + + // -- Binary ops ------------------------------------------------- + case D3DSIO_TEXM3x3SPEC: + case D3DSIO_M4x4: + case D3DSIO_M4x3: + case D3DSIO_M3x4: + case D3DSIO_M3x3: + case D3DSIO_M3x2: + case D3DSIO_CALLNZ: + case D3DSIO_SETP: + TranslationError(); + break; + + case D3DSIO_BREAKC: + Handle_BREAKC( dwToken ); + break; + + // Binary Operations + case D3DSIO_ADD: + case D3DSIO_SUB: + case D3DSIO_MUL: + case D3DSIO_DP3: + case D3DSIO_DP4: + case D3DSIO_MIN: + case D3DSIO_MAX: + case D3DSIO_DST: + case D3DSIO_SLT: + case D3DSIO_SGE: + case D3DSIO_CRS: + case D3DSIO_POW: + HandleBinaryOp_GLSL( nInstruction ); + + break; + + // -- Ternary ops ------------------------------------------------- + case D3DSIO_DP2ADD: + Handle_DP2ADD(); + break; + case D3DSIO_LRP: + Handle_LRP( nInstruction ); + break; + case D3DSIO_SGN: + Assert( m_bVertexShader ); + TranslationError(); // TODO emulate with SLT etc + break; + case D3DSIO_CND: + TranslationError(); + break; + case D3DSIO_CMP: + Handle_CMP(); + break; + case D3DSIO_SINCOS: + Handle_SINCOS(); + break; + case D3DSIO_MAD: + Handle_MAD( nInstruction ); + break; + + // -- Quaternary op ------------------------------------------------ + case D3DSIO_TEXLDD: + Handle_TexLDD( nInstruction ); + break; + + // -- Special cases: texcoord vs texcrd and tex vs texld ----------- + case D3DSIO_TEXCOORD: + Handle_TexCoord(); + break; + + case D3DSIO_TEX: + Handle_TEX( dwToken, false ); + break; + + case D3DSIO_TEXLDL: + Handle_TEX( nInstruction, true ); + break; + + case D3DSIO_DCL: + Handle_DCL(); + break; + + case D3DSIO_DEFB: + case D3DSIO_DEFI: + Handle_DEFIB( nInstruction ); + break; + + case D3DSIO_DEF: + Handle_DEF(); + break; + + case D3DSIO_COMMENT: + // Using OpcodeSpecificData() can fail here since the comments can be longer than 0xff dwords + nNumTokensToSkip = ( dwToken & 0x0fff0000 ) >> 16; + SkipTokens( nNumTokensToSkip ); + break; + + case D3DSIO_END: + break; + } + + if ( m_bSpew ) + { + int aluCodeLength1 = V_strlen( (char *) m_pBufALUCode->Base() ); + if ( aluCodeLength1 != aluCodeLength0 ) + { + // code was emitted + printf( "\n > %s", ((char *)m_pBufALUCode->Base()) + aluCodeLength0 ); + + aluCodeLength0 = aluCodeLength1; + } + } + } + + // Note that this constant packing expects .wzyx swizzles in case we ever use the SINCOS code in a ps_2_x shader + // + // The Microsoft documentation on this is all kinds of broken and, strangely, these numbers don't even + // match the D3DSINCOSCONST1 and D3DSINCOSCONST2 constants used by the D3D assembly sincos instruction... + if ( m_bNeedsSinCosDeclarations ) + { + PrintIndentation( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size() ); + StrcatToParamCode( "vec4 scA = vec4( -1.55009923e-6, -2.17013894e-5, 0.00260416674, 0.00026041668 );\n" ); + PrintIndentation( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size() ); + StrcatToParamCode( "vec4 scB = vec4( -0.020833334, -0.125, 1.0, 0.5 );\n" ); + } + + // Stick in the sampler mask in hex + PrintToBuf( *m_pBufHeaderCode, "%sSAMPLERMASK-%x\n", "//", m_dwSamplerUsageMask ); + + uint nSamplerTypes = 0; + for ( int i = 0; i < 16; i++ ) + { + Assert( m_dwSamplerTypes[i] < 4); + nSamplerTypes |= ( m_dwSamplerTypes[i] << ( i * 2 ) ); + } + + PrintToBuf( *m_pBufHeaderCode, "%sSAMPLERTYPES-%x\n", "//", nSamplerTypes ); + + // fragData outputs referenced + uint nFragDataMask = 0; + for ( int i = 0; i < 4; i++ ) + { + nFragDataMask |= m_bOutputColorRegister[ i ] ? ( 1 << i ) : 0; + } + + PrintToBuf( *m_pBufHeaderCode, "%sFRAGDATAMASK-%x\n", "//", nFragDataMask ); + + // Uniforms + + PrintToBuf( *m_pBufHeaderCode, "//HIGHWATER-%d\n", m_nHighestRegister + 1 ); + if ( ( m_bVertexShader ) && ( m_bGenerateBoneUniformBuffer ) ) + { + PrintToBuf( *m_pBufHeaderCode, "//HIGHWATERBONE-%i\n", m_nHighestBoneRegister + 1 ); + } + + PrintToBuf( *m_pBufHeaderCode, "\nuniform vec4 %s[%d];\n", m_bVertexShader ? "vc" : "pc", m_nHighestRegister + 1 ); + + if ( ( m_nHighestBoneRegister >= 0 ) && ( m_bVertexShader ) && ( m_bGenerateBoneUniformBuffer ) ) + { + PrintToBuf( *m_pBufHeaderCode, "\nuniform vec4 %s[%d];\n", "vcbones", m_nHighestBoneRegister + 1 ); + } + + if ( m_bVertexShader ) + { + PrintToBuf( *m_pBufHeaderCode, "\nuniform vec4 vcscreen;\n" ); + } + + for( int i=0; i<32; i++ ) + { + if ( ( m_dwConstIntUsageMask & ( 0x00000001 << i ) ) && + ( !( m_dwDefConstIntUsageMask & ( 0x00000001 << i ) ) ) + ) + { + PrintToBuf( *m_pBufHeaderCode, "uniform int i%d ;\n", i ); + } + } + + for( int i=0; i<32; i++ ) + { + if ( m_dwDefConstIntUsageMask & ( 0x00000001 << i ) ) + { + PrintToBuf( *m_pBufHeaderCode, "const int i%d = %i;\n", i, m_dwDefConstIntIterCount[i] ); + } + } + + for( int i=0; i<32; i++ ) + { + if ( m_dwConstBoolUsageMask & ( 0x00000001 << i ) ) + { + PrintToBuf( *m_pBufHeaderCode, m_bVertexShader ? "uniform bool b%d;\n" : "uniform bool fb%d;\n", i ); + } + } + + // Control bit for sRGB Write suffix + if ( m_bGenerateSRGBWriteSuffix ) + { + // R500 Hookup + // Set this guy to 1 when the sRGBWrite state is true, otherwise 0 + StrcatToHeaderCode( "uniform float flSRGBWrite;\n" ); + } + + PrintToBuf( *m_pBufHeaderCode, "\n" ); + + // Write samplers + WriteGLSLSamplerDefinitions(); + + if ( m_bUsesDSTInstruction ) + { + PrintToBuf( *m_pBufHeaderCode, "vec4 dst(vec4 src0,vec4 src1) { return vec4(1.0f,src0.y*src1.y,src0.z,src1.w); }\n" ); + } + + if ( m_bDeclareAddressReg ) + { + if ( !m_bGenerateBoneUniformBuffer ) + { + m_nHighestRegister = DXABSTRACT_VS_PARAM_SLOTS - 1; + } + + PrintIndentation( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size() ); + StrcatToParamCode( "vec4 va_r;\n" ); + } + + char *pTempVarStr = "TEMP"; + pTempVarStr = "vec4"; + + // Declare temps in Param code buffer + for( int i=0; i<32; i++ ) + { + if ( m_dwTempUsageMask & ( 0x00000001 << i ) ) + { + PrintIndentation( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size() ); + PrintToBuf( *m_pBufParamCode, "%s r%d;\n", pTempVarStr, i ); + } + } + + if ( m_bVertexShader && (m_bDoUserClipPlanes || m_bDoFixupZ || m_bDoFixupY ) ) + { + PrintIndentation( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size() ); + StrcatToParamCode( "vec4 vTempPos;\n" ); + } + + if ( ( m_bVertexShader ) && ( m_dwMajorVersion == 3 ) ) + { + for ( int i = 0; i < 32; i++ ) + { + if ( m_dwTexCoordOutMask & ( 1 << i ) ) + { + PrintIndentation( (char*)m_pBufParamCode->Base(), m_pBufParamCode->Size() ); + + char buf[256]; + V_snprintf( buf, sizeof( buf ), "vec4 oTempT%i = vec4( 0, 0, 0, 0 );\n", i ); + StrcatToParamCode( buf ); + } + } + } + + if ( m_bNeedsSinCosDeclarations ) + { + StrcatToParamCode( "vec3 vSinCosTmp;\n" ); // declare temp used by GLSL sin and cos intrinsics + } + + // Optional temps needed to emulate d2add instruction in DX pixel shaders + if ( m_bNeedsD2AddTemp ) + { + PrintToBuf( *m_pBufParamCode, "%s DP2A0;\n%s DP2A1;\n", pTempVarStr, pTempVarStr ); + } + + // Optional temp needed to emulate lerp instruction in DX vertex shaders + if ( m_bNeedsLerpTemp ) + { + PrintToBuf( *m_pBufParamCode, "%s LRP_TEMP;\n", pTempVarStr ); + } + + // Optional temp needed to emulate NRM instruction in DX shaders + if ( m_bNeedsNRMTemp ) + { + PrintToBuf( *m_pBufParamCode, "%s NRM_TEMP;\n", pTempVarStr ); + } + + if ( m_bDeclareVSOPos && m_bVertexShader ) + { + if ( m_bDoUserClipPlanes ) + { + StrcatToALUCode( "gl_ClipVertex = vTempPos;\n" ); // if user clip is enabled, jam clip space position into gl_ClipVertex + } + + if ( m_bDoFixupZ || m_bDoFixupY ) + { + // TODO: insert clip distance computation something like this: + // + // StrcatToALUCode( "DP4 oCLP[0].x, oPos, vc[215]; \n" ); + // + + if ( m_bDoFixupZ ) + { + StrcatToALUCode( "vTempPos.z = vTempPos.z * vc[0].z - vTempPos.w; // z' = (2*z)-w\n" ); + } + + if ( m_bDoFixupY ) + { + // append instructions to flip Y over + // new Y = -(old Y) + StrcatToALUCode( "vTempPos.y = -vTempPos.y; // y' = -y \n" ); + } + + // Apply half pixel offset (0.5f pixel offset D3D) to output vertices to account for the pixel center difference between D3D9 and OpenGL. + // This is the actual work in the shader. This works out to be 0.5 pixels wide because clip space is 2 units wide (-1, 1). + StrcatToALUCode( "vTempPos.xy += vcscreen.xy * vTempPos.w;\n" ); + + StrcatToALUCode( "gl_Position = vTempPos;\n" ); + } + else + { + StrcatToParamCode( "OUTPUT oPos = result.position;\n" ); + + // TODO: insert clip distance computation something like this: + // + // StrcatToALUCode( "DP4 oCLP[0].x, oPos, c[215]; \n" ); + // + } + } + + if ( m_bVertexShader ) + { + if ( m_dwMajorVersion == 3 ) + { + WriteGLSLOutputVariableAssignments(); + } + else + { + for ( int i=0; i<32; i++ ) + { + char outTexCoordBuff[64]; + + // Don't declare a varying for the output that is mapped to the position output + if ( i != m_nVSPositionOutput ) + { + if ( m_dwTexCoordOutMask & ( 0x00000001 << i ) ) + { + if ( m_nCentroidMask & ( 0x00000001 << i ) ) + { + V_snprintf( outTexCoordBuff, sizeof( outTexCoordBuff ), "centroid varying vec4 oT%d;\n", i ); // centroid varying + StrcatToHeaderCode( outTexCoordBuff ); + } + else + { + V_snprintf( outTexCoordBuff, sizeof( outTexCoordBuff ), "varying vec4 oT%d;\n", i ); + StrcatToHeaderCode( outTexCoordBuff ); + } + } + } + } + } + } + else + { + if ( m_dwMajorVersion == 3 ) + { + WriteGLSLInputVariableAssignments(); + } + } + + // do some annotation at the end of the attrib block + { + char temp[1000]; + + if ( m_bVertexShader ) + { + // write attrib map into the text starting at pAttribMapStart - two hex digits per attrib + for( int i=0; i<16; i++ ) + { + if ( m_dwAttribMap[i] != 0xFFFFFFFF ) + { + V_snprintf( temp, sizeof(temp), "%02X", m_dwAttribMap[i] ); + memcpy( pAttribMapStart + (i*3), temp, 2 ); + } + } + } + + PrintIndentation( (char*)m_pBufAttribCode->Base(), m_pBufAttribCode->Size() ); + + // This used to write out a translation counter into the shader as a comment. However, the order that shaders get in here + // is non-deterministic between runs, and the change in this comment would cause shaders to appear different to the GL disk cache, + // significantly increasing app load time. + // Other code looks for trans#%d, so we can't just remove it. Instead, output it as 0. + V_snprintf( temp, sizeof(temp), "%s trans#%d label:%s\n", "//", 0, debugLabel ? debugLabel : "none" ); + StrcatToAttribCode( temp ); + } + + // If we actually sample from a shadow depth sampler, we need to declare the shadow option at the top + if ( m_bDeclareShadowOption ) + { + StrcatToHeaderCode( "OPTION ARB_fragment_program_shadow;\n" ); + } + + StrcatToHeaderCode( "\nvoid main()\n{\n" ); + if ( m_bUsedAtomicTempVar ) + { + PrintToBufWithIndents( *m_pBufHeaderCode, "vec4 %s;\n\n", g_pAtomicTempVarName ); + } + + // sRGB Write suffix + if ( m_bGenerateSRGBWriteSuffix ) + { + StrcatToALUCode( "vec3 sRGBFragData;\n" ); + StrcatToALUCode( "sRGBFragData.xyz = log( gl_FragData[0].xyz );\n" ); + StrcatToALUCode( "sRGBFragData.xyz = sRGBFragData.xyz * vec3( 0.454545f, 0.454545f, 0.454545f );\n" ); + StrcatToALUCode( "sRGBFragData.xyz = exp( sRGBFragData.xyz );\n" ); + StrcatToALUCode( "gl_FragData[0].xyz = mix( gl_FragData[0].xyz, sRGBFragData, flSRGBWrite );\n" ); + } + + strcat_s( (char*)m_pBufALUCode->Base(), m_pBufALUCode->Size(), "}\n" ); + + // Put all of the strings together for final program ( pHeaderCode + pAttribCode + pParamCode + pALUCode ) + StrcatToHeaderCode( (char*)m_pBufAttribCode->Base() ); + StrcatToHeaderCode( (char*)m_pBufParamCode->Base() ); + StrcatToHeaderCode( (char*)m_pBufALUCode->Base() ); + + // Cleanup - don't touch m_pBufHeaderCode, as it is managed by the caller + delete m_pBufAttribCode; + delete m_pBufParamCode; + delete m_pBufALUCode; + m_pBufAttribCode = m_pBufParamCode = m_pBufALUCode = NULL; + + if ( m_bSpew ) + { + printf("\n************* translation complete\n\n " ); + } + + return DISASM_OK; +} diff --git a/togles/linuxwin/dx9asmtogl2.h b/togles/linuxwin/dx9asmtogl2.h new file mode 100644 index 00000000..2ab7e098 --- /dev/null +++ b/togles/linuxwin/dx9asmtogl2.h @@ -0,0 +1,261 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +//------------------------------------------------------------------------------ +// DX9AsmToGL2.h +//------------------------------------------------------------------------------ + +#ifndef DX9_ASM_TO_GL_2_H +#define DX9_ASM_TO_GL_2_H +#include "tier1/utlstring.h" + +#define DISASM_OK 0 +#define DISASM_ERROR 1 + +#define MAX_SHADER_CONSTANTS 512 + +#define MAX_DECLARED_OUTPUTS 32 +#define MAX_DECLARED_INPUTS 32 + +#define HEXCODE_HEADER "// Hex: " + +// Option bits +#define D3DToGL_OptionUseEnvParams 0x0001 +#define D3DToGL_OptionDoFixupZ 0x0002 // Add instructions to put Z in the right interval for GL +#define D3DToGL_OptionDoFixupY 0x0004 // Add instructions to flip the Y over for GL +#define D3DToGL_OptionDoUserClipPlanes 0x0008 // ARB mode: Include OPTION vertex_program_2 and append DP4's to write into oCLP[0] and oCLP[1] + // GLSL mode: generate code to write gl_ClipVertex + +#define D3DToGL_AddHexComments 0x0020 // Include hex comments in the code for debugging +#define D3DToGL_PutHexCommentsAfterLines 0x0040 // If D3DToGL_AddHexComments is set, this puts the codes to the right, rather than on separate lines +#define D3DToGL_GeneratingDebugText 0x0080 // This tells it that we're just getting info for debugging so go easy on asserts and errors +#define D3DToGL_OptionSRGBWriteSuffix 0x0400 // Tack sRGB conversion suffix on to pixel shaders +#define D3DToGL_OptionGenerateBoneUniformBuffer 0x0800 // if enabled, the vertex shader "bone" registers (all regs DXABSTRACT_VS_FIRST_BONE_SLOT and higher) will be separated out into another uniform buffer (vcbone) +#define D3DToGL_OptionUseBindlessTexturing 0x1000 +#define D3DToGL_OptionSpew 0x80000000 + +// Code for which component of the "dummy" address register is needed by an instruction +#define ARL_DEST_NONE -1 +#define ARL_DEST_X 0 +#define ARL_DEST_Y 1 +#define ARL_DEST_Z 2 +#define ARL_DEST_W 3 + +class D3DToGL +{ +private: + // Pointers for dwToken stream management + uint32* m_pdwBaseToken; + uint32* m_pdwNextToken; + + // Vertex shader or pixel shader, and version (necessary because some opcodes alias) + bool m_bVertexShader; + uint32 m_dwMinorVersion; + uint32 m_dwMajorVersion; + + // Option flags + bool m_bUseEnvParams; // set D3DToGL_OptionUseEnvParams in 'options' to use + bool m_bDoFixupZ; // set D3DToGL_OptionDoFixupZ + bool m_bDoFixupY; // set D3DToGL_OptionDoFixupZ + bool m_bDoUserClipPlanes; // set D3DToGL_OptionDoUserClipPlanes + bool m_bSpew; // set D3DToGL_OptionSpew + bool m_bGenerateSRGBWriteSuffix; // set D3DToGL_OptionSRGBWriteSuffix + bool m_bGenerateBoneUniformBuffer; + bool m_bUseBindlessTexturing; + + // Counter for dealing with nested loops + int m_nLoopDepth; + + // Add "// Hex: 0xFFEEF00"-type statements after each instruction is parsed. + bool m_bAddHexCodeComments; // set D3DToGL_AddHexComments + + // Only applicable if m_bAddHexCodeComments is true. + // If this is true, then it puts the hex code comments to the right of the instructions in a comment + // rather than preceding the instructions. + // Defaults to FALSE. + bool m_bPutHexCodesAfterLines; // set D3DToGL_PutHexCommentsAtEnd + + // This tells it that we're just getting info for debugging so go easy on asserts and errors. + // Defaults to FALSE. + bool m_bGeneratingDebugText; + + // Various scratch temps needed to handle mis-matches in instruction sets between D3D and OpenGL + bool m_bNeedsD2AddTemp; + bool m_bNeedsNRMTemp; + bool m_bDeclareAddressReg; + bool m_bNeedsLerpTemp; + bool m_bNeedsSinCosDeclarations; + + // Keep track of which vs outputs are used so we can declare them + bool m_bDeclareVSOPos; + bool m_bDeclareVSOFog; + uint32 m_dwTexCoordOutMask; + + int32 m_nVSPositionOutput; + + // Mask of varyings which need centroid decoration + uint32 m_nCentroidMask; + + // Keep track of which temps are used so they can be declared + uint32 m_dwTempUsageMask; + uint32 m_dwTempBoolUsageMask; + bool m_bOutputColorRegister[4]; + bool m_bOutputDepthRegister; + + // Declaration of integer and bool constants + uint32 m_dwConstIntUsageMask; + uint32 m_dwConstBoolUsageMask; + + uint32 m_dwDefConstIntUsageMask; + uint32 m_dwDefConstIntIterCount[32]; + + // Did we use atomic_temp_var? + bool m_bUsedAtomicTempVar; + + // Track constants so we know how to declare them + bool m_bConstantRegisterDefined[MAX_SHADER_CONSTANTS]; + + // Track sampler types when declared so we can properly decorate TEX instructions + uint32 m_dwSamplerTypes[32]; + + // Track sampler usage + uint32 m_dwSamplerUsageMask; + + // Track shadow sampler usage + int m_nShadowDepthSamplerMask; + bool m_bDeclareShadowOption; + + // Track attribute references + // init to 0xFFFFFFFF (unhit) + // index by (dwRegToken & D3DSP_REGNUM_MASK) in VS DCL insns + // fill with (usage<<4) | (usage index). + uint32 m_dwAttribMap[16]; + + // Register high water mark + uint32 m_nHighestRegister; + int32 m_nHighestBoneRegister; + + // GLSL does indentation for readability + int m_NumIndentTabs; + + // Output buffers. + CUtlBuffer *m_pBufHeaderCode; + CUtlBuffer *m_pBufAttribCode; + CUtlBuffer *m_pBufParamCode; + CUtlBuffer *m_pBufALUCode; + + char *m_pFinalAssignmentsCode; + int m_nFinalAssignmentsBufSize; + + // Recorded positions for debugging. + uint32* m_pRecordedInputTokenStart; + int m_nRecordedParamCodeStrlen; + int m_nRecordedALUCodeStrlen; + int m_nRecordedAttribCodeStrlen; + + // In GLSL mode, these store the semantic attached to each oN register. + // They are the values that you pass to GetUsageIndexAndString. + uint32 m_DeclaredOutputs[MAX_DECLARED_OUTPUTS]; + + uint32 m_DeclaredInputs[MAX_DECLARED_INPUTS]; + + // Have they used the tangent input semantic (i.e. is g_pTangentAttributeName declared)? + bool m_bTangentInputUsed; + + bool m_bUsesDSTInstruction; + +private: + // Utilities to aid in decoding token stream + uint32 GetNextToken( void ); + void SkipTokens( uint32 numToSkip ); + uint32 Opcode( uint32 dwToken ); + uint32 OpcodeSpecificData( uint32 dwToken ); + uint32 TextureType ( uint32 dwToken ); + uint32 GetRegType( uint32 dwRegToken ); + + // Write to the different buffers. + void StrcatToHeaderCode( const char *pBuf ); + void StrcatToALUCode( const char *pBuf ); + void StrcatToParamCode( const char *pBuf ); + void StrcatToAttribCode( const char *pBuf ); + void PrintToBufWithIndents( CUtlBuffer &buf, const char *pFormat, ... ); + + // This helps write the token hex codes into the output stream for debugging. + void AddTokenHexCodeToBuffer( char *pBuffer, int nSize, int nLastStrlen ); + void RecordInputAndOutputPositions(); + void AddTokenHexCode(); + + // Utilities for decoding tokens in to strings according to ASM syntax + void PrintOpcode( uint32 inst, char* buff, int nBufLen ); + + // fSemanticFlags is SEMANTIC_INPUT or SEMANTIC_OUTPUT. + void PrintUsageAndIndexToString( uint32 dwToken, char* strUsageUsageIndexName, int nBufLen, int fSemanticFlags ); + CUtlString GetUsageAndIndexString( uint32 dwToken, int fSemanticFlags ); + CUtlString GetParameterString( uint32 dwToken, uint32 dwSourceOrDest, bool bForceScalarSource, int *pARLDestReg ); + const char* GetGLSLOperatorString( uint32 inst ); + + void PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, char *pRegisterName, int nBufLen, bool bForceScalarSource, int *pARLDestReg ); + + void InsertMoveFromAddressRegister( CUtlBuffer *pCode, int nARLComp0, int nARLComp1, int nARLComp2 = ARL_DEST_NONE ); + void InsertMoveInstruction( CUtlBuffer *pCode, int nARLComponent ); + void FlagIndirectRegister( uint32 dwToken, int *pARLDestReg ); + + // Utilities for decoding tokens in to strings according to GLSL syntax + bool OpenIntrinsic( uint32 inst, char* buff, int nBufLen, uint32 destDimension, uint32 nArgumentDimension ); + void PrintIndentation( char *pBuf, int nBufLen ); + + uint32 MaintainAttributeMap( uint32 dwToken, uint32 dwRegToken ); + + CUtlString FixGLSLSwizzle( const char *pDestRegisterName, const char *pSrcRegisterName ); + void WriteGLSLCmp( const char *pDestReg, const char *pSrc0Reg, const char *pSrc1Reg, const char *pSrc2Reg ); + void WriteGLSLSamplerDefinitions(); + void WriteGLSLOutputVariableAssignments(); + void WriteGLSLInputVariableAssignments(); + void NoteTangentInputUsed(); + + void Handle_DCL(); + void Handle_DEF(); + void Handle_DEFIB( uint32 nInstruction ); + void Handle_MAD( uint32 nInstruction ); + void Handle_DP2ADD(); + void Handle_SINCOS(); + void Handle_LRP( uint32 nInstruction ); + void Handle_TEX( uint32 dwToken, bool bIsTexLDL ); + void Handle_TexLDD( uint32 nInstruction ); + void Handle_TexCoord(); + void Handle_UnaryOp( uint32 nInstruction ); + void Handle_BREAKC( uint32 dwToken ); + void HandleBinaryOp_GLSL( uint32 nInstruction ); + void HandleBinaryOp_ASM( uint32 nInstruction ); + void Handle_CMP(); + void Handle_NRM(); + void Handle_DeclarativeNonDclOp( uint32 nInstruction ); + +public: + D3DToGL(); + + int TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bool *bVertexShader, uint32 options, int32 nShadowDepthSamplerMask, uint32 nCentroidMask, char *debugLabel ); +}; + + +#endif // DX9_ASM_TO_GL_2_H diff --git a/togles/linuxwin/dxabstract.cpp b/togles/linuxwin/dxabstract.cpp new file mode 100644 index 00000000..f4459e8e --- /dev/null +++ b/togles/linuxwin/dxabstract.cpp @@ -0,0 +1,6845 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// dxabstract.cpp +// +//================================================================================================== +#include "togl/rendermechanism.h" +#include "tier0/vprof_telemetry.h" +#include "tier0/dbg.h" +#include "tier0/threadtools.h" +#include "tier0/vprof.h" +#include "tier1/strtools.h" +#include "tier1/utlbuffer.h" +#include "dx9asmtogl2.h" +#include "mathlib/vmatrix.h" +#include "materialsystem/IShader.h" + +#include "glmgr_flush.inl" + +#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) + #include "appframework/ilaunchermgr.h" + extern ILauncherMgr *g_pLauncherMgr; +#endif + +#include "tier0/icommandline.h" +#include "tier0/memdbgon.h" + +#ifdef USE_ACTUAL_DX + +#pragma comment( lib, "../../dx9sdk/lib/d3d9.lib" ) +#pragma comment( lib, "../../dx9sdk/lib/d3dx9.lib" ) + +#else + +#ifdef POSIX +#define strcat_s( a, b, c) V_strcat( a, c, b ) +#endif + +#define D3D_DEVICE_VALID_MARKER 0x12EBC845 +#define GL_PUBLIC_ENTRYPOINT_CHECKS( dev ) Assert( dev->GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); Assert( dev->m_nValidMarker == D3D_DEVICE_VALID_MARKER ); +// ------------------------------------------------------------------------------------------------------------------------------ // +bool g_bNullD3DDevice; + +static D3DToGL g_D3DToOpenGLTranslatorGLSL; +static IDirect3DDevice9 *g_pD3D_Device; + +#if GL_BATCH_PERF_ANALYSIS + #include "../../thirdparty/miniz/simple_bitmap.h" + #include "../../thirdparty/miniz/miniz.c" + + ConVar gl_batch_vis_abs_scale( "gl_batch_vis_abs_scale", ".050" ); + ConVar gl_present_vis_abs_scale( "gl_present_vis_abs_scale", ".050" ); + //ConVar gl_batch_vis_y_scale( "gl_batch_vis_y_scale", "0.007" ); + ConVar gl_batch_vis_y_scale( "gl_batch_vis_y_scale", "0.0" ); + static double s_rdtsc_to_ms; + + uint64 g_nTotalD3DCycles; + uint g_nTotalD3DCalls; + + class CGLBatchPerfCallTimer + { + public: + inline CGLBatchPerfCallTimer() { g_nTotalD3DCalls++; g_nTotalD3DCycles -= TM_FAST_TIME(); } + inline ~CGLBatchPerfCallTimer() { g_nTotalD3DCycles += TM_FAST_TIME(); } + }; + + #define GL_BATCH_PERF_CALL_TIMER CGLBatchPerfCallTimer scopedCallTimer; +#else + #define GL_BATCH_PERF_CALL_TIMER +#endif // GL_BATCH_PERF_ANALYSIS + +ConVar gl_batch_vis( "gl_batch_vis", "0" ); + +// ------------------------------------------------------------------------------------------------------------------------------ // +// functions that are dependant on g_pLauncherMgr + +inline GLMDisplayDB *GetDisplayDB( void ) +{ + return g_pLauncherMgr->GetDisplayDB(); +} + +inline void RenderedSize( uint &width, uint &height, bool set ) +{ + g_pLauncherMgr->RenderedSize( width, height, set ); +} + +inline void GetStackCrawl( CStackCrawlParams *params ) +{ + g_pLauncherMgr->GetStackCrawl(params); +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#if defined( WIN32 ) + +bool D3DMATRIX::operator == ( CONST D3DMATRIX& src) const +{ + return V_memcmp( (void*)this, (void*)&src, sizeof(this) ) == 0; +} + +D3DMATRIX::operator void* () +{ + return (void*)this; +} + +#endif + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- D3DXMATRIX operators + +#endif + +D3DXMATRIX D3DXMATRIX::operator*( const D3DXMATRIX &o ) const +{ + D3DXMATRIX result; + + D3DXMatrixMultiply( &result, this, &o ); // this = lhs o = rhs result = this * o + + return result; +} + +D3DXMATRIX::operator FLOAT* () +{ + return (float*)this; +} + +float& D3DXMATRIX::operator()( int row, int column ) +{ + return m[row][column]; +} + +const float& D3DXMATRIX::operator()( int row, int column ) const +{ + return m[row][column]; +} + +bool D3DXMATRIX::operator != ( CONST D3DXMATRIX& src ) const +{ + return V_memcmp( (void*)this, (void*)&src, sizeof(this) ) != 0; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- D3DXPLANE operators + +#endif + +float& D3DXPLANE::operator[]( int i ) +{ + return ((float*)this)[i]; +} + +bool D3DXPLANE::operator==( const D3DXPLANE &o ) +{ + return a == o.a && b == o.b && c == o.c && d == o.d; +} + +bool D3DXPLANE::operator!=( const D3DXPLANE &o ) +{ + return !( *this == o ); +} + +D3DXPLANE::operator float*() +{ + return (float*)this; +} + +D3DXPLANE::operator const float*() const +{ + return (const float*)this; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- D3DXVECTOR2 operators + +#endif + +D3DXVECTOR2::operator FLOAT* () +{ + return (float*)this; +} + +D3DXVECTOR2::operator CONST FLOAT* () const +{ + return (const float*)this; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- D3DXVECTOR3 operators + +#endif + +D3DXVECTOR3::D3DXVECTOR3( float a, float b, float c ) +{ + x = a; + y = b; + z = c; +} + +D3DXVECTOR3::operator FLOAT* () +{ + return (float*)this; +} + +D3DXVECTOR3::operator CONST FLOAT* () const +{ + return (const float*)this; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- D3DXVECTOR4 operators + +#endif + +D3DXVECTOR4::D3DXVECTOR4( float a, float b, float c, float d ) +{ + x = a; + y = b; + z = c; + w = d; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +DWORD IDirect3DResource9::SetPriority(DWORD PriorityNew) +{ +// DXABSTRACT_BREAK_ON_ERROR(); +// GLMPRINTF(( "-X- SetPriority" )); + // no-op city + return 0; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DBaseTexture9 + +#endif + +IDirect3DBaseTexture9::~IDirect3DBaseTexture9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF(( ">-A- ~IDirect3DBaseTexture9" )); + + if (m_device) + { + Assert( m_device->m_ObjectStats.m_nTotalTextures >= 1 ); + m_device->m_ObjectStats.m_nTotalTextures--; + + GLMPRINTF(( "-A- ~IDirect3DBaseTexture9 taking normal delete path on %08x, device is %08x ", this, m_device )); + m_device->ReleasedTexture( this ); + + if (m_tex) + { + GLMPRINTF(("-A- ~IDirect3DBaseTexture9 deleted '%s' @ %08x (GLM %08x) %s",m_tex->m_layout->m_layoutSummary, this, m_tex, m_tex->m_debugLabel ? m_tex->m_debugLabel : "" )); + + m_device->ReleasedCGLMTex( m_tex ); + + m_tex->m_ctx->DelTex( m_tex ); + m_tex = NULL; + } + else + { + GLMPRINTF(( "-A- ~IDirect3DBaseTexture9 : whoops, no tex to delete here ?" )); + } + m_device = NULL; // ** THIS ** is the only place to scrub this. Don't do it in the subclass destructors. + } + else + { + GLMPRINTF(( "-A- ~IDirect3DBaseTexture9 taking strange delete path on %08x, device is %08x ", this, m_device )); + } + + GLMPRINTF(( "<-A- ~IDirect3DBaseTexture9" )); +} + +D3DRESOURCETYPE IDirect3DBaseTexture9::GetType() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + return m_restype; //D3DRTYPE_TEXTURE; +} + +DWORD IDirect3DBaseTexture9::GetLevelCount() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + return m_tex->m_layout->m_mipCount; +} + +HRESULT IDirect3DBaseTexture9::GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + Assert (Level < static_cast(m_tex->m_layout->m_mipCount)); + + D3DSURFACE_DESC result = m_descZero; + // then mutate it for the level of interest + + GLMTexLayoutSlice *slice = &m_tex->m_layout->m_slices[ m_tex->CalcSliceIndex( 0, Level ) ]; + + result.Width = slice->m_xSize; + result.Height = slice->m_ySize; + + *pDesc = result; + + return S_OK; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DTexture9 + +#endif + +HRESULT IDirect3DDevice9::CreateTexture(UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture9** ppTexture,VD3DHANDLE* pSharedHandle, char *pDebugLabel ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + + m_ObjectStats.m_nTotalTextures++; + + GLMPRINTF((">-A-IDirect3DDevice9::CreateTexture")); + IDirect3DTexture9 *dxtex = new IDirect3DTexture9; + dxtex->m_restype = D3DRTYPE_TEXTURE; + + dxtex->m_device = this; + + dxtex->m_descZero.Format = Format; + dxtex->m_descZero.Type = D3DRTYPE_TEXTURE; + dxtex->m_descZero.Usage = Usage; + dxtex->m_descZero.Pool = Pool; + + dxtex->m_descZero.MultiSampleType = D3DMULTISAMPLE_NONE; + dxtex->m_descZero.MultiSampleQuality = 0; + dxtex->m_descZero.Width = Width; + dxtex->m_descZero.Height = Height; + + GLMTexLayoutKey key; + memset( &key, 0, sizeof(key) ); + + key.m_texGLTarget = GL_TEXTURE_2D; + key.m_texFormat = Format; + + if (Levels>1) + { + key.m_texFlags |= kGLMTexMipped; + } + + // http://msdn.microsoft.com/en-us/library/bb172625(VS.85).aspx + + // complain if any usage bits come down that I don't know. + uint knownUsageBits = (D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_RENDERTARGET | D3DUSAGE_DYNAMIC | D3DUSAGE_TEXTURE_SRGB | D3DUSAGE_DEPTHSTENCIL); + if ( (Usage & knownUsageBits) != Usage ) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + + if (Usage & D3DUSAGE_AUTOGENMIPMAP) + { + key.m_texFlags |= kGLMTexMipped | kGLMTexMippedAuto; + } + + if (Usage & D3DUSAGE_DYNAMIC) + { + // GLMPRINTF(("-X- DYNAMIC tex usage ignored..")); //FIXME + } + + if (Usage & D3DUSAGE_TEXTURE_SRGB) + { + key.m_texFlags |= kGLMTexSRGB; + } + + if (Usage & D3DUSAGE_RENDERTARGET) + { + Assert( !(Usage & D3DUSAGE_DEPTHSTENCIL) ); + + m_ObjectStats.m_nTotalRenderTargets++; + + key.m_texFlags |= kGLMTexRenderable; + + const GLMTexFormatDesc *pFmtDesc = GetFormatDesc( key.m_texFormat ); + if ( pFmtDesc->m_glIntFormatSRGB != 0 ) + { + key.m_texFlags |= kGLMTexSRGB; // this catches callers of CreateTexture who set the "renderable" option - they get an SRGB tex + } + + if (m_ctx->Caps().m_cantAttachSRGB) + { + // this config can't support SRGB render targets. quietly turn off the sRGB bit. + key.m_texFlags &= ~kGLMTexSRGB; + } + } + + if ( ( Format == D3DFMT_D16 ) || ( Format == D3DFMT_D24X8 ) || ( Format == D3DFMT_D24S8 ) ) + { + key.m_texFlags |= kGLMTexIsDepth; + } + if ( Format == D3DFMT_D24S8 ) + { + key.m_texFlags |= kGLMTexIsStencil; + } + + key.m_xSize = Width; + key.m_ySize = Height; + key.m_zSize = 1; + + CGLMTex *tex = m_ctx->NewTex( &key, Levels, pDebugLabel ); + if (!tex) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + dxtex->m_tex = tex; + + dxtex->m_tex->m_srgbFlipCount = 0; + + m_ObjectStats.m_nTotalSurfaces++; + + dxtex->m_surfZero = new IDirect3DSurface9; + dxtex->m_surfZero->m_restype = (D3DRESOURCETYPE)0; // this is a ref to a tex, not the owner... + + // do not do an AddRef here. + + dxtex->m_surfZero->m_device = this; + + dxtex->m_surfZero->m_desc = dxtex->m_descZero; + dxtex->m_surfZero->m_tex = tex; + dxtex->m_surfZero->m_face = 0; + dxtex->m_surfZero->m_mip = 0; + + GLMPRINTF(("-A- IDirect3DDevice9::CreateTexture created '%s' @ %08x (GLM %08x) %s",tex->m_layout->m_layoutSummary, dxtex, tex, pDebugLabel ? pDebugLabel : "" )); + + *ppTexture = dxtex; + + GLMPRINTF(("<-A-IDirect3DDevice9::CreateTexture")); + return S_OK; +} + + +IDirect3DTexture9::~IDirect3DTexture9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + GLMPRINTF(( ">-A- IDirect3DTexture9" )); + + // IDirect3DBaseTexture9::~IDirect3DBaseTexture9 frees up m_tex + // we take care of surfZero + + if (m_device) + { + m_device->ReleasedTexture( this ); + + if (m_surfZero) + { + ULONG refc = m_surfZero->Release( 0, "~IDirect3DTexture9 public release (surfZero)" ); (void)refc; + Assert( !refc ); + m_surfZero = NULL; + } + // leave m_device alone! + } + + GLMPRINTF(( "<-A- IDirect3DTexture9" )); +} + +HRESULT IDirect3DTexture9::LockRect(UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DTexture9::UnlockRect(UINT Level) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DTexture9::GetSurfaceLevel(UINT Level,IDirect3DSurface9** ppSurfaceLevel) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + // we create and pass back a surface, and the client is on the hook to release it. tidy. + + m_device->m_ObjectStats.m_nTotalSurfaces++; + + IDirect3DSurface9 *surf = new IDirect3DSurface9; + surf->m_restype = (D3DRESOURCETYPE)0; // 0 is special and means this 'surface' does not own its m_tex + + // Dicey...higher level code seems to want this and not want this. Are we missing some AddRef/Release behavior elsewhere? + // trying to turn this off - experimental - 26Oct2010 surf->AddRef(); + + surf->m_device = this->m_device; + + GLMTexLayoutSlice *slice = &m_tex->m_layout->m_slices[ m_tex->CalcSliceIndex( 0, Level ) ]; + + surf->m_desc = m_descZero; + surf->m_desc.Width = slice->m_xSize; + surf->m_desc.Height = slice->m_ySize; + + surf->m_tex = m_tex; + surf->m_face = 0; + surf->m_mip = Level; + + *ppSurfaceLevel = surf; + + return S_OK; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DCubeTexture9 + +#endif + +HRESULT IDirect3DDevice9::CreateCubeTexture(UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture9** ppCubeTexture,VD3DHANDLE* pSharedHandle, char *pDebugLabel) +{ + GL_BATCH_PERF_CALL_TIMER; + Assert( m_ctx->m_nCurOwnerThreadId == ThreadGetCurrentId() ); + GLMPRINTF((">-A- IDirect3DDevice9::CreateCubeTexture")); + + Assert( m_ctx->m_nCurOwnerThreadId == ThreadGetCurrentId() ); + + m_ObjectStats.m_nTotalTextures++; + + IDirect3DCubeTexture9 *dxtex = new IDirect3DCubeTexture9; + dxtex->m_restype = D3DRTYPE_CUBETEXTURE; + + dxtex->m_device = this; + + dxtex->m_descZero.Format = Format; + dxtex->m_descZero.Type = D3DRTYPE_CUBETEXTURE; + dxtex->m_descZero.Usage = Usage; + dxtex->m_descZero.Pool = Pool; + + dxtex->m_descZero.MultiSampleType = D3DMULTISAMPLE_NONE; + dxtex->m_descZero.MultiSampleQuality = 0; + dxtex->m_descZero.Width = EdgeLength; + dxtex->m_descZero.Height = EdgeLength; + + GLMTexLayoutKey key; + memset( &key, 0, sizeof(key) ); + + key.m_texGLTarget = GL_TEXTURE_CUBE_MAP; + key.m_texFormat = Format; + + if (Levels>1) + { + key.m_texFlags |= kGLMTexMipped; + } + + // http://msdn.microsoft.com/en-us/library/bb172625(VS.85).aspx + // complain if any usage bits come down that I don't know. + uint knownUsageBits = (D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_RENDERTARGET | D3DUSAGE_DYNAMIC | D3DUSAGE_TEXTURE_SRGB); + if ( (Usage & knownUsageBits) != Usage ) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + + if (Usage & D3DUSAGE_AUTOGENMIPMAP) + { + key.m_texFlags |= kGLMTexMipped | kGLMTexMippedAuto; + } + + if (Usage & D3DUSAGE_RENDERTARGET) + { + key.m_texFlags |= kGLMTexRenderable; + + m_ObjectStats.m_nTotalRenderTargets++; + } + + if (Usage & D3DUSAGE_DYNAMIC) + { + //GLMPRINTF(("-X- DYNAMIC tex usage ignored..")); //FIXME + } + + if (Usage & D3DUSAGE_TEXTURE_SRGB) + { + key.m_texFlags |= kGLMTexSRGB; + } + + key.m_xSize = EdgeLength; + key.m_ySize = EdgeLength; + key.m_zSize = 1; + + CGLMTex *tex = m_ctx->NewTex( &key, Levels, pDebugLabel ); + if (!tex) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + dxtex->m_tex = tex; + + dxtex->m_tex->m_srgbFlipCount = 0; + + for( int face = 0; face < 6; face ++) + { + m_ObjectStats.m_nTotalSurfaces++; + + dxtex->m_surfZero[face] = new IDirect3DSurface9; + dxtex->m_surfZero[face]->m_restype = (D3DRESOURCETYPE)0; // 0 is special and means this 'surface' does not own its m_tex + // do not do an AddRef here. + + dxtex->m_surfZero[face]->m_device = this; + + dxtex->m_surfZero[face]->m_desc = dxtex->m_descZero; + dxtex->m_surfZero[face]->m_tex = tex; + dxtex->m_surfZero[face]->m_face = face; + dxtex->m_surfZero[face]->m_mip = 0; + } + + GLMPRINTF(("-A- IDirect3DDevice9::CreateCubeTexture created '%s' @ %08x (GLM %08x)",tex->m_layout->m_layoutSummary, dxtex, tex )); + + *ppCubeTexture = dxtex; + + GLMPRINTF(("<-A- IDirect3DDevice9::CreateCubeTexture")); + + return S_OK; +} + +IDirect3DCubeTexture9::~IDirect3DCubeTexture9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF(( ">-A- ~IDirect3DCubeTexture9" )); + + if (m_device) + { + GLMPRINTF(( "-A- ~IDirect3DCubeTexture9 taking normal delete path on %08x, device is %08x, surfzero[0] is %08x ", this, m_device, m_surfZero[0] )); + m_device->ReleasedTexture( this ); + + // let IDirect3DBaseTexture9::~IDirect3DBaseTexture9 free up m_tex + // we handle the surfZero array for the faces + + for( int face = 0; face < 6; face ++) + { + if (m_surfZero[face]) + { + Assert( m_surfZero[face]->m_device == m_device ); + ULONG refc = m_surfZero[face]->Release( 0, "~IDirect3DCubeTexture9 public release (surfZero)"); + if ( refc!=0 ) + { + GLMPRINTF(( "-A- ~IDirect3DCubeTexture9 seeing non zero refcount on surfzero[%d] => %d ", face, refc )); + } + m_surfZero[face] = NULL; + } + } + // leave m_device alone! + } + else + { + GLMPRINTF(( "-A- ~IDirect3DCubeTexture9 taking strange delete path on %08x, device is %08x, surfzero[0] is %08x ", this, m_device, m_surfZero[0] )); + } + + GLMPRINTF(( "<-A- ~IDirect3DCubeTexture9" )); +} + +HRESULT IDirect3DCubeTexture9::GetCubeMapSurface(D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + // we create and pass back a surface, and the client is on the hook to release it... + + m_device->m_ObjectStats.m_nTotalSurfaces++; + + IDirect3DSurface9 *surf = new IDirect3DSurface9; + surf->m_restype = (D3DRESOURCETYPE)0; // 0 is special and means this 'surface' does not own its m_tex + + GLMTexLayoutSlice *slice = &m_tex->m_layout->m_slices[ m_tex->CalcSliceIndex( FaceType, Level ) ]; + + surf->m_device = this->m_device; + + surf->m_desc = m_descZero; + surf->m_desc.Width = slice->m_xSize; + surf->m_desc.Height = slice->m_ySize; + + surf->m_tex = m_tex; + surf->m_face = FaceType; + surf->m_mip = Level; + + *ppCubeMapSurface = surf; + + return S_OK; +} + +HRESULT IDirect3DCubeTexture9::GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc) +{ + GL_BATCH_PERF_CALL_TIMER; + Assert (Level < static_cast(m_tex->m_layout->m_mipCount)); + + D3DSURFACE_DESC result = m_descZero; + // then mutate it for the level of interest + + GLMTexLayoutSlice *slice = &m_tex->m_layout->m_slices[ m_tex->CalcSliceIndex( 0, Level ) ]; + + result.Width = slice->m_xSize; + result.Height = slice->m_ySize; + + *pDesc = result; + + return S_OK; +} + + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DVolumeTexture9 + +#endif + +HRESULT IDirect3DDevice9::CreateVolumeTexture(UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture9** ppVolumeTexture,VD3DHANDLE* pSharedHandle, char *pDebugLabel) +{ + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF((">-A- IDirect3DDevice9::CreateVolumeTexture")); + // set dxtex->m_restype to D3DRTYPE_VOLUMETEXTURE... + + Assert( m_ctx->m_nCurOwnerThreadId == ThreadGetCurrentId() ); + + m_ObjectStats.m_nTotalTextures++; + + IDirect3DVolumeTexture9 *dxtex = new IDirect3DVolumeTexture9; + dxtex->m_restype = D3DRTYPE_VOLUMETEXTURE; + + dxtex->m_device = this; + + dxtex->m_descZero.Format = Format; + dxtex->m_descZero.Type = D3DRTYPE_VOLUMETEXTURE; + dxtex->m_descZero.Usage = Usage; + dxtex->m_descZero.Pool = Pool; + + dxtex->m_descZero.MultiSampleType = D3DMULTISAMPLE_NONE; + dxtex->m_descZero.MultiSampleQuality = 0; + dxtex->m_descZero.Width = Width; + dxtex->m_descZero.Height = Height; + + // also a volume specific desc + dxtex->m_volDescZero.Format = Format; + dxtex->m_volDescZero.Type = D3DRTYPE_VOLUMETEXTURE; + dxtex->m_volDescZero.Usage = Usage; + dxtex->m_volDescZero.Pool = Pool; + + dxtex->m_volDescZero.Width = Width; + dxtex->m_volDescZero.Height = Height; + dxtex->m_volDescZero.Depth = Depth; + + GLMTexLayoutKey key; + memset( &key, 0, sizeof(key) ); + + key.m_texGLTarget = GL_TEXTURE_3D; + key.m_texFormat = Format; + + if (Levels>1) + { + key.m_texFlags |= kGLMTexMipped; + } + + // http://msdn.microsoft.com/en-us/library/bb172625(VS.85).aspx + // complain if any usage bits come down that I don't know. + uint knownUsageBits = (D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_RENDERTARGET | D3DUSAGE_DYNAMIC | D3DUSAGE_TEXTURE_SRGB); + if ( (Usage & knownUsageBits) != Usage ) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + + if (Usage & D3DUSAGE_AUTOGENMIPMAP) + { + key.m_texFlags |= kGLMTexMipped | kGLMTexMippedAuto; + } + + if (Usage & D3DUSAGE_RENDERTARGET) + { + key.m_texFlags |= kGLMTexRenderable; + + m_ObjectStats.m_nTotalRenderTargets++; + } + + if (Usage & D3DUSAGE_DYNAMIC) + { + GLMPRINTF(("-X- DYNAMIC tex usage ignored..")); //FIXME + } + + if (Usage & D3DUSAGE_TEXTURE_SRGB) + { + key.m_texFlags |= kGLMTexSRGB; + } + + key.m_xSize = Width; + key.m_ySize = Height; + key.m_zSize = Depth; + + CGLMTex *tex = m_ctx->NewTex( &key, Levels, pDebugLabel ); + if (!tex) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + dxtex->m_tex = tex; + + dxtex->m_tex->m_srgbFlipCount = 0; + + m_ObjectStats.m_nTotalSurfaces++; + + dxtex->m_surfZero = new IDirect3DSurface9; + dxtex->m_surfZero->m_restype = (D3DRESOURCETYPE)0; // this is a ref to a tex, not the owner... + // do not do an AddRef here. + + dxtex->m_surfZero->m_device = this; + + dxtex->m_surfZero->m_desc = dxtex->m_descZero; + dxtex->m_surfZero->m_tex = tex; + dxtex->m_surfZero->m_face = 0; + dxtex->m_surfZero->m_mip = 0; + + GLMPRINTF(("-A- IDirect3DDevice9::CreateVolumeTexture created '%s' @ %08x (GLM %08x)",tex->m_layout->m_layoutSummary, dxtex, tex )); + + *ppVolumeTexture = dxtex; + + GLMPRINTF(("<-A- IDirect3DDevice9::CreateVolumeTexture")); + + return S_OK; +} + +IDirect3DVolumeTexture9::~IDirect3DVolumeTexture9() +{ + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF((">-A- ~IDirect3DVolumeTexture9")); + + if (m_device) + { + m_device->ReleasedTexture( this ); + + // let IDirect3DBaseTexture9::~IDirect3DBaseTexture9 free up m_tex + // we handle m_surfZero + + if (m_surfZero) + { + ULONG refc = m_surfZero->Release( 0, "~IDirect3DVolumeTexture9 public release (surfZero)" ); (void)refc; + Assert( !refc ); + m_surfZero = NULL; + } + // leave m_device alone! + } + + GLMPRINTF(("<-A- ~IDirect3DVolumeTexture9")); +} + +HRESULT IDirect3DVolumeTexture9::LockBox(UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + GLMTexLockParams lockreq; + memset( &lockreq, 0, sizeof(lockreq) ); + + lockreq.m_tex = this->m_tex; + lockreq.m_face = 0; + lockreq.m_mip = Level; + + lockreq.m_region.xmin = pBox->Left; + lockreq.m_region.ymin = pBox->Top; + lockreq.m_region.zmin = pBox->Front; + lockreq.m_region.xmax = pBox->Right; + lockreq.m_region.ymax = pBox->Bottom; + lockreq.m_region.zmax = pBox->Back; + + char *lockAddress; + int yStride; + int zStride; + + lockreq.m_tex->Lock( &lockreq, &lockAddress, &yStride, &zStride ); + + pLockedVolume->RowPitch = yStride; + pLockedVolume->SlicePitch = yStride; + pLockedVolume->pBits = lockAddress; + + return S_OK; +} + +HRESULT IDirect3DVolumeTexture9::UnlockBox(UINT Level) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + GLMTexLockParams lockreq; + memset( &lockreq, 0, sizeof(lockreq) ); + + lockreq.m_tex = this->m_tex; + lockreq.m_face = 0; + lockreq.m_mip = Level; + + this->m_tex->Unlock( &lockreq ); + + return S_OK; +} + +HRESULT IDirect3DVolumeTexture9::GetLevelDesc( UINT Level, D3DVOLUME_DESC *pDesc ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + if (Level > static_cast(m_tex->m_layout->m_mipCount)) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + + D3DVOLUME_DESC result = m_volDescZero; + // then mutate it for the level of interest + + GLMTexLayoutSlice *slice = &m_tex->m_layout->m_slices[ m_tex->CalcSliceIndex( 0, Level ) ]; + + result.Width = slice->m_xSize; + result.Height = slice->m_ySize; + result.Depth = slice->m_zSize; + + *pDesc = result; + + return S_OK; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DSurface9 + +#endif + +IDirect3DSurface9::~IDirect3DSurface9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + // not much to do here, but good to verify that these things are being freed (and they are) + //GLMPRINTF(("-A- ~IDirect3DSurface9 - signpost")); + + if (m_device) + { + GLMPRINTF(("-A- ~IDirect3DSurface9 - taking real delete path on %08x device %08x", this, m_device)); + m_device->ReleasedSurface( this ); + + memset( &m_desc, 0, sizeof(m_desc) ); + + if (m_restype != 0) // signal that we are a surface that owns this tex (render target) + { + if (m_tex) + { + GLMPRINTF(("-A- ~IDirect3DSurface9 deleted '%s' @ %08x (GLM %08x) %s",m_tex->m_layout->m_layoutSummary, this, m_tex, m_tex->m_debugLabel ? m_tex->m_debugLabel : "" )); + + m_device->ReleasedCGLMTex( m_tex ); + + m_tex->m_ctx->DelTex( m_tex ); + m_tex = NULL; + } + else + { + GLMPRINTF(( "-A- ~IDirect3DSurface9 : whoops, no tex to delete here ?" )); + } + } + else + { + m_tex = NULL; // we are just a view on the tex, we don't own the tex, do not delete it + } + + m_face = m_mip = 0; + + m_device = NULL; + } + else + { + GLMPRINTF(("-A- ~IDirect3DSurface9 - taking strange delete path on %08x device %08x", this, m_device)); + } +} + +HRESULT IDirect3DSurface9::LockRect(D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMTexLockParams lockreq; + memset( &lockreq, 0, sizeof(lockreq) ); + + lockreq.m_tex = this->m_tex; + lockreq.m_face = this->m_face; + lockreq.m_mip = this->m_mip; + + lockreq.m_region.xmin = pRect->left; + lockreq.m_region.ymin = pRect->top; + lockreq.m_region.zmin = 0; + lockreq.m_region.xmax = pRect->right; + lockreq.m_region.ymax = pRect->bottom; + lockreq.m_region.zmax = 1; + + if ((Flags & (D3DLOCK_READONLY | D3DLOCK_NOSYSLOCK)) == (D3DLOCK_READONLY | D3DLOCK_NOSYSLOCK) ) + { + // smells like readback, force texel readout + lockreq.m_readback = true; + } + + char *lockAddress; + int yStride; + int zStride; + + lockreq.m_tex->Lock( &lockreq, &lockAddress, &yStride, &zStride ); + + pLockedRect->Pitch = yStride; + pLockedRect->pBits = lockAddress; + + return S_OK; +} + +HRESULT IDirect3DSurface9::UnlockRect() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMTexLockParams lockreq; + memset( &lockreq, 0, sizeof(lockreq) ); + + lockreq.m_tex = this->m_tex; + lockreq.m_face = this->m_face; + lockreq.m_mip = this->m_mip; + + lockreq.m_tex->Unlock( &lockreq ); + + return S_OK; +} + +HRESULT IDirect3DSurface9::GetDesc(D3DSURFACE_DESC *pDesc) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + *pDesc = m_desc; + return S_OK; +} + + +// ------------------------------------------------------------------------------------------------------------------------------ // + + +#ifdef OSX + +#pragma mark ----- IDirect3D9 ------------------------------------------------------- + +#endif + +IDirect3D9::~IDirect3D9() +{ + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF(("-A- ~IDirect3D9 - signpost")); +} + +UINT IDirect3D9::GetAdapterCount() +{ + GL_BATCH_PERF_CALL_TIMER; + GLMgr::NewGLMgr(); // init GL manager + + GLMDisplayDB *db = GetDisplayDB(); + int dxAdapterCount = db->GetFakeAdapterCount(); + + return dxAdapterCount; +} + +static void FillD3DCaps9( const GLMRendererInfoFields &glmRendererInfo, D3DCAPS9* pCaps ) +{ + // fill in the pCaps record for adapter... we zero most of it and just fill in the fields that we think the caller wants. + Q_memset( pCaps, 0, sizeof(*pCaps) ); + + + /* Device Info */ + pCaps->DeviceType = D3DDEVTYPE_HAL; + + /* Caps from DX7 Draw */ + pCaps->Caps = 0; // does anyone look at this ? + + pCaps->Caps2 = D3DCAPS2_DYNAMICTEXTURES; + /* Cursor Caps */ + pCaps->CursorCaps = 0; // nobody looks at this + + /* 3D Device Caps */ + pCaps->DevCaps = D3DDEVCAPS_HWTRANSFORMANDLIGHT; + + pCaps->TextureCaps = D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_MIPCUBEMAP | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PROJECTED; + // D3DPTEXTURECAPS_NOPROJECTEDBUMPENV ? + // D3DPTEXTURECAPS_POW2 ? + // caller looks at POT support like this: + // pCaps->m_SupportsNonPow2Textures = + // ( !( caps.TextureCaps & D3DPTEXTURECAPS_POW2 ) || + // ( caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL ) ); + // so we should set D3DPTEXTURECAPS_NONPOW2CONDITIONAL bit ? + + + pCaps->PrimitiveMiscCaps = 0; //only the HDR setup looks at this for D3DPMISCCAPS_SEPARATEALPHABLEND. + // ? D3DPMISCCAPS_SEPARATEALPHABLEND + // ? D3DPMISCCAPS_BLENDOP + // ? D3DPMISCCAPS_CLIPPLANESCALEDPOINTS + // ? D3DPMISCCAPS_CLIPTLVERTS D3DPMISCCAPS_COLORWRITEENABLE D3DPMISCCAPS_MASKZ D3DPMISCCAPS_TSSARGTEMP + + + pCaps->RasterCaps = D3DPRASTERCAPS_SCISSORTEST + | D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS // ref'd in CShaderDeviceMgrDx8::ComputeCapsFromD3D + | D3DPRASTERCAPS_DEPTHBIAS // ref'd in CShaderDeviceMgrDx8::ComputeCapsFromD3D + ; + + pCaps->TextureFilterCaps = D3DPTFILTERCAPS_MINFANISOTROPIC | D3DPTFILTERCAPS_MAGFANISOTROPIC; + + pCaps->MaxTextureWidth = 4096; + pCaps->MaxTextureHeight = 4096; + pCaps->MaxVolumeExtent = 1024; //guesses + + pCaps->MaxTextureAspectRatio = 0; // imply no limit on AR + + pCaps->MaxAnisotropy = glmRendererInfo.m_maxAniso; + + pCaps->TextureOpCaps = D3DTEXOPCAPS_ADD | D3DTEXOPCAPS_MODULATE2X; //guess + //DWORD MaxTextureBlendStages; + //DWORD MaxSimultaneousTextures; + + pCaps->VertexProcessingCaps = D3DVTXPCAPS_TEXGEN_SPHEREMAP; + + pCaps->MaxActiveLights = 8; // guess + + + // MaxUserClipPlanes. A bit complicated.. + // it's difficult to make this fluid without teaching the engine about a cap that could change during run. + + // start it out set to '2'. + // turn it off, if we're in GLSL mode but do not have native clip plane capability. + pCaps->MaxUserClipPlanes = 2; // assume good news + + // is user asking for it to be off ? + if ( CommandLine()->CheckParm( "-nouserclip" ) ) + { + pCaps->MaxUserClipPlanes = 0; + } + + pCaps->MaxVertexBlendMatrices = 0; // see if anyone cares + pCaps->MaxVertexBlendMatrixIndex = 0; // see if anyone cares + + pCaps->MaxPrimitiveCount = 32768; // guess + pCaps->MaxStreams = D3D_MAX_STREAMS; // guess + + pCaps->VertexShaderVersion = 0x300; // model 3.0 + pCaps->MaxVertexShaderConst = DXABSTRACT_VS_PARAM_SLOTS; // number of vertex shader constant registers + + pCaps->PixelShaderVersion = 0x300; // model 3.0 + + // Here are the DX9 specific ones + pCaps->DevCaps2 = D3DDEVCAPS2_STREAMOFFSET; + + pCaps->PS20Caps.NumInstructionSlots = 512; // guess + // only examined once: + // pCaps->m_SupportsPixelShaders_2_b = ( ( caps.PixelShaderVersion & 0xffff ) >= 0x0200) && (caps.PS20Caps.NumInstructionSlots >= 512); + //pCaps->m_SupportsPixelShaders_2_b = 1; + + pCaps->NumSimultaneousRTs = 1; // Will be at least 1 + pCaps->MaxVertexShader30InstructionSlots = 0; + pCaps->MaxPixelShader30InstructionSlots = 0; + +#if DX_TO_GL_ABSTRACTION + pCaps->FakeSRGBWrite = !glmRendererInfo.m_hasGammaWrites; + pCaps->CanDoSRGBReadFromRTs = !glmRendererInfo.m_cantAttachSRGB; + pCaps->MixedSizeTargets = glmRendererInfo.m_hasMixedAttachmentSizes; +#endif +} + +HRESULT IDirect3D9::GetDeviceCaps(UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps) +{ + GL_BATCH_PERF_CALL_TIMER; + // Generally called from "CShaderDeviceMgrDx8::ComputeCapsFromD3D" in ShaderDeviceDX8.cpp + + // "Adapter" is used to index amongst the set of fake-adapters maintained in the display DB + GLMDisplayDB *db = GetDisplayDB(); + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + + bool result = db->GetFakeAdapterInfo( Adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); (void)result; + Assert (!result); + // just leave glmRendererInfo filled out for subsequent code to look at as needed. + + FillD3DCaps9( glmRendererInfo, pCaps ); + + return S_OK; +} + +HRESULT IDirect3D9::GetAdapterIdentifier( UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier ) +{ + GL_BATCH_PERF_CALL_TIMER; + // Generally called from "CShaderDeviceMgrDx8::ComputeCapsFromD3D" in ShaderDeviceDX8.cpp + + Assert( Flags == D3DENUM_WHQL_LEVEL ); // we're not handling any other queries than this yet + + Q_memset( pIdentifier, 0, sizeof(*pIdentifier) ); + + GLMDisplayDB *db = GetDisplayDB(); + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + + // the D3D "Adapter" number feeds the fake adapter index + bool result = db->GetFakeAdapterInfo( Adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); (void)result; + Assert (!result); + +#ifndef OSX + if( glmRendererInfo.m_rendererID ) +#endif + { + const char *pRenderer = GLMDecode( eGL_RENDERER, glmRendererInfo.m_rendererID & 0x00FFFF00 ); + + Q_snprintf( pIdentifier->Driver, sizeof(pIdentifier->Driver), "OpenGL %s (%08x)", + pRenderer, glmRendererInfo.m_rendererID ); + + Q_snprintf( pIdentifier->Description, sizeof(pIdentifier->Description), "%s - %dx%d - %dMB VRAM", + pRenderer, + glmDisplayInfo.m_displayPixelWidth, glmDisplayInfo.m_displayPixelHeight, + glmRendererInfo.m_vidMemory >> 20 ); + } +#ifndef OSX + else + { + static CDynamicFunctionOpenGL< true, const GLubyte *( APIENTRY *)(GLenum name), const GLubyte * > glGetString("glGetString"); + + const char *pszStringVendor = ( const char * )glGetString( GL_VENDOR ); // NVIDIA Corporation + const char *pszStringRenderer = ( const char * )glGetString( GL_RENDERER ); // GeForce GTX 680/PCIe/SSE2 + const char *pszStringVersion = ( const char * )glGetString( GL_VERSION ); // 4.2.0 NVIDIA 304.22 + + Q_snprintf( pIdentifier->Driver, sizeof( pIdentifier->Driver ), "OpenGL %s (%s)", + pszStringVendor, pszStringRenderer ); + Q_snprintf( pIdentifier->Description, sizeof( pIdentifier->Description ), "%s (%s) %s - %dx%d", + pszStringVendor, pszStringRenderer, pszStringVersion, + glmDisplayInfo.m_displayPixelWidth, glmDisplayInfo.m_displayPixelHeight ); + } +#endif // !OSX + + pIdentifier->VendorId = glmRendererInfo.m_pciVendorID; // 4318; + pIdentifier->DeviceId = glmRendererInfo.m_pciDeviceID; // 401; + pIdentifier->SubSysId = 0; // 3358668866; + pIdentifier->Revision = 0; // 162; + pIdentifier->VideoMemory = glmRendererInfo.m_vidMemory; // amount of video memory in bytes + + #if 0 + // this came from the shaderapigl effort + Q_strncpy( pIdentifier->Driver, "Fake-Video-Card", MAX_DEVICE_IDENTIFIER_STRING ); + Q_strncpy( pIdentifier->Description, "Fake-Video-Card", MAX_DEVICE_IDENTIFIER_STRING ); + pIdentifier->VendorId = 4318; + pIdentifier->DeviceId = 401; + pIdentifier->SubSysId = 3358668866; + pIdentifier->Revision = 162; + #endif + + return S_OK; +} + +HRESULT IDirect3D9::CheckDeviceFormat(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) +{ + GL_BATCH_PERF_CALL_TIMER; + if (0) // hush for now, less spew + { + GLMPRINTF(("-X- ** IDirect3D9::CheckDeviceFormat: \n -- Adapter=%d || DeviceType=%4x:%s || AdapterFormat=%8x:%s\n -- RType %8x: %s\n -- CheckFormat %8x: %s\n -- Usage %8x: %s", + Adapter, + DeviceType, GLMDecode(eD3D_DEVTYPE, DeviceType), + AdapterFormat, GLMDecode(eD3D_FORMAT, AdapterFormat), + RType, GLMDecode(eD3D_RTYPE, RType), + CheckFormat, GLMDecode(eD3D_FORMAT, CheckFormat), + Usage, GLMDecodeMask( eD3D_USAGE, Usage ) )); + } + + HRESULT result = D3DERR_NOTAVAILABLE; // failure + + DWORD knownUsageMask = D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL | D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP + | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_FILTER | D3DUSAGE_QUERY_SRGBWRITE | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING + | D3DUSAGE_QUERY_VERTEXTEXTURE; + (void)knownUsageMask; + + // FramebufferSRGB stuff. + // basically a format is only allowed to have SRGB usage for writing, if you have the framebuffer SRGB extension. + // so, check for that capability with GLM adapter db, and if it's not there, don't mark that bit as usable in any of our formats. + GLMDisplayDB *db = GetDisplayDB(); + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + + bool dbresult = db->GetFakeAdapterInfo( Adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); (void)dbresult; + Assert (!dbresult); + + Assert ((Usage & knownUsageMask) == Usage); + + DWORD legalUsage = 0; + switch( AdapterFormat ) + { + case D3DFMT_X8R8G8B8: + switch( RType ) + { + case D3DRTYPE_TEXTURE: + switch( CheckFormat ) + { + case D3DFMT_DXT1: + case D3DFMT_DXT3: + case D3DFMT_DXT5: + legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_QUERY_SRGBREAD; + + //open question: is auto gen of mipmaps is allowed or attempted on any DXT textures. + break; + + case D3DFMT_A8R8G8B8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + break; + +//$ TODO: Need to merge bitmap changes over from Dota to get these formats. +#if 0 + case D3DFMT_A2R10G10B10: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + break; + + case D3DFMT_A2B10G10R10: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + break; +#endif + + case D3DFMT_R32F: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + break; + + case D3DFMT_A16B16G16R16: + legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + break; + + case D3DFMT_A16B16G16R16F: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE; + + if ( !glmRendererInfo.m_atiR5xx ) + { + legalUsage |= D3DUSAGE_QUERY_FILTER | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + } + break; + + case D3DFMT_A32B32G32R32F: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_RENDERTARGET | D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE; + + if ( !glmRendererInfo.m_atiR5xx && !glmRendererInfo.m_nvG7x ) + { + legalUsage |= D3DUSAGE_QUERY_FILTER | D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + } + break; + + case D3DFMT_R5G6B5: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + //----------------------------------------------------------- + // these come in from TestTextureFormat in ColorFormatDX8.cpp which is being driven by InitializeColorInformation... + // which is going to try all 8 combinations of (vertex texturable / render targetable / filterable ) on every image format it knows. + + case D3DFMT_R8G8B8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_QUERY_SRGBREAD; + break; + + case D3DFMT_X8R8G8B8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + legalUsage |= D3DUSAGE_QUERY_SRGBREAD | D3DUSAGE_QUERY_SRGBWRITE; + break; + + // one and two channel textures... we'll have to fake these as four channel tex if we want to support them + case D3DFMT_L8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + case D3DFMT_A8L8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + case D3DFMT_A8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + // going to need to go back and double check all of these.. + case D3DFMT_X1R5G5B5: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + case D3DFMT_A4R4G4B4: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + case D3DFMT_A1R5G5B5: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + case D3DFMT_V8U8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + break; + + case D3DFMT_Q8W8V8U8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + // what the heck is QWVU8 ... ? + break; + + case D3DFMT_X8L8V8U8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_AUTOGENMIPMAP | D3DUSAGE_QUERY_FILTER; + // what the heck is XLVU8 ... ? + break; + + // formats with depth... + + case D3DFMT_D16: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL; + // just a guess on the legal usages + break; + + case D3DFMT_D24S8: legalUsage = D3DUSAGE_DYNAMIC | D3DUSAGE_RENDERTARGET | D3DUSAGE_DEPTHSTENCIL; + // just a guess on the legal usages + break; + + // vendor formats... try marking these all invalid for now + case D3DFMT_NV_INTZ: + case D3DFMT_NV_RAWZ: + case D3DFMT_NV_NULL: + case D3DFMT_ATI_D16: + case D3DFMT_ATI_D24S8: + case D3DFMT_ATI_2N: + case D3DFMT_ATI_1N: + legalUsage = 0; + break; + + //----------------------------------------------------------- + + default: + Assert(!"Unknown check format"); + result = D3DERR_NOTAVAILABLE; + break; + } + + if ((Usage & legalUsage) == Usage) + { + result = S_OK; + } + else + { + DWORD unsatBits = Usage & (~legalUsage); // clear the bits of the req that were legal, leaving the illegal ones + unsatBits; + GLMPRINTF(( "-X- --> NOT OK: flags %8x:%s", unsatBits,GLMDecodeMask( eD3D_USAGE, unsatBits ) )); + result = D3DERR_NOTAVAILABLE; + } + break; + + case D3DRTYPE_SURFACE: + switch( static_cast(CheckFormat) ) + { + case 0x434f5441: + case 0x41415353: + result = D3DERR_NOTAVAILABLE; + break; + + case D3DFMT_D24S8: + result = S_OK; + break; + //** IDirect3D9::CheckDeviceFormat adapter=0, DeviceType= 1:D3DDEVTYPE_HAL, AdapterFormat= 5:D3DFMT_X8R8G8B8, RType= 1:D3DRTYPE_SURFACE, CheckFormat=434f5441:UNKNOWN + //** IDirect3D9::CheckDeviceFormat adapter=0, DeviceType= 1:D3DDEVTYPE_HAL, AdapterFormat= 5:D3DFMT_X8R8G8B8, RType= 1:D3DRTYPE_SURFACE, CheckFormat=41415353:UNKNOWN + //** IDirect3D9::CheckDeviceFormat adapter=0, DeviceType= 1:D3DDEVTYPE_HAL, AdapterFormat= 5:D3DFMT_X8R8G8B8, RType= 1:D3DRTYPE_SURFACE, CheckFormat=434f5441:UNKNOWN + //** IDirect3D9::CheckDeviceFormat adapter=0, DeviceType= 1:D3DDEVTYPE_HAL, AdapterFormat= 5:D3DFMT_X8R8G8B8, RType= 1:D3DRTYPE_SURFACE, CheckFormat=41415353:UNKNOWN + } + break; + + default: + Assert(!"Unknown resource type"); + result = D3DERR_NOTAVAILABLE; + break; + } + break; + + default: + Assert(!"Unknown adapter format"); + result = D3DERR_NOTAVAILABLE; + break; + } + + return result; +} + +UINT IDirect3D9::GetAdapterModeCount(UINT Adapter,D3DFORMAT Format) +{ + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF(( "-X- IDirect3D9::GetAdapterModeCount: Adapter=%d || Format=%8x:%s", Adapter, Format, GLMDecode(eD3D_FORMAT, Format) )); + + uint modeCount=0; + + GLMDisplayDB *db = GetDisplayDB(); + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + + // the D3D "Adapter" number feeds the fake adapter index + bool result = db->GetFakeAdapterInfo( Adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); (void)result; + Assert (!result); + + modeCount = db->GetModeCount( glmRendererIndex, glmDisplayIndex ); + GLMPRINTF(( "-X- --> result is %d", modeCount )); + + return modeCount; +} + +HRESULT IDirect3D9::EnumAdapterModes(UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) +{ + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF(( "-X- IDirect3D9::EnumAdapterModes: Adapter=%d || Format=%8x:%s || Mode=%d", Adapter, Format, GLMDecode(eD3D_FORMAT, Format), Mode )); + + Assert(Format==D3DFMT_X8R8G8B8); + + GLMDisplayDB *db = GetDisplayDB(); + + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + GLMDisplayModeInfoFields glmModeInfo; + + // the D3D "Adapter" number feeds the fake adapter index + bool result = db->GetFakeAdapterInfo( Adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); + Assert (!result); + if (result) return D3DERR_NOTAVAILABLE; + + bool result2 = db->GetModeInfo( glmRendererIndex, glmDisplayIndex, Mode, &glmModeInfo ); + Assert( !result2 ); + if (result2) return D3DERR_NOTAVAILABLE; + + pMode->Width = glmModeInfo.m_modePixelWidth; + pMode->Height = glmModeInfo.m_modePixelHeight; + pMode->RefreshRate = glmModeInfo.m_modeRefreshHz; // "adapter default" + pMode->Format = Format; // whatever you asked for ? + + GLMPRINTF(( "-X- IDirect3D9::EnumAdapterModes returning mode size (%d,%d) and D3DFMT_X8R8G8B8",pMode->Width,pMode->Height )); + return S_OK; +} + +HRESULT IDirect3D9::CheckDeviceType(UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) +{ + GL_BATCH_PERF_CALL_TIMER; + //FIXME: we just say "OK" on any query + + GLMPRINTF(( "-X- IDirect3D9::CheckDeviceType: Adapter=%d || DevType=%d:%s || AdapterFormat=%d:%s || BackBufferFormat=%d:%s || bWindowed=%d", + Adapter, + DevType, GLMDecode(eD3D_DEVTYPE,DevType), + AdapterFormat, GLMDecode(eD3D_FORMAT, AdapterFormat), + BackBufferFormat, GLMDecode(eD3D_FORMAT, BackBufferFormat), + (int) bWindowed )); + + return S_OK; +} + +HRESULT IDirect3D9::GetAdapterDisplayMode(UINT Adapter,D3DDISPLAYMODE* pMode) +{ + GL_BATCH_PERF_CALL_TIMER; + // asking what the current mode is + GLMPRINTF(("-X- IDirect3D9::GetAdapterDisplayMode: Adapter=%d", Adapter )); + + GLMDisplayDB *db = GetDisplayDB(); + + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + GLMDisplayModeInfoFields glmModeInfo; + + // the D3D "Adapter" number feeds the fake adapter index + bool result = db->GetFakeAdapterInfo( Adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); + Assert(!result); + if (result) return D3DERR_INVALIDCALL; + + int modeIndex = -1; // pass -1 as a mode index to find out about whatever the current mode is on the selected display + + bool modeResult = db->GetModeInfo( glmRendererIndex, glmDisplayIndex, modeIndex, &glmModeInfo ); + Assert (!modeResult); + if (modeResult) return D3DERR_INVALIDCALL; + + pMode->Width = glmModeInfo.m_modePixelWidth; + pMode->Height = glmModeInfo.m_modePixelHeight; + pMode->RefreshRate = glmModeInfo.m_modeRefreshHz; // "adapter default" + pMode->Format = D3DFMT_X8R8G8B8; //FIXME, this is a SWAG + + return S_OK; +} + +HRESULT IDirect3D9::CheckDepthStencilMatch(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) +{ + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF(("-X- IDirect3D9::CheckDepthStencilMatch: Adapter=%d || DevType=%d:%s || AdapterFormat=%d:%s || RenderTargetFormat=%d:%s || DepthStencilFormat=%d:%s", + Adapter, + DeviceType, GLMDecode(eD3D_DEVTYPE,DeviceType), + AdapterFormat, GLMDecode(eD3D_FORMAT, AdapterFormat), + RenderTargetFormat, GLMDecode(eD3D_FORMAT, RenderTargetFormat), + DepthStencilFormat, GLMDecode(eD3D_FORMAT, DepthStencilFormat) )); + + // one known request looks like this: + // AdapterFormat=5:D3DFMT_X8R8G8B8 || RenderTargetFormat=3:D3DFMT_A8R8G8B8 || DepthStencilFormat=2:D3DFMT_D24S8 + + // return S_OK for that one combo, DXABSTRACT_BREAK_ON_ERROR() on anything else + HRESULT result = D3DERR_NOTAVAILABLE; // failure + + switch( AdapterFormat ) + { + case D3DFMT_X8R8G8B8: + { + if ( (RenderTargetFormat == D3DFMT_A8R8G8B8) && (DepthStencilFormat == D3DFMT_D24S8) ) + { + result = S_OK; + } + } + break; + } + + Assert( result == S_OK ); + + return result; +} + +HRESULT IDirect3D9::CheckDeviceMultiSampleType( UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels ) +{ + GL_BATCH_PERF_CALL_TIMER; + GLMDisplayDB *db = GetDisplayDB(); + + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + //GLMDisplayModeInfoFields glmModeInfo; + + // the D3D "Adapter" number feeds the fake adapter index + bool result = db->GetFakeAdapterInfo( Adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); + Assert( !result ); + if ( result ) + return D3DERR_INVALIDCALL; + + + if ( !CommandLine()->FindParm("-glmenabletrustmsaa") ) + { + // These ghetto drivers don't get MSAA + if ( ( glmRendererInfo.m_nvG7x || glmRendererInfo.m_atiR5xx ) && ( MultiSampleType > D3DMULTISAMPLE_NONE ) ) + { + if ( pQualityLevels ) + { + *pQualityLevels = 0; + } + return D3DERR_NOTAVAILABLE; + } + } + + switch ( MultiSampleType ) + { + case D3DMULTISAMPLE_NONE: // always return true + if ( pQualityLevels ) + { + *pQualityLevels = 1; + } + return S_OK; + break; + + case D3DMULTISAMPLE_2_SAMPLES: + case D3DMULTISAMPLE_4_SAMPLES: + case D3DMULTISAMPLE_6_SAMPLES: + case D3DMULTISAMPLE_8_SAMPLES: + // note the fact that the d3d enums for 2, 4, 6, 8 samples are equal to 2,4,6,8... + if (glmRendererInfo.m_maxSamples >= (int)MultiSampleType ) + { + if ( pQualityLevels ) + { + *pQualityLevels = 1; + } + return S_OK; + } + else + { + return D3DERR_NOTAVAILABLE; + } + break; + + default: + if ( pQualityLevels ) + { + *pQualityLevels = 0; + } + return D3DERR_NOTAVAILABLE; + break; + } + return D3DERR_NOTAVAILABLE; +} + +HRESULT IDirect3D9::CreateDevice(UINT Adapter,D3DDEVTYPE DeviceType,VD3DHWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) +{ + GL_BATCH_PERF_CALL_TIMER; + +#if GLMDEBUG + GLMDebugPrintf( "WARNING: GLMEBUG is 1, perf. is going to be low!" ); + Warning( "WARNING: GLMEBUG is 1, perf. is going to be low!" ); +#endif +#if !TOGL_SUPPORT_NULL_DEVICE + if (DeviceType == D3DDEVTYPE_NULLREF) + { + Error( "Must define TOGL_SUPPORT_NULL_DEVICE to use the NULL device" ); + DebuggerBreak(); + return E_FAIL; + } +#endif + + // constrain these inputs for the time being + // BackBufferFormat -> A8R8G8B8 + // BackBufferCount -> 1; + // MultiSampleType -> D3DMULTISAMPLE_NONE + // AutoDepthStencilFormat -> D3DFMT_D24S8 + + // NULL out the return pointer so if we exit early it is not set + *ppReturnedDeviceInterface = NULL; + + // assume success unless something is sour + HRESULT result = S_OK; + + // relax this check for now + //if (pPresentationParameters->BackBufferFormat != D3DFMT_A8R8G8B8) + //{ + // DXABSTRACT_BREAK_ON_ERROR(); + // result = -1; + //} + + //rbarris 24Aug10 - relaxing this check - we don't care if the game asks for two backbuffers, it's moot + //if ( pPresentationParameters->BackBufferCount != 1 ) + //{ + // DXABSTRACT_BREAK_ON_ERROR(); + // result = D3DERR_NOTAVAILABLE; + //} + + if ( pPresentationParameters->AutoDepthStencilFormat != D3DFMT_D24S8 ) + { + DXABSTRACT_BREAK_ON_ERROR(); + result = D3DERR_NOTAVAILABLE; + } + + if ( result == S_OK ) + { + // create an IDirect3DDevice9 + // it will make a GLMContext and set up some drawables + + IDirect3DDevice9Params devparams; + memset( &devparams, 0, sizeof(devparams) ); + + devparams.m_adapter = Adapter; + devparams.m_deviceType = DeviceType; + devparams.m_focusWindow = hFocusWindow; // is this meaningful? is this a WindowRef ? follow it up the chain.. + devparams.m_behaviorFlags = BehaviorFlags; + devparams.m_presentationParameters = *pPresentationParameters; + + IDirect3DDevice9 *dev = new IDirect3DDevice9; + + result = dev->Create( &devparams ); + + if ( result == S_OK ) + { + *ppReturnedDeviceInterface = dev; + } + + g_bNullD3DDevice = ( DeviceType == D3DDEVTYPE_NULLREF ); + } + return result; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DQuery9 + +#endif + +HRESULT IDirect3DQuery9::Issue(DWORD dwIssueFlags) +{ + GL_BATCH_PERF_CALL_TIMER; + Assert( m_device->m_nValidMarker == D3D_DEVICE_VALID_MARKER ); + // Flags field for Issue + // #define D3DISSUE_END (1 << 0) // Tells the runtime to issue the end of a query, changing it's state to "non-signaled". + // #define D3DISSUE_BEGIN (1 << 1) // Tells the runtime to issue the beginng of a query. + + // Make sure calling thread owns the GL context. + Assert( m_ctx->m_nCurOwnerThreadId == ThreadGetCurrentId() ); + + if (dwIssueFlags & D3DISSUE_BEGIN) + { + m_nIssueStartThreadID = ThreadGetCurrentId(); + m_nIssueStartDrawCallIndex = g_nTotalDrawsOrClears; + m_nIssueStartFrameIndex = m_ctx->m_nCurFrame; + m_nIssueStartQueryCreationCounter = CGLMQuery::s_nTotalOcclusionQueryCreatesOrDeletes; + + switch( m_type ) + { + case D3DQUERYTYPE_OCCLUSION: + m_query->Start(); // drop "start counter" call into stream + break; + + default: + Assert(!"Can't use D3DISSUE_BEGIN on this query"); + break; + } + } + + if (dwIssueFlags & D3DISSUE_END) + { + m_nIssueEndThreadID = ThreadGetCurrentId(); + m_nIssueEndDrawCallIndex = g_nTotalDrawsOrClears; + m_nIssueEndFrameIndex = m_ctx->m_nCurFrame; + m_nIssueEndQueryCreationCounter = CGLMQuery::s_nTotalOcclusionQueryCreatesOrDeletes; + + switch( m_type ) + { + case D3DQUERYTYPE_OCCLUSION: + m_query->Stop(); // drop "end counter" call into stream + break; + + case D3DQUERYTYPE_EVENT: + m_nIssueStartThreadID = m_nIssueEndThreadID; + m_nIssueStartDrawCallIndex = m_nIssueEndDrawCallIndex; + m_nIssueStartFrameIndex = m_nIssueEndFrameIndex; + m_nIssueStartQueryCreationCounter = m_nIssueEndQueryCreationCounter; + + // End is very weird with respect to Events (fences). + // DX9 docs say to use End to put the fence in the stream. So we map End to GLM's Start. + // http://msdn.microsoft.com/en-us/library/ee422167(VS.85).aspx + m_query->Start(); // drop "set fence" into stream + break; + } + } + return S_OK; +} + +HRESULT IDirect3DQuery9::GetData(void* pData,DWORD dwSize,DWORD dwGetDataFlags) +{ + GL_BATCH_PERF_CALL_TIMER; + Assert( m_device->m_nValidMarker == D3D_DEVICE_VALID_MARKER ); + HRESULT result = S_FALSE ; + DWORD nCurThreadId = ThreadGetCurrentId(); + + // Make sure calling thread owns the GL context. + Assert( m_ctx->m_nCurOwnerThreadId == nCurThreadId ); + if ( pData ) + { + *(uint*)pData = 0; + } + + if ( !m_query->IsStarted() || !m_query->IsStopped() ) + { + Assert(!"Can't GetData before issue/start/stop"); + printf("\n** IDirect3DQuery9::GetData: can't GetData before issue/start/stop"); + return S_FALSE; + } + + // GetData is not always called with the flush bit. + + // if an answer is not yet available - return S_FALSE. + // if an answer is available - return S_OK and write the answer into *pData. + bool done = false; + bool flush = (dwGetDataFlags & D3DGETDATA_FLUSH) != 0; // aka spin until done + + // hmmm both of these paths are the same, maybe we could fold them up + if ( m_type == D3DQUERYTYPE_OCCLUSION ) + { + // Detect cases that are actually just not supported with the way we're using GL queries. (For example, beginning a query, then creating/deleting any query, the ending the same query is not supported.) + // Also extra paranoid to detect/work around various NV/AMD driver issues. + if ( ( ( m_nIssueStartThreadID != nCurThreadId ) || ( m_nIssueEndThreadID != nCurThreadId ) ) || + ( m_nIssueStartDrawCallIndex == m_nIssueEndDrawCallIndex ) || ( m_nIssueStartFrameIndex != m_nIssueEndFrameIndex ) || + ( m_nIssueStartQueryCreationCounter != m_nIssueEndQueryCreationCounter ) ) + { + // The thread Issue() was called on differs from GetData() - NV's driver doesn't like this, not sure about AMD. Just fake the results if a flush is requested. + // There are various ways to properly handle this scenario, but in practice it only seems to occur in non-critical times (during shutdown or when mat_queue_mode is changed in L4D2). + if ( flush ) + { + gGL->glFlush(); + } + +#if 0 + if ( ( m_nIssueStartThreadID != nCurThreadId ) || ( m_nIssueEndThreadID != nCurThreadId ) ) + { + GLMDebugPrintf( "IDirect3DQuery9::GetData: GetData() called from different thread verses the issueing thread()!\n" ); + } +#endif + if ( m_nIssueStartQueryCreationCounter != m_nIssueEndQueryCreationCounter ) + { + GLMDebugPrintf( "IDirect3DQuery9::GetData: One or more queries have been created or released while this query was still issued! This scenario is not supported in GL.\n"); + } + + // Return with a non-standard error code, so the caller has a chance to do something halfway intelligent. + return D3DERR_NOTAVAILABLE; + } + } + + switch( m_type ) + { + case D3DQUERYTYPE_OCCLUSION: + { + + if ( flush ) + { + uint oqValue = 0; + CFastTimer tm; + tm.Start(); + + + // Is this flush actually necessary? According to the extension it's not. + // It doesn't seem to matter if this is a glFlush() or glFinish() with NVidia's driver (tested in MT mode - not sure if it matters), it still can take several calls to IsDone() before we can stop waiting for the query results. + // On AMD, this flush logic fails during shutdown (the query results never become available) - tried a bunch of experiments and checks with no luck. + + m_query->Complete(&oqValue); + + + double flTotalTime = tm.GetDurationInProgress().GetSeconds() * 1000.0f; + if ( flTotalTime > .5f ) + { + // Give up - something silly has obviously gone wrong in the driver, lying is better than stalling potentially forever. + // This occurs on AMD (single threaded driver) during shutdown, not sure why yet. It has nothing to do with threading. It may have to do with releasing queries or other objects. + // We must return a result otherwise the app itself could hang, waiting infinitely. + //Assert( 0 ); + Warning( "IDirect3DQuery9::GetData(): Occlusion query flush took %3.3fms!\n", flTotalTime ); + } + if (pData) + { + *(uint*)pData = oqValue; + } + result = S_OK; + } + else + { + done = m_query->IsDone(); + if (done) + { + uint oqValue = 0; // or we could just pass pData directly to Complete... + m_query->Complete(&oqValue); + if (pData) + { + *(uint*)pData = oqValue; + } + result = S_OK; + } + else + { + result = S_FALSE; + Assert( !flush ); + } + } + } + break; + + case D3DQUERYTYPE_EVENT: + { + done = m_query->IsDone(); + if ( ( done ) || ( flush ) ) + { + m_query->Complete(NULL); // this will block on pre-SLGU + + result = S_OK; + } + else + { + result = S_FALSE; + Assert( !flush ); + } + } + break; + } + + return result; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DVertexBuffer9 + +#endif + +HRESULT IDirect3DDevice9::CreateVertexBuffer(UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer9** ppVertexBuffer,VD3DHANDLE* pSharedHandle) +{ + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF(( ">-A- IDirect3DDevice9::CreateVertexBuffer" )); + Assert( m_ctx->m_nCurOwnerThreadId == ThreadGetCurrentId() ); + + m_ObjectStats.m_nTotalVertexBuffers++; + + IDirect3DVertexBuffer9 *newbuff = new IDirect3DVertexBuffer9; + + newbuff->m_device = this; + + newbuff->m_ctx = m_ctx; + + // FIXME need to find home or use for the Usage, FVF, Pool values passed in + uint options = 0; + + if (Usage&D3DUSAGE_DYNAMIC) + { + options |= GLMBufferOptionDynamic; + } + + newbuff->m_vtxBuffer = m_ctx->NewBuffer( kGLMVertexBuffer, Length, options ) ; + + newbuff->m_vtxDesc.Type = D3DRTYPE_VERTEXBUFFER; + newbuff->m_vtxDesc.Usage = Usage; + newbuff->m_vtxDesc.Pool = Pool; + newbuff->m_vtxDesc.Size = Length; + + *ppVertexBuffer = newbuff; + + GLMPRINTF(( "<-A- IDirect3DDevice9::CreateVertexBuffer" )); + + return S_OK; +} + +IDirect3DVertexBuffer9::~IDirect3DVertexBuffer9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF(( ">-A- ~IDirect3DVertexBuffer9" )); + + if (m_device) + { + m_device->ReleasedVertexBuffer( this ); + + if (m_ctx && m_vtxBuffer) + { + GLMPRINTF(( ">-A- ~IDirect3DVertexBuffer9 deleting m_vtxBuffer" )); + m_ctx->DelBuffer( m_vtxBuffer ); + m_vtxBuffer = NULL; + GLMPRINTF(( "<-A- ~IDirect3DVertexBuffer9 deleting m_vtxBuffer - done" )); + } + m_device = NULL; + } + + GLMPRINTF(( "<-A- ~IDirect3DVertexBuffer9" )); +} + +HRESULT IDirect3DVertexBuffer9::Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + tmZoneFiltered( TELEMETRY_LEVEL2, 25, TMZF_NONE, "VB Lock" ); + + // FIXME would be good to have "can't lock twice" logic + + Assert( !(Flags & D3DLOCK_READONLY) ); // not impl'd +// Assert( !(Flags & D3DLOCK_NOSYSLOCK) ); // not impl'd - it triggers though + + GLMBuffLockParams lockreq; + lockreq.m_nOffset = OffsetToLock; + lockreq.m_nSize = SizeToLock; + lockreq.m_bNoOverwrite = (Flags & D3DLOCK_NOOVERWRITE) != 0; + lockreq.m_bDiscard = (Flags & D3DLOCK_DISCARD) != 0; + + m_vtxBuffer->Lock( &lockreq, (char**)ppbData ); + + GLMPRINTF(("-X- IDirect3DDevice9::Lock on D3D buf %p (GL name %d) offset %d, size %d => address %p", this, this->m_vtxBuffer->m_nHandle, OffsetToLock, SizeToLock, *ppbData)); + return S_OK; +} + +HRESULT IDirect3DVertexBuffer9::Unlock() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + tmZoneFiltered( TELEMETRY_LEVEL2, 25, TMZF_NONE, "VB Unlock" ); + + m_vtxBuffer->Unlock(); + return S_OK; +} + +void IDirect3DVertexBuffer9::UnlockActualSize( uint nActualSize, const void *pActualData ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + tmZoneFiltered( TELEMETRY_LEVEL2, 25, TMZF_NONE, "VB UnlockActualSize" ); + + m_vtxBuffer->Unlock( nActualSize, pActualData ); +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + + +#ifdef OSX + +#pragma mark ----- IDirect3DIndexBuffer9 + +#endif + +HRESULT IDirect3DDevice9::CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBuffer,VD3DHANDLE* pSharedHandle) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + GLMPRINTF(( ">-A- IDirect3DDevice9::CreateIndexBuffer" )); + + // it is important to save all the create info, since GetDesc could get called later to query it + + m_ObjectStats.m_nTotalIndexBuffers++; + + IDirect3DIndexBuffer9 *newbuff = new IDirect3DIndexBuffer9; + + newbuff->m_device = this; + + newbuff->m_restype = D3DRTYPE_INDEXBUFFER; // hmmmmmmm why are we not derived from d3dresource.. + + newbuff->m_ctx = m_ctx; + + // FIXME need to find home or use for the Usage, Format, Pool values passed in + uint options = 0; + + if (Usage&D3DUSAGE_DYNAMIC) + { + options |= GLMBufferOptionDynamic; + } + + newbuff->m_idxBuffer = m_ctx->NewBuffer( kGLMIndexBuffer, Length, options ) ; + + newbuff->m_idxDesc.Format = Format; + newbuff->m_idxDesc.Type = D3DRTYPE_INDEXBUFFER; + newbuff->m_idxDesc.Usage = Usage; + newbuff->m_idxDesc.Pool = Pool; + newbuff->m_idxDesc.Size = Length; + + *ppIndexBuffer = newbuff; + + GLMPRINTF(( "<-A- IDirect3DDevice9::CreateIndexBuffer" )); + + return S_OK; +} + +IDirect3DIndexBuffer9::~IDirect3DIndexBuffer9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF(( ">-A- ~IDirect3DIndexBuffer9" )); + + if (m_device) + { + m_device->ReleasedIndexBuffer( this ); + + if (m_ctx && m_idxBuffer) + { + GLMPRINTF(( ">-A- ~IDirect3DIndexBuffer9 deleting m_idxBuffer" )); + m_ctx->DelBuffer( m_idxBuffer ); + GLMPRINTF(( "<-A- ~IDirect3DIndexBuffer9 deleting m_idxBuffer - done" )); + } + m_device = NULL; + } + else + { + } + + GLMPRINTF(( "<-A- ~IDirect3DIndexBuffer9" )); +} + + +HRESULT IDirect3DIndexBuffer9::Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + // FIXME would be good to have "can't lock twice" logic + + tmZoneFiltered( TELEMETRY_LEVEL2, 25, TMZF_NONE, "IB Lock" ); + + GLMBuffLockParams lockreq; + lockreq.m_nOffset = OffsetToLock; + lockreq.m_nSize = SizeToLock; + lockreq.m_bNoOverwrite = ( Flags & D3DLOCK_NOOVERWRITE ) != 0; + lockreq.m_bDiscard = ( Flags & D3DLOCK_DISCARD ) != 0; + + m_idxBuffer->Lock( &lockreq, (char**)ppbData ); + + return S_OK; +} + +HRESULT IDirect3DIndexBuffer9::Unlock() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + + tmZoneFiltered( TELEMETRY_LEVEL2, 25, TMZF_NONE, "IB Unlock" ); + + m_idxBuffer->Unlock(); + + return S_OK; +} + +void IDirect3DIndexBuffer9::UnlockActualSize( uint nActualSize, const void *pActualData ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + tmZoneFiltered( TELEMETRY_LEVEL2, 25, TMZF_NONE, "IB UnlockActualSize" ); + + m_idxBuffer->Unlock( nActualSize, pActualData ); +} + +HRESULT IDirect3DIndexBuffer9::GetDesc(D3DINDEXBUFFER_DESC *pDesc) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + *pDesc = m_idxDesc; + return S_OK; +} + + +// ------------------------------------------------------------------------------------------------------------------------------ // + +#ifdef OSX + +#pragma mark ----- IDirect3DDevice9 ------------------------------------------------- + +#endif + +void ConvertPresentationParamsToGLMDisplayParams( D3DPRESENT_PARAMETERS *d3dp, GLMDisplayParams *gldp ) +{ + memset( gldp, 0, sizeof(*gldp) ); + + gldp->m_fsEnable = !d3dp->Windowed; + + // see http://msdn.microsoft.com/en-us/library/ee416515(VS.85).aspx + // note that the values below are the only ones mentioned by Source engine; there are many others + switch(d3dp->PresentationInterval) + { + case D3DPRESENT_INTERVAL_ONE: + gldp->m_vsyncEnable = true; // "The driver will wait for the vertical retrace period (the runtime will beam-follow to prevent tearing)." + break; + + case D3DPRESENT_INTERVAL_IMMEDIATE: + gldp->m_vsyncEnable = false; // "The runtime updates the window client area immediately and might do so more than once during the adapter refresh period." + break; + + default: + gldp->m_vsyncEnable = true; // if I don't know it, you're getting vsync enabled. + break; + } + + gldp->m_backBufferWidth = d3dp->BackBufferWidth; + gldp->m_backBufferHeight = d3dp->BackBufferHeight; + gldp->m_backBufferFormat = d3dp->BackBufferFormat; + gldp->m_multiSampleCount = d3dp->MultiSampleType; // it's a count really + + gldp->m_enableAutoDepthStencil = d3dp->EnableAutoDepthStencil != 0; + gldp->m_autoDepthStencilFormat = d3dp->AutoDepthStencilFormat; + + gldp->m_fsRefreshHz = d3dp->FullScreen_RefreshRateInHz; + + // some fields in d3d PB we're not acting on yet... + // UINT BackBufferCount; + // DWORD MultiSampleQuality; + // D3DSWAPEFFECT SwapEffect; + // VD3DHWND hDeviceWindow; + // DWORD Flags; +} + +void UnpackD3DRSITable( void ); + +HRESULT IDirect3DDevice9::Create( IDirect3DDevice9Params *params ) +{ + g_pD3D_Device = this; + + GLMDebugPrintf( "IDirect3DDevice9::Create: BackBufWidth: %u, BackBufHeight: %u, D3DFMT: %u, BackBufCount: %u, MultisampleType: %u, MultisampleQuality: %u\n", + params->m_presentationParameters.BackBufferWidth, + params->m_presentationParameters.BackBufferHeight, + params->m_presentationParameters.BackBufferFormat, + params->m_presentationParameters.BackBufferCount, + params->m_presentationParameters.MultiSampleType, + params->m_presentationParameters.MultiSampleQuality ); + + UnpackD3DRSITable(); + + m_ObjectStats.clear(); + m_PrevObjectStats.clear(); + +#if GL_BATCH_PERF_ANALYSIS && GL_BATCH_PERF_ANALYSIS_WRITE_PNGS + m_pBatch_vis_bitmap = NULL; +#endif + + GL_BATCH_PERF_CALL_TIMER; + GLMPRINTF((">-X-IDirect3DDevice9::Create")); + HRESULT result = S_OK; + + // create an IDirect3DDevice9 + // make a GLMContext and set up some drawables + m_params = *params; + + m_ctx = NULL; + + V_memset( m_pRenderTargets, 0, sizeof( m_pRenderTargets ) ); + m_pDepthStencil = NULL; + + m_pDefaultColorSurface = NULL; + m_pDefaultDepthStencilSurface = NULL; + + memset( m_streams, 0, sizeof(m_streams) ); + memset( m_vtx_buffers, 0, sizeof( m_vtx_buffers ) ); + memset( m_textures, 0, sizeof(m_textures) ); + //memset( m_samplers, 0, sizeof(m_samplers) ); + + m_indices.m_idxBuffer = NULL; + + m_vertexShader = NULL; + m_pixelShader = NULL; + + m_pVertDecl = NULL; + + //============================================================================ + // param block for GLM context create + GLMDisplayParams glmParams; + ConvertPresentationParamsToGLMDisplayParams( ¶ms->m_presentationParameters, &glmParams ); + + glmParams.m_mtgl = true; // forget this idea -> (params->m_behaviorFlags & D3DCREATE_MULTITHREADED) != 0; + // the call above fills in a bunch of things, but doesn't know about anything outside of the presentation params. + // those tend to be the things that do not change after create, so we do those here in Create. + + glmParams.m_focusWindow = params->m_focusWindow; + + #if 0 //FIXME-HACK + // map the D3D "adapter" to a renderer/display pair + // (that GPU will have to stay set as-is for any subsequent mode changes) + + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + + // the D3D "Adapter" number feeds the fake adapter index + bool adaptResult = GLMgr::aGLMgr()->GetDisplayDB()->GetFakeAdapterInfo( params->m_adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); + Assert(!adaptResult); + + glmParams.m_rendererIndex = glmRendererIndex; + glmParams.m_displayIndex = glmDisplayIndex; + // glmParams.m_modeIndex hmmmmm, client doesn't give us a mode number, just a resolution.. + #endif + + m_ctx = GLMgr::aGLMgr()->NewContext( this, &glmParams ); + if (!m_ctx) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Create (error out)")); + return (HRESULT) -1; + } + + // make an FBO to draw into and activate it. + m_ctx->m_drawingFBO = m_ctx->NewFBO(); + + // bind it to context. will receive attachments shortly. + m_ctx->BindFBOToCtx( m_ctx->m_drawingFBO, GL_FRAMEBUFFER_EXT ); + + m_bFBODirty = false; + + m_pFBOs = new CGLMFBOMap(); + m_pFBOs->SetLessFunc( RenderTargetState_t::LessFunc ); + + // we create two IDirect3DSurface9's. These will be known as the internal render target 0 and the depthstencil. + + GLMPRINTF(("-X- IDirect3DDevice9::Create making color render target...")); + // color surface + result = this->CreateRenderTarget( + m_params.m_presentationParameters.BackBufferWidth, // width + m_params.m_presentationParameters.BackBufferHeight, // height + m_params.m_presentationParameters.BackBufferFormat, // format + m_params.m_presentationParameters.MultiSampleType, // MSAA depth + m_params.m_presentationParameters.MultiSampleQuality, // MSAA quality + true, // lockable + &m_pDefaultColorSurface, // ppSurface + NULL, // shared handle + "InternalRT0" + ); + + if (result != S_OK) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Create (error out)")); + return result; + } + // do not do an AddRef.. + + GLMPRINTF(("-X- IDirect3DDevice9::Create making color render target complete -> %08x", m_pDefaultColorSurface )); + + GLMPRINTF(("-X- IDirect3DDevice9::Create setting color render target...")); + result = this->SetRenderTarget(0, m_pDefaultColorSurface); + if (result != S_OK) + { + GLMPRINTF(("< IDirect3DDevice9::Create (error out)")); + return result; + } + GLMPRINTF(("-X- IDirect3DDevice9::Create setting color render target complete.")); + + Assert (m_params.m_presentationParameters.EnableAutoDepthStencil); + + GLMPRINTF(("-X- IDirect3DDevice9::Create making depth-stencil...")); + result = CreateDepthStencilSurface( + m_params.m_presentationParameters.BackBufferWidth, // width + m_params.m_presentationParameters.BackBufferHeight, // height + m_params.m_presentationParameters.AutoDepthStencilFormat, // format + m_params.m_presentationParameters.MultiSampleType, // MSAA depth + m_params.m_presentationParameters.MultiSampleQuality, // MSAA quality + TRUE, // enable z-buffer discard ???? + &m_pDefaultDepthStencilSurface, // ppSurface + NULL // shared handle + ); + if (result != S_OK) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Create (error out)")); + return result; + } + // do not do an AddRef here.. + + GLMPRINTF(("-X- IDirect3DDevice9::Create making depth-stencil complete -> %08x", m_pDefaultDepthStencilSurface)); + GLMPRINTF(("-X- Direct3DDevice9::Create setting depth-stencil render target...")); + result = this->SetDepthStencilSurface(m_pDefaultDepthStencilSurface); + if (result != S_OK) + { + DXABSTRACT_BREAK_ON_ERROR(); + GLMPRINTF(("<-X- IDirect3DDevice9::Create (error out)")); + return result; + } + GLMPRINTF(("-X- IDirect3DDevice9::Create setting depth-stencil render target complete.")); + + UpdateBoundFBO(); + + bool ready = m_ctx->m_drawingFBO->IsReady(); + if (!ready) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Create (error out)")); + return (HRESULT)-1; + } + + // this next part really needs to be inside GLMContext.. or replaced with D3D style viewport setup calls. + m_ctx->GenDebugFontTex(); + + // blast the gl state mirror... + memset( &this->gl, 0, sizeof( this->gl ) ); + + InitStates(); + + GLScissorEnable_t defScissorEnable = { true }; + GLScissorBox_t defScissorBox = { 0,0, (GLsizei)m_params.m_presentationParameters.BackBufferWidth, (GLsizei)m_params.m_presentationParameters.BackBufferHeight }; + GLViewportBox_t defViewportBox = { 0,0, (GLsizei)m_params.m_presentationParameters.BackBufferWidth, (GLsizei)m_params.m_presentationParameters.BackBufferHeight, m_params.m_presentationParameters.BackBufferWidth | ( m_params.m_presentationParameters.BackBufferHeight << 16 ) }; + GLViewportDepthRange_t defViewportDepthRange = { 0.1, 1000.0 }; + GLCullFaceEnable_t defCullFaceEnable = { true }; + GLCullFrontFace_t defCullFrontFace = { GL_CCW }; + + gl.m_ScissorEnable = defScissorEnable; + gl.m_ScissorBox = defScissorBox; + gl.m_ViewportBox = defViewportBox; + gl.m_ViewportDepthRange = defViewportDepthRange; + gl.m_CullFaceEnable = defCullFaceEnable; + gl.m_CullFrontFace = defCullFrontFace; + + FullFlushStates(); + + GLMPRINTF(("<-X- IDirect3DDevice9::Create complete")); + + // so GetClientRect can return sane answers + //uint width, height; + RenderedSize( m_params.m_presentationParameters.BackBufferWidth, m_params.m_presentationParameters.BackBufferHeight, true ); // true = set + +#if GL_TELEMETRY_GPU_ZONES + g_TelemetryGPUStats.Clear(); +#endif + + GL_BATCH_PERF( + g_nTotalD3DCalls = 0, g_nTotalD3DCycles = 0, m_nBatchVisY = 0, m_nBatchVisFrameIndex = 0, m_nBatchVisFileIdx = 0, m_nNumProgramChanges = 0, m_flTotalD3DTime = 0, m_nTotalD3DCalls = 0, + m_flTotalD3DTime = 0, m_nTotalGLCalls = 0, m_flTotalGLTime = 0, m_nOverallDraws = 0, m_nOverallPrims = 0, m_nOverallD3DCalls = 0, m_flOverallD3DTime = 0, m_nOverallGLCalls = 0, m_flOverallGLTime = 0, m_nOverallProgramChanges = 0, + m_flOverallPresentTime = 0, m_flOverallPresentTimeSquared = 0, m_nOverallPresents = 0, m_flOverallSwapWindowTime = 0, m_flOverallSwapWindowTimeSquared = 0, m_nTotalPrims = 0; ); + + g_nTotalDrawsOrClears = 0; + + gGL->m_nTotalGLCycles = 0; + gGL->m_nTotalGLCalls = 0; + + m_pDummy_vtx_buffer = new CGLMBuffer( m_ctx, kGLMVertexBuffer, 4096, 0 ); + m_vtx_buffers[0] = m_pDummy_vtx_buffer; + m_vtx_buffers[1] = m_pDummy_vtx_buffer; + m_vtx_buffers[2] = m_pDummy_vtx_buffer; + m_vtx_buffers[3] = m_pDummy_vtx_buffer; + + return result; +} + +IDirect3DDevice9::IDirect3DDevice9() : + m_nValidMarker( D3D_DEVICE_VALID_MARKER ) +{ +} +IDirect3DDevice9::~IDirect3DDevice9() +{ + Assert( m_nValidMarker == D3D_DEVICE_VALID_MARKER ); +#if GL_BATCH_PERF_ANALYSIS && GL_BATCH_PERF_ANALYSIS_WRITE_PNGS + delete m_pBatch_vis_bitmap; +#endif + + delete m_pDummy_vtx_buffer; + for ( int i = 0; i < 4; i++ ) + SetRenderTarget( i, NULL ); + SetDepthStencilSurface( NULL ); + if ( m_pDefaultColorSurface ) + { + m_pDefaultColorSurface->Release( 0, "IDirect3DDevice9::~IDirect3DDevice9 release color surface" ); + m_pDefaultColorSurface = NULL; + } + if ( m_pDefaultDepthStencilSurface ) + { + m_pDefaultDepthStencilSurface->Release( 0, "IDirect3DDevice9::~IDirect3DDevice9 release depth surface" ); + m_pDefaultDepthStencilSurface = NULL; + } + + if ( m_pFBOs ) + { + ResetFBOMap(); + } + + GLMPRINTF(( "-D- IDirect3DDevice9::~IDirect3DDevice9 signpost" )); // want to know when this is called, if ever + + g_pD3D_Device = NULL; + if ( m_ObjectStats.m_nTotalFBOs ) GLMDebugPrintf( "Leaking %i FBOs\n", m_ObjectStats.m_nTotalFBOs ); + if ( m_ObjectStats.m_nTotalVertexShaders ) ConMsg( "Leaking %i vertex shaders\n", m_ObjectStats.m_nTotalVertexShaders ); + if ( m_ObjectStats.m_nTotalPixelShaders ) ConMsg( "Leaking %i pixel shaders\n", m_ObjectStats.m_nTotalPixelShaders ); + if ( m_ObjectStats.m_nTotalVertexDecls ) ConMsg( "Leaking %i vertex decls\n", m_ObjectStats.m_nTotalVertexDecls ); + if ( m_ObjectStats.m_nTotalIndexBuffers ) ConMsg( "Leaking %i index buffers\n", m_ObjectStats.m_nTotalIndexBuffers ); + if ( m_ObjectStats.m_nTotalVertexBuffers ) ConMsg( "Leaking %i vertex buffers\n", m_ObjectStats.m_nTotalVertexBuffers ); + if ( m_ObjectStats.m_nTotalTextures ) ConMsg( "Leaking %i textures\n", m_ObjectStats.m_nTotalTextures ); + if ( m_ObjectStats.m_nTotalSurfaces ) ConMsg( "Leaking %i surfaces\n", m_ObjectStats.m_nTotalSurfaces ); + if ( m_ObjectStats.m_nTotalQueries ) ConMsg( "Leaking %i queries\n", m_ObjectStats.m_nTotalQueries ); + if ( m_ObjectStats.m_nTotalRenderTargets ) ConMsg( "Leaking %i render targets\n", m_ObjectStats.m_nTotalRenderTargets ); + GLMgr::aGLMgr()->DelContext( m_ctx ); + m_ctx = NULL; + m_nValidMarker = 0xDEADBEEF; +} + +#ifdef OSX + +#pragma mark ----- Basics - (IDirect3DDevice9) + +#endif + + +HRESULT IDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPresentationParameters) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + Assert( m_nValidMarker == D3D_DEVICE_VALID_MARKER ); + HRESULT result = S_OK; + + // define the task of reset as: + // provide new drawable RT's for the backbuffer (color and depthstencil). + // fix up viewport / scissor.. + // then pass the new presentation parameters through to GLM. + // (it will in turn notify appframework on the next present... which may be very soon, as mode changes are usually spotted inside Present() ). + + // so some of this looks a lot like Create - we're just a subset of what it does. + // with a little work you could refactor this to be common code. + + GLMDebugPrintf( "IDirect3DDevice9::Reset: BackBufWidth: %u, BackBufHeight: %u, D3DFMT: %u, BackBufCount: %u, MultisampleType: %u, MultisampleQuality: %u\n", + pPresentationParameters->BackBufferWidth, + pPresentationParameters->BackBufferHeight, + pPresentationParameters->BackBufferFormat, + pPresentationParameters->BackBufferCount, + pPresentationParameters->MultiSampleType, + pPresentationParameters->MultiSampleQuality ); + + //------------------------------------------------------------------------------- absorb new presentation params.. + + m_params.m_presentationParameters = *pPresentationParameters; + + //------------------------------------------------------------------------------- color buffer.. + // release old color surface if it's there.. + if ( m_pDefaultColorSurface ) + { + ULONG refc = m_pDefaultColorSurface->Release( 0, "IDirect3DDevice9::Reset public release color surface" ); (void)refc; + Assert( !refc ); + m_pDefaultColorSurface = NULL; + } + + GLMPRINTF(("-X- IDirect3DDevice9::Reset making new color render target...")); + + // color surface + result = this->CreateRenderTarget( + m_params.m_presentationParameters.BackBufferWidth, // width + m_params.m_presentationParameters.BackBufferHeight, // height + m_params.m_presentationParameters.BackBufferFormat, // format + m_params.m_presentationParameters.MultiSampleType, // MSAA depth + m_params.m_presentationParameters.MultiSampleQuality, // MSAA quality + true, // lockable + &m_pDefaultColorSurface, // ppSurface + NULL // shared handle + ); + + if ( result != S_OK ) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Reset (error out)")); + return result; + } + // do not do an AddRef here.. + + GLMPRINTF(("-X- IDirect3DDevice9::Reset making color render target complete -> %08x", m_pDefaultColorSurface )); + + GLMPRINTF(("-X- IDirect3DDevice9::Reset setting color render target...")); + + result = this->SetDepthStencilSurface( NULL ); + + result = this->SetRenderTarget( 0, m_pDefaultColorSurface ); + if (result != S_OK) + { + GLMPRINTF(("< IDirect3DDevice9::Reset (error out)")); + return result; + } + GLMPRINTF(("-X- IDirect3DDevice9::Reset setting color render target complete.")); + + + //-------------------------------------------------------------------------------depth stencil buffer + // release old depthstencil surface if it's there.. + if ( m_pDefaultDepthStencilSurface ) + { + ULONG refc = m_pDefaultDepthStencilSurface->Release( 0, "IDirect3DDevice9::Reset public release depthstencil surface" ); (void)refc; + Assert(!refc); + m_pDefaultDepthStencilSurface = NULL; + } + + Assert (m_params.m_presentationParameters.EnableAutoDepthStencil); + + GLMPRINTF(("-X- IDirect3DDevice9::Reset making depth-stencil...")); + result = CreateDepthStencilSurface( + m_params.m_presentationParameters.BackBufferWidth, // width + m_params.m_presentationParameters.BackBufferHeight, // height + m_params.m_presentationParameters.AutoDepthStencilFormat, // format + m_params.m_presentationParameters.MultiSampleType, // MSAA depth + m_params.m_presentationParameters.MultiSampleQuality, // MSAA quality + TRUE, // enable z-buffer discard ???? + &m_pDefaultDepthStencilSurface, // ppSurface + NULL // shared handle + ); + if (result != S_OK) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Reset (error out)")); + return result; + } + // do not do an AddRef here.. + + GLMPRINTF(("-X- IDirect3DDevice9::Reset making depth-stencil complete -> %08x", m_pDefaultDepthStencilSurface)); + + GLMPRINTF(("-X- IDirect3DDevice9::Reset setting depth-stencil render target...")); + result = this->SetDepthStencilSurface(m_pDefaultDepthStencilSurface); + if (result != S_OK) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Reset (error out)")); + return result; + } + GLMPRINTF(("-X- IDirect3DDevice9::Reset setting depth-stencil render target complete.")); + + UpdateBoundFBO(); + + bool ready = m_ctx->m_drawingFBO->IsReady(); + if (!ready) + { + GLMPRINTF(("<-X- IDirect3DDevice9::Reset (error out)")); + return D3DERR_DEVICELOST; + } + + //-------------------------------------------------------------------------------zap viewport and scissor to new backbuffer size + + InitStates(); + + GLScissorEnable_t defScissorEnable = { true }; + GLScissorBox_t defScissorBox = { 0,0, (GLsizei)m_params.m_presentationParameters.BackBufferWidth, (GLsizei)m_params.m_presentationParameters.BackBufferHeight }; + GLViewportBox_t defViewportBox = { 0,0, (GLsizei)m_params.m_presentationParameters.BackBufferWidth, (GLsizei)m_params.m_presentationParameters.BackBufferHeight, m_params.m_presentationParameters.BackBufferWidth | ( m_params.m_presentationParameters.BackBufferHeight << 16 ) }; + GLViewportDepthRange_t defViewportDepthRange = { 0.1, 1000.0 }; + GLCullFaceEnable_t defCullFaceEnable = { true }; + GLCullFrontFace_t defCullFrontFace = { GL_CCW }; + + gl.m_ScissorEnable = defScissorEnable; + gl.m_ScissorBox = defScissorBox; + gl.m_ViewportBox = defViewportBox; + gl.m_ViewportDepthRange = defViewportDepthRange; + gl.m_CullFaceEnable = defCullFaceEnable; + gl.m_CullFrontFace = defCullFrontFace; + + FullFlushStates(); + + //-------------------------------------------------------------------------------finally, propagate new display params to GLM context + GLMDisplayParams glmParams; + ConvertPresentationParamsToGLMDisplayParams( pPresentationParameters, &glmParams ); + + // steal back previously sent focus window... + glmParams.m_focusWindow = m_ctx->m_displayParams.m_focusWindow; + Assert( glmParams.m_focusWindow != NULL ); + + // so GetClientRect can return sane answers + //uint width, height; + RenderedSize( pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight, true ); // true = set + + m_ctx->Reset(); + + m_ctx->SetDisplayParams( &glmParams ); + + return S_OK; +} + +HRESULT IDirect3DDevice9::SetViewport(CONST D3DVIEWPORT9* pViewport) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + GLMPRINTF(("-X- IDirect3DDevice9::SetViewport : minZ %f, maxZ %f",pViewport->MinZ, pViewport->MaxZ )); + + gl.m_ViewportBox.x = pViewport->X; + gl.m_ViewportBox.width = pViewport->Width; + + gl.m_ViewportBox.y = pViewport->Y; + gl.m_ViewportBox.height = pViewport->Height; + + gl.m_ViewportBox.widthheight = pViewport->Width | ( pViewport->Height << 16 ); + + m_ctx->WriteViewportBox( &gl.m_ViewportBox ); + + gl.m_ViewportDepthRange.flNear = pViewport->MinZ; + gl.m_ViewportDepthRange.flFar = pViewport->MaxZ; + m_ctx->WriteViewportDepthRange( &gl.m_ViewportDepthRange ); + + return S_OK; +} + +HRESULT IDirect3DDevice9::GetViewport( D3DVIEWPORT9* pViewport ) +{ + // 7LS - unfinished, used in scaleformuirenderimpl.cpp (only width and height required) + GL_BATCH_PERF_CALL_TIMER; + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + GLMPRINTF(("-X- IDirect3DDevice9::GetViewport " )); + + pViewport->X = gl.m_ViewportBox.x; + pViewport->Width = gl.m_ViewportBox.width; + + pViewport->Y = gl.m_ViewportBox.y; + pViewport->Height = gl.m_ViewportBox.height; + + pViewport->MinZ = gl.m_ViewportDepthRange.flNear; + pViewport->MaxZ = gl.m_ViewportDepthRange.flFar; + + return S_OK; +} + +HRESULT IDirect3DDevice9::BeginScene() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + m_ctx->BeginFrame(); + + return S_OK; +} + +HRESULT IDirect3DDevice9::EndScene() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + m_ctx->EndFrame(); + return S_OK; +} + + +// stolen from glmgrbasics.cpp + +enum ECarbonModKeyIndex +{ + EcmdKeyBit = 8, /* command key down?*/ + EshiftKeyBit = 9, /* shift key down?*/ + EalphaLockBit = 10, /* alpha lock down?*/ + EoptionKeyBit = 11, /* option key down?*/ + EcontrolKeyBit = 12 /* control key down?*/ +}; + +enum ECarbonModKeyMask +{ + EcmdKey = 1 << EcmdKeyBit, + EshiftKey = 1 << EshiftKeyBit, + EalphaLock = 1 << EalphaLockBit, + EoptionKey = 1 << EoptionKeyBit, + EcontrolKey = 1 << EcontrolKeyBit +}; + +void IDirect3DDevice9::PrintObjectStats( const ObjectStats_t &stats ) +{ + ConMsg( "Total FBOs: %i\n", stats.m_nTotalFBOs ); + ConMsg( "Total vertex shaders: %i\n", stats.m_nTotalVertexShaders ); + ConMsg( "Total pixel shaders: %i\n", stats.m_nTotalPixelShaders ); + ConMsg( "Total vertex decls: %i\n", stats.m_nTotalVertexDecls ); + ConMsg( "Total index buffers: %i\n", stats.m_nTotalIndexBuffers ); + ConMsg( "Total vertex buffers: %i\n", stats.m_nTotalVertexBuffers ); + ConMsg( "Total textures: %i\n", stats.m_nTotalTextures ); + ConMsg( "Total surfaces: %i\n", stats.m_nTotalSurfaces ); + ConMsg( "Total queries: %i\n", stats.m_nTotalQueries ); + ConMsg( "Total render targets: %i\n", stats.m_nTotalRenderTargets ); +} + +void IDirect3DDevice9::DumpStatsToConsole( const CCommand *pArgs ) +{ +#if GL_BATCH_PERF_ANALYSIS + ConMsg( "Overall: Batches: %u, Prims: %u, Program Changes: %u\n", m_nOverallDraws, m_nOverallPrims, m_nOverallProgramChanges ); + ConMsg( "Overall: D3D Calls: %u D3D Time: %4.3fms, Avg D3D Time Per Call: %4.9fms\n", m_nOverallD3DCalls, m_flOverallD3DTime, m_nOverallD3DCalls ? ( m_flOverallD3DTime / m_nOverallD3DCalls ) : 0.0f ); + ConMsg( "Overall: GL Calls: %u GL Time: %4.3fms, Avg GL Time Per Call: %4.9fms\n", m_nOverallGLCalls, m_flOverallGLTime, m_nOverallGLCalls ? ( m_flOverallGLTime / m_nOverallGLCalls ) : 0.0f ); + + ConMsg( "D3DPresent: %u, Overall Time: %4.3fms, Avg: %4.6fms, Std Dev: %4.6fms\n", + m_nOverallPresents, + m_flOverallPresentTime, m_nOverallPresents ? ( m_flOverallPresentTime / m_nOverallPresents ) : 0.0f, + m_nOverallPresents ? ( sqrt( ( m_flOverallPresentTimeSquared / m_nOverallPresents ) - ( m_flOverallPresentTime / m_nOverallPresents ) * ( m_flOverallPresentTime / m_nOverallPresents ) ) ) : 0.0f ); + + ConMsg( "GL SwapWindow(): Overall Time: %4.3fms, Avg: %4.6fms, Std Dev: %4.6fms\n", + m_flOverallSwapWindowTime, m_nOverallPresents ? ( m_flOverallSwapWindowTime / m_nOverallPresents ) : 0.0f, + m_nOverallPresents ? ( sqrt( ( m_flOverallSwapWindowTimeSquared / m_nOverallPresents ) - ( m_flOverallSwapWindowTime / m_nOverallPresents ) * ( m_flOverallSwapWindowTime / m_nOverallPresents ) ) ) : 0.0f ); + + if ( ( pArgs ) && ( pArgs->ArgC() == 2 ) && (pArgs->Arg(1)[0] != '0') ) + { + m_nOverallDraws = 0; + m_nOverallPrims = 0; + m_nOverallProgramChanges = 0; + m_nOverallD3DCalls = 0; + m_flOverallD3DTime = 0; + m_nOverallGLCalls = 0; + m_flOverallGLTime = 0; + m_flOverallPresentTime = 0; + m_flOverallPresentTimeSquared = 0; + m_flOverallSwapWindowTime = 0; + m_flOverallSwapWindowTimeSquared = 0; + m_nOverallPresents = 0; + } +#endif + ConMsg( "Totals:\n" ); + m_ObjectStats.m_nTotalFBOs = m_pFBOs->Count(); + PrintObjectStats( m_ObjectStats ); + ObjectStats_t delta( m_ObjectStats ); + delta -= m_PrevObjectStats; + ConMsg( "Delta:\n" ); + PrintObjectStats( delta ); + m_PrevObjectStats = m_ObjectStats; +} + +static void gl_dump_stats_func( const CCommand &args ) +{ + if ( g_pD3D_Device ) + { + g_pD3D_Device->DumpStatsToConsole( &args ); + } +} + +static ConCommand gl_dump_stats( "gl_dump_stats", gl_dump_stats_func ); +#if GLMDEBUG +void IDirect3DDevice9::DumpTextures( const CCommand *pArgs ) +{ + Assert( m_nValidMarker == D3D_DEVICE_VALID_MARKER ); + (void)pArgs; + CGLMTex *pCurTex = g_pFirstCGMLTex; + if ( pCurTex ) + { + Assert( pCurTex->m_pPrevTex == NULL ); + } + ConMsg( "--- Internal CGLMTex's:\n" ); + uint nNumFound = 0; + while ( pCurTex ) + { + nNumFound++; + ConMsg( "Tex \"%s\", Layout: \"%s\", Size: %u, RT: %u, Depth: %u, Stencil: %u, MSAA: %u\n", + pCurTex->m_debugLabel ? pCurTex->m_debugLabel : "?", + pCurTex->m_layout->m_layoutSummary, + pCurTex->m_layout->m_storageTotalSize, + ( pCurTex->m_layout->m_key.m_texFlags & kGLMTexRenderable ) ? 1 : 0, + ( pCurTex->m_layout->m_key.m_texFlags & kGLMTexIsDepth ) ? 1 : 0, + ( pCurTex->m_layout->m_key.m_texFlags & kGLMTexIsStencil ) ? 1 : 0, + ( pCurTex->m_layout->m_key.m_texFlags & kGLMTexMultisampled ) ? 1 : 0 ); + CGLMTex *pNextTex = pCurTex->m_pNextTex; + if ( pNextTex ) + { + Assert( pNextTex->m_pPrevTex == pCurTex ); + } + pCurTex = pNextTex; + } + ConMsg( "--- Found %u total CGLMTex's\n", nNumFound ); +} +static void gl_dump_textures_func( const CCommand &args ) +{ + if ( g_pD3D_Device ) + { + g_pD3D_Device->DumpTextures( &args ); + } +} +static ConCommand gl_dump_textures( "gl_dump_textures", gl_dump_textures_func ); + +#endif + +ConVar gl_blitmode( "gl_blitmode", "1" ); +ConVar dxa_nullrefresh_capslock( "dxa_nullrefresh_capslock", "0" ); + +HRESULT IDirect3DDevice9::Present(CONST RECT* pSourceRect,CONST RECT* pDestRect,VD3DHWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) +{ + GL_BATCH_PERF( g_nTotalD3DCalls++; ) + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + + TOGL_NULL_DEVICE_CHECK; + + if ( m_bFBODirty ) + { + UpdateBoundFBO(); + } + + // before attempting to present a tex, make sure it's been resolved if it was MSAA. + // if we push that responsibility down to m_ctx->Present, it could probably do it without an extra copy. + // i.e. anticipate the blit from the resolvedtex to GL_BACK, and just do that instead. + + // no explicit ResolveTex call first - that got pushed down into GLMContext::Present + +#if GL_BATCH_PERF_ANALYSIS + uint64 nStartGLCycles = gGL->m_nTotalGLCycles; + nStartGLCycles; + + CFastTimer tm; + tm.Start(); +#endif + + m_ctx->Present( m_pDefaultColorSurface->m_tex ); + +#if GL_BATCH_PERF_ANALYSIS + double flPresentTime = tm.GetDurationInProgress().GetMillisecondsF(); + double flGLSwapWindowTime = g_pLauncherMgr->GetPrevGLSwapWindowTime(); + + m_flOverallPresentTime += flPresentTime; + m_flOverallPresentTimeSquared += flPresentTime * flPresentTime; + m_flOverallSwapWindowTime += flGLSwapWindowTime; + m_flOverallSwapWindowTimeSquared += flGLSwapWindowTime * flGLSwapWindowTime; + m_nOverallPresents++; + + uint64 nEndGLCycles = gGL->m_nTotalGLCycles; + nEndGLCycles; + + m_flTotalD3DTime += flPresentTime + g_nTotalD3DCycles * s_rdtsc_to_ms; + m_nTotalD3DCalls += g_nTotalD3DCalls; + + m_flTotalGLTime += gGL->m_nTotalGLCycles * s_rdtsc_to_ms; + m_nTotalGLCalls += gGL->m_nTotalGLCalls; + + m_nOverallProgramChanges += m_nNumProgramChanges; + m_nOverallDraws += g_nTotalDrawsOrClears; + m_nOverallPrims += m_nTotalPrims; + m_nOverallD3DCalls += m_nTotalD3DCalls; + m_flOverallD3DTime += m_flTotalD3DTime; + m_nOverallGLCalls += m_nTotalGLCalls; + m_flOverallGLTime += m_flTotalGLTime; + + static int nPrevBatchVis = -1; + +#if GL_BATCH_PERF_ANALYSIS_WRITE_PNGS + if ((nPrevBatchVis == 1) && m_pBatch_vis_bitmap && m_pBatch_vis_bitmap->is_valid()) + { + double flTotalGLPresentTime = ( nEndGLCycles - nStartGLCycles ) * s_rdtsc_to_ms; + + m_pBatch_vis_bitmap->fill_box(0, m_nBatchVisY, (uint)(.5f + flPresentTime / gl_present_vis_abs_scale.GetFloat() * m_pBatch_vis_bitmap->width()), 10, 255, 16, 128); + m_pBatch_vis_bitmap->additive_fill_box(0, m_nBatchVisY, (uint)(.5f + flTotalGLPresentTime / gl_present_vis_abs_scale.GetFloat() * m_pBatch_vis_bitmap->width()), 10, 0, 255, 128); + m_nBatchVisY += 10; + + uint y = MAX(m_nBatchVisY + 20, 600), l = 0; + m_pBatch_vis_bitmap->draw_formatted_text(0, y+8*(l++), 1, 255, 255, 255, "OpenGL Frame: %u, Batches+Clears: %u, Prims: %u, Program Changes: %u", m_nOverallPresents, g_nTotalDrawsOrClears, m_nTotalPrims, m_nNumProgramChanges ); + m_pBatch_vis_bitmap->draw_formatted_text(0, y+8*(l++), 1, 255, 255, 255, "Frame: D3D Calls: %u, D3D Time: %3.3fms", m_nTotalD3DCalls, m_flTotalD3DTime); + m_pBatch_vis_bitmap->draw_formatted_text(0, y+8*(l++), 1, 255, 255, 255, "Frame: GL Calls: %u, GL Time: %3.3fms", m_nTotalGLCalls, m_flTotalGLTime); + l++; + m_pBatch_vis_bitmap->draw_formatted_text(0, y+8*(l++), 1, 255, 255, 255, "Overall: Batches: %u, Prims: %u, Program Changes: %u", m_nOverallDraws, m_nOverallPrims, m_nOverallProgramChanges ); + m_pBatch_vis_bitmap->draw_formatted_text(0, y+8*(l++), 1, 255, 255, 255, "Overall: D3D Calls: %u D3D Time: %4.3fms", m_nOverallD3DCalls, m_flOverallD3DTime ); + m_pBatch_vis_bitmap->draw_formatted_text(0, y+8*(l++), 1, 255, 255, 255, "Overall: GL Calls: %u GL Time: %4.3fms", m_nOverallGLCalls, m_flOverallGLTime ); + + size_t png_size = 0; + void *pPNG_data = tdefl_write_image_to_png_file_in_memory(m_pBatch_vis_bitmap->get_ptr(), m_pBatch_vis_bitmap->width(), m_pBatch_vis_bitmap->height(), 3, &png_size, true); + if (pPNG_data) + { + char filename[256]; + V_snprintf(filename, sizeof(filename), "left4dead2/batchvis_%u_%u.png", m_nBatchVisFileIdx, m_nBatchVisFrameIndex); + FILE* pFile = fopen(filename, "wb"); + if (pFile) + { + fwrite(pPNG_data, png_size, 1, pFile); + fclose(pFile); + } + free(pPNG_data); + } + m_nBatchVisFrameIndex++; + m_nBatchVisY = 0; + m_pBatch_vis_bitmap->cls(); + } +#endif + + if (nPrevBatchVis != (int)gl_batch_vis.GetBool()) + { + if ( !m_pBatch_vis_bitmap ) + m_pBatch_vis_bitmap = new simple_bitmap; + + nPrevBatchVis = gl_batch_vis.GetBool(); + if (!nPrevBatchVis) + { + DumpStatsToConsole( NULL ); + m_pBatch_vis_bitmap->clear(); + } + else + { + m_pBatch_vis_bitmap->init(768, 1024); + } + m_nBatchVisY = 0; + m_nBatchVisFrameIndex = 0; + m_nBatchVisFileIdx = (uint)time(NULL); //rand(); + + m_nOverallProgramChanges = 0; + m_nOverallDraws = 0; + m_nOverallD3DCalls = 0; + m_flOverallD3DTime = 0; + m_nOverallGLCalls = 0; + m_flOverallGLTime = 0; + m_flOverallPresentTime = 0; + m_flOverallPresentTimeSquared = 0; + m_flOverallSwapWindowTime = 0; + m_flOverallSwapWindowTimeSquared = 0; + m_nOverallPresents = 0; + } + + g_nTotalD3DCycles = 0; + g_nTotalD3DCalls = 0; + gGL->m_nTotalGLCycles = 0; + gGL->m_nTotalGLCalls = 0; + + m_nNumProgramChanges = 0; + m_flTotalD3DTime = 0; + m_nTotalD3DCalls = 0; + m_flTotalGLTime = 0; + m_nTotalGLCalls = 0; + m_nTotalPrims = 0; +#else + if ( gl_batch_vis.GetBool() ) + { + gl_batch_vis.SetValue( false ); + + ConMsg( "Must define GL_BATCH_PERF_ANALYSIS to use this feature" ); + } +#endif + + g_nTotalDrawsOrClears = 0; + +#if GL_TELEMETRY_GPU_ZONES + g_TelemetryGPUStats.Clear(); +#endif + + return S_OK; +} + +#ifdef OSX + +#pragma mark ----- Textures - (IDirect3DDevice9) +#pragma mark ( create functions for each texture are now adjacent to the rest of the methods for each texture class) + +#endif + +HRESULT IDirect3DDevice9::GetTexture(DWORD Stage,IDirect3DBaseTexture9** ppTexture) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + // if implemented, should it increase the ref count ?? + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + + +#ifdef OSX + +#pragma mark ----- RTs and Surfaces - (IDirect3DDevice9) + +#endif + +HRESULT IDirect3DDevice9::CreateRenderTarget(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle, char *pDebugLabel) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + HRESULT result = S_OK; + + m_ObjectStats.m_nTotalSurfaces++; + m_ObjectStats.m_nTotalRenderTargets++; + + IDirect3DSurface9 *surf = new IDirect3DSurface9; + surf->m_restype = D3DRTYPE_SURFACE; + + surf->m_device = this; // always set device on creations! + + GLMTexLayoutKey rtkey; + memset( &rtkey, 0, sizeof(rtkey) ); + + rtkey.m_texGLTarget = GL_TEXTURE_2D; + rtkey.m_xSize = Width; + rtkey.m_ySize = Height; + rtkey.m_zSize = 1; + + rtkey.m_texFormat = Format; + rtkey.m_texFlags = kGLMTexRenderable; + + rtkey.m_texFlags |= kGLMTexSRGB; // all render target tex are SRGB mode + if (m_ctx->Caps().m_cantAttachSRGB) + { + // this config can't support SRGB render targets. quietly turn off the sRGB bit. + rtkey.m_texFlags &= ~kGLMTexSRGB; + } + + if ( (MultiSample !=0) && (!m_ctx->Caps().m_nvG7x) ) + { + rtkey.m_texFlags |= kGLMTexMultisampled; + rtkey.m_texSamples = MultiSample; + // FIXME no support for "MS quality" yet + } + + surf->m_tex = m_ctx->NewTex( &rtkey, 1, pDebugLabel ); + surf->m_face = 0; + surf->m_mip = 0; + + //desc + surf->m_desc.Format = Format; + surf->m_desc.Type = D3DRTYPE_SURFACE; + surf->m_desc.Usage = 0; //FIXME ??????????? + surf->m_desc.Pool = D3DPOOL_DEFAULT; //FIXME ??????????? + surf->m_desc.MultiSampleType = MultiSample; + surf->m_desc.MultiSampleQuality = MultisampleQuality; + surf->m_desc.Width = Width; + surf->m_desc.Height = Height; + + *ppSurface = (result==S_OK) ? surf : NULL; + + #if IUNKNOWN_ALLOC_SPEW + char scratch[1024]; + sprintf(scratch,"RT %s", surf->m_tex->m_layout->m_layoutSummary ); + surf->SetMark( true, scratch ); + #endif + + + return result; +} + +void IDirect3DDevice9::UpdateBoundFBO() +{ + RenderTargetState_t renderTargetState; + for ( uint i = 0; i < 4; i++ ) + { + renderTargetState.m_pRenderTargets[i] = m_pRenderTargets[i] ? m_pRenderTargets[i]->m_tex : NULL; + } + renderTargetState.m_pDepthStencil = m_pDepthStencil ? m_pDepthStencil->m_tex : NULL; + CUtlMap < RenderTargetState_t, CGLMFBO * >::IndexType_t index = m_pFBOs->Find( renderTargetState ); + + if ( m_pFBOs->IsValidIndex( index ) ) + { + Assert( (*m_pFBOs)[index] ); + + m_ctx->m_drawingFBO = (*m_pFBOs)[index]; + } + else + { + CGLMFBO *newFBO = m_ctx->NewFBO(); + + m_pFBOs->Insert( renderTargetState, newFBO ); + + uint nNumBound = 0; + + for ( uint i = 0; i < 4; i++ ) + { + if ( !m_pRenderTargets[i] ) + continue; + + GLMFBOTexAttachParams rtParams; + memset( &rtParams, 0, sizeof(rtParams) ); + + rtParams.m_tex = m_pRenderTargets[i]->m_tex; + rtParams.m_face = m_pRenderTargets[i]->m_face; + rtParams.m_mip = m_pRenderTargets[i]->m_mip; + rtParams.m_zslice = 0; + + newFBO->TexAttach( &rtParams, (EGLMFBOAttachment)(kAttColor0 + i) ); + nNumBound++; + } + + if ( m_pDepthStencil ) + { + GLMFBOTexAttachParams depthParams; + memset( &depthParams, 0, sizeof(depthParams) ); + + depthParams.m_tex = m_pDepthStencil->m_tex; + + EGLMFBOAttachment destAttach = (depthParams.m_tex->m_layout->m_format->m_glDataFormat != 34041) ? kAttDepth : kAttDepthStencil; + + newFBO->TexAttach( &depthParams, destAttach ); + nNumBound++; + } + + (void)nNumBound; + + Assert( nNumBound ); + +#if GLMDEBUG + Assert( newFBO->IsReady() ); +#endif + + m_ctx->m_drawingFBO = newFBO; + } + + m_ctx->BindFBOToCtx( m_ctx->m_drawingFBO, GL_FRAMEBUFFER_EXT ); + + m_bFBODirty = false; +} + +void IDirect3DDevice9::ResetFBOMap() +{ + if ( !m_pFBOs ) + return; + + FOR_EACH_MAP_FAST( (*m_pFBOs), i ) + { + const RenderTargetState_t &rtState = m_pFBOs->Key( i ); (void)rtState; + CGLMFBO *pFBO = (*m_pFBOs)[i]; + + m_ctx->DelFBO( pFBO ); + } + + m_pFBOs->Purge(); + + m_bFBODirty = true; +} + +void IDirect3DDevice9::ScrubFBOMap( CGLMTex *pTex ) +{ + Assert( pTex ); + + if ( !m_pFBOs ) + return; + + CUtlVectorFixed< RenderTargetState_t, 128 > fbosToRemove; + + FOR_EACH_MAP_FAST( (*m_pFBOs), i ) + { + const RenderTargetState_t &rtState = m_pFBOs->Key( i ); + CGLMFBO *pFBO = (*m_pFBOs)[i]; (void)pFBO; + + if ( rtState.RefersTo( pTex ) ) + { + fbosToRemove.AddToTail( rtState ); + } + } + + for ( int i = 0; i < fbosToRemove.Count(); ++i ) + { + const RenderTargetState_t &rtState = fbosToRemove[i]; + + CUtlMap < RenderTargetState_t, CGLMFBO * >::IndexType_t index = m_pFBOs->Find( rtState ); + + if ( !m_pFBOs->IsValidIndex( index ) ) + { + Assert( 0 ); + continue; + } + + CGLMFBO *pFBO = (*m_pFBOs)[index]; + + m_ctx->DelFBO( pFBO ); + + m_pFBOs->RemoveAt( index ); + + m_bFBODirty = true; + } + + //GLMDebugPrintf( "IDirect3DDevice9::ScrubFBOMap: Removed %u entries\n", fbosToRemove.Count() ); +} +HRESULT IDirect3DDevice9::SetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9* pRenderTarget) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "%s", __FUNCTION__ ); + + Assert( RenderTargetIndex < 4 ); + + HRESULT result = S_OK; + + GLMPRINTF(("-F- SetRenderTarget index=%d, surface=%8x (tex=%8x %s)", + RenderTargetIndex, + pRenderTarget, + pRenderTarget ? pRenderTarget->m_tex : NULL, + pRenderTarget ? pRenderTarget->m_tex->m_layout->m_layoutSummary : "" + )); + + // note that it is OK to pass NULL for pRenderTarget, it implies that you would like to detach any color buffer from that target index + + // behaviors... + // if new surf is same as old surf, no change in refcount, in fact, it's early exit + IDirect3DSurface9 *oldTarget = m_pRenderTargets[RenderTargetIndex]; + + if (pRenderTarget == oldTarget) + { + GLMPRINTF(("-F- --> no change",RenderTargetIndex)); + return S_OK; + } + + + // Fix this if porting to x86_64 + if ( m_pRenderTargets[RenderTargetIndex] ) + + + { + + + + + + + + + + + + // we now know that the new surf is not the same as the old surf. + // you can't assume either one is non NULL here though. + + m_pRenderTargets[RenderTargetIndex]->Release( 1, "-A SetRenderTarget private release" ); + } + + if (pRenderTarget) + { + pRenderTarget->AddRef( 1, "+A SetRenderTarget private addref" ); // again, private refcount being raised + } + m_pRenderTargets[RenderTargetIndex] = pRenderTarget; + + m_bFBODirty = true; + +/* + if (!pRenderTarget) + { + GLMPRINTF(("-F- --> Setting NULL render target on index=%d ",RenderTargetIndex)); + } + else + { + GLMPRINTF(("-F- --> attaching index=%d on drawing FBO (%8x)",RenderTargetIndex, m_drawableFBO)); + // attach color to FBO + GLMFBOTexAttachParams rtParams; + memset( &rtParams, 0, sizeof(rtParams) ); + + rtParams.m_tex = pRenderTarget->m_tex; + rtParams.m_face = pRenderTarget->m_face; + rtParams.m_mip = pRenderTarget->m_mip; + rtParams.m_zslice = 0; // FIXME if you ever want to be able to render to slices of a 3D tex.. + + m_drawableFBO->TexAttach( &rtParams, (EGLMFBOAttachment)(kAttColor0 + RenderTargetIndex) ); + } +*/ + +#if GL_BATCH_PERF_ANALYSIS && GL_BATCH_PERF_ANALYSIS_WRITE_PNGS + if ( m_pBatch_vis_bitmap && m_pBatch_vis_bitmap->is_valid() && !RenderTargetIndex ) + { + m_pBatch_vis_bitmap->fill_box(0, m_nBatchVisY, m_pBatch_vis_bitmap->width(), 1, 30, 20, 20); + m_nBatchVisY += 1; + } +#endif + + return result; +} + + +HRESULT IDirect3DDevice9::GetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9** ppRenderTarget) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + if ( !m_pRenderTargets[ RenderTargetIndex ] ) + return D3DERR_NOTFOUND; + + if ( ( RenderTargetIndex > 4 ) || !ppRenderTarget ) + return D3DERR_INVALIDCALL; + + // safe because of early exit on NULL above + m_pRenderTargets[ RenderTargetIndex ]->AddRef(0, "+B GetRenderTarget public addref"); // per http://msdn.microsoft.com/en-us/library/bb174404(VS.85).aspx + + *ppRenderTarget = m_pRenderTargets[ RenderTargetIndex ]; + + return S_OK; +} + +HRESULT IDirect3DDevice9::CreateOffscreenPlainSurface( UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + // set surf->m_restype to D3DRTYPE_SURFACE... + + // this is almost identical to CreateRenderTarget.. + + HRESULT result = S_OK; + + m_ObjectStats.m_nTotalSurfaces++; + m_ObjectStats.m_nTotalRenderTargets++; + + IDirect3DSurface9 *surf = new IDirect3DSurface9; + surf->m_restype = D3DRTYPE_SURFACE; + + surf->m_device = this; // always set device on creations! + + GLMTexLayoutKey rtkey; + memset( &rtkey, 0, sizeof(rtkey) ); + + rtkey.m_texGLTarget = GL_TEXTURE_2D; + rtkey.m_xSize = Width; + rtkey.m_ySize = Height; + rtkey.m_zSize = 1; + + rtkey.m_texFormat = Format; + rtkey.m_texFlags = kGLMTexRenderable; + + surf->m_tex = m_ctx->NewTex( &rtkey, 1, "offscreen plain surface" ); + surf->m_face = 0; + surf->m_mip = 0; + + //desc + surf->m_desc.Format = Format; + surf->m_desc.Type = D3DRTYPE_SURFACE; + surf->m_desc.Usage = 0; + surf->m_desc.Pool = D3DPOOL_DEFAULT; + surf->m_desc.MultiSampleType = D3DMULTISAMPLE_NONE; + surf->m_desc.MultiSampleQuality = 0; + surf->m_desc.Width = Width; + surf->m_desc.Height = Height; + + *ppSurface = (result==S_OK) ? surf : NULL; + + return result; +} + +HRESULT IDirect3DDevice9::CreateDepthStencilSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + Assert( ( Format == D3DFMT_D16 ) || ( Format == D3DFMT_D24X8 ) || ( Format == D3DFMT_D24S8 ) ); + HRESULT result = S_OK; + + m_ObjectStats.m_nTotalSurfaces++; + m_ObjectStats.m_nTotalRenderTargets++; + + IDirect3DSurface9 *surf = new IDirect3DSurface9; + surf->m_restype = D3DRTYPE_SURFACE; + + surf->m_device = this; // always set device on creations! + + GLMTexLayoutKey depthkey; + memset( &depthkey, 0, sizeof(depthkey) ); + + depthkey.m_texGLTarget = GL_TEXTURE_2D; + depthkey.m_xSize = Width; + depthkey.m_ySize = Height; + depthkey.m_zSize = 1; + + depthkey.m_texFormat = Format; + depthkey.m_texFlags = kGLMTexRenderable | kGLMTexIsDepth; + + if ( Format == D3DFMT_D24S8 ) + { + depthkey.m_texFlags |= kGLMTexIsStencil; + } + + if ( (MultiSample !=0) && (!m_ctx->Caps().m_nvG7x) ) + { + depthkey.m_texFlags |= kGLMTexMultisampled; + depthkey.m_texSamples = MultiSample; + // FIXME no support for "MS quality" yet + } + + surf->m_tex = m_ctx->NewTex( &depthkey, 1, "depth-stencil surface" ); + surf->m_face = 0; + surf->m_mip = 0; + + //desc + + surf->m_desc.Format = Format; + surf->m_desc.Type = D3DRTYPE_SURFACE; + surf->m_desc.Usage = 0; //FIXME ??????????? + surf->m_desc.Pool = D3DPOOL_DEFAULT; //FIXME ??????????? + surf->m_desc.MultiSampleType = MultiSample; + surf->m_desc.MultiSampleQuality = MultisampleQuality; + surf->m_desc.Width = Width; + surf->m_desc.Height = Height; + + *ppSurface = (result==S_OK) ? surf : NULL; + + return result; +} + +HRESULT IDirect3DDevice9::SetDepthStencilSurface( IDirect3DSurface9* pNewZStencil ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + HRESULT result = S_OK; + + GLMPRINTF(("-F- SetDepthStencilSurface, surface=%8x (tex=%8x %s)", + pNewZStencil, + pNewZStencil ? pNewZStencil->m_tex : NULL, + pNewZStencil ? pNewZStencil->m_tex->m_layout->m_layoutSummary : "" + )); + + if ( pNewZStencil == m_pDepthStencil ) + { + GLMPRINTF(("-F- --> no change")); + return S_OK; + } + + if ( pNewZStencil ) + { + pNewZStencil->AddRef(1, "+A SetDepthStencilSurface private addref"); + } + + if ( m_pDepthStencil ) + { + // Note this Release() could cause the surface to be deleted! + m_pDepthStencil->Release(1, "-A SetDepthStencilSurface private release"); + } + + m_pDepthStencil = pNewZStencil; + + m_bFBODirty = true; + + return result; +} + +HRESULT IDirect3DDevice9::GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + if ( !ppZStencilSurface ) + { + return D3DERR_INVALIDCALL; + } + + if ( !m_pDepthStencil ) + { + *ppZStencilSurface = NULL; + return D3DERR_NOTFOUND; + } + + m_pDepthStencil->AddRef(0, "+B GetDepthStencilSurface public addref"); // per http://msdn.microsoft.com/en-us/library/bb174384(VS.85).aspx + + *ppZStencilSurface = m_pDepthStencil; + + return S_OK; +} + +HRESULT IDirect3DDevice9::GetRenderTargetData(IDirect3DSurface9* pRenderTarget,IDirect3DSurface9* pDestSurface) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + // is it just a blit ? + + this->StretchRect( pRenderTarget, NULL, pDestSurface, NULL, D3DTEXF_NONE ); // is this good enough ??? + + return S_OK; +} + +HRESULT IDirect3DDevice9::GetFrontBufferData(UINT iSwapChain,IDirect3DSurface9* pDestSurface) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DDevice9::StretchRect(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestSurface,CONST RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + // find relevant slices in GLM tex + + if ( m_bFBODirty ) + { + UpdateBoundFBO(); + } + + CGLMTex *srcTex = pSourceSurface->m_tex; + int srcSliceIndex = srcTex->CalcSliceIndex( pSourceSurface->m_face, pSourceSurface->m_mip ); + GLMTexLayoutSlice *srcSlice = &srcTex->m_layout->m_slices[ srcSliceIndex ]; + + CGLMTex *dstTex = pDestSurface->m_tex; + int dstSliceIndex = dstTex->CalcSliceIndex( pDestSurface->m_face, pDestSurface->m_mip ); + GLMTexLayoutSlice *dstSlice = &dstTex->m_layout->m_slices[ dstSliceIndex ]; + + if ( dstTex->m_rboName != 0 ) + { + Assert(!"No path yet for blitting into an MSAA tex"); + return S_OK; + } + + bool useFastBlit = (gl_blitmode.GetInt() != 0); + + if ( !useFastBlit && (srcTex->m_rboName !=0)) // old way, we do a resolve to scratch tex first (necessitating two step blit) + { + m_ctx->ResolveTex( srcTex, true ); + } + + // set up source/dest rect in GLM form + GLMRect srcRect, dstRect; + + // d3d nomenclature: + // Y=0 is the visual top and also aligned with V=0. + + srcRect.xmin = pSourceRect ? pSourceRect->left : 0; + srcRect.xmax = pSourceRect ? pSourceRect->right : srcSlice->m_xSize; + srcRect.ymin = pSourceRect ? pSourceRect->top : 0; + srcRect.ymax = pSourceRect ? pSourceRect->bottom : srcSlice->m_ySize; + + dstRect.xmin = pDestRect ? pDestRect->left : 0; + dstRect.xmax = pDestRect ? pDestRect->right : dstSlice->m_xSize; + dstRect.ymin = pDestRect ? pDestRect->top : 0; + dstRect.ymax = pDestRect ? pDestRect->bottom : dstSlice->m_ySize; + + GLenum filterGL = 0; + switch(Filter) + { + case D3DTEXF_NONE: + case D3DTEXF_POINT: + filterGL = GL_NEAREST; + break; + + case D3DTEXF_LINEAR: + filterGL = GL_LINEAR; + break; + + default: // D3DTEXF_ANISOTROPIC + Assert(!"Impl aniso stretch"); + break; + } + + if (useFastBlit) + { + m_ctx->Blit2( srcTex, &srcRect, pSourceSurface->m_face, pSourceSurface->m_mip, + dstTex, &dstRect, pDestSurface->m_face, pDestSurface->m_mip, + filterGL + ); + } + else + { + m_ctx->BlitTex( srcTex, &srcRect, pSourceSurface->m_face, pSourceSurface->m_mip, + dstTex, &dstRect, pDestSurface->m_face, pDestSurface->m_mip, + filterGL + ); + } + + return S_OK; +} + + +// This totally sucks, but this information can't be gleaned any +// other way when translating from D3D to GL at this level +// +// This returns a mask, since multiple GLSL "varyings" can be tagged with centroid +static uint32 CentroidMaskFromName( bool bPixelShader, const char *pName ) +{ + // Important note: This code has been customized for TF2 - don't blindly merge it into other branches! + if ( !pName ) + return 0; + + // Important: The centroid bitflags must match between all linked vertex/pixel shaders! + if ( bPixelShader ) + { + if ( V_stristr( pName, "lightmappedgeneric_ps" ) || V_strstr( pName, "worldtwotextureblend_ps" ) ) + { + return (0x01 << 2) | (0x01 << 3); // iterators 2 and 3 + } + else if ( V_stristr( pName, "lightmappedreflective_ps" ) ) + { + return (0x01 << 6) | (0x01 << 7); // iterators 6 and 7 + } + else if ( V_stristr( pName, "water_ps" ) ) + { + return 0xC0; + } + else if ( V_stristr( pName, "shadow_ps" ) ) + { + return 0x1F; + } + else if ( V_stristr( pName, "ShatteredGlass_ps" ) ) + { + return 0xC; + } + else if ( V_stristr( pName, "WorldVertexAlpha_ps" ) || V_stristr( pName, "WorldVertexTransition_ps" ) ) + { + // These pixel shaders want centroid but shouldn't be used + Assert(0); + return 0; + } + else if ( V_stristr( pName, "flashlight_ps" ) ) + { + return 0xC; + } + } + else // vertex shader + { + // Vertex shaders also + if ( V_stristr( pName, "lightmappedgeneric_vs" ) ) + { + return (0x01 << 2) | (0x01 << 3); // iterators 2 and 3 + } + else if ( V_stristr( pName, "lightmappedreflective_vs" ) ) + { + return (0x01 << 6) | (0x01 << 7); // iterators 6 and 7 + } + else if ( V_stristr( pName, "water_vs" ) ) + { + return 0xC0; + } + else if ( V_stristr( pName, "shadow_vs" ) ) + { + return 0x1F; + } + else if ( V_stristr( pName, "ShatteredGlass_vs" ) ) + { + return 0xC; + } + else if ( V_stristr( pName, "flashlight_vs" ) ) + { + return 0xC; + } + } + + // This shader doesn't have any centroid iterators + return 0; +} + + +// This totally sucks, but this information can't be gleaned any +// other way when translating from D3D to GL at this level +static int ShadowDepthSamplerMaskFromName( const char *pName ) +{ + if ( !pName ) + return 0; + + if ( V_stristr( pName, "water_ps" ) ) + { + return (1<<7); + } + else if ( V_stristr( pName, "infected_ps" ) ) + { + return (1<<1); + } + else if ( V_stristr( pName, "phong_ps" ) ) + { + return (1<<4) | (1<<15); + } + else if ( V_stristr( pName, "vertexlit_and_unlit_generic_bump_ps" ) ) + { + return (1<<8) | (1<<15); + } + else if ( V_stristr( pName, "vertexlit_and_unlit_generic_ps" ) ) + { + return (1<<8) | (1<<15); + } + else if ( V_stristr( pName, "eye_refract_ps" ) ) + { + return (1<<6); + } + else if ( V_stristr( pName, "eyes_flashlight_ps" ) ) + { + return (1<<4); + } + else if ( V_stristr( pName, "worldtwotextureblend_ps" ) ) + { + return (1<<7); + } + else if ( V_stristr( pName, "teeth_flashlight_ps" ) ) + { + return (1<<2); + } + else if ( V_stristr( pName, "flashlight_ps" ) ) // substring of above, make sure this comes last!! + { + return (1<<7); + } + else if ( V_stristr( pName, "lightmappedgeneric_ps" ) ) + { + return (1<<15); + } + else if ( V_stristr( pName, "deferred_global_light_ps" ) ) + { + return (1<<14); + } + else if ( V_stristr( pName, "global_lit_simple_ps" ) ) + { + return (1<<14); + } + else if ( V_stristr( pName, "lightshafts_ps" ) ) + { + return (1<<1); + } + else if ( V_stristr( pName, "multiblend_combined_ps" ) ) + { + return (1<<14); + } + else if ( V_stristr( pName, "multiblend_ps" ) ) + { + return (1<<14); + } + else if ( V_stristr( pName, "customhero_ps" ) ) + { + return (1<<14); + } + + // This shader doesn't have a shadow depth map sampler + return 0; +} + +#ifdef OSX + +#pragma mark ----- Pixel Shaders - (IDirect3DDevice9) + +#endif + +HRESULT IDirect3DDevice9::CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixelShader9** ppShader, const char *pShaderName, char *pDebugLabel, const uint32 *pCentroidMask ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + HRESULT result = D3DERR_INVALIDCALL; + *ppShader = NULL; + + int nShadowDepthSamplerMask = ShadowDepthSamplerMaskFromName( pShaderName ); + uint nCentroidMask = CentroidMaskFromName( true, pShaderName ); + + if ( pCentroidMask ) + { + if ( *pCentroidMask != nCentroidMask ) + { + GLMDebugPrintf( "IDirect3DDevice9::CreatePixelShader: shaderapi's centroid mask (0x%08X) differs from mask derived from shader name (0x%08X) for shader %s\n", *pCentroidMask, nCentroidMask, pDebugLabel ); + } + // It would be great if we could use these centroid masks passed in from shaderapi - but unfortunately they're only available for pixel shaders, and we also need to compute matching masks for vertex shaders! + //nCentroidMask = *pCentroidMask; + } + + { + int numTranslations = 1; + + bool bVertexShader = false; + + // we can do one or two translated forms. they go together in a single buffer with some markers to allow GLM to break it up. + // this also lets us mirror each set of translations to disk with a single file making it easier to view and edit side by side. + + int maxTranslationSize = 50000; // size of any one translation + + CUtlBuffer transbuf( 3000, numTranslations * maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); + CUtlBuffer tempbuf( 3000, maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); + + transbuf.PutString( "//GLSLfp\n" ); // this is required so GLM can crack the text apart + + // note the GLSL translator wants its own buffer + tempbuf.EnsureCapacity( maxTranslationSize ); + + uint glslPixelShaderOptions = D3DToGL_OptionUseEnvParams;// | D3DToGL_OptionAllowStaticControlFlow; + + + // Fake SRGB mode - needed on R500, probably indefinitely. + // Do this stuff if caps show m_needsFakeSRGB=true and the sRGBWrite state is true + // (but not if it's engine_post which is special) + + if (!m_ctx->Caps().m_hasGammaWrites) + { + if ( pShaderName ) + { + if ( !V_stristr( pShaderName, "engine_post" ) ) + { + glslPixelShaderOptions |= D3DToGL_OptionSRGBWriteSuffix; + } + } + } + + g_D3DToOpenGLTranslatorGLSL.TranslateShader( (uint32 *) pFunction, &tempbuf, &bVertexShader, glslPixelShaderOptions, nShadowDepthSamplerMask, nCentroidMask, pDebugLabel ); + + transbuf.PutString( (char*)tempbuf.Base() ); + transbuf.PutString( "\n\n" ); // whitespace + + if ( bVertexShader ) + { + // don't cross the streams + Assert(!"Can't accept vertex shader in CreatePixelShader"); + result = D3DERR_INVALIDCALL; + } + else + { + m_ObjectStats.m_nTotalPixelShaders++; + + IDirect3DPixelShader9 *newprog = new IDirect3DPixelShader9; + + newprog->m_pixHighWater = 0; + newprog->m_pixSamplerMask = 0; + newprog->m_pixSamplerTypes = 0; + + newprog->m_pixProgram = m_ctx->NewProgram( kGLMFragmentProgram, (char *)transbuf.Base(), pShaderName ? pShaderName : "?" ) ; + newprog->m_pixProgram->m_nCentroidMask = nCentroidMask; + newprog->m_pixProgram->m_nShadowDepthSamplerMask = nShadowDepthSamplerMask; + + newprog->m_pixProgram->m_bTranslatedProgram = true; + newprog->m_pixProgram->m_maxVertexAttrs = 0; + + newprog->m_device = this; + + //------ find the frag program metadata and extract it.. + + + { + // find the highwater mark + char *highWaterPrefix = "//HIGHWATER-"; // try to arrange this so it can work with pure GLSL if needed + char *highWaterStr = strstr( (char *)transbuf.Base(), highWaterPrefix ); + if (highWaterStr) + { + char *highWaterActualData = highWaterStr + strlen( highWaterPrefix ); + + int value = -1; + sscanf( highWaterActualData, "%d", &value ); + + newprog->m_pixHighWater = value; + newprog->m_pixProgram->m_descs[kGLMGLSL].m_highWater = value; + } + else + { + Assert(!"couldn't find sampler map in pixel shader"); + } + } + + { + // find the sampler map + char *samplerMaskPrefix = "//SAMPLERMASK-"; // try to arrange this so it can work with pure GLSL if needed + + char *samplerMaskStr = strstr( (char *)transbuf.Base(), samplerMaskPrefix ); + if (samplerMaskStr) + { + char *samplerMaskActualData = samplerMaskStr + strlen( samplerMaskPrefix ); + + int value = -1; + sscanf( samplerMaskActualData, "%04x", &value ); + + newprog->m_pixSamplerMask = value; + newprog->m_pixProgram->m_samplerMask = value; // helps GLM maintain a better linked pair cache even when SRGB sampler state changes + + int nMaxReg; + for ( nMaxReg = 31; nMaxReg >= 0; --nMaxReg ) + if ( value & ( 1 << nMaxReg ) ) + break; + + newprog->m_pixProgram->m_maxSamplers = nMaxReg + 1; + + int nNumUsedSamplers = 0; + for ( int i = 31; i >= 0; --i) + if ( value & ( 1 << i ) ) + nNumUsedSamplers++; + newprog->m_pixProgram->m_nNumUsedSamplers = nNumUsedSamplers; + } + else + { + Assert(!"couldn't find sampler map in pixel shader"); + } + } + + { + // find the sampler map + char *samplerTypesPrefix = "//SAMPLERTYPES-"; // try to arrange this so it can work with pure GLSL if needed + + char *samplerTypesStr = strstr( (char *)transbuf.Base(), samplerTypesPrefix ); + if (samplerTypesStr) + { + char *samplerTypesActualData = samplerTypesStr + strlen( samplerTypesPrefix ); + + int value = -1; + sscanf( samplerTypesActualData, "%08x", &value ); + + newprog->m_pixSamplerTypes = value; + newprog->m_pixProgram->m_samplerTypes = value; // helps GLM maintain a better linked pair cache even when SRGB sampler state changes + } + else + { + Assert(!"couldn't find sampler types in pixel shader"); + } + } + + { + // find the fb outputs used by this shader/combo + const GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT }; + + char *fragDataMaskPrefix = "//FRAGDATAMASK-"; + + char *fragDataMaskStr = strstr( (char *)transbuf.Base(), fragDataMaskPrefix ); + if ( fragDataMaskStr ) + { + char *fragDataActualData = fragDataMaskStr + strlen( fragDataMaskPrefix ); + + int value = -1; + sscanf( fragDataActualData, "%04x", &value ); + + newprog->m_pixFragDataMask = value; + newprog->m_pixProgram->m_fragDataMask = value; + + newprog->m_pixProgram->m_numDrawBuffers = 0; + for( int i = 0; i < 4; i++ ) + { + if( newprog->m_pixProgram->m_fragDataMask & ( 1 << i ) ) + { + newprog->m_pixProgram->m_drawBuffers[ newprog->m_pixProgram->m_numDrawBuffers ] = buffers[ i ]; + newprog->m_pixProgram->m_numDrawBuffers++; + } + } + + if( newprog->m_pixProgram->m_numDrawBuffers == 0 ) + { + Assert(!"couldn't find fragment output in pixel shader"); + newprog->m_pixProgram->m_drawBuffers[ 0 ] = buffers[ 0 ]; + newprog->m_pixProgram->m_numDrawBuffers = 1; + } + } + else + { + newprog->m_pixFragDataMask = 0; + newprog->m_pixProgram->m_fragDataMask = 0; + } + + } + + *ppShader = newprog; + + result = S_OK; + } + } + + + return result; +} + +IDirect3DPixelShader9::~IDirect3DPixelShader9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF(( ">-A- ~IDirect3DPixelShader9" )); + + if (m_device) + { + m_device->ReleasedPixelShader( this ); + + if (m_pixProgram) + { + m_pixProgram->m_ctx->DelProgram( m_pixProgram ); + m_pixProgram = NULL; + } + m_device = NULL; + } + + GLMPRINTF(( "<-A- ~IDirect3DPixelShader9" )); +} + + +HRESULT IDirect3DDevice9::SetPixelShaderNonInline(IDirect3DPixelShader9* pShader) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + + m_ctx->SetFragmentProgram( pShader ? pShader->m_pixProgram : NULL ); + m_pixelShader = pShader; + + return S_OK; +} + +HRESULT IDirect3DDevice9::SetPixelShaderConstantFNonInline(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + TOGL_NULL_DEVICE_CHECK; +#if 0 + const uint nRegToWatch = 3; + if ( ( ( StartRegister + Vector4fCount ) > nRegToWatch ) && ( StartRegister <= nRegToWatch ) ) + { + GLMDebugPrintf( "-- %f %f %f %f\n", pConstantData[(nRegToWatch - StartRegister)*4+0], pConstantData[(nRegToWatch - StartRegister)*4+1], pConstantData[(nRegToWatch - StartRegister)*4+2], pConstantData[(nRegToWatch - StartRegister)*4+3] ); + } +#endif + m_ctx->SetProgramParametersF( kGLMFragmentProgram, StartRegister, (float *)pConstantData, Vector4fCount ); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetPixelShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + TOGL_NULL_DEVICE_CHECK; + m_ctx->SetProgramParametersB( kGLMFragmentProgram, StartRegister, (int *)pConstantData, BoolCount ); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetPixelShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + TOGL_NULL_DEVICE_CHECK; + GLMPRINTF(("-X- Ignoring IDirect3DDevice9::SetPixelShaderConstantI call, count was %d", Vector4iCount )); +// m_ctx->SetProgramParametersI( kGLMFragmentProgram, StartRegister, pConstantData, Vector4iCount ); + return S_OK; +} + + +#ifdef OSX + +#pragma mark ----- Vertex Shaders - (IDirect3DDevice9) + +#endif + +HRESULT IDirect3DDevice9::CreateVertexShader(CONST DWORD* pFunction, IDirect3DVertexShader9** ppShader, const char *pShaderName, char *pDebugLabel) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + HRESULT result = D3DERR_INVALIDCALL; + *ppShader = NULL; + + uint32 nCentroidMask = CentroidMaskFromName( false, pShaderName ); + + { + int numTranslations = 1; + + bool bVertexShader = false; + + // we can do one or two translated forms. they go together in a single buffer with some markers to allow GLM to break it up. + // this also lets us mirror each set of translations to disk with a single file making it easier to view and edit side by side. + + int maxTranslationSize = 500000; // size of any one translation + + CUtlBuffer transbuf( 1000, numTranslations * maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); + CUtlBuffer tempbuf( 1000, maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); + + transbuf.PutString( "//GLSLvp\n" ); // this is required so GLM can crack the text apart + + // note the GLSL translator wants its own buffer + tempbuf.EnsureCapacity( maxTranslationSize ); + + uint glslVertexShaderOptions = D3DToGL_OptionUseEnvParams | D3DToGL_OptionDoFixupZ | D3DToGL_OptionDoFixupY; + + if ( m_ctx->Caps().m_hasNativeClipVertexMode ) + { + // note the matched trickery over in IDirect3DDevice9::FlushStates - + // if on a chipset that does no have native gl_ClipVertex support, then + // omit writes to gl_ClipVertex, and instead submit plane equations that have been altered, + // and clipping will take place in GL space using gl_Position instead of gl_ClipVertex. + + // note that this is very much a hack to mate up with ATI R5xx hardware constraints, and with older + // drivers even for later ATI parts like r6xx/r7xx. And it doesn't work on NV parts, so you really + // do have to choose the right way to go. + + glslVertexShaderOptions |= D3DToGL_OptionDoUserClipPlanes; + } + + if ( !CommandLine()->CheckParm("-disableboneuniformbuffers") ) + { + // If using GLSL, enabling a uniform buffer specifically for bone registers. (Not currently supported with ARB shaders, which are not optimized at all anyway.) + glslVertexShaderOptions |= D3DToGL_OptionGenerateBoneUniformBuffer; + } + + g_D3DToOpenGLTranslatorGLSL.TranslateShader( (uint32 *) pFunction, &tempbuf, &bVertexShader, glslVertexShaderOptions, -1, nCentroidMask, pDebugLabel ); + + transbuf.PutString( (char*)tempbuf.Base() ); + transbuf.PutString( "\n\n" ); // whitespace + + if ( !bVertexShader ) + { + // don't cross the streams + Assert(!"Can't accept pixel shader in CreateVertexShader"); + result = D3DERR_INVALIDCALL; + } + else + { + m_ObjectStats.m_nTotalVertexShaders++; + + IDirect3DVertexShader9 *newprog = new IDirect3DVertexShader9; + + newprog->m_device = this; + + newprog->m_vtxProgram = m_ctx->NewProgram( kGLMVertexProgram, (char *)transbuf.Base(), pShaderName ? pShaderName : "?" ) ; + newprog->m_vtxProgram->m_nCentroidMask = nCentroidMask; + + newprog->m_vtxProgram->m_bTranslatedProgram = true; + newprog->m_vtxProgram->m_maxVertexAttrs = 0; + newprog->m_maxVertexAttrs = 0; + + // find the highwater mark.. + + char *highWaterPrefix = "//HIGHWATER-"; // try to arrange this so it can work with pure GLSL if needed + char *highWaterStr = strstr( (char *)transbuf.Base(), highWaterPrefix ); + if (highWaterStr) + { + char *highWaterActualData = highWaterStr + strlen( highWaterPrefix ); + + int value = -1; + sscanf( highWaterActualData, "%d", &value ); + + newprog->m_vtxHighWater = value; + newprog->m_vtxProgram->m_descs[kGLMGLSL].m_highWater = value; + } + else + { + Assert(!"couldn't find highwater mark in vertex shader"); + } + + char *highWaterBonePrefix = "//HIGHWATERBONE-"; // try to arrange this so it can work with pure GLSL if needed + char *highWaterBoneStr = strstr( (char *)transbuf.Base(), highWaterBonePrefix ); + if (highWaterBoneStr) + { + char *highWaterActualData = highWaterBoneStr + strlen( highWaterBonePrefix ); + + int value = -1; + sscanf( highWaterActualData, "%d", &value ); + + newprog->m_vtxHighWaterBone = value; + newprog->m_vtxProgram->m_descs[kGLMGLSL].m_VSHighWaterBone = value; + } + else + { + newprog->m_vtxHighWaterBone = 0; + newprog->m_vtxProgram->m_descs[kGLMGLSL].m_VSHighWaterBone = 0; + } + + // find the attrib map.. + char *attribMapPrefix = "//ATTRIBMAP-"; // try to arrange this so it can work with pure GLSL if needed + char *attribMapStr = strstr( (char *)transbuf.Base(), attribMapPrefix ); + + if (attribMapStr) + { + char *attribMapActualData = attribMapStr + strlen( attribMapPrefix ); + uint nMaxVertexAttribs = 0; + for( int i=0; i<16; i++) + { + int value = -1; + char *dataItem = attribMapActualData + (i*3); + sscanf( dataItem, "%02x", &value ); + if (value >=0) + { + // make sure it's not a terminator + if (value == 0xBB) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + } + else + { + // probably an 'xx'... check + if ( (dataItem[0] != 'x') || (dataItem[1] != 'x') ) + { + DXABSTRACT_BREAK_ON_ERROR(); // bad news + } + else + { + value = 0xBB; // not likely to see one of these... "fog with usage index 11" + } + } + + if ( value != 0xBB ) + nMaxVertexAttribs = i; + + newprog->m_vtxAttribMap[i] = value; + } + + newprog->m_vtxProgram->m_maxVertexAttrs = nMaxVertexAttribs + 1; + newprog->m_maxVertexAttrs = nMaxVertexAttribs + 1; + } + else + { + DXABSTRACT_BREAK_ON_ERROR(); // that's bad... + } + + *ppShader = newprog; + + result = S_OK; + } + } + + return result; +} + +IDirect3DVertexShader9::~IDirect3DVertexShader9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF(( ">-A- ~IDirect3DVertexShader9" )); + + if (m_device) + { + m_device->ReleasedVertexShader( this ); + + if (m_vtxProgram) + { + m_vtxProgram->m_ctx->DelProgram( m_vtxProgram ); + m_vtxProgram = NULL; + } + m_device = NULL; + } + else + { + } + + + GLMPRINTF(( "<-A- ~IDirect3DVertexShader9" )); +} + +HRESULT IDirect3DDevice9::SetVertexShaderNonInline(IDirect3DVertexShader9* pShader) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + m_ctx->SetVertexProgram( pShader ? pShader->m_vtxProgram : NULL ); + m_vertexShader = pShader; + return S_OK; +} + +HRESULT IDirect3DDevice9::SetVertexShaderConstantFNonInline(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount) // groups of 4 floats! +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + TOGL_NULL_DEVICE_CHECK; + m_ctx->SetProgramParametersF( kGLMVertexProgram, StartRegister, (float *)pConstantData, Vector4fCount ); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetVertexShaderConstantBNonInline(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount) // individual bool count! +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + TOGL_NULL_DEVICE_CHECK; + m_ctx->SetProgramParametersB( kGLMVertexProgram, StartRegister, (int *)pConstantData, BoolCount ); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetVertexShaderConstantINonInline(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount) // groups of 4 ints! +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + TOGL_NULL_DEVICE_CHECK; + m_ctx->SetProgramParametersI( kGLMVertexProgram, StartRegister, (int *)pConstantData, Vector4iCount ); + return S_OK; +} + +#ifdef OSX + +#pragma mark ----- Shader Pairs - (IDirect3DDevice9) + +#endif + +// callers need to ifdef POSIX this, because this method does not exist on real DX9 +HRESULT IDirect3DDevice9::LinkShaderPair( IDirect3DVertexShader9* vs, IDirect3DPixelShader9* ps ) +{ + GL_BATCH_PERF_CALL_TIMER; + // these are really GLSL "shaders" not "programs" but the old reference to "program" persists due to the assembler heritage + if (vs->m_vtxProgram && ps->m_pixProgram) + { + m_ctx->LinkShaderPair( vs->m_vtxProgram, ps->m_pixProgram ); + } + return S_OK; +} + +HRESULT IDirect3DDevice9::ValidateShaderPair( IDirect3DVertexShader9* vs, IDirect3DPixelShader9* ps ) +{ + GL_BATCH_PERF_CALL_TIMER; + // these are really GLSL "shaders" not "programs" but the old reference to "program" persists due to the assembler heritage + if (vs->m_vtxProgram && ps->m_pixProgram) + { + m_ctx->ValidateShaderPair( vs->m_vtxProgram, ps->m_pixProgram ); + } + return S_OK; +} + +// callers need to ifdef POSIX this, because this method does not exist on real DX9 +// +HRESULT IDirect3DDevice9::QueryShaderPair( int index, GLMShaderPairInfo *infoOut ) +{ + GL_BATCH_PERF_CALL_TIMER; + // these are really GLSL "shaders" not "programs" ... + + m_ctx->QueryShaderPair( index, infoOut ); + + return S_OK; +} + + +#ifdef OSX + +#pragma mark ----- Vertex Buffers and Vertex Declarations - (IDirect3DDevice9) + +#endif + +HRESULT IDirect3DDevice9::CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements,IDirect3DVertexDeclaration9** ppDecl) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + *ppDecl = NULL; + + // the goal here is to arrive at something which lets us quickly generate GLMVertexSetups. + + // the information we don't have, that must be inferred from the decls, is: + // -> how many unique streams (buffers) are used - pure curiosity + // -> what the stride and offset is for each decl. Size you can figure out on the spot, stride requires surveying all the components in each stream first. + // so init an array of per-stream offsets to 0. + // each one is a cursor that gets bumped by decls. + uint streamOffsets[ D3D_MAX_STREAMS ]; + uint streamCount = 0; + + uint attribMap[16]; + uint attribMapIndex = 0; + memset( attribMap, 0xFF, sizeof( attribMap ) ); + + memset( streamOffsets, 0, sizeof( streamOffsets ) ); + + m_ObjectStats.m_nTotalVertexDecls++; + + IDirect3DVertexDeclaration9 *decl9 = new IDirect3DVertexDeclaration9; + decl9->m_device = this; + + decl9->m_elemCount = 0; + + for (const D3DVERTEXELEMENT9 *src = pVertexElements; (src->Stream != 0xFF); src++) + { + // element + D3DVERTEXELEMENT9_GL *elem = &decl9->m_elements[ decl9->m_elemCount++ ]; + + // copy the D3D decl wholesale. + elem->m_dxdecl = *src; + + // latch current offset in this stream. + elem->m_gldecl.m_offset = streamOffsets[ elem->m_dxdecl.Stream ]; + + // figure out size of this attr and move the cursor + // if cursor was on zero, bump the active stream count + + if (!streamOffsets[ elem->m_dxdecl.Stream ]) + streamCount++; + + int bytes = 0; + switch( elem->m_dxdecl.Type ) + { + case D3DDECLTYPE_FLOAT1: elem->m_gldecl.m_nCompCount = 1; elem->m_gldecl.m_datatype = GL_FLOAT; elem->m_gldecl.m_normalized=0; bytes = 4; break; + case D3DDECLTYPE_FLOAT2: elem->m_gldecl.m_nCompCount = 2; elem->m_gldecl.m_datatype = GL_FLOAT; elem->m_gldecl.m_normalized=0; bytes = 8; break; + + //case D3DVSDT_FLOAT3: + case D3DDECLTYPE_FLOAT3: elem->m_gldecl.m_nCompCount = 3; elem->m_gldecl.m_datatype = GL_FLOAT; elem->m_gldecl.m_normalized=0; bytes = 12; break; + + //case D3DVSDT_FLOAT4: + case D3DDECLTYPE_FLOAT4: elem->m_gldecl.m_nCompCount = 4; elem->m_gldecl.m_datatype = GL_FLOAT; elem->m_gldecl.m_normalized=0; bytes = 16; break; + + // case D3DVSDT_UBYTE4: + case D3DDECLTYPE_D3DCOLOR: + case D3DDECLTYPE_UBYTE4: + case D3DDECLTYPE_UBYTE4N: + + // Force this path since we're on 10.6.2 and can't rely on EXT_vertex_array_bgra + if ( 1 ) + { + // pass 4 UB's but we know this is out of order compared to D3DCOLOR data + elem->m_gldecl.m_nCompCount = 4; elem->m_gldecl.m_datatype = GL_UNSIGNED_BYTE; + } + else + { + // pass a GL BGRA color courtesy of http://www.opengl.org/registry/specs/ARB/vertex_array_bgra.txt + elem->m_gldecl.m_nCompCount = GL_BGRA; elem->m_gldecl.m_datatype = GL_UNSIGNED_BYTE; + } + + elem->m_gldecl.m_normalized = ( (elem->m_dxdecl.Type == D3DDECLTYPE_D3DCOLOR) || + (elem->m_dxdecl.Type == D3DDECLTYPE_UBYTE4N) ); + + bytes = 4; + break; + + case D3DDECLTYPE_SHORT2: + // pass 2 US's but we know this is out of order compared to D3DCOLOR data + elem->m_gldecl.m_nCompCount = 2; elem->m_gldecl.m_datatype = GL_SHORT; + + elem->m_gldecl.m_normalized = 0; + bytes = 4; + break; + + default: DXABSTRACT_BREAK_ON_ERROR(); return D3DERR_INVALIDCALL; break; + + /* + typedef enum _D3DDECLTYPE + { + D3DDECLTYPE_FLOAT1 = 0, // 1D float expanded to (value, 0., 0., 1.) + D3DDECLTYPE_FLOAT2 = 1, // 2D float expanded to (value, value, 0., 1.) + D3DDECLTYPE_FLOAT3 = 2, // 3D float expanded to (value, value, value, 1.) + D3DDECLTYPE_FLOAT4 = 3, // 4D float + D3DDECLTYPE_D3DCOLOR = 4, // 4D packed unsigned bytes mapped to 0. to 1. range + // Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A) + D3DDECLTYPE_UBYTE4 = 5, // 4D unsigned byte + D3DDECLTYPE_SHORT2 = 6, // 2D signed short expanded to (value, value, 0., 1.) + D3DDECLTYPE_SHORT4 = 7, // 4D signed short + + // The following types are valid only with vertex shaders >= 2.0 + + + D3DDECLTYPE_UBYTE4N = 8, // Each of 4 bytes is normalized by dividing to 255.0 + D3DDECLTYPE_SHORT2N = 9, // 2D signed short normalized (v[0]/32767.0,v[1]/32767.0,0,1) + D3DDECLTYPE_SHORT4N = 10, // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0) + D3DDECLTYPE_USHORT2N = 11, // 2D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,0,1) + D3DDECLTYPE_USHORT4N = 12, // 4D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,v[2]/65535.0,v[3]/65535.0) + D3DDECLTYPE_UDEC3 = 13, // 3D unsigned 10 10 10 format expanded to (value, value, value, 1) + D3DDECLTYPE_DEC3N = 14, // 3D signed 10 10 10 format normalized and expanded to (v[0]/511.0, v[1]/511.0, v[2]/511.0, 1) + D3DDECLTYPE_FLOAT16_2 = 15, // Two 16-bit floating point values, expanded to (value, value, 0, 1) + D3DDECLTYPE_FLOAT16_4 = 16, // Four 16-bit floating point values + D3DDECLTYPE_UNUSED = 17, // When the type field in a decl is unused. + } D3DDECLTYPE; + */ + } + + // write the offset and move the cursor + elem->m_gldecl.m_offset = streamOffsets[elem->m_dxdecl.Stream]; + streamOffsets[ elem->m_dxdecl.Stream ] += bytes; + + // cannot write m_stride yet, so zero it + elem->m_gldecl.m_stride = 0; + + elem->m_gldecl.m_pBuffer = NULL; // must be filled in at draw time.. + + // elem count was already bumped. + + // update attrib map + attribMap[ attribMapIndex++ ] = (elem->m_dxdecl.Usage << 4) | (elem->m_dxdecl.UsageIndex); + } + // the loop is done, we now know how many active streams there are, how many atribs are active in the declaration, + // and how big each one is in terms of stride. + + // all that is left is to go back and write the strides - the stride comes from the stream offset cursors accumulated earlier. + for( uint j=0; j< decl9->m_elemCount; j++) + { + D3DVERTEXELEMENT9_GL *elem = &decl9->m_elements[ j ]; + + elem->m_gldecl.m_stride = streamOffsets[ elem->m_dxdecl.Stream ]; + } + + memset( decl9->m_VertexAttribDescToStreamIndex, 0xFF, sizeof( decl9->m_VertexAttribDescToStreamIndex ) ); + D3DVERTEXELEMENT9_GL *pDeclElem = decl9->m_elements; + for( uint j = 0; j < decl9->m_elemCount; j++, pDeclElem++) + { + uint nPackedVertexAttribDesc = ( pDeclElem->m_dxdecl.Usage << 4 ) | pDeclElem->m_dxdecl.UsageIndex; + if ( nPackedVertexAttribDesc == 0xBB ) + { + // 0xBB is a reserved packed vertex attrib value - shouldn't encounter in practice + DXABSTRACT_BREAK_ON_ERROR(); + } + decl9->m_VertexAttribDescToStreamIndex[ nPackedVertexAttribDesc ] = j; + } + + *ppDecl = decl9; + + return S_OK; +} + +IDirect3DVertexDeclaration9::~IDirect3DVertexDeclaration9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF(("-A- ~IDirect3DVertexDeclaration9 signpost")); + + m_device->ReleasedVertexDeclaration( this ); +} + +HRESULT IDirect3DDevice9::SetVertexDeclarationNonInline(IDirect3DVertexDeclaration9* pDecl) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + m_pVertDecl = pDecl; + return S_OK; +} + +HRESULT IDirect3DDevice9::SetFVF(DWORD FVF) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DDevice9::GetFVF(DWORD* pFVF) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + + +#ifdef OSX + +#pragma mark ----- Vertex Buffers and Streams - (IDirect3DDevice9) + +#pragma mark ----- Create function moved to be adjacent to other buffer methods + +#endif + +HRESULT IDirect3DDevice9::SetStreamSourceNonInline(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + Assert( StreamNumber < D3D_MAX_STREAMS ); + Assert( ( Stride & 3 ) == 0 ); // we support non-DWORD aligned strides, but on some drivers (like AMD's) perf goes off a cliff + + // perfectly legal to see a vertex buffer of NULL get passed in here. + // so we need an array to track these. + // OK, we are being given the stride, we don't need to calc it.. + + GLMPRINTF(("-X- IDirect3DDevice9::SetStreamSource setting stream #%d to D3D buf %p (GL name %d); offset %d, stride %d", StreamNumber, pStreamData, (pStreamData) ? pStreamData->m_vtxBuffer->m_nHandle: -1, OffsetInBytes, Stride)); + + if ( !pStreamData ) + { + OffsetInBytes = 0; + Stride = 0; + + m_vtx_buffers[ StreamNumber ] = m_pDummy_vtx_buffer; + } + else + { + // We do not support strides of 0 + Assert( Stride > 0 ); + m_vtx_buffers[ StreamNumber ] = pStreamData->m_vtxBuffer; + } + + m_streams[ StreamNumber ].m_vtxBuffer = pStreamData; + m_streams[ StreamNumber ].m_offset = OffsetInBytes; + m_streams[ StreamNumber ].m_stride = Stride; + + return S_OK; +} + +#ifdef OSX + +#pragma mark ----- Index Buffers - (IDirect3DDevice9) +#pragma mark ----- Creatue function relocated to be adjacent to the rest of the index buffer methods + +#endif + +HRESULT IDirect3DDevice9::SetIndicesNonInline(IDirect3DIndexBuffer9* pIndexData) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + // just latch it. + m_indices.m_idxBuffer = pIndexData; + + return S_OK; +} + + +#ifdef OSX + +#pragma mark ----- Release Handlers - (IDirect3DDevice9) + +#endif + +void IDirect3DDevice9::ReleasedVertexDeclaration( IDirect3DVertexDeclaration9 *pDecl ) +{ + m_ctx->ClearCurAttribs(); + + Assert( m_ObjectStats.m_nTotalVertexDecls >= 1 ); + m_ObjectStats.m_nTotalVertexDecls--; +} + +void IDirect3DDevice9::ReleasedTexture( IDirect3DBaseTexture9 *baseTex ) +{ + GL_BATCH_PERF_CALL_TIMER; + TOGL_NULL_DEVICE_CHECK_RET_VOID; + + // see if this texture is referenced in any of the texture units and scrub it if so. + for( int i=0; i< GLM_SAMPLER_COUNT; i++) + { + if (m_textures[i] == baseTex) + { + m_textures[i] = NULL; + m_ctx->SetSamplerTex( i, NULL ); // texture sets go straight through to GLM, no dirty bit + } + } +} + +void IDirect3DDevice9::ReleasedCGLMTex( CGLMTex *pTex) +{ + GL_BATCH_PERF_CALL_TIMER; + TOGL_NULL_DEVICE_CHECK_RET_VOID; + + ScrubFBOMap( pTex ); + if ( pTex->m_layout ) + { + if ( pTex->m_layout->m_key.m_texFlags & kGLMTexRenderable ) + { + Assert( m_ObjectStats.m_nTotalRenderTargets >= 1 ); + m_ObjectStats.m_nTotalRenderTargets--; + } + } +} +void IDirect3DDevice9::ReleasedSurface( IDirect3DSurface9 *pSurface ) +{ + for( int i = 0; i < 4; i++ ) + { + if ( m_pRenderTargets[i] == pSurface ) + { + // this was a surprise release... scrub it + m_pRenderTargets[i] = NULL; + m_bFBODirty = true; + GLMPRINTF(( "-A- Scrubbed pSurface %08x from m_pRenderTargets[%d]", pSurface, i )); + } + } + + if ( m_pDepthStencil == pSurface ) + { + m_pDepthStencil = NULL; + m_bFBODirty = true; + GLMPRINTF(( "-A- Scrubbed pSurface %08x from m_pDepthStencil", pSurface )); + } + + if ( m_pDefaultColorSurface == pSurface ) + { + m_pDefaultColorSurface = NULL; + GLMPRINTF(( "-A- Scrubbed pSurface %08x from m_pDefaultColorSurface", pSurface )); + } + + if ( m_pDefaultDepthStencilSurface == pSurface ) + { + m_pDefaultDepthStencilSurface = NULL; + GLMPRINTF(( "-A- Scrubbed pSurface %08x from m_pDefaultDepthStencilSurface", pSurface )); + } + + Assert( m_ObjectStats.m_nTotalSurfaces >= 1 ); + m_ObjectStats.m_nTotalSurfaces--; +} + +void IDirect3DDevice9::ReleasedPixelShader( IDirect3DPixelShader9 *pixelShader ) +{ + if ( m_pixelShader == pixelShader ) + { + m_pixelShader = NULL; + GLMPRINTF(( "-A- Scrubbed pixel shader %08x from m_pixelShader", pixelShader )); + } + m_ctx->ReleasedShader(); + + Assert( m_ObjectStats.m_nTotalPixelShaders >= 1 ); + m_ObjectStats.m_nTotalPixelShaders--; +} + +void IDirect3DDevice9::ReleasedVertexShader( IDirect3DVertexShader9 *vertexShader ) +{ + if ( m_vertexShader == vertexShader ) + { + m_vertexShader = NULL; + GLMPRINTF(( "-A- Scrubbed vertex shader %08x from m_vertexShader", vertexShader )); + } + m_ctx->ClearCurAttribs(); + m_ctx->ReleasedShader(); + + Assert( m_ObjectStats.m_nTotalVertexShaders >= 1 ); + m_ObjectStats.m_nTotalVertexShaders--; +} + +void IDirect3DDevice9::ReleasedVertexBuffer( IDirect3DVertexBuffer9 *vertexBuffer ) +{ + for (int i=0; i< D3D_MAX_STREAMS; i++) + { + if ( m_streams[i].m_vtxBuffer == vertexBuffer ) + { + m_streams[i].m_vtxBuffer = NULL; + m_vtx_buffers[i] = m_pDummy_vtx_buffer; + + GLMPRINTF(( "-A- Scrubbed vertex buffer %08x from m_streams[%d]", vertexBuffer, i )); + } + } + m_ctx->ClearCurAttribs(); + + Assert( m_ObjectStats.m_nTotalVertexBuffers >= 1 ); + m_ObjectStats.m_nTotalVertexBuffers--; +} + +void IDirect3DDevice9::ReleasedIndexBuffer( IDirect3DIndexBuffer9 *indexBuffer ) +{ + if ( m_indices.m_idxBuffer == indexBuffer ) + { + m_indices.m_idxBuffer = NULL; + GLMPRINTF(( "-A- Scrubbed index buffer %08x from m_indices", indexBuffer )); + } + + Assert( m_ObjectStats.m_nTotalIndexBuffers >= 1 ); + m_ObjectStats.m_nTotalIndexBuffers--; +} + + +void IDirect3DDevice9::ReleasedQuery( IDirect3DQuery9 *query ) +{ + Assert( m_ObjectStats.m_nTotalQueries >= 1 ); + m_ObjectStats.m_nTotalQueries--; +} + +#ifdef OSX + +#pragma mark ----- Queries - (IDirect3DDevice9) + +#endif + +// note that detection of whether queries are supported is done by trying to create one. +// so for GL, be observant here of whether we have that capability or not. +// pretty much have this everywhere but i950. + +HRESULT IDirect3DDevice9::CreateQuery(D3DQUERYTYPE Type,IDirect3DQuery9** ppQuery) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + if (m_ctx->Caps().m_hasOcclusionQuery) + { + m_ObjectStats.m_nTotalQueries++; + + IDirect3DQuery9 *newquery = new IDirect3DQuery9; + + newquery->m_device = this; + + newquery->m_type = Type; + newquery->m_ctx = m_ctx; + newquery->m_nIssueStartThreadID = 0; + newquery->m_nIssueEndThreadID = 0; + newquery->m_nIssueStartDrawCallIndex = 0; + newquery->m_nIssueEndDrawCallIndex = 0; + + GLMQueryParams params; + memset( ¶ms, 0, sizeof(params) ); + + //bool known = false; + switch(newquery->m_type) + { + case D3DQUERYTYPE_OCCLUSION: /* D3DISSUE_BEGIN, D3DISSUE_END */ + // create an occlusion query + params.m_type = EOcclusion; + break; + + case D3DQUERYTYPE_EVENT: /* D3DISSUE_END */ + params.m_type = EFence; + break; + + case D3DQUERYTYPE_RESOURCEMANAGER: /* D3DISSUE_END */ + case D3DQUERYTYPE_TIMESTAMP: /* D3DISSUE_END */ + case D3DQUERYTYPE_TIMESTAMPFREQ: /* D3DISSUE_END */ + case D3DQUERYTYPE_INTERFACETIMINGS: /* D3DISSUE_BEGIN, D3DISSUE_END */ + case D3DQUERYTYPE_PIXELTIMINGS: /* D3DISSUE_BEGIN, D3DISSUE_END */ + case D3DQUERYTYPE_CACHEUTILIZATION: /* D3DISSUE_BEGIN, D3DISSUE_END */ + Assert( !"Un-implemented query type" ); + break; + + default: + Assert( !"Unknown query type" ); + break; + } + newquery->m_query = m_ctx->NewQuery( ¶ms ); + + *ppQuery = newquery; + return S_OK; + } + else + { + *ppQuery = NULL; + return -1; // failed + } + +} + +IDirect3DQuery9::~IDirect3DQuery9() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( m_device ); + GLMPRINTF((">-A- ~IDirect3DQuery9")); + + if (m_device) + { + m_device->ReleasedQuery( this ); + + if (m_query) + { + GLMPRINTF((">-A- ~IDirect3DQuery9 freeing m_query")); + + m_query->m_ctx->DelQuery( m_query ); + m_query = NULL; + + GLMPRINTF(("<-A- ~IDirect3DQuery9 freeing m_query done")); + } + m_device = NULL; + } + + GLMPRINTF(("<-A- ~IDirect3DQuery9")); +} + +#ifdef OSX + +#pragma mark ----- Render States - (IDirect3DDevice9) + +#endif + +#define D3DRS_VALUE_LIMIT 210 + +struct D3D_RSINFO +{ + int m_class; + D3DRENDERSTATETYPE m_state; + DWORD m_defval; + // m_class runs 0-3. + // 3 = must implement - fully general - "obey" + // 2 = implement setup to the default value (it has a GL effect but does not change later) "obey once" + // 1 = "fake implement" setup to the default value no GL effect, debug break if anything but default value comes through - "ignore" + // 0 = game never ever sets this one, break if someone even tries. "complain" +}; + +D3D_RSINFO g_D3DRS_INFO_unpacked[ D3DRS_VALUE_LIMIT+1 ]; + +#ifdef D3D_RSI + #error macro collision... rename this +#else + #define D3D_RSI(nclass,nstate,ndefval) { nclass, nstate, ndefval } +#endif + +// FP conversions to hex courtesy of http://babbage.cs.qc.cuny.edu/IEEE-754/Decimal.html +#define CONST_DZERO 0x00000000 +#define CONST_DONE 0x3F800000 +#define CONST_D64 0x42800000 +#define DONT_KNOW_YET 0x31415926 + + +// see http://www.toymaker.info/Games/html/render_states.html + +D3D_RSINFO g_D3DRS_INFO_packed[] = +{ + // these do not have to be in any particular order. they get unpacked into the empty array above for direct indexing. + + D3D_RSI( 3, D3DRS_ZENABLE, DONT_KNOW_YET ), // enable Z test (or W buffering) + D3D_RSI( 3, D3DRS_ZWRITEENABLE, DONT_KNOW_YET ), // enable Z write + D3D_RSI( 3, D3DRS_ZFUNC, DONT_KNOW_YET ), // select Z func + + D3D_RSI( 3, D3DRS_COLORWRITEENABLE, TRUE ), // see transitiontable.cpp "APPLY_RENDER_STATE_FUNC( D3DRS_COLORWRITEENABLE, ColorWriteEnable )" + + D3D_RSI( 3, D3DRS_CULLMODE, D3DCULL_CCW ), // backface cull control + + D3D_RSI( 3, D3DRS_ALPHABLENDENABLE, DONT_KNOW_YET ), // ->CTransitionTable::ApplySeparateAlphaBlend and ApplyAlphaBlend + D3D_RSI( 3, D3DRS_BLENDOP, D3DBLENDOP_ADD ), + D3D_RSI( 3, D3DRS_SRCBLEND, DONT_KNOW_YET ), + D3D_RSI( 3, D3DRS_DESTBLEND, DONT_KNOW_YET ), + + D3D_RSI( 1, D3DRS_SEPARATEALPHABLENDENABLE, FALSE ), // hit in CTransitionTable::ApplySeparateAlphaBlend + D3D_RSI( 1, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE ), // going to demote these to class 1 until I figure out if they are implementable + D3D_RSI( 1, D3DRS_DESTBLENDALPHA, D3DBLEND_ZERO ), + D3D_RSI( 1, D3DRS_BLENDOPALPHA, D3DBLENDOP_ADD ), + + // what is the deal with alpha test... looks like it is inited to off. + D3D_RSI( 3, D3DRS_ALPHATESTENABLE, 0 ), + D3D_RSI( 3, D3DRS_ALPHAREF, 0 ), + D3D_RSI( 3, D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL ), + + D3D_RSI( 3, D3DRS_STENCILENABLE, FALSE ), + D3D_RSI( 3, D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP ), + D3D_RSI( 3, D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP ), + D3D_RSI( 3, D3DRS_STENCILPASS, D3DSTENCILOP_KEEP ), + D3D_RSI( 3, D3DRS_STENCILFUNC, D3DCMP_ALWAYS ), + D3D_RSI( 3, D3DRS_STENCILREF, 0 ), + D3D_RSI( 3, D3DRS_STENCILMASK, 0xFFFFFFFF ), + D3D_RSI( 3, D3DRS_STENCILWRITEMASK, 0xFFFFFFFF ), + + D3D_RSI( 3, D3DRS_TWOSIDEDSTENCILMODE, FALSE ), + D3D_RSI( 3, D3DRS_CCW_STENCILFAIL, D3DSTENCILOP_KEEP ), + D3D_RSI( 3, D3DRS_CCW_STENCILZFAIL, D3DSTENCILOP_KEEP ), + D3D_RSI( 3, D3DRS_CCW_STENCILPASS, D3DSTENCILOP_KEEP ), + D3D_RSI( 3, D3DRS_CCW_STENCILFUNC, D3DCMP_ALWAYS ), + + D3D_RSI( 3, D3DRS_FOGENABLE, FALSE ), // see CShaderAPIDx8::FogMode and friends - be ready to do the ARB fog linear option madness + D3D_RSI( 3, D3DRS_FOGCOLOR, 0 ), + D3D_RSI( 3, D3DRS_FOGTABLEMODE, D3DFOG_NONE ), + D3D_RSI( 3, D3DRS_FOGSTART, CONST_DZERO ), + D3D_RSI( 3, D3DRS_FOGEND, CONST_DONE ), + D3D_RSI( 3, D3DRS_FOGDENSITY, CONST_DZERO ), + D3D_RSI( 3, D3DRS_RANGEFOGENABLE, FALSE ), + D3D_RSI( 3, D3DRS_FOGVERTEXMODE, D3DFOG_NONE ), // watch out for CShaderAPIDx8::CommitPerPassFogMode.... + + D3D_RSI( 3, D3DRS_MULTISAMPLEANTIALIAS, TRUE ), + D3D_RSI( 3, D3DRS_MULTISAMPLEMASK, 0xFFFFFFFF ), + + D3D_RSI( 3, D3DRS_SCISSORTESTENABLE, FALSE ), // heed IDirect3DDevice9::SetScissorRect + + D3D_RSI( 3, D3DRS_DEPTHBIAS, CONST_DZERO ), + D3D_RSI( 3, D3DRS_SLOPESCALEDEPTHBIAS, CONST_DZERO ), + + D3D_RSI( 3, D3DRS_COLORWRITEENABLE1, 0x0000000f ), + D3D_RSI( 3, D3DRS_COLORWRITEENABLE2, 0x0000000f ), + D3D_RSI( 3, D3DRS_COLORWRITEENABLE3, 0x0000000f ), + + D3D_RSI( 3, D3DRS_SRGBWRITEENABLE, 0 ), // heeded but ignored.. + + D3D_RSI( 2, D3DRS_CLIPPING, TRUE ), // um, yeah, clipping is enabled (?) + D3D_RSI( 3, D3DRS_CLIPPLANEENABLE, 0 ), // mask 1<m_class >= 0; packed++ ) + { + if ( (packed->m_state <0) || (packed->m_state >= D3DRS_VALUE_LIMIT) ) + { + // bad + DXABSTRACT_BREAK_ON_ERROR(); + } + else + { + // dispatch it to the unpacked array + g_D3DRS_INFO_unpacked[ packed->m_state ] = *packed; + } + } +} + +// convenience functions + +#ifdef OSX + +#pragma mark ----- Sampler States - (IDirect3DDevice9) + +#endif + +void IDirect3DDevice9::FlushClipPlaneEquation() +{ + for( int x=0; xCaps().m_hasNativeClipVertexMode ) + { + // hacked coeffs = { src->x, -src->y, 0.5f * src->z, src->w + (0.5f * src->z) }; + // Antonio's trick - so we can use gl_Position as the clippee, not gl_ClipVertex. + + GLClipPlaneEquation_t *equ = &gl.m_ClipPlaneEquation[x]; + + ///////////////// temp1 + temp1.x = equ->x; + temp1.y = equ->y * -1.0; + temp1.z = equ->z * 0.5; + temp1.w = equ->w + (equ->z * 0.5); + + + //////////////// temp2 + VMatrix mat1( 1, 0, 0, 0, + 0, -1, 0, 0, + 0, 0, 2, -1, + 0, 0, 0, 1 + ); + //mat1 = mat1.Transpose(); + + VMatrix mat2; + bool success = mat1.InverseGeneral( mat2 ); + + if (success) + { + VMatrix mat3; + mat3 = mat2.Transpose(); + + VPlane origPlane( Vector( equ->x, equ->y, equ->z ), equ->w ); + VPlane newPlane; + + newPlane = mat3 * origPlane /* * mat3 */; + + VPlane finalPlane = newPlane; + + temp2.x = newPlane.m_Normal.x; + temp2.y = newPlane.m_Normal.y; + temp2.z = newPlane.m_Normal.z; + temp2.w = newPlane.m_Dist; + } + else + { + temp2.x = 0; + temp2.y = 0; + temp2.z = 0; + temp2.w = 0; + } + } + else + { + temp1 = temp2 = gl.m_ClipPlaneEquation[x]; + } + + if (1) //GLMKnob("caps-key",NULL)==0.0) + { + m_ctx->WriteClipPlaneEquation( &temp1, x ); // no caps lock = Antonio or classic + + /* + if (x<1) + { + GLMPRINTF(( " plane %d √vers1[ %5.2f %5.2f %5.2f %5.2f ] vers2[ %5.2f %5.2f %5.2f %5.2f ]", + x, + temp1.x,temp1.y,temp1.z,temp1.w, + temp2.x,temp2.y,temp2.z,temp2.w + )); + } + */ + } + else + { + m_ctx->WriteClipPlaneEquation( &temp2, x ); // caps = our way or classic + + /* + if (x<1) + { + GLMPRINTF(( " plane %d vers1[ %5.2f %5.2f %5.2f %5.2f ] √vers2[ %5.2f %5.2f %5.2f %5.2f ]", + x, + temp1.x,temp1.y,temp1.z,temp1.w, + temp2.x,temp2.y,temp2.z,temp2.w + )); + } + */ + } + } +} + +void IDirect3DDevice9::InitStates() +{ + m_ctx->m_AlphaTestEnable.Read( &gl.m_AlphaTestEnable, 0 ); + m_ctx->m_AlphaTestFunc.Read( &gl.m_AlphaTestFunc, 0 ); + m_ctx->m_CullFaceEnable.Read( &gl.m_CullFaceEnable, 0 ); + m_ctx->m_DepthBias.Read( &gl.m_DepthBias, 0 ); + m_ctx->m_ScissorEnable.Read( &gl.m_ScissorEnable, 0 ); + m_ctx->m_ScissorBox.Read( &gl.m_ScissorBox, 0 ); + m_ctx->m_ViewportBox.Read( &gl.m_ViewportBox, 0 ); + m_ctx->m_ViewportDepthRange.Read( &gl.m_ViewportDepthRange, 0 ); + + for( int x=0; xm_ClipPlaneEnable.ReadIndex( &gl.m_ClipPlaneEnable[x], x, 0 ); + + m_ctx->m_PolygonMode.Read( &gl.m_PolygonMode, 0 ); + m_ctx->m_CullFrontFace.Read( &gl.m_CullFrontFace, 0 ); + m_ctx->m_AlphaToCoverageEnable.Read( &gl.m_AlphaToCoverageEnable, 0 ); + m_ctx->m_BlendEquation.Read( &gl.m_BlendEquation, 0 ); + m_ctx->m_BlendColor.Read( &gl.m_BlendColor, 0 ); + + for( int x=0; xm_ClipPlaneEquation.ReadIndex( &gl.m_ClipPlaneEquation[x], x, 0 ); + + m_ctx->m_ColorMaskSingle.Read( &gl.m_ColorMaskSingle, 0 ); + + m_ctx->m_BlendEnable.Read( &gl.m_BlendEnable, 0 ); + m_ctx->m_BlendFactor.Read( &gl.m_BlendFactor, 0 ); + m_ctx->m_BlendEnableSRGB.Read( &gl.m_BlendEnableSRGB, 0 ); + m_ctx->m_DepthTestEnable.Read( &gl.m_DepthTestEnable, 0 ); + m_ctx->m_DepthFunc.Read( &gl.m_DepthFunc, 0 ); + m_ctx->m_DepthMask.Read( &gl.m_DepthMask, 0 ); + m_ctx->m_StencilTestEnable.Read( &gl.m_StencilTestEnable, 0 ); + m_ctx->m_StencilFunc.Read( &gl.m_StencilFunc, 0 ); + + m_ctx->m_StencilOp.ReadIndex( &gl.m_StencilOp, 0, 0 ); + m_ctx->m_StencilOp.ReadIndex( &gl.m_StencilOp, 1, 0 ); + + m_ctx->m_StencilWriteMask.Read( &gl.m_StencilWriteMask, 0 ); + m_ctx->m_ClearColor.Read( &gl.m_ClearColor, 0 ); + m_ctx->m_ClearDepth.Read( &gl.m_ClearDepth, 0 ); + m_ctx->m_ClearStencil.Read( &gl.m_ClearStencil, 0 ); +} + +void IDirect3DDevice9::FullFlushStates() +{ + m_ctx->WriteAlphaTestEnable( &gl.m_AlphaTestEnable ); + m_ctx->WriteAlphaTestFunc( &gl.m_AlphaTestFunc ); + m_ctx->WriteCullFaceEnable( &gl.m_CullFaceEnable ); + m_ctx->WriteDepthBias( &gl.m_DepthBias ); + m_ctx->WriteScissorEnable( &gl.m_ScissorEnable ); + m_ctx->WriteScissorBox( &gl.m_ScissorBox ); + m_ctx->WriteViewportBox( &gl.m_ViewportBox ); + m_ctx->WriteViewportDepthRange( &gl.m_ViewportDepthRange ); + + for( int x=0; xWriteClipPlaneEnable( &gl.m_ClipPlaneEnable[x], x ); + + m_ctx->WritePolygonMode( &gl.m_PolygonMode ); + m_ctx->WriteCullFrontFace( &gl.m_CullFrontFace ); + m_ctx->WriteAlphaToCoverageEnable( &gl.m_AlphaToCoverageEnable ); + m_ctx->WriteBlendEquation( &gl.m_BlendEquation ); + m_ctx->WriteBlendColor( &gl.m_BlendColor ); + FlushClipPlaneEquation(); + m_ctx->WriteColorMaskSingle( &gl.m_ColorMaskSingle ); + + m_ctx->WriteBlendEnable( &gl.m_BlendEnable ); + m_ctx->WriteBlendFactor( &gl.m_BlendFactor ); + m_ctx->WriteBlendEnableSRGB( &gl.m_BlendEnableSRGB ); + m_ctx->WriteDepthTestEnable( &gl.m_DepthTestEnable ); + m_ctx->WriteDepthFunc( &gl.m_DepthFunc ); + m_ctx->WriteDepthMask( &gl.m_DepthMask ); + m_ctx->WriteStencilTestEnable( &gl.m_StencilTestEnable ); + m_ctx->WriteStencilFunc( &gl.m_StencilFunc ); + + m_ctx->WriteStencilOp( &gl.m_StencilOp,0 ); + m_ctx->WriteStencilOp( &gl.m_StencilOp,1 ); // ********* need to recheck this + + m_ctx->WriteStencilWriteMask( &gl.m_StencilWriteMask ); + m_ctx->WriteClearColor( &gl.m_ClearColor ); + m_ctx->WriteClearDepth( &gl.m_ClearDepth ); + m_ctx->WriteClearStencil( &gl.m_ClearStencil ); +} + +HRESULT IDirect3DDevice9::DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +// 7LS - TODO +#ifndef DX_TO_GL_ABSTRACTION +HRESULT IDirect3DDevice9::DrawPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCountx,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) +{ +// 7LS + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} +#endif + +// Type +// [in] Member of the D3DPRIMITIVETYPE enumerated type, describing the type of primitive to render. D3DPT_POINTLIST is not supported with this method. See Remarks. + +// BaseVertexIndex +// [in] Offset from the start of the vertex buffer to the first vertex. See Scenario 4. + +// MinIndex +// [in] Minimum vertex index for vertices used during this call. This is a zero based index relative to BaseVertexIndex. + +// NumVertices +// [in] Number of vertices used during this call. The first vertex is located at index: BaseVertexIndex + MinIndex. + +// StartIndex +// [in] Index of the first index to use when accessing the index buffer. + +// PrimitiveCount +// [in] Number of primitives to render. The number of vertices used is a function of the primitive count and the primitive type. The maximum number of primitives allowed is determined by checking the MaxPrimitiveCount member of the D3DCAPS9 structure. + +// BE VERY CAREFUL what you do in this function. It's extremely hot, and calling the wrong GL API's in here will crush perf. on NVidia threaded drivers. +#ifndef OSX + +HRESULT IDirect3DDevice9::DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount ) +{ + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "%s", __FUNCTION__ ); + Assert( m_ctx->m_nCurOwnerThreadId == ThreadGetCurrentId() ); + + TOGL_NULL_DEVICE_CHECK; + if ( m_bFBODirty ) + { + UpdateBoundFBO(); + } + + g_nTotalDrawsOrClears++; + +#if GL_BATCH_PERF_ANALYSIS + m_nTotalPrims += primCount; + CFastTimer tm; + CFlushDrawStatesStats& flushStats = m_ctx->m_FlushStats; + tm.Start(); + flushStats.Clear(); +#endif + +#if GLMDEBUG + if ( gl.m_FogEnable ) + { + GLMPRINTF(("-D- IDirect3DDevice9::DrawIndexedPrimitive is seeing enabled fog...")); + } +#endif + + if ( ( !m_indices.m_idxBuffer ) || ( !m_vertexShader ) ) + goto draw_failed; + + { + GL_BATCH_PERF_CALL_TIMER; + + m_ctx->FlushDrawStates( MinVertexIndex, MinVertexIndex + NumVertices - 1, BaseVertexIndex ); + + { +#if !GL_TELEMETRY_ZONES && GL_BATCH_TELEMETRY_ZONES + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "glDrawRangeElements %u", primCount ); +#endif + Assert( ( D3DPT_LINELIST == 2 ) && ( D3DPT_TRIANGLELIST == 4 ) && ( D3DPT_TRIANGLESTRIP == 5 ) ); + + static const struct prim_t + { + GLenum m_nType; + uint m_nPrimMul; + uint m_nPrimAdd; + } s_primTypes[6] = + { + { 0, 0, 0 }, // 0 + { 0, 0, 0 }, // 1 + { GL_LINES, 2, 0 }, // 2 D3DPT_LINELIST + { 0, 0, 0 }, // 3 + { GL_TRIANGLES, 3, 0 }, // 4 D3DPT_TRIANGLELIST + { GL_TRIANGLE_STRIP, 1, 2 } // 5 D3DPT_TRIANGLESTRIP + }; + + if ( Type <= D3DPT_TRIANGLESTRIP ) + { + const prim_t& p = s_primTypes[Type]; + Assert( p.m_nType ); + Assert( NumVertices >= 1 ); + + m_ctx->DrawRangeElements( p.m_nType, (GLuint)MinVertexIndex, (GLuint)( MinVertexIndex + NumVertices - 1 ), (GLsizei)p.m_nPrimAdd + primCount * p.m_nPrimMul, (GLenum)GL_UNSIGNED_SHORT, (const GLvoid *)( startIndex * sizeof(short) ), BaseVertexIndex, m_indices.m_idxBuffer->m_idxBuffer ); + } + } + } + +#if GL_BATCH_PERF_ANALYSIS + if ( s_rdtsc_to_ms == 0.0f ) + { + TmU64 t0 = Plat_Rdtsc(); + double d0 = Plat_FloatTime(); + + ThreadSleep( 1000 ); + + TmU64 t1 = Plat_Rdtsc(); + double d1 = Plat_FloatTime(); + + s_rdtsc_to_ms = ( 1000.0f * ( d1 - d0 ) ) / ( t1 - t0 ); + } + +#if GL_BATCH_PERF_ANALYSIS_WRITE_PNGS + if ( m_pBatch_vis_bitmap && m_pBatch_vis_bitmap->is_valid() ) + { + double t = tm.GetDurationInProgress().GetMillisecondsF(); + + uint h = 1; + if ( gl_batch_vis_y_scale.GetFloat() > 0.0f) + { + h = ceil( t / gl_batch_vis_y_scale.GetFloat() ); + h = MAX(h, 1); + } + + // Total time spent inside any and all our "D3D9" calls + double flTotalD3DTime = g_nTotalD3DCycles * s_rdtsc_to_ms; + m_pBatch_vis_bitmap->fill_box(0, m_nBatchVisY, (uint)(.5f + flTotalD3DTime / gl_batch_vis_abs_scale.GetFloat() * m_pBatch_vis_bitmap->width()), h, 150, 150, 150); + + // Total total spent processing just DrawIndexedPrimitive() for this batch. + m_pBatch_vis_bitmap->fill_box(0, m_nBatchVisY, (uint)(.5f + t / gl_batch_vis_abs_scale.GetFloat() * m_pBatch_vis_bitmap->width()), h, 70, 70, 70); + + double flTotalGLMS = gGL->m_nTotalGLCycles * s_rdtsc_to_ms; + + // Total time spent inside of all OpenGL calls + m_pBatch_vis_bitmap->additive_fill_box(0, m_nBatchVisY, (uint)(.5f + flTotalGLMS / gl_batch_vis_abs_scale.GetFloat() * m_pBatch_vis_bitmap->width()), h, 0, 0, 64); + + if (flushStats.m_nNewVS) m_pBatch_vis_bitmap->additive_fill_box(80-16, m_nBatchVisY, 8, h, 0, 110, 0); + if (flushStats.m_nNewPS) m_pBatch_vis_bitmap->additive_fill_box(80-8, m_nBatchVisY, 8, h, 110, 0, 110); + + int lm = 80; + m_pBatch_vis_bitmap->fill_box(lm+0+flushStats.m_nFirstVSConstant, m_nBatchVisY, flushStats.m_nNumVSConstants, h, 64, 255, 255); + m_pBatch_vis_bitmap->fill_box(lm+64, m_nBatchVisY, flushStats.m_nNumVSBoneConstants, h, 255, 64, 64); + m_pBatch_vis_bitmap->fill_box(lm+64+256+flushStats.m_nFirstPSConstant, m_nBatchVisY, flushStats.m_nNumPSConstants, h, 64, 64, 255); + + m_pBatch_vis_bitmap->fill_box(lm+64+256+32, m_nBatchVisY, flushStats.m_nNumChangedSamplers, h, 255, 255, 255); + m_pBatch_vis_bitmap->fill_box(lm+64+256+32+16, m_nBatchVisY, flushStats.m_nNumSamplingParamsChanged, h, 92, 128, 255); + + if ( flushStats.m_nVertexBufferChanged ) m_pBatch_vis_bitmap->fill_box(lm+64+256+32+16+64, m_nBatchVisY, 16, h, 128, 128, 128); + if ( flushStats.m_nIndexBufferChanged ) m_pBatch_vis_bitmap->fill_box(lm+64+256+32+16+64+16, m_nBatchVisY, 16, h, 128, 128, 255); + + m_pBatch_vis_bitmap->fill_box(lm+64+256+32+16+64+16+16, m_nBatchVisY, ( ( g_nTotalVBLockBytes + g_nTotalIBLockBytes ) * 64 + 2047 ) / 2048, h, 120, 120, 120 ); + m_pBatch_vis_bitmap->additive_fill_box(lm+64+256+32+16+64+16+16, m_nBatchVisY, ( g_nTotalVBLockBytes * 64 + 2047 ) / 2048, h, 120, 0, 0); + + m_nBatchVisY += h; + } +#endif + + m_nNumProgramChanges += ((flushStats.m_nNewVS + flushStats.m_nNewPS) != 0); + + m_flTotalD3DTime += g_nTotalD3DCycles * s_rdtsc_to_ms; + m_nTotalD3DCalls += g_nTotalD3DCalls; + g_nTotalD3DCycles = 0; + g_nTotalD3DCalls = 0; + + m_flTotalGLTime += gGL->m_nTotalGLCycles * s_rdtsc_to_ms; + m_nTotalGLCalls += gGL->m_nTotalGLCalls; + gGL->m_nTotalGLCycles = 0; + gGL->m_nTotalGLCalls = 0; + + g_nTotalVBLockBytes = 0; + g_nTotalIBLockBytes = 0; +#endif + + return S_OK; + +draw_failed: + Assert( 0 ); + return E_FAIL; +} + +#else + +// OSX 10.6 support + +HRESULT IDirect3DDevice9::FlushIndexBindings( void ) +{ + // push index buffer state + m_ctx->SetIndexBuffer( m_indices.m_idxBuffer->m_idxBuffer ); + return S_OK; +} + +HRESULT IDirect3DDevice9::FlushVertexBindings( uint baseVertexIndex ) +{ + // push vertex buffer state for the current vertex decl + // in this variant we just walk the attrib map in the VS and do a pull for each one. + // if we can't find a match in the vertex decl, we may fall back to the secret 'dummy' VBO that GLM maintains + + GLMVertexSetup setup; + memset( &setup, 0, sizeof( setup ) ); + + IDirect3DVertexDeclaration9 *vxdecl = m_pVertDecl; + unsigned char *vshAttribMap = m_vertexShader->m_vtxAttribMap; + + // this loop could be tightened if we knew the number of live entries in the shader attrib map. + // which of course would be easy to do in the create shader function or even in the translator. + + GLMVertexAttributeDesc *dstAttr = setup.m_attrs; + for( int i=0; i<16; i++,dstAttr++ ) + { + unsigned char vshattrib = vshAttribMap[ i ]; + if (vshattrib != 0xBB) + { + // try to find the match in the decl. + // idea: put some inverse table in the decl which could accelerate this search. + + D3DVERTEXELEMENT9_GL *elem = m_pVertDecl->m_elements; + for( int j=0; j< m_pVertDecl->m_elemCount; j++,elem++) + { + // if it matches, install it, change vshattrib so the code below does not trigger, then end the loop + if ( ((vshattrib>>4) == elem->m_dxdecl.Usage) && ((vshattrib & 0x0F) == elem->m_dxdecl.UsageIndex) ) + { + // targeting attribute #i in the setup with element data #j from the decl + + *dstAttr = elem->m_gldecl; + + // then fix buffer, stride, offset - note that we honor the base vertex index here by fiddling the offset + int streamIndex = elem->m_dxdecl.Stream; + dstAttr->m_pBuffer = m_streams[ streamIndex ].m_vtxBuffer->m_vtxBuffer; + dstAttr->m_stride = m_streams[ streamIndex ].m_stride; + dstAttr->m_offset += m_streams[ streamIndex ].m_offset + (baseVertexIndex * dstAttr->m_stride); + + // set mask + setup.m_attrMask |= (1 << i); + + // end loop + vshattrib = 0xBB; + j = 999; + } + } + + // if vshattrib is not 0xBB here, that means we could not find a source in the decl for it + if (vshattrib != 0xBB) + { + // fill out attr the same way as usual, we just pass NULL for the buffer and ask GLM to have mercy on us + + dstAttr->m_pBuffer = NULL; + dstAttr->m_stride = 0; + dstAttr->m_offset = 0; + + // only implement certain usages... if we haven't seen it before, stop. + switch (vshattrib >> 4) // aka usage + { + case D3DDECLUSAGE_POSITION: + case D3DDECLUSAGE_BLENDWEIGHT: + case D3DDECLUSAGE_BLENDINDICES: + Debugger(); + break; + + case D3DDECLUSAGE_NORMAL: + dstAttr->m_nCompCount = 3; + dstAttr->m_datatype = GL_FLOAT; + dstAttr->m_normalized = false; + break; + + case D3DDECLUSAGE_PSIZE: + Debugger(); + break; + + case D3DDECLUSAGE_TEXCOORD: + dstAttr->m_nCompCount = 3; + dstAttr->m_datatype = GL_FLOAT; + dstAttr->m_normalized = false; + break; + + case D3DDECLUSAGE_TANGENT: + case D3DDECLUSAGE_BINORMAL: + case D3DDECLUSAGE_TESSFACTOR: + case D3DDECLUSAGE_PLUGH: + Debugger(); + break; + + case D3DDECLUSAGE_COLOR: + dstAttr->m_nCompCount = 4; + dstAttr->m_datatype = GL_UNSIGNED_BYTE; + dstAttr->m_normalized = true; + break; + + case D3DDECLUSAGE_FOG: + case D3DDECLUSAGE_DEPTH: + case D3DDECLUSAGE_SAMPLE: + Debugger(); + break; + } + } + } + } + + // copy active program's vertex attrib map into the vert setup info + memcpy(&setup.m_vtxAttribMap, m_vertexShader->m_vtxAttribMap, sizeof(m_vertexShader->m_vtxAttribMap)); + + m_ctx->SetVertexAttributes(&setup); + return S_OK; +} + + +// OSX path offering support for 10.6 (we do not have support for glDrawRangeElementsBaseVertex) +HRESULT IDirect3DDevice9::DrawIndexedPrimitive( D3DPRIMITIVETYPE Type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount ) +{ + Assert( m_ctx->m_nCurOwnerThreadId == ThreadGetCurrentId() ); + + TOGL_NULL_DEVICE_CHECK; + if ( m_bFBODirty ) + { + UpdateBoundFBO(); + } + + g_nTotalDrawsOrClears++; + +#if GL_BATCH_PERF_ANALYSIS + m_nTotalPrims += primCount; + CFastTimer tm; + CFlushDrawStatesStats& flushStats = m_ctx->m_FlushStats; + tm.Start(); + flushStats.Clear(); +#endif + +#if GLMDEBUG + if ( gl.m_FogEnable ) + { + GLMPRINTF(("-D- IDirect3DDevice9::DrawIndexedPrimitive is seeing enabled fog...")); + } +#endif + + if ( ( !m_indices.m_idxBuffer ) || ( !m_vertexShader ) ) + goto draw_failed; + + this->FlushIndexBindings( ); + this->FlushVertexBindings( BaseVertexIndex ); + m_ctx->FlushDrawStates( MinVertexIndex, MinVertexIndex + NumVertices - 1, 0 ); + + if (gl.m_FogEnable) + { + GLMPRINTF(("-D- IDirect3DDevice9::DrawIndexedPrimitive is seeing enabled fog...")); + } + + switch(Type) + { + case D3DPT_POINTLIST: + Debugger(); + break; + + case D3DPT_LINELIST: + GLMPRINTF(("-X- IDirect3DDevice9::DrawIndexedPrimitive( D3DPT_LINELIST ) - ignored.")); + // Debugger(); + m_ctx->DrawRangeElements( (GLenum)GL_LINES, (GLuint)MinVertexIndex, (GLuint)(MinVertexIndex + NumVertices), (GLsizei)primCount*2, (GLenum)GL_UNSIGNED_SHORT, (const GLvoid *)(startIndex * sizeof(short)), m_indices.m_idxBuffer->m_idxBuffer ); + break; + + case D3DPT_TRIANGLELIST: + m_ctx->DrawRangeElements(GL_TRIANGLES, (GLuint)MinVertexIndex, (GLuint)(MinVertexIndex + NumVertices), (GLsizei)primCount*3, (GLenum)GL_UNSIGNED_SHORT, (const GLvoid *)(startIndex * sizeof(short)), m_indices.m_idxBuffer->m_idxBuffer ); + break; + + case D3DPT_TRIANGLESTRIP: + // enabled... Debugger(); + m_ctx->DrawRangeElements(GL_TRIANGLE_STRIP, (GLuint)MinVertexIndex, (GLuint)(MinVertexIndex + NumVertices), (GLsizei)(2+primCount), (GLenum)GL_UNSIGNED_SHORT, (const GLvoid *)(startIndex * sizeof(short)), m_indices.m_idxBuffer->m_idxBuffer ); + break; + } + + return S_OK; + +draw_failed: + Assert( 0 ); + return E_FAIL; +} + +#endif // #ifndef OSX + +HRESULT IDirect3DDevice9::DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +BOOL IDirect3DDevice9::ShowCursor(BOOL bShow) +{ + // FIXME NOP + //DXABSTRACT_BREAK_ON_ERROR(); + return TRUE; +} + +void d3drect_to_glmbox( D3DRECT *src, GLScissorBox_t *dst ) +{ + // to convert from a d3d rect to a GL rect you have to fix up the vertical axis, since D3D Y=0 is the top, but GL Y=0 is the bottom. + // you can't fix it without knowing the height. + + dst->width = src->x2 - src->x1; + dst->x = src->x1; // left edge + + dst->height = src->y2 - src->y1; + dst->y = src->y1; // bottom edge - take large Y from d3d and subtract from surf height. +} + +HRESULT IDirect3DDevice9::Clear(DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil) +{ + GL_BATCH_PERF_CALL_TIMER; + + if ( m_bFBODirty ) + { + UpdateBoundFBO(); + } + + g_nTotalDrawsOrClears++; + + m_ctx->FlushDrawStatesNoShaders(); + + + //debugging Color = (rand() | 0xFF0000FF) & 0xFF3F3FFF; + if (!Count) + { + // run clear with no added rectangle + m_ctx->Clear( (Flags&D3DCLEAR_TARGET)!=0, Color, + (Flags&D3DCLEAR_ZBUFFER)!=0, Z, + (Flags&D3DCLEAR_STENCIL)!=0, Stencil, + NULL + ); + } + else + { + GLScissorBox_t tempbox; + + // do the rects one by one and convert each one to GL form + for( uint i=0; iClear( (Flags&D3DCLEAR_TARGET)!=0, Color, + (Flags&D3DCLEAR_ZBUFFER)!=0, Z, + (Flags&D3DCLEAR_STENCIL)!=0, Stencil, + &tempbox + ); + } + } + + return S_OK; +} + +HRESULT IDirect3DDevice9::SetTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DDevice9::ValidateDevice(DWORD* pNumPasses) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetMaterial(CONST D3DMATERIAL9* pMaterial) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + GLMPRINTF(("-X- IDirect3DDevice9::SetMaterial - ignored.")); +// DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + + +HRESULT IDirect3DDevice9::LightEnable(DWORD Index,BOOL Enable) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetScissorRect(CONST RECT* pRect) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + //int nSurfaceHeight = m_ctx->m_drawingFBO->m_attach[ kAttColor0 ].m_tex->m_layout->m_key.m_ySize; + + GLScissorBox_t newScissorBox = { pRect->left, pRect->top, pRect->right - pRect->left, pRect->bottom - pRect->top }; + gl.m_ScissorBox = newScissorBox; + m_ctx->WriteScissorBox( &gl.m_ScissorBox ); + return S_OK; +} + +HRESULT IDirect3DDevice9::GetDeviceCaps(D3DCAPS9* pCaps) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + + // "Adapter" is used to index amongst the set of fake-adapters maintained in the display DB + GLMDisplayDB *db = GetDisplayDB(); + int glmRendererIndex = -1; + int glmDisplayIndex = -1; + + GLMRendererInfoFields glmRendererInfo; + GLMDisplayInfoFields glmDisplayInfo; + + bool result = db->GetFakeAdapterInfo( m_params.m_adapter, &glmRendererIndex, &glmDisplayIndex, &glmRendererInfo, &glmDisplayInfo ); (void)result; + Assert (!result); + // just leave glmRendererInfo filled out for subsequent code to look at as needed. + + FillD3DCaps9( glmRendererInfo, pCaps ); + + return S_OK; +} + + +HRESULT IDirect3DDevice9::TestCooperativeLevel() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + // game calls this to see if device was lost. + // last I checked the device was still attached to the computer. + // so, return OK. + + return S_OK; +} + +HRESULT IDirect3DDevice9::SetClipPlane(DWORD Index,CONST float* pPlane) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + Assert(Index<2); + + // We actually push the clip plane coeffs to two places + // - into a shader param for ARB mode + // - and into the API defined clip plane slots for GLSL mode. + + // if ARB mode... THIS NEEDS TO GO... it's messing up the dirty ranges.. + { + // this->SetVertexShaderConstantF( DXABSTRACT_VS_CLIP_PLANE_BASE+Index, pPlane, 1 ); // stash the clip plane values into shader param - translator knows where to look + } + + // if GLSL mode... latch it and let FlushStates push it out + { + GLClipPlaneEquation_t peq; + peq.x = pPlane[0]; + peq.y = pPlane[1]; + peq.z = pPlane[2]; + peq.w = pPlane[3]; + + gl.m_ClipPlaneEquation[ Index ] = peq; + FlushClipPlaneEquation(); + + // m_ctx->WriteClipPlaneEquation( &peq, Index ); + } + + return S_OK; +} + +HRESULT IDirect3DDevice9::EvictManagedResources() +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + GLMPRINTF(("-X- IDirect3DDevice9::EvictManagedResources --> IGNORED")); + return S_OK; +} + +HRESULT IDirect3DDevice9::SetLight(DWORD Index,CONST D3DLIGHT9*) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +void IDirect3DDevice9::SetGammaRamp(UINT iSwapChain,DWORD Flags,CONST D3DGAMMARAMP* pRamp) +{ + GL_BATCH_PERF_CALL_TIMER; + Assert( GetCurrentOwnerThreadId() == ThreadGetCurrentId() ); + + if ( g_pLauncherMgr ) + { + g_pLauncherMgr->SetGammaRamp( pRamp->red, pRamp->green, pRamp->blue ); + } +} + +void TOGLMETHODCALLTYPE IDirect3DDevice9::SaveGLState() +{ +} + +void TOGLMETHODCALLTYPE IDirect3DDevice9::RestoreGLState() +{ + m_ctx->ForceFlushStates(); + + m_bFBODirty = true; +} + +void IDirect3DDevice9::AcquireThreadOwnership( ) +{ + GL_BATCH_PERF_CALL_TIMER; + m_ctx->MakeCurrent( true ); +} + + +void IDirect3DDevice9::ReleaseThreadOwnership( ) +{ + GL_BATCH_PERF_CALL_TIMER; + m_ctx->ReleaseCurrent( true ); +} + +void IDirect3DDevice9::SetMaxUsedVertexShaderConstantsHintNonInline( uint nMaxReg ) +{ + GL_BATCH_PERF_CALL_TIMER; + m_ctx->SetMaxUsedVertexShaderConstantsHint( nMaxReg ); +} + +HRESULT IDirect3DDevice9::SetRenderState( D3DRENDERSTATETYPE State, DWORD Value ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + TOGL_NULL_DEVICE_CHECK; + +#if GLMDEBUG + // None of this is needed normally. + char rsSpew = 1; + char ignored = 0; + + if (State >= D3DRS_VALUE_LIMIT) + { + DXABSTRACT_BREAK_ON_ERROR(); // bad + return S_OK; + } + + const D3D_RSINFO *info = &g_D3DRS_INFO_unpacked[ State ]; + if (info->m_state != State) + { + DXABSTRACT_BREAK_ON_ERROR(); // bad - we never set up that state in our list + return S_OK; + } + + if (rsSpew) + { + GLMPRINTF(("-X- IDirect3DDevice9::SetRenderState: set %s(%d) to %d(0x%08x) ( class %d, defval is %d(0x%08x) )", GLMDecode( eD3D_RSTATE,State),State, Value,Value, info->m_class, info->m_defval,info->m_defval )); + } + + switch( info->m_class ) + { + case 0: // just ignore quietly. example: D3DRS_LIGHTING + ignored = 1; + break; + + case 1: + { + // no GL response - and no error as long as the write value matches the default + if (Value != info->m_defval) + { + static char stop_here_1 = 0; + if (stop_here_1) + DXABSTRACT_BREAK_ON_ERROR(); + } + break; + } + + case 2: + { + // provide GL response, but only support known default value + if (Value != info->m_defval) + { + static char stop_here_2 = 0; + if (stop_here_2) + DXABSTRACT_BREAK_ON_ERROR(); + } + // fall through to mode 3 + } + case 3: + // normal case - the switch statement below will handle this + break; + } +#endif + + switch (State) + { + case D3DRS_ZENABLE: // kGLDepthTestEnable + { + gl.m_DepthTestEnable.enable = Value; + m_ctx->WriteDepthTestEnable( &gl.m_DepthTestEnable ); + break; + } + case D3DRS_ZWRITEENABLE: // kGLDepthMask + { + gl.m_DepthMask.mask = Value; + m_ctx->WriteDepthMask( &gl.m_DepthMask ); + break; + } + case D3DRS_ZFUNC: + { + // kGLDepthFunc + GLenum func = D3DCompareFuncToGL( Value ); + gl.m_DepthFunc.func = func; + m_ctx->WriteDepthFunc( &gl.m_DepthFunc ); + break; + } + + case D3DRS_COLORWRITEENABLE: // kGLColorMaskSingle + { + gl.m_ColorMaskSingle.r = ((Value & D3DCOLORWRITEENABLE_RED) != 0) ? 0xFF : 0x00; + gl.m_ColorMaskSingle.g = ((Value & D3DCOLORWRITEENABLE_GREEN)!= 0) ? 0xFF : 0x00; + gl.m_ColorMaskSingle.b = ((Value & D3DCOLORWRITEENABLE_BLUE) != 0) ? 0xFF : 0x00; + gl.m_ColorMaskSingle.a = ((Value & D3DCOLORWRITEENABLE_ALPHA)!= 0) ? 0xFF : 0x00; + m_ctx->WriteColorMaskSingle( &gl.m_ColorMaskSingle ); + break; + } + + case D3DRS_CULLMODE: // kGLCullFaceEnable / kGLCullFrontFace + { + switch (Value) + { + case D3DCULL_NONE: + { + gl.m_CullFaceEnable.enable = false; + gl.m_CullFrontFace.value = GL_CCW; //doesn't matter + + m_ctx->WriteCullFaceEnable( &gl.m_CullFaceEnable ); + m_ctx->WriteCullFrontFace( &gl.m_CullFrontFace ); + break; + } + + case D3DCULL_CW: + { + gl.m_CullFaceEnable.enable = true; + gl.m_CullFrontFace.value = GL_CW; //origGL_CCW; + + m_ctx->WriteCullFaceEnable( &gl.m_CullFaceEnable ); + m_ctx->WriteCullFrontFace( &gl.m_CullFrontFace ); + break; + } + case D3DCULL_CCW: + { + gl.m_CullFaceEnable.enable = true; + gl.m_CullFrontFace.value = GL_CCW; //origGL_CW; + + m_ctx->WriteCullFaceEnable( &gl.m_CullFaceEnable ); + m_ctx->WriteCullFrontFace( &gl.m_CullFrontFace ); + break; + } + default: + { + DXABSTRACT_BREAK_ON_ERROR(); + break; + } + } + break; + } + + //-------------------------------------------------------------------------------------------- alphablend stuff + + case D3DRS_ALPHABLENDENABLE: // kGLBlendEnable + { + gl.m_BlendEnable.enable = Value; + m_ctx->WriteBlendEnable( &gl.m_BlendEnable ); + break; + } + + case D3DRS_BLENDOP: // kGLBlendEquation // D3D blend-op ==> GL blend equation + { + GLenum equation = D3DBlendOperationToGL( Value ); + gl.m_BlendEquation.equation = equation; + m_ctx->WriteBlendEquation( &gl.m_BlendEquation ); + break; + } + + case D3DRS_SRCBLEND: // kGLBlendFactor // D3D blend-factor ==> GL blend factor + case D3DRS_DESTBLEND: // kGLBlendFactor + { + GLenum factor = D3DBlendFactorToGL( Value ); + + if (State==D3DRS_SRCBLEND) + { + gl.m_BlendFactor.srcfactor = factor; + } + else + { + gl.m_BlendFactor.dstfactor = factor; + } + m_ctx->WriteBlendFactor( &gl.m_BlendFactor ); + break; + } + + case D3DRS_SRGBWRITEENABLE: // kGLBlendEnableSRGB + { + gl.m_BlendEnableSRGB.enable = Value; + m_ctx->WriteBlendEnableSRGB( &gl.m_BlendEnableSRGB ); + break; + } + + //-------------------------------------------------------------------------------------------- alphatest stuff + + case D3DRS_ALPHATESTENABLE: + { + gl.m_AlphaTestEnable.enable = Value; + m_ctx->WriteAlphaTestEnable( &gl.m_AlphaTestEnable ); + break; + } + + case D3DRS_ALPHAREF: + { + gl.m_AlphaTestFunc.ref = Value / 255.0f; + m_ctx->WriteAlphaTestFunc( &gl.m_AlphaTestFunc ); + break; + } + + case D3DRS_ALPHAFUNC: + { + GLenum func = D3DCompareFuncToGL( Value );; + gl.m_AlphaTestFunc.func = func; + m_ctx->WriteAlphaTestFunc( &gl.m_AlphaTestFunc ); + break; + } + + //-------------------------------------------------------------------------------------------- stencil stuff + + case D3DRS_STENCILENABLE: // GLStencilTestEnable_t + { + gl.m_StencilTestEnable.enable = Value; + m_ctx->WriteStencilTestEnable( &gl.m_StencilTestEnable ); + break; + } + + case D3DRS_STENCILFAIL: // GLStencilOp_t "what do you do if stencil test fails" + { + GLenum stencilop = D3DStencilOpToGL( Value ); + gl.m_StencilOp.sfail = stencilop; + + m_ctx->WriteStencilOp( &gl.m_StencilOp,0 ); + m_ctx->WriteStencilOp( &gl.m_StencilOp,1 ); // ********* need to recheck this + break; + } + + case D3DRS_STENCILZFAIL: // GLStencilOp_t "what do you do if stencil test passes *but* depth test fails, if depth test happened" + { + GLenum stencilop = D3DStencilOpToGL( Value ); + gl.m_StencilOp.dpfail = stencilop; + + m_ctx->WriteStencilOp( &gl.m_StencilOp,0 ); + m_ctx->WriteStencilOp( &gl.m_StencilOp,1 ); // ********* need to recheck this + break; + } + + case D3DRS_STENCILPASS: // GLStencilOp_t "what do you do if stencil test and depth test both pass" + { + GLenum stencilop = D3DStencilOpToGL( Value ); + gl.m_StencilOp.dppass = stencilop; + + m_ctx->WriteStencilOp( &gl.m_StencilOp,0 ); + m_ctx->WriteStencilOp( &gl.m_StencilOp,1 ); // ********* need to recheck this + break; + } + + case D3DRS_STENCILFUNC: // GLStencilFunc_t + { + GLenum stencilfunc = D3DCompareFuncToGL( Value ); + gl.m_StencilFunc.frontfunc = gl.m_StencilFunc.backfunc = stencilfunc; + + m_ctx->WriteStencilFunc( &gl.m_StencilFunc ); + break; + } + + case D3DRS_STENCILREF: // GLStencilFunc_t + { + gl.m_StencilFunc.ref = Value; + m_ctx->WriteStencilFunc( &gl.m_StencilFunc ); + break; + } + + case D3DRS_STENCILMASK: // GLStencilFunc_t + { + gl.m_StencilFunc.mask = Value; + m_ctx->WriteStencilFunc( &gl.m_StencilFunc ); + break; + } + + case D3DRS_STENCILWRITEMASK: // GLStencilWriteMask_t + { + gl.m_StencilWriteMask.mask = Value; + m_ctx->WriteStencilWriteMask( &gl.m_StencilWriteMask ); + break; + } + + case D3DRS_FOGENABLE: // none of these are implemented yet... erk + { + gl.m_FogEnable = (Value != 0); + GLMPRINTF(("-D- fogenable = %d",Value )); + break; + } + + case D3DRS_SCISSORTESTENABLE: // kGLScissorEnable + { + gl.m_ScissorEnable.enable = Value; + m_ctx->WriteScissorEnable( &gl.m_ScissorEnable ); + break; + } + + case D3DRS_DEPTHBIAS: // kGLDepthBias + { + // the value in the dword is actually a float + float fvalue = *(float*)&Value; + gl.m_DepthBias.units = fvalue; + + m_ctx->WriteDepthBias( &gl.m_DepthBias ); + break; + } + + // good ref on these: http://aras-p.info/blog/2008/06/12/depth-bias-and-the-power-of-deceiving-yourself/ + case D3DRS_SLOPESCALEDEPTHBIAS: + { + // the value in the dword is actually a float + float fvalue = *(float*)&Value; + gl.m_DepthBias.factor = fvalue; + + m_ctx->WriteDepthBias( &gl.m_DepthBias ); + break; + } + + // Alpha to coverage + case D3DRS_ADAPTIVETESS_Y: + { + gl.m_AlphaToCoverageEnable.enable = Value; + m_ctx->WriteAlphaToCoverageEnable( &gl.m_AlphaToCoverageEnable ); + break; + } + + case D3DRS_CLIPPLANEENABLE: // kGLClipPlaneEnable + { + // d3d packs all the enables into one word. + // we break that out so we don't do N glEnable calls to sync - + // GLM is tracking one unique enable per plane. + for( int i=0; iWriteClipPlaneEnable( &gl.m_ClipPlaneEnable[x], x ); + break; + } + + //-------------------------------------------------------------------------------------------- polygon/fill mode + + case D3DRS_FILLMODE: + { + GLuint mode = 0; + switch(Value) + { + case D3DFILL_POINT: mode = GL_POINT; break; + case D3DFILL_WIREFRAME: mode = GL_LINE; break; + case D3DFILL_SOLID: mode = GL_FILL; break; + default: DXABSTRACT_BREAK_ON_ERROR(); break; + } + gl.m_PolygonMode.values[0] = gl.m_PolygonMode.values[1] = mode; + m_ctx->WritePolygonMode( &gl.m_PolygonMode ); + break; + } + +#if GLMDEBUG + case D3DRS_MULTISAMPLEANTIALIAS: + case D3DRS_MULTISAMPLEMASK: + case D3DRS_FOGCOLOR: + case D3DRS_FOGTABLEMODE: + case D3DRS_FOGSTART: + case D3DRS_FOGEND: + case D3DRS_FOGDENSITY: + case D3DRS_RANGEFOGENABLE: + case D3DRS_FOGVERTEXMODE: + case D3DRS_COLORWRITEENABLE1: // kGLColorMaskMultiple + case D3DRS_COLORWRITEENABLE2: // kGLColorMaskMultiple + case D3DRS_COLORWRITEENABLE3: // kGLColorMaskMultiple + case D3DRS_SEPARATEALPHABLENDENABLE: + case D3DRS_BLENDOPALPHA: + case D3DRS_SRCBLENDALPHA: + case D3DRS_DESTBLENDALPHA: + case D3DRS_TWOSIDEDSTENCILMODE: // -> GL_STENCIL_TEST_TWO_SIDE_EXT... not yet implemented ? + case D3DRS_CCW_STENCILFAIL: // GLStencilOp_t + case D3DRS_CCW_STENCILZFAIL: // GLStencilOp_t + case D3DRS_CCW_STENCILPASS: // GLStencilOp_t + case D3DRS_CCW_STENCILFUNC: // GLStencilFunc_t + case D3DRS_CLIPPING: // ???? is clipping ever turned off ?? + case D3DRS_LASTPIXEL: + case D3DRS_DITHERENABLE: + case D3DRS_SHADEMODE: + default: + ignored = 1; + break; +#endif + } + +#if GLMDEBUG + if (rsSpew && ignored) + { + GLMPRINTF(("-X- (ignored)")); + } +#endif + + return S_OK; +} + +HRESULT IDirect3DDevice9::SetSamplerStateNonInline( DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value ) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + + Assert( Sampler < GLM_SAMPLER_COUNT ); + + m_ctx->SetSamplerDirty( Sampler ); + + switch( Type ) + { + case D3DSAMP_ADDRESSU: + m_ctx->SetSamplerAddressU( Sampler, Value ); + break; + case D3DSAMP_ADDRESSV: + m_ctx->SetSamplerAddressV( Sampler, Value ); + break; + case D3DSAMP_ADDRESSW: + m_ctx->SetSamplerAddressW( Sampler, Value ); + break; + case D3DSAMP_BORDERCOLOR: + m_ctx->SetSamplerBorderColor( Sampler, Value ); + break; + case D3DSAMP_MAGFILTER: + m_ctx->SetSamplerMagFilter( Sampler, Value ); + break; + case D3DSAMP_MIPFILTER: + m_ctx->SetSamplerMipFilter( Sampler, Value ); + break; + case D3DSAMP_MINFILTER: + m_ctx->SetSamplerMinFilter( Sampler, Value ); + break; + case D3DSAMP_MIPMAPLODBIAS: + m_ctx->SetSamplerMipMapLODBias( Sampler, Value ); + break; + case D3DSAMP_MAXMIPLEVEL: + m_ctx->SetSamplerMaxMipLevel( Sampler, Value); + break; + case D3DSAMP_MAXANISOTROPY: + m_ctx->SetSamplerMaxAnisotropy( Sampler, Value); + break; + case D3DSAMP_SRGBTEXTURE: + //m_samplers[ Sampler ].m_srgb = Value; + m_ctx->SetSamplerSRGBTexture(Sampler, Value); + break; + case D3DSAMP_SHADOWFILTER: + m_ctx->SetShadowFilter(Sampler, Value); + break; + + default: DXABSTRACT_BREAK_ON_ERROR(); break; + } + + return S_OK; +} + +void IDirect3DDevice9::SetSamplerStatesNonInline( + DWORD Sampler, DWORD AddressU, DWORD AddressV, DWORD AddressW, + DWORD MinFilter, DWORD MagFilter, DWORD MipFilter, + DWORD MinLod, float LodBias) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + + Assert( Sampler < GLM_SAMPLER_COUNT); + + m_ctx->SetSamplerDirty( Sampler ); + + m_ctx->SetSamplerStates( Sampler, AddressU, AddressV, AddressW, MinFilter, MagFilter, MipFilter, MinLod, LodBias ); +} + +HRESULT IDirect3DDevice9::SetTextureNonInline(DWORD Stage,IDirect3DBaseTexture9* pTexture) +{ + GL_BATCH_PERF_CALL_TIMER; + GL_PUBLIC_ENTRYPOINT_CHECKS( this ); + Assert( Stage < GLM_SAMPLER_COUNT ); + m_textures[Stage] = pTexture; + m_ctx->SetSamplerTex( Stage, pTexture ? pTexture->m_tex : NULL ); + return S_OK; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +void* ID3DXBuffer::GetBufferPointer() +{ + GL_BATCH_PERF_CALL_TIMER; + DXABSTRACT_BREAK_ON_ERROR(); + return NULL; +} + +DWORD ID3DXBuffer::GetBufferSize() +{ + GL_BATCH_PERF_CALL_TIMER; + DXABSTRACT_BREAK_ON_ERROR(); + return 0; +} + + + +#ifndef _MSC_VER +#pragma mark ----- More D3DX stuff +#endif + +// ------------------------------------------------------------------------------------------------------------------------------ // +// D3DX stuff. +// ------------------------------------------------------------------------------------------------------------------------------ // + +// matrix stack... + +HRESULT D3DXCreateMatrixStack( DWORD Flags, LPD3DXMATRIXSTACK* ppStack) +{ + + *ppStack = new ID3DXMatrixStack; + + (*ppStack)->Create(); + + return S_OK; +} + +ID3DXMatrixStack::ID3DXMatrixStack( void ) +{ + m_refcount[0] = 1; + m_refcount[1] = 0; +}; + +void ID3DXMatrixStack::AddRef( int which, char *comment ) +{ + Assert( which >= 0 ); + Assert( which < 2 ); + m_refcount[which]++; +}; + +ULONG ID3DXMatrixStack::Release( int which, char *comment ) +{ + Assert( which >= 0 ); + Assert( which < 2 ); + + bool deleting = false; + + m_refcount[which]--; + if ( (!m_refcount[0]) && (!m_refcount[1]) ) + { + deleting = true; + } + + if (deleting) + { + if (m_mark) + { + GLMPRINTF(("")) ; // place to hang a breakpoint + } + delete this; + return 0; + } + else + { + return m_refcount[0]; + } +}; + + +HRESULT ID3DXMatrixStack::Create() +{ + m_stack.EnsureCapacity( 16 ); // 1KB ish + m_stack.AddToTail(); + m_stackTop = 0; // top of stack is at index 0 currently + + LoadIdentity(); + + return S_OK; +} + +D3DXMATRIX* ID3DXMatrixStack::GetTop() +{ + return (D3DXMATRIX*)&m_stack[ m_stackTop ]; +} + +void ID3DXMatrixStack::Push() +{ + D3DMATRIX temp = m_stack[ m_stackTop ]; + m_stack.AddToTail( temp ); + m_stackTop ++; +} + +void ID3DXMatrixStack::Pop() +{ + int elem = m_stackTop--; + m_stack.Remove( elem ); +} + +void ID3DXMatrixStack::LoadIdentity() +{ + D3DXMATRIX *mat = GetTop(); + + D3DXMatrixIdentity( mat ); +} + +void ID3DXMatrixStack::LoadMatrix( const D3DXMATRIX *pMat ) +{ + *(GetTop()) = *pMat; +} + + +void ID3DXMatrixStack::MultMatrix( const D3DXMATRIX *pMat ) +{ + + // http://msdn.microsoft.com/en-us/library/bb174057(VS.85).aspx + // This method right-multiplies the given matrix to the current matrix + // (transformation is about the current world origin). + // m_pstack[m_currentPos] = m_pstack[m_currentPos] * (*pMat); + // This method does not add an item to the stack, it replaces the current + // matrix with the product of the current matrix and the given matrix. + + + DXABSTRACT_BREAK_ON_ERROR(); +} + +void ID3DXMatrixStack::MultMatrixLocal( const D3DXMATRIX *pMat ) +{ + // http://msdn.microsoft.com/en-us/library/bb174058(VS.85).aspx + // This method left-multiplies the given matrix to the current matrix + // (transformation is about the local origin of the object). + // m_pstack[m_currentPos] = (*pMat) * m_pstack[m_currentPos]; + // This method does not add an item to the stack, it replaces the current + // matrix with the product of the given matrix and the current matrix. + + + DXABSTRACT_BREAK_ON_ERROR(); +} + +HRESULT ID3DXMatrixStack::ScaleLocal(FLOAT x, FLOAT y, FLOAT z) +{ + // http://msdn.microsoft.com/en-us/library/bb174066(VS.85).aspx + // Scale the current matrix about the object origin. + // This method left-multiplies the current matrix with the computed + // scale matrix. The transformation is about the local origin of the object. + // + // D3DXMATRIX tmp; + // D3DXMatrixScaling(&tmp, x, y, z); + // m_stack[m_currentPos] = tmp * m_stack[m_currentPos]; + + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + + +HRESULT ID3DXMatrixStack::RotateAxisLocal(CONST D3DXVECTOR3* pV, FLOAT Angle) +{ + // http://msdn.microsoft.com/en-us/library/bb174062(VS.85).aspx + // Left multiply the current matrix with the computed rotation + // matrix, counterclockwise about the given axis with the given angle. + // (rotation is about the local origin of the object) + + // D3DXMATRIX tmp; + // D3DXMatrixRotationAxis( &tmp, pV, angle ); + // m_stack[m_currentPos] = tmp * m_stack[m_currentPos]; + // Because the rotation is left-multiplied to the matrix stack, the rotation + // is relative to the object's local coordinate space. + + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + +HRESULT ID3DXMatrixStack::TranslateLocal(FLOAT x, FLOAT y, FLOAT z) +{ + // http://msdn.microsoft.com/en-us/library/bb174068(VS.85).aspx + // Left multiply the current matrix with the computed translation + // matrix. (transformation is about the local origin of the object) + + // D3DXMATRIX tmp; + // D3DXMatrixTranslation( &tmp, x, y, z ); + // m_stack[m_currentPos] = tmp * m_stack[m_currentPos]; + + DXABSTRACT_BREAK_ON_ERROR(); + return S_OK; +} + + + + +const char* D3DXGetPixelShaderProfile( IDirect3DDevice9 *pDevice ) +{ + DXABSTRACT_BREAK_ON_ERROR(); + return ""; +} + +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable:4701) // potentially uninitialized local variable 'temp' used +#endif +D3DXMATRIX* D3DXMatrixMultiply( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM1, CONST D3DXMATRIX *pM2 ) +{ + D3DXMATRIX temp; + + for( int i=0; i<4; i++) + { + for( int j=0; j<4; j++) + { + temp.m[i][j] = (pM1->m[ i ][ 0 ] * pM2->m[ 0 ][ j ]) + + (pM1->m[ i ][ 1 ] * pM2->m[ 1 ][ j ]) + + (pM1->m[ i ][ 2 ] * pM2->m[ 2 ][ j ]) + + (pM1->m[ i ][ 3 ] * pM2->m[ 3 ][ j ]); + } + } + *pOut = temp; + return pOut; +} +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// Transform a 3D vector by a given matrix, projecting the result back into w = 1 +// http://msdn.microsoft.com/en-us/library/ee417622(VS.85).aspx +D3DXVECTOR3* D3DXVec3TransformCoord(D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM) +{ + D3DXVECTOR3 vOut; + + float norm = (pM->m[0][3] * pV->x) + (pM->m[1][3] * pV->y) + (pM->m[2][3] *pV->z) + pM->m[3][3]; + if ( norm ) + { + float norm_inv = 1.0f / norm; + vOut.x = (pM->m[0][0] * pV->x + pM->m[1][0] * pV->y + pM->m[2][0] * pV->z + pM->m[3][0]) * norm_inv; + vOut.y = (pM->m[0][1] * pV->x + pM->m[1][1] * pV->y + pM->m[2][1] * pV->z + pM->m[3][1]) * norm_inv; + vOut.z = (pM->m[0][2] * pV->x + pM->m[1][2] * pV->y + pM->m[2][2] * pV->z + pM->m[3][2]) * norm_inv; + } + else + { + vOut.x = vOut.y = vOut.z = 0.0f; + } + + *pOut = vOut; + + return pOut; +} + + +void D3DXMatrixIdentity( D3DXMATRIX *mat ) +{ + for( int i=0; i<4; i++) + { + for( int j=0; j<4; j++) + { + mat->m[i][j] = (i==j) ? 1.0f : 0.0f; // 1's on the diagonal. + } + } +} + +D3DXMATRIX* D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z ) +{ + D3DXMatrixIdentity( pOut ); + pOut->m[3][0] = x; + pOut->m[3][1] = y; + pOut->m[3][2] = z; + return pOut; +} + +D3DXMATRIX* D3DXMatrixInverse( D3DXMATRIX *pOut, FLOAT *pDeterminant, CONST D3DXMATRIX *pM ) +{ + Assert( sizeof( D3DXMATRIX ) == (16 * sizeof(float) ) ); + Assert( sizeof( VMatrix ) == (16 * sizeof(float) ) ); + Assert( pDeterminant == NULL ); // homey don't play that + + VMatrix *origM = (VMatrix*)pM; + VMatrix *destM = (VMatrix*)pOut; + + bool success = MatrixInverseGeneral( *origM, *destM ); (void)success; + Assert( success ); + + return pOut; +} + + +D3DXMATRIX* D3DXMatrixTranspose( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM ) +{ + if (pOut != pM) + { + for( int i=0; i<4; i++) + { + for( int j=0; j<4; j++) + { + pOut->m[i][j] = pM->m[j][i]; + } + } + } + else + { + D3DXMATRIX temp = *pM; + D3DXMatrixTranspose( pOut, &temp ); + } + + return NULL; +} + + +D3DXPLANE* D3DXPlaneNormalize( D3DXPLANE *pOut, CONST D3DXPLANE *pP) +{ + // not very different from normalizing a vector. + // figure out the square root of the sum-of-squares of the x,y,z components + // make sure that's non zero + // then divide all four components by that value + // or return some dummy plane like 0,0,1,0 if it fails + + float len = sqrt( (pP->a * pP->a) + (pP->b * pP->b) + (pP->c * pP->c) ); + if (len > 1e-10) //FIXME need a real epsilon here ? + { + pOut->a = pP->a / len; pOut->b = pP->b / len; pOut->c = pP->c / len; pOut->d = pP->d / len; + } + else + { + pOut->a = 0.0f; pOut->b = 0.0f; pOut->c = 1.0f; pOut->d = 0.0f; + } + return pOut; +} + + +D3DXVECTOR4* D3DXVec4Transform( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, CONST D3DXMATRIX *pM ) +{ + VMatrix *mat = (VMatrix*)pM; + Vector4D *vIn = (Vector4D*)pV; + Vector4D *vOut = (Vector4D*)pOut; + + Vector4DMultiplyTranspose( *mat, *vIn, *vOut ); + + return pOut; +} + + + +D3DXVECTOR4* D3DXVec4Normalize( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV ) +{ + Vector4D *vIn = (Vector4D*) pV; + Vector4D *vOut = (Vector4D*) pOut; + + *vOut = *vIn; + Vector4DNormalize( *vOut ); + + return pOut; +} + + +D3DXMATRIX* D3DXMatrixOrthoOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn,FLOAT zf ) +{ + DXABSTRACT_BREAK_ON_ERROR(); + return NULL; +} + + +D3DXMATRIX* D3DXMatrixPerspectiveRH( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf ) +{ + DXABSTRACT_BREAK_ON_ERROR(); + return NULL; +} + + +D3DXMATRIX* D3DXMatrixPerspectiveOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf ) +{ + DXABSTRACT_BREAK_ON_ERROR(); + return NULL; +} + + +D3DXPLANE* D3DXPlaneTransform( D3DXPLANE *pOut, CONST D3DXPLANE *pP, CONST D3DXMATRIX *pM ) +{ + float *out = &pOut->a; + + // dot dot dot + for( int x=0; x<4; x++ ) + { + out[x] = (pM->m[0][x] * pP->a) + + (pM->m[1][x] * pP->b) + + (pM->m[2][x] * pP->c) + + (pM->m[3][x] * pP->d); + } + + return pOut; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +IDirect3D9 *Direct3DCreate9(UINT SDKVersion) +{ + GLMPRINTF(( "-X- Direct3DCreate9: %d", SDKVersion )); + + return new IDirect3D9; +} + +// ------------------------------------------------------------------------------------------------------------------------------ // + +void D3DPERF_SetOptions( DWORD dwOptions ) +{ +} + + +HRESULT D3DXCompileShader( + LPCSTR pSrcData, + UINT SrcDataLen, + CONST D3DXMACRO* pDefines, + LPD3DXINCLUDE pInclude, + LPCSTR pFunctionName, + LPCSTR pProfile, + DWORD Flags, + LPD3DXBUFFER* ppShader, + LPD3DXBUFFER* ppErrorMsgs, + LPD3DXCONSTANTTABLE* ppConstantTable) +{ + DXABSTRACT_BREAK_ON_ERROR(); // is anyone calling this ? + return S_OK; +} + +#if defined(DX_TO_GL_ABSTRACTION) +void toglGetClientRect( void *hWnd, RECT *destRect ) +{ + // the only useful answer this call can offer, is the size of the canvas. + // actually getting the window bounds is not useful. + // so, see if a D3D device is up and running, and if so, + // dig in and find out its backbuffer size and use that. + + uint width, height; + g_pLauncherMgr->RenderedSize( width, height, false ); // false = get them, don't set them + Assert( width!=0 && height!=0 ); + + destRect->left = 0; + destRect->top = 0; + destRect->right = width; + destRect->bottom = height; + + //GLMPRINTF(( "-D- GetClientRect returning rect of (0,0, %d,%d)",width,height )); + + return; +} + +#endif + +#endif diff --git a/togles/linuxwin/glentrypoints.cpp b/togles/linuxwin/glentrypoints.cpp new file mode 100644 index 00000000..ef1f01ff --- /dev/null +++ b/togles/linuxwin/glentrypoints.cpp @@ -0,0 +1,512 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glentrypoints.cpp +// +//=============================================================================// +// Immediately include gl.h, etc. here to avoid compilation warnings. + +#include "togl/rendermechanism.h" + +#include "appframework/AppFramework.h" +#include "appframework/IAppSystemGroup.h" +#include "tier0/dbg.h" +#include "tier0/icommandline.h" +#include "tier0/platform.h" +#include "interface.h" +#include "filesystem.h" +#include "filesystem_init.h" +#include "tier1/convar.h" +#include "vstdlib/cvar.h" +#include "inputsystem/ButtonCode.h" +#include "tier1.h" +#include "tier2/tier2.h" + +#if defined(_LINUX) && !defined(__ANDROID__) +#include +#endif + +// NOTE: This has to be the last file included! +#include "tier0/memdbgon.h" + +#if !defined(DX_TO_GL_ABSTRACTION) +#error +#endif + +#if defined(OSX) || defined(LINUX) || (defined (WIN32) && defined( DX_TO_GL_ABSTRACTION )) + #include "appframework/ilaunchermgr.h" + ILauncherMgr *g_pLauncherMgr = NULL; +#endif + +#define DEBUG_ALL_GLCALLS 0 + +#if DEBUG_ALL_GLCALLS +bool g_bDebugOpenGLCalls = true; +bool g_bPrintOpenGLCalls = false; + +#define GL_EXT(x,glmajor,glminor) +#define GL_FUNC(ext,req,ret,fn,arg,call) \ + static ret (*fn##_gldebugptr) arg = NULL; \ + static ret fn##_gldebug arg { \ + if (!g_bDebugOpenGLCalls) { return fn##_gldebugptr call; } \ + if (g_bPrintOpenGLCalls) { \ + printf("Calling %s ... ", #fn); \ + fflush(stdout); \ + } \ + ret retval = fn##_gldebugptr call; \ + if (g_bPrintOpenGLCalls) { \ + printf("%s returned!\n", #fn); \ + fflush(stdout); \ + } \ + const GLenum err = glGetError_gldebugptr(); \ + if ( err == GL_INVALID_FRAMEBUFFER_OPERATION_EXT ) { \ + const GLenum fberr = gGL->glCheckFramebufferStatus( GL_FRAMEBUFFER_EXT ); \ + printf("%s triggered error GL_INVALID_FRAMEBUFFER_OPERATION_EXT! (0x%X)\n\n\n", #fn, (int) fberr); \ + fflush(stdout); \ + __asm__ __volatile__ ( "int $3\n\t" ); \ + } else if (err != GL_NO_ERROR) { \ + printf("%s triggered error 0x%X!\n\n\n", #fn, (int) err); \ + fflush(stdout); \ + __asm__ __volatile__ ( "int $3\n\t" ); \ + } \ + return retval; \ +} + +#define GL_FUNC_VOID(ext,req,fn,arg,call) \ + static void (*fn##_gldebugptr) arg = NULL; \ + static void fn##_gldebug arg { \ + if (!g_bDebugOpenGLCalls) { fn##_gldebugptr call; return; } \ + if (g_bPrintOpenGLCalls) { \ + printf("Calling %s ... ", #fn); \ + fflush(stdout); \ + } \ + fn##_gldebugptr call; \ + if (g_bPrintOpenGLCalls) { \ + printf("%s returned!\n", #fn); \ + fflush(stdout); \ + } \ + const GLenum err = glGetError_gldebugptr(); \ + if ( err == GL_INVALID_FRAMEBUFFER_OPERATION_EXT ) { \ + const GLenum fberr = gGL->glCheckFramebufferStatus( GL_FRAMEBUFFER_EXT ); \ + printf("%s triggered error GL_INVALID_FRAMEBUFFER_OPERATION_EXT! (0x%X)\n\n\n", #fn, (int) fberr); \ + fflush(stdout); \ + __asm__ __volatile__ ( "int $3\n\t" ); \ + } else if (err != GL_NO_ERROR) { \ + printf("%s triggered error 0x%X!\n\n\n", #fn, (int) err); \ + fflush(stdout); \ + __asm__ __volatile__ ( "int $3\n\t" ); \ + } \ +} + +#include "togl/glfuncs.inl" +#undef GL_FUNC_VOID +#undef GL_FUNC +#undef GL_EXT +#endif + +COpenGLEntryPoints *gGL = NULL; +GL_GetProcAddressCallbackFunc_t gGL_GetProcAddressCallback = NULL; + +void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, void *fallback) +{ + void *retval = NULL; + if ((!okay) && (!bRequired)) // always look up if required (so we get a complete list of crucial missing symbols). + return NULL; + + // SDL does the right thing, so we never need to use tier0 in this case. + retval = (*gGL_GetProcAddressCallback)(fn, okay, bRequired, fallback); + //printf("CDynamicFunctionOpenGL: SDL_GL_GetProcAddress(\"%s\") returned %p\n", fn, retval); + if ((retval == NULL) && (fallback != NULL)) + { + //printf("CDynamicFunctionOpenGL: Using fallback %p for \"%s\"\n", fallback, fn); + retval = fallback; + } + + // Note that a non-NULL response doesn't mean it's safe to call the function! + // You always have to check that the extension is supported; + // an implementation MAY return NULL in this case, but it doesn't have to (and doesn't, with the DRI drivers). + okay = (okay && (retval != NULL)); + if (bRequired && !okay) + fprintf(stderr, "Could not find required OpenGL entry point '%s'!\n", fn); + + return retval; +} + +COpenGLEntryPoints *GetOpenGLEntryPoints(GL_GetProcAddressCallbackFunc_t callback) +{ + if (gGL == NULL) + { + gGL_GetProcAddressCallback = callback; + gGL = new COpenGLEntryPoints(); + if (!gGL->m_bHave_OpenGL) + Error( "Missing basic required OpenGL functionality." ); + + } + return gGL; +} + +void ClearOpenGLEntryPoints() +{ + if ( gGL ) + { + gGL->ClearEntryPoints(); + } +} +COpenGLEntryPoints *ToGLConnectLibraries( CreateInterfaceFn factory ) +{ + ConnectTier1Libraries( &factory, 1 ); + ConVar_Register(); + ConnectTier2Libraries( &factory, 1 ); + + if ( !g_pFullFileSystem ) + { + Warning( "ToGL was unable to access the required interfaces!\n" ); + } + + // NOTE! : Overbright is 1.0 so that Hammer will work properly with the white bumped and unbumped lightmaps. + MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f ); + + #if defined( USE_SDL ) + g_pLauncherMgr = (ILauncherMgr *)factory( SDLMGR_INTERFACE_VERSION, NULL ); + #endif + + return gGL; +} + +void ToGLDisconnectLibraries() +{ + DisconnectTier2Libraries(); + ConVar_Unregister(); + DisconnectTier1Libraries(); +} + +#define GLVERNUM(Major, Minor, Patch) (((Major) * 100000) + ((Minor) * 1000) + (Patch)) + +static void GetOpenGLVersion(int *major, int *minor, int *patch) +{ + *major = *minor = *patch = 0; + static CDynamicFunctionOpenGL< true, const GLubyte *( APIENTRY *)(GLenum name), const GLubyte * > glGetString("glGetString"); + if (glGetString) + { + const char *version = (const char *) glGetString(GL_VERSION); + if (version) + { + sscanf( version, "%d.%d.%d", major, minor, patch ); + } + } +} + +static int GetOpenGLVersionMajor() +{ + int major, minor, patch; + GetOpenGLVersion(&major, &minor, &patch); + return major; +} + +static int GetOpenGLVersionMinor() +{ + int major, minor, patch; + GetOpenGLVersion(&major, &minor, &patch); + return minor; +} + +static int GetOpenGLVersionPatch() +{ + int major, minor, patch; + GetOpenGLVersion(&major, &minor, &patch); + return patch; +} + +static bool CheckBaseOpenGLVersion() +{ + const int NEED_MAJOR = 2; + const int NEED_MINOR = 0; + const int NEED_PATCH = 0; + + int major, minor, patch; + GetOpenGLVersion(&major, &minor, &patch); + + const int need = GLVERNUM(NEED_MAJOR, NEED_MINOR, NEED_PATCH); + const int have = GLVERNUM(major, minor, patch); + if (have < need) + { + fprintf(stderr, "PROBLEM: You appear to have OpenGL %d.%d.%d, but we need at least %d.%d.%d!\n", + major, minor, patch, NEED_MAJOR, NEED_MINOR, NEED_PATCH); + return false; + } + return true; +} + +static bool CheckOpenGLExtension_internal(const char *ext, const int coremajor, const int coreminor) +{ + if ((coremajor >= 0) && (coreminor >= 0)) // we know that this extension is part of the base spec as of GL_VERSION coremajor.coreminor. + { + int major, minor, patch; + GetOpenGLVersion(&major, &minor, &patch); + const int need = GLVERNUM(coremajor, coreminor, 0); + const int have = GLVERNUM(major, minor, patch); + if (have >= need) + return true; // we definitely have access to this "extension," as it is part of this version of the GL's core functionality. + } + + // okay, see if the GL_EXTENSIONS string reports it. + static CDynamicFunctionOpenGL< true, const GLubyte *( APIENTRY *)(GLenum name), const GLubyte * > glGetString("glGetString"); + if (!glGetString) + return false; + + // hacky scanning of this string, because I don't want to spend time breaking it into a vector like I should have. + const char *extensions = (const char *) glGetString(GL_EXTENSIONS); + const size_t extlen = strlen(ext); + while ((extensions) && (*extensions)) + { + const char *ptr = strstr(extensions, ext); +#if _WIN32 + if (!ptr) + { + static CDynamicFunctionOpenGL< true, const char *( APIENTRY *)( ), const char * > wglGetExtensionsStringEXT("wglGetExtensionsStringEXT"); + if (wglGetExtensionsStringEXT) + { + extensions = wglGetExtensionsStringEXT(); + ptr = strstr(extensions, ext); + } + + if (!ptr) + { + return false; + } + } +#elif !defined ( OSX ) && !defined( __ANDROID__ ) + if (!ptr) + { + static CDynamicFunctionOpenGL< true, Display *( APIENTRY *)( ), Display* > glXGetCurrentDisplay("glXGetCurrentDisplay"); + static CDynamicFunctionOpenGL< true, const char *( APIENTRY *)( Display*, int ), const char * > glXQueryExtensionsString("glXQueryExtensionsString"); + if (glXQueryExtensionsString && glXGetCurrentDisplay) + { + extensions = glXQueryExtensionsString(glXGetCurrentDisplay(), 0); + ptr = strstr(extensions, ext); + } + } +#endif + + if (!ptr) + return false; + + // make sure this matches the entire string, and isn't a substring match of some other extension. + // if ( ( (string is at start of extension list) or (the char before the string is a space) ) and + // (the next char after the string is a space or a null terminator) ) + if ( ((ptr == extensions) || (ptr[-1] == ' ')) && + ((ptr[extlen] == ' ') || (ptr[extlen] == '\0')) ) + return true; // found it! + + extensions = ptr + extlen; // skip ahead, search again. + } + return false; +} + +static bool CheckOpenGLExtension(const char *ext, const int coremajor, const int coreminor) +{ + const bool retval = CheckOpenGLExtension_internal(ext, coremajor, coreminor); + printf("This system %s the OpenGL extension %s.\n", retval ? "supports" : "DOES NOT support", ext); + return retval; +} + +// The GL context you want entry points for must be current when you hit this constructor! +COpenGLEntryPoints::COpenGLEntryPoints() + : m_nTotalGLCycles(0) + , m_nTotalGLCalls(0) + , m_nOpenGLVersionMajor(GetOpenGLVersionMajor()) + , m_nOpenGLVersionMinor(GetOpenGLVersionMinor()) + , m_nOpenGLVersionPatch(GetOpenGLVersionPatch()) + , m_bHave_OpenGL(CheckBaseOpenGLVersion()) // may reset to false as these lookups happen. +#define GL_EXT(x,glmajor,glminor) , m_bHave_##x(CheckOpenGLExtension(#x, glmajor, glminor)) +#define GL_FUNC(ext,req,ret,fn,arg,call) , fn(#fn, m_bHave_##ext) +#define GL_FUNC_VOID(ext,req,fn,arg,call) , fn(#fn, m_bHave_##ext) +#include "togl/glfuncs.inl" +#undef GL_FUNC_VOID +#undef GL_FUNC +#undef GL_EXT +{ + // Locally cache the copy of the GL device strings, to avoid needing to call these glGet's (which can be extremely slow) more than once. + const char *pszString = ( const char * )glGetString(GL_VENDOR); + m_pGLDriverStrings[cGLVendorString] = strdup( pszString ? pszString : "" ); + + m_nDriverProvider = cGLDriverProviderUnknown; + if ( V_stristr( m_pGLDriverStrings[cGLVendorString], "nvidia" ) ) + m_nDriverProvider = cGLDriverProviderNVIDIA; + else if ( V_stristr( m_pGLDriverStrings[cGLVendorString], "amd" ) || V_stristr( m_pGLDriverStrings[cGLVendorString], "ati" ) ) + m_nDriverProvider = cGLDriverProviderAMD; + else if ( V_stristr( m_pGLDriverStrings[cGLVendorString], "intel" ) ) + m_nDriverProvider = cGLDriverProviderIntelOpenSource; + else if ( V_stristr( m_pGLDriverStrings[cGLVendorString], "apple" ) ) + m_nDriverProvider = cGLDriverProviderApple; + + pszString = ( const char * )glGetString(GL_RENDERER); + m_pGLDriverStrings[cGLRendererString] = strdup( pszString ? pszString : "" ); + + pszString = ( const char * )glGetString(GL_VERSION); + m_pGLDriverStrings[cGLVersionString] = strdup( pszString ? pszString : "" ); + + pszString = ( const char * )glGetString(GL_EXTENSIONS); + m_pGLDriverStrings[cGLExtensionsString] = strdup( pszString ? pszString : "" ); + + printf( "OpenGL: %s %s (%d.%d.%d)\n", m_pGLDriverStrings[ cGLRendererString ], m_pGLDriverStrings[ cGLVersionString ], + m_nOpenGLVersionMajor, m_nOpenGLVersionMinor, m_nOpenGLVersionPatch ); + + // !!! FIXME: Alfred says the original GL_APPLE_fence code only exists to + // !!! FIXME: hint Apple's drivers and not because we rely on the + // !!! FIXME: functionality. If so, just remove this check (and the + // !!! FIXME: GL_NV_fence code entirely). +#ifndef ANDROID // HACK + if ((m_bHave_OpenGL) && ((!m_bHave_GL_NV_fence) && (!m_bHave_GL_ARB_sync) && (!m_bHave_GL_APPLE_fence))) + { + Error( "Required OpenGL extension \"GL_NV_fence\", \"GL_ARB_sync\", or \"GL_APPLE_fence\" is not supported. Please upgrade your OpenGL driver." ); + } +#endif + + // same extension, different name. + if (m_bHave_GL_EXT_vertex_array_bgra || m_bHave_GL_ARB_vertex_array_bgra) + { + m_bHave_GL_EXT_vertex_array_bgra = m_bHave_GL_ARB_vertex_array_bgra = true; + } + + // GL_ARB_framebuffer_object is a superset of GL_EXT_framebuffer_object, + // (etc) but if you don't call in through the ARB entry points, you won't + // get the relaxed restrictions on mismatched attachment dimensions. + if (m_bHave_GL_ARB_framebuffer_object) + { + m_bHave_GL_EXT_framebuffer_object = true; + m_bHave_GL_EXT_framebuffer_blit = true; + m_bHave_GL_EXT_framebuffer_multisample = true; + glBindFramebufferEXT.Force(glBindFramebuffer.Pointer()); + glBindRenderbufferEXT.Force(glBindRenderbuffer.Pointer()); + glCheckFramebufferStatusEXT.Force(glCheckFramebufferStatus.Pointer()); + glDeleteRenderbuffersEXT.Force(glDeleteRenderbuffers.Pointer()); + glFramebufferRenderbufferEXT.Force(glFramebufferRenderbuffer.Pointer()); + glFramebufferTexture2DEXT.Force(glFramebufferTexture2D.Pointer()); + glFramebufferTexture3DEXT.Force(glFramebufferTexture3D.Pointer()); + glGenFramebuffersEXT.Force(glGenFramebuffers.Pointer()); + glGenRenderbuffersEXT.Force(glGenRenderbuffers.Pointer()); + glDeleteFramebuffersEXT.Force(glDeleteFramebuffers.Pointer()); + glBlitFramebufferEXT.Force(glBlitFramebuffer.Pointer()); + glRenderbufferStorageMultisampleEXT.Force(glRenderbufferStorageMultisample.Pointer()); + } + +#if DEBUG_ALL_GLCALLS + // push all GL calls through the debug wrappers. +#define GL_EXT(x,glmajor,glminor) +#define GL_FUNC(ext,req,ret,fn,arg,call) \ + fn##_gldebugptr = this->fn; \ + this->fn.Force(fn##_gldebug); +#define GL_FUNC_VOID(ext,req,fn,arg,call) \ + fn##_gldebugptr = this->fn; \ + this->fn.Force(fn##_gldebug); +#include "togl/glfuncs.inl" +#undef GL_FUNC_VOID +#undef GL_FUNC +#undef GL_EXT +#endif + +#ifdef OSX + m_bHave_GL_NV_bindless_texture = false; + m_bHave_GL_AMD_pinned_memory = false; +#else + if ( ( m_bHave_GL_NV_bindless_texture ) && ( !CommandLine()->CheckParm( "-gl_nv_bindless_texturing" ) ) ) + { + m_bHave_GL_NV_bindless_texture = false; + glGetTextureHandleNV.Force( NULL ); + glGetTextureSamplerHandleNV.Force( NULL ); + glMakeTextureHandleResidentNV.Force( NULL ); + glMakeTextureHandleNonResidentNV.Force( NULL ); + glUniformHandleui64NV.Force( NULL ); + glUniformHandleui64vNV.Force( NULL ); + glProgramUniformHandleui64NV.Force( NULL ); + glProgramUniformHandleui64vNV.Force( NULL ); + glIsTextureHandleResidentNV.Force( NULL ); + } + + if ( !CommandLine()->CheckParm( "-gl_amd_pinned_memory" ) ) + { + m_bHave_GL_AMD_pinned_memory = false; + } +#endif // !OSX + + // Getting reports of black screens, etc. with ARB_buffer_storage and AMD drivers. This type of thing: + // http://forums.steampowered.com/forums/showthread.php?t=3266806 + // So disable it for now. + if ( ( m_nDriverProvider == cGLDriverProviderAMD ) || CommandLine()->CheckParm( "-gl_disable_arb_buffer_storage" ) ) + { + m_bHave_GL_ARB_buffer_storage = false; + } + + printf( "GL_NV_bindless_texture: %s\n", m_bHave_GL_NV_bindless_texture ? "ENABLED" : "DISABLED" ); + printf( "GL_AMD_pinned_memory: %s\n", m_bHave_GL_AMD_pinned_memory ? "ENABLED" : "DISABLED" ); + printf( "GL_ARB_buffer_storage: %s\n", m_bHave_GL_ARB_buffer_storage ? "AVAILABLE" : "NOT AVAILABLE" ); + printf( "GL_EXT_texture_sRGB_decode: %s\n", m_bHave_GL_EXT_texture_sRGB_decode ? "AVAILABLE" : "NOT AVAILABLE" ); + + bool bGLCanDecodeS3TCTextures = m_bHave_GL_EXT_texture_compression_s3tc || ( m_bHave_GL_EXT_texture_compression_dxt1 && m_bHave_GL_ANGLE_texture_compression_dxt3 && m_bHave_GL_ANGLE_texture_compression_dxt5 ); + if ( !bGLCanDecodeS3TCTextures ) + { + Error( "This application requires either the GL_EXT_texture_compression_s3tc, or the GL_EXT_texture_compression_dxt1 + GL_ANGLE_texture_compression_dxt3 + GL_ANGLE_texture_compression_dxt5 OpenGL extensions. Please install S3TC texture support.\n" ); + } + +#ifdef OSX + if ( CommandLine()->FindParm( "-glmnosrgbdecode" ) ) + { + Msg( "Forcing m_bHave_GL_EXT_texture_sRGB_decode off.\n" ); + m_bHave_GL_EXT_texture_sRGB_decode = false; + } +#endif + +#ifndef OSX + if ( !m_bHave_GL_EXT_texture_sRGB_decode ) + { + Error( "Required OpenGL extension \"GL_EXT_texture_sRGB_decode\" is not supported. Please update your OpenGL driver.\n" ); + } +#endif +} + +COpenGLEntryPoints::~COpenGLEntryPoints() +{ + for ( uint i = 0; i < cGLTotalDriverProviders; ++i ) + { + free( m_pGLDriverStrings[i] ); + m_pGLDriverStrings[i] = NULL; + } +} + +void COpenGLEntryPoints::ClearEntryPoints() +{ + #define GL_EXT(x,glmajor,glminor) + #define GL_FUNC(ext,req,ret,fn,arg,call) fn.Force( NULL ); + #define GL_FUNC_VOID(ext,req,fn,arg,call) fn.Force( NULL ); + #include "togl/glfuncs.inl" + #undef GL_FUNC_VOID + #undef GL_FUNC + #undef GL_EXT +} +// Turn off memdbg macros (turned on up top) since this is included like a header +#include "tier0/memdbgoff.h" + + + diff --git a/togles/linuxwin/glmgr.cpp b/togles/linuxwin/glmgr.cpp new file mode 100644 index 00000000..1c18720f --- /dev/null +++ b/togles/linuxwin/glmgr.cpp @@ -0,0 +1,6092 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glmgr.cpp +// +//=============================================================================== +#include "togl/rendermechanism.h" + +#include "tier0/icommandline.h" + +#include "tier0/vprof.h" +#include "glmtexinlines.h" + +#include "materialsystem/IShader.h" +#include "appframework/ilaunchermgr.h" + +#include "convar.h" + +#include "glmgr_flush.inl" + +#ifdef OSX +#include +#include "intelglmallocworkaround.h" +#endif + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + + +// Whether the code should use gl_arb_debug_output. This causes error messages to be streamed, via callback, to the application. +// It is much friendlier to the MTGL driver. +// NOTE: This can be turned off after launch, but it cannot be turned on after launch--it implies a context-creation-time +// behavior. +ConVar gl_debug_output( "gl_debug_output", "1" ); + + +// Whether or not we should batch up our creation and deletion behavior. +ConVar gl_batch_tex_creates( "gl_batch_tex_creates", "0" ); +ConVar gl_batch_tex_destroys( "gl_batch_tex_destroys", "0" ); + +//=============================================================================== + +// g_nTotalDrawsOrClears is reset to 0 in Present() +uint g_nTotalDrawsOrClears, g_nTotalVBLockBytes, g_nTotalIBLockBytes; + +#if GL_TELEMETRY_GPU_ZONES +TelemetryGPUStats_t g_TelemetryGPUStats; +#endif + +const int kGLMInitialTexCount = 4096; +const int kGLMReUpTexCount = 1024; +const int kGLMHighWaterUndeleted = 2048; +const int kDeletedTextureDim = 4; +const uint32 g_garbageTextureBits[ 4 * kDeletedTextureDim * kDeletedTextureDim ] = { 0 }; + +char g_nullFragmentProgramText [] = +{ + "!!ARBfp1.0 \n" + "PARAM black = { 0.0, 0.0, 0.0, 1.0 }; \n" // opaque black + "MOV result.color, black; \n" + "END \n\n\n" + "//GLSLfp\n" + "void main()\n" + "{\n" + "gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n" + "}\n" + +}; + +// make dummy programs for doing texture preload via dummy draw +char g_preloadTexVertexProgramText[] = +{ + "//GLSLvp \n" + "#version 120 \n" + "varying vec4 otex; \n" + "void main() \n" + "{ \n" + "vec4 pos = ftransform(); // vec4( 0.1, 0.1, 0.1, 0.1 ); \n" + "vec4 tex = vec4( 0.0, 0.0, 0.0, 0.0 ); \n" + " \n" + "gl_Position = pos; \n" + "otex = tex; \n" + "} \n" +}; + +char g_preload2DTexFragmentProgramText[] = +{ + "//GLSLfp \n" + "#version 120 \n" + "varying vec4 otex; \n" + "//SAMPLERMASK-8000 // may not be needed \n" + "//HIGHWATER-30 // may not be needed \n" + " \n" + "uniform vec4 pc[31]; \n" + "uniform sampler2D sampler15; \n" + " \n" + "void main() \n" + "{ \n" + "vec4 r0; \n" + "r0 = texture2D( sampler15, otex.xy ); \n" + "gl_FragColor = r0; //discard; \n" + "} \n" +}; + +char g_preload3DTexFragmentProgramText[] = +{ + "//GLSLfp \n" + "#version 120 \n" + "varying vec4 otex; \n" + "//SAMPLERMASK-8000 // may not be needed \n" + "//HIGHWATER-30 // may not be needed \n" + " \n" + "uniform vec4 pc[31]; \n" + "uniform sampler3D sampler15; \n" + " \n" + "void main() \n" + "{ \n" + "vec4 r0; \n" + "r0 = texture3D( sampler15, otex.xyz ); \n" + "gl_FragColor = r0; //discard; \n" + "} \n" +}; + +char g_preloadCubeTexFragmentProgramText[] = +{ + "//GLSLfp \n" + "#version 120 \n" + "varying vec4 otex; \n" + "//SAMPLERMASK-8000 // may not be needed \n" + "//HIGHWATER-30 // may not be needed \n" + " \n" + "uniform vec4 pc[31]; \n" + "uniform samplerCube sampler15; \n" + " \n" + "void main() \n" + "{ \n" + "vec4 r0; \n" + "r0 = textureCube( sampler15, otex.xyz ); \n" + "gl_FragColor = r0; //discard; \n" + "} \n" +}; + +const char* glSourceToString(GLenum source) +{ + switch (source) + { + case GL_DEBUG_SOURCE_API_ARB: return "API"; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: return "WINDOW_SYSTEM"; + case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: return "SHADER_COMPILER"; + case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: return "THIRD_PARTY"; + case GL_DEBUG_SOURCE_APPLICATION_ARB: return "APPLICATION"; + case GL_DEBUG_SOURCE_OTHER_ARB: return "OTHER"; + default: break; + } + return "UNKNOWN"; +} + +const char* glTypeToString(GLenum type) +{ + switch (type) + { + case GL_DEBUG_TYPE_ERROR_ARB: return "ERROR"; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB: return "DEPRECATION"; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB: return "UNDEFINED_BEHAVIOR"; + case GL_DEBUG_TYPE_PORTABILITY_ARB: return "PORTABILITY"; + case GL_DEBUG_TYPE_PERFORMANCE_ARB: return "PERFORMANCE"; + case GL_DEBUG_TYPE_OTHER_ARB: return "OTHER"; + default: break; + } + return "UNKNOWN"; +} + +const char* glSeverityToString(GLenum severity) +{ + switch (severity) + { + case GL_DEBUG_SEVERITY_HIGH_ARB: return "HIGH"; + case GL_DEBUG_SEVERITY_MEDIUM_ARB: return "MEDIUM"; + case GL_DEBUG_SEVERITY_LOW_ARB: return "LOW"; + default: break; + } + return "UNKNOWN"; +} + +bool g_bDebugOutputBreakpoints = true; + +void APIENTRY GL_Debug_Output_Callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam) +{ + const char *sSource = glSourceToString(source), + *sType = glTypeToString(type), + *sSeverity = glSeverityToString(severity); + + // According to NVidia, this error is a bug in the driver and not really an error (it's a warning in newer drivers): "Texture X is base level inconsistent. Check texture size" + if ( ( type == GL_DEBUG_TYPE_ERROR_ARB ) && strstr( message, "base level inconsistent" ) ) + { + return; + } + + if ( gl_debug_output.GetBool() || type == GL_DEBUG_TYPE_ERROR_ARB ) + { + Msg( "GL: [%s][%s][%s][%d]: %s\n", sSource, sType, sSeverity, id, message ); + } + +#ifdef WIN32 + OutputDebugStringA( message ); +#endif + + if ( ( type == GL_DEBUG_TYPE_ERROR_ARB ) && ( g_bDebugOutputBreakpoints ) ) + { + DebuggerBreak(); + } +} + +void GLMDebugPrintf( const char *pMsg, ... ) +{ + //$ TODO: Should this call Warning()? + //$ TODO: Should replace call these calls with Warning() / Msg() / DevMsg()? + + va_list args; + va_start( args, pMsg ); + vprintf( pMsg, args ); + va_end( args ); +} + +//=============================================================================== +// functions that are dependant on g_pLauncherMgr + +inline bool MakeContextCurrent( PseudoGLContextPtr hContext ) +{ + return g_pLauncherMgr->MakeContextCurrent( hContext ); +} + +inline PseudoGLContextPtr GetMainContext() +{ + return g_pLauncherMgr->GetMainContext(); +} + +inline PseudoGLContextPtr GetGLContextForWindow( void* windowref ) +{ + return g_pLauncherMgr->GetGLContextForWindow( windowref ); +} + +inline void IncrementWindowRefCount() +{ + g_pLauncherMgr->IncWindowRefCount(); +} +inline void DecrementWindowRefCount() +{ + g_pLauncherMgr->DecWindowRefCount(); +} +inline void ShowPixels( CShowPixelsParams *params ) +{ + g_pLauncherMgr->ShowPixels(params); +} + +inline void DisplayedSize( uint &width, uint &height ) +{ + g_pLauncherMgr->DisplayedSize( width, height ); +} + +inline void GetDesiredPixelFormatAttribsAndRendererInfo( uint **ptrOut, uint *countOut, GLMRendererInfoFields *rendInfoOut ) +{ + g_pLauncherMgr->GetDesiredPixelFormatAttribsAndRendererInfo( ptrOut, countOut, rendInfoOut ); +} + +inline void GetStackCrawl( CStackCrawlParams *params ) +{ + g_pLauncherMgr->GetStackCrawl(params); +} + +#if GLMDEBUG +inline void PumpWindowsMessageLoop() +{ + g_pLauncherMgr->PumpWindowsMessageLoop(); +} +inline int GetEvents( CCocoaEvent *pEvents, int nMaxEventsToReturn, bool debugEvents = false ) +{ + return g_pLauncherMgr->GetEvents( pEvents, nMaxEventsToReturn, debugEvents ); +} +#endif + +//=============================================================================== +// helper routines for debug + +static bool hasnonzeros( float *values, int count ) +{ + for( int i=0; i [ %10.5f %10.5f %10.5f %10.5f ]", + baseSlotNumber+islot, + row[0],row[1],row[2],row[3], + col[0],col[1],col[2],col[3] + )); + } + else + { + if (islot<3) + { + GLMPRINTF(( "-D- %03d: [ %10.5f %10.5f %10.5f %10.5f ] T=> [ %10.5f %10.5f %10.5f ]", + baseSlotNumber+islot, + row[0],row[1],row[2],row[3], + col[0],col[1],col[2] + )); + } + else + { + GLMPRINTF(( "-D- %03d: T=> [ %10.5f %10.5f %10.5f ]", + baseSlotNumber+islot, + col[0],col[1],col[2] + )); + } + } + } + GLMPRINTSTR(("-D-")); + } + else + { + GLMPRINTF(("-D- %s - (all 0.0)", label )); + } + +} + + +static void transform_dp4( float *in4, float *m00, int slots, float *out4 ) +{ + // m00 points to a column. + // each DP is one column of the matrix ( m00[4*n] + // if we are passed a three slot matrix, this is three columns, the source W plays into all three columns, but we must set the final output W to 1 ? + for( int n=0; nm_nCurOwnerThreadId = ThreadGetCurrentId(); + if ( !MakeContextCurrent( context->m_ctx ) ) + { + // give up + GLMStop(); + } + Assert( 0 ); +#endif +} + +GLMContext *GLMgr::GetCurrentContext( void ) +{ +#if defined( USE_SDL ) + PseudoGLContextPtr context = GetMainContext(); + return (GLMContext*) context; +#else + Assert( 0 ); + return NULL; +#endif +} + + +// #define CHECK_THREAD_USAGE 1 + + +//=============================================================================== +// GLMContext public methods +void GLMContext::MakeCurrent( bool bRenderThread ) +{ + tmZone( TELEMETRY_LEVEL0, 0, "GLMContext::MakeCurrent" ); + Assert( m_nCurOwnerThreadId == 0 || m_nCurOwnerThreadId == ThreadGetCurrentId() ); + +#if defined( USE_SDL ) + +#ifndef CHECK_THREAD_USAGE + if ( bRenderThread ) + { +// Msg( "******************************************** %08x Acquiring Context\n", ThreadGetCurrentId() ); + m_nCurOwnerThreadId = ThreadGetCurrentId(); + bool bSuccess = MakeContextCurrent( m_ctx ); + if ( !bSuccess ) + { + Assert( 0 ); + } + } +#else + uint32 dwThreadId = ThreadGetCurrentId(); + + if ( bRenderThread || dwThreadId == m_dwRenderThreadId ) + { + m_nCurOwnerThreadId = ThreadGetCurrentId(); + m_dwRenderThreadId = dwThreadId; + MakeContextCurrent( m_ctx ); + m_bIsThreading = true; + } + else if ( !m_bIsThreading ) + { + m_nCurOwnerThreadId = ThreadGetCurrentId(); + MakeContextCurrent( m_ctx ); + } + else + { + Assert( 0 ); + } +#endif + +#else + Assert( 0 ); +#endif +} + + +void GLMContext::ReleaseCurrent( bool bRenderThread ) +{ + tmZone( TELEMETRY_LEVEL0, 0, "GLMContext::ReleaseCurrent" ); + Assert( m_nCurOwnerThreadId == ThreadGetCurrentId() ); + +#if defined( USE_SDL ) + +#ifndef CHECK_THREAD_USAGE + if ( bRenderThread ) + { +// Msg( "******************************************** %08x Releasing Context\n", ThreadGetCurrentId() ); + m_nCurOwnerThreadId = 0; + m_nThreadOwnershipReleaseCounter++; + MakeContextCurrent( NULL ); + } +#else + m_nCurOwnerThreadId = 0; + m_nThreadOwnershipReleaseCounter++; + MakeContextCurrent( NULL ); + if ( bRenderThread ) + { + m_bIsThreading = false; + } +#endif + +#else + Assert( 0 ); +#endif +} + + +// This function forces all GL state to be re-sent to the context. Some state will only be set on the next batch flush. +void GLMContext::ForceFlushStates() +{ + // Flush various render states + m_AlphaTestEnable.Flush(); + m_AlphaTestFunc.Flush(); + + m_DepthBias.Flush(); + + m_ScissorEnable.Flush(); + m_ScissorBox.Flush(); + + m_ViewportBox.Flush(); + m_ViewportDepthRange.Flush(); + + m_ColorMaskSingle.Flush(); + + m_BlendEnable.Flush(); + m_BlendFactor.Flush(); + + m_BlendEnableSRGB.Flush(); + + m_DepthTestEnable.Flush(); + m_DepthFunc.Flush(); + m_DepthMask.Flush(); + + m_StencilTestEnable.Flush(); + m_StencilFunc.Flush(); + m_StencilOp.Flush(); + m_StencilWriteMask.Flush(); + + m_ClearColor.Flush(); + m_ClearDepth.Flush(); + m_ClearStencil.Flush(); + + m_ClipPlaneEnable.Flush(); // always push clip state + m_ClipPlaneEquation.Flush(); + + m_CullFaceEnable.Flush(); + + m_CullFrontFace.Flush(); + + m_PolygonMode.Flush(); + + m_AlphaToCoverageEnable.Flush(); + m_ColorMaskMultiple.Flush(); + m_BlendEquation.Flush(); + m_BlendColor.Flush(); + // Reset various things so they get reset on the next batch flush + m_activeTexture = -1; + + for ( int i = 0; i < GLM_SAMPLER_COUNT; i++ ) + { + SetSamplerTex( i, m_samplers[i].m_pBoundTex ); + SetSamplerDirty( i ); + } + + // Attributes/vertex attribs + ClearCurAttribs(); + + m_lastKnownVertexAttribMask = 0; + m_nNumSetVertexAttributes = 16; + memset( &m_boundVertexAttribs[0], 0xFF, sizeof( m_boundVertexAttribs ) ); + for( int index=0; index < kGLMVertexAttributeIndexMax; index++ ) + gGL->glDisableVertexAttribArray( index ); + + // Program + NullProgram(); + + // FBO + BindFBOToCtx( m_boundReadFBO, GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_boundDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + + // Current VB/IB/pinned memory buffers + gGL->glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, m_nBoundGLBuffer[ kGLMIndexBuffer] ); + gGL->glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nBoundGLBuffer[ kGLMVertexBuffer] ); + +#ifndef OSX + if ( gGL->m_bHave_GL_AMD_pinned_memory ) + { + gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].GetHandle() ); + } +#endif +} + +const GLMRendererInfoFields& GLMContext::Caps( void ) +{ + return m_caps; +} + +void GLMContext::DumpCaps( void ) +{ + /* + #define dumpfield( fff ) printf( "\n "#fff" : %d", (int) m_caps.fff ) + #define dumpfield_hex( fff ) printf( "\n "#fff" : 0x%08x", (int) m_caps.fff ) + #define dumpfield_str( fff ) printf( "\n "#fff" : %s", m_caps.fff ) + */ + + #define dumpfield( fff ) printf( "\n %-30s : %d", #fff, (int) m_caps.fff ) + #define dumpfield_hex( fff ) printf( "\n %-30s : 0x%08x", #fff, (int) m_caps.fff ) + #define dumpfield_str( fff ) printf( "\n %-30s : %s", #fff, m_caps.fff ) + + printf("\n-------------------------------- context caps for context %08x", (uint)this); + + dumpfield( m_fullscreen ); + dumpfield( m_accelerated ); + dumpfield( m_windowed ); + dumpfield_hex( m_rendererID ); + dumpfield( m_displayMask ); + dumpfield( m_bufferModes ); + dumpfield( m_colorModes ); + dumpfield( m_accumModes ); + dumpfield( m_depthModes ); + dumpfield( m_stencilModes ); + dumpfield( m_maxAuxBuffers ); + dumpfield( m_maxSampleBuffers ); + dumpfield( m_maxSamples ); + dumpfield( m_sampleModes ); + dumpfield( m_sampleAlpha ); + dumpfield_hex( m_vidMemory ); + dumpfield_hex( m_texMemory ); + + dumpfield_hex( m_pciVendorID ); + dumpfield_hex( m_pciDeviceID ); + dumpfield_str( m_pciModelString ); + dumpfield_str( m_driverInfoString ); + + printf( "\n m_osComboVersion: 0x%08x (%d.%d.%d)", m_caps.m_osComboVersion, (m_caps.m_osComboVersion>>16)&0xFF, (m_caps.m_osComboVersion>>8)&0xFF, (m_caps.m_osComboVersion)&0xFF ); + + dumpfield( m_ati ); + if (m_caps.m_ati) + { + dumpfield( m_atiR5xx ); + dumpfield( m_atiR6xx ); + dumpfield( m_atiR7xx ); + dumpfield( m_atiR8xx ); + dumpfield( m_atiNewer ); + } + + dumpfield( m_intel ); + if (m_caps.m_intel) + { + dumpfield( m_intel95x ); + dumpfield( m_intel3100 ); + dumpfield( m_intelHD4000 ); + } + + dumpfield( m_nv ); + if (m_caps.m_nv) + { + //dumpfield( m_nvG7x ); + dumpfield( m_nvG8x ); + dumpfield( m_nvNewer ); + } + + dumpfield( m_hasGammaWrites ); + dumpfield( m_hasMixedAttachmentSizes ); + dumpfield( m_hasBGRA ); + dumpfield( m_hasNewFullscreenMode ); + dumpfield( m_hasNativeClipVertexMode ); + dumpfield( m_maxAniso ); + + dumpfield( m_hasBindableUniforms ); + dumpfield( m_maxVertexBindableUniforms ); + dumpfield( m_maxFragmentBindableUniforms ); + dumpfield( m_maxBindableUniformSize ); + + dumpfield( m_hasUniformBuffers ); + dumpfield( m_hasPerfPackage1 ); + + dumpfield( m_cantBlitReliably ); + dumpfield( m_cantAttachSRGB ); + dumpfield( m_cantResolveFlipped ); + dumpfield( m_cantResolveScaled ); + dumpfield( m_costlyGammaFlips ); + dumpfield( m_badDriver1064NV ); + dumpfield( m_badDriver108Intel ); + + printf("\n--------------------------------"); + + #undef dumpfield + #undef dumpfield_hex + #undef dumpfield_str +} + +CGLMTex *GLMContext::NewTex( GLMTexLayoutKey *key, uint levels, const char *debugLabel ) +{ + // get a layout based on the key + GLMTexLayout *layout = m_texLayoutTable->NewLayoutRef( key ); + + CGLMTex *tex = new CGLMTex( this, layout, levels, debugLabel ); + + return tex; +} + +void GLMContext::DelTex( CGLMTex * tex ) +{ + //Queue the texture for deletion in ProcessTextureDeletes + //when we are sure we will hold the context. + m_DeleteTextureQueue.PushItem(tex); +} + +void GLMContext::ProcessTextureDeletes() +{ +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmEvent( "GLMContext::ProcessTextureDeletes" ); +#endif + + CGLMTex* tex = nullptr; + while ( m_DeleteTextureQueue.PopItem( &tex ) ) + { + for( int i = 0; i < GLM_SAMPLER_COUNT; i++) + { + if ( m_samplers[i].m_pBoundTex == tex ) + { + BindTexToTMU( NULL, i ); + } + } + + if ( tex->m_rtAttachCount != 0 ) + { + // RG - huh? wtf? TODO: fix this code which seems to be purposely leaking + // leak it and complain - we may have to implement a deferred-delete system for tex like these + + GLMDebugPrintf("GLMContext::DelTex: Leaking tex %08x [ %s ] - was attached for drawing at time of delete",tex, tex->m_layout->m_layoutSummary ); + + #if 0 + // can't actually do this yet as the draw calls will tank + FOR_EACH_VEC( m_fboTable, i ) + { + CGLMFBO *fbo = m_fboTable[i]; + fbo->TexScrub( tex ); + } + tex->m_rtAttachCount = 0; + #endif + } + else + { + delete tex; + } + } +} + +// push and pop attrib when blit has mixed srgb source and dest? +ConVar gl_radar7954721_workaround_mixed ( "gl_radar7954721_workaround_mixed", "1" ); + +// push and pop attrib on any blit? +ConVar gl_radar7954721_workaround_all ( "gl_radar7954721_workaround_all", "0" ); + +// what attrib mask to use ? +ConVar gl_radar7954721_workaround_maskval ( "gl_radar7954721_workaround_maskval", "0" ); + +enum eBlitFormatClass +{ + eColor, + eDepth, // may not get used. not sure.. + eDepthStencil +}; + +uint glAttachFromClass[ 3 ] = { GL_COLOR_ATTACHMENT0_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_DEPTH_STENCIL_ATTACHMENT_EXT }; + +void glScrubFBO ( GLenum target ) +{ + gGL->glFramebufferRenderbufferEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, 0); + gGL->glFramebufferRenderbufferEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + gGL->glFramebufferRenderbufferEXT ( target, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + + gGL->glFramebufferTexture2DEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2DEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2DEXT ( target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); +} + +void glAttachRBOtoFBO ( GLenum target, eBlitFormatClass formatClass, uint rboName ) +{ + switch( formatClass ) + { + case eColor: + gGL->glFramebufferRenderbufferEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rboName); + break; + + case eDepth: + gGL->glFramebufferRenderbufferEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboName); + break; + + case eDepthStencil: + gGL->glFramebufferRenderbufferEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboName); + gGL->glFramebufferRenderbufferEXT ( target, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboName); + break; + } +} + +void glAttachTex2DtoFBO ( GLenum target, eBlitFormatClass formatClass, uint texName, uint texMip ) +{ + switch( formatClass ) + { + case eColor: + gGL->glFramebufferTexture2DEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texName, texMip ); + break; + + case eDepth: + gGL->glFramebufferTexture2DEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, texName, texMip ); + break; + + case eDepthStencil: + gGL->glFramebufferTexture2DEXT ( target, GL_DEPTH_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, texName, texMip ); + break; + } +} + +ConVar gl_can_resolve_flipped("gl_can_resolve_flipped", "0" ); +ConVar gl_cannot_resolve_flipped("gl_cannot_resolve_flipped", "0" ); + +// these are only consulted if the m_cant_resolve_scaled cap bool is false. + +ConVar gl_minify_resolve_mode("gl_minify_resolve_mode", "1" ); // if scaled resolve available, for downscaled resolve blits only (i.e. internal blits) +ConVar gl_magnify_resolve_mode("gl_magnify_resolve_mode", "2" ); // if scaled resolve available, for upscaled resolve blits only + + // 0 == old style, two steps + // 1 == faster, one step blit aka XGL_SCALED_RESOLVE_FASTEST_EXT - if available. + // 2 == faster, one step blit aka XGL_SCALED_RESOLVE_NICEST_EXT - if available. + +void GLMContext::SaveColorMaskAndSetToDefault() +{ + // NVidia's driver doesn't ignore the colormask during blitframebuffer calls, so we need to save/restore it: + // “The bug here is that our driver fails to ignore colormask for BlitFramebuffer calls. This was unclear in the original spec, but we resolved it in Khronos last year (https://cvs.khronos.org/bugzilla/show_bug.cgi?id=7969).†+ m_ColorMaskSingle.Read( &m_SavedColorMask, 0 ); + + GLColorMaskSingle_t newColorMask; + newColorMask.r = newColorMask.g = newColorMask.b = newColorMask.a = -1; + m_ColorMaskSingle.Write( &newColorMask ); +} + +void GLMContext::RestoreSavedColorMask() +{ + m_ColorMaskSingle.Write( &m_SavedColorMask ); +} + +void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, uint filter ) +{ +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmPIXEvent( "Blit2" ); + g_TelemetryGPUStats.m_nTotalBlit2++; +#endif + + SaveColorMaskAndSetToDefault(); + + Assert( srcFace == 0 ); + Assert( dstFace == 0 ); + + //----------------------------------------------------------------- format assessment + + eBlitFormatClass formatClass = eColor; + uint blitMask= 0; + + switch( srcTex->m_layout->m_format->m_glDataFormat ) + { + case GL_RED: case GL_BGRA: case GL_RGB: case GL_RGBA: case GL_ALPHA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: + formatClass = eColor; + blitMask = GL_COLOR_BUFFER_BIT; + break; + + case GL_DEPTH_COMPONENT: + formatClass = eDepth; + blitMask = GL_DEPTH_BUFFER_BIT; + break; + + case GL_DEPTH_STENCIL_EXT: + formatClass = eDepthStencil; + blitMask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; + break; + + default: + Assert(!"Unsupported format for blit" ); + GLMStop(); + break; + } + + //----------------------------------------------------------------- blit assessment + + + bool blitResolves = srcTex->m_rboName != 0; + bool blitScales = ((srcRect->xmax - srcRect->xmin) != (dstRect->xmax - dstRect->xmin)) || ((srcRect->ymax - srcRect->ymin) != (dstRect->ymax - dstRect->ymin)); + + bool blitToBack = (dstTex == NULL); + bool blitFlips = blitToBack; // implicit y-flip upon blit to GL_BACK supplied + + //should we support blitFromBack ? + + bool srcGamma = srcTex && ((srcTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0); + bool dstGamma = dstTex && ((dstTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0); + + bool doPushPop = (srcGamma != dstGamma) && gl_radar7954721_workaround_mixed.GetInt() && m_caps.m_nv; // workaround for cross gamma blit problems on NV + // ^^ need to re-check this on some post-10.6.3 build on NV to see if it was fixed + + if (doPushPop) + { + gGL->glPushAttrib( 0 ); + } + + //----------------------------------------------------------------- figure out the plan + + bool blitTwoStep = false; // think positive + + // each subsequent segment here can only set blitTwoStep, not clear it. + // the common case where these get hit is resolve out to presentation + // there may be GL extensions or driver revisions which start doing these safely. + // ideally many blits internally resolve without scaling and can thus go direct without using the scratch tex. + + if (blitResolves && (blitFlips||blitToBack)) // flips, blit to back, same thing (for now) + { + if( gl_cannot_resolve_flipped.GetInt() ) + { + blitTwoStep = true; + } + else if (!gl_can_resolve_flipped.GetInt()) + { + blitTwoStep = blitTwoStep || m_caps.m_cantResolveFlipped; // if neither convar renders an opinion, fall back to the caps to decide if we have to two-step. + } + } + + // only consider trying to use the scaling resolve filter, + // if we are confident we are not headed for two step mode already. + if (!blitTwoStep) + { + if (blitResolves && blitScales) + { + if (m_caps.m_cantResolveScaled) + { + // filter is unchanged, two step mode switches on + blitTwoStep = true; + } + else + { + bool blitScalesDown = ((srcRect->xmax - srcRect->xmin) > (dstRect->xmax - dstRect->xmin)) || ((srcRect->ymax - srcRect->ymin) > (dstRect->ymax - dstRect->ymin)); + int mode = (blitScalesDown) ? gl_minify_resolve_mode.GetInt() : gl_magnify_resolve_mode.GetInt(); + + // roughly speaking, resolve blits that minify represent setup for special effects ("copy framebuffer to me") + // resolve blits that magnify are almost always on the final present in the case where remder size < display size + + switch( mode ) + { + case 0: + default: + // filter is unchanged, two step mode + blitTwoStep = true; + break; + + case 1: + // filter goes to fastest, one step mode + blitTwoStep = false; + filter = XGL_SCALED_RESOLVE_FASTEST_EXT; + break; + + case 2: + // filter goes to nicest, one step mode + blitTwoStep = false; + filter = XGL_SCALED_RESOLVE_NICEST_EXT; + break; + } + } + } + } + + //----------------------------------------------------------------- save old scissor state and disable scissor + GLScissorEnable_t oldsciss,newsciss; + m_ScissorEnable.Read( &oldsciss, 0 ); + + if (oldsciss.enable) + { + // turn off scissor + newsciss.enable = false; + m_ScissorEnable.Write( &newsciss ); + } + + //----------------------------------------------------------------- fork in the road, depending on two-step or not + if (blitTwoStep) + { + // a resolve that can't be done directly due to constraints on scaling or flipping. + + // bind scratch FBO0 to read, scrub it, attach RBO + BindFBOToCtx ( m_scratchFBO[0], GL_READ_FRAMEBUFFER_EXT ); + glScrubFBO ( GL_READ_FRAMEBUFFER_EXT ); + glAttachRBOtoFBO ( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_rboName ); + + // bind scratch FBO1 to write, scrub it, attach scratch tex + BindFBOToCtx ( m_scratchFBO[1], GL_DRAW_FRAMEBUFFER_EXT ); + glScrubFBO ( GL_DRAW_FRAMEBUFFER_EXT ); + glAttachTex2DtoFBO ( GL_DRAW_FRAMEBUFFER_EXT, formatClass, srcTex->m_texName, 0 ); + + // set read and draw buffers appropriately + gGL->glReadBuffer ( glAttachFromClass[formatClass] ); + gGL->glDrawBuffer ( glAttachFromClass[formatClass] ); + + // blit#1 - to resolve to scratch + // implicitly means no scaling, thus will be done with NEAREST sampling + + GLenum resolveFilter = GL_NEAREST; + + gGL->glBlitFramebufferEXT( 0, 0, srcTex->m_layout->m_key.m_xSize, srcTex->m_layout->m_key.m_ySize, + 0, 0, srcTex->m_layout->m_key.m_xSize, srcTex->m_layout->m_key.m_ySize, // same source and dest rect, whole surface + blitMask, resolveFilter ); + + // FBO1 now holds the interesting content. + // scrub FBO0, bind FBO1 to READ, fall through to next stage of blit where 1 goes onto 0 (or BACK) + + glScrubFBO ( GL_READ_FRAMEBUFFER_EXT ); // zap FBO0 + BindFBOToCtx ( m_scratchFBO[1], GL_READ_FRAMEBUFFER_EXT ); + + srcTex->ForceRBONonDirty(); + } + else + { +#if 1 + if (srcTex->m_pBlitSrcFBO == NULL) + { + srcTex->m_pBlitSrcFBO = NewFBO(); + BindFBOToCtx( srcTex->m_pBlitSrcFBO, GL_READ_FRAMEBUFFER_EXT ); + if (blitResolves) + { + glAttachRBOtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_rboName ); + } + else + { + glAttachTex2DtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_texName, srcMip ); + } + } + else + { + BindFBOToCtx ( srcTex->m_pBlitSrcFBO, GL_READ_FRAMEBUFFER_EXT ); + // GLMCheckError(); + } +#else + // arrange source surface on FBO1 for blit directly to dest (which could be FBO0 or BACK) + BindFBOToCtx( m_scratchFBO[1], GL_READ_FRAMEBUFFER_EXT ); + glScrubFBO( GL_READ_FRAMEBUFFER_EXT ); + GLMCheckError(); + if (blitResolves) + { + glAttachRBOtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_rboName ); + } + else + { + glAttachTex2DtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_texName, srcMip ); + } +#endif + + gGL->glReadBuffer( glAttachFromClass[formatClass] ); + } + + //----------------------------------------------------------------- zero or one blits may have happened above, whichever took place, FBO1 is now on read + + bool yflip = false; + if (blitToBack) + { + // backbuffer is special - FBO0 is left out (either scrubbed already, or not used) + + BindFBOToCtx ( NULL, GL_DRAW_FRAMEBUFFER_EXT ); + gGL->glDrawBuffer ( GL_BACK ); + + yflip = true; + } + else + { + // not going to GL_BACK - use FBO0. set up dest tex or RBO on it. i.e. it's OK to blit from MSAA to MSAA if needed, though unlikely. + Assert( dstTex != NULL ); +#if 1 + if (dstTex->m_pBlitDstFBO == NULL) + { + dstTex->m_pBlitDstFBO = NewFBO(); + BindFBOToCtx( dstTex->m_pBlitDstFBO, GL_DRAW_FRAMEBUFFER_EXT ); + if (dstTex->m_rboName) + { + glAttachRBOtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_rboName ); + } + else + { + glAttachTex2DtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_texName, dstMip ); + } + } + else + { + BindFBOToCtx( dstTex->m_pBlitDstFBO, GL_DRAW_FRAMEBUFFER_EXT ); + } +#else + BindFBOToCtx( m_scratchFBO[0], GL_DRAW_FRAMEBUFFER_EXT ); GLMCheckError(); + glScrubFBO( GL_DRAW_FRAMEBUFFER_EXT ); + + if (dstTex->m_rboName) + { + glAttachRBOtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_rboName ); + } + else + { + glAttachTex2DtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_texName, dstMip ); + } + + gGL->glDrawBuffer ( glAttachFromClass[formatClass] ); GLMCheckError(); +#endif + } + + // final blit + + // i think in general, if we are blitting same size, gl_nearest is the right filter to pass. + // this re-steering won't kick in if there is scaling or a special scaled resolve going on. + if (!blitScales) + { + // steer it + filter = GL_NEAREST; + } + + // this is blit #1 or #2 depending on what took place above. + if (yflip) + { + gGL->glBlitFramebufferEXT( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, + dstRect->xmin, dstRect->ymax, dstRect->xmax, dstRect->ymin, // note dest Y's are flipped + blitMask, filter ); + } + else + { + gGL->glBlitFramebufferEXT( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, + dstRect->xmin, dstRect->ymin, dstRect->xmax, dstRect->ymax, + blitMask, filter ); + } + + //----------------------------------------------------------------- scrub READ and maybe DRAW FBO, and unbind + +// glScrubFBO ( GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx ( NULL, GL_READ_FRAMEBUFFER_EXT ); + if (!blitToBack) + { +// glScrubFBO ( GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx ( NULL, GL_DRAW_FRAMEBUFFER_EXT ); + } + + //----------------------------------------------------------------- restore GLM's drawing FBO + + // restore GLM drawing FBO + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + + if (doPushPop) + { + gGL->glPopAttrib( ); + } + + + //----------------------------------------------------------------- restore old scissor state + if (oldsciss.enable) + { + m_ScissorEnable.Write( &oldsciss ); + } + + RestoreSavedColorMask(); +} + + +void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, GLenum filter, bool useBlitFB ) +{ + // This path doesn't work anymore (or did it ever work in the L4D2 Linux branch?) + DXABSTRACT_BREAK_ON_ERROR(); + return; + + SaveColorMaskAndSetToDefault(); + + switch( srcTex->m_layout->m_format->m_glDataFormat ) + { + case GL_BGRA: + case GL_RGB: + case GL_RGBA: + case GL_ALPHA: + case GL_LUMINANCE: + case GL_LUMINANCE_ALPHA: + #if 0 + if (GLMKnob("caps-key",NULL) > 0.0) + { + useBlitFB = false; + } + #endif + + if ( m_caps.m_cantBlitReliably ) // this is referring to a problem with the x3100.. + { + useBlitFB = false; + } + break; + } + + if (0) + { + GLMPRINTF(("-D- Blit from %d %d %d %d to %d %d %d %d", + srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, + dstRect->xmin, dstRect->ymin, dstRect->xmax, dstRect->ymax + )); + + GLMPRINTF(( "-D- src tex layout is %s", srcTex->m_layout->m_layoutSummary )); + GLMPRINTF(( "-D- dst tex layout is %s", dstTex->m_layout->m_layoutSummary )); + } + + int pushed = 0; + uint pushmask = gl_radar7954721_workaround_maskval.GetInt(); + //GL_COLOR_BUFFER_BIT + //| GL_CURRENT_BIT + //| GL_ENABLE_BIT + //| GL_FOG_BIT + //| GL_PIXEL_MODE_BIT + //| GL_SCISSOR_BIT + //| GL_STENCIL_BUFFER_BIT + //| GL_TEXTURE_BIT + //GL_VIEWPORT_BIT + //; + + if (gl_radar7954721_workaround_all.GetInt()!=0) + { + gGL->glPushAttrib( pushmask ); + pushed++; + } + else + { + bool srcGamma = (srcTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0; + bool dstGamma = (dstTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0; + + if (srcGamma != dstGamma) + { + if (gl_radar7954721_workaround_mixed.GetInt()) + { + gGL->glPushAttrib( pushmask ); + pushed++; + } + } + } + + if (useBlitFB) + { + // state we need to save + // current setting of scissor + // current setting of the drawing fbo (no explicit save, it's in the context) + GLScissorEnable_t oldsciss,newsciss; + m_ScissorEnable.Read( &oldsciss, 0 ); + + // remember to restore m_drawingFBO at end of effort + + // setup + // turn off scissor + newsciss.enable = false; + m_ScissorEnable.Write( &newsciss ); + + // select which attachment enum we're going to use for the blit + // default to color0, unless it's a depth or stencil flava + + Assert( srcTex->m_layout->m_format->m_glDataFormat == dstTex->m_layout->m_format->m_glDataFormat ); + + EGLMFBOAttachment attachIndex = (EGLMFBOAttachment)0; + GLenum attachIndexGL = 0; + GLuint blitMask = 0; + switch( srcTex->m_layout->m_format->m_glDataFormat ) + { + case GL_BGRA: + case GL_RGB: + case GL_RGBA: + case GL_ALPHA: + case GL_LUMINANCE: + case GL_LUMINANCE_ALPHA: + attachIndex = kAttColor0; + attachIndexGL = GL_COLOR_ATTACHMENT0_EXT; + blitMask = GL_COLOR_BUFFER_BIT; + break; + + case GL_DEPTH_COMPONENT: + attachIndex = kAttDepth; + attachIndexGL = GL_DEPTH_ATTACHMENT_EXT; + blitMask = GL_DEPTH_BUFFER_BIT; + break; + + case GL_DEPTH_STENCIL_EXT: + attachIndex = kAttDepthStencil; + attachIndexGL = GL_DEPTH_STENCIL_ATTACHMENT_EXT; + blitMask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; + break; + + default: + Assert(0); + break; + } + + // set the read fb, attach read tex at appropriate attach point, set read buffer + BindFBOToCtx( m_blitReadFBO, GL_READ_FRAMEBUFFER_EXT ); + + GLMFBOTexAttachParams attparams; + attparams.m_tex = srcTex; + attparams.m_face = srcFace; + attparams.m_mip = srcMip; + attparams.m_zslice = 0; + m_blitReadFBO->TexAttach( &attparams, attachIndex, GL_READ_FRAMEBUFFER_EXT ); + + gGL->glReadBuffer( attachIndexGL ); + + + // set the write fb and buffer, and attach write tex + BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + + attparams.m_tex = dstTex; + attparams.m_face = dstFace; + attparams.m_mip = dstMip; + attparams.m_zslice = 0; + m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + + gGL->glDrawBuffer( attachIndexGL ); + + // do the blit + gGL->glBlitFramebufferEXT( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, + dstRect->xmin, dstRect->ymin, dstRect->xmax, dstRect->ymax, + blitMask, filter ); + + // cleanup + // unset the read fb and buffer, detach read tex + // unset the write fb and buffer, detach write tex + + m_blitReadFBO->TexDetach( attachIndex, GL_READ_FRAMEBUFFER_EXT ); + + m_blitDrawFBO->TexDetach( attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + + // put the original FB back in place (both read and draw) + // this bind will hit both read and draw bindings + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + + // set the read and write buffers back to... what ? does it matter for anything but copies ? don't worry about it + + // restore the scissor state + m_ScissorEnable.Write( &oldsciss ); + } + else + { + // textured quad style + + // we must attach the dest tex as the color buffer on the blit draw FBO + // so that means we need to re-set the drawing FBO on exit + + EGLMFBOAttachment attachIndex = (EGLMFBOAttachment)0; + GLenum attachIndexGL = 0; + switch( srcTex->m_layout->m_format->m_glDataFormat ) + { + case GL_BGRA: + case GL_RGB: + case GL_RGBA: + case GL_ALPHA: + case GL_LUMINANCE: + case GL_LUMINANCE_ALPHA: + attachIndex = kAttColor0; + attachIndexGL = GL_COLOR_ATTACHMENT0_EXT; + break; + + default: + Assert(!"Can't blit that format"); + break; + } + + BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + + GLMFBOTexAttachParams attparams; + attparams.m_tex = dstTex; + attparams.m_face = dstFace; + attparams.m_mip = dstMip; + attparams.m_zslice = 0; + m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + + gGL->glDrawBuffer( attachIndexGL ); + + // attempt to just set states directly the way we want them, then use the latched states to repair them afterward. + NullProgram(); // out of program mode + + gGL->glDisable ( GL_ALPHA_TEST ); + gGL->glDisable ( GL_CULL_FACE ); + gGL->glDisable ( GL_POLYGON_OFFSET_FILL ); + gGL->glDisable ( GL_SCISSOR_TEST ); + + gGL->glDisable ( GL_CLIP_PLANE0 ); + gGL->glDisable ( GL_CLIP_PLANE1 ); + + gGL->glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); + gGL->glDisable ( GL_BLEND ); + + gGL->glDepthMask ( GL_FALSE ); + gGL->glDisable ( GL_DEPTH_TEST ); + + gGL->glDisable ( GL_STENCIL_TEST ); + gGL->glStencilMask ( GL_FALSE ); + + + // now do the unlit textured quad... + gGL->glActiveTexture( GL_TEXTURE0 ); + gGL->glBindTexture( GL_TEXTURE_2D, srcTex->m_texName ); + + gGL->glEnable(GL_TEXTURE_2D); + + // immediate mode is fine + + float topv = 1.0; + float botv = 0.0; + + gGL->glBegin(GL_QUADS); + gGL->glTexCoord2f ( 0.0, botv ); + gGL->glVertex3f ( -1.0, -1.0, 0.0 ); + + gGL->glTexCoord2f ( 1.0, botv ); + gGL->glVertex3f ( 1.0, -1.0, 0.0 ); + + gGL->glTexCoord2f ( 1.0, topv ); + gGL->glVertex3f ( 1.0, 1.0, 0.0 ); + + gGL->glTexCoord2f ( 0.0, topv ); + gGL->glVertex3f ( -1.0, 1.0, 0.0 ); + gGL->glEnd(); + + gGL->glBindTexture( GL_TEXTURE_2D, 0 ); + + gGL->glDisable(GL_TEXTURE_2D); + + BindTexToTMU( m_samplers[0].m_pBoundTex, 0 ); + + // leave active program empty - flush draw states will fix + + // then restore states using the scoreboard + + m_AlphaTestEnable.Flush(); + m_AlphaToCoverageEnable.Flush(); + m_CullFaceEnable.Flush(); + m_DepthBias.Flush(); + m_ScissorEnable.Flush(); + + m_ClipPlaneEnable.FlushIndex( 0 ); + m_ClipPlaneEnable.FlushIndex( 1 ); + + m_ColorMaskSingle.Flush(); + m_BlendEnable.Flush(); + + m_DepthMask.Flush(); + m_DepthTestEnable.Flush(); + + m_StencilWriteMask.Flush(); + m_StencilTestEnable.Flush(); + + // unset the write fb and buffer, detach write tex + + m_blitDrawFBO->TexDetach( attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + + // put the original FB back in place (both read and draw) + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + } + + while(pushed) + { + gGL->glPopAttrib(); + pushed--; + } + + RestoreSavedColorMask(); +} + +void GLMContext::ResolveTex( CGLMTex *tex, bool forceDirty ) +{ +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmPIXEvent( "ResolveTex" ); + g_TelemetryGPUStats.m_nTotalResolveTex++; +#endif + + // only run resolve if it's (a) possible and (b) dirty or force-dirtied + if ( ( tex->m_rboName ) && ( tex->IsRBODirty() || forceDirty ) ) + { + // state we need to save + // current setting of scissor + // current setting of the drawing fbo (no explicit save, it's in the context) + GLScissorEnable_t oldsciss,newsciss; + m_ScissorEnable.Read( &oldsciss, 0 ); + + // remember to restore m_drawingFBO at end of effort + + // setup + // turn off scissor + newsciss.enable = false; + m_ScissorEnable.Write( &newsciss ); + + // select which attachment enum we're going to use for the blit + // default to color0, unless it's a depth or stencil flava + + // for resolve, only handle a modest subset of the possible formats + EGLMFBOAttachment attachIndex = (EGLMFBOAttachment)0; + GLenum attachIndexGL = 0; + GLuint blitMask = 0; + switch( tex->m_layout->m_format->m_glDataFormat ) + { + case GL_BGRA: + case GL_RGB: + case GL_RGBA: + // case GL_ALPHA: + // case GL_LUMINANCE: + // case GL_LUMINANCE_ALPHA: + attachIndex = kAttColor0; + attachIndexGL = GL_COLOR_ATTACHMENT0_EXT; + blitMask = GL_COLOR_BUFFER_BIT; + break; + + // case GL_DEPTH_COMPONENT: + // attachIndex = kAttDepth; + // attachIndexGL = GL_DEPTH_ATTACHMENT_EXT; + // blitMask = GL_DEPTH_BUFFER_BIT; + // break; + + case GL_DEPTH_STENCIL_EXT: + attachIndex = kAttDepthStencil; + attachIndexGL = GL_DEPTH_STENCIL_ATTACHMENT_EXT; + blitMask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; + break; + + default: + Assert(!"Unsupported format for MSAA resolve" ); + break; + } + + + // set the read fb, attach read RBO at appropriate attach point, set read buffer + BindFBOToCtx( m_blitReadFBO, GL_READ_FRAMEBUFFER_EXT ); + + // going to avoid the TexAttach / TexDetach calls due to potential confusion, implement it directly here + + //----------------------------------------------------------------------------------- + // put tex->m_rboName on the read FB's attachment + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + // you have to attach it both places... + // http://www.opengl.org/wiki/GL_EXT_framebuffer_object + + // bind the RBO to the GL_RENDERBUFFER_EXT target - is this extraneous ? + //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); + + // attach the GL_RENDERBUFFER_EXT target to the depth and stencil attach points + gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); + + gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); + + // no need to leave the RBO hanging on + //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + } + else + { + //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); + + gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, attachIndexGL, GL_RENDERBUFFER_EXT, tex->m_rboName); + + //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + } + + gGL->glReadBuffer( attachIndexGL ); + + //----------------------------------------------------------------------------------- + // put tex->m_texName on the draw FBO attachment + + // set the write fb and buffer, and attach write tex + BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + + // regular path - attaching a texture2d + + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, tex->m_texName, 0 ); + + gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, tex->m_texName, 0 ); + } + else + { + gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, attachIndexGL, GL_TEXTURE_2D, tex->m_texName, 0 ); + } + + gGL->glDrawBuffer( attachIndexGL ); + + //----------------------------------------------------------------------------------- + + // blit + gGL->glBlitFramebufferEXT( 0, 0, tex->m_layout->m_key.m_xSize, tex->m_layout->m_key.m_ySize, + 0, 0, tex->m_layout->m_key.m_xSize, tex->m_layout->m_key.m_ySize, + blitMask, GL_NEAREST ); + // or should it be GL_LINEAR? does it matter ? + + //----------------------------------------------------------------------------------- + // cleanup + //----------------------------------------------------------------------------------- + + + // unset the read fb and buffer, detach read RBO + //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + // detach the GL_RENDERBUFFER_EXT target from the depth and stencil attach points + gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + + gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + } + else + { + gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, attachIndexGL, GL_RENDERBUFFER_EXT, 0); + } + + //----------------------------------------------------------------------------------- + // unset the write fb and buffer, detach write tex + + + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + { + gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); + + gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); + } + else + { + gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, attachIndexGL, GL_TEXTURE_2D, 0, 0 ); + } + + // put the original FB back in place (both read and draw) + // this bind will hit both read and draw bindings + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + + // set the read and write buffers back to... what ? does it matter for anything but copies ? don't worry about it + + // restore the scissor state + m_ScissorEnable.Write( &oldsciss ); + + // mark the RBO clean on the resolved tex + tex->ForceRBONonDirty(); + } +} + +void GLMContext::PreloadTex( CGLMTex *tex, bool force ) +{ + // if conditions allow (i.e. a drawing surface is active) + // bind the texture on TMU 15 + // set up a dummy program to sample it but not write (use 'discard') + // draw a teeny little triangle that won't generate a lot of fragments + if (!m_pairCache) + return; + + if (!m_drawingFBO) + return; + + if (tex->m_texPreloaded && !force) // only do one preload unless forced to re-do + { + //printf("\nnot-preloading %s", tex->m_debugLabel ? tex->m_debugLabel : "(unknown)"); + return; + } + + //printf("\npreloading %s", tex->m_debugLabel ? tex->m_debugLabel : "(unknown)"); + + CGLMProgram *vp = m_preloadTexVertexProgram; + CGLMProgram *fp = NULL; + switch(tex->m_layout->m_key.m_texGLTarget) + { + case GL_TEXTURE_2D: fp = m_preload2DTexFragmentProgram; + break; + + case GL_TEXTURE_3D: fp = m_preload3DTexFragmentProgram; + break; + + case GL_TEXTURE_CUBE_MAP: fp = m_preloadCubeTexFragmentProgram; + break; + } + if (!fp) + return; + + CGLMShaderPair *preloadPair = m_pairCache->SelectShaderPair( vp, fp, 0 ); + if (!preloadPair) + return; + + if ( !preloadPair->m_valid ) + { + if ( !preloadPair->ValidateProgramPair() ) + { + return; + } + } + + gGL->glUseProgram( (GLuint)preloadPair->m_program ); + + m_pBoundPair = preloadPair; + m_bDirtyPrograms = true; + + // almost ready to draw... + + //int tmuForPreload = 15; + + // shut down all the generic attribute arrays on the detention level - next real draw will activate them again + m_lastKnownVertexAttribMask = 0; + m_nNumSetVertexAttributes = 16; + memset( &m_boundVertexAttribs[0], 0xFF, sizeof( m_boundVertexAttribs ) ); + + // Force the next flush to reset the attributes. + ClearCurAttribs(); + + for( int index=0; index < kGLMVertexAttributeIndexMax; index++ ) + { + gGL->glDisableVertexAttribArray( index ); + } + + // bind texture and sampling params + CGLMTex *pPrevTex = m_samplers[15].m_pBoundTex; + +#ifndef OSX // 10.6 + if ( m_bUseSamplerObjects ) + { + gGL->glBindSampler( 15, 0 ); + } +#endif // !OSX + + BindTexToTMU( tex, 15 ); + + // unbind vertex/index buffers + BindBufferToCtx( kGLMVertexBuffer, NULL ); + BindBufferToCtx( kGLMIndexBuffer, NULL ); + + // draw + static float posns[] = { 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f }; + + static int indices[] = { 0, 1, 2 }; + + + gGL->glEnableVertexAttribArray( 0 ); + + gGL->glVertexAttribPointer( 0, 3, GL_FLOAT, 0, 0, posns ); + + gGL->glDrawRangeElements( GL_TRIANGLES, 0, 3, 3, GL_UNSIGNED_INT, indices); + + gGL->glDisableVertexAttribArray( 0 ); + + SetSamplerDirty( 15 ); + + BindTexToTMU( pPrevTex, 15 ); + + tex->m_texPreloaded = true; +} + + + +CGLMFBO *GLMContext::NewFBO( void ) +{ + GLM_FUNC; + + CGLMFBO *fbo = new CGLMFBO( this ); + + m_fboTable.AddToTail( fbo ); + + return fbo; +} + +void GLMContext::DelFBO( CGLMFBO *fbo ) +{ + GLM_FUNC; + + if (m_drawingFBO == fbo) + { + m_drawingFBO = NULL; //poof! + } + + if (m_boundReadFBO == fbo ) + { + BindFBOToCtx( NULL, GL_READ_FRAMEBUFFER_EXT ); + m_boundReadFBO = NULL; + } + + if (m_boundDrawFBO == fbo ) + { + BindFBOToCtx( NULL, GL_DRAW_FRAMEBUFFER_EXT ); + m_boundDrawFBO = NULL; + } + + int idx = m_fboTable.Find( fbo ); + Assert( idx >= 0 ); + if ( idx >= 0 ) + { + m_fboTable.FastRemove( idx ); + } + + delete fbo; +} + +//=============================================================================== + +CGLMProgram *GLMContext::NewProgram( EGLMProgramType type, char *progString, const char *pShaderName ) +{ + //hushed GLM_FUNC; + + CGLMProgram *prog = new CGLMProgram( this, type ); + + prog->SetProgramText( progString ); + prog->SetShaderName( pShaderName ); + prog->CompileActiveSources(); + + return prog; +} + +void GLMContext::DelProgram( CGLMProgram *pProg ) +{ + GLM_FUNC; + + if ( m_drawingProgram[ pProg->m_type ] == pProg ) + { + SetProgram( pProg->m_type, ( pProg->m_type == kGLMFragmentProgram ) ? m_pNullFragmentProgram : NULL ); + } + + // make sure to eliminate any cached pairs using this shader + bool purgeResult = m_pairCache->PurgePairsWithShader( pProg ); + (void)purgeResult; + Assert( !purgeResult ); // very unlikely to trigger + + NullProgram(); + + delete pProg; +} + +void GLMContext::NullProgram( void ) +{ + gGL->glUseProgram( 0 ); + m_pBoundPair = NULL; + m_bDirtyPrograms = true; +} + +void GLMContext::SetDrawingLang( EGLMProgramLang lang, bool immediate ) +{ + if ( !m_caps.m_hasDualShaders ) return; // ignore attempts to change language when -glmdualshaders is not engaged + + m_drawingLangAtFrameStart = lang; + if (immediate) + { + NullProgram(); + + m_drawingLang = m_drawingLangAtFrameStart; + } +} + +void GLMContext::LinkShaderPair( CGLMProgram *vp, CGLMProgram *fp ) +{ + if ( (m_pairCache) && (m_drawingLang==kGLMGLSL) && (vp) && (fp) ) + { + CGLMShaderPair *pair = m_pairCache->SelectShaderPair( vp, fp, 0 ); + (void)pair; + + Assert( pair != NULL ); + + NullProgram(); // clear out any binds that were done - next draw will set it right + } +} + +void GLMContext::ValidateShaderPair( CGLMProgram *vp, CGLMProgram *fp ) +{ + if ((m_pairCache) && (m_drawingLang == kGLMGLSL) && (vp) && (fp)) + { + CGLMShaderPair *pair = m_pairCache->SelectShaderPair( vp, fp, 0 ); + Assert( pair != NULL ); + pair->ValidateProgramPair(); + + NullProgram(); // clear out any binds that were done - next draw will set it right + } +} + +void GLMContext::ClearShaderPairCache( void ) +{ + if (m_pairCache) + { + NullProgram(); + m_pairCache->Purge(); // bye bye all linked pairs + NullProgram(); + } +} + +void GLMContext::QueryShaderPair( int index, GLMShaderPairInfo *infoOut ) +{ + if (m_pairCache) + { + m_pairCache->QueryShaderPair( index, infoOut ); + } + else + { + memset( infoOut, 0, sizeof( *infoOut ) ); + infoOut->m_status = -1; + } +} + +CGLMBuffer *GLMContext::NewBuffer( EGLMBufferType type, uint size, uint options ) +{ + //hushed GLM_FUNC; + + CGLMBuffer *prog = new CGLMBuffer( this, type, size, options ); + + return prog; +} + +void GLMContext::DelBuffer( CGLMBuffer *buff ) +{ + GLM_FUNC; + + for( int index = 0; index < kGLMVertexAttributeIndexMax; index++ ) + { + if ( m_drawVertexSetup.m_attrs[index].m_pBuffer == buff ) + { + // just clear the enable mask - this will force all the attrs to get re-sent on next sync + m_drawVertexSetup.m_attrMask = 0; + } + } + + BindGLBufferToCtx( buff->m_buffGLTarget, NULL, false ); + + delete buff; +} + +GLMVertexSetup g_blank_setup; + +void GLMContext::Clear( bool color, unsigned long colorValue, bool depth, float depthValue, bool stencil, unsigned int stencilValue, GLScissorBox_t *box ) +{ + GLM_FUNC; + + ++m_nBatchCounter; + +#if GLMDEBUG + GLMDebugHookInfo info; + memset( &info, 0, sizeof(info) ); + info.m_caller = eClear; + + do + { +#endif + uint mask = 0; + + GLClearColor_t clearcol; + GLClearDepth_t cleardep = { depthValue }; + GLClearStencil_t clearsten = { (GLint)stencilValue }; + + // depth write mask must be saved&restored + GLDepthMask_t olddepthmask; + GLDepthMask_t newdepthmask = { true }; + + // stencil write mask must be saved and restored + GLStencilWriteMask_t oldstenmask; + GLStencilWriteMask_t newstenmask = { (GLint)0xFFFFFFFF }; + + GLColorMaskSingle_t oldcolormask; + GLColorMaskSingle_t newcolormask = { -1,-1,-1,-1 }; // D3D clears do not honor color mask, so force it + + if (color) + { + // #define D3DCOLOR_ARGB(a,r,g,b) ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff))) + + clearcol.r = ((colorValue >> 16) & 0xFF) / 255.0f; //R + clearcol.g = ((colorValue >> 8) & 0xFF) / 255.0f; //G + clearcol.b = ((colorValue ) & 0xFF) / 255.0f; //B + clearcol.a = ((colorValue >> 24) & 0xFF) / 255.0f; //A + + m_ClearColor.Write( &clearcol ); // no check, no wait + mask |= GL_COLOR_BUFFER_BIT; + + // save and set color mask + m_ColorMaskSingle.Read( &oldcolormask, 0 ); + m_ColorMaskSingle.Write( &newcolormask ); + } + + if (depth) + { + // get old depth write mask + m_DepthMask.Read( &olddepthmask, 0 ); + m_DepthMask.Write( &newdepthmask ); + m_ClearDepth.Write( &cleardep ); // no check, no wait + mask |= GL_DEPTH_BUFFER_BIT; + } + + if (stencil) + { + m_ClearStencil.Write( &clearsten ); // no check, no wait + mask |= GL_STENCIL_BUFFER_BIT; + + // save and set sten mask + m_StencilWriteMask.Read( &oldstenmask, 0 ); + m_StencilWriteMask.Write( &newstenmask ); + } + + bool subrect = (box != NULL); + GLScissorEnable_t scissorEnableSave; + GLScissorEnable_t scissorEnableNew = { true }; + + GLScissorBox_t scissorBoxSave; + GLScissorBox_t scissorBoxNew; + + if (subrect) + { + // save current scissorbox and enable + m_ScissorEnable.Read( &scissorEnableSave, 0 ); + m_ScissorBox.Read( &scissorBoxSave, 0 ); + + if(0) + { + // calc new scissorbox as intersection against *box + + // max of the mins + scissorBoxNew.x = MAX(scissorBoxSave.x, box->x); + scissorBoxNew.y = MAX(scissorBoxSave.y, box->y); + + // min of the maxes + scissorBoxNew.width = ( MIN(scissorBoxSave.x+scissorBoxSave.width, box->x+box->width)) - scissorBoxNew.x; + + // height is just min of the max y's, minus the new base Y + scissorBoxNew.height = ( MIN(scissorBoxSave.y+scissorBoxSave.height, box->y+box->height)) - scissorBoxNew.y; + } + else + { + // ignore old scissor box completely. + scissorBoxNew = *box; + } + // set new box and enable + m_ScissorEnable.Write( &scissorEnableNew ); + m_ScissorBox.Write( &scissorBoxNew ); + } + + gGL->glClear( mask ); + + if (subrect) + { + // put old scissor box and enable back + m_ScissorEnable.Write( &scissorEnableSave ); + m_ScissorBox.Write( &scissorBoxSave ); + } + + if (depth) + { + // put old depth write mask + m_DepthMask.Write( &olddepthmask ); + } + + if (color) + { + // put old color write mask + m_ColorMaskSingle.Write( &oldcolormask ); + } + + if (stencil) + { + // put old sten mask + m_StencilWriteMask.Write( &oldstenmask ); + } + +#if GLMDEBUG + DebugHook( &info ); + } while (info.m_loop); +#endif +} + + +// stolen from glmgrbasics.cpp +extern "C" uint GetCurrentKeyModifiers( void ); +enum ECarbonModKeyIndex +{ + EcmdKeyBit = 8, /* command key down?*/ + EshiftKeyBit = 9, /* shift key down?*/ + EalphaLockBit = 10, /* alpha lock down?*/ + EoptionKeyBit = 11, /* option key down?*/ + EcontrolKeyBit = 12 /* control key down?*/ +}; + +enum ECarbonModKeyMask +{ + EcmdKey = 1 << EcmdKeyBit, + EshiftKey = 1 << EshiftKeyBit, + EalphaLock = 1 << EalphaLockBit, + EoptionKey = 1 << EoptionKeyBit, + EcontrolKey = 1 << EcontrolKeyBit +}; + +static ConVar gl_flushpaircache ("gl_flushpaircache", "0"); +static ConVar gl_paircachestats ("gl_paircachestats", "0"); +static ConVar gl_mtglflush_at_tof ("gl_mtglflush_at_tof", "0"); +static ConVar gl_texlayoutstats ("gl_texlayoutstats", "0" ); + +void GLMContext::BeginFrame( void ) +{ + GLM_FUNC; + + m_debugFrameIndex++; + + // check for lang change at TOF + if (m_caps.m_hasDualShaders) + { + if (m_drawingLang != m_drawingLangAtFrameStart) + { + // language change. unbind everything.. + NullProgram(); + + m_drawingLang = m_drawingLangAtFrameStart; + } + } + + // scrub some critical shock absorbers + for( int i=0; i< 16; i++) + { + gGL->glDisableVertexAttribArray( i ); // enable GLSL attribute- this is just client state - will be turned back off + } + m_lastKnownVertexAttribMask = 0; + m_nNumSetVertexAttributes = 0; + + //FIXME should we also zap the m_lastKnownAttribs array ? (worst case it just sets them all again on first batch) + + BindBufferToCtx( kGLMVertexBuffer, NULL, true ); + BindBufferToCtx( kGLMIndexBuffer, NULL, true ); + + if (gl_flushpaircache.GetInt()) + { + // do the flush and then set back to zero + ClearShaderPairCache(); + + printf("\n\n##### shader pair cache cleared\n\n"); + gl_flushpaircache.SetValue( 0 ); + } + + if (gl_paircachestats.GetInt()) + { + // do the flush and then set back to zero + m_pairCache->DumpStats(); + + gl_paircachestats.SetValue( 0 ); + } + + if (gl_texlayoutstats.GetInt()) + { + m_texLayoutTable->DumpStats(); + + gl_texlayoutstats.SetValue( 0 ); + } + + if (gl_mtglflush_at_tof.GetInt()) + { + gGL->glFlush(); // TOF flush - skip this if benchmarking, enable it if human playing (smoothness) + } + +#if GLMDEBUG + // init debug hook information + GLMDebugHookInfo info; + memset( &info, 0, sizeof(info) ); + info.m_caller = eBeginFrame; + + do + { + DebugHook( &info ); + } while (info.m_loop); + +#endif + +} + +void GLMContext::EndFrame( void ) +{ + GLM_FUNC; + +#if GLMDEBUG + // init debug hook information + GLMDebugHookInfo info; + memset( &info, 0, sizeof(info) ); + info.m_caller = eEndFrame; + + do + { + DebugHook( &info ); + } while (info.m_loop); +#endif +} + +//=============================================================================== + +CGLMQuery *GLMContext::NewQuery( GLMQueryParams *params ) +{ + CGLMQuery *query = new CGLMQuery( this, params ); + + return query; +} + +void GLMContext::DelQuery( CGLMQuery *query ) +{ + // may want to do some finish/ + delete query; +} + +static ConVar mat_vsync( "mat_vsync", "0", 0, "Force sync to vertical retrace", true, 0.0, true, 1.0 ); + +//=============================================================================== + +ConVar glm_nullrefresh_capslock( "glm_nullrefresh_capslock", "0" ); +ConVar glm_literefresh_capslock( "glm_literefresh_capslock", "0" ); + +extern ConVar gl_blitmode; + +void GLMContext::Present( CGLMTex *tex ) +{ + GLM_FUNC; + + { +#if GL_TELEMETRY_GPU_ZONES + CScopedGLMPIXEvent glmPIXEvent( "GLMContext::Present" ); + g_TelemetryGPUStats.m_nTotalPresent++; +#endif + + ProcessTextureDeletes(); + +#ifdef HAVE_GL_ARB_SYNC + + if ( gGL->m_bHave_GL_AMD_pinned_memory ) + { + m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].InsertFence(); + + m_nCurPinnedMemoryBuffer = ( m_nCurPinnedMemoryBuffer + 1 ) % cNumPinnedMemoryBuffers; + + m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].BlockUntilNotBusy(); + + gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].GetHandle() ); + } + + if ( gGL->m_bHave_GL_ARB_buffer_storage ) + { + for (uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType) + { + m_persistentBuffer[m_nCurPersistentBuffer][lpType].InsertFence(); + } + + m_nCurPersistentBuffer = ( m_nCurPersistentBuffer + 1 ) % cNumPersistentBuffers; + + for (uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType) + { + m_persistentBuffer[m_nCurPersistentBuffer][lpType].BlockUntilNotBusy(); + } + } + +#endif // HAVE_GL_ARB_SYNC + + bool newRefreshMode = false; + // two ways to go: + + // old school, do the resolve, had the tex down to cocoamgr to actually blit. + // that way is required if you are not in one-context mode (10.5.8) + + if ( (gl_blitmode.GetInt() != 0) ) + { + newRefreshMode = true; + } + + // this is the path whether full screen or windowed... we always blit. + CShowPixelsParams showparams; + memset( &showparams, 0, sizeof(showparams) ); + + showparams.m_srcTexName = tex->m_texName; + showparams.m_width = tex->m_layout->m_key.m_xSize; + showparams.m_height = tex->m_layout->m_key.m_ySize; + showparams.m_vsyncEnable = m_displayParams.m_vsyncEnable = mat_vsync.GetBool(); + showparams.m_fsEnable = m_displayParams.m_fsEnable; + showparams.m_useBlit = m_caps.m_hasFramebufferBlit; + + // we call showpixels once with the "only sync view" arg set, so we know what the latest surface size is, before trying to do our own blit ! + showparams.m_onlySyncView = true; + ShowPixels(&showparams); // doesn't actually show anything, just syncs window/fs state (would make a useful separate call) + showparams.m_onlySyncView = false; + + bool refresh = true; + #ifdef OSX + if ( (glm_nullrefresh_capslock.GetInt()) && (GetCurrentKeyModifiers() & EalphaLock) ) + { + refresh = false; + } + #endif + static int counter; + counter ++; + + #ifdef OSX + if ( (glm_literefresh_capslock.GetInt()) && (GetCurrentKeyModifiers() & EalphaLock) && (counter & 127) ) + { + // just show every 128th frame + refresh = false; + } + #endif + + if (refresh) + { + if (newRefreshMode) + { + // blit to GL_BACK done here, not in CocoaMgr, this lets us do resolve directly if conditions are right + + GLMRect srcRect, dstRect; + + uint dstWidth,dstHeight; + DisplayedSize( dstWidth,dstHeight ); + + srcRect.xmin = 0; + srcRect.ymin = 0; + srcRect.xmax = showparams.m_width; + srcRect.ymax = showparams.m_height; + + dstRect.xmin = 0; + dstRect.ymin = 0; + dstRect.xmax = dstWidth; + dstRect.ymax = dstHeight; + + // do not ask for LINEAR if blit is unscaled + // NULL means targeting GL_BACK. Blit2 will break it down into two steps if needed, and will handle resolve, scale, flip. + bool blitScales = (showparams.m_width != static_cast(dstWidth)) || (showparams.m_height != static_cast(dstHeight)); + Blit2( tex, &srcRect, 0,0, + NULL, &dstRect, 0,0, + blitScales ? GL_LINEAR : GL_NEAREST ); + + // we set showparams.m_noBlit, and just let CocoaMgr handle the swap (flushbuffer / page flip) + showparams.m_noBlit = true; + + BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + } + else + { + ResolveTex( tex, true ); // dxabstract used to do this unconditionally.we still do if new refresh mode doesn't engage. + + BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + + // showparams.m_noBlit is left set to 0. CocoaMgr does the blit. + } + + ShowPixels(&showparams); + } + + // put the original FB back in place (both read and draw) + // this bind will hit both read and draw bindings + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + + // put em back !! + m_ScissorEnable.Flush(); + m_ScissorBox.Flush(); + m_ViewportBox.Flush(); + } + + m_nCurFrame++; + +#if GL_BATCH_PERF_ANALYSIS + tmMessage( TELEMETRY_LEVEL2, TMMF_ICON_EXCLAMATION, "VS Uniform Calls: %u, VS Uniforms: %u|VS Uniform Bone Calls: %u, VS Bone Uniforms: %u|PS Uniform Calls: %u, PS Uniforms: %u", m_nTotalVSUniformCalls, m_nTotalVSUniformsSet, m_nTotalVSUniformBoneCalls, m_nTotalVSUniformsBoneSet, m_nTotalPSUniformCalls, m_nTotalPSUniformsSet ); + m_nTotalVSUniformCalls = 0, m_nTotalVSUniformBoneCalls = 0, m_nTotalVSUniformsSet = 0, m_nTotalVSUniformsBoneSet = 0, m_nTotalPSUniformCalls = 0, m_nTotalPSUniformsSet = 0; +#endif + +#ifndef OSX + GLMGPUTimestampManagerTick(); +#endif +} + +//=============================================================================== +// GLMContext protected methods + +// a naive implementation of this would just clear-drawable on the context at entry, +// and then capture and set fullscreen if requested. +// however that would glitch thescreen every time the user changed resolution while staying in full screen. +// but in windowed mode there's really not much to do in here. Yeah, this routine centers around obtaining +// drawables for fullscreen mode, and/or dropping those drawables if we're going back to windowed. + +// um, are we expected to re-make the standard surfaces (color, depthstencil) if the res changes? is that now this routine's job ? + +// so, kick it off with an assessment of whather we were FS previously or not. +// if there was no prior display params latched, then it wasn't. + +// changes in here take place immediately. If you want to defer display changes then that's going to be a different method. +// common assumption is that there will be two places that call this: context create and the implementation of the DX9 Reset method. +// in either case the client code is aware of what it signed up for. + +bool GLMContext::SetDisplayParams( GLMDisplayParams *params ) +{ + m_displayParams = *params; // latch em + m_displayParamsValid = true; + + return true; +} + + +ConVar gl_can_query_fast("gl_can_query_fast", "0"); + +static uint gPersistentBufferSize[kGLMNumBufferTypes] = +{ + 2 * 1024 * 1024, // kGLMVertexBuffer + 1 * 1024 * 1024, // kGLMIndexBuffer + 0, // kGLMUniformBuffer + 0, // kGLMPixelBuffer +}; + +GLMContext::GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) +{ +// m_bUseSamplerObjects = true; +// +// // On most AMD drivers (like the current latest, 12.10 Windows), the PCF depth comparison mode doesn't work on sampler objects, so just punt them. +// if ( gGL->m_nDriverProvider == cGLDriverProviderAMD ) +// { +// m_bUseSamplerObjects = false; +// } + +// if ( CommandLine()->CheckParm( "-gl_disablesamplerobjects" ) ) +// { + // Disable sampler object usage for now since ScaleForm isn't aware of them + // and doesn't know how to push/pop their binding state. It seems we don't + // really use them in this codebase anyhow, except to preload textures. + m_bUseSamplerObjects = false; + if ( CommandLine()->CheckParm( "-gl_enablesamplerobjects" ) ) + m_bUseSamplerObjects = true; + + // Try to get some more free memory by relying on driver host copies instead of ours. + // In some cases the driver will be able to discard their own host copy and rely on GPU + // memory, reducing memory usage. + // Sadly, we have to enable tex client storage for srgb decoding. This should only happen + // on Macs w/ OSX 10.6. + m_bTexClientStorage = !gGL->m_bHave_GL_EXT_texture_sRGB_decode; + if ( CommandLine()->CheckParm( "-gl_texclientstorage" ) ) + m_bTexClientStorage = true; + + GLMDebugPrintf( "GL sampler object usage: %s\n", m_bUseSamplerObjects ? "ENABLED" : "DISABLED" ); + + m_nCurOwnerThreadId = ThreadGetCurrentId(); + m_nThreadOwnershipReleaseCounter = 0; + + m_pDevice = pDevice; + m_nCurFrame = 0; + m_nBatchCounter = 0; + + ClearCurAttribs(); + +#ifndef OSX + m_nCurPinnedMemoryBuffer = 0; + if ( gGL->m_bHave_GL_AMD_pinned_memory ) + { + for ( uint t = 0; t < cNumPinnedMemoryBuffers; t++ ) + { + m_PinnedMemoryBuffers[t].Init( GLMGR_PINNED_MEMORY_BUFFER_SIZE ); + } + + gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].GetHandle() ); + } +#endif // OSX + + m_nCurPersistentBuffer = 0; + if ( gGL->m_bHave_GL_ARB_buffer_storage ) + { + for ( uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType ) + { + for ( uint lpNum = 0; lpNum < cNumPersistentBuffers; ++lpNum ) + { + m_persistentBuffer[lpNum][lpType].Init( (EGLMBufferType)lpType, gPersistentBufferSize[lpType] ); + } + } + } + + m_bUseBoneUniformBuffers = true; + if (CommandLine()->CheckParm("-disableboneuniformbuffers")) + { + m_bUseBoneUniformBuffers = false; + } + + m_nMaxUsedVertexProgramConstantsHint = 256; + + // flag our copy of display params as blank + m_displayParamsValid = false; + + // peek at any CLI options + m_slowAssertEnable = CommandLine()->FindParm("-glmassertslow") != 0; + m_slowSpewEnable = CommandLine()->FindParm("-glmspewslow") != 0; + m_checkglErrorsAfterEveryBatch = CommandLine()->FindParm("-glcheckerrors") != 0; + m_slowCheckEnable = m_slowAssertEnable || m_slowSpewEnable || m_checkglErrorsAfterEveryBatch; + + m_drawingLangAtFrameStart = m_drawingLang = kGLMGLSL; // default to GLSL + + // this affects FlushDrawStates which will route program bindings, uniform delivery, sampler setup, and enables accordingly. + + if ( CommandLine()->FindParm("-glslmode") ) + { + m_drawingLangAtFrameStart = m_drawingLang = kGLMGLSL; + } + if ( CommandLine()->FindParm("-arbmode") && !CommandLine()->FindParm("-glslcontrolflow") ) + { + m_drawingLangAtFrameStart = m_drawingLang = kGLMARB; + } + + // proceed with rest of init + + m_dwRenderThreadId = 0; + m_bIsThreading = false; + + m_nsctx = NULL; + m_ctx = NULL; + + int *selAttribs = NULL; + uint selWords = 0; + + memset( &m_caps, 0, sizeof( m_caps ) ); + GetDesiredPixelFormatAttribsAndRendererInfo( (uint**)&selAttribs, &selWords, &m_caps ); + uint selBytes = selWords * sizeof( uint ); selBytes; + +#if defined( USE_SDL ) + m_ctx = (SDL_GLContext)GetGLContextForWindow( params ? (void*)params->m_focusWindow : NULL ); + MakeCurrent( true ); +#else +#error +#endif + IncrementWindowRefCount(); + + // If we're using GL_ARB_debug_output, go ahead and setup the callback here. + if ( gGL->m_bHave_GL_ARB_debug_output && CommandLine()->FindParm( "-gl_debug" ) ) + { +#if GLMDEBUG + // Turning this on is a perf loss, but it ensures that you can (at least) swap to the other + // threads to see what call is currently being made. + // Note that if the driver is in multithreaded mode, you can put it back into singlethreaded mode + // and get a real stack for the offending gl call. + gGL->glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); + +#ifdef WIN32 + // This happens early enough during init that DevMsg() does nothing. + OutputDebugStringA( "GLMContext::GLMContext: GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB enabled!\n" ); +#else + printf( "GLMContext::GLMContext: GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB enabled!\n" ); +#endif + +#endif + // This should be there if we get in here--make sure. + Assert(gGL->glDebugMessageControlARB); + gGL->glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, (const GLuint *)NULL, GL_TRUE); + + // Gonna filter these out, they're "chatty". + gGL->glDebugMessageControlARB(GL_DEBUG_SOURCE_API_ARB, GL_DEBUG_TYPE_OTHER_ARB, GL_DEBUG_SEVERITY_LOW_ARB, 0, (const GLuint *)NULL, GL_FALSE); + gGL->glDebugMessageCallbackARB(GL_Debug_Output_Callback, (void*)NULL); + + GLMDebugPrintf( "GLMContext::GLMContext: Debug output (gl_arb_debug_output) enabled!\n" ); + } + + + if (CommandLine()->FindParm("-glmspewcaps")) + { + DumpCaps(); + } + + SetDisplayParams( params ); + + m_texLayoutTable = new CGLMTexLayoutTable; + +#ifndef OSX + if ( m_bUseSamplerObjects ) + { + memset( m_samplerObjectHash, 0, sizeof( m_samplerObjectHash ) ); + m_nSamplerObjectHashNumEntries = 0; + + for ( uint i = 0; i < cSamplerObjectHashSize; ++i ) + { + gGL->glGenSamplers( 1, &m_samplerObjectHash[i].m_samplerObject ); + } + } +#endif // !OSX + + memset( m_samplers, 0, sizeof( m_samplers ) ); + for( int i=0; i< GLM_SAMPLER_COUNT; i++) + { + GLMTexSamplingParams ¶ms = m_samplers[i].m_samp; + params.m_packed.m_addressU = D3DTADDRESS_WRAP; + params.m_packed.m_addressV = D3DTADDRESS_WRAP; + params.m_packed.m_addressW = D3DTADDRESS_WRAP; + params.m_packed.m_minFilter = D3DTEXF_POINT; + params.m_packed.m_magFilter = D3DTEXF_POINT; + params.m_packed.m_mipFilter = D3DTEXF_NONE; + params.m_packed.m_maxAniso = 1; + params.m_packed.m_isValid = true; + params.m_packed.m_compareMode = 0; + } + + MarkAllSamplersDirty(); + + m_activeTexture = -1; + + m_texLocks.EnsureCapacity( 16 ); // should be sufficient + + // FIXME need a texture tracking table so we can reliably delete CGLMTex objects at context teardown + + m_boundReadFBO = NULL; + m_boundDrawFBO = NULL; + m_drawingFBO = NULL; + + memset( m_drawingProgram, 0, sizeof( m_drawingProgram ) ); + m_bDirtyPrograms = true; + memset( m_programParamsF , 0, sizeof( m_programParamsF ) ); + memset( m_programParamsB , 0, sizeof( m_programParamsB ) ); + memset( m_programParamsI , 0, sizeof( m_programParamsI ) ); + + for (uint i = 0; i < ARRAYSIZE(m_programParamsF); i++) + { + m_programParamsF[i].m_firstDirtySlotNonBone = 256; + m_programParamsF[i].m_dirtySlotHighWaterNonBone = 0; + + m_programParamsF[i].m_dirtySlotHighWaterBone = 0; + } + + m_paramWriteMode = eParamWriteDirtySlotRange; // default to fastest mode + + if (CommandLine()->FindParm("-glmwriteallslots")) m_paramWriteMode = eParamWriteAllSlots; + if (CommandLine()->FindParm("-glmwriteshaderslots")) m_paramWriteMode = eParamWriteShaderSlots; + if (CommandLine()->FindParm("-glmwriteshaderslotsoptional")) m_paramWriteMode = eParamWriteShaderSlotsOptional; + if (CommandLine()->FindParm("-glmwritedirtyslotrange")) m_paramWriteMode = eParamWriteDirtySlotRange; + + m_attribWriteMode = eAttribWriteDirty; + + if (CommandLine()->FindParm("-glmwriteallattribs")) m_attribWriteMode = eAttribWriteAll; + if (CommandLine()->FindParm("-glmwritedirtyattribs")) m_attribWriteMode = eAttribWriteDirty; + + m_pairCache = new CGLMShaderPairCache( this ); + m_pBoundPair = NULL; + + m_fragDataMask = 0; + + memset( m_nBoundGLBuffer, 0xFF, sizeof( m_nBoundGLBuffer ) ); + + memset( m_boundVertexAttribs, 0xFF, sizeof(m_boundVertexAttribs) ); + m_lastKnownVertexAttribMask = 0; + m_nNumSetVertexAttributes = 16; + + // make a null program for use when client asks for NULL FP + m_pNullFragmentProgram = NewProgram(kGLMFragmentProgram, g_nullFragmentProgramText, "null" ); + SetProgram( kGLMFragmentProgram, m_pNullFragmentProgram ); + + // make dummy programs for doing texture preload via dummy draw + m_preloadTexVertexProgram = NewProgram(kGLMVertexProgram, g_preloadTexVertexProgramText, "preloadTex" ); + m_preload2DTexFragmentProgram = NewProgram(kGLMFragmentProgram, g_preload2DTexFragmentProgramText, "preload2DTex" ); + m_preload3DTexFragmentProgram = NewProgram(kGLMFragmentProgram, g_preload3DTexFragmentProgramText, "preload3DTex" ); + m_preloadCubeTexFragmentProgram = NewProgram(kGLMFragmentProgram, g_preloadCubeTexFragmentProgramText, "preloadCube" ); + + //memset( &m_drawVertexSetup, 0, sizeof(m_drawVertexSetup) ); + SetVertexAttributes( NULL ); // will set up all the entries in m_drawVertexSetup + + m_debugFontTex = NULL; + + // debug state + m_debugFrameIndex = -1; + +#if GLMDEBUG + // ####################################################################################### + + // DebugHook state - we could set these to more interesting values in response to a CLI arg like "startpaused" or something if desired + //m_paused = false; + m_holdFrameBegin = -1; + m_holdFrameEnd = -1; + m_holdBatch = m_holdBatchFrame = -1; + + m_debugDelayEnable = false; + m_debugDelay = 1<<19; // ~0.5 sec delay + + m_autoClearColor = m_autoClearDepth = m_autoClearStencil = false; + m_autoClearColorValues[0] = 0.0; //red + m_autoClearColorValues[1] = 1.0; //green + m_autoClearColorValues[2] = 0.0; //blue + m_autoClearColorValues[3] = 1.0; //alpha + + m_selKnobIndex = 0; + m_selKnobMinValue = -10.0f; + + m_selKnobMaxValue = 10.0f; + m_selKnobIncrement = 1/256.0f; + + // ####################################################################################### +#endif + + // make two scratch FBO's for blit purposes + m_blitReadFBO = NewFBO(); + m_blitDrawFBO = NewFBO(); + + for( int i=0; iglGenBuffersARB( 1, &m_destroyPBO ); + gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_destroyPBO ); + gGL->glBufferDataARB( GL_PIXEL_UNPACK_BUFFER_ARB, sizeof( g_garbageTextureBits ), g_garbageTextureBits, GL_STATIC_DRAW ); + gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_nBoundGLBuffer[ kGLMPixelBuffer ] ); + + // Create a bunch of texture names for us to use forever and ever ramen. + FillTexCache( false, kGLMInitialTexCount ); + +#ifdef OSX + bool new_mtgl = m_caps.m_hasPerfPackage1; // i.e. 10.6.4 plus new driver + + if ( CommandLine()->FindParm("-glmenablemtgl2") ) + { + new_mtgl = true; + } + + if ( CommandLine()->FindParm("-glmdisablemtgl2") ) + { + new_mtgl = false; + } + + bool mtgl_on = params->m_mtgl; + if (CommandLine()->FindParm("-glmenablemtgl")) + { + mtgl_on = true; + } + + if (CommandLine()->FindParm("-glmdisablemtgl")) + { + mtgl_on = false; + } + + CGLError result = (CGLError)0; + if (mtgl_on) + { + bool ready = false; + CGLContextObj context = GetCGLContextFromNSGL(m_ctx); + if (new_mtgl) + { + // afterburner + CGLContextEnable kCGLCPGCDMPEngine = ((CGLContextEnable)1314); + result = CGLEnable( context, kCGLCPGCDMPEngine ); + if (!result) + { + ready = true; // succeeded - no need to try non-MTGL + printf("\nMTGL detected.\n"); + } + else + { + printf("\nMTGL *not* detected, falling back.\n"); + } + } + + if (!ready) + { + // try old MTGL + result = CGLEnable( context, kCGLCEMPEngine ); + if (!result) + { + printf("\nMTGL has been detected.\n"); + ready = true; // succeeded - no need to try non-MTGL + } + } + } + + if ( m_caps.m_badDriver108Intel ) + { + // this way we have something to look for in terminal spew if users report issues related to this in the future. + printf( "\nEnabling GLSL compiler `malloc' workaround.\n" ); + if ( !IntelGLMallocWorkaround::Get()->Enable() ) + { + Warning( "Unable to enable OSX 10.8 / Intel HD4000 workaround, there might be crashes.\n" ); + } + } + +#endif + // also, set the remote convar "gl_can_query_fast" to 1 if perf package present, else 0. + gl_can_query_fast.SetValue( m_caps.m_hasPerfPackage1?1:0 ); + +#if GL_BATCH_PERF_ANALYSIS + m_nTotalVSUniformCalls = 0; + m_nTotalVSUniformBoneCalls = 0; + m_nTotalVSUniformsSet = 0; + m_nTotalVSUniformsBoneSet = 0; + m_nTotalPSUniformCalls = 0; + m_nTotalPSUniformsSet = 0; +#endif + + // See g_D3DRS_INFO_packed in dxabstract.cpp; dithering is a non-managed + // piece of state that we consider off by default. However it is actually + // enabled by default in the GL spec, so account for that here. + // See: https://bugs.freedesktop.org/show_bug.cgi?id=74700 + gGL->glDisable( GL_DITHER ); +} + +void GLMContext::Reset() +{ +} + +GLMContext::~GLMContext () +{ +#ifndef OSX + GLMGPUTimestampManagerDeinit(); + + for ( uint t = 0; t < cNumPinnedMemoryBuffers; t++ ) + { + m_PinnedMemoryBuffers[t].Deinit(); + } + + if (gGL->m_bHave_GL_ARB_buffer_storage) + { + for (uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType) + { + for (uint lpNum = 0; lpNum < cNumPersistentBuffers; ++lpNum) + { + m_persistentBuffer[lpNum][lpType].Deinit(); + } + } + } + + if ( m_bUseSamplerObjects ) + { + for( int i=0; i< GLM_SAMPLER_COUNT; i++) + { + gGL->glBindSampler( i, 0 ); + } + + for( int i=0; i< cSamplerObjectHashSize; i++) + { + gGL->glDeleteSamplers( 1, &m_samplerObjectHash[i].m_samplerObject ); + m_samplerObjectHash[i].m_samplerObject = 0; + } + } +#endif // !OSX + + if (m_debugFontTex) + { + DelTex( m_debugFontTex ); + m_debugFontTex = NULL; + } + + ProcessTextureDeletes(); + + if ( m_pNullFragmentProgram ) + { + DelProgram( m_pNullFragmentProgram ); + m_pNullFragmentProgram = NULL; + } + + // walk m_fboTable and free them up.. + FOR_EACH_VEC( m_fboTable, i ) + { + CGLMFBO *fbo = m_fboTable[i]; + DelFBO( fbo ); + } + m_fboTable.SetSize( 0 ); + + if (m_pairCache) + { + delete m_pairCache; + m_pairCache = NULL; + } + + // we need a m_texTable I think.. + + // m_texLayoutTable can be scrubbed once we know that all the tex are freed + + gGL->glDeleteBuffersARB( 1, &m_destroyPBO ); + + PurgeTexCache(); + + DecrementWindowRefCount(); +} + +// This method must call SelectTMU()/glActiveTexture() (it's expected as a side effect). +// This method is no longer called from any performance sensitive code paths. +void GLMContext::BindTexToTMU( CGLMTex *pTex, int tmu ) +{ +#if GLMDEBUG + GLM_FUNC; +#endif + + GLMPRINTF(("--- GLMContext::BindTexToTMU tex %p GL name %d -> TMU %d ", pTex, pTex ? pTex->m_texName : -1, tmu )); + + CheckCurrent(); + + SelectTMU( tmu ); + + if ( !pTex ) + { + gGL->glBindTexture( GL_TEXTURE_1D, 0 ); + gGL->glBindTexture( GL_TEXTURE_2D, 0 ); + gGL->glBindTexture( GL_TEXTURE_3D, 0 ); + gGL->glBindTexture( GL_TEXTURE_CUBE_MAP, 0 ); + } + else + { + const GLenum texGLTarget = pTex->m_texGLTarget; + if ( texGLTarget != GL_TEXTURE_1D ) gGL->glBindTexture( GL_TEXTURE_1D, 0 ); + if ( texGLTarget != GL_TEXTURE_2D ) gGL->glBindTexture( GL_TEXTURE_2D, 0 ); + if ( texGLTarget != GL_TEXTURE_3D ) gGL->glBindTexture( GL_TEXTURE_3D, 0 ); + if ( texGLTarget != GL_TEXTURE_CUBE_MAP ) gGL->glBindTexture( GL_TEXTURE_CUBE_MAP, 0 ); + gGL->glBindTexture( texGLTarget, pTex->m_texName ); + } + + m_samplers[tmu].m_pBoundTex = pTex; +} + +void GLMContext::BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint ) +{ +#if GLMDEBUG + GLM_FUNC; +#endif + GLMPRINTF(( "--- GLMContext::BindFBOToCtx fbo %p, GL name %d", fbo, (fbo) ? fbo->m_name : -1 )); + + CheckCurrent(); + + if ( bindPoint == GL_FRAMEBUFFER_EXT ) + { + gGL->glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbo ? fbo->m_name : 0 ); + m_boundReadFBO = fbo; + m_boundDrawFBO = fbo; + return; + } + + bool targetRead = (bindPoint==GL_READ_FRAMEBUFFER_EXT); + bool targetDraw = (bindPoint==GL_DRAW_FRAMEBUFFER_EXT); + + if (targetRead) + { + if (fbo) // you can pass NULL to go back to no-FBO + { + gGL->glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, fbo->m_name ); + + m_boundReadFBO = fbo; + //dontcare fbo->m_bound = true; + } + else + { + gGL->glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, 0 ); + + m_boundReadFBO = NULL; + } + } + + if (targetDraw) + { + if (fbo) // you can pass NULL to go back to no-FBO + { + gGL->glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, fbo->m_name ); + + m_boundDrawFBO = fbo; + //dontcare fbo->m_bound = true; + } + else + { + gGL->glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0 ); + + m_boundDrawFBO = NULL; + } + } +} + +void GLMContext::BindBufferToCtx( EGLMBufferType type, CGLMBuffer *pBuff, bool bForce ) +{ +#if GLMDEBUG + GLM_FUNC; +#endif + GLMPRINTF(( "--- GLMContext::BindBufferToCtx buff %p, GL name %d", pBuff, (pBuff) ? pBuff->m_nHandle : -1 )); + + CheckCurrent(); + + GLuint nGLName = pBuff ? pBuff->GetHandle() : 0; + if ( !bForce ) + { + if ( m_nBoundGLBuffer[type] == nGLName ) + return; + } + + GLenum target = 0; + switch( type ) + { + case kGLMVertexBuffer: target = GL_ARRAY_BUFFER_ARB; break; + case kGLMIndexBuffer: target = GL_ELEMENT_ARRAY_BUFFER_ARB; break; + case kGLMUniformBuffer: target = GL_UNIFORM_BUFFER_EXT; break; + case kGLMPixelBuffer: target = GL_PIXEL_UNPACK_BUFFER_ARB; break; + default: Assert(!"Unknown buffer type" ); + } + + Assert( !pBuff || ( pBuff->m_buffGLTarget == target ) ); + + m_nBoundGLBuffer[type] = nGLName; + gGL->glBindBufferARB( target, nGLName ); +} + + +GLuint GLMContext::CreateTex( GLenum texBind, GLenum internalFormat ) +{ + GLM_FUNC; + + // If we're not doing batch create, just return one here. + if ( !gl_batch_tex_creates.GetBool() ) + { + GLuint tex = 0; + gGL->glGenTextures( 1, &tex ); + return tex; + } + + FOR_EACH_VEC( m_availableTextures, i ) + { + TextureEntry_t& tex = m_availableTextures[ i ]; + if ( ( tex.m_nTexBind == GL_NONE || tex.m_nTexBind == texBind ) + && ( tex.m_nInternalFormat == GL_NONE || tex.m_nInternalFormat == internalFormat ) ) + { + // Hit! + GLuint retVal = tex.m_nTexName; + m_availableTextures.Remove( i ); + return retVal; + } + } + + if ( m_availableTextures.Count() >= kGLMHighWaterUndeleted ) + { + PurgeTexCache(); + } + + return FillTexCache( true, kGLMReUpTexCount ); +} + +void GLMContext::CleanupTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ) +{ + // If the total + if ( pLayout->m_storageTotalSize <= ( kDeletedTextureDim * kDeletedTextureDim * sizeof( uint32 ) ) ) + return; + + const GLuint oldPBO = m_nBoundGLBuffer[ kGLMPixelBuffer ]; + const GLuint oldTex = ( m_samplers[ m_activeTexture ].m_pBoundTex != NULL ) ? m_samplers[ m_activeTexture ].m_pBoundTex->GetTexName() : 0; + + gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_destroyPBO ); + gGL->glBindTexture( texBind, tex ); + + // Clear out old data. + for ( int i = 0; i < pLayout->m_mipCount; ++i ) + { + int mipDim = ( i == 0 ) ? kDeletedTextureDim : 0; + if ( pLayout->m_format->m_chunkSize != 1 ) + { + const int chunks = ( mipDim + ( pLayout->m_format->m_chunkSize - 1 ) ) / pLayout->m_format->m_chunkSize; + const int dataSize = ( chunks * chunks ) * pLayout->m_format->m_bytesPerSquareChunk; + Assert( dataSize <= ( sizeof( uint32) * ARRAYSIZE( g_garbageTextureBits ) ) ); + + gGL->glCompressedTexImage2D( texBind, i, pLayout->m_format->m_glIntFormat, mipDim, mipDim, 0, dataSize, 0 ); + } + else + { + gGL->glTexImage2D( texBind, i, pLayout->m_format->m_glIntFormat, mipDim, mipDim, 0, pLayout->m_format->m_glDataFormat, pLayout->m_format->m_glDataType, 0 ); + } + } + + gGL->glBindTexture( texBind, oldTex ); + gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, oldPBO ); +} + +void GLMContext::DestroyTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ) +{ + GLM_FUNC; + + // Code only handles 2D for now. + if ( texBind != GL_TEXTURE_2D || !gl_batch_tex_destroys.GetBool() ) + { + gGL->glDeleteTextures( 1, &tex ); + return; + } + + CleanupTex( texBind, pLayout, tex ); + + TextureEntry_t entry; + entry.m_nTexBind = texBind; + entry.m_nInternalFormat = pLayout->m_format->m_glIntFormat; + entry.m_nTexName = tex; + + m_availableTextures.AddToTail( entry ); +} + +GLuint GLMContext::FillTexCache( bool holdOne, int newTextures ) +{ + // If we aren't doing batch creates, then don't fill the cache. + if ( !gl_batch_tex_creates.GetBool() ) + return 0; + + // If we have to hit the name table, might as well hit it a bunch because this causes + // serialization either way--at least we can do it less often. + GLuint* textures = (GLuint*) stackalloc( newTextures * sizeof( GLuint ) ); + gGL->glGenTextures( newTextures, textures ); + + Assert( textures[ 0 ] ); + + TextureEntry_t entry; + entry.m_nTexBind = GL_NONE; + entry.m_nInternalFormat = GL_NONE; + + // We may return 0, so skip adding it here. + for ( int i = 1; i < newTextures; ++i ) + { + Assert( textures[ i ] ); + if ( textures[ i ] ) + { + // We still add these to the tail because we'd prefer to reuse old textures (rather + // than these new ones). + entry.m_nTexName = textures[ i ]; + m_availableTextures.AddToTail( entry ); + } + } + + if ( holdOne ) + return textures[ 0 ]; + + // If not, stick that last one in the list and return 0. + entry.m_nTexName = textures[ 0 ]; + m_availableTextures.AddToTail( entry ); + + return 0; +} + +void GLMContext::PurgeTexCache() +{ + GLM_FUNC; + + int textureCount = m_availableTextures.Count(); + + if ( textureCount == 0 ) + return; + + GLuint* textures = (GLuint*) stackalloc( textureCount * sizeof( GLuint ) ); + + FOR_EACH_VEC( m_availableTextures, i ) + { + TextureEntry_t& tex = m_availableTextures[ i ]; + textures[ i ] = tex.m_nTexName; + } + + gGL->glDeleteTextures( textureCount, textures ); + + m_availableTextures.RemoveAll(); +} + +#ifdef OSX +// As far as I can tell this stuff is only useful under OSX. +ConVar gl_can_mix_shader_gammas( "gl_can_mix_shader_gammas", 0 ); +ConVar gl_cannot_mix_shader_gammas( "gl_cannot_mix_shader_gammas", 0 ); +#endif + +// ConVar param_write_mode("param_write_mode", "0"); + +void GLMContext::MarkAllSamplersDirty() +{ + m_nNumDirtySamplers = GLM_SAMPLER_COUNT; + for (uint i = 0; i < GLM_SAMPLER_COUNT; i++) + { + m_nDirtySamplerFlags[i] = 0; + m_nDirtySamplers[i] = (uint8)i; + } +} + +void GLMContext::FlushDrawStatesNoShaders( ) +{ + Assert( ( m_drawingFBO == m_boundDrawFBO ) && ( m_drawingFBO == m_boundReadFBO ) ); // this check MUST succeed + + GLM_FUNC; + + GL_BATCH_PERF( m_FlushStats.m_nTotalBatchFlushes++; ) + + NullProgram(); +} + +#if GLMDEBUG + +enum EGLMDebugDumpOptions +{ + eDumpBatchInfo, + eDumpSurfaceInfo, + eDumpStackCrawl, + eDumpShaderLinks, +// eDumpShaderText, // we never use this one + eDumpShaderParameters, + eDumpTextureSetup, + eDumpVertexAttribSetup, + eDumpVertexData, + eOpenShadersForEdit +}; + +enum EGLMVertDumpMode +{ + // options that affect eDumpVertexData above + eDumpVertsNoTransformDump, + eDumpVertsTransformedByViewProj, + eDumpVertsTransformedByModelViewProj, + eDumpVertsTransformedByBoneZeroThenViewProj, + eDumpVertsTransformedByBonesThenViewProj, + eLastDumpVertsMode +}; + +char *g_vertDumpModeNames[] = +{ + "noTransformDump", + "transformedByViewProj", + "transformedByModelViewProj", + "transformedByBoneZeroThenViewProj", + "transformedByBonesThenViewProj" +}; + +static void CopyTilEOL( char *dst, char *src, int dstSize ) +{ + dstSize--; + + int i=0; + while ( (im_caller==eDrawElements); + const char *batchtype = is_draw ? "draw" : "clear"; + + if (options & (1<m_attach[i].m_tex; + if (tex) + { + GLMPRINTF(("-D- bound FBO (%8x) attachment %d = tex %8x (GL %d) (%s)", fbo, i, tex, tex->m_texName, tex->m_layout->m_layoutSummary )); + } + else + { + // warning if no depthstencil attachment + switch(i) + { + case kAttDepth: + case kAttStencil: + case kAttDepthStencil: + GLMPRINTF(("-D- bound FBO (%8x) attachment %d = NULL, warning!", fbo, i )); + break; + } + } + } + } + + if (options & (1<m_text, "#//ATTRIBMAP"); + if (attribmap) + { + CopyTilEOL( attribtemp, attribmap, sizeof(attribtemp) ); + } + else + { + strcpy( attribtemp, "no attrib map" ); + } + + char *trans = strstr(vp->m_text, "#// trans#"); + if (trans) + { + CopyTilEOL( transtemp, trans, sizeof(transtemp) ); + } + else + { + strcpy( transtemp, "no translation info" ); + } + + char *linkpath = "no file link"; + + #if GLMDEBUG + linkpath = vp->m_editable->m_mirror->m_path; + #endif + + GLMPRINTF(("-D-")); + GLMPRINTF(("-D- ARBVP || GL %d || Path %s ", vp->m_descs[kGLMARB].m_object.arb, linkpath )); + GLMPRINTF(("-D- Attribs %s", attribtemp )); + GLMPRINTF(("-D- Trans %s", transtemp )); + + /* + if ( (options & (1<m_string, eDebugDump )); + } + */ + } + else + { + GLMPRINTF(("-D- VP (none)" )); + } + + if (fp) + { + char *trans = strstr(fp->m_text, "#// trans#"); + if (trans) + { + CopyTilEOL( transtemp, trans, sizeof(transtemp) ); + } + else + { + strcpy( transtemp, "no translation info" ); + } + + char *linkpath = "no file link"; + + #if GLMDEBUG + linkpath = fp->m_editable->m_mirror->m_path; + #endif + + GLMPRINTF(("-D-")); + GLMPRINTF(("-D- FP || GL %d || Path %s ", fp->m_descs[kGLMARB].m_object.arb, linkpath )); + GLMPRINTF(("-D- Trans %s", transtemp )); + + /* + if ( (options & (1<m_string, eDebugDump)); + } + */ + } + else + { + GLMPRINTF(("-D- FP (none)" )); + } + } + + if ( (options & (1<m_attrMask & (1<m_vtxAttribMap[index]>>4)== D3DDECLUSAGE_BLENDWEIGHT); + } + if (usesSkinning) + { + upperSlotLimit = 256; + } + + while( slotIndex < upperSlotLimit ) + { + // if slot index is in a masked range, skip it + // if slot index is the start of a matrix, label it, print it, skip ahead 4 slots + for( int maski=0; vmaskranges[maski] >=0; maski+=2) + { + if ( (slotIndex >= vmaskranges[maski]) && (slotIndex <= vmaskranges[maski+1]) ) + { + // that index is masked. set to one past end of range, print a blank line for clarity + slotIndex = vmaskranges[maski+1]+1; + GLMPrintStr("-D- ....."); + } + } + + if (slotIndex < upperSlotLimit) + { + float *values = &m_programParamsF[ kGLMVertexProgram ].m_values[slotIndex][0]; + switch( slotIndex ) + { + case 4: + printmat( "MODELVIEWPROJ", slotIndex, 4, values ); + slotIndex += 4; + break; + + case 8: + printmat( "VIEWPROJ", slotIndex, 4, values ); + slotIndex += 4; + break; + + default: + if (slotIndex>=58) + { + // bone + char bonelabel[100]; + + sprintf(bonelabel, "MODEL_BONE%-2d", (slotIndex-58)/3 ); + printmat( bonelabel, slotIndex, 3, values ); + + slotIndex += 3; + } + else + { + // just print the one slot + GLMPRINTF(("-D- %03d: [ %10.5f %10.5f %10.5f %10.5f ] %s", slotIndex, values[0], values[1], values[2], values[3], label )); + slotIndex++; + } + break; + } + } + } + + // VP stage still, if in GLSL mode, find the bound pair and see if it has live i0, b0-b3 uniforms + if (m_pBoundPair) // should only be non-NULL in GLSL mode + { +#if 0 + if (m_pBoundPair->m_locVertexBool0>=0) + { + GLMPRINTF(("-D- GLSL 'b0': %d", m_programParamsB[kGLMVertexProgram].m_values[0] )); + } + + if (m_pBoundPair->m_locVertexBool1>=0) + { + GLMPRINTF(("-D- GLSL 'b1': %d", m_programParamsB[kGLMVertexProgram].m_values[1] )); + } + + if (m_pBoundPair->m_locVertexBool2>=0) + { + GLMPRINTF(("-D- GLSL 'b2': %d", m_programParamsB[kGLMVertexProgram].m_values[2] )); + } + + if (m_pBoundPair->m_locVertexBool3>=0) + { + GLMPRINTF(("-D- GLSL 'b3': %d", m_programParamsB[kGLMVertexProgram].m_values[3] )); + } + + if (m_pBoundPair->m_locVertexInteger0>=0) + { + GLMPRINTF(("-D- GLSL 'i0': %d", m_programParamsI[kGLMVertexProgram].m_values[0][0] )); + } +#endif + } + + GLMPRINTF(("-D-")); + GLMPRINTF(("-D- FP parameters " )); + + static int fmaskranges[] = { 40,41, -1,-1 }; + + slotIndex = 0; + label = ""; + while(slotIndex < 40) + { + // if slot index is in a masked range, skip it + // if slot index is the start of a matrix, label it, print it, skip ahead 4 slots + for( int maski=0; fmaskranges[maski] >=0; maski+=2) + { + if ( (slotIndex >= fmaskranges[maski]) && (slotIndex <= fmaskranges[maski+1]) ) + { + // that index is masked. set to one past end of range, print a blank line for clarity + slotIndex = fmaskranges[maski+1]+1; + GLMPrintStr("-D- ....."); + } + } + + if (slotIndex < 40) + { + float *values = &m_programParamsF[ kGLMFragmentProgram ].m_values[slotIndex][0]; + switch( slotIndex ) + { + case 0: label = "g_EnvmapTint"; break; + case 1: label = "g_DiffuseModulation"; break; + case 2: label = "g_EnvmapContrast_ShadowTweaks"; break; + case 3: label = "g_EnvmapSaturation_SelfIllumMask (xyz, and w)"; break; + case 4: label = "g_SelfIllumTint_and_BlendFactor (xyz, and w)"; break; + + case 12: label = "g_ShaderControls"; break; + case 13: label = "g_DepthFeatheringConstants"; break; + + case 20: label = "g_EyePos"; break; + case 21: label = "g_FogParams"; break; + case 22: label = "g_FlashlightAttenuationFactors"; break; + case 23: label = "g_FlashlightPos"; break; + case 24: label = "g_FlashlightWorldToTexture"; break; + + case 28: label = "cFlashlightColor"; break; + case 29: label = "g_LinearFogColor"; break; + case 30: label = "cLightScale"; break; + case 31: label = "cFlashlightScreenScale"; break; + + default: + label = ""; + break; + } + + GLMPRINTF(("-D- %03d: [ %10.5f %10.5f %10.5f %10.5f ] %s", slotIndex, values[0], values[1], values[2], values[3], label )); + + slotIndex ++; + } + } + + if (m_pBoundPair->m_locFragmentFakeSRGBEnable) + { + GLMPRINTF(("-D- GLSL 'flEnableSRGBWrite': %f", m_pBoundPair->m_fakeSRGBEnableValue )); + } + } + + if ( (options & (1<m_layout->m_layoutSummary )); + + GLMPRINTF(("-D- addressMode[ %s %s %s ]", + GLMDecode( eGL_ENUM, samp->m_addressModes[0] ), + GLMDecode( eGL_ENUM, samp->m_addressModes[1] ), + GLMDecode( eGL_ENUM, samp->m_addressModes[2] ) + )); + + GLMPRINTF(("-D- magFilter [ %s ]", GLMDecode( eGL_ENUM, samp->m_magFilter ) )); + GLMPRINTF(("-D- minFilter [ %s ]", GLMDecode( eGL_ENUM, samp->m_minFilter ) )); + GLMPRINTF(("-D- srgb [ %s ]", samp->m_srgb ? "T" : "F" )); + GLMPRINTF(("-D- shadowFilter [ %s ]", samp->m_compareMode == GL_COMPARE_R_TO_TEXTURE_ARB ? "T" : "F" )); + + // add more as needed later.. + } + } +#endif + } + + if ( (options & (1<m_attrMask; + for( int index=0; index < kGLMVertexAttributeIndexMax; index++ ) + { + uint mask = 1<m_attrs[index]; + + char sizestr[100]; + if (setdesc->m_nCompCount < 32) + { + sprintf( sizestr, "%d", setdesc->m_nCompCount); + } + else + { + strcpy( sizestr, GLMDecode( eGL_ENUM, setdesc->m_nCompCount ) ); + } + + if (pSetup->m_vtxAttribMap[index] != 0xBB) + { + GLMPRINTF(("-D- attr=%-2d decl=$%s%1d stride=%-2d offset=%-3d buf=%08x size=%s type=%s normalized=%s ", + index, + GLMDecode(eD3D_VTXDECLUSAGE, pSetup->m_vtxAttribMap[index]>>4 ), + pSetup->m_vtxAttribMap[index]&0x0F, + setdesc->m_stride, + setdesc->m_offset, + setdesc->m_pBuffer, + sizestr, + GLMDecode( eGL_ENUM, setdesc->m_datatype), + setdesc->m_normalized?"Y":"N" + )); + } + else + { + // the attrib map is referencing an attribute that is not wired up in the vertex setup... + DebuggerBreak(); + } + } + } + } + + if ( (options & (1<m_drawStart; + int end = info->m_drawEnd; + int endLimit = start + (1<=0) + { + mark += sprintf(mark, "-D- %04d: ", vtxIndex ); + } + + // for transform dumping, we latch values as we spot them + float vtxPos[4]; + int vtxBoneIndices[4]; // only three get used + float vtxBoneWeights[4]; // only three get used and index 2 is synthesized from 0 and 1 + + vtxPos[0] = vtxPos[1] = vtxPos[2] = 0.0; + vtxPos[3] = 1.0; + + vtxBoneIndices[0] = vtxBoneIndices[1] = vtxBoneIndices[2] = vtxBoneIndices[3] = 0; + vtxBoneWeights[0] = vtxBoneWeights[1] = vtxBoneWeights[2] = vtxBoneWeights[3] = 0.0; + + for( int attr = 0; attr < kGLMVertexAttributeIndexMax; attr++ ) + { + if (pSetup->m_attrMask & (1<m_attrs[ attr ]; + + // print that attribute. + + // on OSX, VB's never move unless resized. You can peek at them when unmapped. Safe enough for debug.. + char *bufferBase = (char*)desc->m_pBuffer->m_pLastMappedAddress; + + uint stride = desc->m_stride; + uint fieldoffset = desc->m_offset; + uint baseoffset = vtxIndex * stride; + + char *attrBase = bufferBase + baseoffset + fieldoffset; + + uint usage = pSetup->m_vtxAttribMap[attr]>>4; + uint usageindex = pSetup->m_vtxAttribMap[attr]&0x0F; + + if (vtxIndex <0) + { + mark += sprintf(mark, "[%s%1d @ offs=%04d / strd %03d] ", GLMDecode(eD3D_VTXDECLUSAGE, usage ), usageindex, fieldoffset, stride ); + } + else + { + mark += sprintf(mark, "[%s%1d ", GLMDecode(eD3D_VTXDECLUSAGE, usage ), usageindex ); + + if (desc->m_nCompCount<32) + { + for( uint which = 0; which < desc->m_nCompCount; which++ ) + { + static char *fieldname = "xyzw"; + switch( desc->m_datatype ) + { + case GL_FLOAT: + { + float *floatbase = (float*)attrBase; + mark += sprintf(mark, (usage != D3DDECLUSAGE_TEXCOORD) ? "%c%7.3f " : "%c%.3f", fieldname[which], floatbase[which] ); + + if (usage==D3DDECLUSAGE_POSITION) + { + if (which<4) + { + // latch pos + vtxPos[which] = floatbase[which]; + } + } + + if (usage==D3DDECLUSAGE_BLENDWEIGHT) + { + if (which<4) + { + // latch weight + vtxBoneWeights[which] = floatbase[which]; + } + } + } + break; + + case GL_UNSIGNED_BYTE: + { + unsigned char *unchbase = (unsigned char*)attrBase; + mark += sprintf(mark, "%c$%02X ", fieldname[which], unchbase[which] ); + } + break; + + default: + // hold off on other formats for now + mark += sprintf(mark, "%c????? ", fieldname[which] ); + break; + } + } + } + else // special path for BGRA bytes which are expressed in GL by setting the *size* to GL_BGRA (gross large enum) + { + switch(desc->m_nCompCount) + { + case GL_BGRA: // byte reversed color + { + for( int which = 0; which < 4; which++ ) + { + static const char *fieldname = "BGRA"; + switch( desc->m_datatype ) + { + case GL_UNSIGNED_BYTE: + { + unsigned char *unchbase = (unsigned char*)attrBase; + mark += sprintf(mark, "%c$%02X ", fieldname[which], unchbase[which] ); + + if (usage==D3DDECLUSAGE_BLENDINDICES) + { + if (which<4) + { + // latch index + vtxBoneIndices[which] = unchbase[which]; // ignoring the component reverse which BGRA would inflict, but we also ignore it below so it matches up. + } + } + } + break; + + default: + DebuggerBreak(); + break; + } + } + } + break; + } + } + mark += sprintf(mark, "] " ); + } + } + } + GLMPrintStr( buf, eDebugDump ); + + if (vtxIndex >=0) + { + // if transform dumping requested, and we've reached the actual vert dump phase, do it + float vtxout[4]; + char *translabel = NULL; // NULL means no print... + + switch( g_vertDumpMode ) + { + case eDumpVertsNoTransformDump: break; + + case eDumpVertsTransformedByViewProj: // viewproj is slot 8 + { + float *viewproj = &m_programParamsF[ kGLMVertexProgram ].m_values[8][0]; + transform_dp4( vtxPos, viewproj, 4, vtxout ); + translabel = "post-viewproj"; + } + break; + + case eDumpVertsTransformedByModelViewProj: // modelviewproj is slot 4 + { + float *modelviewproj = &m_programParamsF[ kGLMVertexProgram ].m_values[4][0]; + transform_dp4( vtxPos, modelviewproj, 4, vtxout ); + translabel = "post-modelviewproj"; + } + break; + + case eDumpVertsTransformedByBoneZeroThenViewProj: + { + float postbone[4]; + postbone[3] = 1.0; + + float *bonemat = &m_programParamsF[ kGLMVertexProgram ].m_values[58][0]; + transform_dp4( vtxPos, bonemat, 3, postbone ); + + float *viewproj = &m_programParamsF[ kGLMVertexProgram ].m_values[8][0]; // viewproj is slot 8 + transform_dp4( postbone, viewproj, 4, vtxout ); + + translabel = "post-bone0-viewproj"; + } + break; + + case eDumpVertsTransformedByBonesThenViewProj: + { + //float bone[4][4]; // [bone index][bone member] // members are adjacent + + vtxout[0] = vtxout[1] = vtxout[2] = vtxout[3] = 0; + + // unpack the third weight + vtxBoneWeights[2] = 1.0 - (vtxBoneWeights[0] + vtxBoneWeights[1]); + + for( int ibone=0; ibone<3; ibone++ ) + { + int boneindex = vtxBoneIndices[ ibone ]; + float *bonemat = &m_programParamsF[ kGLMVertexProgram ].m_values[58+(boneindex*3)][0]; + + float boneweight = vtxBoneWeights[ibone]; + + float postbonevtx[4]; + + transform_dp4( vtxPos, bonemat, 3, postbonevtx ); + + // add weighted sum into output + for( int which=0; which<4; which++ ) + { + vtxout[which] += boneweight * postbonevtx[which]; + } + } + + // fix W ? do we care ? check shaders to see what they do... + translabel = "post-skin3bone-viewproj"; + } + break; + } + if(translabel) + { + // for extra credit, do the perspective divide and viewport + + GLMPRINTF(("-D- %-24s: [ %7.4f %7.4f %7.4f %7.4f ]", translabel, vtxout[0],vtxout[1],vtxout[2],vtxout[3] )); + GLMPRINTF(("-D-" )); + } + } + + if (vtxIndex<0) + { + vtxIndex = start-1; // for printing of the data (note it will be incremented at bottom of loop, so bias down by 1) + } + else + { // no more < and > around vert dump lines + //mark += sprintf(mark, "" ); + } + } + } + + if (options & (1<m_editable->OpenInEditor(); + } + + if (m_drawingProgram[ kGLMFragmentProgram ]) + { + m_drawingProgram[ kGLMFragmentProgram ]->m_editable->OpenInEditor(); + } + #endif + } +/* + if (options & (1<<)) + { + } +*/ + // trailer line + GLMPRINTF(("-D- ===================================================================================== end %s %d frame %d", batchtype, m_nBatchCounter, m_debugFrameIndex )); + + GLMSetIndent(oldIndent); +} + +// here is the table that binds knob numbers to names. change at will. +char *g_knobnames[] = +{ +/*0*/ "dummy", + +/*1*/ "FB-SRGB", + #if 0 + /*1*/ "tex-U0-bias", // src left + /*2*/ "tex-V0-bias", // src upper + /*3*/ "tex-U1-bias", // src right + /*4*/ "tex-V1-bias", // src bottom + + /*5*/ "pos-X0-bias", // dst left + /*6*/ "pos-Y0-bias", // dst upper + /*7*/ "pos-X1-bias", // dst right + /*8*/ "pos-Y1-bias", // dst bottom + #endif + +}; +int g_knobcount = sizeof( g_knobnames ) / sizeof( g_knobnames[0] ); + +void GLMContext::DebugHook( GLMDebugHookInfo *info ) +{ + // FIXME: This has seriously bitrotted. + return; + + bool debughook = false; + // debug hook is called after an action has taken place. + // that would be the initial action, or a repeat. + // if paused, we stay inside this function until return. + // when returning, we inform the caller if it should repeat its last action or continue. + // there is no global pause state. The rest of the app runs at the best speed it can. + + // initial stuff we do unconditionally + + // increment iteration + info->m_iteration++; // can be thought of as "number of times the caller's action has now occurred - starting at 1" + + // now set initial state guess for the info block (outcome may change below) + info->m_loop = false; + + // check prior hold-conditions to see if any of them hit. + // note we disarm each trigger once the hold has occurred (one-shot style) + + switch( info->m_caller ) + { + case eBeginFrame: + if (debughook) GLMPRINTF(("-D- Caller: BeginFrame" )); + if ( (m_holdFrameBegin>=0) && (m_holdFrameBegin==m_debugFrameIndex) ) // did we hit a frame breakpoint? + { + if (debughook) GLMPRINTF(("-D- BeginFrame trigger match, clearing m_holdFrameBegin, hold=true" )); + + m_holdFrameBegin = -1; + + info->m_holding = true; + } + break; + + case eClear: + if (debughook) GLMPRINTF(("-D- Caller: Clear" )); + if ( (m_holdBatch>=0) && (m_holdBatchFrame>=0) && ((int)m_holdBatch==(int)m_nBatchCounter) && ((int)m_holdBatchFrame==(int)m_debugFrameIndex) ) + { + if (debughook) GLMPRINTF(("-D- Clear trigger match, clearing m_holdBatch&Frame, hold=true" )); + + m_holdBatch = m_holdBatchFrame = -1; + + info->m_holding = true; + } + break; + + case eDrawElements: + if (debughook) GLMPRINTF(( (info->m_caller==eClear) ? "-D- Caller: Clear" : "-D- Caller: Draw" )); + if ( (m_holdBatch>=0) && (m_holdBatchFrame>=0) && ((int)m_holdBatch==(int)m_nBatchCounter) && ((int)m_holdBatchFrame==(int)m_debugFrameIndex) ) + { + if (debughook) GLMPRINTF(("-D- Draw trigger match, clearing m_holdBatch&Frame, hold=true" )); + + m_holdBatch = m_holdBatchFrame = -1; + + info->m_holding = true; + } + break; + + case eEndFrame: + if (debughook) GLMPRINTF(("-D- Caller: EndFrame" )); + + // check for any expired batch hold req + if ( (m_holdBatch>=0) && (m_holdBatchFrame>=0) && (m_holdBatchFrame==m_debugFrameIndex) ) + { + // you tried to say 'next batch', but there wasn't one in this frame. + // target first batch of next frame instead + if (debughook) GLMPRINTF(("-D- EndFrame noticed an expired draw hold trigger, rolling to next frame, hold=false")); + + m_holdBatch = 0; + m_holdBatchFrame++; + + info->m_holding = false; + } + + // now check for an explicit hold on end of this frame.. + if ( (m_holdFrameEnd>=0) && (m_holdFrameEnd==m_debugFrameIndex) ) + { + if (debughook) GLMPRINTF(("-D- EndFrame trigger match, clearing m_holdFrameEnd, hold=true" )); + + m_holdFrameEnd = -1; + + info->m_holding = true; + } + break; + } + + // spin until event queue is empty *and* hold is false + + int evtcount=0; + + bool refresh = info->m_holding || m_debugDelayEnable; // only refresh once per initial visit (if paused!) or follow up event input + int breakToDebugger = 0; + // 1 = break to GDB + // 2 = break to OpenGL Profiler if attached + + do + { + if (refresh) + { + if (debughook) GLMPRINTF(("-D- pushing pixels" )); + DebugPresent(); // show pixels + + uint minidumpOptions = (1<SyncWithEditable() ) + { + redrawBatch = true; + } + } + + if (m_drawingProgram[ kGLMFragmentProgram ]) + { + if( m_drawingProgram[ kGLMFragmentProgram ]->SyncWithEditable() ) + { + redrawBatch = true; + } + } + + if (redrawBatch) + { + // act as if user pressed the option-\ key + + if (m_drawingLang == kGLMGLSL) + { + // if GLSL mode, force relink - and refresh the pair cache as needed + if (m_pBoundPair) + { + // fix it in place + m_pBoundPair->RefreshProgramPair(); + } + } + + // TODO - need to retest this whole path + FlushDrawStates( 0, 0, 0 ); // this is key, because the linked shader pair may have changed (note call to PurgePairsWithShader in cglmprogram.cpp) + + GLMPRINTF(("-- Shader changed, re-running batch" )); + + m_holdBatch = m_nBatchCounter; + m_holdBatchFrame = m_debugFrameIndex; + m_debugDelayEnable = false; + + info->m_holding = false; + info->m_loop = true; + + eventCheck = false; + } + #endif + + if(eventCheck) + { + PumpWindowsMessageLoop(); + CCocoaEvent evt; + evtcount = GetEvents( &evt, 1, true ); // asking for debug events only. + if (evtcount) + { + // print it + if (debughook) GLMPRINTF(("-D- Received debug key '%c' with modifiers %x", evt.m_UnicodeKeyUnmodified, evt.m_ModifierKeyMask )); + + // flag for refresh if we spin again + refresh = 1; + + switch(evt.m_UnicodeKeyUnmodified) + { + case ' ': // toggle pause + // clear all the holds to be sure + m_holdFrameBegin = m_holdFrameEnd = m_holdBatch = m_holdBatchFrame = -1; + info->m_holding = !info->m_holding; + + if (!info->m_holding) + { + m_debugDelayEnable = false; // coming out of pause means no slow mo + } + + GLMPRINTF((info->m_holding ? "-D- Paused." : "-D- Unpaused." )); + break; + + case 'f': // frame advance + GLMPRINTF(("-D- Command: next frame" )); + m_holdFrameBegin = m_debugFrameIndex+1; // stop at top of next numbered frame + m_debugDelayEnable = false; // get there fast + + info->m_holding = false; + break; + + case ']': // ahead 1 batch + case '}': // ahead ten batches + { + int delta = evt.m_UnicodeKeyUnmodified == ']' ? 1 : 10; + m_holdBatch = m_nBatchCounter+delta; + m_holdBatchFrame = m_debugFrameIndex; + m_debugDelayEnable = false; // get there fast + info->m_holding = false; + GLMPRINTF(("-D- Command: advance %d batches to %d", delta, m_holdBatch )); + } + break; + + case '[': // back one batch + case '{': // back 10 batches + { + int delta = evt.m_UnicodeKeyUnmodified == '[' ? -1 : -10; + m_holdBatch = m_nBatchCounter + delta; + if (m_holdBatch<0) + { + m_holdBatch = 0; + } + m_holdBatchFrame = m_debugFrameIndex+1; // next frame, but prev batch # + m_debugDelayEnable = false; // get there fast + info->m_holding = false; + GLMPRINTF(("-D- Command: rewind %d batches to %d", delta, m_holdBatch )); + } + break; + + case '\\': // batch rerun + + m_holdBatch = m_nBatchCounter; + m_holdBatchFrame = m_debugFrameIndex; + m_debugDelayEnable = false; + info->m_holding = false; + info->m_loop = true; + GLMPRINTF(("-D- Command: re-run batch %d", m_holdBatch )); + break; + + case 'c': // toggle auto color clear + m_autoClearColor = !m_autoClearColor; + GLMPRINTF((m_autoClearColor ? "-D- Auto color clear ON" : "-D- Auto color clear OFF" )); + break; + + case 's': // toggle auto stencil clear + m_autoClearStencil = !m_autoClearStencil; + GLMPRINTF((m_autoClearStencil ? "-D- Auto stencil clear ON" : "-D- Auto stencil clear OFF" )); + break; + + case 'd': // toggle auto depth clear + m_autoClearDepth = !m_autoClearDepth; + GLMPRINTF((m_autoClearDepth ? "-D- Auto depth clear ON" : "-D- Auto depth clear OFF" )); + break; + + case '.': // break to debugger or insta-quit + if (evt.m_ModifierKeyMask & (1<m_holding = true; + info->m_loop = true; // so when you come back from debugger, you get another spin (i.e. you enter paused mode) + } + break; + + case 'g': // break to OGLP and enable OGLP logging of spew + if (GLMDetectOGLP()) // if this comes back true, there will be a breakpoint set on glColor4sv. + { + uint channelMask = GLMDetectAvailableChannels(); // will re-assert whether spew goes to OGLP log + + if (channelMask & (1<m_holding = true; + info->m_loop = true; // so when you come back from debugger, you get another spin (i.e. you enter paused mode) + } + } + break; + + case '_': // toggle slow mo + m_debugDelayEnable = !m_debugDelayEnable; + break; + + case '-': // go slower + if (m_debugDelayEnable) + { + // already in slow mo, so lower speed + m_debugDelay <<= 1; // double delay + if (m_debugDelay > (1<<24)) + { + m_debugDelay = (1<<24); + } + } + else + { + // enter slow mo + m_debugDelayEnable = true; + } + break; + + case '=': // go faster + if (m_debugDelayEnable) + { + // already in slow mo, so raise speed + m_debugDelay >>= 1; // halve delay + if (m_debugDelay < (1<<17)) + { + m_debugDelay = (1<<17); + } + } + else + { + // enter slow mo + m_debugDelayEnable = true; + } + break; + + case 'v': + // open vs in editor (foreground pop) + #if GLMDEBUG + if (m_drawingProgram[ kGLMVertexProgram ]) + { + m_drawingProgram[ kGLMVertexProgram ]->m_editable->OpenInEditor( true ); + } + #endif + break; + + case 'p': + // open fs/ps in editor (foreground pop) + #if GLMDEBUG + if (m_drawingProgram[ kGLMFragmentProgram ]) + { + m_drawingProgram[ kGLMFragmentProgram ]->m_editable->OpenInEditor( true ); + } + #endif + break; + + case '<': // dump fewer verts + case '>': // dump more verts + { + int delta = (evt.m_UnicodeKeyUnmodified=='>') ? 1 : -1; + g_maxVertsToDumpLog2 = MIN( MAX( g_maxVertsToDumpLog2+delta, 0 ), 16 ); + + // just re-dump the verts + DebugDump( info, 1<= eLastDumpVertsMode) + { + // wrap + newmode = eDumpVertsNoTransformDump; + } + g_vertDumpMode = (EGLMVertDumpMode)newmode; + + GLMPRINTF(("-D- New vert dump mode is %s", g_vertDumpModeNames[g_vertDumpMode] )); + } + break; + + case 'u': // more crawl + { + CStackCrawlParams cp; + memset( &cp, 0, sizeof(cp) ); + cp.m_frameLimit = kMaxCrawlFrames; + + GetStackCrawl(&cp); + + GLMPRINTF(("-D-" )); + GLMPRINTF(("-D- extended stack crawl:")); + for( uint i=0; i< cp.m_frameCount; i++) + { + GLMPRINTF(("-D-\t%s", cp.m_crawlNames[i] )); + } + } + + break; + + case 'q': + DebugDump( info, 0xFFFFFFFF, g_vertDumpMode ); + break; + + + case 'H': + case 'h': + { + // toggle drawing language. hold down shift key to do it immediately. + + if (m_caps.m_hasDualShaders) + { + bool immediate; + + immediate = evt.m_UnicodeKeyUnmodified == 'H'; // (evt.m_ModifierKeyMask & (1<=0) && (flavorSelect m_selKnobMaxValue) + { + val = m_selKnobMaxValue; + } + // send new value back to the knob + GLMKnob( g_knobnames[ m_selKnobIndex ], &val ); + } + + if (evt.m_UnicodeKeyUnmodified == 'z') + { + // zero + val = 0.0f; + + // send new value back to the knob + GLMKnob( g_knobnames[ m_selKnobIndex ], &val ); + } + + GLMPRINTF(("-D- Knob # %d (%s) set to %f (%f/1024.0)", m_selKnobIndex, g_knobnames[ m_selKnobIndex ], val, val * 1024.0 )); + + ThreadSleep( 500000 / 1000 ); + + refresh = false; + } + } + break; + + } + } + } + } while( ((evtcount>0) || info->m_holding) && (!breakToDebugger) ); + + if (m_debugDelayEnable) + { + ThreadSleep( m_debugDelay / 1000 ); + } + + if (breakToDebugger) + { + switch (breakToDebugger) + { + case 1: + DebuggerBreak(); + break; + + case 2: + short fakecolor[4] = { 0, 0, 0, 0 }; + gGL->glColor4sv( fakecolor ); // break to OGLP + break; + } + // re-flush all GLM states so you can fiddle with them in the debugger. then run the batch again and spin.. + ForceFlushStates(); + } +} + +void GLMContext::DebugPresent( void ) +{ + CGLMTex *drawBufferTex = m_drawingFBO->m_attach[kAttColor0].m_tex; + gGL->glFinish(); + Present( drawBufferTex ); +} + +void GLMContext::DebugClear( void ) +{ + // get old clear color + GLClearColor_t clearcol_orig; + m_ClearColor.Read( &clearcol_orig,0 ); + + // new clear color + GLClearColor_t clearcol; + clearcol.r = m_autoClearColorValues[0]; + clearcol.g = m_autoClearColorValues[1]; + clearcol.b = m_autoClearColorValues[2]; + clearcol.a = m_autoClearColorValues[3]; + m_ClearColor.Write( &clearcol ); // don't check, don't defer + + uint mask = 0; + + if (m_autoClearColor) mask |= GL_COLOR_BUFFER_BIT; + if (m_autoClearDepth) mask |= GL_DEPTH_BUFFER_BIT; + if (m_autoClearStencil) mask |= GL_STENCIL_BUFFER_BIT; + + gGL->glClear( mask ); + gGL->glFinish(); + + // put old color back + m_ClearColor.Write( &clearcol_orig ); // don't check, don't defer +} + +#endif + +void GLMContext::CheckNative( void ) +{ + // note that this is available in release. We don't use GLMPRINTF for that reason. + // note we do not get called unless either slow-batch asserting or logging is enabled. +#ifdef OSX + bool gpuProcessing; + GLint fragmentGPUProcessing, vertexGPUProcessing; + + CGLGetParameter (CGLGetCurrentContext(), kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing); + CGLGetParameter(CGLGetCurrentContext(), kCGLCPGPUVertexProcessing, &vertexGPUProcessing); + + // spews then asserts. + // that way you can enable both, get log output on a pair if it's slow, and then the debugger will pop. + if(m_slowSpewEnable) + { + if ( !vertexGPUProcessing ) + { + m_drawingProgram[ kGLMVertexProgram ]->LogSlow( m_drawingLang ); + } + if ( !fragmentGPUProcessing ) + { + m_drawingProgram[ kGLMFragmentProgram ]->LogSlow( m_drawingLang ); + } + } + + if(m_slowAssertEnable) + { + if ( !vertexGPUProcessing || !fragmentGPUProcessing) + { + Assert( !"slow batch" ); + } + } +#else + //Assert( !"impl GLMContext::CheckNative()" ); + + if (m_checkglErrorsAfterEveryBatch) + { + // This is slow, and somewhat redundant (-gldebugoutput uses the GL_ARB_debug_output extension, which can be at least asynchronous), but having a straightforward backup can be useful. + // This is useful for callstack purposes - GL_ARB_debug_output may break in a different thread that the thread triggering the GL error. + //gGL->glFlush(); + GLenum errorcode = (GLenum)gGL->glGetError(); + if ( errorcode != GL_NO_ERROR ) + { + const char *decodedStr = GLMDecode( eGL_ERROR, errorcode ); + + char buf[512]; + V_snprintf( buf, sizeof( buf), "\nGL ERROR! %08x = '%s'\n", errorcode, decodedStr ); + + // Make sure the dev sees something, because these errors can happen early enough that DevMsg() does nothing. +#ifdef WIN32 + OutputDebugStringA( buf ); +#else + printf( "%s", buf ); +#endif + } + } + +#endif + +} + + + +// debug font +void GLMContext::GenDebugFontTex( void ) +{ + if(!m_debugFontTex) + { + // make a 128x128 RGBA texture + GLMTexLayoutKey key; + memset( &key, 0, sizeof(key) ); + + key.m_texGLTarget = GL_TEXTURE_2D; + key.m_xSize = 128; + key.m_ySize = 128; + key.m_zSize = 1; + key.m_texFormat = D3DFMT_A8R8G8B8; + key.m_texFlags = 0; + + m_debugFontTex = NewTex( &key, 1, "GLM debug font" ); + + + //----------------------------------------------------- + GLMTexLockParams lockreq; + + lockreq.m_tex = m_debugFontTex; + lockreq.m_face = 0; + lockreq.m_mip = 0; + + GLMTexLayoutSlice *slice = &m_debugFontTex->m_layout->m_slices[ lockreq.m_tex->CalcSliceIndex( lockreq.m_face, lockreq.m_mip ) ]; + + lockreq.m_region.xmin = lockreq.m_region.ymin = lockreq.m_region.zmin = 0; + lockreq.m_region.xmax = slice->m_xSize; + lockreq.m_region.ymax = slice->m_ySize; + lockreq.m_region.zmax = slice->m_zSize; + + lockreq.m_readback = false; + + char *lockAddress; + int yStride; + int zStride; + + m_debugFontTex->Lock( &lockreq, &lockAddress, &yStride, &zStride ); + + //----------------------------------------------------- + // fetch elements of font data and make texels... we're doing the whole slab so we don't really need the stride info + unsigned long *destTexelPtr = (unsigned long *)lockAddress; + + for( int index = 0; index < 16384; index++ ) + { + if (g_glmDebugFontMap[index] == ' ') + { + // clear + *destTexelPtr = 0x00000000; + } + else + { + // opaque white (drawing code can modulate if desired) + *destTexelPtr = 0xFFFFFFFF; + } + destTexelPtr++; + } + + //----------------------------------------------------- + GLMTexLockParams unlockreq; + + unlockreq.m_tex = m_debugFontTex; + unlockreq.m_face = 0; + unlockreq.m_mip = 0; + + // region need not matter for unlocks + unlockreq.m_region.xmin = unlockreq.m_region.ymin = unlockreq.m_region.zmin = 0; + unlockreq.m_region.xmax = unlockreq.m_region.ymax = unlockreq.m_region.zmax = 0; + + unlockreq.m_readback = false; + + m_debugFontTex->Unlock( &unlockreq ); + + //----------------------------------------------------- + // change up the tex sampling on this texture to be "nearest" not linear + + //----------------------------------------------------- + + // don't leave texture bound on the TMU + BindTexToTMU( NULL, 0 ); + + // also make the index and vertex buffers for use - up to 1K indices and 1K verts + + uint indexBufferSize = 1024*2; + + m_debugFontIndices = NewBuffer(kGLMIndexBuffer, indexBufferSize, 0); // two byte indices + + // we go ahead and lock it now, and fill it with indices 0-1023. + char *indices = NULL; + GLMBuffLockParams idxLock; + idxLock.m_nOffset = 0; + idxLock.m_nSize = indexBufferSize; + idxLock.m_bNoOverwrite = false; + idxLock.m_bDiscard = true; + m_debugFontIndices->Lock( &idxLock, &indices ); + for( int i=0; i<1024; i++) + { + unsigned short *idxPtr = &((unsigned short*)indices)[i]; + *idxPtr = i; + } + m_debugFontIndices->Unlock(); + + m_debugFontVertices = NewBuffer(kGLMVertexBuffer, 1024 * 128, 0); // up to 128 bytes per vert + } +} + +#define MAX_DEBUG_CHARS 256 +struct GLMDebugTextVertex +{ + float x,y,z; + float u,v; + char rgba[4]; +}; + +void GLMContext::DrawDebugText( float x, float y, float z, float drawCharWidth, float drawCharHeight, char *string ) +{ + if (!m_debugFontTex) + { + GenDebugFontTex(); + } + + // setup needed to draw text + + // we're assuming that +x goes left to right on screen, no billboarding math in here + // and that +y goes bottom up + // caller knows projection / rectangle so it gets to decide vertex spacing + + // debug font must be bound to TMU 0 + // texturing enabled + // alpha blending enabled + // generate a quad per character + // characters are 6px wide by 11 px high. + // upper left character in tex is 0x20 + // y axis will need to be flipped for display + + // for any character in 0x20 - 0x7F - here are the needed UV's + + // leftU = ((character % 16) * 6.0f / 128.0f) + // rightU = lowU + (6.0 / 128.0); + // topV = ((character - 0x20) * 11.0f / 128.0f) + // bottomV = lowV + (11.0f / 128.0f) + + int stringlen = strlen( string ); + if (stringlen > MAX_DEBUG_CHARS) + { + stringlen = MAX_DEBUG_CHARS; + } + + // lock + char *vertices = NULL; + GLMBuffLockParams vtxLock; + vtxLock.m_nOffset = 0; + vtxLock.m_nSize = 1024 * stringlen; + vtxLock.m_bNoOverwrite = false; + vtxLock.m_bDiscard = false; + m_debugFontVertices->Lock( &vtxLock, &vertices ); + + GLMDebugTextVertex *vtx = (GLMDebugTextVertex*)vertices; + GLMDebugTextVertex *vtxOutPtr = vtx; + + for( int charindex = 0; charindex < stringlen; charindex++ ) + { + float leftU,rightU,topV,bottomV; + + int character = (int)string[charindex]; + character -= 0x20; + if ( (character<0) || (character > 0x7F) ) + { + character = '*' - 0x20; + } + + leftU = ((character & 0x0F) * 6.0f ) / 128.0f; + rightU = leftU + (6.0f / 128.0f); + + topV = ((character >> 4) * 11.0f ) / 128.0f; + bottomV = topV + (11.0f / 128.0f); + + float posx,posy,posz; + + posx = x + (drawCharWidth * (float)charindex); + posy = y; + posz = z; + + // generate four verts + // first vert will be upper left of displayed quad (low X, high Y) then we go clockwise + for( int quadvert = 0; quadvert < 4; quadvert++ ) + { + bool isTop = (quadvert <2); // verts 0 and 1 + bool isLeft = (quadvert & 1) == (quadvert >> 1); // verts 0 and 3 + + vtxOutPtr->x = posx + (isLeft ? 0.0f : drawCharWidth); + vtxOutPtr->y = posy + (isTop ? drawCharHeight : 0.0f); + vtxOutPtr->z = posz; + + vtxOutPtr->u = isLeft ? leftU : rightU; + vtxOutPtr->v = isTop ? topV : bottomV; + + vtxOutPtr++; + } + } + + // verts are done. + // unlock... + + m_debugFontVertices->Unlock(); + + // make a vertex setup + GLMVertexSetup vertSetup; + + // position, color, tc = 0, 3, 8 + vertSetup.m_attrMask = (1<glDisable( GL_DEPTH_TEST ); + + gGL->glEnable(GL_TEXTURE_2D); + + if (0) + { + gGL->glEnableClientState(GL_VERTEX_ARRAY); + + gGL->glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + gGL->glVertexPointer( 3, GL_FLOAT, sizeof( vtx[0] ), &vtx[0].x ); + + gGL->glClientActiveTexture(GL_TEXTURE0); + + gGL->glTexCoordPointer( 2, GL_FLOAT, sizeof( vtx[0] ), &vtx[0].u ); + } + else + { + SetVertexAttributes( &vertSetup ); + } + + gGL->glDrawArrays( GL_QUADS, 0, stringlen * 4 ); + + // disable all the input streams + if (0) + { + gGL->glDisableClientState(GL_VERTEX_ARRAY); + + gGL->glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + else + { + SetVertexAttributes( NULL ); + } + + gGL->glDisable(GL_TEXTURE_2D); + + BindTexToTMU( pPrevTex, 0 ); +} + +//=============================================================================== + +void GLMgrSelfTests( void ) +{ + return; // until such time as the tests are revised or axed + + GLMDisplayParams glmParams; + glmParams.m_fsEnable = false; + + glmParams.m_vsyncEnable = false; // "The runtime updates the window client area immediately and might do so more + glmParams.m_backBufferWidth = 1024; + glmParams.m_backBufferHeight = 768; + glmParams.m_backBufferFormat = D3DFMT_A8R8G8B8; + glmParams.m_multiSampleCount = 2; + + glmParams.m_enableAutoDepthStencil = true; + glmParams.m_autoDepthStencilFormat = D3DFMT_D24S8; + + glmParams.m_fsRefreshHz = 60; + + glmParams.m_mtgl = true; + glmParams.m_focusWindow = 0; + + // make a new context on renderer 0. + GLMContext *ctx = GLMgr::aGLMgr()->NewContext( NULL, &glmParams ); ////FIXME you can't make contexts this way any more. + if (!ctx) + { + DebuggerBreak(); // no go + return; + } + + // make a test object based on that context. + //int alltests[] = {0,1,2,3, -1}; + //int newtests[] = {3, -1}; + int twotests[] = {2, -1}; + //int notests[] = {-1}; + + int *testlist = twotests; + + GLMTestParams params; + memset( ¶ms, 0, sizeof(params) ); + + params.m_ctx = ctx; + params.m_testList = testlist; + + params.m_glErrToDebugger = true; + params.m_glErrToConsole = true; + + params.m_intlErrToDebugger = true; + params.m_intlErrToConsole = true; + + params.m_frameCount = 1000; + + GLMTester testobj( ¶ms ); + + testobj.RunTests( ); + + GLMgr::aGLMgr()->DelContext( ctx ); +} + +void GLMContext::SetDefaultStates( void ) +{ + GLM_FUNC; + CheckCurrent(); + + m_AlphaTestEnable.Default(); + m_AlphaTestFunc.Default(); + + m_AlphaToCoverageEnable.Default(); + + m_CullFaceEnable.Default(); + m_CullFrontFace.Default(); + + m_PolygonMode.Default(); + m_DepthBias.Default(); + + m_ClipPlaneEnable.Default(); + m_ClipPlaneEquation.Default(); + + m_ScissorEnable.Default(); + m_ScissorBox.Default(); + + m_ViewportBox.Default(); + m_ViewportDepthRange.Default(); + + m_ColorMaskSingle.Default(); + m_ColorMaskMultiple.Default(); + + m_BlendEnable.Default(); + m_BlendFactor.Default(); + m_BlendEquation.Default(); + m_BlendColor.Default(); + //m_BlendEnableSRGB.Default(); // this isn't useful until there is an FBO bound - in fact it will trip a GL error. + + m_DepthTestEnable.Default(); + m_DepthFunc.Default(); + m_DepthMask.Default(); + + m_StencilTestEnable.Default(); + m_StencilFunc.Default(); + m_StencilOp.Default(); + m_StencilWriteMask.Default(); + + m_ClearColor.Default(); + m_ClearDepth.Default(); + m_ClearStencil.Default(); +} + +void GLMContext::VerifyStates ( void ) +{ + GLM_FUNC; + CheckCurrent(); + + // bare bones sanity check, head over to the debugger if our sense of the current context state is not correct + // we should only want to call this after a flush or the checks will flunk. + + if( m_AlphaTestEnable.Check() ) GLMStop(); + if( m_AlphaTestFunc.Check() ) GLMStop(); + + if( m_AlphaToCoverageEnable.Check() ) GLMStop(); + + if( m_CullFaceEnable.Check() ) GLMStop(); + if( m_CullFrontFace.Check() ) GLMStop(); + + if( m_PolygonMode.Check() ) GLMStop(); + if( m_DepthBias.Check() ) GLMStop(); + + if( m_ClipPlaneEnable.Check() ) GLMStop(); + //if( m_ClipPlaneEquation.Check() ) GLMStop(); + + if( m_ScissorEnable.Check() ) GLMStop(); + if( m_ScissorBox.Check() ) GLMStop(); + + + if( m_ViewportBox.Check() ) GLMStop(); + if( m_ViewportDepthRange.Check() ) GLMStop(); + + if( m_ColorMaskSingle.Check() ) GLMStop(); + if( m_ColorMaskMultiple.Check() ) GLMStop(); + + if( m_BlendEnable.Check() ) GLMStop(); + if( m_BlendFactor.Check() ) GLMStop(); + if( m_BlendEquation.Check() ) GLMStop(); + if( m_BlendColor.Check() ) GLMStop(); + + // only do this as caps permit + if (m_caps.m_hasGammaWrites) + { + if( m_BlendEnableSRGB.Check() ) GLMStop(); + } + + if( m_DepthTestEnable.Check() ) GLMStop(); + if( m_DepthFunc.Check() ) GLMStop(); + if( m_DepthMask.Check() ) GLMStop(); + + if( m_StencilTestEnable.Check() ) GLMStop(); + if( m_StencilFunc.Check() ) GLMStop(); + if( m_StencilOp.Check() ) GLMStop(); + if( m_StencilWriteMask.Check() ) GLMStop(); + + if( m_ClearColor.Check() ) GLMStop(); + if( m_ClearDepth.Check() ) GLMStop(); + if( m_ClearStencil.Check() ) GLMStop(); +} + +static inline uint GetDataTypeSizeInBytes( GLenum dataType ) +{ + switch ( dataType ) + { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + return 1; + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_HALF_FLOAT: + return 2; + case GL_INT: + case GL_FLOAT: + return 4; + default: + Assert( 0 ); + break; + } + return 0; +} + +#ifndef OSX + +void GLMContext::DrawRangeElementsNonInline( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, uint baseVertex, CGLMBuffer *pIndexBuf ) +{ +#if GLMDEBUG + GLM_FUNC; +#else + //tmZone( TELEMETRY_LEVEL0, TMZF_NONE, "%s %d-%d count:%d mode:%d type:%d", __FUNCTION__, start, end, count, mode, type ); +#endif + + ++m_nBatchCounter; + + SetIndexBuffer( pIndexBuf ); + + void *indicesActual = (void*)indices; + + if ( pIndexBuf->m_bPseudo ) + { + // you have to pass actual address, not offset + indicesActual = (void*)( (int)indicesActual + (int)pIndexBuf->m_pPseudoBuf ); + } + if (pIndexBuf->m_bUsingPersistentBuffer) + { + indicesActual = (void*)( (int)indicesActual + (int)pIndexBuf->m_nPersistentBufferStartOffset ); + } + +#if GL_ENABLE_INDEX_VERIFICATION + // Obviously only for debugging. + if ( !pIndexBuf->IsSpanValid( (uint)indices, count * GetDataTypeSizeInBytes( type ) ) ) + { + // The consumption range crosses more than one lock span, or the lock is trying to consume a bad IB range. + DXABSTRACT_BREAK_ON_ERROR(); + } + + if ( ( type == GL_UNSIGNED_SHORT ) && ( pIndexBuf->m_bPseudo ) ) + { + Assert( start <= end ); + for ( int i = 0; i < count; i++) + { + uint n = ((const uint16*)indicesActual)[i]; + if ( ( n < start ) || ( n > end ) ) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + } + + unsigned char *pVertexShaderAttribMap = m_pDevice->m_vertexShader->m_vtxAttribMap; + const int nMaxVertexAttributesToCheck = m_drawingProgram[ kGLMVertexProgram ]->m_maxVertexAttrs; + + IDirect3DVertexDeclaration9 *pVertDecl = m_pDevice->m_pVertDecl; + const uint8 *pVertexAttribDescToStreamIndex = pVertDecl->m_VertexAttribDescToStreamIndex; + + // FIXME: Having to duplicate all this flush logic is terrible here + for( int nMask = 1, nIndex = 0; nIndex < nMaxVertexAttributesToCheck; ++nIndex, nMask <<= 1 ) + { + uint8 vertexShaderAttrib = pVertexShaderAttribMap[ nIndex ]; + + uint nDeclIndex = pVertexAttribDescToStreamIndex[vertexShaderAttrib]; + if ( nDeclIndex == 0xFF ) + continue; + + D3DVERTEXELEMENT9_GL *pDeclElem = &pVertDecl->m_elements[nDeclIndex]; + + Assert( ( ( vertexShaderAttrib >> 4 ) == pDeclElem->m_dxdecl.Usage ) && ( ( vertexShaderAttrib & 0x0F ) == pDeclElem->m_dxdecl.UsageIndex) ); + + const uint nStreamIndex = pDeclElem->m_dxdecl.Stream; + const D3DStreamDesc *pStream = &m_pDevice->m_streams[ nStreamIndex ]; + + CGLMBuffer *pBuf = m_pDevice->m_vtx_buffers[ nStreamIndex ]; + if ( pBuf == m_pDevice->m_pDummy_vtx_buffer ) + continue; + + Assert( pStream->m_vtxBuffer->m_vtxBuffer == pBuf ); + + int nBufOffset = pDeclElem->m_gldecl.m_offset + pStream->m_offset; + Assert( nBufOffset >= 0 ); + Assert( nBufOffset < (int)pBuf->m_nSize ); + + uint nBufSize = pStream->m_vtxBuffer->m_vtxBuffer->m_nSize; + uint nDataTypeSize = GetDataTypeSizeInBytes( pDeclElem->m_gldecl.m_datatype ); + uint nActualStride = pStream->m_stride ? pStream->m_stride : nDataTypeSize; + uint nStart = nBufOffset + ( start + baseVertex ) * nActualStride; + uint nEnd = nBufOffset + ( end + baseVertex ) * nActualStride + nDataTypeSize; + + if ( nEnd > nBufSize ) + { + DXABSTRACT_BREAK_ON_ERROR(); + } + + if ( !pStream->m_vtxBuffer->m_vtxBuffer->IsSpanValid( nStart, nEnd - nStart ) ) + { + // The draw is trying to consume a range of the bound VB that hasn't been set to valid data! + DXABSTRACT_BREAK_ON_ERROR(); + } + } + } +#endif + + Assert( m_drawingLang == kGLMGLSL ); + + if ( m_pBoundPair ) + { + gGL->glDrawRangeElementsBaseVertex( mode, start, end, count, type, indicesActual, baseVertex ); + +#if GLMDEBUG + if ( m_slowCheckEnable ) + { + CheckNative(); + } +#endif + } +} + +#else + +// support for OSX 10.6 (no support for glDrawRangeElementsBaseVertex) +void GLMContext::DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, CGLMBuffer *pIndexBuf) +{ + GLM_FUNC; + + // CheckCurrent(); + ++m_nBatchCounter; // batch index increments unconditionally on entry + + SetIndexBuffer( pIndexBuf ); + void *indicesActual = (void*)indices; + if ( pIndexBuf->m_bPseudo ) + { + // you have to pass actual address, not offset + indicesActual = (void*)( (int)indicesActual + (int)pIndexBuf->m_pPseudoBuf ); + } + if (pIndexBuf->m_bUsingPersistentBuffer) + { + indicesActual = (void*)( (int)indicesActual + (int)pIndexBuf->m_nPersistentBufferStartOffset ); + } + +#if GLMDEBUG + // init debug hook information + GLMDebugHookInfo info; + memset(&info, 0, sizeof(info)); + info.m_caller = eDrawElements; + + // relay parameters we're operating under + info.m_drawMode = mode; + info.m_drawStart = start; + info.m_drawEnd = end; + info.m_drawCount = count; + info.m_drawType = type; + info.m_drawIndices = indices; + + do + { + // obey global options re pre-draw clear + if (m_autoClearColor || m_autoClearDepth || m_autoClearStencil) + { + GLMPRINTF(("-- DrawRangeElements auto clear")); + this->DebugClear(); + } + + // always sync with editable shader text prior to draw +#if GLMDEBUG + // TODO - fixup OSX 10.6 m_boundProg not used in this version togl (m_pBoundPair) + //FIXME disengage this path if context is in GLSL mode.. + // it will need fixes to get the shader pair re-linked etc if edits happen anyway. + + if (m_boundProgram[kGLMVertexProgram]) + { + m_boundProgram[kGLMVertexProgram]->SyncWithEditable(); + } + else + { + AssertOnce(!"drawing with no vertex program bound"); + } + + if (m_boundProgram[kGLMFragmentProgram]) + { + m_boundProgram[kGLMFragmentProgram]->SyncWithEditable(); + } + else + { + AssertOnce(!"drawing with no fragment program bound"); + } +#endif + + // do the drawing + if ( m_pBoundPair ) + { + gGL->glDrawRangeElements(mode, start, end, count, type, indicesActual); + // GLMCheckError(); + + if (m_slowCheckEnable) + { + CheckNative(); + } + } + this->DebugHook(&info); + } while (info.m_loop); +#else + if ( m_pBoundPair ) + { + gGL->glDrawRangeElements(mode, start, end, count, type, indicesActual); + +#if GLMDEBUG + if ( m_slowCheckEnable ) + { + CheckNative(); + } +#endif + } +#endif +} + +#endif // !OSX + +#if 0 +// helper function to do enable or disable in one step +void glSetEnable( GLenum which, bool enable ) +{ + if (enable) + gGL->glEnable(which); + else + gGL->glDisable(which); +} + +// helper function for int vs enum clarity +void glGetEnumv( GLenum which, GLenum *dst ) +{ + gGL->glGetIntegerv( which, (int*)dst ); +} +#endif + +//=============================================================================== + + +GLMTester::GLMTester(GLMTestParams *params) +{ + m_params = *params; + + m_drawFBO = NULL; + m_drawColorTex = NULL; + m_drawDepthTex = NULL; +} + +GLMTester::~GLMTester() +{ +} + +void GLMTester::StdSetup( void ) +{ + GLMContext *ctx = m_params.m_ctx; + + m_drawWidth = 1024; + m_drawHeight = 768; + + // make an FBO to draw into and activate it. no depth buffer yet + m_drawFBO = ctx->NewFBO(); + + // make color buffer texture + + GLMTexLayoutKey colorkey; + //CGLMTex *colortex; + memset( &colorkey, 0, sizeof(colorkey) ); + + colorkey.m_texGLTarget = GL_TEXTURE_2D; + colorkey.m_xSize = m_drawWidth; + colorkey.m_ySize = m_drawHeight; + colorkey.m_zSize = 1; + + colorkey.m_texFormat = D3DFMT_A8R8G8B8; + colorkey.m_texFlags = kGLMTexRenderable; + + m_drawColorTex = ctx->NewTex( &colorkey ); + + // do not leave that texture bound on the TMU + ctx->BindTexToTMU(NULL, 0 ); + + + // attach color to FBO + GLMFBOTexAttachParams colorParams; + memset( &colorParams, 0, sizeof(colorParams) ); + + colorParams.m_tex = m_drawColorTex; + colorParams.m_face = 0; + colorParams.m_mip = 0; + colorParams.m_zslice= 0; // for clarity.. + + m_drawFBO->TexAttach( &colorParams, kAttColor0 ); + + // check it. + bool ready = m_drawFBO->IsReady(); + InternalError( !ready, "drawing FBO no go"); + + // bind it + ctx->BindFBOToCtx( m_drawFBO, GL_FRAMEBUFFER_EXT ); + + gGL->glViewport(0, 0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); + CheckGLError("stdsetup viewport"); + + gGL->glScissor( 0,0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); + CheckGLError("stdsetup scissor"); + + gGL->glOrtho( -1,1, -1,1, -1,1 ); + CheckGLError("stdsetup ortho"); + + // activate debug font + ctx->GenDebugFontTex(); +} + +void GLMTester::StdCleanup( void ) +{ + GLMContext *ctx = m_params.m_ctx; + + // unbind + ctx->BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + + // del FBO + if (m_drawFBO) + { + ctx->DelFBO( m_drawFBO ); + m_drawFBO = NULL; + } + + // del tex + if (m_drawColorTex) + { + ctx->DelTex( m_drawColorTex ); + m_drawColorTex = NULL; + } + + if (m_drawDepthTex) + { + ctx->DelTex( m_drawDepthTex ); + m_drawDepthTex = NULL; + } +} + + +void GLMTester::Clear( void ) +{ + GLMContext *ctx = m_params.m_ctx; + ctx->MakeCurrent(); + + gGL->glViewport(0, 0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); + gGL->glScissor( 0,0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); + gGL->glOrtho( -1,1, -1,1, -1,1 ); + CheckGLError("clearing viewport"); + + // clear to black + gGL->glClearColor(0.0f, 0.0f, 0.0, 1.0f); + CheckGLError("clearing color"); + + gGL->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + CheckGLError("clearing"); + + //glFinish(); + //CheckGLError("clear finish"); +} + +void GLMTester::Present( int seed ) +{ + GLMContext *ctx = m_params.m_ctx; + ctx->Present( m_drawColorTex ); +} + +void GLMTester::CheckGLError( const char *comment ) +{ +return; + char errbuf[1024]; + + //borrowed from GLMCheckError.. slightly different + + if (!comment) + { + comment = ""; + } + + GLenum errorcode = (GLenum)gGL->glGetError(); + GLenum errorcode2 = 0; + if ( errorcode != GL_NO_ERROR ) + { + const char *decodedStr = GLMDecode( eGL_ERROR, errorcode ); + const char *decodedStr2 = ""; + + if ( errorcode == GL_INVALID_FRAMEBUFFER_OPERATION_EXT ) + { + // dig up the more detailed FBO status + errorcode2 = gGL->glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ); + + decodedStr2 = GLMDecode( eGL_ERROR, errorcode2 ); + + sprintf( errbuf, "\n%s - GL Error %08x/%08x = '%s / %s'\n", comment, errorcode, errorcode2, decodedStr, decodedStr2 ); + } + else + { + sprintf( errbuf, "\n%s - GL Error %08x = '%s'\n", comment, errorcode, decodedStr ); + } + + if ( m_params.m_glErrToConsole ) + { + printf("%s", errbuf ); + } + + if ( m_params.m_glErrToDebugger ) + { + DebuggerBreak(); + } + } +} + +void GLMTester::InternalError( int errcode, char *comment ) +{ + if (errcode) + { + if (m_params.m_intlErrToConsole) + { + printf("%s - error %d\n", comment, errcode ); + } + + if (m_params.m_intlErrToDebugger) + { + DebuggerBreak(); + } + } +} + + +void GLMTester::RunTests( void ) +{ + int *testList = m_params.m_testList; + + while( (*testList >=0) && (*testList < 20) ) + { + RunOneTest( *testList++ ); + } +} + +void GLMTester::RunOneTest( int testindex ) +{ + // this might be better with 'ptmf' style + switch(testindex) + { + case 0: Test0(); break; + case 1: Test1(); break; + case 2: Test2(); break; + case 3: Test3(); break; + + default: + DebuggerBreak(); // unrecognized + } +} + +// ##################################################################################################################### + +// some fixed lists which may be useful to all tests + +D3DFORMAT g_drawTexFormatsGLMT[] = // -1 terminated +{ + D3DFMT_A8R8G8B8, + D3DFMT_A4R4G4B4, + D3DFMT_X8R8G8B8, + D3DFMT_X1R5G5B5, + D3DFMT_A1R5G5B5, + D3DFMT_L8, + D3DFMT_A8L8, + D3DFMT_R8G8B8, + D3DFMT_A8, + D3DFMT_R5G6B5, + D3DFMT_DXT1, + D3DFMT_DXT3, + D3DFMT_DXT5, + D3DFMT_A32B32G32R32F, + D3DFMT_A16B16G16R16, + + (D3DFORMAT)-1 +}; + +D3DFORMAT g_fboColorTexFormatsGLMT[] = // -1 terminated +{ + D3DFMT_A8R8G8B8, + //D3DFMT_A4R4G4B4, //unsupported + D3DFMT_X8R8G8B8, + D3DFMT_X1R5G5B5, + //D3DFMT_A1R5G5B5, //unsupported + D3DFMT_A16B16G16R16F, + D3DFMT_A32B32G32R32F, + D3DFMT_R5G6B5, + + (D3DFORMAT)-1 +}; + +D3DFORMAT g_fboDepthTexFormatsGLMT[] = // -1 terminated, but note 0 for "no depth" mode +{ + (D3DFORMAT)0, + D3DFMT_D16, + D3DFMT_D24X8, + D3DFMT_D24S8, + + (D3DFORMAT)-1 +}; + + +// ##################################################################################################################### + +void GLMTester::Test0( void ) +{ + // make and delete a bunch of textures. + // lock and unlock them. + // use various combos of - + + // √texel format + // √2D | 3D | cube map + // √mipped / not + // √POT / NPOT + // large / small / square / rect + // square / rect + + GLMContext *ctx = m_params.m_ctx; + ctx->MakeCurrent(); + + CUtlVector< CGLMTex* > testTextures; // will hold all the built textures + + // test stage loop + // 0 is creation + // 1 is lock/unlock + // 2 is deletion + + for( int teststage = 0; teststage < 3; teststage++) + { + int innerindex = 0; // increment at stage switch + // format loop + for( D3DFORMAT *fmtPtr = g_drawTexFormatsGLMT; *fmtPtr != ((D3DFORMAT)-1); fmtPtr++ ) + { + // form loop + GLenum forms[] = { GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP, (GLenum)-1 }; + + for( GLenum *formPtr = forms; *formPtr != ((GLenum)-1); formPtr++ ) + { + // mip loop + for( int mipped = 0; mipped < 2; mipped++ ) + { + // large / square / pot loop + // &4 == large &2 == square &1 == POT + // NOTE you *have to be square* for cube maps. + + for( int aspect = 0; aspect < 8; aspect++ ) + { + switch( teststage ) + { + case 0: + { + GLMTexLayoutKey key; + memset( &key, 0, sizeof(key) ); + + key.m_texGLTarget = *formPtr; + key.m_texFormat = *fmtPtr; + if (mipped) + key.m_texFlags |= kGLMTexMipped; + + // assume big, square, POT, and 3D, then adjust as needed + key.m_xSize = key.m_ySize = key.m_zSize = 256; + + if ( !(aspect&4) ) // big or little ? + { + // little + key.m_xSize >>= 2; + key.m_ySize >>= 2; + key.m_zSize >>= 2; + } + + if ( key.m_texGLTarget != GL_TEXTURE_CUBE_MAP ) + { + if ( !(aspect & 2) ) // square or rect? + { + // rect + key.m_ySize >>= 1; + key.m_zSize >>= 2; + } + } + + if ( !(aspect&1) ) // POT or NPOT? + { + // NPOT + key.m_xSize += 56; + key.m_ySize += 56; + key.m_zSize += 56; + } + + // 2D, 3D, cube map ? + if (key.m_texGLTarget!=GL_TEXTURE_3D) + { + // 2D or cube map: flatten Z extent to one texel + key.m_zSize = 1; + } + else + { + // 3D: knock down Z quite a bit so our test case does not run out of RAM + key.m_zSize >>= 3; + if (!key.m_zSize) + { + key.m_zSize = 1; + } + } + + CGLMTex *newtex = ctx->NewTex( &key ); + CheckGLError( "tex create test"); + InternalError( newtex==NULL, "tex create test" ); + + testTextures.AddToTail( newtex ); + printf("\n[%5d] created tex %s",innerindex,newtex->m_layout->m_layoutSummary ); + } + break; + + case 1: + { + CGLMTex *ptex = testTextures[innerindex]; + + for( int face=0; face m_layout->m_faceCount; face++) + { + for( int mip=0; mip m_layout->m_mipCount; mip++) + { + GLMTexLockParams lockreq; + + lockreq.m_tex = ptex; + lockreq.m_face = face; + lockreq.m_mip = mip; + + GLMTexLayoutSlice *slice = &ptex->m_layout->m_slices[ ptex->CalcSliceIndex( face, mip ) ]; + + lockreq.m_region.xmin = lockreq.m_region.ymin = lockreq.m_region.zmin = 0; + lockreq.m_region.xmax = slice->m_xSize; + lockreq.m_region.ymax = slice->m_ySize; + lockreq.m_region.zmax = slice->m_zSize; + + char *lockAddress; + int yStride; + int zStride; + + ptex->Lock( &lockreq, &lockAddress, &yStride, &zStride ); + CheckGLError( "tex lock test"); + InternalError( lockAddress==NULL, "null lock address"); + + // write some texels of this flavor: + // red 75% green 40% blue 15% alpha 80% + + GLMGenTexelParams gtp; + + gtp.m_format = ptex->m_layout->m_format->m_d3dFormat; + gtp.m_dest = lockAddress; + gtp.m_chunkCount = (slice->m_xSize * slice->m_ySize * slice->m_zSize) / (ptex->m_layout->m_format->m_chunkSize * ptex->m_layout->m_format->m_chunkSize); + gtp.m_byteCountLimit = slice->m_storageSize; + gtp.r = 0.75; + gtp.g = 0.40; + gtp.b = 0.15; + gtp.a = 0.80; + + GLMGenTexels( >p ); + + InternalError( gtp.m_bytesWritten != gtp.m_byteCountLimit, "byte count mismatch from GLMGenTexels" ); + } + } + + for( int face=0; face m_layout->m_faceCount; face++) + { + for( int mip=0; mip m_layout->m_mipCount; mip++) + { + GLMTexLockParams unlockreq; + + unlockreq.m_tex = ptex; + unlockreq.m_face = face; + unlockreq.m_mip = mip; + + // region need not matter for unlocks + unlockreq.m_region.xmin = unlockreq.m_region.ymin = unlockreq.m_region.zmin = 0; + unlockreq.m_region.xmax = unlockreq.m_region.ymax = unlockreq.m_region.zmax = 0; + + //char *lockAddress; + //int yStride; + //int zStride; + + ptex->Unlock( &unlockreq ); + + CheckGLError( "tex unlock test"); + } + } + printf("\n[%5d] locked/wrote/unlocked tex %s",innerindex, ptex->m_layout->m_layoutSummary ); + } + break; + + case 2: + { + CGLMTex *dtex = testTextures[innerindex]; + + printf("\n[%5d] deleting tex %s",innerindex, dtex->m_layout->m_layoutSummary ); + ctx->DelTex( dtex ); + CheckGLError( "tex delete test"); + } + break; + } // end stage switch + innerindex++; + } // end aspect loop + } // end mip loop + } // end form loop + } // end format loop + } // end stage loop +} + +// ##################################################################################################################### +void GLMTester::Test1( void ) +{ + // FBO exercises + GLMContext *ctx = m_params.m_ctx; + ctx->MakeCurrent(); + + // FBO color format loop + for( D3DFORMAT *colorFmtPtr = g_fboColorTexFormatsGLMT; *colorFmtPtr != ((D3DFORMAT)-1); colorFmtPtr++ ) + { + // FBO depth format loop + for( D3DFORMAT *depthFmtPtr = g_fboDepthTexFormatsGLMT; *depthFmtPtr != ((D3DFORMAT)-1); depthFmtPtr++ ) + { + // mip loop + for( int mipped = 0; mipped < 2; mipped++ ) + { + GLenum forms[] = { GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE_MAP, (GLenum)-1 }; + + // form loop + for( GLenum *formPtr = forms; *formPtr != ((GLenum)-1); formPtr++ ) + { + //=============================================== make an FBO + CGLMFBO *fbo = ctx->NewFBO(); + + //=============================================== make a color texture + GLMTexLayoutKey colorkey; + memset( &colorkey, 0, sizeof(colorkey) ); + + switch(*formPtr) + { + case GL_TEXTURE_2D: + colorkey.m_texGLTarget = GL_TEXTURE_2D; + colorkey.m_xSize = 800; + colorkey.m_ySize = 600; + colorkey.m_zSize = 1; + break; + + case GL_TEXTURE_3D: + colorkey.m_texGLTarget = GL_TEXTURE_3D; + colorkey.m_xSize = 800; + colorkey.m_ySize = 600; + colorkey.m_zSize = 32; + break; + + case GL_TEXTURE_CUBE_MAP: + colorkey.m_texGLTarget = GL_TEXTURE_CUBE_MAP; + colorkey.m_xSize = 800; + colorkey.m_ySize = 800; // heh, cube maps have to have square sides... + colorkey.m_zSize = 1; + break; + } + + colorkey.m_texFormat = *colorFmtPtr; + colorkey.m_texFlags = kGLMTexRenderable; + // decide if we want mips + if (mipped) + { + colorkey.m_texFlags |= kGLMTexMipped; + } + + CGLMTex *colorTex = ctx->NewTex( &colorkey ); + // Note that GLM will notice the renderable flag, and force texels to be written + // so the FBO will be complete + + //=============================================== attach color + GLMFBOTexAttachParams colorParams; + memset( &colorParams, 0, sizeof(colorParams) ); + + colorParams.m_tex = colorTex; + colorParams.m_face = (colorkey.m_texGLTarget == GL_TEXTURE_CUBE_MAP) ? 2 : 0; // just steer to an alternate face as a test + + colorParams.m_mip = (colorkey.m_texFlags & kGLMTexMipped) ? 2 : 0; // pick non-base mip slice + + colorParams.m_zslice= (colorkey.m_texGLTarget == GL_TEXTURE_3D) ? 3 : 0; // just steer to an alternate slice as a test; + + fbo->TexAttach( &colorParams, kAttColor0 ); + + + //=============================================== optional depth tex + CGLMTex *depthTex = NULL; + + if (*depthFmtPtr > 0 ) + { + GLMTexLayoutKey depthkey; + memset( &depthkey, 0, sizeof(depthkey) ); + + depthkey.m_texGLTarget = GL_TEXTURE_2D; + depthkey.m_xSize = colorkey.m_xSize >> colorParams.m_mip; // scale depth tex to match color tex + depthkey.m_ySize = colorkey.m_ySize >> colorParams.m_mip; + depthkey.m_zSize = 1; + + depthkey.m_texFormat = *depthFmtPtr; + depthkey.m_texFlags = kGLMTexRenderable | kGLMTexIsDepth; // no mips. + if (depthkey.m_texFormat==D3DFMT_D24S8) + { + depthkey.m_texFlags |= kGLMTexIsStencil; + } + + depthTex = ctx->NewTex( &depthkey ); + + + //=============================================== attach depth + GLMFBOTexAttachParams depthParams; + memset( &depthParams, 0, sizeof(depthParams) ); + + depthParams.m_tex = depthTex; + depthParams.m_face = 0; + depthParams.m_mip = 0; + depthParams.m_zslice= 0; + + EGLMFBOAttachment depthAttachIndex = (depthkey.m_texFlags & kGLMTexIsStencil) ? kAttDepthStencil : kAttDepth; + fbo->TexAttach( &depthParams, depthAttachIndex ); + } + + printf("\n FBO:\n color tex %s\n depth tex %s", + colorTex->m_layout->m_layoutSummary, + depthTex ? depthTex->m_layout->m_layoutSummary : "none" + ); + + // see if FBO is happy + bool ready = fbo->IsReady(); + + printf("\n -> %s\n", ready ? "pass" : "fail" ); + + // unbind + ctx->BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + + // del FBO + ctx->DelFBO(fbo); + + // del texes + ctx->DelTex( colorTex ); + if (depthTex) ctx->DelTex( depthTex ); + } // end form loop + } // end mip loop + } // end depth loop + } // end color loop +} + +// ##################################################################################################################### + +static int selftest2_seed = 0; // inc this every run to force main thread to teardown/reset display view +void GLMTester::Test2( void ) +{ + GLMContext *ctx = m_params.m_ctx; + ctx->MakeCurrent(); + + StdSetup(); // default test case drawing setup + + // draw stuff (loop...) + for( int i=0; iglClearColor(clear_color[0], clear_color[1], clear_color[2], clear_color[3]); + CheckGLError("test2 clear color"); + + gGL->glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT+GL_STENCIL_BUFFER_BIT); + CheckGLError("test2 clearing"); + + // try out debug text + for( int j=0; j<16; j++) + { + char text[256]; + sprintf(text, "The quick brown fox jumped over the lazy dog %d times", i ); + + float theta = ( (i*0.10f) + (j * 6.28f) ) / 16.0f; + + float posx = cos(theta) * 0.5; + float posy = sin(theta) * 0.5; + + float charwidth = 6.0 * (2.0 / 1024.0); + float charheight = 11.0 * (2.0 / 768.0); + + ctx->DrawDebugText( posx, posy, 0.0f, charwidth, charheight, text ); + } + gGL->glFinish(); + CheckGLError("test2 finish"); + + Present( selftest2_seed ); + } + + StdCleanup(); + + selftest2_seed++; +} + +// ##################################################################################################################### + +static char g_testVertexProgram01 [] = +{ + "!!ARBvp1.0 \n" + "TEMP vertexClip; \n" + "DP4 vertexClip.x, state.matrix.mvp.row[0], vertex.position; \n" + "DP4 vertexClip.y, state.matrix.mvp.row[1], vertex.position; \n" + "DP4 vertexClip.z, state.matrix.mvp.row[2], vertex.position; \n" + "DP4 vertexClip.w, state.matrix.mvp.row[3], vertex.position; \n" + "ADD vertexClip.y, vertexClip.x, vertexClip.y; \n" + "MOV result.position, vertexClip; \n" + "MOV result.color, vertex.color; \n" + "MOV result.texcoord[0], vertex.texcoord; \n" + "END \n" +}; + +static char g_testFragmentProgram01 [] = +{ + "!!ARBfp1.0 \n" + "TEMP color; \n" + "MUL color, fragment.texcoord[0].y, 2.0; \n" + "ADD color, 1.0, -color; \n" + "ABS color, color; \n" + "ADD result.color, 1.0, -color; \n" + "MOV result.color.a, 1.0; \n" + "END \n" +}; + + +// generic attrib versions.. + +static char g_testVertexProgram01_GA [] = +{ + "!!ARBvp1.0 \n" + "TEMP vertexClip; \n" + "DP4 vertexClip.x, state.matrix.mvp.row[0], vertex.attrib[0]; \n" + "DP4 vertexClip.y, state.matrix.mvp.row[1], vertex.attrib[0]; \n" + "DP4 vertexClip.z, state.matrix.mvp.row[2], vertex.attrib[0]; \n" + "DP4 vertexClip.w, state.matrix.mvp.row[3], vertex.attrib[0]; \n" + "ADD vertexClip.y, vertexClip.x, vertexClip.y; \n" + "MOV result.position, vertexClip; \n" + "MOV result.color, vertex.attrib[3]; \n" + "MOV result.texcoord[0], vertex.attrib[8]; \n" + "END \n" +}; + +static char g_testFragmentProgram01_GA [] = +{ + "!!ARBfp1.0 \n" + "TEMP color; \n" + "TEX color, fragment.texcoord[0], texture[0], 2D;" + //"MUL color, fragment.texcoord[0].y, 2.0; \n" + //"ADD color, 1.0, -color; \n" + //"ABS color, color; \n" + //"ADD result.color, 1.0, -color; \n" + //"MOV result.color.a, 1.0; \n" + "MOV result.color, color; \n" + "END \n" +}; + + +void GLMTester::Test3( void ) +{ + /************************** + XXXXXXXXXXXXXXXXXXXXXX stale test code until we revise the program interface + + GLMContext *ctx = m_params.m_ctx; + ctx->MakeCurrent(); + + StdSetup(); // default test case drawing setup + + // make vertex&pixel shader + CGLMProgram *vprog = ctx->NewProgram( kGLMVertexProgram, g_testVertexProgram01_GA ); + ctx->BindProgramToCtx( kGLMVertexProgram, vprog ); + + CGLMProgram *fprog = ctx->NewProgram( kGLMFragmentProgram, g_testFragmentProgram01_GA ); + ctx->BindProgramToCtx( kGLMFragmentProgram, fprog ); + + // draw stuff (loop...) + for( int i=0; iDrawDebugText( posx, posy, 0.0f, charwidth, charheight, text ); + } + glFinish(); + CheckGLError("test3 finish"); + + Present( 3333 ); + } + + StdCleanup(); + *****************************/ +} + +#if GLMDEBUG +void GLMTriggerDebuggerBreak() +{ + // we call an obscure GL function which we know has been breakpointed in the OGLP function list + static signed short nada[] = { -1,-1,-1,-1 }; + gGL->glColor4sv( nada ); +} +#endif diff --git a/togles/linuxwin/glmgr_flush.inl b/togles/linuxwin/glmgr_flush.inl new file mode 100644 index 00000000..fcddd616 --- /dev/null +++ b/togles/linuxwin/glmgr_flush.inl @@ -0,0 +1,622 @@ +// BE VERY VERY CAREFUL what you do in these function. They are extremely hot, and calling the wrong GL API's in here will crush perf. (especially on NVidia threaded drivers). + +FORCEINLINE uint32 bitmix32(uint32 a) +{ + a -= (a<<6); + //a ^= (a>>17); + //a -= (a<<9); + a ^= (a<<4); + //a -= (a<<3); + //a ^= (a<<10); + a ^= (a>>15); + return a; +} + +#ifndef OSX + +FORCEINLINE GLuint GLMContext::FindSamplerObject( const GLMTexSamplingParams &desiredParams ) +{ + int h = bitmix32( desiredParams.m_bits + desiredParams.m_borderColor ) & ( cSamplerObjectHashSize - 1 ); + while ( ( m_samplerObjectHash[h].m_params.m_bits != desiredParams.m_bits ) || ( m_samplerObjectHash[h].m_params.m_borderColor != desiredParams.m_borderColor ) ) + { + if ( !m_samplerObjectHash[h].m_params.m_packed.m_isValid ) + break; + if ( ++h >= cSamplerObjectHashSize ) + h = 0; + } + + if ( !m_samplerObjectHash[h].m_params.m_packed.m_isValid ) + { + GLMTexSamplingParams &hashParams = m_samplerObjectHash[h].m_params; + hashParams = desiredParams; + hashParams.SetToSamplerObject( m_samplerObjectHash[h].m_samplerObject ); + if ( ++m_nSamplerObjectHashNumEntries == cSamplerObjectHashSize ) + { + // TODO: Support resizing + Error( "Sampler object hash is full, increase cSamplerObjectHashSize" ); + } + } + + return m_samplerObjectHash[h].m_samplerObject; +} + +#endif // !OSX + +// BE VERY CAREFUL WHAT YOU DO IN HERE. This is called on every batch, even seemingly simple changes can kill perf. +FORCEINLINE void GLMContext::FlushDrawStates( uint nStartIndex, uint nEndIndex, uint nBaseVertex ) // shadersOn = true for draw calls, false for clear calls +{ + Assert( m_drawingLang == kGLMGLSL ); // no support for ARB shaders right now (and NVidia reports that they aren't worth targeting under Windows/Linux for various reasons anyway) + Assert( ( m_drawingFBO == m_boundDrawFBO ) && ( m_drawingFBO == m_boundReadFBO ) ); // this check MUST succeed + Assert( m_pDevice->m_pVertDecl ); + +#if GLMDEBUG + GLM_FUNC; +#endif + + GL_BATCH_PERF( m_FlushStats.m_nTotalBatchFlushes++; ) + +#if GLMDEBUG + bool tex0_srgb = (m_boundDrawFBO[0].m_attach[0].m_tex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0; + + // you can only actually use the sRGB FB state on some systems.. check caps + if (m_caps.m_hasGammaWrites) + { + GLBlendEnableSRGB_t writeSRGBState; + m_BlendEnableSRGB.Read( &writeSRGBState, 0 ); // the client set value, not the API-written value yet.. + bool draw_srgb = writeSRGBState.enable != 0; + + if (draw_srgb) + { + if (tex0_srgb) + { + // good - draw mode and color tex agree + } + else + { + // bad + + // Client has asked to write sRGB into a texture that can't do it. + // there is no way to satisfy this unless we change the RT tex and we avoid doing that. + // (although we might consider a ** ONE TIME ** promotion. + // this shouldn't be a big deal if the tex format is one where it doesn't matter like 32F. + + GLMPRINTF(("-Z- srgb-enabled FBO conflict: attached tex %08x [%s] is not SRGB", m_boundDrawFBO[0].m_attach[0].m_tex, m_boundDrawFBO[0].m_attach[0].m_tex->m_layout->m_layoutSummary )); + + // do we shoot down the srgb-write state for this batch? + // I think the runtime will just ignore it. + } + } + else + { + if (tex0_srgb) + { + // odd - client is not writing sRGB into a texture which *can* do it. + //GLMPRINTF(( "-Z- srgb-disabled FBO conflict: attached tex %08x [%s] is SRGB", m_boundFBO[0].m_attach[0].m_tex, m_boundFBO[0].m_attach[0].m_tex->m_layout->m_layoutSummary )); + //writeSRGBState.enable = true; + //m_BlendEnableSRGB.Write( &writeSRGBState ); + } + else + { + // good - draw mode and color tex agree + } + } + } +#endif + + Assert( m_drawingProgram[ kGLMVertexProgram ] ); + Assert( m_drawingProgram[ kGLMFragmentProgram ] ); + + Assert( ( m_drawingProgram[kGLMVertexProgram]->m_type == kGLMVertexProgram ) && ( m_drawingProgram[kGLMFragmentProgram]->m_type == kGLMFragmentProgram ) ); + Assert( m_drawingProgram[ kGLMVertexProgram ]->m_bTranslatedProgram && m_drawingProgram[ kGLMFragmentProgram ]->m_bTranslatedProgram ); + +#if GLMDEBUG + // Depth compare mode check + uint nCurMask = 1, nShaderSamplerMask = m_drawingProgram[kGLMFragmentProgram]->m_samplerMask; + for ( int nSamplerIndex = 0; nSamplerIndex < GLM_SAMPLER_COUNT; ++nSamplerIndex, nCurMask <<= 1 ) + { + if ( !m_samplers[nSamplerIndex].m_pBoundTex ) + continue; + + if ( m_samplers[nSamplerIndex].m_pBoundTex->m_layout->m_mipCount == 1 ) + { + if ( m_samplers[nSamplerIndex].m_samp.m_packed.m_mipFilter == D3DTEXF_LINEAR ) + { + GLMDebugPrintf( "Sampler %u has mipmap filtering enabled on a texture without mipmaps! (texture name: %s, pixel shader: %s)!\n", + nSamplerIndex, + m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel ? m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel : "?", + m_drawingProgram[kGLMFragmentProgram]->m_shaderName ); + } + } + + if ( ( nShaderSamplerMask & nCurMask ) == 0 ) + continue; + + if ( m_samplers[nSamplerIndex].m_pBoundTex->m_layout->m_mipCount == 1 ) + { + if ( m_samplers[nSamplerIndex].m_samp.m_packed.m_mipFilter == D3DTEXF_LINEAR ) + { + // Note this is not always an error - shadow buffer debug visualization shaders purposely want to read shadow depths (and not do the comparison) + GLMDebugPrintf( "Sampler %u has mipmap filtering enabled on a texture without mipmaps! (texture name: %s, pixel shader: %s)!\n", + nSamplerIndex, + m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel ? m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel : "?", + m_drawingProgram[kGLMFragmentProgram]->m_shaderName ); + } + } + + bool bSamplerIsDepth = ( m_samplers[nSamplerIndex].m_pBoundTex->m_layout->m_key.m_texFlags & kGLMTexIsDepth ) != 0; + bool bSamplerShadow = m_samplers[nSamplerIndex].m_samp.m_packed.m_compareMode != 0; + + bool bShaderShadow = ( m_drawingProgram[kGLMFragmentProgram]->m_nShadowDepthSamplerMask & nCurMask ) != 0; + + if ( bShaderShadow ) + { + // Shader expects shadow depth sampling at this sampler index + // Must have a depth texture and compare mode must be enabled + if ( !bSamplerIsDepth || !bSamplerShadow ) + { + // FIXME: This occasionally occurs in L4D2 when CShaderAPIDx8::ExecuteCommandBuffer() sets the TEXTURE_WHITE texture in the flashlight depth texture slot. + GLMDebugPrintf( "Sampler %u's compare mode (%u) or format (depth=%u) is not consistent with pixel shader's compare mode (%u) (texture name: %s, pixel shader: %s)!\n", + nSamplerIndex, bSamplerShadow, bSamplerIsDepth, bShaderShadow, + m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel ? m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel : "?", + m_drawingProgram[kGLMFragmentProgram]->m_shaderName ); + } + } + else + { + // Shader does not expect shadow depth sampling as this sampler index + // We don't care if comparemode is enabled, but we can't have a depth texture in this sampler + if ( bSamplerIsDepth ) + { + GLMDebugPrintf( "Sampler %u is a depth texture but the pixel shader's shadow depth sampler mask does not expect depth here (texture name: %s, pixel shader: %s)!\n", + nSamplerIndex, + m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel ? m_samplers[nSamplerIndex].m_pBoundTex->m_debugLabel : "?", + m_drawingProgram[kGLMFragmentProgram]->m_shaderName ); + } + } + } +#endif + + if ( m_bDirtyPrograms ) + { + m_bDirtyPrograms = false; + + CGLMShaderPair *pNewPair = m_pairCache->SelectShaderPair( m_drawingProgram[ kGLMVertexProgram ], m_drawingProgram[ kGLMFragmentProgram ], 0 ); + + if ( pNewPair != m_pBoundPair ) + { +#if GL_BATCH_TELEMETRY_ZONES + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "NewProgram" ); +#endif + + if ( !pNewPair->m_valid ) + { + if ( !pNewPair->ValidateProgramPair() ) + { + goto flush_error_exit; + } + } + + gGL->glUseProgram( (GLuint)pNewPair->m_program ); + + GL_BATCH_PERF( m_FlushStats.m_nTotalProgramPairChanges++; ) + + if ( !m_pBoundPair ) + { + GL_BATCH_PERF( m_FlushStats.m_nNewPS++; ) + GL_BATCH_PERF( m_FlushStats.m_nNewVS++; ) + } + else + { + GL_BATCH_PERF( if ( pNewPair->m_fragmentProg != m_pBoundPair->m_fragmentProg ) m_FlushStats.m_nNewPS++; ) + GL_BATCH_PERF( if ( pNewPair->m_vertexProg != m_pBoundPair->m_vertexProg ) m_FlushStats.m_nNewVS++; ) + } + +#if GL_BATCH_PERF_ANALYSIS + tmMessage( TELEMETRY_LEVEL2, TMMF_ICON_NOTE, "V:%s (V Regs:%u V Bone Regs:%u) F:%s (F Regs:%u)", + m_drawingProgram[ kGLMVertexProgram ]->m_shaderName, + m_drawingProgram[ kGLMVertexProgram ]->m_descs[kGLMGLSL].m_highWater, + m_drawingProgram[ kGLMVertexProgram ]->m_descs[kGLMGLSL].m_VSHighWaterBone, + m_drawingProgram[ kGLMFragmentProgram ]->m_shaderName, + m_drawingProgram[ kGLMFragmentProgram ]->m_descs[kGLMGLSL].m_highWater ); +#endif + + m_pBoundPair = pNewPair; + + // set the dirty levels appropriately since the program changed and has never seen any of the current values. + m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone = 0; + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone = m_drawingProgram[ kGLMVertexProgram ]->m_descs[kGLMGLSL].m_highWater; + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterBone = m_drawingProgram[ kGLMVertexProgram ]->m_descs[kGLMGLSL].m_VSHighWaterBone; + + m_programParamsF[kGLMFragmentProgram].m_firstDirtySlotNonBone = 0; + m_programParamsF[kGLMFragmentProgram].m_dirtySlotHighWaterNonBone = m_drawingProgram[ kGLMFragmentProgram ]->m_descs[kGLMGLSL].m_highWater; + + // bool and int dirty levels get set to max, we don't have actual high water marks for them + // code which sends the values must clamp on these types. + m_programParamsB[kGLMVertexProgram].m_dirtySlotCount = kGLMProgramParamBoolLimit; + m_programParamsB[kGLMFragmentProgram].m_dirtySlotCount = kGLMProgramParamBoolLimit; + + m_programParamsI[kGLMVertexProgram].m_dirtySlotCount = kGLMProgramParamInt4Limit; + m_programParamsI[kGLMFragmentProgram].m_dirtySlotCount = 0; + + // check fragment buffers used (MRT) + if( pNewPair->m_fragmentProg->m_fragDataMask != m_fragDataMask ) + { + gGL->glDrawBuffers( pNewPair->m_fragmentProg->m_numDrawBuffers, pNewPair->m_fragmentProg->m_drawBuffers ); + m_fragDataMask = pNewPair->m_fragmentProg->m_fragDataMask; + } + } + } + + Assert( m_ViewportBox.GetData().width == (int)( m_ViewportBox.GetData().widthheight & 0xFFFF ) ); + Assert( m_ViewportBox.GetData().height == (int)( m_ViewportBox.GetData().widthheight >> 16 ) ); + + m_pBoundPair->UpdateScreenUniform( m_ViewportBox.GetData().widthheight ); + + GL_BATCH_PERF( m_FlushStats.m_nNumChangedSamplers += m_nNumDirtySamplers ); + +#if !defined( OSX ) // no support for sampler objects in OSX 10.6 (GL 2.1 profile) + if ( m_bUseSamplerObjects) + { + while ( m_nNumDirtySamplers ) + { + const uint nSamplerIndex = m_nDirtySamplers[--m_nNumDirtySamplers]; + Assert( ( nSamplerIndex < GLM_SAMPLER_COUNT ) && ( !m_nDirtySamplerFlags[nSamplerIndex]) ); + + m_nDirtySamplerFlags[nSamplerIndex] = 1; + + gGL->glBindSampler( nSamplerIndex, FindSamplerObject( m_samplers[nSamplerIndex].m_samp ) ); + + GL_BATCH_PERF( m_FlushStats.m_nNumSamplingParamsChanged++ ); + +#if defined( OSX ) // valid for OSX only if using GL 3.3 context + CGLMTex *pTex = m_samplers[nSamplerIndex].m_pBoundTex; + + if( pTex && !( gGL->m_bHave_GL_EXT_texture_sRGB_decode ) ) + { + // see if requested SRGB state differs from the known one + bool texSRGB = ( pTex->m_layout->m_key.m_texFlags & kGLMTexSRGB ) != 0; + bool glSampSRGB = m_samplers[nSamplerIndex].m_samp.m_packed.m_srgb; + + if ( texSRGB != glSampSRGB ) // mismatch + { + pTex->HandleSRGBMismatch( glSampSRGB, pTex->m_srgbFlipCount ); + } + } +#endif + } + } + else +#endif // if !defined( OSX ) + { + while ( m_nNumDirtySamplers ) + { + const uint nSamplerIndex = m_nDirtySamplers[--m_nNumDirtySamplers]; + Assert( ( nSamplerIndex < GLM_SAMPLER_COUNT ) && ( !m_nDirtySamplerFlags[nSamplerIndex]) ); + + m_nDirtySamplerFlags[nSamplerIndex] = 1; + + CGLMTex *pTex = m_samplers[nSamplerIndex].m_pBoundTex; + + if ( ( pTex ) && ( !( pTex->m_SamplingParams == m_samplers[nSamplerIndex].m_samp ) ) ) + { + SelectTMU( nSamplerIndex ); + + m_samplers[nSamplerIndex].m_samp.DeltaSetToTarget( pTex->m_texGLTarget, pTex->m_SamplingParams ); + + pTex->m_SamplingParams = m_samplers[nSamplerIndex].m_samp; + +#if defined( OSX ) + if( pTex && !( gGL->m_bHave_GL_EXT_texture_sRGB_decode ) ) + { + // see if requested SRGB state differs from the known one + bool texSRGB = ( pTex->m_layout->m_key.m_texFlags & kGLMTexSRGB ) != 0; + bool glSampSRGB = m_samplers[nSamplerIndex].m_samp.m_packed.m_srgb; + + if ( texSRGB != glSampSRGB ) // mismatch + { + pTex->HandleSRGBMismatch( glSampSRGB, pTex->m_srgbFlipCount ); + } + } +#endif + } + } + } + + // vertex stage -------------------------------------------------------------------- + if ( m_bUseBoneUniformBuffers ) + { + // vertex stage -------------------------------------------------------------------- + if ( m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone ) + { + int firstDirtySlot = m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone; + int dirtySlotHighWater = MIN( m_drawingProgram[kGLMVertexProgram]->m_descs[kGLMGLSL].m_highWater, m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone ); + + GLint vconstLoc = m_pBoundPair->m_locVertexParams; + if ( ( vconstLoc >= 0 ) && ( dirtySlotHighWater > firstDirtySlot ) ) + { +#if GL_BATCH_TELEMETRY_ZONES + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "VSNonBoneUniformUpdate %u %u", firstDirtySlot, dirtySlotHighWater ); +#endif + int numSlots = dirtySlotHighWater - DXABSTRACT_VS_FIRST_BONE_SLOT; + + // consts after the bones (c217 onwards), since we use the concatenated destination array vc[], upload these consts starting from vc[58] + if( numSlots > 0 ) + { + gGL->glUniform4fv( m_pBoundPair->m_UniformBufferParams[kGLMVertexProgram][DXABSTRACT_VS_FIRST_BONE_SLOT], numSlots, &m_programParamsF[kGLMVertexProgram].m_values[(DXABSTRACT_VS_LAST_BONE_SLOT+1)][0] ); + + dirtySlotHighWater = DXABSTRACT_VS_FIRST_BONE_SLOT; + + GL_BATCH_PERF( m_nTotalVSUniformCalls++; ) + GL_BATCH_PERF( m_nTotalVSUniformsSet += numSlots; ) + + GL_BATCH_PERF( m_FlushStats.m_nFirstVSConstant = DXABSTRACT_VS_FIRST_BONE_SLOT; ) + GL_BATCH_PERF( m_FlushStats.m_nNumVSConstants += numSlots; ) + } + + numSlots = dirtySlotHighWater - firstDirtySlot; + + // consts before the bones (c0-c57) + if( numSlots > 0 ) + { + gGL->glUniform4fv( m_pBoundPair->m_UniformBufferParams[kGLMVertexProgram][firstDirtySlot], dirtySlotHighWater - firstDirtySlot, &m_programParamsF[kGLMVertexProgram].m_values[firstDirtySlot][0] ); + + GL_BATCH_PERF( m_nTotalVSUniformCalls++; ) + GL_BATCH_PERF( m_nTotalVSUniformsSet += dirtySlotHighWater - firstDirtySlot; ) + + GL_BATCH_PERF( m_FlushStats.m_nFirstVSConstant = firstDirtySlot; ) + GL_BATCH_PERF( m_FlushStats.m_nNumVSConstants += (dirtySlotHighWater - firstDirtySlot); ) + } + } + + m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone = 256; + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone = 0; + } + + if ( m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterBone ) + { + const GLint vconstBoneLoc = m_pBoundPair->m_locVertexBoneParams; + if ( vconstBoneLoc >= 0 ) + { + int shaderSlotsBone = 0; + if ( ( m_drawingProgram[kGLMVertexProgram]->m_descs[kGLMGLSL].m_VSHighWaterBone > 0 ) && ( m_nMaxUsedVertexProgramConstantsHint > DXABSTRACT_VS_FIRST_BONE_SLOT ) ) + { + shaderSlotsBone = MIN( m_drawingProgram[kGLMVertexProgram]->m_descs[kGLMGLSL].m_VSHighWaterBone, m_nMaxUsedVertexProgramConstantsHint - DXABSTRACT_VS_FIRST_BONE_SLOT ); + } + + int dirtySlotHighWaterBone = MIN( shaderSlotsBone, m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterBone ); + if ( dirtySlotHighWaterBone ) + { + uint nNumBoneRegs = dirtySlotHighWaterBone; + +#if GL_BATCH_TELEMETRY_ZONES + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "VSBoneUniformUpdate %u", nNumBoneRegs ); +#endif + + gGL->glUniform4fv( vconstBoneLoc, nNumBoneRegs, &m_programParamsF[kGLMVertexProgram].m_values[DXABSTRACT_VS_FIRST_BONE_SLOT][0] ); + + GL_BATCH_PERF( m_nTotalVSUniformBoneCalls++; ) + GL_BATCH_PERF( m_nTotalVSUniformsBoneSet += nNumBoneRegs; ) + GL_BATCH_PERF( m_FlushStats.m_nNumVSBoneConstants += nNumBoneRegs; ) + } + + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterBone = 0; + } + } + + } + else + { + if ( m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone ) + { + const int nMaxUsedShaderSlots = m_drawingProgram[kGLMVertexProgram]->m_descs[kGLMGLSL].m_highWater; + + int firstDirtySlot = m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone; + int dirtySlotHighWater = MIN( nMaxUsedShaderSlots, m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone ); + + GLint vconstLoc = m_pBoundPair->m_locVertexParams; + if ( ( vconstLoc >= 0 ) && ( dirtySlotHighWater > firstDirtySlot ) ) + { + #if GL_BATCH_TELEMETRY_ZONES + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "VSNonBoneUniformUpdate %u %u", firstDirtySlot, dirtySlotHighWater ); + #endif + gGL->glUniform4fv( m_pBoundPair->m_UniformBufferParams[kGLMVertexProgram][firstDirtySlot], dirtySlotHighWater - firstDirtySlot, &m_programParamsF[kGLMVertexProgram].m_values[firstDirtySlot][0] ); + + GL_BATCH_PERF( m_nTotalVSUniformCalls++; ) + GL_BATCH_PERF( m_nTotalVSUniformsSet += dirtySlotHighWater - firstDirtySlot; ) + + GL_BATCH_PERF( m_FlushStats.m_nFirstVSConstant = firstDirtySlot; ) + GL_BATCH_PERF( m_FlushStats.m_nNumVSConstants += (dirtySlotHighWater - firstDirtySlot); ) + } + + m_programParamsF[kGLMVertexProgram].m_firstDirtySlotNonBone = 256; + m_programParamsF[kGLMVertexProgram].m_dirtySlotHighWaterNonBone = 0; + } + } + + + // see if VS uses i0, b0, b1, b2, b3. + // use a glUniform1i to set any one of these if active. skip all of them if no dirties reported. + // my kingdom for the UBO extension! + + // ------- bools ---------- // + if ( m_pBoundPair->m_bHasBoolOrIntUniforms ) + { + if ( m_programParamsB[kGLMVertexProgram].m_dirtySlotCount ) // optimize this later after the float param pushes are proven out + { + const uint nLimit = MIN( CGLMShaderPair::cMaxVertexShaderBoolUniforms, m_programParamsB[kGLMVertexProgram].m_dirtySlotCount ); + for ( uint i = 0; i < nLimit; ++i ) + { + GLint constBoolLoc = m_pBoundPair->m_locVertexBool[i]; + if ( constBoolLoc >= 0 ) + gGL->glUniform1i( constBoolLoc, m_programParamsB[kGLMVertexProgram].m_values[i] ); + } + + m_programParamsB[kGLMVertexProgram].m_dirtySlotCount = 0; + } + + if ( m_programParamsB[kGLMFragmentProgram].m_dirtySlotCount ) // optimize this later after the float param pushes are proven out + { + const uint nLimit = MIN( CGLMShaderPair::cMaxFragmentShaderBoolUniforms, m_programParamsB[kGLMFragmentProgram].m_dirtySlotCount ); + for ( uint i = 0; i < nLimit; ++i ) + { + GLint constBoolLoc = m_pBoundPair->m_locFragmentBool[i]; + if ( constBoolLoc >= 0 ) + gGL->glUniform1i( constBoolLoc, m_programParamsB[kGLMFragmentProgram].m_values[i] ); + } + + m_programParamsB[kGLMFragmentProgram].m_dirtySlotCount = 0; + } + + if ( m_programParamsI[kGLMVertexProgram].m_dirtySlotCount ) + { + GLint vconstInt0Loc = m_pBoundPair->m_locVertexInteger0; //glGetUniformLocationARB( prog, "i0"); + if ( vconstInt0Loc >= 0 ) + { + gGL->glUniform1i( vconstInt0Loc, m_programParamsI[kGLMVertexProgram].m_values[0][0] ); //FIXME magic number + } + m_programParamsI[kGLMVertexProgram].m_dirtySlotCount = 0; + } + } + + Assert( ( m_pDevice->m_streams[0].m_vtxBuffer && ( m_pDevice->m_streams[0].m_vtxBuffer->m_vtxBuffer == m_pDevice->m_vtx_buffers[0] ) ) || ( ( !m_pDevice->m_streams[0].m_vtxBuffer ) && ( m_pDevice->m_vtx_buffers[0] == m_pDevice->m_pDummy_vtx_buffer ) ) ); + Assert( ( m_pDevice->m_streams[1].m_vtxBuffer && ( m_pDevice->m_streams[1].m_vtxBuffer->m_vtxBuffer == m_pDevice->m_vtx_buffers[1] ) ) || ( ( !m_pDevice->m_streams[1].m_vtxBuffer ) && ( m_pDevice->m_vtx_buffers[1] == m_pDevice->m_pDummy_vtx_buffer ) ) ); + Assert( ( m_pDevice->m_streams[2].m_vtxBuffer && ( m_pDevice->m_streams[2].m_vtxBuffer->m_vtxBuffer == m_pDevice->m_vtx_buffers[2] ) ) || ( ( !m_pDevice->m_streams[2].m_vtxBuffer ) && ( m_pDevice->m_vtx_buffers[2] == m_pDevice->m_pDummy_vtx_buffer ) ) ); + Assert( ( m_pDevice->m_streams[3].m_vtxBuffer && ( m_pDevice->m_streams[3].m_vtxBuffer->m_vtxBuffer == m_pDevice->m_vtx_buffers[3] ) ) || ( ( !m_pDevice->m_streams[3].m_vtxBuffer ) && ( m_pDevice->m_vtx_buffers[3] == m_pDevice->m_pDummy_vtx_buffer ) ) ); + + uint nCurTotalBufferRevision; + nCurTotalBufferRevision = m_pDevice->m_vtx_buffers[0]->m_nRevision + m_pDevice->m_vtx_buffers[1]->m_nRevision + m_pDevice->m_vtx_buffers[2]->m_nRevision + m_pDevice->m_vtx_buffers[3]->m_nRevision; + + // If any of these inputs have changed, we need to enumerate through all of the expected GL vertex attribs and modify anything in the GL layer that have changed. + // This is not always a win, but it is a net win on NVidia (by 1-4.8% depending on whether driver threading is enabled). + if ( ( nCurTotalBufferRevision != m_CurAttribs.m_nTotalBufferRevision ) || + ( m_CurAttribs.m_pVertDecl != m_pDevice->m_pVertDecl ) || + ( m_CurAttribs.m_vtxAttribMap[0] != reinterpret_cast(m_pDevice->m_vertexShader->m_vtxAttribMap)[0] ) || + ( m_CurAttribs.m_vtxAttribMap[1] != reinterpret_cast(m_pDevice->m_vertexShader->m_vtxAttribMap)[1] ) || + ( memcmp( m_CurAttribs.m_streams, m_pDevice->m_streams, sizeof( m_pDevice->m_streams ) ) != 0 ) ) + { + // This branch is taken 52.2% of the time in the L4D2 test1 (long) timedemo. + +#if GL_BATCH_TELEMETRY_ZONES + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "SetVertexAttribs" ); +#endif + + m_CurAttribs.m_nTotalBufferRevision = nCurTotalBufferRevision; + m_CurAttribs.m_pVertDecl = m_pDevice->m_pVertDecl; + m_CurAttribs.m_vtxAttribMap[0] = reinterpret_cast(m_pDevice->m_vertexShader->m_vtxAttribMap)[0]; + m_CurAttribs.m_vtxAttribMap[1] = reinterpret_cast(m_pDevice->m_vertexShader->m_vtxAttribMap)[1]; + memcpy( m_CurAttribs.m_streams, m_pDevice->m_streams, sizeof( m_pDevice->m_streams ) ); + + unsigned char *pVertexShaderAttribMap = m_pDevice->m_vertexShader->m_vtxAttribMap; + const int nMaxVertexAttributesToCheck = m_drawingProgram[ kGLMVertexProgram ]->m_maxVertexAttrs; + + IDirect3DVertexDeclaration9 *pVertDecl = m_pDevice->m_pVertDecl; + const uint8 *pVertexAttribDescToStreamIndex = pVertDecl->m_VertexAttribDescToStreamIndex; + + for( int nMask = 1, nIndex = 0; nIndex < nMaxVertexAttributesToCheck; ++nIndex, nMask <<= 1 ) + { + uint8 vertexShaderAttrib = pVertexShaderAttribMap[ nIndex ]; + + uint nDeclIndex = pVertexAttribDescToStreamIndex[vertexShaderAttrib]; + if ( nDeclIndex == 0xFF ) + { + // Not good - the vertex shader has an attribute which can't be located in the decl! + // The D3D9 debug runtime is also going to complain. + Assert( 0 ); + + if ( m_lastKnownVertexAttribMask & nMask ) + { + m_lastKnownVertexAttribMask &= ~nMask; + gGL->glDisableVertexAttribArray( nIndex ); + } + continue; + } + + D3DVERTEXELEMENT9_GL *pDeclElem = &pVertDecl->m_elements[nDeclIndex]; + + Assert( ( ( vertexShaderAttrib >> 4 ) == pDeclElem->m_dxdecl.Usage ) && ( ( vertexShaderAttrib & 0x0F ) == pDeclElem->m_dxdecl.UsageIndex) ); + + const uint nStreamIndex = pDeclElem->m_dxdecl.Stream; + const D3DStreamDesc *pStream = &m_pDevice->m_streams[ nStreamIndex ]; + + CGLMBuffer *pBuf = m_pDevice->m_vtx_buffers[ nStreamIndex ]; + if ( pBuf == m_pDevice->m_pDummy_vtx_buffer ) + { + Assert( pStream->m_vtxBuffer == NULL ); + + // this shader doesn't use that pair. + if ( m_lastKnownVertexAttribMask & nMask ) + { + m_lastKnownVertexAttribMask &= ~nMask; + gGL->glDisableVertexAttribArray( nIndex ); + } + continue; + } + Assert( pStream->m_vtxBuffer->m_vtxBuffer == pBuf ); + + int nBufOffset = pDeclElem->m_gldecl.m_offset + pStream->m_offset; + Assert( nBufOffset >= 0 ); + Assert( nBufOffset < (int)pBuf->m_nSize ); + if ( pBuf->m_bUsingPersistentBuffer ) + { + nBufOffset += pBuf->m_nPersistentBufferStartOffset; + } + + SetBufAndVertexAttribPointer( nIndex, pBuf->GetHandle(), + pStream->m_stride, pDeclElem->m_gldecl.m_datatype, pDeclElem->m_gldecl.m_normalized, pDeclElem->m_gldecl.m_nCompCount, + reinterpret_cast< const GLvoid * >( reinterpret_cast< int >( pBuf->m_pPseudoBuf ) + nBufOffset ), + pBuf->m_nRevision ); + + if ( !( m_lastKnownVertexAttribMask & nMask ) ) + { + m_lastKnownVertexAttribMask |= nMask; + gGL->glEnableVertexAttribArray( nIndex ); + } + } + + for( int nIndex = nMaxVertexAttributesToCheck; nIndex < m_nNumSetVertexAttributes; nIndex++ ) + { + gGL->glDisableVertexAttribArray( nIndex ); + m_lastKnownVertexAttribMask &= ~(1 << nIndex); + } + + m_nNumSetVertexAttributes = nMaxVertexAttributesToCheck; + } + + // fragment stage -------------------------------------------------------------------- + if ( m_programParamsF[kGLMFragmentProgram].m_dirtySlotHighWaterNonBone ) + { + GLint fconstLoc; + fconstLoc = m_pBoundPair->m_locFragmentParams; + if ( fconstLoc >= 0 ) + { + const int nMaxUsedShaderSlots = m_drawingProgram[kGLMFragmentProgram]->m_descs[kGLMGLSL].m_highWater; + + int firstDirtySlot = m_programParamsF[kGLMFragmentProgram].m_firstDirtySlotNonBone; + int dirtySlotHighWater = MIN( nMaxUsedShaderSlots, m_programParamsF[kGLMFragmentProgram].m_dirtySlotHighWaterNonBone ); + + if ( dirtySlotHighWater > firstDirtySlot ) + { +#if GL_BATCH_TELEMETRY_ZONES + tmZone( TELEMETRY_LEVEL2, TMZF_NONE, "PSUniformUpdate %u %u", firstDirtySlot, dirtySlotHighWater ); +#endif + + gGL->glUniform4fv( m_pBoundPair->m_UniformBufferParams[kGLMFragmentProgram][firstDirtySlot], dirtySlotHighWater - firstDirtySlot, &m_programParamsF[kGLMFragmentProgram].m_values[firstDirtySlot][0] ); + + GL_BATCH_PERF( m_nTotalPSUniformCalls++; ) + GL_BATCH_PERF( m_nTotalPSUniformsSet += dirtySlotHighWater - firstDirtySlot; ) + + GL_BATCH_PERF( m_FlushStats.m_nFirstPSConstant = firstDirtySlot; ) + GL_BATCH_PERF( m_FlushStats.m_nNumPSConstants += (dirtySlotHighWater - firstDirtySlot); ) + } + m_programParamsF[kGLMFragmentProgram].m_firstDirtySlotNonBone = 256; + m_programParamsF[kGLMFragmentProgram].m_dirtySlotHighWaterNonBone = 0; + } + } + + return; + +flush_error_exit: + m_pBoundPair = NULL; + m_bDirtyPrograms = true; + return; +} diff --git a/togles/linuxwin/glmgrbasics.cpp b/togles/linuxwin/glmgrbasics.cpp new file mode 100644 index 00000000..adf60714 --- /dev/null +++ b/togles/linuxwin/glmgrbasics.cpp @@ -0,0 +1,4688 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// glmgrbasics.cpp +// +//=============================================================================== + +#include "togl/rendermechanism.h" + +#include "tier0/icommandline.h" +#include "tier1/utlhash.h" +#include "tier1/utlmap.h" +#include "tier0/vprof.h" + +#ifdef OSX +#include +#ifdef CGLPROFILER_ENABLE +#include +#endif +#endif + +#include "tier0/valve_minmax_off.h" +#include + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + +//=============================================================================== +// decoding tables for debug + +typedef struct +{ + unsigned long value; + const char *name; +} GLMValueEntry_t; + +#define TERMVALUE 0x31415926 + // terminator for value tables + +#define VE( x ) { x, #x } + // "value entry" + +const GLMValueEntry_t g_d3d_devtypes[] = +{ + VE( D3DDEVTYPE_HAL ), + VE( D3DDEVTYPE_REF ), + + VE( TERMVALUE ) +}; + +const GLMValueEntry_t g_d3d_formats[] = +{ + VE( D3DFMT_INDEX16 ), + VE( D3DFMT_D16 ), + VE( D3DFMT_D24S8 ), + VE( D3DFMT_A8R8G8B8 ), + VE( D3DFMT_A4R4G4B4 ), + VE( D3DFMT_X8R8G8B8 ), + VE( D3DFMT_R5G6R5 ), + VE( D3DFMT_X1R5G5B5 ), + VE( D3DFMT_A1R5G5B5 ), + VE( D3DFMT_L8 ), + VE( D3DFMT_A8L8 ), + VE( D3DFMT_A ), + VE( D3DFMT_DXT1 ), + VE( D3DFMT_DXT3 ), + VE( D3DFMT_DXT5 ), + VE( D3DFMT_V8U8 ), + VE( D3DFMT_Q8W8V8U8 ), + VE( D3DFMT_X8L8V8U8 ), + VE( D3DFMT_A16B16G16R16F ), + VE( D3DFMT_A16B16G16R16 ), + VE( D3DFMT_R32F ), + VE( D3DFMT_A32B32G32R32F ), + VE( D3DFMT_R8G8B8 ), + VE( D3DFMT_D24X4S4 ), + VE( D3DFMT_A8 ), + VE( D3DFMT_R5G6B5 ), + VE( D3DFMT_D15S1 ), + VE( D3DFMT_D24X8 ), + VE( D3DFMT_VERTEXDATA ), + VE( D3DFMT_INDEX32 ), + + // vendor specific formats (fourcc's) + VE( D3DFMT_NV_INTZ ), + VE( D3DFMT_NV_RAWZ ), + VE( D3DFMT_NV_NULL ), + VE( D3DFMT_ATI_D16 ), + VE( D3DFMT_ATI_D24S8 ), + VE( D3DFMT_ATI_2N ), + VE( D3DFMT_ATI_1N ), + + VE( D3DFMT_UNKNOWN ), + + VE( TERMVALUE ) +}; + +const GLMValueEntry_t g_d3d_rtypes[] = +{ + VE( D3DRTYPE_SURFACE ), + VE( D3DRTYPE_TEXTURE ), + VE( D3DRTYPE_VOLUMETEXTURE ), + VE( D3DRTYPE_CUBETEXTURE ), + VE( D3DRTYPE_VERTEXBUFFER ), + VE( D3DRTYPE_INDEXBUFFER ), + + VE( TERMVALUE ) +}; + +const GLMValueEntry_t g_d3d_usages[] = +{ + VE( D3DUSAGE_RENDERTARGET ), + VE( D3DUSAGE_DEPTHSTENCIL ), + VE( D3DUSAGE_DYNAMIC ), + VE( D3DUSAGE_AUTOGENMIPMAP ), + //VE( D3DUSAGE_DMAP ), + //VE( D3DUSAGE_QUERY_LEGACYBUMPMAP ), + VE( D3DUSAGE_QUERY_SRGBREAD ), + VE( D3DUSAGE_QUERY_FILTER ), + VE( D3DUSAGE_QUERY_SRGBWRITE ), + VE( D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING ), + VE( D3DUSAGE_QUERY_VERTEXTEXTURE ), + //VE( D3DUSAGE_QUERY_WRAPANDMIP ), + VE( D3DUSAGE_WRITEONLY ), + VE( D3DUSAGE_SOFTWAREPROCESSING ), + VE( D3DUSAGE_DONOTCLIP ), + VE( D3DUSAGE_POINTS ), + VE( D3DUSAGE_RTPATCHES ), + VE( D3DUSAGE_NPATCHES ), + + VE( TERMVALUE ) +}; + +const GLMValueEntry_t g_d3d_rstates[] = +{ + VE( D3DRS_ZENABLE ), + VE( D3DRS_FILLMODE ), + VE( D3DRS_SHADEMODE ), + VE( D3DRS_ZWRITEENABLE ), + VE( D3DRS_ALPHATESTENABLE ), + VE( D3DRS_LASTPIXEL ), + VE( D3DRS_SRCBLEND ), + VE( D3DRS_DESTBLEND ), + VE( D3DRS_CULLMODE ), + VE( D3DRS_ZFUNC ), + VE( D3DRS_ALPHAREF ), + VE( D3DRS_ALPHAFUNC ), + VE( D3DRS_DITHERENABLE ), + VE( D3DRS_ALPHABLENDENABLE ), + VE( D3DRS_FOGENABLE ), + VE( D3DRS_SPECULARENABLE ), + VE( D3DRS_FOGCOLOR ), + VE( D3DRS_FOGTABLEMODE ), + VE( D3DRS_FOGSTART ), + VE( D3DRS_FOGEND ), + VE( D3DRS_FOGDENSITY ), + VE( D3DRS_RANGEFOGENABLE ), + VE( D3DRS_STENCILENABLE ), + VE( D3DRS_STENCILFAIL ), + VE( D3DRS_STENCILZFAIL ), + VE( D3DRS_STENCILPASS ), + VE( D3DRS_STENCILFUNC ), + VE( D3DRS_STENCILREF ), + VE( D3DRS_STENCILMASK ), + VE( D3DRS_STENCILWRITEMASK ), + VE( D3DRS_TEXTUREFACTOR ), + VE( D3DRS_WRAP0 ), + VE( D3DRS_WRAP1 ), + VE( D3DRS_WRAP2 ), + VE( D3DRS_WRAP3 ), + VE( D3DRS_WRAP4 ), + VE( D3DRS_WRAP5 ), + VE( D3DRS_WRAP6 ), + VE( D3DRS_WRAP7 ), + VE( D3DRS_CLIPPING ), + VE( D3DRS_LIGHTING ), + VE( D3DRS_AMBIENT ), + VE( D3DRS_FOGVERTEXMODE ), + VE( D3DRS_COLORVERTEX ), + VE( D3DRS_LOCALVIEWER ), + VE( D3DRS_NORMALIZENORMALS ), + VE( D3DRS_DIFFUSEMATERIALSOURCE ), + VE( D3DRS_SPECULARMATERIALSOURCE ), + VE( D3DRS_AMBIENTMATERIALSOURCE ), + VE( D3DRS_EMISSIVEMATERIALSOURCE ), + VE( D3DRS_VERTEXBLEND ), + VE( D3DRS_CLIPPLANEENABLE ), + VE( D3DRS_POINTSIZE ), + VE( D3DRS_POINTSIZE_MIN ), + VE( D3DRS_POINTSPRITEENABLE ), + VE( D3DRS_POINTSCALEENABLE ), + VE( D3DRS_POINTSCALE_A ), + VE( D3DRS_POINTSCALE_B ), + VE( D3DRS_POINTSCALE_C ), + VE( D3DRS_MULTISAMPLEANTIALIAS ), + VE( D3DRS_MULTISAMPLEMASK ), + VE( D3DRS_PATCHEDGESTYLE ), + VE( D3DRS_DEBUGMONITORTOKEN ), + VE( D3DRS_POINTSIZE_MAX ), + VE( D3DRS_INDEXEDVERTEXBLENDENABLE ), + VE( D3DRS_COLORWRITEENABLE ), + VE( D3DRS_TWEENFACTOR ), + VE( D3DRS_BLENDOP ), + VE( D3DRS_POSITIONDEGREE ), + VE( D3DRS_NORMALDEGREE ), + VE( D3DRS_SCISSORTESTENABLE ), + VE( D3DRS_SLOPESCALEDEPTHBIAS ), + VE( D3DRS_ANTIALIASEDLINEENABLE ), + VE( D3DRS_MINTESSELLATIONLEVEL ), + VE( D3DRS_MAXTESSELLATIONLEVEL ), + VE( D3DRS_ADAPTIVETESS_X ), + VE( D3DRS_ADAPTIVETESS_Y ), + VE( D3DRS_ADAPTIVETESS_Z ), + VE( D3DRS_ADAPTIVETESS_W ), + VE( D3DRS_ENABLEADAPTIVETESSELLATION ), + VE( D3DRS_TWOSIDEDSTENCILMODE ), + VE( D3DRS_CCW_STENCILFAIL ), + VE( D3DRS_CCW_STENCILZFAIL ), + VE( D3DRS_CCW_STENCILPASS ), + VE( D3DRS_CCW_STENCILFUNC ), + VE( D3DRS_COLORWRITEENABLE1 ), + VE( D3DRS_COLORWRITEENABLE2 ), + VE( D3DRS_COLORWRITEENABLE3 ), + VE( D3DRS_BLENDFACTOR ), + VE( D3DRS_SRGBWRITEENABLE ), + VE( D3DRS_DEPTHBIAS ), + VE( D3DRS_WRAP8 ), + VE( D3DRS_WRAP9 ), + VE( D3DRS_WRAP10 ), + VE( D3DRS_WRAP11 ), + VE( D3DRS_WRAP12 ), + VE( D3DRS_WRAP13 ), + VE( D3DRS_WRAP14 ), + VE( D3DRS_WRAP15 ), + VE( D3DRS_SEPARATEALPHABLENDENABLE ), + VE( D3DRS_SRCBLENDALPHA ), + VE( D3DRS_DESTBLENDALPHA ), + VE( D3DRS_BLENDOPALPHA ), + + VE( TERMVALUE ) +}; + +const GLMValueEntry_t g_d3d_opcodes[] = +{ + VE( D3DSIO_NOP ), + VE( D3DSIO_PHASE ), + VE( D3DSIO_RET ), + VE( D3DSIO_ELSE ), + VE( D3DSIO_ENDIF ), + VE( D3DSIO_ENDLOOP ), + VE( D3DSIO_ENDREP ), + VE( D3DSIO_BREAK ), + VE( D3DSIO_TEXDEPTH ), + VE( D3DSIO_TEXKILL ), + VE( D3DSIO_BEM ), + VE( D3DSIO_TEXBEM ), + VE( D3DSIO_TEXBEML ), + VE( D3DSIO_TEXDP3 ), + VE( D3DSIO_TEXDP3TEX ), + VE( D3DSIO_TEXM3x2DEPTH ), + VE( D3DSIO_TEXM3x2TEX ), + VE( D3DSIO_TEXM3x3 ), + VE( D3DSIO_TEXM3x3PAD ), + VE( D3DSIO_TEXM3x3TEX ), + VE( D3DSIO_TEXM3x3VSPEC ), + VE( D3DSIO_TEXREG2AR ), + VE( D3DSIO_TEXREG2GB ), + VE( D3DSIO_TEXREG2RGB ), + VE( D3DSIO_LABEL ), + VE( D3DSIO_CALL ), + VE( D3DSIO_IF ), + VE( D3DSIO_LOOP ), + VE( D3DSIO_REP ), + VE( D3DSIO_BREAKP ), + VE( D3DSIO_DSX ), + VE( D3DSIO_DSY ), + VE( D3DSIO_NRM ), + VE( D3DSIO_MOVA ), + VE( D3DSIO_MOV ), + VE( D3DSIO_RCP ), + VE( D3DSIO_RSQ ), + VE( D3DSIO_EXP ), + VE( D3DSIO_EXPP ), + VE( D3DSIO_LOG ), + VE( D3DSIO_LOGP ), + VE( D3DSIO_FRC ), + VE( D3DSIO_LIT ), + VE( D3DSIO_ABS ), + VE( D3DSIO_TEXM3x3SPEC ), + VE( D3DSIO_M4x4 ), + VE( D3DSIO_M4x3 ), + VE( D3DSIO_M3x4 ), + VE( D3DSIO_M3x3 ), + VE( D3DSIO_M3x2 ), + VE( D3DSIO_CALLNZ ), + VE( D3DSIO_IFC ), + VE( D3DSIO_BREAKC ), + VE( D3DSIO_SETP ), + VE( D3DSIO_TEXLDL ), + VE( D3DSIO_ADD ), + VE( D3DSIO_SUB ), + VE( D3DSIO_MUL ), + VE( D3DSIO_DP3 ), + VE( D3DSIO_DP4 ), + VE( D3DSIO_MIN ), + VE( D3DSIO_MAX ), + VE( D3DSIO_DST ), + VE( D3DSIO_SLT ), + VE( D3DSIO_SGE ), + VE( D3DSIO_CRS ), + VE( D3DSIO_POW ), + VE( D3DSIO_DP2ADD ), + VE( D3DSIO_LRP ), + VE( D3DSIO_SGN ), + VE( D3DSIO_CND ), + VE( D3DSIO_CMP ), + VE( D3DSIO_SINCOS ), + VE( D3DSIO_MAD ), + VE( D3DSIO_TEXLDD ), + VE( D3DSIO_TEXCOORD ), + VE( D3DSIO_TEX ), + VE( D3DSIO_DCL ), + VE( D3DSTT_UNKNOWN ), + VE( D3DSTT_2D ), + VE( D3DSTT_CUBE ), + VE( D3DSTT_VOLUME ), + VE( D3DSIO_DEFB ), + VE( D3DSIO_DEFI ), + VE( D3DSIO_DEF ), + VE( D3DSIO_COMMENT ), + VE( D3DSIO_END ), +}; + + +const GLMValueEntry_t g_d3d_vtxdeclusages[] = +{ + { D3DDECLUSAGE_POSITION ,"POSN" }, // P + { D3DDECLUSAGE_BLENDWEIGHT ,"BLWT" }, // W + { D3DDECLUSAGE_BLENDINDICES ,"BLIX" }, // I + { D3DDECLUSAGE_NORMAL ,"NORM" }, // N + { D3DDECLUSAGE_PSIZE ,"PSIZ" }, // S + { D3DDECLUSAGE_TEXCOORD ,"TEXC" }, // T + { D3DDECLUSAGE_TANGENT ,"TANG" }, // G + { D3DDECLUSAGE_BINORMAL ,"BINO" }, // B + { D3DDECLUSAGE_TESSFACTOR ,"TESS" }, // S + { D3DDECLUSAGE_PLUGH ,"????" }, // ? + { D3DDECLUSAGE_COLOR ,"COLR" }, // C + { D3DDECLUSAGE_FOG ,"FOG " }, // F + { D3DDECLUSAGE_DEPTH ,"DEPT" }, // D + { D3DDECLUSAGE_SAMPLE ,"SAMP" } // M +}; + +const GLMValueEntry_t g_d3d_vtxdeclusages_short[] = +{ + { D3DDECLUSAGE_POSITION ,"P" }, + { D3DDECLUSAGE_BLENDWEIGHT ,"W" }, + { D3DDECLUSAGE_BLENDINDICES ,"I" }, + { D3DDECLUSAGE_NORMAL ,"N" }, + { D3DDECLUSAGE_PSIZE ,"S" }, + { D3DDECLUSAGE_TEXCOORD ,"T" }, + { D3DDECLUSAGE_TANGENT ,"G" }, + { D3DDECLUSAGE_BINORMAL ,"B" }, + { D3DDECLUSAGE_TESSFACTOR ,"S" }, + { D3DDECLUSAGE_PLUGH ,"?" }, + { D3DDECLUSAGE_COLOR ,"C" }, + { D3DDECLUSAGE_FOG ,"F" }, + { D3DDECLUSAGE_DEPTH ,"D" }, + { D3DDECLUSAGE_SAMPLE ,"M" } +}; + +const GLMValueEntry_t g_cgl_rendids[] = // need to mask with 0xFFFFFF00 to match on these (ex: 8800GT == 0x00022608 +{ +#ifdef OSX + VE( kCGLRendererGenericID ), + VE( kCGLRendererGenericFloatID ), + VE( kCGLRendererAppleSWID ), + VE( kCGLRendererATIRage128ID ), + VE( kCGLRendererATIRadeonID ), + VE( kCGLRendererATIRageProID ), + VE( kCGLRendererATIRadeon8500ID ), + VE( kCGLRendererATIRadeon9700ID ), + VE( kCGLRendererATIRadeonX1000ID ), + VE( kCGLRendererATIRadeonX2000ID ), + VE( kCGLRendererGeForce2MXID ), + VE( kCGLRendererGeForce3ID ), + VE( kCGLRendererGeForceFXID ), // also for GF6 and GF7 + VE( kCGLRendererGeForce8xxxID ), + VE( kCGLRendererVTBladeXP2ID ), + VE( kCGLRendererIntel900ID ), + VE( kCGLRendererMesa3DFXID ), +#endif + VE( TERMVALUE ) +}; + +const GLMValueEntry_t g_gl_errors[] = +{ + VE( GL_INVALID_ENUM ), + VE( GL_INVALID_VALUE ), + VE( GL_INVALID_OPERATION ), + VE( GL_STACK_OVERFLOW ), + VE( GL_STACK_UNDERFLOW ), + VE( GL_OUT_OF_MEMORY ), + VE( GL_INVALID_FRAMEBUFFER_OPERATION_EXT ), + VE( GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT ), + VE( GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT ), + VE( GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT ), + VE( GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT ), + VE( GL_FRAMEBUFFER_UNSUPPORTED_EXT ), + VE( GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT ), + VE( GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT ) +}; + +// there are some ARB/EXT dupes in this table but that doesn't matter too much +const GLMValueEntry_t g_gl_enums[] = +{ + { 0x0000, "GL_ZERO" }, + { 0x0001, "GL_ONE" }, + { 0x0004, "GL_TRIANGLES" }, + { 0x0005, "GL_TRIANGLE_STRIP" }, + { 0x0006, "GL_TRIANGLE_FAN" }, + { 0x0007, "GL_QUADS" }, + { 0x0008, "GL_QUAD_STRIP" }, + { 0x0009, "GL_POLYGON" }, + { 0x0200, "GL_NEVER" }, + { 0x0201, "GL_LESS" }, + { 0x0202, "GL_EQUAL" }, + { 0x0203, "GL_LEQUAL" }, + { 0x0204, "GL_GREATER" }, + { 0x0205, "GL_NOTEQUAL" }, + { 0x0206, "GL_GEQUAL" }, + { 0x0207, "GL_ALWAYS" }, + { 0x0300, "GL_SRC_COLOR" }, + { 0x0301, "GL_ONE_MINUS_SRC_COLOR" }, + { 0x0302, "GL_SRC_ALPHA" }, + { 0x0303, "GL_ONE_MINUS_SRC_ALPHA" }, + { 0x0304, "GL_DST_ALPHA" }, + { 0x0305, "GL_ONE_MINUS_DST_ALPHA" }, + { 0x0306, "GL_DST_COLOR" }, + { 0x0307, "GL_ONE_MINUS_DST_COLOR" }, + { 0x0308, "GL_SRC_ALPHA_SATURATE" }, + { 0x0400, "GL_FRONT_LEFT" }, + { 0x0401, "GL_FRONT_RIGHT" }, + { 0x0402, "GL_BACK_LEFT" }, + { 0x0403, "GL_BACK_RIGHT" }, + { 0x0404, "GL_FRONT" }, + { 0x0405, "GL_BACK" }, + { 0x0406, "GL_LEFT" }, + { 0x0407, "GL_RIGHT" }, + { 0x0408, "GL_FRONT_AND_BACK" }, + { 0x0409, "GL_AUX0" }, + { 0x040A, "GL_AUX1" }, + { 0x040B, "GL_AUX2" }, + { 0x040C, "GL_AUX3" }, + { 0x0500, "GL_INVALID_ENUM" }, + { 0x0501, "GL_INVALID_VALUE" }, + { 0x0502, "GL_INVALID_OPERATION" }, + { 0x0503, "GL_STACK_OVERFLOW" }, + { 0x0504, "GL_STACK_UNDERFLOW" }, + { 0x0505, "GL_OUT_OF_MEMORY" }, + { 0x0506, "GL_INVALID_FRAMEBUFFER_OPERATION" }, + { 0x0600, "GL_2D" }, + { 0x0601, "GL_3D" }, + { 0x0602, "GL_3D_COLOR" }, + { 0x0603, "GL_3D_COLOR_TEXTURE" }, + { 0x0604, "GL_4D_COLOR_TEXTURE" }, + { 0x0700, "GL_PASS_THROUGH_TOKEN" }, + { 0x0701, "GL_POINT_TOKEN" }, + { 0x0702, "GL_LINE_TOKEN" }, + { 0x0703, "GL_POLYGON_TOKEN" }, + { 0x0704, "GL_BITMAP_TOKEN" }, + { 0x0705, "GL_DRAW_PIXEL_TOKEN" }, + { 0x0706, "GL_COPY_PIXEL_TOKEN" }, + { 0x0707, "GL_LINE_RESET_TOKEN" }, + { 0x0800, "GL_EXP" }, + { 0x0801, "GL_EXP2" }, + { 0x0900, "GL_CW" }, + { 0x0901, "GL_CCW" }, + { 0x0A00, "GL_COEFF" }, + { 0x0A01, "GL_ORDER" }, + { 0x0A02, "GL_DOMAIN" }, + { 0x0B00, "GL_CURRENT_COLOR" }, + { 0x0B01, "GL_CURRENT_INDEX" }, + { 0x0B02, "GL_CURRENT_NORMAL" }, + { 0x0B03, "GL_CURRENT_TEXTURE_COORDS" }, + { 0x0B04, "GL_CURRENT_RASTER_COLOR" }, + { 0x0B05, "GL_CURRENT_RASTER_INDEX" }, + { 0x0B06, "GL_CURRENT_RASTER_TEXTURE_COORDS" }, + { 0x0B07, "GL_CURRENT_RASTER_POSITION" }, + { 0x0B08, "GL_CURRENT_RASTER_POSITION_VALID" }, + { 0x0B09, "GL_CURRENT_RASTER_DISTANCE" }, + { 0x0B10, "GL_POINT_SMOOTH" }, + { 0x0B11, "GL_POINT_SIZE" }, + { 0x0B12, "GL_POINT_SIZE_RANGE" }, + { 0x0B12, "GL_SMOOTH_POINT_SIZE_RANGE" }, + { 0x0B13, "GL_POINT_SIZE_GRANULARITY" }, + { 0x0B13, "GL_SMOOTH_POINT_SIZE_GRANULARITY" }, + { 0x0B20, "GL_LINE_SMOOTH" }, + { 0x0B21, "GL_LINE_WIDTH" }, + { 0x0B22, "GL_LINE_WIDTH_RANGE" }, + { 0x0B22, "GL_SMOOTH_LINE_WIDTH_RANGE" }, + { 0x0B23, "GL_LINE_WIDTH_GRANULARITY" }, + { 0x0B23, "GL_SMOOTH_LINE_WIDTH_GRANULARITY" }, + { 0x0B24, "GL_LINE_STIPPLE" }, + { 0x0B25, "GL_LINE_STIPPLE_PATTERN" }, + { 0x0B26, "GL_LINE_STIPPLE_REPEAT" }, + { 0x0B30, "GL_LIST_MODE" }, + { 0x0B31, "GL_MAX_LIST_NESTING" }, + { 0x0B32, "GL_LIST_BASE" }, + { 0x0B33, "GL_LIST_INDEX" }, + { 0x0B40, "GL_POLYGON_MODE" }, + { 0x0B41, "GL_POLYGON_SMOOTH" }, + { 0x0B42, "GL_POLYGON_STIPPLE" }, + { 0x0B43, "GL_EDGE_FLAG" }, + { 0x0B44, "GL_CULL_FACE" }, + { 0x0B45, "GL_CULL_FACE_MODE" }, + { 0x0B46, "GL_FRONT_FACE" }, + { 0x0B50, "GL_LIGHTING" }, + { 0x0B51, "GL_LIGHT_MODEL_LOCAL_VIEWER" }, + { 0x0B52, "GL_LIGHT_MODEL_TWO_SIDE" }, + { 0x0B53, "GL_LIGHT_MODEL_AMBIENT" }, + { 0x0B54, "GL_SHADE_MODEL" }, + { 0x0B55, "GL_COLOR_MATERIAL_FACE" }, + { 0x0B56, "GL_COLOR_MATERIAL_PARAMETER" }, + { 0x0B57, "GL_COLOR_MATERIAL" }, + { 0x0B60, "GL_FOG" }, + { 0x0B61, "GL_FOG_INDEX" }, + { 0x0B62, "GL_FOG_DENSITY" }, + { 0x0B63, "GL_FOG_START" }, + { 0x0B64, "GL_FOG_END" }, + { 0x0B65, "GL_FOG_MODE" }, + { 0x0B66, "GL_FOG_COLOR" }, + { 0x0B70, "GL_DEPTH_RANGE" }, + { 0x0B71, "GL_DEPTH_TEST" }, + { 0x0B72, "GL_DEPTH_WRITEMASK" }, + { 0x0B73, "GL_DEPTH_CLEAR_VALUE" }, + { 0x0B74, "GL_DEPTH_FUNC" }, + { 0x0B80, "GL_ACCUM_CLEAR_VALUE" }, + { 0x0B90, "GL_STENCIL_TEST" }, + { 0x0B91, "GL_STENCIL_CLEAR_VALUE" }, + { 0x0B92, "GL_STENCIL_FUNC" }, + { 0x0B93, "GL_STENCIL_VALUE_MASK" }, + { 0x0B94, "GL_STENCIL_FAIL" }, + { 0x0B95, "GL_STENCIL_PASS_DEPTH_FAIL" }, + { 0x0B96, "GL_STENCIL_PASS_DEPTH_PASS" }, + { 0x0B97, "GL_STENCIL_REF" }, + { 0x0B98, "GL_STENCIL_WRITEMASK" }, + { 0x0BA0, "GL_MATRIX_MODE" }, + { 0x0BA1, "GL_NORMALIZE" }, + { 0x0BA2, "GL_VIEWPORT" }, + { 0x0BA3, "GL_MODELVIEW_STACK_DEPTH" }, + { 0x0BA4, "GL_PROJECTION_STACK_DEPTH" }, + { 0x0BA5, "GL_TEXTURE_STACK_DEPTH" }, + { 0x0BA6, "GL_MODELVIEW_MATRIX" }, + { 0x0BA7, "GL_PROJECTION_MATRIX" }, + { 0x0BA8, "GL_TEXTURE_MATRIX" }, + { 0x0BB0, "GL_ATTRIB_STACK_DEPTH" }, + { 0x0BB1, "GL_CLIENT_ATTRIB_STACK_DEPTH" }, + { 0x0BC0, "GL_ALPHA_TEST" }, + { 0x0BC1, "GL_ALPHA_TEST_FUNC" }, + { 0x0BC2, "GL_ALPHA_TEST_REF" }, + { 0x0BD0, "GL_DITHER" }, + { 0x0BE0, "GL_BLEND_DST" }, + { 0x0BE1, "GL_BLEND_SRC" }, + { 0x0BE2, "GL_BLEND" }, + { 0x0BF0, "GL_LOGIC_OP_MODE" }, + { 0x0BF1, "GL_INDEX_LOGIC_OP" }, + { 0x0BF2, "GL_COLOR_LOGIC_OP" }, + { 0x0C00, "GL_AUX_BUFFERS" }, + { 0x0C01, "GL_DRAW_BUFFER" }, + { 0x0C02, "GL_READ_BUFFER" }, + { 0x0C10, "GL_SCISSOR_BOX" }, + { 0x0C11, "GL_SCISSOR_TEST" }, + { 0x0C20, "GL_INDEX_CLEAR_VALUE" }, + { 0x0C21, "GL_INDEX_WRITEMASK" }, + { 0x0C22, "GL_COLOR_CLEAR_VALUE" }, + { 0x0C23, "GL_COLOR_WRITEMASK" }, + { 0x0C30, "GL_INDEX_MODE" }, + { 0x0C31, "GL_RGBA_MODE" }, + { 0x0C32, "GL_DOUBLEBUFFER" }, + { 0x0C33, "GL_STEREO" }, + { 0x0C40, "GL_RENDER_MODE" }, + { 0x0C50, "GL_PERSPECTIVE_CORRECTION_HINT" }, + { 0x0C51, "GL_POINT_SMOOTH_HINT" }, + { 0x0C52, "GL_LINE_SMOOTH_HINT" }, + { 0x0C53, "GL_POLYGON_SMOOTH_HINT" }, + { 0x0C54, "GL_FOG_HINT" }, + { 0x0C60, "GL_TEXTURE_GEN_S" }, + { 0x0C61, "GL_TEXTURE_GEN_T" }, + { 0x0C62, "GL_TEXTURE_GEN_R" }, + { 0x0C63, "GL_TEXTURE_GEN_Q" }, + { 0x0C70, "GL_PIXEL_MAP_I_TO_I" }, + { 0x0C71, "GL_PIXEL_MAP_S_TO_S" }, + { 0x0C72, "GL_PIXEL_MAP_I_TO_R" }, + { 0x0C73, "GL_PIXEL_MAP_I_TO_G" }, + { 0x0C74, "GL_PIXEL_MAP_I_TO_B" }, + { 0x0C75, "GL_PIXEL_MAP_I_TO_A" }, + { 0x0C76, "GL_PIXEL_MAP_R_TO_R" }, + { 0x0C77, "GL_PIXEL_MAP_G_TO_G" }, + { 0x0C78, "GL_PIXEL_MAP_B_TO_B" }, + { 0x0C79, "GL_PIXEL_MAP_A_TO_A" }, + { 0x0CB0, "GL_PIXEL_MAP_I_TO_I_SIZE" }, + { 0x0CB1, "GL_PIXEL_MAP_S_TO_S_SIZE" }, + { 0x0CB2, "GL_PIXEL_MAP_I_TO_R_SIZE" }, + { 0x0CB3, "GL_PIXEL_MAP_I_TO_G_SIZE" }, + { 0x0CB4, "GL_PIXEL_MAP_I_TO_B_SIZE" }, + { 0x0CB5, "GL_PIXEL_MAP_I_TO_A_SIZE" }, + { 0x0CB6, "GL_PIXEL_MAP_R_TO_R_SIZE" }, + { 0x0CB7, "GL_PIXEL_MAP_G_TO_G_SIZE" }, + { 0x0CB8, "GL_PIXEL_MAP_B_TO_B_SIZE" }, + { 0x0CB9, "GL_PIXEL_MAP_A_TO_A_SIZE" }, + { 0x0CF0, "GL_UNPACK_SWAP_BYTES" }, + { 0x0CF1, "GL_UNPACK_LSB_FIRST" }, + { 0x0CF2, "GL_UNPACK_ROW_LENGTH" }, + { 0x0CF3, "GL_UNPACK_SKIP_ROWS" }, + { 0x0CF4, "GL_UNPACK_SKIP_PIXELS" }, + { 0x0CF5, "GL_UNPACK_ALIGNMENT" }, + { 0x0D00, "GL_PACK_SWAP_BYTES" }, + { 0x0D01, "GL_PACK_LSB_FIRST" }, + { 0x0D02, "GL_PACK_ROW_LENGTH" }, + { 0x0D03, "GL_PACK_SKIP_ROWS" }, + { 0x0D04, "GL_PACK_SKIP_PIXELS" }, + { 0x0D05, "GL_PACK_ALIGNMENT" }, + { 0x0D10, "GL_MAP_COLOR" }, + { 0x0D11, "GL_MAP_STENCIL" }, + { 0x0D12, "GL_INDEX_SHIFT" }, + { 0x0D13, "GL_INDEX_OFFSET" }, + { 0x0D14, "GL_RED_SCALE" }, + { 0x0D15, "GL_RED_BIAS" }, + { 0x0D16, "GL_ZOOM_X" }, + { 0x0D17, "GL_ZOOM_Y" }, + { 0x0D18, "GL_GREEN_SCALE" }, + { 0x0D19, "GL_GREEN_BIAS" }, + { 0x0D1A, "GL_BLUE_SCALE" }, + { 0x0D1B, "GL_BLUE_BIAS" }, + { 0x0D1C, "GL_ALPHA_SCALE" }, + { 0x0D1D, "GL_ALPHA_BIAS" }, + { 0x0D1E, "GL_DEPTH_SCALE" }, + { 0x0D1F, "GL_DEPTH_BIAS" }, + { 0x0D30, "GL_MAX_EVAL_ORDER" }, + { 0x0D31, "GL_MAX_LIGHTS" }, + { 0x0D32, "GL_MAX_CLIP_PLANES" }, + { 0x0D33, "GL_MAX_TEXTURE_SIZE" }, + { 0x0D34, "GL_MAX_PIXEL_MAP_TABLE" }, + { 0x0D35, "GL_MAX_ATTRIB_STACK_DEPTH" }, + { 0x0D36, "GL_MAX_MODELVIEW_STACK_DEPTH" }, + { 0x0D37, "GL_MAX_NAME_STACK_DEPTH" }, + { 0x0D38, "GL_MAX_PROJECTION_STACK_DEPTH" }, + { 0x0D39, "GL_MAX_TEXTURE_STACK_DEPTH" }, + { 0x0D3A, "GL_MAX_VIEWPORT_DIMS" }, + { 0x0D3B, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH" }, + { 0x0D50, "GL_SUBPIXEL_BITS" }, + { 0x0D51, "GL_INDEX_BITS" }, + { 0x0D52, "GL_RED_BITS" }, + { 0x0D53, "GL_GREEN_BITS" }, + { 0x0D54, "GL_BLUE_BITS" }, + { 0x0D55, "GL_ALPHA_BITS" }, + { 0x0D56, "GL_DEPTH_BITS" }, + { 0x0D57, "GL_STENCIL_BITS" }, + { 0x0D58, "GL_ACCUM_RED_BITS" }, + { 0x0D59, "GL_ACCUM_GREEN_BITS" }, + { 0x0D5A, "GL_ACCUM_BLUE_BITS" }, + { 0x0D5B, "GL_ACCUM_ALPHA_BITS" }, + { 0x0D70, "GL_NAME_STACK_DEPTH" }, + { 0x0D80, "GL_AUTO_NORMAL" }, + { 0x0D90, "GL_MAP1_COLOR_4" }, + { 0x0D91, "GL_MAP1_INDEX" }, + { 0x0D92, "GL_MAP1_NORMAL" }, + { 0x0D93, "GL_MAP1_TEXTURE_COORD_1" }, + { 0x0D94, "GL_MAP1_TEXTURE_COORD_2" }, + { 0x0D95, "GL_MAP1_TEXTURE_COORD_3" }, + { 0x0D96, "GL_MAP1_TEXTURE_COORD_4" }, + { 0x0D97, "GL_MAP1_VERTEX_3" }, + { 0x0D98, "GL_MAP1_VERTEX_4" }, + { 0x0DB0, "GL_MAP2_COLOR_4" }, + { 0x0DB1, "GL_MAP2_INDEX" }, + { 0x0DB2, "GL_MAP2_NORMAL" }, + { 0x0DB3, "GL_MAP2_TEXTURE_COORD_1" }, + { 0x0DB4, "GL_MAP2_TEXTURE_COORD_2" }, + { 0x0DB5, "GL_MAP2_TEXTURE_COORD_3" }, + { 0x0DB6, "GL_MAP2_TEXTURE_COORD_4" }, + { 0x0DB7, "GL_MAP2_VERTEX_3" }, + { 0x0DB8, "GL_MAP2_VERTEX_4" }, + { 0x0DD0, "GL_MAP1_GRID_DOMAIN" }, + { 0x0DD1, "GL_MAP1_GRID_SEGMENTS" }, + { 0x0DD2, "GL_MAP2_GRID_DOMAIN" }, + { 0x0DD3, "GL_MAP2_GRID_SEGMENTS" }, + { 0x0DE0, "GL_TEXTURE_1D" }, + { 0x0DE1, "GL_TEXTURE_2D" }, + { 0x0DF0, "GL_FEEDBACK_BUFFER_POINTER" }, + { 0x0DF1, "GL_FEEDBACK_BUFFER_SIZE" }, + { 0x0DF2, "GL_FEEDBACK_BUFFER_TYPE" }, + { 0x0DF3, "GL_SELECTION_BUFFER_POINTER" }, + { 0x0DF4, "GL_SELECTION_BUFFER_SIZE" }, + { 0x1000, "GL_TEXTURE_WIDTH" }, + { 0x1001, "GL_TEXTURE_HEIGHT" }, + { 0x1003, "GL_TEXTURE_INTERNAL_FORMAT" }, + { 0x1004, "GL_TEXTURE_BORDER_COLOR" }, + { 0x1005, "GL_TEXTURE_BORDER" }, + { 0x1100, "GL_DONT_CARE" }, + { 0x1101, "GL_FASTEST" }, + { 0x1102, "GL_NICEST" }, + { 0x1200, "GL_AMBIENT" }, + { 0x1201, "GL_DIFFUSE" }, + { 0x1202, "GL_SPECULAR" }, + { 0x1203, "GL_POSITION" }, + { 0x1204, "GL_SPOT_DIRECTION" }, + { 0x1205, "GL_SPOT_EXPONENT" }, + { 0x1206, "GL_SPOT_CUTOFF" }, + { 0x1207, "GL_CONSTANT_ATTENUATION" }, + { 0x1208, "GL_LINEAR_ATTENUATION" }, + { 0x1209, "GL_QUADRATIC_ATTENUATION" }, + { 0x1300, "GL_COMPILE" }, + { 0x1301, "GL_COMPILE_AND_EXECUTE" }, + { 0x1400, "GL_BYTE " }, + { 0x1401, "GL_UBYTE" }, + { 0x1402, "GL_SHORT" }, + { 0x1403, "GL_USHRT" }, + { 0x1404, "GL_INT " }, + { 0x1405, "GL_UINT " }, + { 0x1406, "GL_FLOAT" }, + { 0x1407, "GL_2_BYTES" }, + { 0x1408, "GL_3_BYTES" }, + { 0x1409, "GL_4_BYTES" }, + { 0x140A, "GL_DOUBLE" }, + { 0x140B, "GL_HALF_FLOAT" }, + { 0x1500, "GL_CLEAR" }, + { 0x1501, "GL_AND" }, + { 0x1502, "GL_AND_REVERSE" }, + { 0x1503, "GL_COPY" }, + { 0x1504, "GL_AND_INVERTED" }, + { 0x1505, "GL_NOOP" }, + { 0x1506, "GL_XOR" }, + { 0x1507, "GL_OR" }, + { 0x1508, "GL_NOR" }, + { 0x1509, "GL_EQUIV" }, + { 0x150A, "GL_INVERT" }, + { 0x150B, "GL_OR_REVERSE" }, + { 0x150C, "GL_COPY_INVERTED" }, + { 0x150D, "GL_OR_INVERTED" }, + { 0x150E, "GL_NAND" }, + { 0x150F, "GL_SET" }, + { 0x1600, "GL_EMISSION" }, + { 0x1601, "GL_SHININESS" }, + { 0x1602, "GL_AMBIENT_AND_DIFFUSE" }, + { 0x1603, "GL_COLOR_INDEXES" }, + { 0x1700, "GL_MODELVIEW" }, + { 0x1700, "GL_MODELVIEW0_ARB" }, + { 0x1701, "GL_PROJECTION" }, + { 0x1702, "GL_TEXTURE" }, + { 0x1800, "GL_COLOR" }, + { 0x1801, "GL_DEPTH" }, + { 0x1802, "GL_STENCIL" }, + { 0x1900, "GL_COLOR_INDEX" }, + { 0x1901, "GL_STENCIL_INDEX" }, + { 0x1902, "GL_DEPTH_COMPONENT" }, + { 0x1903, "GL_RED" }, + { 0x1904, "GL_GREEN" }, + { 0x1905, "GL_BLUE" }, + { 0x1906, "GL_ALPHA" }, + { 0x1907, "GL_RGB" }, + { 0x1908, "GL_RGBA" }, + { 0x1909, "GL_LUMINANCE" }, + { 0x190A, "GL_LUMINANCE_ALPHA" }, + { 0x1A00, "GL_BITMAP" }, + { 0x1B00, "GL_POINT" }, + { 0x1B01, "GL_LINE" }, + { 0x1B02, "GL_FILL" }, + { 0x1C00, "GL_RENDER" }, + { 0x1C01, "GL_FEEDBACK" }, + { 0x1C02, "GL_SELECT" }, + { 0x1D00, "GL_FLAT" }, + { 0x1D01, "GL_SMOOTH" }, + { 0x1E00, "GL_KEEP" }, + { 0x1E01, "GL_REPLACE" }, + { 0x1E02, "GL_INCR" }, + { 0x1E03, "GL_DECR" }, + { 0x1F00, "GL_VENDOR" }, + { 0x1F01, "GL_RENDERER" }, + { 0x1F02, "GL_VERSION" }, + { 0x1F03, "GL_EXTENSIONS" }, + { 0x2000, "GL_S" }, + { 0x2001, "GL_T" }, + { 0x2002, "GL_R" }, + { 0x2003, "GL_Q" }, + { 0x2100, "GL_MODULATE" }, + { 0x2101, "GL_DECAL" }, + { 0x2200, "GL_TEXTURE_ENV_MODE" }, + { 0x2201, "GL_TEXTURE_ENV_COLOR" }, + { 0x2300, "GL_TEXTURE_ENV" }, + { 0x2400, "GL_EYE_LINEAR" }, + { 0x2401, "GL_OBJECT_LINEAR" }, + { 0x2402, "GL_SPHERE_MAP" }, + { 0x2500, "GL_TEXTURE_GEN_MODE" }, + { 0x2501, "GL_OBJECT_PLANE" }, + { 0x2502, "GL_EYE_PLANE" }, + { 0x2600, "GL_NEAREST" }, + { 0x2601, "GL_LINEAR" }, + { 0x2700, "GL_NEAREST_MIPMAP_NEAREST" }, + { 0x2701, "GL_LINEAR_MIPMAP_NEAREST" }, + { 0x2702, "GL_NEAREST_MIPMAP_LINEAR" }, + { 0x2703, "GL_LINEAR_MIPMAP_LINEAR" }, + { 0x2800, "GL_TEXTURE_MAG_FILTER" }, + { 0x2801, "GL_TEXTURE_MIN_FILTER" }, + { 0x2802, "GL_TEXTURE_WRAP_S" }, + { 0x2803, "GL_TEXTURE_WRAP_T" }, + { 0x2900, "GL_CLAMP" }, + { 0x2901, "GL_REPEAT" }, + { 0x2A00, "GL_POLYGON_OFFSET_UNITS" }, + { 0x2A01, "GL_POLYGON_OFFSET_POINT" }, + { 0x2A02, "GL_POLYGON_OFFSET_LINE" }, + { 0x2A10, "GL_R3_G3_B2" }, + { 0x2A20, "GL_V2F" }, + { 0x2A21, "GL_V3F" }, + { 0x2A22, "GL_C4UB_V2F" }, + { 0x2A23, "GL_C4UB_V3F" }, + { 0x2A24, "GL_C3F_V3F" }, + { 0x2A25, "GL_N3F_V3F" }, + { 0x2A26, "GL_C4F_N3F_V3F" }, + { 0x2A27, "GL_T2F_V3F" }, + { 0x2A28, "GL_T4F_V4F" }, + { 0x2A29, "GL_T2F_C4UB_V3F" }, + { 0x2A2A, "GL_T2F_C3F_V3F" }, + { 0x2A2B, "GL_T2F_N3F_V3F" }, + { 0x2A2C, "GL_T2F_C4F_N3F_V3F" }, + { 0x2A2D, "GL_T4F_C4F_N3F_V4F" }, + { 0x3000, "GL_CLIP_PLANE0" }, + { 0x3001, "GL_CLIP_PLANE1" }, + { 0x3002, "GL_CLIP_PLANE2" }, + { 0x3003, "GL_CLIP_PLANE3" }, + { 0x3004, "GL_CLIP_PLANE4" }, + { 0x3005, "GL_CLIP_PLANE5" }, + { 0x4000, "GL_LIGHT0" }, + { 0x4001, "GL_LIGHT1" }, + { 0x4002, "GL_LIGHT2" }, + { 0x4003, "GL_LIGHT3" }, + { 0x4004, "GL_LIGHT4" }, + { 0x4005, "GL_LIGHT5" }, + { 0x4006, "GL_LIGHT6" }, + { 0x4007, "GL_LIGHT7" }, + { 0x8000, "GL_ABGR_EXT" }, + { 0x8001, "GL_CONSTANT_COLOR" }, + { 0x8002, "GL_ONE_MINUS_CONSTANT_COLOR" }, + { 0x8003, "GL_CONSTANT_ALPHA" }, + { 0x8004, "GL_ONE_MINUS_CONSTANT_ALPHA" }, + { 0x8005, "GL_BLEND_COLOR" }, + { 0x8006, "GL_FUNC_ADD" }, + { 0x8007, "GL_MIN" }, + { 0x8008, "GL_MAX" }, + { 0x8009, "GL_BLEND_EQUATION_RGB" }, + { 0x8009, "GL_BLEND_EQUATION" }, + { 0x800A, "GL_FUNC_SUBTRACT" }, + { 0x800B, "GL_FUNC_REVERSE_SUBTRACT" }, + { 0x8010, "GL_CONVOLUTION_1D" }, + { 0x8011, "GL_CONVOLUTION_2D" }, + { 0x8012, "GL_SEPARABLE_2D" }, + { 0x8013, "GL_CONVOLUTION_BORDER_MODE" }, + { 0x8014, "GL_CONVOLUTION_FILTER_SCALE" }, + { 0x8015, "GL_CONVOLUTION_FILTER_BIAS" }, + { 0x8016, "GL_REDUCE" }, + { 0x8017, "GL_CONVOLUTION_FORMAT" }, + { 0x8018, "GL_CONVOLUTION_WIDTH" }, + { 0x8019, "GL_CONVOLUTION_HEIGHT" }, + { 0x801A, "GL_MAX_CONVOLUTION_WIDTH" }, + { 0x801B, "GL_MAX_CONVOLUTION_HEIGHT" }, + { 0x801C, "GL_POST_CONVOLUTION_RED_SCALE" }, + { 0x801D, "GL_POST_CONVOLUTION_GREEN_SCALE" }, + { 0x801E, "GL_POST_CONVOLUTION_BLUE_SCALE" }, + { 0x801F, "GL_POST_CONVOLUTION_ALPHA_SCALE" }, + { 0x8020, "GL_POST_CONVOLUTION_RED_BIAS" }, + { 0x8021, "GL_POST_CONVOLUTION_GREEN_BIAS" }, + { 0x8022, "GL_POST_CONVOLUTION_BLUE_BIAS" }, + { 0x8023, "GL_POST_CONVOLUTION_ALPHA_BIAS" }, + { 0x8024, "GL_HISTOGRAM" }, + { 0x8025, "GL_PROXY_HISTOGRAM" }, + { 0x8026, "GL_HISTOGRAM_WIDTH" }, + { 0x8027, "GL_HISTOGRAM_FORMAT" }, + { 0x8028, "GL_HISTOGRAM_RED_SIZE" }, + { 0x8029, "GL_HISTOGRAM_GREEN_SIZE" }, + { 0x802A, "GL_HISTOGRAM_BLUE_SIZE" }, + { 0x802B, "GL_HISTOGRAM_ALPHA_SIZE" }, + { 0x802C, "GL_HISTOGRAM_LUMINANCE_SIZE" }, + { 0x802D, "GL_HISTOGRAM_SINK" }, + { 0x802E, "GL_MINMAX" }, + { 0x802F, "GL_MINMAX_FORMAT" }, + { 0x8030, "GL_MINMAX_SINK" }, + { 0x8031, "GL_TABLE_TOO_LARGE" }, + { 0x8032, "GL_UNSIGNED_BYTE_3_3_2" }, + { 0x8033, "GL_UNSIGNED_SHORT_4_4_4_4" }, + { 0x8034, "GL_UNSIGNED_SHORT_5_5_5_1" }, + { 0x8035, "GL_UNSIGNED_INT_8_8_8_8" }, + { 0x8036, "GL_UNSIGNED_INT_10_10_10_2" }, + { 0x8037, "GL_POLYGON_OFFSET_FILL" }, + { 0x8038, "GL_POLYGON_OFFSET_FACTOR" }, + { 0x803A, "GL_RESCALE_NORMAL" }, + { 0x803B, "GL_ALPHA4" }, + { 0x803C, "GL_ALPHA8" }, + { 0x803D, "GL_ALPHA12" }, + { 0x803E, "GL_ALPHA16" }, + { 0x803F, "GL_LUMINANCE4" }, + { 0x8040, "GL_LUMINANCE8" }, + { 0x8041, "GL_LUMINANCE12" }, + { 0x8042, "GL_LUMINANCE16" }, + { 0x8043, "GL_LUMINANCE4_ALPHA4" }, + { 0x8044, "GL_LUMINANCE6_ALPHA2" }, + { 0x8045, "GL_LUMINANCE8_ALPHA8" }, + { 0x8046, "GL_LUMINANCE12_ALPHA4" }, + { 0x8047, "GL_LUMINANCE12_ALPHA12" }, + { 0x8048, "GL_LUMINANCE16_ALPHA16" }, + { 0x8049, "GL_INTENSITY" }, + { 0x804A, "GL_INTENSITY4" }, + { 0x804B, "GL_INTENSITY8" }, + { 0x804C, "GL_INTENSITY12" }, + { 0x804D, "GL_INTENSITY16" }, + { 0x804F, "GL_RGB4" }, + { 0x8050, "GL_RGB5" }, + { 0x8051, "GL_RGB8" }, + { 0x8052, "GL_RGB10" }, + { 0x8053, "GL_RGB12" }, + { 0x8054, "GL_RGB16" }, + { 0x8055, "GL_RGBA2" }, + { 0x8056, "GL_RGBA4" }, + { 0x8057, "GL_RGB5_A1" }, + { 0x8058, "GL_RGBA8" }, + { 0x8059, "GL_RGB10_A2" }, + { 0x805A, "GL_RGBA12" }, + { 0x805B, "GL_RGBA16" }, + { 0x805C, "GL_TEXTURE_RED_SIZE" }, + { 0x805D, "GL_TEXTURE_GREEN_SIZE" }, + { 0x805E, "GL_TEXTURE_BLUE_SIZE" }, + { 0x805F, "GL_TEXTURE_ALPHA_SIZE" }, + { 0x8060, "GL_TEXTURE_LUMINANCE_SIZE" }, + { 0x8061, "GL_TEXTURE_INTENSITY_SIZE" }, + { 0x8063, "GL_PROXY_TEXTURE_1D" }, + { 0x8064, "GL_PROXY_TEXTURE_2D" }, + { 0x8066, "GL_TEXTURE_PRIORITY" }, + { 0x8067, "GL_TEXTURE_RESIDENT" }, + { 0x8068, "GL_TEXTURE_BINDING_1D" }, + { 0x8069, "GL_TEXTURE_BINDING_2D" }, + { 0x806A, "GL_TEXTURE_BINDING_3D" }, + { 0x806B, "GL_PACK_SKIP_IMAGES" }, + { 0x806C, "GL_PACK_IMAGE_HEIGHT" }, + { 0x806D, "GL_UNPACK_SKIP_IMAGES" }, + { 0x806E, "GL_UNPACK_IMAGE_HEIGHT" }, + { 0x806F, "GL_TEXTURE_3D" }, + { 0x8070, "GL_PROXY_TEXTURE_3D" }, + { 0x8071, "GL_TEXTURE_DEPTH" }, + { 0x8072, "GL_TEXTURE_WRAP_R" }, + { 0x8073, "GL_MAX_3D_TEXTURE_SIZE" }, + { 0x8074, "GL_VERTEX_ARRAY" }, + { 0x8075, "GL_NORMAL_ARRAY" }, + { 0x8076, "GL_COLOR_ARRAY" }, + { 0x8077, "GL_INDEX_ARRAY" }, + { 0x8078, "GL_TEXTURE_COORD_ARRAY" }, + { 0x8079, "GL_EDGE_FLAG_ARRAY" }, + { 0x807A, "GL_VERTEX_ARRAY_SIZE" }, + { 0x807B, "GL_VERTEX_ARRAY_TYPE" }, + { 0x807C, "GL_VERTEX_ARRAY_STRIDE" }, + { 0x807E, "GL_NORMAL_ARRAY_TYPE" }, + { 0x807F, "GL_NORMAL_ARRAY_STRIDE" }, + { 0x8081, "GL_COLOR_ARRAY_SIZE" }, + { 0x8082, "GL_COLOR_ARRAY_TYPE" }, + { 0x8083, "GL_COLOR_ARRAY_STRIDE" }, + { 0x8085, "GL_INDEX_ARRAY_TYPE" }, + { 0x8086, "GL_INDEX_ARRAY_STRIDE" }, + { 0x8088, "GL_TEXTURE_COORD_ARRAY_SIZE" }, + { 0x8089, "GL_TEXTURE_COORD_ARRAY_TYPE" }, + { 0x808A, "GL_TEXTURE_COORD_ARRAY_STRIDE" }, + { 0x808C, "GL_EDGE_FLAG_ARRAY_STRIDE" }, + { 0x808E, "GL_VERTEX_ARRAY_POINTER" }, + { 0x808F, "GL_NORMAL_ARRAY_POINTER" }, + { 0x8090, "GL_COLOR_ARRAY_POINTER" }, + { 0x8091, "GL_INDEX_ARRAY_POINTER" }, + { 0x8092, "GL_TEXTURE_COORD_ARRAY_POINTER" }, + { 0x8093, "GL_EDGE_FLAG_ARRAY_POINTER" }, + { 0x809D, "GL_MULTISAMPLE_ARB" }, + { 0x809D, "GL_MULTISAMPLE" }, + { 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE_ARB" }, + { 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE" }, + { 0x809F, "GL_SAMPLE_ALPHA_TO_ONE_ARB" }, + { 0x809F, "GL_SAMPLE_ALPHA_TO_ONE" }, + { 0x80A0, "GL_SAMPLE_COVERAGE_ARB" }, + { 0x80A0, "GL_SAMPLE_COVERAGE" }, + { 0x80A0, "GL_SAMPLE_MASK_EXT" }, + { 0x80A1, "GL_1PASS_EXT" }, + { 0x80A2, "GL_2PASS_0_EXT" }, + { 0x80A3, "GL_2PASS_1_EXT" }, + { 0x80A4, "GL_4PASS_0_EXT" }, + { 0x80A5, "GL_4PASS_1_EXT" }, + { 0x80A6, "GL_4PASS_2_EXT" }, + { 0x80A7, "GL_4PASS_3_EXT" }, + { 0x80A8, "GL_SAMPLE_BUFFERS" }, + { 0x80A9, "GL_SAMPLES" }, + { 0x80AA, "GL_SAMPLE_COVERAGE_VALUE" }, + { 0x80AB, "GL_SAMPLE_COVERAGE_INVERT" }, + { 0x80AC, "GL_SAMPLE_PATTERN_EXT" }, + { 0x80B1, "GL_COLOR_MATRIX" }, + { 0x80B2, "GL_COLOR_MATRIX_STACK_DEPTH" }, + { 0x80B3, "GL_MAX_COLOR_MATRIX_STACK_DEPTH" }, + { 0x80B4, "GL_POST_COLOR_MATRIX_RED_SCALE" }, + { 0x80B5, "GL_POST_COLOR_MATRIX_GREEN_SCALE" }, + { 0x80B6, "GL_POST_COLOR_MATRIX_BLUE_SCALE" }, + { 0x80B7, "GL_POST_COLOR_MATRIX_ALPHA_SCALE" }, + { 0x80B8, "GL_POST_COLOR_MATRIX_RED_BIAS" }, + { 0x80B9, "GL_POST_COLOR_MATRIX_GREEN_BIAS" }, + { 0x80BA, "GL_POST_COLOR_MATRIX_BLUE_BIAS" }, + { 0x80BB, "GL_POST_COLOR_MATRIX_ALPHA_BIAS" }, + { 0x80BF, "GL_TEXTURE_COMPARE_FAIL_VALUE_ARB" }, + { 0x80C8, "GL_BLEND_DST_RGB" }, + { 0x80C9, "GL_BLEND_SRC_RGB" }, + { 0x80CA, "GL_BLEND_DST_ALPHA" }, + { 0x80CB, "GL_BLEND_SRC_ALPHA" }, + { 0x80CC, "GL_422_EXT" }, + { 0x80CD, "GL_422_REV_EXT" }, + { 0x80CE, "GL_422_AVERAGE_EXT" }, + { 0x80CF, "GL_422_REV_AVERAGE_EXT" }, + { 0x80D0, "GL_COLOR_TABLE" }, + { 0x80D1, "GL_POST_CONVOLUTION_COLOR_TABLE" }, + { 0x80D2, "GL_POST_COLOR_MATRIX_COLOR_TABLE" }, + { 0x80D3, "GL_PROXY_COLOR_TABLE" }, + { 0x80D4, "GL_PROXY_POST_CONVOLUTION_COLOR_TABLE" }, + { 0x80D5, "GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE" }, + { 0x80D6, "GL_COLOR_TABLE_SCALE" }, + { 0x80D7, "GL_COLOR_TABLE_BIAS" }, + { 0x80D8, "GL_COLOR_TABLE_FORMAT" }, + { 0x80D9, "GL_COLOR_TABLE_WIDTH" }, + { 0x80DA, "GL_COLOR_TABLE_RED_SIZE" }, + { 0x80DB, "GL_COLOR_TABLE_GREEN_SIZE" }, + { 0x80DC, "GL_COLOR_TABLE_BLUE_SIZE" }, + { 0x80DD, "GL_COLOR_TABLE_ALPHA_SIZE" }, + { 0x80DE, "GL_COLOR_TABLE_LUMINANCE_SIZE" }, + { 0x80DF, "GL_COLOR_TABLE_INTENSITY_SIZE" }, + { 0x80E0, "GL_BGR_EXT" }, + { 0x80E0, "GL_BGR" }, + { 0x80E1, "GL_BGRA_EXT" }, + { 0x80E1, "GL_BGRA" }, + { 0x80E1, "GL_BGRA" }, + { 0x80E2, "GL_COLOR_INDEX1_EXT" }, + { 0x80E3, "GL_COLOR_INDEX2_EXT" }, + { 0x80E4, "GL_COLOR_INDEX4_EXT" }, + { 0x80E5, "GL_COLOR_INDEX8_EXT" }, + { 0x80E6, "GL_COLOR_INDEX12_EXT" }, + { 0x80E7, "GL_COLOR_INDEX16_EXT" }, + { 0x80E8, "GL_MAX_ELEMENTS_VERTICES_EXT" }, + { 0x80E8, "GL_MAX_ELEMENTS_VERTICES" }, + { 0x80E9, "GL_MAX_ELEMENTS_INDICES_EXT" }, + { 0x80E9, "GL_MAX_ELEMENTS_INDICES" }, + { 0x80ED, "GL_TEXTURE_INDEX_SIZE_EXT" }, + { 0x80F0, "GL_CLIP_VOLUME_CLIPPING_HINT_EXT" }, + { 0x8126, "GL_POINT_SIZE_MIN_ARB" }, + { 0x8126, "GL_POINT_SIZE_MIN" }, + { 0x8127, "GL_POINT_SIZE_MAX_ARB" }, + { 0x8127, "GL_POINT_SIZE_MAX" }, + { 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE_ARB" }, + { 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE" }, + { 0x8129, "GL_POINT_DISTANCE_ATTENUATION_ARB" }, + { 0x8129, "GL_POINT_DISTANCE_ATTENUATION" }, + { 0x812D, "GL_CLAMP_TO_BORDER_ARB" }, + { 0x812D, "GL_CLAMP_TO_BORDER" }, + { 0x812F, "GL_CLAMP_TO_EDGE" }, + { 0x813A, "GL_TEXTURE_MIN_LOD" }, + { 0x813B, "GL_TEXTURE_MAX_LOD" }, + { 0x813C, "GL_TEXTURE_BASE_LEVEL" }, + { 0x813D, "GL_TEXTURE_MAX_LEVEL" }, + { 0x8151, "GL_CONSTANT_BORDER" }, + { 0x8153, "GL_REPLICATE_BORDER" }, + { 0x8154, "GL_CONVOLUTION_BORDER_COLOR" }, + { 0x8191, "GL_GENERATE_MIPMAP" }, + { 0x8192, "GL_GENERATE_MIPMAP_HINT" }, + { 0x81A5, "GL_DEPTH_COMPONENT16_ARB" }, + { 0x81A5, "GL_DEPTH_COMPONENT16" }, + { 0x81A6, "GL_DEPTH_COMPONENT24_ARB" }, + { 0x81A6, "GL_DEPTH_COMPONENT24" }, + { 0x81A7, "GL_DEPTH_COMPONENT32_ARB" }, + { 0x81A7, "GL_DEPTH_COMPONENT32" }, + { 0x81A8, "GL_ARRAY_ELEMENT_LOCK_FIRST_EXT" }, + { 0x81A9, "GL_ARRAY_ELEMENT_LOCK_COUNT_EXT" }, + { 0x81AA, "GL_CULL_VERTEX_EXT" }, + { 0x81AB, "GL_CULL_VERTEX_EYE_POSITION_EXT" }, + { 0x81AC, "GL_CULL_VERTEX_OBJECT_POSITION_EXT" }, + { 0x81AD, "GL_IUI_V2F_EXT" }, + { 0x81AE, "GL_IUI_V3F_EXT" }, + { 0x81AF, "GL_IUI_N3F_V2F_EXT" }, + { 0x81B0, "GL_IUI_N3F_V3F_EXT" }, + { 0x81B1, "GL_T2F_IUI_V2F_EXT" }, + { 0x81B2, "GL_T2F_IUI_V3F_EXT" }, + { 0x81B3, "GL_T2F_IUI_N3F_V2F_EXT" }, + { 0x81B4, "GL_T2F_IUI_N3F_V3F_EXT" }, + { 0x81B5, "GL_INDEX_TEST_EXT" }, + { 0x81B6, "GL_INDEX_TEST_FUNC_EXT" }, + { 0x81B7, "GL_INDEX_TEST_REF_EXT" }, + { 0x81B8, "GL_INDEX_MATERIAL_EXT" }, + { 0x81B9, "GL_INDEX_MATERIAL_PARAMETER_EXT" }, + { 0x81BA, "GL_INDEX_MATERIAL_FACE_EXT" }, + { 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL_EXT" }, + { 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL" }, + { 0x81F9, "GL_SINGLE_COLOR_EXT" }, + { 0x81F9, "GL_SINGLE_COLOR" }, + { 0x81FA, "GL_SEPARATE_SPECULAR_COLOR_EXT" }, + { 0x81FA, "GL_SEPARATE_SPECULAR_COLOR" }, + { 0x81FB, "GL_SHARED_TEXTURE_PALETTE_EXT" }, + { 0x8210, "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING" }, + { 0x8211, "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE" }, + { 0x8212, "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE" }, + { 0x8213, "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE" }, + { 0x8214, "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE" }, + { 0x8215, "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE" }, + { 0x8216, "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE" }, + { 0x8217, "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE" }, + { 0x8218, "GL_FRAMEBUFFER_DEFAULT" }, + { 0x8219, "GL_FRAMEBUFFER_UNDEFINED" }, + { 0x821A, "GL_DEPTH_STENCIL_ATTACHMENT" }, + { 0x8225, "GL_COMPRESSED_RED" }, + { 0x8226, "GL_COMPRESSED_RG" }, + { 0x8227, "GL_RG" }, + { 0x8228, "GL_RG_INTEGER" }, + { 0x8229, "GL_R8" }, + { 0x822A, "GL_R16" }, + { 0x822B, "GL_RG8" }, + { 0x822C, "GL_RG16" }, + { 0x822D, "GL_R16F" }, + { 0x822E, "GL_R32F" }, + { 0x822F, "GL_RG16F" }, + { 0x8230, "GL_RG32F" }, + { 0x8231, "GL_R8I" }, + { 0x8232, "GL_R8UI" }, + { 0x8233, "GL_R16I" }, + { 0x8234, "GL_R16UI" }, + { 0x8235, "GL_R32I" }, + { 0x8236, "GL_R32UI" }, + { 0x8237, "GL_RG8I" }, + { 0x8238, "GL_RG8UI" }, + { 0x8239, "GL_RG16I" }, + { 0x823A, "GL_RG16UI" }, + { 0x823B, "GL_RG32I" }, + { 0x823C, "GL_RG32UI" }, + { 0x8330, "GL_PIXEL_TRANSFORM_2D_EXT" }, + { 0x8331, "GL_PIXEL_MAG_FILTER_EXT" }, + { 0x8332, "GL_PIXEL_MIN_FILTER_EXT" }, + { 0x8333, "GL_PIXEL_CUBIC_WEIGHT_EXT" }, + { 0x8334, "GL_CUBIC_EXT" }, + { 0x8335, "GL_AVERAGE_EXT" }, + { 0x8336, "GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" }, + { 0x8337, "GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" }, + { 0x8338, "GL_PIXEL_TRANSFORM_2D_MATRIX_EXT" }, + { 0x8349, "GL_FRAGMENT_MATERIAL_EXT" }, + { 0x834A, "GL_FRAGMENT_NORMAL_EXT" }, + { 0x834C, "GL_FRAGMENT_COLOR_EXT" }, + { 0x834D, "GL_ATTENUATION_EXT" }, + { 0x834E, "GL_SHADOW_ATTENUATION_EXT" }, + { 0x834F, "GL_TEXTURE_APPLICATION_MODE_EXT" }, + { 0x8350, "GL_TEXTURE_LIGHT_EXT" }, + { 0x8351, "GL_TEXTURE_MATERIAL_FACE_EXT" }, + { 0x8352, "GL_TEXTURE_MATERIAL_PARAMETER_EXT" }, + { 0x8362, "GL_UNSIGNED_BYTE_2_3_3_REV" }, + { 0x8363, "GL_UNSIGNED_SHORT_5_6_5" }, + { 0x8364, "GL_UNSIGNED_SHORT_5_6_5_REV" }, + { 0x8365, "GL_UNSIGNED_SHORT_4_4_4_4_REV" }, + { 0x8366, "GL_UNSIGNED_SHORT_1_5_5_5_REV" }, + { 0x8367, "GL_UNSIGNED_INT_8_8_8_8_REV" }, + { 0x8368, "GL_UNSIGNED_INT_2_10_10_10_REV" }, + { 0x8370, "GL_MIRRORED_REPEAT_ARB" }, + { 0x8370, "GL_MIRRORED_REPEAT" }, + { 0x83F0, "GL_COMPRESSED_RGB_S3TC_DXT1_EXT" }, + { 0x83F1, "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT" }, + { 0x83F2, "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT" }, + { 0x83F3, "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT" }, + { 0x8439, "GL_TANGENT_ARRAY_EXT" }, + { 0x843A, "GL_BINORMAL_ARRAY_EXT" }, + { 0x843B, "GL_CURRENT_TANGENT_EXT" }, + { 0x843C, "GL_CURRENT_BINORMAL_EXT" }, + { 0x843E, "GL_TANGENT_ARRAY_TYPE_EXT" }, + { 0x843F, "GL_TANGENT_ARRAY_STRIDE_EXT" }, + { 0x8440, "GL_BINORMAL_ARRAY_TYPE_EXT" }, + { 0x8441, "GL_BINORMAL_ARRAY_STRIDE_EXT" }, + { 0x8442, "GL_TANGENT_ARRAY_POINTER_EXT" }, + { 0x8443, "GL_BINORMAL_ARRAY_POINTER_EXT" }, + { 0x8444, "GL_MAP1_TANGENT_EXT" }, + { 0x8445, "GL_MAP2_TANGENT_EXT" }, + { 0x8446, "GL_MAP1_BINORMAL_EXT" }, + { 0x8447, "GL_MAP2_BINORMAL_EXT" }, + { 0x8450, "GL_FOG_COORD_SRC" }, + { 0x8450, "GL_FOG_COORDINATE_SOURCE_EXT" }, + { 0x8450, "GL_FOG_COORDINATE_SOURCE" }, + { 0x8451, "GL_FOG_COORD" }, + { 0x8451, "GL_FOG_COORDINATE_EXT" }, + { 0x8451, "GL_FOG_COORDINATE" }, + { 0x8452, "GL_FRAGMENT_DEPTH_EXT" }, + { 0x8452, "GL_FRAGMENT_DEPTH" }, + { 0x8453 , "GL_CURRENT_FOG_COORD" }, + { 0x8453 , "GL_CURRENT_FOG_COORDINATE" }, + { 0x8453, "GL_CURRENT_FOG_COORDINATE_EXT" }, + { 0x8454, "GL_FOG_COORD_ARRAY_TYPE" }, + { 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE_EXT" }, + { 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE" }, + { 0x8455, "GL_FOG_COORD_ARRAY_STRIDE" }, + { 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE_EXT" }, + { 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE" }, + { 0x8456, "GL_FOG_COORD_ARRAY_POINTER" }, + { 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER_EXT" }, + { 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER" }, + { 0x8457, "GL_FOG_COORD_ARRAY" }, + { 0x8457, "GL_FOG_COORDINATE_ARRAY_EXT" }, + { 0x8457, "GL_FOG_COORDINATE_ARRAY" }, + { 0x8458, "GL_COLOR_SUM_ARB" }, + { 0x8458, "GL_COLOR_SUM_EXT" }, + { 0x8458, "GL_COLOR_SUM" }, + { 0x8459, "GL_CURRENT_SECONDARY_COLOR_EXT" }, + { 0x8459, "GL_CURRENT_SECONDARY_COLOR" }, + { 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE_EXT" }, + { 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE" }, + { 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE_EXT" }, + { 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE" }, + { 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT" }, + { 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE" }, + { 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER_EXT" }, + { 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER" }, + { 0x845E, "GL_SECONDARY_COLOR_ARRAY_EXT" }, + { 0x845E, "GL_SECONDARY_COLOR_ARRAY" }, + { 0x845F, "GL_CURRENT_RASTER_SECONDARY_COLOR" }, + { 0x846D, "GL_ALIASED_POINT_SIZE_RANGE" }, + { 0x846E, "GL_ALIASED_LINE_WIDTH_RANGE" }, + { 0x84C0, "GL_TEXTURE0" }, + { 0x84C1, "GL_TEXTURE1" }, + { 0x84C2, "GL_TEXTURE2" }, + { 0x84C3, "GL_TEXTURE3" }, + { 0x84C4, "GL_TEXTURE4" }, + { 0x84C5, "GL_TEXTURE5" }, + { 0x84C6, "GL_TEXTURE6" }, + { 0x84C7, "GL_TEXTURE7" }, + { 0x84C8, "GL_TEXTURE8" }, + { 0x84C9, "GL_TEXTURE9" }, + { 0x84CA, "GL_TEXTURE10" }, + { 0x84CB, "GL_TEXTURE11" }, + { 0x84CC, "GL_TEXTURE12" }, + { 0x84CD, "GL_TEXTURE13" }, + { 0x84CE, "GL_TEXTURE14" }, + { 0x84CF, "GL_TEXTURE15" }, + { 0x84D0, "GL_TEXTURE16" }, + { 0x84D1, "GL_TEXTURE17" }, + { 0x84D2, "GL_TEXTURE18" }, + { 0x84D3, "GL_TEXTURE19" }, + { 0x84D4, "GL_TEXTURE20" }, + { 0x84D5, "GL_TEXTURE21" }, + { 0x84D6, "GL_TEXTURE22" }, + { 0x84D7, "GL_TEXTURE23" }, + { 0x84D8, "GL_TEXTURE24" }, + { 0x84D9, "GL_TEXTURE25" }, + { 0x84DA, "GL_TEXTURE26" }, + { 0x84DB, "GL_TEXTURE27" }, + { 0x84DC, "GL_TEXTURE28" }, + { 0x84DD, "GL_TEXTURE29" }, + { 0x84DE, "GL_TEXTURE30" }, + { 0x84DF, "GL_TEXTURE31" }, + { 0x84E0, "GL_ACTIVE_TEXTURE" }, + { 0x84E1, "GL_CLIENT_ACTIVE_TEXTURE" }, + { 0x84E2, "GL_MAX_TEXTURE_UNITS" }, + { 0x84E3, "GL_TRANSPOSE_MODELVIEW_MATRIX" }, + { 0x84E4, "GL_TRANSPOSE_PROJECTION_MATRIX" }, + { 0x84E5, "GL_TRANSPOSE_TEXTURE_MATRIX" }, + { 0x84E6, "GL_TRANSPOSE_COLOR_MATRIX" }, + { 0x84E7, "GL_SUBTRACT" }, + { 0x84E8, "GL_MAX_RENDERBUFFER_SIZE" }, + { 0x84E9, "GL_COMPRESSED_ALPHA" }, + { 0x84EA, "GL_COMPRESSED_LUMINANCE" }, + { 0x84EB, "GL_COMPRESSED_LUMINANCE_ALPHA" }, + { 0x84EC, "GL_COMPRESSED_INTENSITY" }, + { 0x84ED, "GL_COMPRESSED_RGB" }, + { 0x84EE, "GL_COMPRESSED_RGBA" }, + { 0x84EF, "GL_TEXTURE_COMPRESSION_HINT" }, + { 0x84F5, "GL_TEXTURE_RECTANGLE_EXT" }, + { 0x84F6, "GL_TEXTURE_BINDING_RECTANGLE_EXT" }, + { 0x84F7, "GL_PROXY_TEXTURE_RECTANGLE_EXT" }, + { 0x84F8, "GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT" }, + { 0x84F9, "GL_DEPTH_STENCIL" }, + { 0x84FA, "GL_UNSIGNED_INT_24_8" }, + { 0x84FD, "GL_MAX_TEXTURE_LOD_BIAS" }, + { 0x84FE, "GL_TEXTURE_MAX_ANISOTROPY_EXT" }, + { 0x84FF, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT" }, + { 0x8500, "GL_TEXTURE_FILTER_CONTROL" }, + { 0x8501, "GL_TEXTURE_LOD_BIAS" }, + { 0x8502, "GL_MODELVIEW1_STACK_DEPTH_EXT" }, + { 0x8506, "GL_MODELVIEW_MATRIX1_EXT" }, + { 0x8507, "GL_INCR_WRAP" }, + { 0x8508, "GL_DECR_WRAP" }, + { 0x8509, "GL_VERTEX_WEIGHTING_EXT" }, + { 0x850A, "GL_MODELVIEW1_ARB" }, + { 0x850B, "GL_CURRENT_VERTEX_WEIGHT_EXT" }, + { 0x850C, "GL_VERTEX_WEIGHT_ARRAY_EXT" }, + { 0x850D, "GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT" }, + { 0x850E, "GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT" }, + { 0x850F, "GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT" }, + { 0x8510, "GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT" }, + { 0x8511, "GL_NORMAL_MAP_ARB" }, + { 0x8511, "GL_NORMAL_MAP_EXT" }, + { 0x8511, "GL_NORMAL_MAP" }, + { 0x8512, "GL_REFLECTION_MAP_ARB" }, + { 0x8512, "GL_REFLECTION_MAP_EXT" }, + { 0x8512, "GL_REFLECTION_MAP" }, + { 0x8513, "GL_TEXTURE_CUBE_MAP_ARB" }, + { 0x8513, "GL_TEXTURE_CUBE_MAP_EXT" }, + { 0x8513, "GL_TEXTURE_CUBE_MAP" }, + { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_ARB" }, + { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_EXT" }, + { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP" }, + { 0x8515, "GL_TEXTURE_CUBE_MAP_POSITIVE_X" }, + { 0x8516, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X" }, + { 0x8517, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y" }, + { 0x8518, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y" }, + { 0x8519, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z" }, + { 0x851A, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" }, + { 0x851B, "GL_PROXY_TEXTURE_CUBE_MAP" }, + { 0x851C, "GL_MAX_CUBE_MAP_TEXTURE_SIZE" }, + { 0x851D, "GL_VERTEX_ARRAY_RANGE_APPLE" }, + { 0x851E, "GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE" }, + { 0x851F, "GL_VERTEX_ARRAY_STORAGE_HINT_APPLE" }, + { 0x8520, "GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE" }, + { 0x8521, "GL_VERTEX_ARRAY_RANGE_POINTER_APPLE" }, + { 0x8570, "GL_COMBINE_ARB" }, + { 0x8570, "GL_COMBINE_EXT" }, + { 0x8570, "GL_COMBINE" }, + { 0x8571, "GL_COMBINE_RGB_ARB" }, + { 0x8571, "GL_COMBINE_RGB_EXT" }, + { 0x8571, "GL_COMBINE_RGB" }, + { 0x8572, "GL_COMBINE_ALPHA_ARB" }, + { 0x8572, "GL_COMBINE_ALPHA_EXT" }, + { 0x8572, "GL_COMBINE_ALPHA" }, + { 0x8573, "GL_RGB_SCALE_ARB" }, + { 0x8573, "GL_RGB_SCALE_EXT" }, + { 0x8573, "GL_RGB_SCALE" }, + { 0x8574, "GL_ADD_SIGNED_ARB" }, + { 0x8574, "GL_ADD_SIGNED_EXT" }, + { 0x8574, "GL_ADD_SIGNED" }, + { 0x8575, "GL_INTERPOLATE_ARB" }, + { 0x8575, "GL_INTERPOLATE_EXT" }, + { 0x8575, "GL_INTERPOLATE" }, + { 0x8576, "GL_CONSTANT_ARB" }, + { 0x8576, "GL_CONSTANT_EXT" }, + { 0x8576, "GL_CONSTANT" }, + { 0x8577, "GL_PRIMARY_COLOR_ARB" }, + { 0x8577, "GL_PRIMARY_COLOR_EXT" }, + { 0x8577, "GL_PRIMARY_COLOR" }, + { 0x8578, "GL_PREVIOUS_ARB" }, + { 0x8578, "GL_PREVIOUS_EXT" }, + { 0x8578, "GL_PREVIOUS" }, + { 0x8580, "GL_SOURCE0_RGB_ARB" }, + { 0x8580, "GL_SOURCE0_RGB_EXT" }, + { 0x8580, "GL_SOURCE0_RGB" }, + { 0x8580, "GL_SRC0_RGB" }, + { 0x8581, "GL_SOURCE1_RGB_ARB" }, + { 0x8581, "GL_SOURCE1_RGB_EXT" }, + { 0x8581, "GL_SOURCE1_RGB" }, + { 0x8581, "GL_SRC1_RGB" }, + { 0x8582, "GL_SOURCE2_RGB_ARB" }, + { 0x8582, "GL_SOURCE2_RGB_EXT" }, + { 0x8582, "GL_SOURCE2_RGB" }, + { 0x8582, "GL_SRC2_RGB" }, + { 0x8583, "GL_SOURCE3_RGB_ARB" }, + { 0x8583, "GL_SOURCE3_RGB_EXT" }, + { 0x8583, "GL_SOURCE3_RGB" }, + { 0x8583, "GL_SRC3_RGB" }, + { 0x8584, "GL_SOURCE4_RGB_ARB" }, + { 0x8584, "GL_SOURCE4_RGB_EXT" }, + { 0x8584, "GL_SOURCE4_RGB" }, + { 0x8584, "GL_SRC4_RGB" }, + { 0x8585, "GL_SOURCE5_RGB_ARB" }, + { 0x8585, "GL_SOURCE5_RGB_EXT" }, + { 0x8585, "GL_SOURCE5_RGB" }, + { 0x8585, "GL_SRC5_RGB" }, + { 0x8586, "GL_SOURCE6_RGB_ARB" }, + { 0x8586, "GL_SOURCE6_RGB_EXT" }, + { 0x8586, "GL_SOURCE6_RGB" }, + { 0x8586, "GL_SRC6_RGB" }, + { 0x8587, "GL_SOURCE7_RGB_ARB" }, + { 0x8587, "GL_SOURCE7_RGB_EXT" }, + { 0x8587, "GL_SOURCE7_RGB" }, + { 0x8587, "GL_SRC7_RGB" }, + { 0x8588, "GL_SOURCE0_ALPHA_ARB" }, + { 0x8588, "GL_SOURCE0_ALPHA_EXT" }, + { 0x8588, "GL_SOURCE0_ALPHA" }, + { 0x8588, "GL_SRC0_ALPHA" }, + { 0x8589, "GL_SOURCE1_ALPHA_ARB" }, + { 0x8589, "GL_SOURCE1_ALPHA_EXT" }, + { 0x8589, "GL_SOURCE1_ALPHA" }, + { 0x8589, "GL_SRC1_ALPHA" }, + { 0x858A, "GL_SOURCE2_ALPHA_ARB" }, + { 0x858A, "GL_SOURCE2_ALPHA_EXT" }, + { 0x858A, "GL_SOURCE2_ALPHA" }, + { 0x858A, "GL_SRC2_ALPHA" }, + { 0x858B, "GL_SOURCE3_ALPHA_ARB" }, + { 0x858B, "GL_SOURCE3_ALPHA_EXT" }, + { 0x858B, "GL_SOURCE3_ALPHA" }, + { 0x858B, "GL_SRC3_ALPHA" }, + { 0x858C, "GL_SOURCE4_ALPHA_ARB" }, + { 0x858C, "GL_SOURCE4_ALPHA_EXT" }, + { 0x858C, "GL_SOURCE4_ALPHA" }, + { 0x858C, "GL_SRC4_ALPHA" }, + { 0x858D, "GL_SOURCE5_ALPHA_ARB" }, + { 0x858D, "GL_SOURCE5_ALPHA_EXT" }, + { 0x858D, "GL_SOURCE5_ALPHA" }, + { 0x858D, "GL_SRC5_ALPHA" }, + { 0x858E, "GL_SOURCE6_ALPHA_ARB" }, + { 0x858E, "GL_SOURCE6_ALPHA_EXT" }, + { 0x858E, "GL_SOURCE6_ALPHA" }, + { 0x858E, "GL_SRC6_ALPHA" }, + { 0x858F, "GL_SOURCE7_ALPHA_ARB" }, + { 0x858F, "GL_SOURCE7_ALPHA_EXT" }, + { 0x858F, "GL_SOURCE7_ALPHA" }, + { 0x858F, "GL_SRC7_ALPHA" }, + { 0x8590, "GL_OPERAND0_RGB_ARB" }, + { 0x8590, "GL_OPERAND0_RGB_EXT" }, + { 0x8590, "GL_OPERAND0_RGB" }, + { 0x8591, "GL_OPERAND1_RGB_ARB" }, + { 0x8591, "GL_OPERAND1_RGB_EXT" }, + { 0x8591, "GL_OPERAND1_RGB" }, + { 0x8592, "GL_OPERAND2_RGB_ARB" }, + { 0x8592, "GL_OPERAND2_RGB_EXT" }, + { 0x8592, "GL_OPERAND2_RGB" }, + { 0x8593, "GL_OPERAND3_RGB_ARB" }, + { 0x8593, "GL_OPERAND3_RGB_EXT" }, + { 0x8593, "GL_OPERAND3_RGB" }, + { 0x8594, "GL_OPERAND4_RGB_ARB" }, + { 0x8594, "GL_OPERAND4_RGB_EXT" }, + { 0x8594, "GL_OPERAND4_RGB" }, + { 0x8595, "GL_OPERAND5_RGB_ARB" }, + { 0x8595, "GL_OPERAND5_RGB_EXT" }, + { 0x8595, "GL_OPERAND5_RGB" }, + { 0x8596, "GL_OPERAND6_RGB_ARB" }, + { 0x8596, "GL_OPERAND6_RGB_EXT" }, + { 0x8596, "GL_OPERAND6_RGB" }, + { 0x8597, "GL_OPERAND7_RGB_ARB" }, + { 0x8597, "GL_OPERAND7_RGB_EXT" }, + { 0x8597, "GL_OPERAND7_RGB" }, + { 0x8598, "GL_OPERAND0_ALPHA_ARB" }, + { 0x8598, "GL_OPERAND0_ALPHA_EXT" }, + { 0x8598, "GL_OPERAND0_ALPHA" }, + { 0x8599, "GL_OPERAND1_ALPHA_ARB" }, + { 0x8599, "GL_OPERAND1_ALPHA_EXT" }, + { 0x8599, "GL_OPERAND1_ALPHA" }, + { 0x859A, "GL_OPERAND2_ALPHA_ARB" }, + { 0x859A, "GL_OPERAND2_ALPHA_EXT" }, + { 0x859A, "GL_OPERAND2_ALPHA" }, + { 0x859B, "GL_OPERAND3_ALPHA_ARB" }, + { 0x859B, "GL_OPERAND3_ALPHA_EXT" }, + { 0x859B, "GL_OPERAND3_ALPHA" }, + { 0x859C, "GL_OPERAND4_ALPHA_ARB" }, + { 0x859C, "GL_OPERAND4_ALPHA_EXT" }, + { 0x859C, "GL_OPERAND4_ALPHA" }, + { 0x859D, "GL_OPERAND5_ALPHA_ARB" }, + { 0x859D, "GL_OPERAND5_ALPHA_EXT" }, + { 0x859D, "GL_OPERAND5_ALPHA" }, + { 0x859E, "GL_OPERAND6_ALPHA_ARB" }, + { 0x859E, "GL_OPERAND6_ALPHA_EXT" }, + { 0x859E, "GL_OPERAND6_ALPHA" }, + { 0x859F, "GL_OPERAND7_ALPHA_ARB" }, + { 0x859F, "GL_OPERAND7_ALPHA_EXT" }, + { 0x859F, "GL_OPERAND7_ALPHA" }, + { 0x85AE, "GL_PERTURB_EXT" }, + { 0x85AF, "GL_TEXTURE_NORMAL_EXT" }, + { 0x85B4, "GL_STORAGE_CLIENT_APPLE" }, + { 0x85B5, "GL_VERTEX_ARRAY_BINDING_APPLE" }, + { 0x85BD, "GL_STORAGE_PRIVATE_APPLE" }, + { 0x85BE, "GL_STORAGE_CACHED_APPLE" }, + { 0x85BF, "GL_STORAGE_SHARED_APPLE" }, + { 0x8620, "GL_VERTEX_PROGRAM_ARB" }, + { 0x8620, "GL_VERTEX_PROGRAM_NV" }, + { 0x8621, "GL_VERTEX_STATE_PROGRAM_NV" }, + { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" }, + { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" }, + { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED" }, + { 0x8623, "GL_ATTRIB_ARRAY_SIZE_NV" }, + { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" }, + { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" }, + { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE" }, + { 0x8624, "GL_ATTRIB_ARRAY_STRIDE_NV" }, + { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" }, + { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" }, + { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE" }, + { 0x8625, "GL_ATTRIB_ARRAY_TYPE_NV" }, + { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" }, + { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" }, + { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE" }, + { 0x8626, "GL_CURRENT_ATTRIB_NV" }, + { 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" }, + { 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" }, + { 0x8626, "GL_CURRENT_VERTEX_ATTRIB" }, + { 0x8627, "GL_PROGRAM_LENGTH_ARB" }, + { 0x8627, "GL_PROGRAM_LENGTH_NV" }, + { 0x8628, "GL_PROGRAM_STRING_ARB" }, + { 0x8628, "GL_PROGRAM_STRING_NV" }, + { 0x8629, "GL_MODELVIEW_PROJECTION_NV" }, + { 0x862A, "GL_IDENTITY_NV" }, + { 0x862B, "GL_INVERSE_NV" }, + { 0x862C, "GL_TRANSPOSE_NV" }, + { 0x862D, "GL_INVERSE_TRANSPOSE_NV" }, + { 0x862E, "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB" }, + { 0x862E, "GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV" }, + { 0x862F, "GL_MAX_PROGRAM_MATRICES_ARB" }, + { 0x862F, "GL_MAX_TRACK_MATRICES_NV" }, + { 0x8630, "GL_MATRIX0_NV" }, + { 0x8631, "GL_MATRIX1_NV" }, + { 0x8632, "GL_MATRIX2_NV" }, + { 0x8633, "GL_MATRIX3_NV" }, + { 0x8634, "GL_MATRIX4_NV" }, + { 0x8635, "GL_MATRIX5_NV" }, + { 0x8636, "GL_MATRIX6_NV" }, + { 0x8637, "GL_MATRIX7_NV" }, + { 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_ARB" }, + { 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_NV" }, + { 0x8641, "GL_CURRENT_MATRIX_ARB" }, + { 0x8641, "GL_CURRENT_MATRIX_NV" }, + { 0x8642, "GL_PROGRAM_POINT_SIZE_EXT" }, + { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" }, + { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" }, + { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_NV" }, + { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE" }, + { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" }, + { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" }, + { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_NV" }, + { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE" }, + { 0x8644, "GL_PROGRAM_PARAMETER_NV" }, + { 0x8645, "GL_ATTRIB_ARRAY_POINTER_NV" }, + { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" }, + { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" }, + { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER" }, + { 0x8646, "GL_PROGRAM_TARGET_NV" }, + { 0x8647, "GL_PROGRAM_RESIDENT_NV" }, + { 0x8648, "GL_TRACK_MATRIX_NV" }, + { 0x8649, "GL_TRACK_MATRIX_TRANSFORM_NV" }, + { 0x864A, "GL_VERTEX_PROGRAM_BINDING_NV" }, + { 0x864B, "GL_PROGRAM_ERROR_POSITION_ARB" }, + { 0x864B, "GL_PROGRAM_ERROR_POSITION_NV" }, + { 0x8650, "GL_VERTEX_ATTRIB_ARRAY0_NV" }, + { 0x8651, "GL_VERTEX_ATTRIB_ARRAY1_NV" }, + { 0x8652, "GL_VERTEX_ATTRIB_ARRAY2_NV" }, + { 0x8653, "GL_VERTEX_ATTRIB_ARRAY3_NV" }, + { 0x8654, "GL_VERTEX_ATTRIB_ARRAY4_NV" }, + { 0x8655, "GL_VERTEX_ATTRIB_ARRAY5_NV" }, + { 0x8656, "GL_VERTEX_ATTRIB_ARRAY6_NV" }, + { 0x8657, "GL_VERTEX_ATTRIB_ARRAY7_NV" }, + { 0x8658, "GL_VERTEX_ATTRIB_ARRAY8_NV" }, + { 0x8659, "GL_VERTEX_ATTRIB_ARRAY9_NV" }, + { 0x865A, "GL_VERTEX_ATTRIB_ARRAY10_NV" }, + { 0x865B, "GL_VERTEX_ATTRIB_ARRAY11_NV" }, + { 0x865C, "GL_VERTEX_ATTRIB_ARRAY12_NV" }, + { 0x865D, "GL_VERTEX_ATTRIB_ARRAY13_NV" }, + { 0x865E, "GL_VERTEX_ATTRIB_ARRAY14_NV" }, + { 0x865F, "GL_VERTEX_ATTRIB_ARRAY15_NV" }, + { 0x8660, "GL_MAP1_VERTEX_ATTRIB0_4_NV" }, + { 0x8661, "GL_MAP1_VERTEX_ATTRIB1_4_NV" }, + { 0x8662, "GL_MAP1_VERTEX_ATTRIB2_4_NV" }, + { 0x8663, "GL_MAP1_VERTEX_ATTRIB3_4_NV" }, + { 0x8664, "GL_MAP1_VERTEX_ATTRIB4_4_NV" }, + { 0x8665, "GL_MAP1_VERTEX_ATTRIB5_4_NV" }, + { 0x8666, "GL_MAP1_VERTEX_ATTRIB6_4_NV" }, + { 0x8667, "GL_MAP1_VERTEX_ATTRIB7_4_NV" }, + { 0x8668, "GL_MAP1_VERTEX_ATTRIB8_4_NV" }, + { 0x8669, "GL_MAP1_VERTEX_ATTRIB9_4_NV" }, + { 0x866A, "GL_MAP1_VERTEX_ATTRIB10_4_NV" }, + { 0x866B, "GL_MAP1_VERTEX_ATTRIB11_4_NV" }, + { 0x866C, "GL_MAP1_VERTEX_ATTRIB12_4_NV" }, + { 0x866D, "GL_MAP1_VERTEX_ATTRIB13_4_NV" }, + { 0x866E, "GL_MAP1_VERTEX_ATTRIB14_4_NV" }, + { 0x866F, "GL_MAP1_VERTEX_ATTRIB15_4_NV" }, + { 0x8670, "GL_MAP2_VERTEX_ATTRIB0_4_NV" }, + { 0x8671, "GL_MAP2_VERTEX_ATTRIB1_4_NV" }, + { 0x8672, "GL_MAP2_VERTEX_ATTRIB2_4_NV" }, + { 0x8673, "GL_MAP2_VERTEX_ATTRIB3_4_NV" }, + { 0x8674, "GL_MAP2_VERTEX_ATTRIB4_4_NV" }, + { 0x8675, "GL_MAP2_VERTEX_ATTRIB5_4_NV" }, + { 0x8676, "GL_MAP2_VERTEX_ATTRIB6_4_NV" }, + { 0x8677, "GL_MAP2_VERTEX_ATTRIB7_4_NV" }, + { 0x8677, "GL_PROGRAM_BINDING_ARB" }, + { 0x8677, "GL_PROGRAM_NAME_ARB" }, + { 0x8678, "GL_MAP2_VERTEX_ATTRIB8_4_NV" }, + { 0x8679, "GL_MAP2_VERTEX_ATTRIB9_4_NV" }, + { 0x867A, "GL_MAP2_VERTEX_ATTRIB10_4_NV" }, + { 0x867B, "GL_MAP2_VERTEX_ATTRIB11_4_NV" }, + { 0x867C, "GL_MAP2_VERTEX_ATTRIB12_4_NV" }, + { 0x867D, "GL_MAP2_VERTEX_ATTRIB13_4_NV" }, + { 0x867E, "GL_MAP2_VERTEX_ATTRIB14_4_NV" }, + { 0x867F, "GL_MAP2_VERTEX_ATTRIB15_4_NV" }, + { 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB" }, + { 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE" }, + { 0x86A1, "GL_TEXTURE_COMPRESSED_ARB" }, + { 0x86A1, "GL_TEXTURE_COMPRESSED" }, + { 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB" }, + { 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS" }, + { 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS_ARB" }, + { 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS" }, + { 0x86A4, "GL_MAX_VERTEX_UNITS_ARB" }, + { 0x86A5, "GL_ACTIVE_VERTEX_UNITS_ARB" }, + { 0x86A6, "GL_WEIGHT_SUM_UNITY_ARB" }, + { 0x86A7, "GL_VERTEX_BLEND_ARB" }, + { 0x86A8, "GL_CURRENT_WEIGHT_ARB" }, + { 0x86A9, "GL_WEIGHT_ARRAY_TYPE_ARB" }, + { 0x86AA, "GL_WEIGHT_ARRAY_STRIDE_ARB" }, + { 0x86AB, "GL_WEIGHT_ARRAY_SIZE_ARB" }, + { 0x86AC, "GL_WEIGHT_ARRAY_POINTER_ARB" }, + { 0x86AD, "GL_WEIGHT_ARRAY_ARB" }, + { 0x86AE, "GL_DOT3_RGB_ARB" }, + { 0x86AE, "GL_DOT3_RGB" }, + { 0x86AF, "GL_DOT3_RGBA_ARB" }, + { 0x86AF, "GL_DOT3_RGBA" }, + { 0x8722, "GL_MODELVIEW2_ARB" }, + { 0x8723, "GL_MODELVIEW3_ARB" }, + { 0x8724, "GL_MODELVIEW4_ARB" }, + { 0x8725, "GL_MODELVIEW5_ARB" }, + { 0x8726, "GL_MODELVIEW6_ARB" }, + { 0x8727, "GL_MODELVIEW7_ARB" }, + { 0x8728, "GL_MODELVIEW8_ARB" }, + { 0x8729, "GL_MODELVIEW9_ARB" }, + { 0x872A, "GL_MODELVIEW10_ARB" }, + { 0x872B, "GL_MODELVIEW11_ARB" }, + { 0x872C, "GL_MODELVIEW12_ARB" }, + { 0x872D, "GL_MODELVIEW13_ARB" }, + { 0x872E, "GL_MODELVIEW14_ARB" }, + { 0x872F, "GL_MODELVIEW15_ARB" }, + { 0x8730, "GL_MODELVIEW16_ARB" }, + { 0x8731, "GL_MODELVIEW17_ARB" }, + { 0x8732, "GL_MODELVIEW18_ARB" }, + { 0x8733, "GL_MODELVIEW19_ARB" }, + { 0x8734, "GL_MODELVIEW20_ARB" }, + { 0x8735, "GL_MODELVIEW21_ARB" }, + { 0x8736, "GL_MODELVIEW22_ARB" }, + { 0x8737, "GL_MODELVIEW23_ARB" }, + { 0x8738, "GL_MODELVIEW24_ARB" }, + { 0x8739, "GL_MODELVIEW25_ARB" }, + { 0x873A, "GL_MODELVIEW26_ARB" }, + { 0x873B, "GL_MODELVIEW27_ARB" }, + { 0x873C, "GL_MODELVIEW28_ARB" }, + { 0x873D, "GL_MODELVIEW29_ARB" }, + { 0x873E, "GL_MODELVIEW30_ARB" }, + { 0x873F, "GL_MODELVIEW31_ARB" }, + { 0x8742, "GL_MIRROR_CLAMP_EXT" }, + { 0x8743, "GL_MIRROR_CLAMP_TO_EDGE_EXT" }, + { 0x8764, "GL_BUFFER_SIZE_ARB" }, + { 0x8764, "GL_BUFFER_SIZE" }, + { 0x8765, "GL_BUFFER_USAGE_ARB" }, + { 0x8765, "GL_BUFFER_USAGE" }, + { 0x8780, "GL_VERTEX_SHADER_EXT" }, + { 0x8781, "GL_VERTEX_SHADER_BINDING_EXT" }, + { 0x8782, "GL_OP_INDEX_EXT" }, + { 0x8783, "GL_OP_NEGATE_EXT" }, + { 0x8784, "GL_OP_DOT3_EXT" }, + { 0x8785, "GL_OP_DOT4_EXT" }, + { 0x8786, "GL_OP_MUL_EXT" }, + { 0x8787, "GL_OP_ADD_EXT" }, + { 0x8788, "GL_OP_MADD_EXT" }, + { 0x8789, "GL_OP_FRAC_EXT" }, + { 0x878A, "GL_OP_MAX_EXT" }, + { 0x878B, "GL_OP_MIN_EXT" }, + { 0x878C, "GL_OP_SET_GE_EXT" }, + { 0x878D, "GL_OP_SET_LT_EXT" }, + { 0x878E, "GL_OP_CLAMP_EXT" }, + { 0x878F, "GL_OP_FLOOR_EXT" }, + { 0x8790, "GL_OP_ROUND_EXT" }, + { 0x8791, "GL_OP_EXP_BASE_2_EXT" }, + { 0x8792, "GL_OP_LOG_BASE_2_EXT" }, + { 0x8793, "GL_OP_POWER_EXT" }, + { 0x8794, "GL_OP_RECIP_EXT" }, + { 0x8795, "GL_OP_RECIP_SQRT_EXT" }, + { 0x8796, "GL_OP_SUB_EXT" }, + { 0x8797, "GL_OP_CROSS_PRODUCT_EXT" }, + { 0x8798, "GL_OP_MULTIPLY_MATRIX_EXT" }, + { 0x8799, "GL_OP_MOV_EXT" }, + { 0x879A, "GL_OUTPUT_VERTEX_EXT" }, + { 0x879B, "GL_OUTPUT_COLOR0_EXT" }, + { 0x879C, "GL_OUTPUT_COLOR1_EXT" }, + { 0x879D, "GL_OUTPUT_TEXTURE_COORD0_EXT" }, + { 0x879E, "GL_OUTPUT_TEXTURE_COORD1_EXT" }, + { 0x879F, "GL_OUTPUT_TEXTURE_COORD2_EXT" }, + { 0x87A0, "GL_OUTPUT_TEXTURE_COORD3_EXT" }, + { 0x87A1, "GL_OUTPUT_TEXTURE_COORD4_EXT" }, + { 0x87A2, "GL_OUTPUT_TEXTURE_COORD5_EXT" }, + { 0x87A3, "GL_OUTPUT_TEXTURE_COORD6_EXT" }, + { 0x87A4, "GL_OUTPUT_TEXTURE_COORD7_EXT" }, + { 0x87A5, "GL_OUTPUT_TEXTURE_COORD8_EXT" }, + { 0x87A6, "GL_OUTPUT_TEXTURE_COORD9_EXT" }, + { 0x87A7, "GL_OUTPUT_TEXTURE_COORD10_EXT" }, + { 0x87A8, "GL_OUTPUT_TEXTURE_COORD11_EXT" }, + { 0x87A9, "GL_OUTPUT_TEXTURE_COORD12_EXT" }, + { 0x87AA, "GL_OUTPUT_TEXTURE_COORD13_EXT" }, + { 0x87AB, "GL_OUTPUT_TEXTURE_COORD14_EXT" }, + { 0x87AC, "GL_OUTPUT_TEXTURE_COORD15_EXT" }, + { 0x87AD, "GL_OUTPUT_TEXTURE_COORD16_EXT" }, + { 0x87AE, "GL_OUTPUT_TEXTURE_COORD17_EXT" }, + { 0x87AF, "GL_OUTPUT_TEXTURE_COORD18_EXT" }, + { 0x87B0, "GL_OUTPUT_TEXTURE_COORD19_EXT" }, + { 0x87B1, "GL_OUTPUT_TEXTURE_COORD20_EXT" }, + { 0x87B2, "GL_OUTPUT_TEXTURE_COORD21_EXT" }, + { 0x87B3, "GL_OUTPUT_TEXTURE_COORD22_EXT" }, + { 0x87B4, "GL_OUTPUT_TEXTURE_COORD23_EXT" }, + { 0x87B5, "GL_OUTPUT_TEXTURE_COORD24_EXT" }, + { 0x87B6, "GL_OUTPUT_TEXTURE_COORD25_EXT" }, + { 0x87B7, "GL_OUTPUT_TEXTURE_COORD26_EXT" }, + { 0x87B8, "GL_OUTPUT_TEXTURE_COORD27_EXT" }, + { 0x87B9, "GL_OUTPUT_TEXTURE_COORD28_EXT" }, + { 0x87BA, "GL_OUTPUT_TEXTURE_COORD29_EXT" }, + { 0x87BB, "GL_OUTPUT_TEXTURE_COORD30_EXT" }, + { 0x87BC, "GL_OUTPUT_TEXTURE_COORD31_EXT" }, + { 0x87BD, "GL_OUTPUT_FOG_EXT" }, + { 0x87BE, "GL_SCALAR_EXT" }, + { 0x87BF, "GL_VECTOR_EXT" }, + { 0x87C0, "GL_MATRIX_EXT" }, + { 0x87C1, "GL_VARIANT_EXT" }, + { 0x87C2, "GL_INVARIANT_EXT" }, + { 0x87C3, "GL_LOCAL_CONSTANT_EXT" }, + { 0x87C4, "GL_LOCAL_EXT" }, + { 0x87C5, "GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT" }, + { 0x87C6, "GL_MAX_VERTEX_SHADER_VARIANTS_EXT" }, + { 0x87C7, "GL_MAX_VERTEX_SHADER_INVARIANTS_EXT" }, + { 0x87C8, "GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" }, + { 0x87C9, "GL_MAX_VERTEX_SHADER_LOCALS_EXT" }, + { 0x87CA, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT" }, + { 0x87CB, "GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT" }, + { 0x87CC, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" }, + { 0x87CD, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT" }, + { 0x87CE, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT" }, + { 0x87CF, "GL_VERTEX_SHADER_INSTRUCTIONS_EXT" }, + { 0x87D0, "GL_VERTEX_SHADER_VARIANTS_EXT" }, + { 0x87D1, "GL_VERTEX_SHADER_INVARIANTS_EXT" }, + { 0x87D2, "GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" }, + { 0x87D3, "GL_VERTEX_SHADER_LOCALS_EXT" }, + { 0x87D4, "GL_VERTEX_SHADER_OPTIMIZED_EXT" }, + { 0x87D5, "GL_X_EXT" }, + { 0x87D6, "GL_Y_EXT" }, + { 0x87D7, "GL_Z_EXT" }, + { 0x87D8, "GL_W_EXT" }, + { 0x87D9, "GL_NEGATIVE_X_EXT" }, + { 0x87DA, "GL_NEGATIVE_Y_EXT" }, + { 0x87DB, "GL_NEGATIVE_Z_EXT" }, + { 0x87DC, "GL_NEGATIVE_W_EXT" }, + { 0x87DF, "GL_NEGATIVE_ONE_EXT" }, + { 0x87E0, "GL_NORMALIZED_RANGE_EXT" }, + { 0x87E1, "GL_FULL_RANGE_EXT" }, + { 0x87E2, "GL_CURRENT_VERTEX_EXT" }, + { 0x87E3, "GL_MVP_MATRIX_EXT" }, + { 0x87E4, "GL_VARIANT_VALUE_EXT" }, + { 0x87E5, "GL_VARIANT_DATATYPE_EXT" }, + { 0x87E6, "GL_VARIANT_ARRAY_STRIDE_EXT" }, + { 0x87E7, "GL_VARIANT_ARRAY_TYPE_EXT" }, + { 0x87E8, "GL_VARIANT_ARRAY_EXT" }, + { 0x87E9, "GL_VARIANT_ARRAY_POINTER_EXT" }, + { 0x87EA, "GL_INVARIANT_VALUE_EXT" }, + { 0x87EB, "GL_INVARIANT_DATATYPE_EXT" }, + { 0x87EC, "GL_LOCAL_CONSTANT_VALUE_EXT" }, + { 0x87Ed, "GL_LOCAL_CONSTANT_DATATYPE_EXT" }, + { 0x8800, "GL_STENCIL_BACK_FUNC_ATI" }, + { 0x8800, "GL_STENCIL_BACK_FUNC" }, + { 0x8801, "GL_STENCIL_BACK_FAIL_ATI" }, + { 0x8801, "GL_STENCIL_BACK_FAIL" }, + { 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI" }, + { 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL" }, + { 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI" }, + { 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS" }, + { 0x8804, "GL_FRAGMENT_PROGRAM_ARB" }, + { 0x8805, "GL_PROGRAM_ALU_INSTRUCTIONS_ARB" }, + { 0x8806, "GL_PROGRAM_TEX_INSTRUCTIONS_ARB" }, + { 0x8807, "GL_PROGRAM_TEX_INDIRECTIONS_ARB" }, + { 0x8808, "GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" }, + { 0x8809, "GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" }, + { 0x880A, "GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" }, + { 0x880B, "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB" }, + { 0x880C, "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB" }, + { 0x880D, "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB" }, + { 0x880E, "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" }, + { 0x880F, "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" }, + { 0x8810, "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" }, + { 0x8814, "GL_RGBA_FLOAT32_APPLE" }, + { 0x8814, "GL_RGBA_FLOAT32_ATI" }, + { 0x8814, "GL_RGBA32F_ARB" }, + { 0x8815, "GL_RGB_FLOAT32_APPLE" }, + { 0x8815, "GL_RGB_FLOAT32_ATI" }, + { 0x8815, "GL_RGB32F_ARB" }, + { 0x8816, "GL_ALPHA_FLOAT32_APPLE" }, + { 0x8816, "GL_ALPHA_FLOAT32_ATI" }, + { 0x8816, "GL_ALPHA32F_ARB" }, + { 0x8817, "GL_INTENSITY_FLOAT32_APPLE" }, + { 0x8817, "GL_INTENSITY_FLOAT32_ATI" }, + { 0x8817, "GL_INTENSITY32F_ARB" }, + { 0x8818, "GL_LUMINANCE_FLOAT32_APPLE" }, + { 0x8818, "GL_LUMINANCE_FLOAT32_ATI" }, + { 0x8818, "GL_LUMINANCE32F_ARB" }, + { 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_APPLE" }, + { 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_ATI" }, + { 0x8819, "GL_LUMINANCE_ALPHA32F_ARB" }, + { 0x881A, "GL_RGBA_FLOAT16_APPLE" }, + { 0x881A, "GL_RGBA_FLOAT16_ATI" }, + { 0x881A, "GL_RGBA16F_ARB" }, + { 0x881B, "GL_RGB_FLOAT16_APPLE" }, + { 0x881B, "GL_RGB_FLOAT16_ATI" }, + { 0x881B, "GL_RGB16F_ARB" }, + { 0x881C, "GL_ALPHA_FLOAT16_APPLE" }, + { 0x881C, "GL_ALPHA_FLOAT16_ATI" }, + { 0x881C, "GL_ALPHA16F_ARB" }, + { 0x881D, "GL_INTENSITY_FLOAT16_APPLE" }, + { 0x881D, "GL_INTENSITY_FLOAT16_ATI" }, + { 0x881D, "GL_INTENSITY16F_ARB" }, + { 0x881E, "GL_LUMINANCE_FLOAT16_APPLE" }, + { 0x881E, "GL_LUMINANCE_FLOAT16_ATI" }, + { 0x881E, "GL_LUMINANCE16F_ARB" }, + { 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_APPLE" }, + { 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_ATI" }, + { 0x881F, "GL_LUMINANCE_ALPHA16F_ARB" }, + { 0x8820, "GL_RGBA_FLOAT_MODE_ARB" }, + { 0x8824, "GL_MAX_DRAW_BUFFERS_ARB" }, + { 0x8824, "GL_MAX_DRAW_BUFFERS" }, + { 0x8825, "GL_DRAW_BUFFER0_ARB" }, + { 0x8825, "GL_DRAW_BUFFER0" }, + { 0x8826, "GL_DRAW_BUFFER1_ARB" }, + { 0x8826, "GL_DRAW_BUFFER1" }, + { 0x8827, "GL_DRAW_BUFFER2_ARB" }, + { 0x8827, "GL_DRAW_BUFFER2" }, + { 0x8828, "GL_DRAW_BUFFER3_ARB" }, + { 0x8828, "GL_DRAW_BUFFER3" }, + { 0x8829, "GL_DRAW_BUFFER4_ARB" }, + { 0x8829, "GL_DRAW_BUFFER4" }, + { 0x882A, "GL_DRAW_BUFFER5_ARB" }, + { 0x882A, "GL_DRAW_BUFFER5" }, + { 0x882B, "GL_DRAW_BUFFER6_ARB" }, + { 0x882B, "GL_DRAW_BUFFER6" }, + { 0x882C, "GL_DRAW_BUFFER7_ARB" }, + { 0x882C, "GL_DRAW_BUFFER7" }, + { 0x882D, "GL_DRAW_BUFFER8_ARB" }, + { 0x882D, "GL_DRAW_BUFFER8" }, + { 0x882E, "GL_DRAW_BUFFER9_ARB" }, + { 0x882E, "GL_DRAW_BUFFER9" }, + { 0x882F, "GL_DRAW_BUFFER10_ARB" }, + { 0x882F, "GL_DRAW_BUFFER10" }, + { 0x8830, "GL_DRAW_BUFFER11_ARB" }, + { 0x8830, "GL_DRAW_BUFFER11" }, + { 0x8831, "GL_DRAW_BUFFER12_ARB" }, + { 0x8831, "GL_DRAW_BUFFER12" }, + { 0x8832, "GL_DRAW_BUFFER13_ARB" }, + { 0x8832, "GL_DRAW_BUFFER13" }, + { 0x8833, "GL_DRAW_BUFFER14_ARB" }, + { 0x8833, "GL_DRAW_BUFFER14" }, + { 0x8834, "GL_DRAW_BUFFER15_ARB" }, + { 0x8834, "GL_DRAW_BUFFER15" }, + { 0x883D, "GL_ALPHA_BLEND_EQUATION_ATI" }, + { 0x883D, "GL_BLEND_EQUATION_ALPHA_EXT" }, + { 0x883D, "GL_BLEND_EQUATION_ALPHA" }, + { 0x884A, "GL_TEXTURE_DEPTH_SIZE_ARB" }, + { 0x884A, "GL_TEXTURE_DEPTH_SIZE" }, + { 0x884B, "GL_DEPTH_TEXTURE_MODE_ARB" }, + { 0x884B, "GL_DEPTH_TEXTURE_MODE" }, + { 0x884C, "GL_TEXTURE_COMPARE_MODE_ARB" }, + { 0x884C, "GL_TEXTURE_COMPARE_MODE" }, + { 0x884D, "GL_TEXTURE_COMPARE_FUNC_ARB" }, + { 0x884D, "GL_TEXTURE_COMPARE_FUNC" }, + { 0x884E, "GL_COMPARE_R_TO_TEXTURE_ARB" }, + { 0x884E, "GL_COMPARE_R_TO_TEXTURE" }, + { 0x884E, "GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT" }, + { 0x8861, "GL_POINT_SPRITE_ARB" }, + { 0x8861, "GL_POINT_SPRITE" }, + { 0x8862, "GL_COORD_REPLACE_ARB" }, + { 0x8862, "GL_COORD_REPLACE" }, + { 0x8864, "GL_QUERY_COUNTER_BITS_ARB" }, + { 0x8864, "GL_QUERY_COUNTER_BITS" }, + { 0x8865, "GL_CURRENT_QUERY_ARB" }, + { 0x8865, "GL_CURRENT_QUERY" }, + { 0x8866, "GL_QUERY_RESULT_ARB" }, + { 0x8866, "GL_QUERY_RESULT" }, + { 0x8867, "GL_QUERY_RESULT_AVAILABLE_ARB" }, + { 0x8867, "GL_QUERY_RESULT_AVAILABLE" }, + { 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" }, + { 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" }, + { 0x8869, "GL_MAX_VERTEX_ATTRIBS" }, + { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" }, + { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" }, + { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED" }, + { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" }, + { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" }, + { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" }, + { 0x8871, "GL_MAX_TEXTURE_COORDS" }, + { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, + { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, + { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, + { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS" }, + { 0x8874, "GL_PROGRAM_ERROR_STRING_ARB" }, + { 0x8875, "GL_PROGRAM_FORMAT_ASCII_ARB" }, + { 0x8876, "GL_PROGRAM_FORMAT_ARB" }, + { 0x8890, "GL_DEPTH_BOUNDS_TEST_EXT" }, + { 0x8891, "GL_DEPTH_BOUNDS_EXT" }, + { 0x8892, "GL_ARRAY_BUFFER_ARB" }, + { 0x8892, "GL_ARRAY_BUFFER" }, + { 0x8893, "GL_ELEMENT_ARRAY_BUFFER_ARB" }, + { 0x8893, "GL_ELEMENT_ARRAY_BUFFER" }, + { 0x8894, "GL_ARRAY_BUFFER_BINDING_ARB" }, + { 0x8894, "GL_ARRAY_BUFFER_BINDING" }, + { 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB" }, + { 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING" }, + { 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB" }, + { 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING" }, + { 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB" }, + { 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING" }, + { 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING_ARB" }, + { 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING" }, + { 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING_ARB" }, + { 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING" }, + { 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB" }, + { 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING" }, + { 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB" }, + { 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING" }, + { 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB" }, + { 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING" }, + { 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING_ARB" }, + { 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING" }, + { 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB" }, + { 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING" }, + { 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB" }, + { 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING" }, + { 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB" }, + { 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING" }, + { 0x88A0, "GL_PROGRAM_INSTRUCTIONS_ARB" }, + { 0x88A1, "GL_MAX_PROGRAM_INSTRUCTIONS_ARB" }, + { 0x88A2, "GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB" }, + { 0x88A3, "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB" }, + { 0x88A4, "GL_PROGRAM_TEMPORARIES_ARB" }, + { 0x88A5, "GL_MAX_PROGRAM_TEMPORARIES_ARB" }, + { 0x88A6, "GL_PROGRAM_NATIVE_TEMPORARIES_ARB" }, + { 0x88A7, "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB" }, + { 0x88A8, "GL_PROGRAM_PARAMETERS_ARB" }, + { 0x88A9, "GL_MAX_PROGRAM_PARAMETERS_ARB" }, + { 0x88AA, "GL_PROGRAM_NATIVE_PARAMETERS_ARB" }, + { 0x88AB, "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB" }, + { 0x88AC, "GL_PROGRAM_ATTRIBS_ARB" }, + { 0x88AD, "GL_MAX_PROGRAM_ATTRIBS_ARB" }, + { 0x88AE, "GL_PROGRAM_NATIVE_ATTRIBS_ARB" }, + { 0x88AF, "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB" }, + { 0x88B0, "GL_PROGRAM_ADDRESS_REGISTERS_ARB" }, + { 0x88B1, "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB" }, + { 0x88B2, "GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" }, + { 0x88B3, "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" }, + { 0x88B4, "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB" }, + { 0x88B5, "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB" }, + { 0x88B6, "GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB" }, + { 0x88B7, "GL_TRANSPOSE_CURRENT_MATRIX_ARB" }, + { 0x88B8, "GL_READ_ONLY_ARB" }, + { 0x88B8, "GL_READ_ONLY" }, + { 0x88B9, "GL_WRITE_ONLY_ARB" }, + { 0x88B9, "GL_WRITE_ONLY" }, + { 0x88BA, "GL_READ_WRITE_ARB" }, + { 0x88BA, "GL_READ_WRITE" }, + { 0x88BB, "GL_BUFFER_ACCESS_ARB" }, + { 0x88BB, "GL_BUFFER_ACCESS" }, + { 0x88BC, "GL_BUFFER_MAPPED_ARB" }, + { 0x88BC, "GL_BUFFER_MAPPED" }, + { 0x88BD, "GL_BUFFER_MAP_POINTER_ARB" }, + { 0x88BD, "GL_BUFFER_MAP_POINTER" }, + { 0x88C0, "GL_MATRIX0_ARB" }, + { 0x88C1, "GL_MATRIX1_ARB" }, + { 0x88C2, "GL_MATRIX2_ARB" }, + { 0x88C3, "GL_MATRIX3_ARB" }, + { 0x88C4, "GL_MATRIX4_ARB" }, + { 0x88C5, "GL_MATRIX5_ARB" }, + { 0x88C6, "GL_MATRIX6_ARB" }, + { 0x88C7, "GL_MATRIX7_ARB" }, + { 0x88C8, "GL_MATRIX8_ARB" }, + { 0x88C9, "GL_MATRIX9_ARB" }, + { 0x88CA, "GL_MATRIX10_ARB" }, + { 0x88CB, "GL_MATRIX11_ARB" }, + { 0x88CC, "GL_MATRIX12_ARB" }, + { 0x88CD, "GL_MATRIX13_ARB" }, + { 0x88CE, "GL_MATRIX14_ARB" }, + { 0x88CF, "GL_MATRIX15_ARB" }, + { 0x88D0, "GL_MATRIX16_ARB" }, + { 0x88D1, "GL_MATRIX17_ARB" }, + { 0x88D2, "GL_MATRIX18_ARB" }, + { 0x88D3, "GL_MATRIX19_ARB" }, + { 0x88D4, "GL_MATRIX20_ARB" }, + { 0x88D5, "GL_MATRIX21_ARB" }, + { 0x88D6, "GL_MATRIX22_ARB" }, + { 0x88D7, "GL_MATRIX23_ARB" }, + { 0x88D8, "GL_MATRIX24_ARB" }, + { 0x88D9, "GL_MATRIX25_ARB" }, + { 0x88DA, "GL_MATRIX26_ARB" }, + { 0x88DB, "GL_MATRIX27_ARB" }, + { 0x88DC, "GL_MATRIX28_ARB" }, + { 0x88DD, "GL_MATRIX29_ARB" }, + { 0x88DE, "GL_MATRIX30_ARB" }, + { 0x88DF, "GL_MATRIX31_ARB" }, + { 0x88E0, "GL_STREAM_DRAW_ARB" }, + { 0x88E0, "GL_STREAM_DRAW" }, + { 0x88E1, "GL_STREAM_READ_ARB" }, + { 0x88E1, "GL_STREAM_READ" }, + { 0x88E2, "GL_STREAM_COPY_ARB" }, + { 0x88E2, "GL_STREAM_COPY" }, + { 0x88E4, "GL_STATIC_DRAW_ARB" }, + { 0x88E4, "GL_STATIC_DRAW" }, + { 0x88E5, "GL_STATIC_READ_ARB" }, + { 0x88E5, "GL_STATIC_READ" }, + { 0x88E6, "GL_STATIC_COPY_ARB" }, + { 0x88E6, "GL_STATIC_COPY" }, + { 0x88E8, "GL_DYNAMIC_DRAW_ARB" }, + { 0x88E8, "GL_DYNAMIC_DRAW" }, + { 0x88E9, "GL_DYNAMIC_READ_ARB" }, + { 0x88E9, "GL_DYNAMIC_READ" }, + { 0x88EA, "GL_DYNAMIC_COPY_ARB" }, + { 0x88EA, "GL_DYNAMIC_COPY" }, + { 0x88EB, "GL_PIXEL_PACK_BUFFER_ARB" }, + { 0x88EB, "GL_PIXEL_PACK_BUFFER" }, + { 0x88EC, "GL_PIXEL_UNPACK_BUFFER_ARB" }, + { 0x88EC, "GL_PIXEL_UNPACK_BUFFER" }, + { 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING_ARB" }, + { 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING" }, + { 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING_ARB" }, + { 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING" }, + { 0x88F0, "GL_DEPTH24_STENCIL8_EXT" }, + { 0x88F0, "GL_DEPTH24_STENCIL8" }, + { 0x88F1, "GL_TEXTURE_STENCIL_SIZE_EXT" }, + { 0x88F1, "GL_TEXTURE_STENCIL_SIZE" }, + { 0x88FD, "GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT" }, + { 0x88FE, "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB" }, + { 0x88FF, "GL_MAX_ARRAY_TEXTURE_LAYERS_EXT" }, + { 0x8904, "GL_MIN_PROGRAM_TEXEL_OFFSET_EXT" }, + { 0x8905, "GL_MAX_PROGRAM_TEXEL_OFFSET_EXT" }, + { 0x8910, "GL_STENCIL_TEST_TWO_SIDE_EXT" }, + { 0x8911, "GL_ACTIVE_STENCIL_FACE_EXT" }, + { 0x8912, "GL_MIRROR_CLAMP_TO_BORDER_EXT" }, + { 0x8914, "GL_SAMPLES_PASSED_ARB" }, + { 0x8914, "GL_SAMPLES_PASSED" }, + { 0x891A, "GL_CLAMP_VERTEX_COLOR_ARB" }, + { 0x891B, "GL_CLAMP_FRAGMENT_COLOR_ARB" }, + { 0x891C, "GL_CLAMP_READ_COLOR_ARB" }, + { 0x891D, "GL_FIXED_ONLY_ARB" }, + { 0x8920, "GL_FRAGMENT_SHADER_EXT" }, + { 0x896D, "GL_SECONDARY_INTERPOLATOR_EXT" }, + { 0x896E, "GL_NUM_FRAGMENT_REGISTERS_EXT" }, + { 0x896F, "GL_NUM_FRAGMENT_CONSTANTS_EXT" }, + { 0x8A0C, "GL_ELEMENT_ARRAY_APPLE" }, + { 0x8A0D, "GL_ELEMENT_ARRAY_TYPE_APPLE" }, + { 0x8A0E, "GL_ELEMENT_ARRAY_POINTER_APPLE" }, + { 0x8A0F, "GL_COLOR_FLOAT_APPLE" }, + { 0x8A11, "GL_UNIFORM_BUFFER" }, + { 0x8A28, "GL_UNIFORM_BUFFER_BINDING" }, + { 0x8A29, "GL_UNIFORM_BUFFER_START" }, + { 0x8A2A, "GL_UNIFORM_BUFFER_SIZE" }, + { 0x8A2B, "GL_MAX_VERTEX_UNIFORM_BLOCKS" }, + { 0x8A2C, "GL_MAX_GEOMETRY_UNIFORM_BLOCKS" }, + { 0x8A2D, "GL_MAX_FRAGMENT_UNIFORM_BLOCKS" }, + { 0x8A2E, "GL_MAX_COMBINED_UNIFORM_BLOCKS" }, + { 0x8A2F, "GL_MAX_UNIFORM_BUFFER_BINDINGS" }, + { 0x8A30, "GL_MAX_UNIFORM_BLOCK_SIZE" }, + { 0x8A31, "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS" }, + { 0x8A32, "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS" }, + { 0x8A33, "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS" }, + { 0x8A34, "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT" }, + { 0x8A35, "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH" }, + { 0x8A36, "GL_ACTIVE_UNIFORM_BLOCKS" }, + { 0x8A37, "GL_UNIFORM_TYPE" }, + { 0x8A38, "GL_UNIFORM_SIZE" }, + { 0x8A39, "GL_UNIFORM_NAME_LENGTH" }, + { 0x8A3A, "GL_UNIFORM_BLOCK_INDEX" }, + { 0x8A3B, "GL_UNIFORM_OFFSET" }, + { 0x8A3C, "GL_UNIFORM_ARRAY_STRIDE" }, + { 0x8A3D, "GL_UNIFORM_MATRIX_STRIDE" }, + { 0x8A3E, "GL_UNIFORM_IS_ROW_MAJOR" }, + { 0x8A3F, "GL_UNIFORM_BLOCK_BINDING" }, + { 0x8A40, "GL_UNIFORM_BLOCK_DATA_SIZE" }, + { 0x8A41, "GL_UNIFORM_BLOCK_NAME_LENGTH" }, + { 0x8A42, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS" }, + { 0x8A43, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES" }, + { 0x8A44, "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER" }, + { 0x8A45, "GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER" }, + { 0x8A46, "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER" }, + { 0x8B30, "GL_FRAGMENT_SHADER_ARB" }, + { 0x8B30, "GL_FRAGMENT_SHADER" }, + { 0x8B31, "GL_VERTEX_SHADER_ARB" }, + { 0x8B31, "GL_VERTEX_SHADER" }, + { 0x8B40, "GL_PROGRAM_OBJECT_ARB" }, + { 0x8B48, "GL_SHADER_OBJECT_ARB" }, + { 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB" }, + { 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS" }, + { 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB" }, + { 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS" }, + { 0x8B4B, "GL_MAX_VARYING_COMPONENTS_EXT" }, + { 0x8B4B, "GL_MAX_VARYING_FLOATS_ARB" }, + { 0x8B4B, "GL_MAX_VARYING_FLOATS" }, + { 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB" }, + { 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS" }, + { 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB" }, + { 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS" }, + { 0x8B4E, "GL_OBJECT_TYPE_ARB" }, + { 0x8B4F, "GL_OBJECT_SUBTYPE_ARB" }, + { 0x8B4F, "GL_SHADER_TYPE" }, + { 0x8B50, "GL_FLOAT_VEC2_ARB" }, + { 0x8B50, "GL_FLOAT_VEC2" }, + { 0x8B51, "GL_FLOAT_VEC3_ARB" }, + { 0x8B51, "GL_FLOAT_VEC3" }, + { 0x8B52, "GL_FLOAT_VEC4_ARB" }, + { 0x8B52, "GL_FLOAT_VEC4" }, + { 0x8B53, "GL_INT_VEC2_ARB" }, + { 0x8B53, "GL_INT_VEC2" }, + { 0x8B54, "GL_INT_VEC3_ARB" }, + { 0x8B54, "GL_INT_VEC3" }, + { 0x8B55, "GL_INT_VEC4_ARB" }, + { 0x8B55, "GL_INT_VEC4" }, + { 0x8B56, "GL_BOOL_ARB" }, + { 0x8B56, "GL_BOOL" }, + { 0x8B57, "GL_BOOL_VEC2_ARB" }, + { 0x8B57, "GL_BOOL_VEC2" }, + { 0x8B58, "GL_BOOL_VEC3_ARB" }, + { 0x8B58, "GL_BOOL_VEC3" }, + { 0x8B59, "GL_BOOL_VEC4_ARB" }, + { 0x8B59, "GL_BOOL_VEC4" }, + { 0x8B5A, "GL_FLOAT_MAT2_ARB" }, + { 0x8B5A, "GL_FLOAT_MAT2" }, + { 0x8B5B, "GL_FLOAT_MAT3_ARB" }, + { 0x8B5B, "GL_FLOAT_MAT3" }, + { 0x8B5C, "GL_FLOAT_MAT4_ARB" }, + { 0x8B5C, "GL_FLOAT_MAT4" }, + { 0x8B5D, "GL_SAMPLER_1D_ARB" }, + { 0x8B5D, "GL_SAMPLER_1D" }, + { 0x8B5E, "GL_SAMPLER_2D_ARB" }, + { 0x8B5E, "GL_SAMPLER_2D" }, + { 0x8B5F, "GL_SAMPLER_3D_ARB" }, + { 0x8B5F, "GL_SAMPLER_3D" }, + { 0x8B60, "GL_SAMPLER_CUBE_ARB" }, + { 0x8B60, "GL_SAMPLER_CUBE" }, + { 0x8B61, "GL_SAMPLER_1D_SHADOW_ARB" }, + { 0x8B61, "GL_SAMPLER_1D_SHADOW" }, + { 0x8B62, "GL_SAMPLER_2D_SHADOW_ARB" }, + { 0x8B62, "GL_SAMPLER_2D_SHADOW" }, + { 0x8B63, "GL_SAMPLER_2D_RECT_ARB" }, + { 0x8B64, "GL_SAMPLER_2D_RECT_SHADOW_ARB" }, + { 0x8B65, "GL_FLOAT_MAT2x3" }, + { 0x8B66, "GL_FLOAT_MAT2x4" }, + { 0x8B67, "GL_FLOAT_MAT3x2" }, + { 0x8B68, "GL_FLOAT_MAT3x4" }, + { 0x8B69, "GL_FLOAT_MAT4x2" }, + { 0x8B6A, "GL_FLOAT_MAT4x3" }, + { 0x8B80, "GL_DELETE_STATUS" }, + { 0x8B80, "GL_OBJECT_DELETE_STATUS_ARB" }, + { 0x8B81, "GL_COMPILE_STATUS" }, + { 0x8B81, "GL_OBJECT_COMPILE_STATUS_ARB" }, + { 0x8B82, "GL_LINK_STATUS" }, + { 0x8B82, "GL_OBJECT_LINK_STATUS_ARB" }, + { 0x8B83, "GL_OBJECT_VALIDATE_STATUS_ARB" }, + { 0x8B83, "GL_VALIDATE_STATUS" }, + { 0x8B84, "GL_INFO_LOG_LENGTH" }, + { 0x8B84, "GL_OBJECT_INFO_LOG_LENGTH_ARB" }, + { 0x8B85, "GL_ATTACHED_SHADERS" }, + { 0x8B85, "GL_OBJECT_ATTACHED_OBJECTS_ARB" }, + { 0x8B86, "GL_ACTIVE_UNIFORMS" }, + { 0x8B86, "GL_OBJECT_ACTIVE_UNIFORMS_ARB" }, + { 0x8B87, "GL_ACTIVE_UNIFORM_MAX_LENGTH" }, + { 0x8B87, "GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB" }, + { 0x8B88, "GL_OBJECT_SHADER_SOURCE_LENGTH_ARB" }, + { 0x8B88, "GL_SHADER_SOURCE_LENGTH" }, + { 0x8B89, "GL_ACTIVE_ATTRIBUTES" }, + { 0x8B89, "GL_OBJECT_ACTIVE_ATTRIBUTES_ARB" }, + { 0x8B8A, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH" }, + { 0x8B8A, "GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB" }, + { 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB" }, + { 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT" }, + { 0x8B8C, "GL_SHADING_LANGUAGE_VERSION_ARB" }, + { 0x8B8C, "GL_SHADING_LANGUAGE_VERSION" }, + { 0x8B8D, "GL_CURRENT_PROGRAM" }, + { 0x8C10, "GL_TEXTURE_RED_TYPE_ARB" }, + { 0x8C10, "GL_TEXTURE_RED_TYPE" }, + { 0x8C11, "GL_TEXTURE_GREEN_TYPE_ARB" }, + { 0x8C11, "GL_TEXTURE_GREEN_TYPE" }, + { 0x8C12, "GL_TEXTURE_BLUE_TYPE_ARB" }, + { 0x8C12, "GL_TEXTURE_BLUE_TYPE" }, + { 0x8C13, "GL_TEXTURE_ALPHA_TYPE_ARB" }, + { 0x8C13, "GL_TEXTURE_ALPHA_TYPE" }, + { 0x8C14, "GL_TEXTURE_LUMINANCE_TYPE_ARB" }, + { 0x8C15, "GL_TEXTURE_INTENSITY_TYPE_ARB" }, + { 0x8C16, "GL_TEXTURE_DEPTH_TYPE_ARB" }, + { 0x8C16, "GL_TEXTURE_DEPTH_TYPE" }, + { 0x8C17, "GL_UNSIGNED_NORMALIZED_ARB" }, + { 0x8C17, "GL_UNSIGNED_NORMALIZED" }, + { 0x8C18, "GL_TEXTURE_1D_ARRAY_EXT" }, + { 0x8C19, "GL_PROXY_TEXTURE_1D_ARRAY_EXT" }, + { 0x8C1A, "GL_TEXTURE_2D_ARRAY_EXT" }, + { 0x8C1B, "GL_PROXY_TEXTURE_2D_ARRAY_EXT" }, + { 0x8C1C, "GL_TEXTURE_BINDING_1D_ARRAY_EXT" }, + { 0x8C1D, "GL_TEXTURE_BINDING_2D_ARRAY_EXT" }, + { 0x8C29, "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT" }, + { 0x8C3A, "GL_R11F_G11F_B10F_EXT" }, + { 0x8C3B, "GL_UNSIGNED_INT_10F_11F_11F_REV_EXT" }, + { 0x8C3C, "GL_RGBA_SIGNED_COMPONENTS_EXT" }, + { 0x8C3D, "GL_RGB9_E5_EXT" }, + { 0x8C3E, "GL_UNSIGNED_INT_5_9_9_9_REV_EXT" }, + { 0x8C3F, "GL_TEXTURE_SHARED_SIZE_EXT" }, + { 0x8C40, "GL_SRGB_EXT" }, + { 0x8C40, "GL_SRGB" }, + { 0x8C41, "GL_SRGB8_EXT" }, + { 0x8C41, "GL_SRGB8" }, + { 0x8C42, "GL_SRGB_ALPHA_EXT" }, + { 0x8C42, "GL_SRGB_ALPHA" }, + { 0x8C43, "GL_SRGB8_ALPHA8_EXT" }, + { 0x8C43, "GL_SRGB8_ALPHA8" }, + { 0x8C44, "GL_SLUMINANCE_ALPHA_EXT" }, + { 0x8C44, "GL_SLUMINANCE_ALPHA" }, + { 0x8C45, "GL_SLUMINANCE8_ALPHA8_EXT" }, + { 0x8C45, "GL_SLUMINANCE8_ALPHA8" }, + { 0x8C46, "GL_SLUMINANCE_EXT" }, + { 0x8C46, "GL_SLUMINANCE" }, + { 0x8C47, "GL_SLUMINANCE8_EXT" }, + { 0x8C47, "GL_SLUMINANCE8" }, + { 0x8C48, "GL_COMPRESSED_SRGB_EXT" }, + { 0x8C48, "GL_COMPRESSED_SRGB" }, + { 0x8C49, "GL_COMPRESSED_SRGB_ALPHA_EXT" }, + { 0x8C49, "GL_COMPRESSED_SRGB_ALPHA" }, + { 0x8C4A, "GL_COMPRESSED_SLUMINANCE_EXT" }, + { 0x8C4A, "GL_COMPRESSED_SLUMINANCE" }, + { 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA_EXT" }, + { 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA" }, + { 0x8C4C, "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT" }, + { 0x8C4D, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT" }, + { 0x8C4E, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT" }, + { 0x8C4F, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT" }, + { 0x8C76, "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT" }, + { 0x8C7F, "GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT" }, + { 0x8C80, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT" }, + { 0x8C83, "GL_TRANSFORM_FEEDBACK_VARYINGS_EXT" }, + { 0x8C84, "GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT" }, + { 0x8C85, "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT" }, + { 0x8C87, "GL_PRIMITIVES_GENERATED_EXT" }, + { 0x8C88, "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT" }, + { 0x8C89, "GL_RASTERIZER_DISCARD_EXT" }, + { 0x8C8A, "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT" }, + { 0x8C8B, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT" }, + { 0x8C8C, "GL_INTERLEAVED_ATTRIBS_EXT" }, + { 0x8C8D, "GL_SEPARATE_ATTRIBS_EXT" }, + { 0x8C8E, "GL_TRANSFORM_FEEDBACK_BUFFER_EXT" }, + { 0x8C8F, "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT" }, + { 0x8CA0, "GL_POINT_SPRITE_COORD_ORIGIN" }, + { 0x8CA1, "GL_LOWER_LEFT" }, + { 0x8CA2, "GL_UPPER_LEFT" }, + { 0x8CA3, "GL_STENCIL_BACK_REF" }, + { 0x8CA4, "GL_STENCIL_BACK_VALUE_MASK" }, + { 0x8CA5, "GL_STENCIL_BACK_WRITEMASK" }, + { 0x8CA6, "GL_DRAW_FRAMEBUFFER_BINDING_EXT" }, + { 0x8CA6, "GL_FRAMEBUFFER_BINDING_EXT" }, + { 0x8CA6, "GL_FRAMEBUFFER_BINDING" }, + { 0x8CA7, "GL_RENDERBUFFER_BINDING_EXT" }, + { 0x8CA7, "GL_RENDERBUFFER_BINDING" }, + { 0x8CA8, "GL_READ_FRAMEBUFFER_EXT" }, + { 0x8CA8, "GL_READ_FRAMEBUFFER" }, + { 0x8CA9, "GL_DRAW_FRAMEBUFFER_EXT" }, + { 0x8CA9, "GL_DRAW_FRAMEBUFFER" }, + { 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING_EXT" }, + { 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING" }, + { 0x8CAB, "GL_RENDERBUFFER_SAMPLES_EXT" }, + { 0x8CAB, "GL_RENDERBUFFER_SAMPLES" }, + { 0x8CAC, "GL_DEPTH_COMPONENT32F" }, + { 0x8CAD, "GL_DEPTH32F_STENCIL8" }, + { 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT" }, + { 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE" }, + { 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT" }, + { 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME" }, + { 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT" }, + { 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL" }, + { 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT" }, + { 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" }, + { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT" }, + { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT" }, + { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER" }, + { 0x8CD5, "GL_FRAMEBUFFER_COMPLETE_EXT" }, + { 0x8CD5, "GL_FRAMEBUFFER_COMPLETE" }, + { 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT" }, + { 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT" }, + { 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT" }, + { 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" }, + { 0x8CD9, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT" }, + { 0x8CDA, "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT" }, + { 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT" }, + { 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER" }, + { 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT" }, + { 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER" }, + { 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED_EXT" }, + { 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED" }, + { 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS_EXT" }, + { 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS" }, + { 0x8CE0, "GL_COLOR_ATTACHMENT0_EXT" }, + { 0x8CE0, "GL_COLOR_ATTACHMENT0" }, + { 0x8CE1, "GL_COLOR_ATTACHMENT1_EXT" }, + { 0x8CE1, "GL_COLOR_ATTACHMENT1" }, + { 0x8CE2, "GL_COLOR_ATTACHMENT2_EXT" }, + { 0x8CE2, "GL_COLOR_ATTACHMENT2" }, + { 0x8CE3, "GL_COLOR_ATTACHMENT3_EXT" }, + { 0x8CE3, "GL_COLOR_ATTACHMENT3" }, + { 0x8CE4, "GL_COLOR_ATTACHMENT4_EXT" }, + { 0x8CE4, "GL_COLOR_ATTACHMENT4" }, + { 0x8CE5, "GL_COLOR_ATTACHMENT5_EXT" }, + { 0x8CE5, "GL_COLOR_ATTACHMENT5" }, + { 0x8CE6, "GL_COLOR_ATTACHMENT6_EXT" }, + { 0x8CE6, "GL_COLOR_ATTACHMENT6" }, + { 0x8CE7, "GL_COLOR_ATTACHMENT7_EXT" }, + { 0x8CE7, "GL_COLOR_ATTACHMENT7" }, + { 0x8CE8, "GL_COLOR_ATTACHMENT8_EXT" }, + { 0x8CE8, "GL_COLOR_ATTACHMENT8" }, + { 0x8CE9, "GL_COLOR_ATTACHMENT9_EXT" }, + { 0x8CE9, "GL_COLOR_ATTACHMENT9" }, + { 0x8CEA, "GL_COLOR_ATTACHMENT10_EXT" }, + { 0x8CEA, "GL_COLOR_ATTACHMENT10" }, + { 0x8CEB, "GL_COLOR_ATTACHMENT11_EXT" }, + { 0x8CEB, "GL_COLOR_ATTACHMENT11" }, + { 0x8CEC, "GL_COLOR_ATTACHMENT12_EXT" }, + { 0x8CEC, "GL_COLOR_ATTACHMENT12" }, + { 0x8CED, "GL_COLOR_ATTACHMENT13_EXT" }, + { 0x8CED, "GL_COLOR_ATTACHMENT13" }, + { 0x8CEE, "GL_COLOR_ATTACHMENT14_EXT" }, + { 0x8CEE, "GL_COLOR_ATTACHMENT14" }, + { 0x8CEF, "GL_COLOR_ATTACHMENT15_EXT" }, + { 0x8CEF, "GL_COLOR_ATTACHMENT15" }, + { 0x8D00, "GL_DEPTH_ATTACHMENT_EXT" }, + { 0x8D00, "GL_DEPTH_ATTACHMENT" }, + { 0x8D20, "GL_STENCIL_ATTACHMENT_EXT" }, + { 0x8D20, "GL_STENCIL_ATTACHMENT" }, + { 0x8D40, "GL_FRAMEBUFFER_EXT" }, + { 0x8D40, "GL_FRAMEBUFFER" }, + { 0x8D41, "GL_RENDERBUFFER_EXT" }, + { 0x8D41, "GL_RENDERBUFFER" }, + { 0x8D42, "GL_RENDERBUFFER_WIDTH_EXT" }, + { 0x8D42, "GL_RENDERBUFFER_WIDTH" }, + { 0x8D43, "GL_RENDERBUFFER_HEIGHT_EXT" }, + { 0x8D43, "GL_RENDERBUFFER_HEIGHT" }, + { 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT_EXT" }, + { 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT" }, + { 0x8D46, "GL_STENCIL_INDEX1_EXT" }, + { 0x8D46, "GL_STENCIL_INDEX1" }, + { 0x8D47, "GL_STENCIL_INDEX4_EXT" }, + { 0x8D47, "GL_STENCIL_INDEX4" }, + { 0x8D48, "GL_STENCIL_INDEX8_EXT" }, + { 0x8D48, "GL_STENCIL_INDEX8" }, + { 0x8D49, "GL_STENCIL_INDEX16_EXT" }, + { 0x8D49, "GL_STENCIL_INDEX16" }, + { 0x8D50, "GL_RENDERBUFFER_RED_SIZE_EXT" }, + { 0x8D50, "GL_RENDERBUFFER_RED_SIZE" }, + { 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE_EXT" }, + { 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE" }, + { 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE_EXT" }, + { 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE" }, + { 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE_EXT" }, + { 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE" }, + { 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE_EXT" }, + { 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE" }, + { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE_EXT" }, + { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE" }, + { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT" }, + { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" }, + { 0x8D57, "GL_MAX_SAMPLES_EXT" }, + { 0x8D57, "GL_MAX_SAMPLES" }, + { 0x8D70, "GL_RGBA32UI_EXT" }, + { 0x8D71, "GL_RGB32UI_EXT" }, + { 0x8D72, "GL_ALPHA32UI_EXT" }, + { 0x8D73, "GL_INTENSITY32UI_EXT" }, + { 0x8D74, "GL_LUMINANCE32UI_EXT" }, + { 0x8D75, "GL_LUMINANCE_ALPHA32UI_EXT" }, + { 0x8D76, "GL_RGBA16UI_EXT" }, + { 0x8D77, "GL_RGB16UI_EXT" }, + { 0x8D78, "GL_ALPHA16UI_EXT" }, + { 0x8D79, "GL_INTENSITY16UI_EXT" }, + { 0x8D7A, "GL_LUMINANCE16UI_EXT" }, + { 0x8D7B, "GL_LUMINANCE_ALPHA16UI_EXT" }, + { 0x8D7C, "GL_RGBA8UI_EXT" }, + { 0x8D7D, "GL_RGB8UI_EXT" }, + { 0x8D7E, "GL_ALPHA8UI_EXT" }, + { 0x8D7F, "GL_INTENSITY8UI_EXT" }, + { 0x8D80, "GL_LUMINANCE8UI_EXT" }, + { 0x8D81, "GL_LUMINANCE_ALPHA8UI_EXT" }, + { 0x8D82, "GL_RGBA32I_EXT" }, + { 0x8D83, "GL_RGB32I_EXT" }, + { 0x8D84, "GL_ALPHA32I_EXT" }, + { 0x8D85, "GL_INTENSITY32I_EXT" }, + { 0x8D86, "GL_LUMINANCE32I_EXT" }, + { 0x8D87, "GL_LUMINANCE_ALPHA32I_EXT" }, + { 0x8D88, "GL_RGBA16I_EXT" }, + { 0x8D89, "GL_RGB16I_EXT" }, + { 0x8D8A, "GL_ALPHA16I_EXT" }, + { 0x8D8B, "GL_INTENSITY16I_EXT" }, + { 0x8D8C, "GL_LUMINANCE16I_EXT" }, + { 0x8D8D, "GL_LUMINANCE_ALPHA16I_EXT" }, + { 0x8D8E, "GL_RGBA8I_EXT" }, + { 0x8D8F, "GL_RGB8I_EXT" }, + { 0x8D90, "GL_ALPHA8I_EXT" }, + { 0x8D91, "GL_INTENSITY8I_EXT" }, + { 0x8D92, "GL_LUMINANCE8I_EXT" }, + { 0x8D93, "GL_LUMINANCE_ALPHA8I_EXT" }, + { 0x8D94, "GL_RED_INTEGER_EXT" }, + { 0x8D95, "GL_GREEN_INTEGER_EXT" }, + { 0x8D96, "GL_BLUE_INTEGER_EXT" }, + { 0x8D97, "GL_ALPHA_INTEGER_EXT" }, + { 0x8D98, "GL_RGB_INTEGER_EXT" }, + { 0x8D99, "GL_RGBA_INTEGER_EXT" }, + { 0x8D9A, "GL_BGR_INTEGER_EXT" }, + { 0x8D9B, "GL_BGRA_INTEGER_EXT" }, + { 0x8D9C, "GL_LUMINANCE_INTEGER_EXT" }, + { 0x8D9D, "GL_LUMINANCE_ALPHA_INTEGER_EXT" }, + { 0x8D9E, "GL_RGBA_INTEGER_MODE_EXT" }, + { 0x8DA7, "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT" }, + { 0x8DA8, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT" }, + { 0x8DA9, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT" }, + { 0x8DAD, "GL_FLOAT_32_UNSIGNED_INT_24_8_REV" }, + { 0x8DB9, "GL_FRAMEBUFFER_SRGB_EXT" }, + { 0x8DBA, "GL_FRAMEBUFFER_SRGB_CAPABLE_EXT" }, + { 0x8DBB, "GL_COMPRESSED_RED_RGTC1" }, + { 0x8DBC, "GL_COMPRESSED_SIGNED_RED_RGTC1" }, + { 0x8DBD, "GL_COMPRESSED_RG_RGTC2" }, + { 0x8DBE, "GL_COMPRESSED_SIGNED_RG_RGTC2" }, + { 0x8DC0, "GL_SAMPLER_1D_ARRAY_EXT" }, + { 0x8DC1, "GL_SAMPLER_2D_ARRAY_EXT" }, + { 0x8DC2, "GL_SAMPLER_BUFFER_EXT" }, + { 0x8DC3, "GL_SAMPLER_1D_ARRAY_SHADOW_EXT" }, + { 0x8DC4, "GL_SAMPLER_2D_ARRAY_SHADOW_EXT" }, + { 0x8DC5, "GL_SAMPLER_CUBE_SHADOW_EXT" }, + { 0x8DC6, "GL_UNSIGNED_INT_VEC2_EXT" }, + { 0x8DC7, "GL_UNSIGNED_INT_VEC3_EXT" }, + { 0x8DC8, "GL_UNSIGNED_INT_VEC4_EXT" }, + { 0x8DC9, "GL_INT_SAMPLER_1D_EXT" }, + { 0x8DCA, "GL_INT_SAMPLER_2D_EXT" }, + { 0x8DCB, "GL_INT_SAMPLER_3D_EXT" }, + { 0x8DCC, "GL_INT_SAMPLER_CUBE_EXT" }, + { 0x8DCD, "GL_INT_SAMPLER_2D_RECT_EXT" }, + { 0x8DCE, "GL_INT_SAMPLER_1D_ARRAY_EXT" }, + { 0x8DCF, "GL_INT_SAMPLER_2D_ARRAY_EXT" }, + { 0x8DD0, "GL_INT_SAMPLER_BUFFER_EXT" }, + { 0x8DD1, "GL_UNSIGNED_INT_SAMPLER_1D_EXT" }, + { 0x8DD2, "GL_UNSIGNED_INT_SAMPLER_2D_EXT" }, + { 0x8DD3, "GL_UNSIGNED_INT_SAMPLER_3D_EXT" }, + { 0x8DD4, "GL_UNSIGNED_INT_SAMPLER_CUBE_EXT" }, + { 0x8DD5, "GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT" }, + { 0x8DD6, "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT" }, + { 0x8DD7, "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT" }, + { 0x8DD8, "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT" }, + { 0x8DD9, "GL_GEOMETRY_SHADER_EXT" }, + { 0x8DDA, "GL_GEOMETRY_VERTICES_OUT_EXT" }, + { 0x8DDB, "GL_GEOMETRY_INPUT_TYPE_EXT" }, + { 0x8DDC, "GL_GEOMETRY_OUTPUT_TYPE_EXT" }, + { 0x8DDD, "GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT" }, + { 0x8DDE, "GL_MAX_VERTEX_VARYING_COMPONENTS_EXT" }, + { 0x8DDF, "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT" }, + { 0x8DE0, "GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT" }, + { 0x8DE1, "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT" }, + { 0x8DE2, "GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT" }, + { 0x8DE3, "GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT" }, + { 0x8DE4, "GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT" }, + { 0x8DED, "GL_MAX_BINDABLE_UNIFORM_SIZE_EXT" }, + { 0x8DEE, "GL_UNIFORM_BUFFER_EXT" }, + { 0x8DEF, "GL_UNIFORM_BUFFER_BINDING_EXT" }, + { 0x8E4C, "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT" }, + { 0x8E4D, "GL_FIRST_VERTEX_CONVENTION_EXT" }, + { 0x8E4E, "GL_LAST_VERTEX_CONVENTION_EXT" }, + { 0x8E4F, "GL_PROVOKING_VERTEX_EXT" }, + + VE( TERMVALUE ) +}; + +const GLMValueEntry_t g_gl_renderers[] = +{ + { 0x00020200, "Generic" }, + { 0x00020400, "GenericFloat" }, + { 0x00020600, "AppleSW" }, + { 0x00021000, "ATIRage128" }, + { 0x00021200, "ATIRadeon" }, + { 0x00021400, "ATIRagePro" }, + { 0x00021600, "ATIRadeon8500" }, + { 0x00021800, "ATIRadeon9700" }, + { 0x00021900, "ATIRadeonX1000" }, + { 0x00021A00, "ATIRadeonX2000" }, + { 0x00022000, "NVGeForce2MX" }, + { 0x00022200, "NVGeForce3" }, + { 0x00022400, "NVGeForceFX" }, + { 0x00022600, "NVGeForce8xxx" }, + { 0x00023000, "VTBladeXP2" }, + { 0x00024000, "Intel900" }, + { 0x00024200, "IntelX3100" }, + { 0x00040000, "Mesa3DFX" }, + + VE( TERMVALUE ) +}; + + +//=============================================================================== +// decode helper funcs + +char s_glmStrScratch[65536]; +int s_glmStrCursor = 0; + +const char * GLMDecode( GLMThing_t thingtype, unsigned long value ) +{ + const GLMValueEntry_t *table = NULL; + //char isflags = 0; + + switch( thingtype ) + { + case eD3D_DEVTYPE: table = g_d3d_devtypes; + break; + + case eD3D_FORMAT: table = g_d3d_formats; + break; + + case eD3D_RTYPE: table = g_d3d_rtypes; + break; + + case eD3D_USAGE: table = g_d3d_usages; + break; + + case eD3D_RSTATE: table = g_d3d_rstates; + break; + + case eD3D_SIO: table = g_d3d_opcodes; + break; + + case eD3D_VTXDECLUSAGE: table = g_d3d_vtxdeclusages; + break; + + case eCGL_RENDID: table = g_cgl_rendids; + break; + + case eGL_ERROR: table = g_gl_errors; + break; + + case eGL_ENUM: table = g_gl_enums; + break; + + case eGL_RENDERER: table = g_gl_renderers; + break; + + default: + GLMStop(); + return "UNKNOWNTYPE"; + break; + } + + if (table) + { + while( table->value != TERMVALUE ) + { + if (table->value == value) + { + return table->name; + } + table++; + } + } + return "UNKNOWN"; +} + +const char *GLMDecodeMask( GLMThing_t kind, unsigned long value ) +{ + // if cursor to scratch buffer is within 1K of EOB, rewind + // nobody is going to decode 63K of flag string values in a single call.. + + // this means that strings returned by this function have a short lifetime.. print them and do not save the pointer.. + + if ( (sizeof(s_glmStrScratch) - s_glmStrCursor) < 1000 ) + { + s_glmStrCursor = 0; + } + + char *start = &s_glmStrScratch[ s_glmStrCursor ]; + char *dest = start; + char first = 1; + + DWORD mask = static_cast(1L<<31); + while(mask) + { + if (mask & value) + { + sprintf(dest,"%s%s", (first) ? "" : "|", GLMDecode( kind, value&mask ) ); + first = 0; + + dest += strlen(dest); // leaves dest pointing at the end null + } + mask >>= 1; + } + s_glmStrCursor = (dest - s_glmStrScratch) + 1; // +1 so the next decoded flag set doesn't land on the ending null + return start; + +} + +#undef VE +#undef TERMVALUE + +//=============================================================================== + +bool GLMDetectOGLP( void ) +{ + bool result = false; +#if defined( OSX ) && defined( CGLPROFILER_ENABLE ) + GLint forceFlush; + CGLError error = CGLGetParameter(CGLGetCurrentContext(), kCGLCPEnableForceFlush, &forceFlush); + result = error == 0; + if (result) + { + // enable a breakpoint on color4sv + int oglp_bkpt[3] = { kCGLFEglColor4sv, kCGLProfBreakBefore, 1 }; + + CGLSetOption( kCGLGOEnableBreakpoint, (GLint)oglp_bkpt ); + } + +#endif + return result; +} + + +// from http://blog.timac.org/?p=190 + +#ifndef _WIN32 + #include +#endif +#include +#ifndef _WIN32 + #include +#ifdef LINUX +#include +#else +#include +#endif +#endif + +// From Technical Q&A QA1361 +// Returns true if the current process +// is being debugged (either running +// under the debugger or has a debugger +// attached post facto). + +bool GLMDetectGDB( void ) // aka AmIBeingDebugged() +{ +#ifdef OSX + bool result; + int junk; + int mib[4]; + struct kinfo_proc info; + size_t size; + + // Initialize the flags so that, + // if sysctl fails for some bizarre + // reason, we get a predictable result. + + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info + // we want, in this case we're looking for + // information about a specific process ID. + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + + size = sizeof(info); + junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); + + assert(junk == 0); + + // We're being debugged if the P_TRACED + // flag is set. + + result = ( (info.kp_proc.p_flag & P_TRACED) != 0 ); + return result; +#else + return Sys_IsDebuggerPresent(); +#endif +} + + +static uint g_glmDebugChannelMask = 0; // which output channels are available (can be more than one) +static uint g_glmDebugFlavorMask = 0; // which message flavors are enabled for output (can be more than one) + +uint GLMDetectAvailableChannels( void ) +{ + uint result = 0; + + // printf is always available (except maybe in release... ?) + result |= (1 << ePrintf); + + // gdb + if (GLMDetectGDB()) + { + result |= (1 << eDebugger); + printf("\n############# GDB Detected"); + } + + // oglp + if (GLMDetectOGLP()) + { + result |= (1 << eGLProfiler); + printf("\n############# OGLP Detected"); + } + + return result; +} + + +static bool g_debugInitDone = false; + +#if GLMDEBUG + + // following funcs vanish if GLMDEBUG not set + +void GLMDebugInitialize( bool forceReinit ) +{ + if ( !g_debugInitDone || forceReinit ) + { + // detect channels + uint channelMask = GLMDetectAvailableChannels(); + + // see if there are any prohibitions on the commandline + // (also add any other desired reasons, release build say).. + + if ( CommandLine()->FindParm("-noprintconsole") ) + { + channelMask &= ~(1<FindParm("-noprintdebugger") ) + { + channelMask &= ~(1<FindParm("-noprintoglp") ) + { + channelMask &= ~(1<FindParm("-glmspew")) + { + channelMask = 0; + } + + // set the output channel mask + GLMDebugChannelMask( &channelMask ); + + // if any channels are enabled, enable some output + if ( channelMask ) + { + // start mostly quiet unless the -glmbootspew option is there + if ( CommandLine()->FindParm( "-glmbootspew" ) ) + { + g_glmDebugFlavorMask = 0xFFFFFFFF; + } + else + { + g_glmDebugFlavorMask = + (1< < + // | (1<m_bHave_GL_GREMEDY_string_marker) + { + gGL->glStringMarkerGREMEDY(0, string); + } + } +} + +int g_glm_indent = 0; +int g_glm_indent_max = 40; // 40 tabs max + +#ifndef OSX +const char *strnstr( const char *haystack, const char *needle, int len ) +{ + return strstr( haystack, needle ); +} +#endif + +EGLMDebugFlavor GLMAssessFlavor( char *str ) +{ + EGLMDebugFlavor flavor = eDefaultFlavor; + + if (strnstr(str, "-D-", 4)) + { + // debug dump + flavor = eDebugDump; + } + else if (strnstr(str, "-M-", 4)) + { + // matrix data + flavor = eMatrixData; + } + else if (strnstr(str, "-S-", 4)) + { + // shader data + flavor = eShaderData; + } + else if (strnstr(str, "-F-", 4)) + { + // framebuf data + flavor = eFrameBufData; + } + else if (strnstr(str, "-X-", 4)) + { + // DirectX data + flavor = eDXStuff; + } + else if (strnstr(str, "-A-", 4)) + { + // allocation data + flavor = eAllocations; + } + else if (strnstr(str, "-Z-", 4)) + { + // allocation data + flavor = eSlowness; + } + else if (str[0] == '<' || str[0] == '>') + { + // entry/exit (aka tenure) + flavor = eTenure; + } + else if (strnstr(str, "---", 4)) // note we check four chars worth so you can do >-M- and it will indent and be filterable + { + // comment + flavor = eComment; + } + + return flavor; +} + +void GLMPrintfVA( const char *fmt, va_list vargs ) +{ + // if no channels open, return + uint channelMask = GLMDebugChannelMask(); + if (!channelMask) + return; + + // if "all flavors" is off, return + uint flavorMask = GLMDebugFlavorMask(); + if (! ( flavorMask & (1<' - raise indent level after print. + // if first char is a '<' - lower indent level before print. + + char buf[100000]; + + if (fmt[0] == '<') + { + GLMIncIndent( -1 ); + } + + memset( buf, '\t', g_glm_indent ); + vsprintf( buf+g_glm_indent, fmt, vargs ); + GLMStringOut( buf ); + + if (fmt[0] == '>') + { + GLMIncIndent( 1 ); + } +} + +void GLMPrintf( const char *fmt, ... ) +{ + // if no channels open, return + uint channelMask = GLMDebugChannelMask(); + if (!channelMask) + return; + + // if "all flavors" is off, return + uint flavorMask = GLMDebugFlavorMask(); + if (! ( flavorMask & (1<' - raise indent level after print. + // if first char is a '<' - lower indent level before print. + + char buf[64000]; + + if (str[0] == '<') + { + GLMIncIndent( -1 ); + } + + memset( buf, '\t', g_glm_indent ); + + if (strlen(str) < sizeof(buf)-g_glm_indent-1) + { + strcpy( buf + g_glm_indent, str ); + } + else + { + DXABSTRACT_BREAK_ON_ERROR(); + } + + + GLMStringOut( buf ); // single string out with indenting + + if (str[0] == '>') + { + GLMIncIndent( 1 ); + } +} + + +void GLMPrintText( const char *str, EGLMDebugFlavor flavor, uint options ) +{ + // if no channels open, return + uint channelMask = GLMDebugChannelMask(); + if (!channelMask) + return; + + // if "all flavors" is off, return + uint flavorMask = GLMDebugFlavorMask(); + if (! ( flavorMask & (1<0) + { + if (g_glm_indent > g_glm_indent_max) + { + g_glm_indent = g_glm_indent_max; + } + } + else + { + if (g_glm_indent < 0) + { + g_glm_indent = 0; + } + } + return g_glm_indent; +} + +int GLMGetIndent( void ) +{ + return g_glm_indent; +} + +void GLMSetIndent( int indent ) +{ + g_glm_indent = indent; +} + +#endif + +// PIX tracking - you can call these outside of GLMDEBUG=true +char sg_pPIXName[128]; + + +#ifndef OSX +ConVar gl_telemetry_gpu_pipeline_flushing( "gl_telemetry_gpu_pipeline_flushing", "0" ); + +class CGPUTimestampManager +{ + CGPUTimestampManager( const CGPUTimestampManager & ); + CGPUTimestampManager& operator= ( CGPUTimestampManager & ); + +public: + CGPUTimestampManager() : + m_bInitialized( false ), + m_nCurFrame( 0 ), + m_flGPUToCPUOffsetInS( 0 ), + m_flGPUToS( 0 ), + m_flRdtscToS( 0 ), + m_flSToRdtsc( 0 ), + m_nFreeQueryPoolSize( 0 ), + m_nOutstandingQueriesHead( 0 ), + m_nOutstandingQueriesTail( 0 ), + m_nNumOutstandingQueryZones( 0 ), + m_nQueryZoneStackSize( 0 ), + m_nNumFinishedZones( 0 ), + m_nTotalSpanWorkCount( 0 ) + { + memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ; + memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) ); + memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) ); + memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) ); + } + + ~CGPUTimestampManager() + { + Deinit(); + } + + inline bool IsInitialized() const { return m_bInitialized; } + inline uint GetCurFrame() const { return m_nCurFrame; } + + void Init() + { + Deinit(); + + memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ; + memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) ); + memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) ); + memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) ); + + InitRdtsc(); + + m_nCurFrame = 0; + + gGL->glGenQueries( cFreeQueryPoolSize, m_FreeQueryPool ); + m_nFreeQueryPoolSize = cFreeQueryPoolSize; + + m_nOutstandingQueriesHead = 0; + m_nOutstandingQueriesTail = 0; + m_nNumOutstandingQueryZones = 0; + + m_nQueryZoneStackSize = 0; + m_nNumFinishedZones = 0; + + m_bInitialized = true; + + m_nTotalSpanWorkCount = 0; + + Calibrate(); + } + + void Calibrate() + { + if ( !m_bInitialized ) + return; + + PipelineFlush(); + + m_flGPUToS = 1.0 / 1000000000.0; + + //0.99997541250006794; + //0.99997530000006662; + // Correction factor to prevent excessive drift, only calibrated on my system, we need a better way of computing/recording this. + double flGPURatio = 0.99997425000007034000; + + const uint NT = 1; + for ( uint nTrial = 0; nTrial < NT; nTrial++ ) + { + const uint R = 16; + double flClockOffsetsInS[R]; + for ( uint q = 0; q < R; q++) + { + uint64 nBestTotalCPUTimestamp = (uint64)-1; + uint64 nBestCPUTimestamp = 0; + GLuint64 nBestGPUTimestamp = 0; + + for ( uint i = 0; i < 10; i++) + { + const uint64 nStartCPUTimestamp = Plat_Rdtsc(); + + gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP); + PipelineFlush(); + + const uint64 nEndCPUTimestamp = Plat_Rdtsc(); + + GLint nAvailable; + do + { + gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable ); + } while ( !nAvailable ); + + GLuint64 nGPUTimestamp; + gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTimestamp ); + + const uint64 nTotalCPUTimestamp = nEndCPUTimestamp - nStartCPUTimestamp; + if ( nTotalCPUTimestamp < nBestTotalCPUTimestamp ) + { + nBestTotalCPUTimestamp = nTotalCPUTimestamp; + nBestCPUTimestamp = nStartCPUTimestamp; + nBestGPUTimestamp = nGPUTimestamp; + } + } + + double flCPUTimestampTimeInSeconds = nBestCPUTimestamp * m_flRdtscToS; + double flGPUTimestampTimeInSeconds = nBestGPUTimestamp * m_flGPUToS * flGPURatio; + + flClockOffsetsInS[q] = flCPUTimestampTimeInSeconds - flGPUTimestampTimeInSeconds; + + ThreadSleep(100); + + DbgPrintf("%f %f %1.20f\n", flCPUTimestampTimeInSeconds, flGPUTimestampTimeInSeconds, flClockOffsetsInS[q] ); + } + + m_flGPUToCPUOffsetInS = 0.0f; + for ( uint i = 0; i < R; i++ ) + m_flGPUToCPUOffsetInS += flClockOffsetsInS[i]; + m_flGPUToCPUOffsetInS /= R; + + if ( NT > 1 ) + { + DbgPrintf("------- Ratio: %2.20f\n", flGPURatio ); + + double flDelta = flClockOffsetsInS[0] - flClockOffsetsInS[R - 1]; + + DbgPrintf("------- %1.20f\n", flDelta ); + +#if 1 + if ( flDelta < 0.0000005f ) + { + flGPURatio += .000000125f; + } + else if ( flDelta > 0.0000005f ) + { + flGPURatio -= .000000125f; + } +#else + if ( flDelta < 0.0000005f ) + { + flGPURatio += .0000000125f; + } + else if ( flDelta > 0.0000005f ) + { + flGPURatio -= .0000000125f; + } +#endif + } + } + + m_flGPUToS *= flGPURatio; + +#if 0 + // dump drift over time to debugger output + double flLatency = 0; + for ( ; ; ) + { + // test + const uint64 nStartCPUTime = Plat_Rdtsc(); + + gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP); + + PipelineFlush(); + + GLint nAvailable; + do + { + gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable ); + } while ( !nAvailable ); + + GLuint64 nGPUTime; + gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTime ); + + double flStartGPUTime = ( ( nGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ); + + flLatency = flStartGPUTime - nStartCPUTime * m_flRdtscToS; + DbgPrintf("%f\n", flLatency ); + } +#endif + } + + void Deinit() + { + if ( !m_bInitialized ) + return; + + if ( m_nFreeQueryPoolSize ) + { + gGL->glDeleteQueries( m_nFreeQueryPoolSize, m_FreeQueryPool ); + } + m_nFreeQueryPoolSize = 0; + + for ( uint i = 0; i < m_nNumOutstandingQueryZones; i++ ) + { + QueryZone_t &query = m_OutstandingQueryZones[ ( m_nOutstandingQueriesHead + i ) % cMaxQueryZones ]; + if ( query.m_nBeginQuery ) + { + gGL->glDeleteQueries( 1, &query.m_nBeginQuery ); + } + if ( query.m_nEndQuery ) + { + gGL->glDeleteQueries( 1, &query.m_nEndQuery ); + } + } + m_nOutstandingQueriesHead = 0; + m_nOutstandingQueriesTail = 0; + m_nNumOutstandingQueryZones = 0; + + for ( uint i = 0; i < m_nQueryZoneStackSize; i++ ) + { + QueryZone_t &query = m_QueryZoneStack[i]; + if ( query.m_nBeginQuery ) + { + gGL->glDeleteQueries( 1, &query.m_nBeginQuery ); + } + if ( query.m_nEndQuery ) + { + gGL->glDeleteQueries( 1, &query.m_nEndQuery ); + } + } + m_nQueryZoneStackSize = 0; + + m_flGPUToCPUOffsetInS = 0; + m_flGPUToS = 0; + m_flRdtscToS = 0; + m_flSToRdtsc = 0; + + m_bInitialized = false; + } + + // pName is assumed to be a telemetry dynamic string! + void BeginZone( const char *pName ) + { + if ( !m_bInitialized ) + return; + + if ( m_nQueryZoneStackSize >= cMaxQueryZoneStackSize ) + { + Panic( "Increase cMaxQueryZoneStackSize!" ); + } + + QueryZone_t &zone = m_QueryZoneStack[m_nQueryZoneStackSize]; + + zone.m_pName = pName; + + zone.m_nBeginQuery = AllocQueryHandle(); + zone.m_nEndQuery = 0; + zone.m_nStackLevel = m_nQueryZoneStackSize; + + zone.m_nTotalGPUWorkCount = g_nTotalDrawsOrClears; +#if GL_TELEMETRY_GPU_ZONES + zone.m_nTotalGPUWorkCount += g_TelemetryGPUStats.GetTotal(); +#endif + + gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nBeginQuery, GL_TIMESTAMP ); + + m_nQueryZoneStackSize++; + } + + void EndZone() + { + if ( !m_bInitialized ) + return; + + if ( ( !m_nQueryZoneStackSize ) || ( m_nNumOutstandingQueryZones == cMaxQueryZones ) ) + { + Panic( "Query zone error!" ); + } + + m_nQueryZoneStackSize--; + + uint nCurGPUWorkCount = g_nTotalDrawsOrClears; +#if GL_TELEMETRY_GPU_ZONES + nCurGPUWorkCount += g_TelemetryGPUStats.GetTotal(); +#endif + + uint nTotalDraws = nCurGPUWorkCount - m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount; + + m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery = AllocQueryHandle(); + gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery, GL_TIMESTAMP ); + m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount = nTotalDraws; + + m_OutstandingQueryZones[m_nOutstandingQueriesHead] = m_QueryZoneStack[m_nQueryZoneStackSize]; + m_nOutstandingQueriesHead = ( m_nOutstandingQueriesHead + 1 ) % cMaxQueryZones; + m_nNumOutstandingQueryZones++; + + COMPILE_TIME_ASSERT( ( int )cMaxQueryZones > ( int )cMaxQueryZoneStackSize ); + if ( m_nNumOutstandingQueryZones >= ( cMaxQueryZones - cMaxQueryZoneStackSize ) ) + { + tmMessage( TELEMETRY_LEVEL2, TMMF_ICON_NOTE | TMMF_SEVERITY_WARNING, "CGPUTimestampManager::EndZone: Too many outstanding query zones - forcing a pipeline flush! This is probably expensive." ); + + FlushOutstandingQueries( true ); + } + + if ( gl_telemetry_gpu_pipeline_flushing.GetBool() ) + { + PipelineFlush(); + } + } + + void Tick() + { + m_nCurFrame++; + + if ( !m_bInitialized ) + return; + + if ( m_nQueryZoneStackSize > 0 ) + { + Panic( "Zone stack is not empty!" ); + } + + FlushOutstandingQueries( false ); + + tmMessage( TELEMETRY_LEVEL2, 0, "Total PIX timespan GPU work count: %u", m_nTotalSpanWorkCount ); + + m_nTotalSpanWorkCount = 0; + } + + void FlushOutstandingQueries( bool bForce ) + { + tmZone( TELEMETRY_LEVEL2, 0, "FlushOutstandingQueries: %u", m_nNumOutstandingQueryZones ); + + if ( bForce ) + { + PipelineFlush(); + } + + while ( m_nNumOutstandingQueryZones ) + { + QueryZone_t &zone = m_OutstandingQueryZones[m_nOutstandingQueriesTail]; + + GLint nEndAvailable = 0; + do + { + gGL->glGetQueryObjectiv( zone.m_nEndQuery, GL_QUERY_RESULT_AVAILABLE, &nEndAvailable ); + + } while ( ( bForce ) && ( nEndAvailable == 0 ) ); + + if ( !nEndAvailable ) + { + if ( bForce ) + { + Panic( "Query results not available after a full pipeline flush!" ); + } + break; + } + + GLuint64 nBeginGPUTime, nEndGPUTime; + gGL->glGetQueryObjectui64v( zone.m_nBeginQuery, GL_QUERY_RESULT, &nBeginGPUTime ); + gGL->glGetQueryObjectui64v( zone.m_nEndQuery, GL_QUERY_RESULT, &nEndGPUTime ); + + ReleaseQueryHandle( zone.m_nBeginQuery ); + zone.m_nBeginQuery = 0; + + ReleaseQueryHandle( zone.m_nEndQuery ); + zone.m_nEndQuery = 0; + + if ( m_nNumFinishedZones >= cMaxQueryZones ) + { + Panic( "Too many finished zones!" ); + } + + FinishedQueryZone_t &finishedZone = m_FinishedZones[m_nNumFinishedZones]; + finishedZone.m_pName = zone.m_pName; + finishedZone.m_nBeginGPUTime = nBeginGPUTime; + finishedZone.m_nEndGPUTime = nEndGPUTime; + finishedZone.m_nStackLevel = zone.m_nStackLevel; + finishedZone.m_nTotalGPUWorkCount = zone.m_nTotalGPUWorkCount; + m_nNumFinishedZones++; + + if ( !zone.m_nStackLevel ) + { + std::sort( m_FinishedZones, m_FinishedZones + m_nNumFinishedZones ); + FlushFinishedZones(); + m_nNumFinishedZones = 0; + } + + m_nOutstandingQueriesTail = ( m_nOutstandingQueriesTail + 1 ) % cMaxQueryZones; + m_nNumOutstandingQueryZones--; + } + } + +private: + bool m_bInitialized; + uint m_nCurFrame; + + double m_flGPUToCPUOffsetInS; + double m_flGPUToS; + double m_flRdtscToS; + double m_flSToRdtsc; + + enum { cMaxQueryZones = 4096, cFreeQueryPoolSize = cMaxQueryZones * 2 }; + GLuint m_FreeQueryPool[cFreeQueryPoolSize ]; + uint m_nFreeQueryPoolSize; + + GLuint AllocQueryHandle() + { + if ( !m_nFreeQueryPoolSize ) + { + Panic( "Out of query handles!"); + } + return m_FreeQueryPool[--m_nFreeQueryPoolSize]; + } + + void ReleaseQueryHandle( GLuint nHandle ) + { + if ( m_nFreeQueryPoolSize >= cFreeQueryPoolSize ) + { + Panic( "Query handle error!" ); + } + m_FreeQueryPool[m_nFreeQueryPoolSize++] = nHandle; + } + + struct QueryZone_t + { + const char *m_pName; + GLuint m_nBeginQuery; + GLuint m_nEndQuery; + uint m_nStackLevel; + uint m_nTotalGPUWorkCount; + }; + + QueryZone_t m_OutstandingQueryZones[cMaxQueryZones]; + uint m_nOutstandingQueriesHead; // index of first outstanding query (oldest) + uint m_nOutstandingQueriesTail; // index where next query goes (newest) + uint m_nNumOutstandingQueryZones; + + enum { cMaxQueryZoneStackSize = 256 }; + QueryZone_t m_QueryZoneStack[cMaxQueryZoneStackSize]; + uint m_nQueryZoneStackSize; + + struct FinishedQueryZone_t + { + const char *m_pName; + GLuint64 m_nBeginGPUTime; + GLuint64 m_nEndGPUTime; + uint m_nStackLevel; + uint m_nTotalGPUWorkCount; + + inline bool operator< ( const FinishedQueryZone_t &rhs ) const + { + if ( m_nBeginGPUTime == rhs.m_nBeginGPUTime) + return m_nStackLevel < rhs.m_nStackLevel; + + return m_nBeginGPUTime < rhs.m_nBeginGPUTime; + } + }; + + FinishedQueryZone_t m_FinishedZones[cMaxQueryZones]; + uint m_nNumFinishedZones; + + uint m_nTotalSpanWorkCount; + + void InitRdtsc() + { + m_flRdtscToS = 0.0f; + m_flSToRdtsc = 0.0f; + + for ( uint i = 0; i < 10; i++ ) + { + uint64 t0 = Plat_Rdtsc(); + double d0 = Plat_FloatTime(); + + ThreadSleep( 250 ); + + uint64 t1 = Plat_Rdtsc(); + double d1 = Plat_FloatTime(); + + double flRdtscToS = ( d1 - d0 ) / ( t1 - t0 ); + double flSToRdtsc = ( t1 - t0 ) / ( d1 - d0 ); + if ( flSToRdtsc > m_flSToRdtsc ) + { + m_flRdtscToS = flRdtscToS; + m_flSToRdtsc = flSToRdtsc; + } + } + } + + void PipelineFlush() + { +#ifdef HAVE_GL_ARB_SYNC + GLsync nSyncObj = gGL->glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 ); + if ( nSyncObj ) + { + gGL->glClientWaitSync( nSyncObj, GL_SYNC_FLUSH_COMMANDS_BIT, 300000000000ULL ); + gGL->glDeleteSync( nSyncObj ); + } +#endif + } + + inline void NewTimeSpan( uint64 nStartGPUTime, uint64 nEndGPUTime, const char *pName, uint nTotalDraws ) + { + // apparently we must use level0 for timespans? + tmBeginTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nStartGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws ); + tmEndTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nEndGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws ); + } + + void FlushFinishedZones() + { + for ( uint i = 0; i < m_nNumFinishedZones; i++ ) + { + FinishedQueryZone_t &zone = m_FinishedZones[i]; + if ( !zone.m_nTotalGPUWorkCount ) + continue; + + bool bEmit = false; + if ( i == ( m_nNumFinishedZones - 1 ) ) + bEmit = true; + else + { + FinishedQueryZone_t &nextZone = m_FinishedZones[i + 1]; + bEmit = zone.m_nEndGPUTime <= nextZone.m_nBeginGPUTime; + } + + if ( bEmit ) + { + uint64 nStartGPUTime = ( ( zone.m_nBeginGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc; + uint64 nEndGPUTime = ( ( zone.m_nEndGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc; + + NewTimeSpan( nStartGPUTime, nEndGPUTime, zone.m_pName, zone.m_nTotalGPUWorkCount ); + + m_nTotalSpanWorkCount += zone.m_nTotalGPUWorkCount; + } + } + } + + void Panic( const char *pMsg ) + { + DXABSTRACT_BREAK_ON_ERROR(); + Error( "%s", pMsg ); + } + + static void DbgPrintf( const char *pFmt, ... ) + { + va_list vargs; + va_start( vargs, pFmt ); + char buf[1024]; + V_vsnprintf( buf, sizeof( buf ), pFmt, vargs ); + +#ifdef WIN32 + OutputDebugStringA( buf ); +#else + printf( "%s", buf ); +#endif + + va_end( vargs ); + } +}; + + +static CGPUTimestampManager g_GPUTimestampManager; + +void GLMGPUTimestampManagerInit() +{ + g_GPUTimestampManager.Init(); +} + +void GLMGPUTimestampManagerDeinit() +{ + g_GPUTimestampManager.Deinit(); +} + +ConVar gl_telemetry_gpu( "gl_telemetry_gpu", "0" ); +static bool g_bPrevTelemetryGPU; + +void GLMGPUTimestampManagerTick() +{ + if ( g_bPrevTelemetryGPU != gl_telemetry_gpu.GetBool() ) + { + if ( !gl_telemetry_gpu.GetBool() ) + g_GPUTimestampManager.Deinit(); + else + { +#if !PIX_ENABLE || !GL_TELEMETRY_GPU_ZONES + ConMsg( "Must define PIX_ENABLE and GL_TELEMETRY_GPU_ZONES to use this feature" ); +#else + g_GPUTimestampManager.Init(); +#endif + } + + g_bPrevTelemetryGPU = gl_telemetry_gpu.GetBool(); + } + + g_GPUTimestampManager.Tick(); +} + +#endif // !OSX + +static uint g_nPIXEventIndex; + +void GLMBeginPIXEvent( const char *str ) +{ +#ifndef OSX + char szName[1024]; + V_snprintf( szName, sizeof( szName ), "[ID:%u FR:%u] %s", g_nPIXEventIndex, g_GPUTimestampManager.GetCurFrame(), str ); + const char *p = tmDynamicString( TELEMETRY_LEVEL2, szName ); //p can be null if tm is getting shut down + tmEnter( TELEMETRY_LEVEL2, TMZF_NONE, "PIX %s", p ? p : "" ); + + g_nPIXEventIndex++; + + g_GPUTimestampManager.BeginZone( p ); +#endif // !OSX + V_strncpy( sg_pPIXName, str, 128 ); + +#if defined( OSX ) && defined( CGLPROFILER_ENABLE ) + CGLSetOption( kCGLGOComment, (GLint)sg_pPIXName ); +#endif + + if ( gGL->m_bHave_GL_GREMEDY_string_marker ) + { + gGL->glStringMarkerGREMEDY( 0, sg_pPIXName ); + } +} + +void GLMEndPIXEvent( void ) +{ +#ifndef OSX + g_GPUTimestampManager.EndZone(); +#endif + +#if defined( OSX ) && defined( CGLPROFILER_ENABLE ) + CGLSetOption( kCGLGOComment, (GLint)sg_pPIXName ); +#endif + + if ( gGL->m_bHave_GL_GREMEDY_string_marker ) + { + gGL->glStringMarkerGREMEDY( 0, sg_pPIXName ); + } + + sg_pPIXName[0] = '\0'; + + tmLeave( TELEMETRY_LEVEL2 ); +} + +//=============================================================================== + +// Knob - hash table mapping string names to float values + + +struct GLMKnobKey +{ + char *m_knobName; +}; + +struct GLMKnobValue +{ + float m_value; +}; + +bool LessFunc_GLMKnobKey( const GLMKnobKey &a, const GLMKnobKey &b ) +{ + // Umm, what should this really be? + //return strcmp( a.m_knobName, b.m_knobName ); + return strcmp( a.m_knobName, b.m_knobName ) < 0; +} + +CUtlMap< GLMKnobKey, GLMKnobValue* > *g_knobMap = NULL; + +// add some special knob-names that just read mod keys +extern "C" uint GetCurrentKeyModifiers( void ); + +enum ECarbonModKeyIndex +{ + EcmdKeyBit = 8, /* command key down?*/ + EshiftKeyBit = 9, /* shift key down?*/ + EalphaLockBit = 10, /* alpha lock down?*/ + EoptionKeyBit = 11, /* option key down?*/ + EcontrolKeyBit = 12 /* control key down?*/ +}; + +enum ECarbonModKeyMask +{ + EcmdKey = 1 << EcmdKeyBit, + EshiftKey = 1 << EshiftKeyBit, + EalphaLock = 1 << EalphaLockBit, + EoptionKey = 1 << EoptionKeyBit, + EcontrolKey = 1 << EcontrolKeyBit +}; + +float GLMKnob( char *knobname, float *setvalue ) +{ +#if GLMDEBUG + float result = 0.0f; + + if (!g_knobMap) + { + g_knobMap = new CUtlMap< GLMKnobKey, GLMKnobValue* >; + g_knobMap->SetLessFunc( LessFunc_GLMKnobKey ); + } + +#ifdef OSX + uint mods = GetCurrentKeyModifiers(); +#else + uint mods = 0; +#endif + // is it a special key name ? + if (!strcmp(knobname,"caps-key")) + { + return (mods & (EalphaLock)) ? 1.0 : 0.0; + } + else if (!strcmp(knobname,"control-key")) + { + return (mods & (EcontrolKey)) ? 1.0 : 0.0; + } + else if (!strcmp(knobname,"shift-key")) + { + return (mods & (EshiftKey)) ? 1.0 : 0.0; + } + else if (!strcmp(knobname,"option-key")) + { + return (mods & (EoptionKey)) ? 1.0 : 0.0; + } + else + { + // does the key exist in the map ? + GLMKnobKey key; + key.m_knobName = knobname; + + GLMKnobValue *knob = NULL; + + unsigned short index = g_knobMap->Find( key ); + if (index != g_knobMap->InvalidIndex()) + { + // found it + knob = (*g_knobMap)[ index ]; + + if (setvalue) + { + knob->m_value = *setvalue; + } + + result = knob->m_value; + } + else + { + // need to make a new one + knob = new GLMKnobValue; + + knob->m_value = (setvalue) ? *setvalue : 0.0f; + + g_knobMap->Insert( key, knob ); + } + + return knob->m_value; + } + +#else + // GLM knobs just return 0.0 all the time when no GLMDEBUG + return 0.0f; +#endif +} + +// for boolean knobs.. +float GLMKnobToggle( char *knobname ) +{ + // if not 0.0, make it 0.0 + // if 0.0, make it 1.0 + + float newValue = 0.0; // assume falling edge + float curValue = GLMKnob( knobname, NULL ); + if (curValue == 0.0) + { + newValue = 1.0; + } + + return GLMKnob( knobname, &newValue ); +} + + +//=============================================================================== + +// helpers for CGLSetOption - no op if no profiler +void GLMProfilerClearTrace( void ) +{ +#if defined( OSX ) && defined( CGLPROFILER_ENABLE ) + CGLSetOption( kCGLGOResetFunctionTrace, 0 ); +#else + Assert( !"impl me" ); +#endif +} + +void GLMProfilerEnableTrace( bool enable ) +{ +#if defined( OSX ) && defined( CGLPROFILER_ENABLE ) + CGLSetOption( kCGLGOEnableFunctionTrace, enable ? GL_TRUE : GL_FALSE ); +#else + Assert( !"impl me" ); +#endif +} + +// helpers for CGLSetParameter - no op if no profiler +void GLMProfilerDumpState( void ) +{ +#if defined( OSX ) && defined( CGLPROFILER_ENABLE ) + CGLContextObj curr = CGLGetCurrentContext(); + CGLSetParameter( curr, kCGLCPDumpState, (const GLint*)1 ); +#else + Assert( !"impl me" ); +#endif +} + + +//=============================================================================== + +CGLMFileMirror::CGLMFileMirror( char *fullpath ) +{ + m_path = strdup( fullpath ); + m_data = (char *)malloc(1); + m_size = 0; + UpdateStatInfo(); + if (m_exists) + { + ReadFile(); + } +} + +CGLMFileMirror::~CGLMFileMirror( ) +{ + if (m_path) + { + free (m_path); + m_path = NULL; + } + + if (m_data) + { + free (m_data); + m_data = NULL; + } +} + +bool CGLMFileMirror::HasData( void ) +{ + return (m_size != 0); +} + + +// return direct pointer to buffer. Will be invalidated if file is re-loaded or if data is written to +void CGLMFileMirror::GetData( char **dataPtr, uint *dataSizePtr ) +{ + *dataPtr = m_data; + *dataSizePtr = m_size; +} + + +void CGLMFileMirror::SetData( char *data, uint dataSize ) +{ + if (m_data) + { + free( m_data ); + m_data = NULL; + } + + m_size = dataSize; + + m_data = (char *)malloc( m_size +1 ); + m_data[ m_size ] = 0; // extra NULL terminator, no charge + + memcpy( m_data, data, m_size ); // copy data in + + WriteFile(); // keep disk copy sync'd +} + +static bool stat_diff( struct stat *a, struct stat *b ) +{ + if (a->st_size != b->st_size) + { + return true; + } + +#ifdef OSX + if (memcmp( &a->st_mtimespec, &b->st_mtimespec, sizeof( struct timespec ) ) ) +#else + if (memcmp( &a->st_mtime, &b->st_mtime, sizeof( time_t ) ) ) +#endif + { + return true; + } + + return false; +} + +bool CGLMFileMirror::PollForChanges( void ) +{ + // snapshot old stat + //bool old_exists = m_exists; + struct stat old_stat = m_stat; + + UpdateStatInfo(); + + if (m_exists) + { + if ( stat_diff( &old_stat, &m_stat ) ) + { + // initial difference detected. continue to poll at 0.1s intervals until it stops changing, then read it. + int stablecount = 0; + do + { + ThreadSleep(100000); + + struct stat last_stat = m_stat; + UpdateStatInfo(); + + if (stat_diff( &last_stat, &m_stat )) + { + stablecount = 0; + } + else + { + stablecount++; + } + } while(stablecount<3); + + // changes have settled down, now re-read it + ReadFile(); + return true; + } + else + { + return false; // no change + } + } + else + { + // file does not exist. remake it. not considered to be a change. + WriteFile(); + return false; + } +} + + + +void CGLMFileMirror::UpdateStatInfo( void ) +{ + // stat the path + struct stat newstat; + memset (&newstat, 0, sizeof(newstat) ); + int result = stat( m_path, &newstat ); + + if (!result) + { + m_exists = true; + m_stat = newstat; + } + else + { + m_exists = false; + memset( &m_stat, 0, sizeof( m_stat ) ); + } +} + + +void CGLMFileMirror::ReadFile( void ) +{ + // unconditional - we discard any old buffer, make a new one, + UpdateStatInfo(); + + if (m_data) + { + free( m_data ); + m_data = NULL; + } + + if (m_exists) + { + FILE *infile = fopen( m_path, "rb" ); + if (infile) + { + // get size from stat + m_size = m_stat.st_size; + + m_data = (char *)malloc( m_size +1 ); + m_data[ m_size ] = 0; // extra NULL terminator, no charge + + fread( m_data, 1, m_size, infile ); + + fclose( infile ); + } + else + { + GLMDebugger(); // ouch + } + + } + else + { + // hmmmmmm + m_data = (char *)malloc(1); + m_data[0] = 0; + m_size = 0; + } +} + + +void CGLMFileMirror::WriteFile( void ) +{ + FILE *outfile = fopen( m_path, "wb" ); + + if (outfile) + { + fwrite( m_data, 1, m_size, outfile ); + fclose( outfile ); + + UpdateStatInfo(); // sets m_stat and m_exists + } + else + { + GLMDebugger(); // ouch + } +} + +void CGLMFileMirror::OpenInEditor( bool foreground ) +{ + char temp[64000]; + + // pass -b if no desire to bring editor to foreground + sprintf(temp,"/usr/bin/bbedit %s %s", foreground ? "" : "-b", m_path ); + system( temp ); +} + + + +CGLMEditableTextItem::CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix ) +{ + // clone input text (exact size copy) + m_origSize = size; + m_origText = (char *)malloc( m_origSize ); + memcpy( m_origText, text, m_origSize ); + + // null out munged form til we generate it + m_mungedSize = 0; + m_mungedText = NULL; + + // null out mirror until we create it + m_mirrorBaseName = NULL; + m_mirrorFullPath = NULL; + m_mirror = NULL; + + GenHashOfOrigText(); // will fill out m_origDigest + GenMungedText( false ); + GenBaseNameAndFullPath( prefix, suffix ); // figure out where the mirror will go + + if (!strcmp(m_mirrorBaseName, "96c7e9d2faf76b1148f7274afd684d4b.fsh")) + { + printf("\nhello there\n"); + } + + // make the mirror from the filename. + // see if there was any content on disk + // if so, honor that content *unless* the force-option is set. + m_mirror = new CGLMFileMirror( m_mirrorFullPath ); + + // the logic is simple. + // the only time we will choose the copy on disk, is if + // a - forceOverwrite is false + // AND b - the copy on disk is bigger than 10 bytes. + + bool replaceDiskCopy = true; + + char *mirrorData = NULL; + uint mirrorSize = 0; + + if (!forceOverwrite) + { + if (m_mirror->HasData()) + { + // peek at it, and use it if it is more than some minimum number of bytes. + m_mirror->GetData( &mirrorData, &mirrorSize ); + if (mirrorSize > 10) + { + replaceDiskCopy = false; + } + } + } + + if (replaceDiskCopy) + { + // push our generated data to the mirror - disk copy is overwritten + m_mirror->SetData( m_mungedText, m_mungedSize ); + } + else + { + GenMungedText( true ); + } + +} + +CGLMEditableTextItem::~CGLMEditableTextItem( ) +{ + if (m_origText) + { + free (m_origText); + } + + if (m_mungedText) + { + free (m_mungedText); + } + + if (m_mirrorBaseName) + { + free (m_mirrorBaseName); + } + + if (m_mirrorFullPath) + { + free (m_mirrorFullPath); + } + + if (m_mirror) + { + free( m_mirror ); + } +} + +bool CGLMEditableTextItem::HasData( void ) +{ + return m_mirror->HasData(); +} + +bool CGLMEditableTextItem::PollForChanges( void ) +{ + bool changed = m_mirror->PollForChanges(); + if (changed) + { + // re-gen munged text from mirror (means "copy") + GenMungedText( true ); + } + return changed; +} + +void CGLMEditableTextItem::GetCurrentText( char **textOut, uint *sizeOut ) +{ + if (!m_mungedText) GLMDebugger(); + + *textOut = m_mungedText; + *sizeOut = m_mungedSize; +} + +void CGLMEditableTextItem::OpenInEditor( bool foreground ) +{ + m_mirror->OpenInEditor( foreground ); +} + + +void CGLMEditableTextItem::GenHashOfOrigText( void ) +{ + MD5Context_t md5ctx; + MD5Init( &md5ctx ); + MD5Update( &md5ctx, (unsigned char*)m_origText, m_origSize ); + MD5Final( m_origDigest, &md5ctx ); +} + + +void CGLMEditableTextItem::GenBaseNameAndFullPath( char *prefix, char *suffix ) +{ + // base name is hash digest in hex, plus the suffix. + char temp[5000]; + + Q_binarytohex( m_origDigest, sizeof(m_origDigest), temp, sizeof( temp ) ); + if (suffix) + { + strcat( temp, suffix ); + } + if (m_mirrorBaseName) free(m_mirrorBaseName); + m_mirrorBaseName = strdup( temp ); + + sprintf( temp, "%s%s", prefix, m_mirrorBaseName ); + if (m_mirrorFullPath) free(m_mirrorFullPath); + m_mirrorFullPath = strdup( temp ); +} + + +void CGLMEditableTextItem::GenMungedText( bool fromMirror ) +{ + if (fromMirror) + { + // just import the text as is from the mirror file. + + char *mirrorData = NULL; + uint mirrorSize = 0; + + if (m_mirror->HasData()) + { + // peek at it, and use it if it is more than some minimum number of bytes. + m_mirror->GetData( &mirrorData, &mirrorSize ); + + if (m_mungedText) + { + free( m_mungedText ); + m_mungedText = NULL; + } + + m_mungedText = (char *)malloc( mirrorSize+1 ); + m_mungedText[ mirrorSize ] = 0; + memcpy( m_mungedText, mirrorData, mirrorSize ); + + m_mungedSize = mirrorSize; + } + else + { + GLMDebugger(); + } + } + else + { + #if 1 + // we don't actually clone/munge any more. + if (m_mungedText) + { + free( m_mungedText ); + m_mungedText = NULL; + } + + m_mungedText = (char *)malloc( m_origSize+1 ); + m_mungedText[ m_origSize ] = 0; + memcpy( m_mungedText, m_origText, m_origSize ); + + m_mungedSize = m_origSize; + + #else + // take pure 'orig' text that came in from the engine, and clone it + // do not clone the first line + char temp[100000]; + char *dst = temp; + char *lim = &temp[ sizeof(temp) ]; + + // zero temp + memset( temp, 0, sizeof(temp) ); + + // write orig text to temp + if (m_origSize >= (sizeof(temp)/2) ) + { + GLMDebugger(); + } + + memcpy( dst, m_origText, m_origSize ); + dst += m_origSize; + + // add a newline if the last character wasn't + if ( (*(dst-1)) != '\n' ) + { + *dst++ = '\n'; + } + + // walk orig text again and copy it over, with these caveats + // don't copy the first line + // insert a # before all the other lines. + char *src = temp; + + // walk to end of first line + char *firstNewline = strchr( src, '\n' ); + if (!firstNewline) + { + GLMDebugger(); + } + else + { + // advance 'src' to that newline- we're not copying the !! line + src = firstNewline; + } + + + // now walk the rest - insert a # after each newline + while( (dst < lim) && ((src-temp) < m_origSize) ) + { + switch( *src ) + { + case '\n': + *dst++ = *src++; + *dst++ = '#'; + break; + + default: + *dst++ = *src++; + } + } + if (dst >= lim) + { + GLMDebugger(); + } + + // final newline + *dst++ = '\n'; + + // copyout + if (m_mungedText) + { + free( m_mungedText ); + m_mungedText = NULL; + } + + m_mungedSize = dst - temp; + m_mungedText = (char *)malloc( m_mungedSize ); + memcpy( m_mungedText, temp, m_mungedSize ); + #endif + } +} + +//=============================================================================== + +// class for cracking multi-part text blobs +// sections are demarcated by beginning-of-line markers submitted in a table by the caller +// typically +// asm flavors have first-line rules so we use those tags as is +// !!ARBvp (etc) +// !!ARBfp (etc) +// //!!GLSLF // slashes required +// //!GLSLV + +// maybe also introduce "present but disabled" markers like these +// -!!ARBvp (etc) +// -!!ARBfp (etc) +// -//!!GLSLF +// -//!GLSLV + +// resolved. there is no default section for text that doesn't have a marker in front of it. mark it or miss it. + +CGLMTextSectioner::CGLMTextSectioner( char *text, int textLength, const char **markers ) +{ + // find lines + // for each line, see if it starts with a marker + // if so, open a new section based at that line + + GLMTextSection *curSection = NULL; // no current section until we see a marker + + char *cursor = text; + char *textLimit = text+textLength; + + int foundMarker; + const char **markerCursor; + while( cursor < textLimit ) + { + // top of loop. cursor points to start of a line. + // find the end of the line and keep that handy. + char *eol = strchr( cursor, '\n' ); + int charsInLine = (eol) ? (eol-cursor)+1 : strlen(cursor); + + //see if any of the marker strings is located here. + foundMarker = -1; + markerCursor = markers; + + while( (foundMarker<0) && (*markerCursor!=NULL) ) + { + // see if the n'th marker is a hit + int markerLen = strlen(*markerCursor); + + if (!strncmp( cursor, *markerCursor, markerLen ) ) + { + // hit + foundMarker = markerCursor - markers; + } + markerCursor++; + } + + // outcome is either "marker spotted" or "no". + // if marker seen, open new section using that marker. + // else, grow active section if underway. + // then, move cursor to next line. + + if (foundMarker >= 0) + { + // found marker. start new section. + // no need to do anything special with prior section - it was up to date before seeing this marker. + int index = m_sectionTable.AddToTail(); + curSection = &m_sectionTable[ index ]; + + curSection->m_markerIndex = foundMarker; + curSection->m_textOffset = cursor - text; // text includes the marker + curSection->m_textLength = charsInLine; // this line goes in the tally, later lines add to it + } + else + { + // add this line to current section if live + if (curSection) + { + curSection->m_textLength += charsInLine; + } + } + cursor += charsInLine; + } +} + +CGLMTextSectioner::~CGLMTextSectioner( ) +{ + // not much to do. +} + + +int CGLMTextSectioner::Count( void ) +{ + return m_sectionTable.Count(); +} + +void CGLMTextSectioner::GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut ) +{ + Assert( index < m_sectionTable.Count() ); + + GLMTextSection *section = &m_sectionTable[ index ]; + + *offsetOut = section->m_textOffset; + *lengthOut = section->m_textLength; + *markerIndexOut = section->m_markerIndex; +} + +//=============================================================================== + +// how to make a compiled-in font: +// a. type in a matrix of characters in your fav editor +// b. take a screen shot of the characters (128x128 pixels in this case) +// c. export as TIFF raw. +// d. hex dump it +// e. column-copy just the hex data +// f. find and replace: chop out all the spaces and line feeds, change FFFFFF and 000000 to your marker chars of choice. +// g. wrap each line with quotes and a comma. + +unsigned char g_glmDebugFontMap[ 128 * 128 ] = +{ +" * " +" * * * * * " +" * * * * * *** * * ** * * * * * " +" * * * ***** * * * * * * * * * * * * * * * * " +" * * * * * * * * * * * * * *** * * " +" * ***** *** * * * * * * * ***** ***** * " +" * * * * * * * * * * * * * * * " +" * * * * * * * * * * * ** ** * " +" * *** * * ** * * * ** ** * " +" * * * * * " +" * " +" " +" " +" *** * *** *** * ***** *** ***** *** *** * * *** " +"* * ** * * * * ** * * * * * * * ** ** * * * * " +"* ** * * * * * **** **** * * * * * ** ** * ***** * * " +"* * * * * ** * * * * * * *** * * * * * " +"** * * * * ***** * * * * * * **** * ***** * * " +"* * * * * * * * * * * * * * * ** ** * * " +" *** * ***** *** * *** *** * *** *** ** ** * * * " +" * " +" * " +" " +" *** " +"* * *** **** *** **** ***** ***** *** * * * * * * * * * * * *** " +"* * * * * * * * * * * * * * * * * * * * * ** ** ** * * * " +"* * * * * * * * * * * * * * * * * * * * * * * * * * * * " +"*** * ***** **** * * * **** **** * ** ***** * * ** * * * * ** * * " +"* ** * * * * * * * * * * * * * * * * * * * * * * * * * " +"* * * * * * * * * * * * * * * * * * * * * * * * * * * " +"* * * * **** *** **** ***** * *** * * * *** * * ***** * * * * *** " +" *** " +" " +" * " +" ** * ** * " +"**** *** **** *** ***** * * * * * * * * * * ***** * * * * * " +"* * * * * * * * * * * * * * * * * * * * * * * * * " +"* * * * * * * * * * * * * * * * * * * * * " +"**** * * **** *** * * * * * * * * * * * * * * " +"* * * * * * * * * * * * * * * * * * * * " +"* * * * * * * * * * * ** ** * * * * * * * " +"* *** * * *** * *** * * * * * * ***** * * * ****** " +" * ** * ** " +" " +" " +" * " +" * * * ** * * * * * " +" * * * * * * * " +" **** **** *** **** *** *** **** **** * * * * * **** * ** *** " +" * * * * * * * * * * * * * * * * * * * * * * * ** * * * " +" * * * * * * * ***** * * * * * * * *** * * * * * * * * " +" * ** * * * * * * * * * * * * * * * * * * * * * * * " +" ** * **** **** **** **** * **** * * * * * * ** * * * * * *** " +" * * " +" *** ** " +" * " +" ** * ** " +" * * * * ** * " +" * * * * * ** *** " +"**** **** * ** **** **** * * * * * * * * * * * ***** * * * ***** " +"* * * * ** * * * * * * * * * * * * * * * ** * ** ***** " +"* * * * * *** * * * * * * * * * * * * * * * ***** " +"* * * * * * * * ** * * * * * * * * * * * * * *** " +"**** **** * **** ** ** * * * * * * **** ***** * * * " +"* * * ** * ** " +"* * *** * " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +" " +}; + + + + + + + + diff --git a/togles/linuxwin/glmgrcocoa.mm b/togles/linuxwin/glmgrcocoa.mm new file mode 100644 index 00000000..717c913d --- /dev/null +++ b/togles/linuxwin/glmgrcocoa.mm @@ -0,0 +1,34 @@ +//========= Copyright 1996-2009, Valve Corporation, All rights reserved. ============// +// +// Purpose: provide some call-out glue to ObjC from the C++ GLMgr code +// +// $Revision: $ +// $NoKeywords: $ +//=============================================================================// + + +#include +#include +#include +#include + +#undef MIN +#undef MAX +#define DONT_DEFINE_BOOL // Don't define BOOL! +#include "tier0/threadtools.h" +#include "tier1/interface.h" +#include "tier1/strtools.h" +#include "tier1/utllinkedlist.h" +#include "togl/rendermechanism.h" + + + +// ------------------------------------------------------------------------------------ // +// some glue to let GLMgr call into NS/ObjC classes. +// ------------------------------------------------------------------------------------ // + +CGLContextObj GetCGLContextFromNSGL( PseudoNSGLContextPtr nsglCtx ) +{ + return (CGLContextObj)[ (NSOpenGLContext*)nsglCtx CGLContextObj]; +} + diff --git a/togles/linuxwin/glmtexinlines.h b/togles/linuxwin/glmtexinlines.h new file mode 100644 index 00000000..cbdcc546 --- /dev/null +++ b/togles/linuxwin/glmtexinlines.h @@ -0,0 +1,29 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +#ifndef CGLMTEXINLINES_H +#define CGLMTEXINLINES_H + +#pragma once + +#endif // CGLMTEXINLINES_H diff --git a/togles/linuxwin/intelglmallocworkaround.cpp b/togles/linuxwin/intelglmallocworkaround.cpp new file mode 100644 index 00000000..efe0e0ad --- /dev/null +++ b/togles/linuxwin/intelglmallocworkaround.cpp @@ -0,0 +1,71 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +#include "intelglmallocworkaround.h" +#include "mach_override.h" + +// memdbgon -must- be the last include file in a .cpp file. +#include "tier0/memdbgon.h" + +IntelGLMallocWorkaround* IntelGLMallocWorkaround::s_pWorkaround = NULL; + +void *IntelGLMallocWorkaround::ZeroingAlloc(size_t size) +{ + // We call into this pointer that resumes the original malloc. + void *memory = s_pWorkaround->m_pfnMallocReentry(size); + if (size < 96) + { + // Since the Intel driver has an issue with a small allocation + // that's left uninitialized, we use memset to ensure it's zero-initialized. + memset(memory, 0, size); + } + + return memory; +} + +IntelGLMallocWorkaround* IntelGLMallocWorkaround::Get() +{ + if (!s_pWorkaround) + { + s_pWorkaround = new IntelGLMallocWorkaround(); + } + + return s_pWorkaround; +} + +bool IntelGLMallocWorkaround::Enable() +{ + if ( m_pfnMallocReentry != NULL ) + { + return true; + } + + mach_error_t error = mach_override_ptr( (void*)&malloc, (const void*)&ZeroingAlloc, (void**)&m_pfnMallocReentry ); + if ( error == err_cannot_override ) + { + m_pfnMallocReentry = NULL; + return false; + } + + return true; +} \ No newline at end of file diff --git a/togles/linuxwin/intelglmallocworkaround.h b/togles/linuxwin/intelglmallocworkaround.h new file mode 100644 index 00000000..630972d1 --- /dev/null +++ b/togles/linuxwin/intelglmallocworkaround.h @@ -0,0 +1,61 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// TOGL CODE LICENSE +// +// Copyright 2011-2014 Valve Corporation +// All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// intelglmallocworkaround.h +// class responsible for setting up a malloc override that zeroes allocated +// memory of less than 96 bytes. this is to work around a bug +// in the Intel GLSL compiler on Mac OS X 10.8 due to uninitialized memory. +// +// 96 was chosen due to this quote from Apple: +// "I verified that the size of the structure is exactly 64 bytes on 10.8.3, 10.8.4 and will be on 10.8.5." +// +// certain GLSL shaders would (intermittently) cause a crash the first time they +// were drawn, and the bug has supposedly been fixed in 10.9, but is unlikely to +// ever make it to 10.8. +// +//=============================================================================== + +#ifndef INTELGLMALLOCWORKAROUND_H +#define INTELGLMALLOCWORKAROUND_H + +#include + +class IntelGLMallocWorkaround +{ +public: + static IntelGLMallocWorkaround *Get(); + bool Enable(); + +protected: + IntelGLMallocWorkaround() :m_pfnMallocReentry(NULL) {} + ~IntelGLMallocWorkaround() {} + + static IntelGLMallocWorkaround *s_pWorkaround; + static void* ZeroingAlloc(size_t); + + typedef void* (*pfnMalloc_t)(size_t); + pfnMalloc_t m_pfnMallocReentry; +}; + +#endif // INTELGLMALLOCWORKAROUND_H \ No newline at end of file diff --git a/togles/linuxwin/mach_override.c b/togles/linuxwin/mach_override.c new file mode 100644 index 00000000..76302767 --- /dev/null +++ b/togles/linuxwin/mach_override.c @@ -0,0 +1,765 @@ +// mach_override.c semver:1.2.0 +// Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com +// Some rights reserved: http://opensource.org/licenses/mit +// https://github.com/rentzsch/mach_override + +#include "mach_override.h" + +#include +#include +#include +#include +#include +#include + +#include + +/************************** +* +* Constants +* +**************************/ +#pragma mark - +#pragma mark (Constants) + +#define kPageSize 4096 +#if defined(__ppc__) || defined(__POWERPC__) + +long kIslandTemplate[] = { + 0x9001FFFC, // stw r0,-4(SP) + 0x3C00DEAD, // lis r0,0xDEAD + 0x6000BEEF, // ori r0,r0,0xBEEF + 0x7C0903A6, // mtctr r0 + 0x8001FFFC, // lwz r0,-4(SP) + 0x60000000, // nop ; optionally replaced + 0x4E800420 // bctr +}; + +#define kAddressHi 3 +#define kAddressLo 5 +#define kInstructionHi 10 +#define kInstructionLo 11 + +#elif defined(__i386__) + +#define kOriginalInstructionsSize 16 +// On X86 we migh need to instert an add with a 32 bit immediate after the +// original instructions. +#define kMaxFixupSizeIncrease 5 + +unsigned char kIslandTemplate[] = { + // kOriginalInstructionsSize nop instructions so that we + // should have enough space to host original instructions + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + // Now the real jump instruction + 0xE9, 0xEF, 0xBE, 0xAD, 0xDE +}; + +#define kInstructions 0 +#define kJumpAddress kInstructions + kOriginalInstructionsSize + 1 +#elif defined(__x86_64__) + +#define kOriginalInstructionsSize 32 +// On X86-64 we never need to instert a new instruction. +#define kMaxFixupSizeIncrease 0 + +#define kJumpAddress kOriginalInstructionsSize + 6 + +unsigned char kIslandTemplate[] = { + // kOriginalInstructionsSize nop instructions so that we + // should have enough space to host original instructions + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + // Now the real jump instruction + 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +#endif + +/************************** +* +* Data Types +* +**************************/ +#pragma mark - +#pragma mark (Data Types) + +typedef struct { + char instructions[sizeof(kIslandTemplate)]; +} BranchIsland; + +/************************** +* +* Funky Protos +* +**************************/ +#pragma mark - +#pragma mark (Funky Protos) + +static mach_error_t +allocateBranchIsland( + BranchIsland **island, + void *originalFunctionAddress); + + mach_error_t +freeBranchIsland( + BranchIsland *island ); + +#if defined(__ppc__) || defined(__POWERPC__) + mach_error_t +setBranchIslandTarget( + BranchIsland *island, + const void *branchTo, + long instruction ); +#endif + +#if defined(__i386__) || defined(__x86_64__) +mach_error_t +setBranchIslandTarget_i386( + BranchIsland *island, + const void *branchTo, + char* instructions ); +void +atomic_mov64( + uint64_t *targetAddress, + uint64_t value ); + + static Boolean +eatKnownInstructions( + unsigned char *code, + uint64_t *newInstruction, + int *howManyEaten, + char *originalInstructions, + int *originalInstructionCount, + uint8_t *originalInstructionSizes ); + + static void +fixupInstructions( + uint32_t offset, + void *instructionsToFix, + int instructionCount, + uint8_t *instructionSizes ); +#endif + +/******************************************************************************* +* +* Interface +* +*******************************************************************************/ +#pragma mark - +#pragma mark (Interface) + +#if defined(__i386__) || defined(__x86_64__) +mach_error_t makeIslandExecutable(void *address) { + mach_error_t err = err_none; + uintptr_t page = (uintptr_t)address & ~(uintptr_t)(kPageSize-1); + int e = err_none; + e |= mprotect((void *)page, kPageSize, PROT_EXEC | PROT_READ | PROT_WRITE); + e |= msync((void *)page, kPageSize, MS_INVALIDATE ); + if (e) { + err = err_cannot_override; + } + return err; +} +#endif + + mach_error_t +mach_override_ptr( + void *originalFunctionAddress, + const void *overrideFunctionAddress, + void **originalFunctionReentryIsland ) +{ + assert( originalFunctionAddress ); + assert( overrideFunctionAddress ); + + // this addresses overriding such functions as AudioOutputUnitStart() + // test with modified DefaultOutputUnit project +#if defined(__x86_64__) + for(;;){ + if(*(uint16_t*)originalFunctionAddress==0x25FF) // jmp qword near [rip+0x????????] + originalFunctionAddress=*(void**)((char*)originalFunctionAddress+6+*(int32_t *)((uint16_t*)originalFunctionAddress+1)); + else break; + } +#elif defined(__i386__) + for(;;){ + if(*(uint16_t*)originalFunctionAddress==0x25FF) // jmp *0x???????? + originalFunctionAddress=**(void***)((uint16_t*)originalFunctionAddress+1); + else break; + } +#endif + + long *originalFunctionPtr = (long*) originalFunctionAddress; + mach_error_t err = err_none; + +#if defined(__ppc__) || defined(__POWERPC__) + // Ensure first instruction isn't 'mfctr'. + #define kMFCTRMask 0xfc1fffff + #define kMFCTRInstruction 0x7c0903a6 + + long originalInstruction = *originalFunctionPtr; + if( !err && ((originalInstruction & kMFCTRMask) == kMFCTRInstruction) ) + err = err_cannot_override; +#elif defined(__i386__) || defined(__x86_64__) + int eatenCount = 0; + int originalInstructionCount = 0; + char originalInstructions[kOriginalInstructionsSize]; + uint8_t originalInstructionSizes[kOriginalInstructionsSize]; + uint64_t jumpRelativeInstruction = 0; // JMP + + Boolean overridePossible = eatKnownInstructions ((unsigned char *)originalFunctionPtr, + &jumpRelativeInstruction, &eatenCount, + originalInstructions, &originalInstructionCount, + originalInstructionSizes ); + if (eatenCount + kMaxFixupSizeIncrease > kOriginalInstructionsSize) { + //printf ("Too many instructions eaten\n"); + overridePossible = false; + } + if (!overridePossible) err = err_cannot_override; + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); +#endif + + // Make the original function implementation writable. + if( !err ) { + err = vm_protect( mach_task_self(), + (vm_address_t) originalFunctionPtr, 8, false, + (VM_PROT_ALL | VM_PROT_COPY) ); + if( err ) + err = vm_protect( mach_task_self(), + (vm_address_t) originalFunctionPtr, 8, false, + (VM_PROT_DEFAULT | VM_PROT_COPY) ); + } + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + + // Allocate and target the escape island to the overriding function. + BranchIsland *escapeIsland = NULL; + if( !err ) + err = allocateBranchIsland( &escapeIsland, originalFunctionAddress ); + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + + +#if defined(__ppc__) || defined(__POWERPC__) + if( !err ) + err = setBranchIslandTarget( escapeIsland, overrideFunctionAddress, 0 ); + + // Build the branch absolute instruction to the escape island. + long branchAbsoluteInstruction = 0; // Set to 0 just to silence warning. + if( !err ) { + long escapeIslandAddress = ((long) escapeIsland) & 0x3FFFFFF; + branchAbsoluteInstruction = 0x48000002 | escapeIslandAddress; + } +#elif defined(__i386__) || defined(__x86_64__) + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + + if( !err ) + err = setBranchIslandTarget_i386( escapeIsland, overrideFunctionAddress, 0 ); + + if (err) fprintf(stderr, "err = %x %s:%d\n", err, __FILE__, __LINE__); + // Build the jump relative instruction to the escape island +#endif + + +#if defined(__i386__) || defined(__x86_64__) + if (!err) { + uint32_t addressOffset = ((char*)escapeIsland - (char*)originalFunctionPtr - 5); + addressOffset = OSSwapInt32(addressOffset); + + jumpRelativeInstruction |= 0xE900000000000000LL; + jumpRelativeInstruction |= ((uint64_t)addressOffset & 0xffffffff) << 24; + jumpRelativeInstruction = OSSwapInt64(jumpRelativeInstruction); + } +#endif + + // Optionally allocate & return the reentry island. This may contain relocated + // jmp instructions and so has all the same addressing reachability requirements + // the escape island has to the original function, except the escape island is + // technically our original function. + BranchIsland *reentryIsland = NULL; + if( !err && originalFunctionReentryIsland ) { + err = allocateBranchIsland( &reentryIsland, escapeIsland); + if( !err ) + *originalFunctionReentryIsland = reentryIsland; + } + +#if defined(__ppc__) || defined(__POWERPC__) + // Atomically: + // o If the reentry island was allocated: + // o Insert the original instruction into the reentry island. + // o Target the reentry island at the 2nd instruction of the + // original function. + // o Replace the original instruction with the branch absolute. + if( !err ) { + int escapeIslandEngaged = false; + do { + if( reentryIsland ) + err = setBranchIslandTarget( reentryIsland, + (void*) (originalFunctionPtr+1), originalInstruction ); + if( !err ) { + escapeIslandEngaged = CompareAndSwap( originalInstruction, + branchAbsoluteInstruction, + (UInt32*)originalFunctionPtr ); + if( !escapeIslandEngaged ) { + // Someone replaced the instruction out from under us, + // re-read the instruction, make sure it's still not + // 'mfctr' and try again. + originalInstruction = *originalFunctionPtr; + if( (originalInstruction & kMFCTRMask) == kMFCTRInstruction) + err = err_cannot_override; + } + } + } while( !err && !escapeIslandEngaged ); + } +#elif defined(__i386__) || defined(__x86_64__) + // Atomically: + // o If the reentry island was allocated: + // o Insert the original instructions into the reentry island. + // o Target the reentry island at the first non-replaced + // instruction of the original function. + // o Replace the original first instructions with the jump relative. + // + // Note that on i386, we do not support someone else changing the code under our feet + if ( !err ) { + uint32_t offset = (uintptr_t)originalFunctionPtr - (uintptr_t)reentryIsland; + fixupInstructions(offset, originalInstructions, + originalInstructionCount, originalInstructionSizes ); + + if( reentryIsland ) + err = setBranchIslandTarget_i386( reentryIsland, + (void*) ((char *)originalFunctionPtr+eatenCount), originalInstructions ); + // try making islands executable before planting the jmp +#if defined(__x86_64__) || defined(__i386__) + if( !err ) + err = makeIslandExecutable(escapeIsland); + if( !err && reentryIsland ) + err = makeIslandExecutable(reentryIsland); +#endif + if ( !err ) + atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelativeInstruction); + } +#endif + + // Clean up on error. + if( err ) { + if( reentryIsland ) + freeBranchIsland( reentryIsland ); + if( escapeIsland ) + freeBranchIsland( escapeIsland ); + } + + return err; +} + +/******************************************************************************* +* +* Implementation +* +*******************************************************************************/ +#pragma mark - +#pragma mark (Implementation) + +static bool jump_in_range(intptr_t from, intptr_t to) { + intptr_t field_value = to - from - 5; + int32_t field_value_32 = field_value; + return field_value == field_value_32; +} + +/******************************************************************************* + Implementation: Allocates memory for a branch island. + + @param island <- The allocated island. + @result <- mach_error_t + + ***************************************************************************/ + +static mach_error_t +allocateBranchIslandAux( + BranchIsland **island, + void *originalFunctionAddress, + bool forward) +{ + assert( island ); + assert( sizeof( BranchIsland ) <= kPageSize ); + + vm_map_t task_self = mach_task_self(); + vm_address_t original_address = (vm_address_t) originalFunctionAddress; + vm_address_t address = original_address; + + for (;;) { + vm_size_t vmsize = 0; + memory_object_name_t object = 0; + kern_return_t kr = 0; + vm_region_flavor_t flavor = VM_REGION_BASIC_INFO; + // Find the region the address is in. +#if __WORDSIZE == 32 + vm_region_basic_info_data_t info; + mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT; + kr = vm_region(task_self, &address, &vmsize, flavor, + (vm_region_info_t)&info, &info_count, &object); +#else + vm_region_basic_info_data_64_t info; + mach_msg_type_number_t info_count = VM_REGION_BASIC_INFO_COUNT_64; + kr = vm_region_64(task_self, &address, &vmsize, flavor, + (vm_region_info_t)&info, &info_count, &object); +#endif + if (kr != KERN_SUCCESS) + return kr; + assert((address & (kPageSize - 1)) == 0); + + // Go to the first page before or after this region + vm_address_t new_address = forward ? address + vmsize : address - kPageSize; +#if __WORDSIZE == 64 + if(!jump_in_range(original_address, new_address)) + break; +#endif + address = new_address; + + // Try to allocate this page. + kr = vm_allocate(task_self, &address, kPageSize, 0); + if (kr == KERN_SUCCESS) { + *island = (BranchIsland*) address; + return err_none; + } + if (kr != KERN_NO_SPACE) + return kr; + } + + return KERN_NO_SPACE; +} + +static mach_error_t +allocateBranchIsland( + BranchIsland **island, + void *originalFunctionAddress) +{ + mach_error_t err = + allocateBranchIslandAux(island, originalFunctionAddress, true); + if (!err) + return err; + return allocateBranchIslandAux(island, originalFunctionAddress, false); +} + + +/******************************************************************************* + Implementation: Deallocates memory for a branch island. + + @param island -> The island to deallocate. + @result <- mach_error_t + + ***************************************************************************/ + + mach_error_t +freeBranchIsland( + BranchIsland *island ) +{ + assert( island ); + assert( (*(long*)&island->instructions[0]) == kIslandTemplate[0] ); + assert( sizeof( BranchIsland ) <= kPageSize ); + return vm_deallocate( mach_task_self(), (vm_address_t) island, + kPageSize ); +} + +/******************************************************************************* + Implementation: Sets the branch island's target, with an optional + instruction. + + @param island -> The branch island to insert target into. + @param branchTo -> The address of the target. + @param instruction -> Optional instruction to execute prior to branch. Set + to zero for nop. + @result <- mach_error_t + + ***************************************************************************/ +#if defined(__ppc__) || defined(__POWERPC__) + mach_error_t +setBranchIslandTarget( + BranchIsland *island, + const void *branchTo, + long instruction ) +{ + // Copy over the template code. + bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); + + // Fill in the address. + ((short*)island->instructions)[kAddressLo] = ((long) branchTo) & 0x0000FFFF; + ((short*)island->instructions)[kAddressHi] + = (((long) branchTo) >> 16) & 0x0000FFFF; + + // Fill in the (optional) instuction. + if( instruction != 0 ) { + ((short*)island->instructions)[kInstructionLo] + = instruction & 0x0000FFFF; + ((short*)island->instructions)[kInstructionHi] + = (instruction >> 16) & 0x0000FFFF; + } + + //MakeDataExecutable( island->instructions, sizeof( kIslandTemplate ) ); + msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); + + return err_none; +} +#endif + +#if defined(__i386__) + mach_error_t +setBranchIslandTarget_i386( + BranchIsland *island, + const void *branchTo, + char* instructions ) +{ + + // Copy over the template code. + bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); + + // copy original instructions + if (instructions) { + bcopy (instructions, island->instructions + kInstructions, kOriginalInstructionsSize); + } + + // Fill in the address. + int32_t addressOffset = (char *)branchTo - (island->instructions + kJumpAddress + 4); + *((int32_t *)(island->instructions + kJumpAddress)) = addressOffset; + + msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); + return err_none; +} + +#elif defined(__x86_64__) +mach_error_t +setBranchIslandTarget_i386( + BranchIsland *island, + const void *branchTo, + char* instructions ) +{ + // Copy over the template code. + bcopy( kIslandTemplate, island->instructions, sizeof( kIslandTemplate ) ); + + // Copy original instructions. + if (instructions) { + bcopy (instructions, island->instructions, kOriginalInstructionsSize); + } + + // Fill in the address. + *((uint64_t *)(island->instructions + kJumpAddress)) = (uint64_t)branchTo; + msync( island->instructions, sizeof( kIslandTemplate ), MS_INVALIDATE ); + + return err_none; +} +#endif + + +#if defined(__i386__) || defined(__x86_64__) +// simplistic instruction matching +typedef struct { + unsigned int length; // max 15 + unsigned char mask[15]; // sequence of bytes in memory order + unsigned char constraint[15]; // sequence of bytes in memory order +} AsmInstructionMatch; + +#if defined(__i386__) +static AsmInstructionMatch possibleInstructions[] = { + { 0x5, {0xFF, 0x00, 0x00, 0x00, 0x00}, {0xE9, 0x00, 0x00, 0x00, 0x00} }, // jmp 0x???????? + { 0x5, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0x55, 0x89, 0xe5, 0xc9, 0xc3} }, // push %ebp; mov %esp,%ebp; leave; ret + { 0x1, {0xFF}, {0x90} }, // nop + { 0x1, {0xFF}, {0x55} }, // push %esp + { 0x2, {0xFF, 0xFF}, {0x89, 0xE5} }, // mov %esp,%ebp + { 0x1, {0xFF}, {0x53} }, // push %ebx + { 0x3, {0xFF, 0xFF, 0x00}, {0x83, 0xEC, 0x00} }, // sub 0x??, %esp + { 0x6, {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00}, {0x81, 0xEC, 0x00, 0x00, 0x00, 0x00} }, // sub 0x??, %esp with 32bit immediate + { 0x1, {0xFF}, {0x57} }, // push %edi + { 0x1, {0xFF}, {0x56} }, // push %esi + { 0x2, {0xFF, 0xFF}, {0x31, 0xC0} }, // xor %eax, %eax + { 0x3, {0xFF, 0x4F, 0x00}, {0x8B, 0x45, 0x00} }, // mov $imm(%ebp), %reg + { 0x3, {0xFF, 0x4C, 0x00}, {0x8B, 0x40, 0x00} }, // mov $imm(%eax-%edx), %reg + { 0x4, {0xFF, 0xFF, 0xFF, 0x00}, {0x8B, 0x4C, 0x24, 0x00} }, // mov $imm(%esp), %ecx + { 0x5, {0xFF, 0x00, 0x00, 0x00, 0x00}, {0xB8, 0x00, 0x00, 0x00, 0x00} }, // mov $imm, %eax + { 0x6, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xE8, 0x00, 0x00, 0x00, 0x00, 0x58} }, // call $imm; pop %eax + { 0x0 } +}; +#elif defined(__x86_64__) +static AsmInstructionMatch possibleInstructions[] = { + { 0x5, {0xFF, 0x00, 0x00, 0x00, 0x00}, {0xE9, 0x00, 0x00, 0x00, 0x00} }, // jmp 0x???????? + { 0x1, {0xFF}, {0x90} }, // nop + { 0x1, {0xF8}, {0x50} }, // push %rX + { 0x3, {0xFF, 0xFF, 0xFF}, {0x48, 0x89, 0xE5} }, // mov %rsp,%rbp + { 0x4, {0xFF, 0xFF, 0xFF, 0x00}, {0x48, 0x83, 0xEC, 0x00} }, // sub 0x??, %rsp + { 0x4, {0xFB, 0xFF, 0x00, 0x00}, {0x48, 0x89, 0x00, 0x00} }, // move onto rbp + { 0x4, {0xFF, 0xFF, 0xFF, 0xFF}, {0x40, 0x0f, 0xbe, 0xce} }, // movsbl %sil, %ecx + { 0x2, {0xFF, 0x00}, {0x41, 0x00} }, // push %rXX + { 0x2, {0xFF, 0x00}, {0x85, 0x00} }, // test %rX,%rX + { 0x5, {0xF8, 0x00, 0x00, 0x00, 0x00}, {0xB8, 0x00, 0x00, 0x00, 0x00} }, // mov $imm, %reg + { 0x3, {0xFF, 0xFF, 0x00}, {0xFF, 0x77, 0x00} }, // pushq $imm(%rdi) + { 0x2, {0xFF, 0xFF}, {0x31, 0xC0} }, // xor %eax, %eax + { 0x2, {0xFF, 0xFF}, {0x89, 0xF8} }, // mov %edi, %eax + + //leaq offset(%rip),%rax + { 0x7, {0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00}, {0x48, 0x8d, 0x05, 0x00, 0x00, 0x00, 0x00} }, + + { 0x0 } +}; +#endif + +static Boolean codeMatchesInstruction(unsigned char *code, AsmInstructionMatch* instruction) +{ + Boolean match = true; + + size_t i; + for (i=0; ilength; i++) { + unsigned char mask = instruction->mask[i]; + unsigned char constraint = instruction->constraint[i]; + unsigned char codeValue = code[i]; + + match = ((codeValue & mask) == constraint); + if (!match) break; + } + + return match; +} + +#if defined(__i386__) || defined(__x86_64__) + static Boolean +eatKnownInstructions( + unsigned char *code, + uint64_t *newInstruction, + int *howManyEaten, + char *originalInstructions, + int *originalInstructionCount, + uint8_t *originalInstructionSizes ) +{ + Boolean allInstructionsKnown = true; + int totalEaten = 0; + unsigned char* ptr = code; + int remainsToEat = 5; // a JMP instruction takes 5 bytes + int instructionIndex = 0; + + if (howManyEaten) *howManyEaten = 0; + if (originalInstructionCount) *originalInstructionCount = 0; + while (remainsToEat > 0) { + Boolean curInstructionKnown = false; + + // See if instruction matches one we know + AsmInstructionMatch* curInstr = possibleInstructions; + do { + if ((curInstructionKnown = codeMatchesInstruction(ptr, curInstr))) break; + curInstr++; + } while (curInstr->length > 0); + + // if all instruction matches failed, we don't know current instruction then, stop here + if (!curInstructionKnown) { + allInstructionsKnown = false; + fprintf(stderr, "mach_override: some instructions unknown! Need to update mach_override.c\n"); + break; + } + + // At this point, we've matched curInstr + int eaten = curInstr->length; + ptr += eaten; + remainsToEat -= eaten; + totalEaten += eaten; + + if (originalInstructionSizes) originalInstructionSizes[instructionIndex] = eaten; + instructionIndex += 1; + if (originalInstructionCount) *originalInstructionCount = instructionIndex; + } + + + if (howManyEaten) *howManyEaten = totalEaten; + + if (originalInstructions) { + Boolean enoughSpaceForOriginalInstructions = (totalEaten < kOriginalInstructionsSize); + + if (enoughSpaceForOriginalInstructions) { + memset(originalInstructions, 0x90 /* NOP */, kOriginalInstructionsSize); // fill instructions with NOP + bcopy(code, originalInstructions, totalEaten); + } else { + // printf ("Not enough space in island to store original instructions. Adapt the island definition and kOriginalInstructionsSize\n"); + return false; + } + } + + if (allInstructionsKnown) { + // save last 3 bytes of first 64bits of codre we'll replace + uint64_t currentFirst64BitsOfCode = *((uint64_t *)code); + currentFirst64BitsOfCode = OSSwapInt64(currentFirst64BitsOfCode); // back to memory representation + currentFirst64BitsOfCode &= 0x0000000000FFFFFFLL; + + // keep only last 3 instructions bytes, first 5 will be replaced by JMP instr + *newInstruction &= 0xFFFFFFFFFF000000LL; // clear last 3 bytes + *newInstruction |= (currentFirst64BitsOfCode & 0x0000000000FFFFFFLL); // set last 3 bytes + } + + return allInstructionsKnown; +} + + static void +fixupInstructions( + uint32_t offset, + void *instructionsToFix, + int instructionCount, + uint8_t *instructionSizes ) +{ + // The start of "leaq offset(%rip),%rax" + static const uint8_t LeaqHeader[] = {0x48, 0x8d, 0x05}; + + int index; + for (index = 0;index < instructionCount;index += 1) + { + if (*(uint8_t*)instructionsToFix == 0xE9) // 32-bit jump relative + { + uint32_t *jumpOffsetPtr = (uint32_t*)((uintptr_t)instructionsToFix + 1); + *jumpOffsetPtr += offset; + } + + // leaq offset(%rip),%rax + if (memcmp(instructionsToFix, LeaqHeader, 3) == 0) { + uint32_t *LeaqOffsetPtr = (uint32_t*)((uintptr_t)instructionsToFix + 3); + *LeaqOffsetPtr += offset; + } + + // 32-bit call relative to the next addr; pop %eax + if (*(uint8_t*)instructionsToFix == 0xE8) + { + // Just this call is larger than the jump we use, so we + // know this is the last instruction. + assert(index == (instructionCount - 1)); + assert(instructionSizes[index] == 6); + + // Insert "addl $offset, %eax" in the end so that when + // we jump to the rest of the function %eax has the + // value it would have if eip had been pushed by the + // call in its original position. + uint8_t *op = (uint8_t*)instructionsToFix; + op += 6; + *op = 0x05; // addl + uint32_t *addImmPtr = (uint32_t*)(op + 1); + *addImmPtr = offset; + } + + instructionsToFix = (void*)((uintptr_t)instructionsToFix + instructionSizes[index]); + } +} +#endif + +#if defined(__i386__) +void atomic_mov64( + uint64_t *targetAddress, + uint64_t value) +{ + while (true) + { + uint64_t old_value = *targetAddress; + if (OSAtomicCompareAndSwap64(old_value, value, (int64_t*)targetAddress)) return; + } +} +#elif defined(__x86_64__) +void atomic_mov64( + uint64_t *targetAddress, + uint64_t value ) +{ + *targetAddress = value; +} +#endif +#endif diff --git a/togles/linuxwin/mach_override.h b/togles/linuxwin/mach_override.h new file mode 100644 index 00000000..ecd319c1 --- /dev/null +++ b/togles/linuxwin/mach_override.h @@ -0,0 +1,76 @@ +// mach_override.h semver:1.2.0 +// Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com +// Some rights reserved: http://opensource.org/licenses/mit +// https://github.com/rentzsch/mach_override + +#ifndef _mach_override_ +#define _mach_override_ + +#include +#include + +#define err_cannot_override (err_local|1) + +__BEGIN_DECLS + +/**************************************************************************************** + Dynamically overrides the function implementation referenced by + originalFunctionAddress with the implentation pointed to by overrideFunctionAddress. + Optionally returns a pointer to a "reentry island" which, if jumped to, will resume + the original implementation. + + @param originalFunctionAddress -> Required address of the function to + override (with overrideFunctionAddress). + @param overrideFunctionAddress -> Required address to the overriding + function. + @param originalFunctionReentryIsland <- Optional pointer to pointer to the + reentry island. Can be NULL. + @result <- err_cannot_override if the original + function's implementation begins with + the 'mfctr' instruction. + + ************************************************************************************/ + + mach_error_t +mach_override_ptr( + void *originalFunctionAddress, + const void *overrideFunctionAddress, + void **originalFunctionReentryIsland ); + +__END_DECLS + +/**************************************************************************************** + If you're using C++ this macro will ease the tedium of typedef'ing, naming, keeping + track of reentry islands and defining your override code. See test_mach_override.cp + for example usage. + + ************************************************************************************/ + +#ifdef __cplusplus +#define MACH_OVERRIDE( ORIGINAL_FUNCTION_RETURN_TYPE, ORIGINAL_FUNCTION_NAME, ORIGINAL_FUNCTION_ARGS, ERR ) \ +{ \ + static ORIGINAL_FUNCTION_RETURN_TYPE (*ORIGINAL_FUNCTION_NAME##_reenter)ORIGINAL_FUNCTION_ARGS; \ + static bool ORIGINAL_FUNCTION_NAME##_overriden = false; \ + class mach_override_class__##ORIGINAL_FUNCTION_NAME { \ + public: \ + static kern_return_t override(void *originalFunctionPtr) { \ + kern_return_t result = err_none; \ + if (!ORIGINAL_FUNCTION_NAME##_overriden) { \ + ORIGINAL_FUNCTION_NAME##_overriden = true; \ + result = mach_override_ptr( (void*)originalFunctionPtr, \ + (void*)mach_override_class__##ORIGINAL_FUNCTION_NAME::replacement, \ + (void**)&ORIGINAL_FUNCTION_NAME##_reenter ); \ + } \ + return result; \ + } \ + static ORIGINAL_FUNCTION_RETURN_TYPE replacement ORIGINAL_FUNCTION_ARGS { + +#define END_MACH_OVERRIDE( ORIGINAL_FUNCTION_NAME ) \ + } \ + }; \ + \ + err = mach_override_class__##ORIGINAL_FUNCTION_NAME::override((void*)ORIGINAL_FUNCTION_NAME); \ +} +#endif + +#endif // _mach_override_ diff --git a/togles/togl.vpc b/togles/togl.vpc new file mode 100644 index 00000000..dadbcd72 --- /dev/null +++ b/togles/togl.vpc @@ -0,0 +1,116 @@ +//----------------------------------------------------------------------------- +// TOGL.VPC +// +// Project Script +//----------------------------------------------------------------------------- + +$Macro SRCDIR ".." [$WIN32] +$Macro SRCDIR ".." [!$WIN32] +$Macro OUTBINDIR $LIBPUBLIC +$Macro OUTBINNAME "togl" +$Macro TOGL_SRCDIR "$SRCDIR/togl/linuxwin" +$Macro TOGL_INCDIR "$SRCDIR/public/togl/linuxwin" + + +$include "$SRCDIR\vpc_scripts\source_dll_base.vpc" + +// Common Configuration +$Configuration +{ + $Compiler + { + $AdditionalIncludeDirectories "$BASE;..\" + $PreprocessorDefinitions "$BASE;TOGL_DLL_EXPORT;PROTECTED_THINGS_ENABLE;strncpy=use_Q_strncpy_instead;_snprintf=use_Q_snprintf_instead" [!$OSXALL] + $PreprocessorDefinitions "$BASE;TOGL_DLL_EXPORT" [$OSXALL] + + } + + $Linker + { + $ImportLibrary "$LIBPUBLIC\$_IMPLIB_PREFIX$OUTBINNAME$_IMPLIB_EXT" [!$X360 && !$OSXALL] + $ImportLibrary "$SRCDIR\lib\$PLATFORM\$_IMPLIB_PREFIX$OUTBINNAME$_IMPLIB_EXT" [$OSXALL] + } + + $Linker [$OSXALL] + { + $SystemFrameworks "Carbon;OpenGL;Quartz;Cocoa;IOKit" + } + + // togl/tier0/vstdlib traditionally used "lib" prefix though nobody else seems to. + $Linker [$POSIX] + { + $OutputFile "$(OBJ_DIR)/$_IMPLIB_PREFIX$OUTBINNAME$_DLL_EXT" + } + + $General [$POSIX] + { + $GameOutputFile "$OUTBINDIR/$_IMPLIB_PREFIX$OUTBINNAME$_DLL_EXT" + } + + $PreLinkEvent [$WINDOWS] + { + $CommandLine "call $SRCDIR\vpc_scripts\valve_p4_edit.cmd $LIBPUBLIC\$(TargetName).lib $SRCDIR" "\n" \ + "$BASE" + } +} + +$Project "togl" +{ + $Folder "Source Files" [$GL] + { + $File "$TOGL_SRCDIR/dx9asmtogl2.cpp" + $File "$TOGL_SRCDIR/dxabstract.cpp" + $File "$TOGL_SRCDIR/glentrypoints.cpp" + $File "$TOGL_SRCDIR/glmgr.cpp" + $File "$TOGL_SRCDIR/glmgrbasics.cpp" + $File "$TOGL_SRCDIR/glmgrcocoa.mm" [$OSXALL] + $File "$TOGL_SRCDIR/intelglmallocworkaround.cpp" [$OSXALL] + $File "$TOGL_SRCDIR/mach_override.c" [$OSXALL] + $File "$TOGL_SRCDIR/cglmtex.cpp" + $File "$TOGL_SRCDIR/cglmfbo.cpp" + $File "$TOGL_SRCDIR/cglmprogram.cpp" + $File "$TOGL_SRCDIR/cglmbuffer.cpp" + $File "$TOGL_SRCDIR/cglmquery.cpp" + $File "$TOGL_SRCDIR/asanstubs.cpp" + } + + $Folder "DirectX Header Files" [$WIN32 && !$GL] + { + } + + $Folder "Header Files" [$GL] + { + $File "$TOGL_SRCDIR/dx9asmtogl2.h" + $File "$TOGL_SRCDIR/glmgr_flush.inl" + $File "$TOGL_SRCDIR/intelglmallocworkaround.h" [$OSXALL] + $File "$TOGL_SRCDIR/mach_override.h" [$OSXALL] + } + + $Folder "Public Header Files" [$GL] + { + $File "$SRCDIR/public/togl/rendermechanism.h" + $File "$TOGL_INCDIR/dxabstract.h" + $File "$TOGL_INCDIR/dxabstract_types.h" + $File "$TOGL_INCDIR/glbase.h" + $File "$TOGL_INCDIR/glentrypoints.h" + $File "$TOGL_INCDIR/glmgr.h" + $File "$TOGL_INCDIR/glmdebug.h" + $File "$TOGL_INCDIR/glmgrbasics.h" + $File "$TOGL_INCDIR/glmgrext.h" + $File "$TOGL_INCDIR/glmdisplay.h" + $File "$TOGL_INCDIR/glmdisplaydb.h" + $File "$TOGL_INCDIR/glfuncs.h" + $File "$TOGL_INCDIR/cglmtex.h" + $File "$TOGL_INCDIR/cglmfbo.h" + $File "$TOGL_INCDIR/cglmprogram.h" + $File "$TOGL_INCDIR/cglmbuffer.h" + $File "$TOGL_INCDIR/cglmquery.h" + } + + $Folder "Link Libraries" + { + $Lib tier2 + $Lib mathlib + } +} + diff --git a/togles/wscript b/togles/wscript new file mode 100755 index 00000000..ab31edfe --- /dev/null +++ b/togles/wscript @@ -0,0 +1,62 @@ +#! /usr/bin/env python +# encoding: utf-8 + +from waflib import Utils +import os + +top = '.' +PROJECT_NAME = 'togl' + +def options(opt): + # stub + return + +def configure(conf): + conf.define('TOGL_DLL_EXPORT',1) + conf.env.append_unique('DEFINES',['strncpy=use_Q_strncpy_instead', + '_snprintf=use_Q_snprintf_instead']) + +def build(bld): + source = [ + 'linuxwin/dx9asmtogl2.cpp', + 'linuxwin/dxabstract.cpp', + 'linuxwin/glentrypoints.cpp', + 'linuxwin/glmgr.cpp', + 'linuxwin/glmgrbasics.cpp', + #'linuxwin/glmgrcocoa.mm', [$OSXALL] + #'linuxwin/intelglmallocworkaround.cpp', [$OSXALL] + #'linuxwin/mach_override.c', [$OSXALL] + 'linuxwin/cglmtex.cpp', + 'linuxwin/cglmfbo.cpp', + 'linuxwin/cglmprogram.cpp', + 'linuxwin/cglmbuffer.cpp', + 'linuxwin/cglmquery.cpp', + 'linuxwin/asanstubs.cpp' + ] + + includes = [ + '.', + '../public', + '../public/tier0', + '../public/tier1' + ] + bld.env.INCLUDES_SDL2 + + defines = [] + + libs = ['tier0','tier1','tier2','vstdlib','mathlib'] + + install_path = bld.env.LIBDIR + + bld.shlib( + source = source, + target = PROJECT_NAME, + name = PROJECT_NAME, + features = 'c cxx', + includes = includes, + defines = defines, + use = libs, + install_path = install_path, + subsystem = bld.env.MSVC_SUBSYSTEM, + idx = bld.get_taskgen_count() + ) + From 4508c9c863a3e6defbb5aebe6cbef0ef0dac8656 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 21 Nov 2021 01:38:59 +0300 Subject: [PATCH 02/18] Rewrite ToGL in OpenGLES(Uncomplete) --- appframework/sdlmgr.cpp | 77 ++++- launcher/launcher.cpp | 7 + public/togles/glfuncs.inl | 2 +- public/togles/linuxwin/cglmprogram.h | 4 +- public/togles/linuxwin/cglmtex.h | 6 +- public/togles/linuxwin/dxabstract.h | 2 +- public/togles/linuxwin/glentrypoints.h | 4 +- public/togles/linuxwin/glfuncs.h | 93 +++--- public/togles/linuxwin/glmgr.h | 176 ++-------- public/togles/rendermechanism.h | 30 +- togles/linuxwin/asanstubs.cpp | 4 +- togles/linuxwin/cglmbuffer.cpp | 197 ++++-------- togles/linuxwin/cglmfbo.cpp | 97 +++--- togles/linuxwin/cglmprogram.cpp | 388 ++++++---------------- togles/linuxwin/cglmquery.cpp | 14 +- togles/linuxwin/cglmtex.cpp | 74 +++-- togles/linuxwin/dx9asmtogl2.cpp | 172 +++++++--- togles/linuxwin/dx9asmtogl2.h | 9 +- togles/linuxwin/dxabstract.cpp | 20 +- togles/linuxwin/glentrypoints.cpp | 57 ++-- togles/linuxwin/glmgr.cpp | 428 ++++++++++--------------- togles/linuxwin/glmgrbasics.cpp | 2 +- togles/linuxwin/glmgrcocoa.mm | 2 +- wscript | 21 +- 24 files changed, 829 insertions(+), 1057 deletions(-) diff --git a/appframework/sdlmgr.cpp b/appframework/sdlmgr.cpp index 50d7233f..d466411e 100644 --- a/appframework/sdlmgr.cpp +++ b/appframework/sdlmgr.cpp @@ -57,7 +57,7 @@ COpenGLEntryPoints *gGL = NULL; const int kBogusSwapInterval = INT_MAX; -#ifdef ANDROID +#if defined ANDROID || defined TOGLES static void *l_gl4es = NULL; static void *l_egl = NULL; @@ -182,13 +182,16 @@ void CheckGLError( int line ) void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, void *fallback) { void *retval = NULL; + +#ifndef TOGLES // TODO(nillerusr): remove this hack if ((!okay) && (!bRequired)) // always look up if required (so we get a complete list of crucial missing symbols). return NULL; +#endif // The SDL path would work on all these platforms, if we were using SDL there, too... -#ifdef ANDROID +#if defined ANDROID || defined TOGLES // SDL does the right thing, so we never need to use tier0 in this case. if( _glGetProcAddress ) retval = _glGetProcAddress(fn); @@ -214,7 +217,12 @@ void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, vo // Note that a non-NULL response doesn't mean it's safe to call the function! // You always have to check that the extension is supported; // an implementation MAY return NULL in this case, but it doesn't have to (and doesn't, with the DRI drivers). + +#ifdef TOGLES // TODO(nillerusr): remove this hack + okay = retval != NULL; +#else okay = (okay && (retval != NULL)); +#endif if (bRequired && !okay) { // We can't continue execution, because one or more GL function pointers will be NULL. @@ -499,7 +507,11 @@ InitReturnVal_t CSDLMgr::Init() SDL_GL_SetAttribute( SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG ); } +#ifdef TOGLES + if (SDL_GL_LoadLibrary("libGLESv2.so") == -1) +#else if (SDL_GL_LoadLibrary(NULL) == -1) +#endif Error( "SDL_GL_LoadLibrary(NULL) failed: %s", SDL_GetError() ); #endif } @@ -568,7 +580,18 @@ InitReturnVal_t CSDLMgr::Init() *(attCursor++) = (int) (key); \ *(attCursor++) = (int) (value); -#ifdef ANDROID + +#ifdef TOGLES + l_egl = dlopen("libEGL.so", RTLD_LAZY); + + if( l_egl ) + _glGetProcAddress = (t_glGetProcAddress)dlsym(l_egl, "eglGetProcAddress"); + + SET_GL_ATTR(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SET_GL_ATTR(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SET_GL_ATTR(SDL_GL_CONTEXT_MINOR_VERSION, 0); + +#elif ANDROID bool m_bOGL = false; l_egl = dlopen("libEGL.so", RTLD_LAZY); @@ -619,7 +642,7 @@ InitReturnVal_t CSDLMgr::Init() // GL entry points, but the game hasn't made a window yet. So it's time // to make a window! We make a 640x480 one here, and later, when asked // to really actually make a window, we just resize the one we built here. - if ( !CreateHiddenGameWindow( "", 640, 480 ) ) + if ( !CreateHiddenGameWindow( "", 1280, 720 ) ) Error( "CreateGameWindow failed" ); SDL_HideWindow( m_Window ); @@ -653,7 +676,11 @@ void CSDLMgr::Shutdown() SDLAPP_FUNC; if (gGL && m_readFBO) +#ifdef TOGLES + gGL->glDeleteFramebuffers(1, &m_readFBO); +#else gGL->glDeleteFramebuffersEXT(1, &m_readFBO); +#endif m_readFBO = 0; if ( m_Window ) @@ -794,7 +821,7 @@ bool CSDLMgr::CreateHiddenGameWindow( const char *pTitle, int width, int height SDL_GL_MakeCurrent(m_Window, m_GLContext); -#ifdef ANDROID +#if defined ANDROID && !defined TOGLES if( l_gl4es ) { _glGetProcAddress = (t_glGetProcAddress)dlsym(l_gl4es, "gl4es_GetProcAddress" ); @@ -819,7 +846,9 @@ bool CSDLMgr::CreateHiddenGameWindow( const char *pTitle, int width, int height // If we specified -gl_debug, make sure the extension string is present now. if ( CommandLine()->FindParm( "-gl_debug" ) ) { +#ifndef TOGLES Assert( V_strstr(pszString, "GL_ARB_debug_output") ); +#endif } #endif // DBGFLAG_ASSERT @@ -844,7 +873,11 @@ bool CSDLMgr::CreateHiddenGameWindow( const char *pTitle, int width, int height DebugPrintf("\n"); } +#ifdef TOGLES + gGL->glGenFramebuffers(1, &m_readFBO); +#else gGL->glGenFramebuffersEXT(1, &m_readFBO); +#endif gGL->glViewport(0, 0, width, height); /* Reset The Current Viewport And Perspective Transformation */ gGL->glScissor(0, 0, width, height); /* Reset The Current Viewport And Perspective Transformation */ @@ -1191,6 +1224,17 @@ void CSDLMgr::ShowPixels( CShowPixelsParams *params ) // bind a quickie FBO to enclose the source texture GLint myreadfb = 1000; +#ifdef TOGLES + glBindFramebuffer( GL_READ_FRAMEBUFFER, myreadfb); + CheckGLError( __LINE__ ); + + glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0); // to the default FB/backbuffer + CheckGLError( __LINE__ ); + + // attach source tex to source FB + glFramebufferTexture2D( GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, params->m_srcTexName, 0); + CheckGLError( __LINE__ ); +#else glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, myreadfb); CheckGLError( __LINE__ ); @@ -1200,6 +1244,7 @@ void CSDLMgr::ShowPixels( CShowPixelsParams *params ) // attach source tex to source FB glFramebufferTexture2DEXT( GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, params->m_srcTexName, 0); CheckGLError( __LINE__ ); +#endif // blit @@ -1234,6 +1279,23 @@ void CSDLMgr::ShowPixels( CShowPixelsParams *params ) // go NEAREST if sizes match GLenum filter = ( ((srcxmax-srcxmin)==(dstxmax-dstxmin)) && ((srcymax-srcymin)==(dstymax-dstymin)) ) ? GL_NEAREST : GL_LINEAR; +#ifdef TOGLES + glBlitFramebuffer( + /* src min and maxes xy xy */ srcxmin, srcymin, srcxmax,srcymax, + /* dst min and maxes xy xy */ dstxmin, dstymax, dstxmax,dstymin, // note yflip here + GL_COLOR_BUFFER_BIT, filter ); + CheckGLError( __LINE__ ); + + // detach source tex + glFramebufferTexture2D( GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0); + CheckGLError( __LINE__ ); + + glBindFramebuffer( GL_READ_FRAMEBUFFER, 0); + CheckGLError( __LINE__ ); + + glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0); // to the default FB/backbuffer + CheckGLError( __LINE__ ); +#else glBlitFramebufferEXT( /* src min and maxes xy xy */ srcxmin, srcymin, srcxmax,srcymax, /* dst min and maxes xy xy */ dstxmin, dstymax, dstxmax,dstymin, // note yflip here @@ -1249,6 +1311,7 @@ void CSDLMgr::ShowPixels( CShowPixelsParams *params ) glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0); // to the default FB/backbuffer CheckGLError( __LINE__ ); +#endif } else @@ -1911,7 +1974,11 @@ void CSDLMgr::DecWindowRefCount() if ( gGL && m_readFBO ) { +#ifdef TOGLES + gGL->glDeleteFramebuffers( 1, &m_readFBO ); +#else gGL->glDeleteFramebuffersEXT( 1, &m_readFBO ); +#endif } m_readFBO = 0; diff --git a/launcher/launcher.cpp b/launcher/launcher.cpp index 5ba0ab18..7c7f663b 100644 --- a/launcher/launcher.cpp +++ b/launcher/launcher.cpp @@ -1176,6 +1176,8 @@ static const char *BuildCommand() return (const char *)build.Base(); } +extern void InitGL4ES(); + //----------------------------------------------------------------------------- // Purpose: The real entry point for the application // Input : hInstance - @@ -1208,8 +1210,13 @@ DLL_EXPORT int LauncherMain( int argc, char **argv ) { Warning( "WARNING: setlocale('%s') failed, using locale:'%s'. International characters may not work.\n", en_US, CurrentLocale ); } + #endif // LINUX +#if defined LINUX && defined USE_SDL && defined TOGLES + SDL_SetHint(SDL_HINT_VIDEO_X11_FORCE_EGL, "1"); +#endif + #ifdef WIN32 SetAppInstance( hInstance ); #elif defined( POSIX ) diff --git a/public/togles/glfuncs.inl b/public/togles/glfuncs.inl index 1f6b3b45..a542e211 100644 --- a/public/togles/glfuncs.inl +++ b/public/togles/glfuncs.inl @@ -1,2 +1,2 @@ -#include "togl/linuxwin/glfuncs.h" +#include "togles/linuxwin/glfuncs.h" diff --git a/public/togles/linuxwin/cglmprogram.h b/public/togles/linuxwin/cglmprogram.h index 64dbc121..9d862f64 100644 --- a/public/togles/linuxwin/cglmprogram.h +++ b/public/togles/linuxwin/cglmprogram.h @@ -90,7 +90,7 @@ struct GLMShaderDesc union { GLuint arb; // ARB program object name - GLhandleARB glsl; // GLSL shader object handle (void*) + GLuint glsl; // GLSL shader object handle (void*) } m_object; // these can change if shader text is edited @@ -253,7 +253,7 @@ public: CGLMProgram *m_vertexProg; CGLMProgram *m_fragmentProg; - GLhandleARB m_program; // linked program object + GLuint m_program; // linked program object // need meta data for attribs / samplers / params // actually we only need it for samplers and params. diff --git a/public/togles/linuxwin/cglmtex.h b/public/togles/linuxwin/cglmtex.h index 55321316..3a312c67 100644 --- a/public/togles/linuxwin/cglmtex.h +++ b/public/togles/linuxwin/cglmtex.h @@ -323,9 +323,9 @@ struct GLMTexSamplingParams } gGL->glSamplerParameterfv( nSamplerObject, GL_TEXTURE_BORDER_COLOR, flBorderColor ); // <-- this crashes ATI's driver, remark it out gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_MIN_LOD, m_packed.m_minLOD ); - gGL->glSamplerParameterfv( nSamplerObject, GL_TEXTURE_LOD_BIAS, &m_lodBias ); +// gGL->glSamplerParameterfv( nSamplerObject, GL_TEXTURE_LOD_BIAS, &m_lodBias ); gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_COMPARE_MODE_ARB, m_packed.m_compareMode ? GL_COMPARE_R_TO_TEXTURE_ARB : GL_NONE ); - gGL->glSamplerParameterf( nSamplerObject, GL_TEXTURE_LOD_BIAS, m_lodBias ); +// gGL->glSamplerParameterf( nSamplerObject, GL_TEXTURE_LOD_BIAS, m_lodBias ); if ( m_packed.m_compareMode ) { gGL->glSamplerParameteri( nSamplerObject, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL ); @@ -443,7 +443,7 @@ struct GLMTexSamplingParams } gGL->glTexParameterfv( target, GL_TEXTURE_BORDER_COLOR, flBorderColor ); // <-- this crashes ATI's driver, remark it out gGL->glTexParameteri( target, GL_TEXTURE_MIN_LOD, m_packed.m_minLOD ); - gGL->glTexParameterfv( target, GL_TEXTURE_LOD_BIAS, &m_lodBias ); +// gGL->glTexParameterfv( target, GL_TEXTURE_LOD_BIAS, &m_lodBias ); gGL->glTexParameteri( target, GL_TEXTURE_COMPARE_MODE_ARB, m_packed.m_compareMode ? GL_COMPARE_R_TO_TEXTURE_ARB : GL_NONE ); if ( m_packed.m_compareMode ) { diff --git a/public/togles/linuxwin/dxabstract.h b/public/togles/linuxwin/dxabstract.h index a4dfc073..a8e74590 100644 --- a/public/togles/linuxwin/dxabstract.h +++ b/public/togles/linuxwin/dxabstract.h @@ -30,7 +30,7 @@ #ifdef DX_TO_GL_ABSTRACTION -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "tier0/platform.h" #include "tier0/dbg.h" diff --git a/public/togles/linuxwin/glentrypoints.h b/public/togles/linuxwin/glentrypoints.h index 0f6e8616..80611984 100644 --- a/public/togles/linuxwin/glentrypoints.h +++ b/public/togles/linuxwin/glentrypoints.h @@ -36,7 +36,7 @@ #include "tier0/platform.h" #include "tier0/vprof_telemetry.h" #include "interface.h" -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, void *fallback=NULL); @@ -316,7 +316,7 @@ public: #define GL_FUNC(ext,req,ret,fn,arg,call) CDynamicFunctionOpenGL< req, ret (APIENTRY *) arg, ret > fn; #define GL_FUNC_VOID(ext,req,fn,arg,call) CDynamicFunctionOpenGL< req, void (APIENTRY *) arg, void > fn; #endif - #include "togl/glfuncs.inl" + #include "togles/glfuncs.inl" #undef GL_FUNC_VOID #undef GL_FUNC #undef GL_EXT diff --git a/public/togles/linuxwin/glfuncs.h b/public/togles/linuxwin/glfuncs.h index f543b4af..5606f105 100644 --- a/public/togles/linuxwin/glfuncs.h +++ b/public/togles/linuxwin/glfuncs.h @@ -23,40 +23,45 @@ // THE SOFTWARE. // !!! FIXME: Some of these aren't base OpenGL...pick out the extensions. // !!! FIXME: Also, look up these -1, -1 versions numbers. + GL_FUNC(OpenGL,true,GLenum,glGetError,(void),()) GL_FUNC_VOID(OpenGL,true,glActiveTexture,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glAlphaFunc,(GLenum a,GLclampf b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glAttachObjectARB,(GLhandleARB a,GLhandleARB b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glAttachShader,(GLuint a, GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBegin,(GLenum a),(a)) -GL_FUNC_VOID(OpenGL,true,glBindAttribLocationARB,(GLhandleARB a,GLuint b,const GLcharARB *c),(a,b,c)) -GL_FUNC_VOID(OpenGL,true,glBindBufferARB,(GLenum a,GLuint b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glBindProgramARB,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glBindAttribLocation,(GLuint a,GLuint b,const GLchar *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glBindBuffer,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glBindProgram,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBindTexture,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBlendColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glBlendEquation,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glBlendFunc,(GLenum a,GLenum b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glBufferDataARB,(GLenum a,GLsizeiptrARB b,const GLvoid *c,GLenum d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glBufferData,(GLenum a, GLsizeiptr b, const GLvoid *c,GLenum d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glClear,(GLbitfield a),(a)) GL_FUNC_VOID(OpenGL,true,glClearColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glClearDepth,(GLclampd a),(a)) +GL_FUNC_VOID(OpenGL,true,glReadPixels, (GLint a, GLint b, GLsizei c, GLsizei d, GLenum e, GLenum f, void * g), (a,b,c,d,e,f,g)) GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint a),(a)) GL_FUNC_VOID(OpenGL,true,glClipPlane,(GLenum a,const GLdouble *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glColorMask,(GLboolean a,GLboolean b,GLboolean c,GLboolean d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glCompileShaderARB,(GLhandleARB a),(a)) +GL_FUNC_VOID(OpenGL,true,glCompileShader,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glGetShaderiv,(GLuint a, GLenum b, GLint *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glGetShaderInfoLog,(GLuint a, GLsizei b, GLsizei *c, GLchar *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glGetProgramInfoLog,(GLuint a, GLsizei b, GLsizei *c, GLchar *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glCompressedTexImage2D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLint f,GLsizei g,const GLvoid *h),(a,b,c,d,e,f,g,h)) GL_FUNC_VOID(OpenGL,true,glCompressedTexImage3D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLsizei h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) -GL_FUNC(OpenGL,true,GLhandleARB,glCreateProgramObjectARB,(void),()) -GL_FUNC(OpenGL,true,GLhandleARB,glCreateShaderObjectARB,(GLenum a),(a)) -GL_FUNC_VOID(OpenGL,true,glDeleteBuffersARB,(GLsizei a,const GLuint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glDeleteObjectARB,(GLhandleARB a),(a)) -GL_FUNC_VOID(OpenGL,true,glDeleteProgramsARB,(GLsizei a,const GLuint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glDeleteQueriesARB,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC(OpenGL,true,GLuint,glCreateProgram,(void),()) +GL_FUNC(OpenGL,true,GLuint,glCreateShader,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,true,glDeleteBuffers,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDeleteObject,(GLuint a),(a)) +GL_FUNC_VOID(OpenGL,true,glDeletePrograms,(GLsizei a,const GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glDeleteShader,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glDeleteTextures,(GLsizei a,const GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean a),(a)) +GL_FUNC_VOID(OpenGL,true,glDepthRangef,(GLfloat a,GLfloat 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,glDetachObject,(GLuint a,GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glDisable,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c)) @@ -72,35 +77,34 @@ GL_FUNC_VOID(OpenGL,true,glEnd,(void),()) GL_FUNC_VOID(OpenGL,true,glFinish,(void),()) GL_FUNC_VOID(OpenGL,true,glFlush,(void),()) GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a)) -GL_FUNC_VOID(OpenGL,true,glGenBuffersARB,(GLsizei a,GLuint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGenProgramsARB,(GLsizei a,GLuint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGenQueriesARB,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGenBuffers,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGenPrograms,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGenTextures,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGetBooleanv,(GLenum a,GLboolean *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGetCompressedTexImage,(GLenum a,GLint b,GLvoid *c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glGetDoublev,(GLenum a,GLdouble *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGetInfoLogARB,(GLhandleARB a,GLsizei b,GLsizei *c,GLcharARB *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glGetInfoLog,(GLuint a,GLsizei b,GLsizei *c,GLchar *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glGetIntegerv,(GLenum a,GLint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGetObjectParameterivARB,(GLhandleARB a,GLenum b,GLint *c),(a,b,c)) -GL_FUNC_VOID(OpenGL,true,glGetProgramivARB,(GLenum a,GLenum b,GLint *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glGetObjectParameteriv,(GLuint a,GLenum b,GLint *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glGetProgramiv,(GLenum a,GLenum b,GLint *c),(a,b,c)) GL_FUNC(OpenGL,true,const GLubyte *,glGetString,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glGetTexImage,(GLenum a,GLint b,GLenum c,GLenum d,GLvoid *e),(a,b,c,d,e)) -GL_FUNC(OpenGL,true,GLint,glGetUniformLocationARB,(GLhandleARB a,const GLcharARB *b),(a,b)) +GL_FUNC(OpenGL,true,GLint,glGetUniformLocation,(GLuint a,const GLchar *b),(a,b)) GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a)) GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a)) -GL_FUNC_VOID(OpenGL,true,glLinkProgramARB,(GLhandleARB a),(a)) -GL_FUNC(OpenGL,true,GLvoid*,glMapBufferARB,(GLenum a,GLenum b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glLinkProgram,(GLuint a),(a)) +//GL_FUNC(OpenGL,true,GLvoid*,glMapBufferARB,(GLenum a,GLenum b),(a,b)) GL_FUNC_VOID(OpenGL,true,glOrtho,(GLdouble a,GLdouble b,GLdouble c,GLdouble d,GLdouble e,GLdouble f),(a,b,c,d,e,f)) GL_FUNC_VOID(OpenGL,true,glPixelStorei,(GLenum a,GLint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum b),(a,b)) GL_FUNC_VOID(OpenGL,true,glPolygonOffset,(GLfloat a,GLfloat b),(a,b)) GL_FUNC_VOID(OpenGL,true,glPopAttrib,(void),()) -GL_FUNC_VOID(OpenGL,true,glProgramStringARB,(GLenum a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) +//GL_FUNC_VOID(OpenGL,true,glProgramStringARB,(GLenum a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glPushAttrib,(GLbitfield a),(a)) GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glScissor,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glShaderSourceARB,(GLhandleARB a,GLsizei b,const GLcharARB **c,const GLint *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glShaderSource,(GLuint a,GLsizei b,const GLchar **c,const GLint *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glStencilFunc,(GLenum a,GLint b,GLuint c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glStencilMask,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glStencilOp,(GLenum a,GLenum b,GLenum c),(a,b,c)) @@ -131,7 +135,9 @@ GL_FUNC_VOID(OpenGL,true,glStencilFuncSeparate,(GLenum a,GLenum b,GLint c,GLuint GL_FUNC_VOID(OpenGL,true,glGetTexLevelParameteriv,(GLenum a,GLint b,GLenum c,GLint *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glColor4f,(GLfloat a,GLfloat b,GLfloat c,GLfloat d),(a,b,c,d)) GL_EXT(GL_EXT_framebuffer_object,-1,-1) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b)) +GL_EXT(GL_EXT_framebuffer_blit,-1,-1) +GL_EXT(GL_EXT_framebuffer_multisample,-1,-1) +/*GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindRenderbufferEXT,(GLenum a,GLuint b),(a,b)) GL_FUNC(GL_EXT_framebuffer_object,false,GLenum,glCheckFramebufferStatusEXT,(GLenum a),(a)) GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteRenderbuffersEXT,(GLsizei a,const GLuint *b),(a,b)) @@ -141,10 +147,8 @@ GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture3DEXT,(GLenum a GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenFramebuffersEXT,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenRenderbuffersEXT,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteFramebuffersEXT,(GLsizei a,const GLuint *b),(a,b)) -GL_EXT(GL_EXT_framebuffer_blit,-1,-1) GL_FUNC_VOID(GL_EXT_framebuffer_blit,false,glBlitFramebufferEXT,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j)) -GL_EXT(GL_EXT_framebuffer_multisample,-1,-1) -GL_FUNC_VOID(GL_EXT_framebuffer_multisample,false,glRenderbufferStorageMultisampleEXT,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e)) +GL_FUNC_VOID(GL_EXT_framebuffer_multisample,false,glRenderbufferStorageMultisampleEXT,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e))*/ GL_EXT(GL_APPLE_fence,-1,-1) GL_FUNC(GL_APPLE_fence,false,GLboolean,glTestFenceAPPLE,(GLuint a),(a)) GL_FUNC_VOID(GL_APPLE_fence,false,glSetFenceAPPLE,(GLuint a),(a)) @@ -178,15 +182,15 @@ GL_EXT(GL_APPLE_flush_buffer_range,-1,-1) GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glBufferParameteriAPPLE,(GLenum a,GLenum b,GLint c),(a,b,c)) GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glFlushMappedBufferRangeAPPLE,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c)) GL_EXT(GL_ARB_map_buffer_range,-1,-1) -GL_FUNC(GL_ARB_map_buffer_range,false,void*,glMapBufferRange,(GLenum a,GLintptr b,GLsizeiptr c,GLbitfield d),(a,b,c,d)) -GL_FUNC_VOID(GL_ARB_map_buffer_range,false,glFlushMappedBufferRange,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c)) +GL_FUNC(OpenGL,false,void*,glMapBufferRange,(GLenum a,GLintptr b,GLsizeiptr c,GLbitfield d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,false,glFlushMappedBufferRange,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c)) GL_EXT(GL_ARB_vertex_buffer_object,-1,-1) -GL_FUNC_VOID(GL_ARB_vertex_buffer_object,true,glBufferSubData,(GLenum a,GLintptr b,GLsizeiptr c,const GLvoid *d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glBufferSubData,(GLenum a,GLintptr b,GLsizeiptr c,const GLvoid *d),(a,b,c,d)) GL_EXT(GL_ARB_occlusion_query,-1,-1) GL_FUNC_VOID(GL_ARB_occlusion_query,false,glBeginQueryARB,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(GL_ARB_occlusion_query,false,glEndQueryARB,(GLenum a),(a)) GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectivARB,(GLuint a,GLenum b,GLint *c),(a,b,c)) -GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectuivARB,(GLuint a,GLenum b,GLuint *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,false,glGetQueryObjectuiv,(GLuint a,GLenum b,GLuint *c),(a,b,c)) GL_EXT(GL_APPLE_texture_range,-1,-1) GL_FUNC_VOID(GL_APPLE_texture_range,false,glTextureRangeAPPLE,(GLenum a,GLsizei b,void *c),(a,b,c)) GL_FUNC_VOID(GL_APPLE_texture_range,false,glGetTexParameterPointervAPPLE,(GLenum a,GLenum b,void* *c),(a,b,c)) @@ -194,8 +198,9 @@ GL_EXT(GL_APPLE_client_storage,-1,-1) GL_EXT(GL_ARB_uniform_buffer,-1,-1) GL_EXT(GL_ARB_vertex_array_bgra,-1,-1) GL_EXT(GL_EXT_vertex_array_bgra,-1,-1) + GL_EXT(GL_ARB_framebuffer_object,3,0) -GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindFramebuffer,(GLenum a,GLuint b),(a,b)) +/*GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindFramebuffer,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindRenderbuffer,(GLenum a,GLuint b),(a,b)) GL_FUNC(GL_ARB_framebuffer_object,false,GLenum,glCheckFramebufferStatus,(GLenum a),(a)) GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteRenderbuffers,(GLsizei a,const GLuint *b),(a,b)) @@ -207,15 +212,25 @@ GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glGenRenderbuffers,(GLsizei a,GLuin GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteFramebuffers,(GLsizei a,const GLuint *b),(a,b)) GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBlitFramebuffer,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j)) GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glRenderbufferStorageMultisample,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e)) +*/ +GL_FUNC_VOID(OpenGL,false,glBindFramebuffer,(GLenum a,GLuint b),(a,b)) +GL_FUNC_VOID(OpenGL,false,glBindRenderbuffer,(GLenum a,GLuint b),(a,b)) +GL_FUNC(OpenGL,false,GLenum,glCheckFramebufferStatus,(GLenum a),(a)) +GL_FUNC_VOID(OpenGL,false,glDeleteRenderbuffers,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,false,glFramebufferRenderbuffer,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,false,glFramebufferTexture2D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e)) +GL_FUNC_VOID(OpenGL,false,glFramebufferTexture3D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f)) +GL_FUNC_VOID(OpenGL,false,glGenFramebuffers,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,false,glGenRenderbuffers,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,false,glDeleteFramebuffers,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,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(OpenGL,false,glRenderbufferStorageMultisample,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e)) + GL_EXT(GL_GREMEDY_string_marker,-1,-1) GL_FUNC_VOID(GL_GREMEDY_string_marker,false,glStringMarkerGREMEDY,(GLsizei a,const void *b),(a,b)) GL_EXT(GL_ARB_debug_output,-1,-1) -#ifdef OSX -GL_FUNC_VOID(GL_ARB_debug_output,false,glDebugMessageCallbackARB,(void ( *a)(GLenum, GLenum , GLuint , GLenum , GLsizei , const GLchar* , GLvoid*) ,void* b),(a,b)) -#else -GL_FUNC_VOID(GL_ARB_debug_output,false,glDebugMessageCallbackARB,(void (APIENTRY *a)(GLenum, GLenum , GLuint , GLenum , GLsizei , const GLchar* , GLvoid*) ,void* b),(a,b)) -#endif -GL_FUNC_VOID(GL_ARB_debug_output,false,glDebugMessageControlARB,(GLenum a, GLenum b, GLenum c, GLsizei d, const GLuint* e, GLboolean f),(a,b,c,d,e,f)) +GL_FUNC_VOID(OpenGL,false,glDebugMessageCallback,(void (APIENTRY *a)(GLenum, GLenum , GLuint , GLenum , GLsizei , const GLchar* , GLvoid*) ,void* b),(a,b)) +GL_FUNC_VOID(OpenGL,false,glDebugMessageControl,(GLenum a, GLenum b, GLenum c, GLsizei d, const GLuint* e, GLboolean f),(a,b,c,d,e,f)) GL_EXT(GL_EXT_direct_state_access,-1,-1) GL_FUNC_VOID(GL_EXT_direct_state_access,false,glBindMultiTextureEXT,(GLenum a,GLuint b, GLuint c),(a,b,c)) diff --git a/public/togles/linuxwin/glmgr.h b/public/togles/linuxwin/glmgr.h index 7e76a682..c1af97c1 100644 --- a/public/togles/linuxwin/glmgr.h +++ b/public/togles/linuxwin/glmgr.h @@ -325,7 +325,7 @@ FORCEINLINE void GLContextGetDefault( GLAlphaTestEnable_t *dst ) // --- GLAlphaTestFunc --- FORCEINLINE void GLContextSet( GLAlphaTestFunc_t *src ) { - gGL->glAlphaFunc( src->func, src->ref ); +// gGL->glAlphaFunc( src->func, src->ref ); } FORCEINLINE void GLContextGet( GLAlphaTestFunc_t *dst ) @@ -343,12 +343,12 @@ FORCEINLINE void GLContextGetDefault( GLAlphaTestFunc_t *dst ) // --- GLAlphaToCoverageEnable --- FORCEINLINE void GLContextSet( GLAlphaToCoverageEnable_t *src ) { - glSetEnable( GL_SAMPLE_ALPHA_TO_COVERAGE_ARB, src->enable != 0 ); + glSetEnable( GL_SAMPLE_ALPHA_TO_COVERAGE, src->enable != 0 ); } FORCEINLINE void GLContextGet( GLAlphaToCoverageEnable_t *dst ) { - dst->enable = gGL->glIsEnabled( GL_SAMPLE_ALPHA_TO_COVERAGE_ARB ); + dst->enable = gGL->glIsEnabled( GL_SAMPLE_ALPHA_TO_COVERAGE ); } FORCEINLINE void GLContextGetDefault( GLAlphaToCoverageEnable_t *dst ) @@ -393,8 +393,8 @@ FORCEINLINE void GLContextGetDefault( GLCullFrontFace_t *dst ) // --- GLPolygonMode --- FORCEINLINE void GLContextSet( GLPolygonMode_t *src ) { - gGL->glPolygonMode( GL_FRONT, src->values[0] ); - gGL->glPolygonMode( GL_BACK, src->values[1] ); +// gGL->glPolygonMode( GL_FRONT, src->values[0] ); +// gGL->glPolygonMode( GL_BACK, src->values[1] ); } FORCEINLINE void GLContextGet( GLPolygonMode_t *dst ) @@ -497,7 +497,7 @@ FORCEINLINE void GLContextGetDefault( GLViewportBox_t *dst ) // --- GLViewportDepthRange --- FORCEINLINE void GLContextSet( GLViewportDepthRange_t *src ) { - gGL->glDepthRange ( src->flNear, src->flFar ); + gGL->glDepthRangef ( src->flNear, src->flFar ); } FORCEINLINE void GLContextGet( GLViewportDepthRange_t *dst ) @@ -543,9 +543,9 @@ FORCEINLINE void GLContextGetDefaultIndexed( GLClipPlaneEnable_t *dst, int index FORCEINLINE void GLContextSetIndexed( GLClipPlaneEquation_t *src, int index ) { // shove into glGlipPlane - GLdouble coeffs[4] = { src->x, src->y, src->z, src->w }; - gGL->glClipPlane( GL_CLIP_PLANE0 + index, coeffs ); +// GLdouble coeffs[4] = { src->x, src->y, src->z, src->w }; +// gGL->glClipPlane( GL_CLIP_PLANE0 + index, coeffs ); } FORCEINLINE void GLContextGetIndexed( GLClipPlaneEquation_t *dst, int index ) @@ -864,7 +864,8 @@ FORCEINLINE void GLContextGetDefault( GLClearColor_t *dst ) // --- GLClearDepth --- FORCEINLINE void GLContextSet( GLClearDepth_t *src ) { - gGL->glClearDepth ( src->d ); +// TOFUCK: wut +// gGL->glClearDepth ( src->d ); } FORCEINLINE void GLContextGet( GLClearDepth_t *dst ) @@ -1204,133 +1205,6 @@ public: uint m_nNewVS; }; -//===========================================================================// -#ifndef OSX - -#ifndef GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD -#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 -#endif - -#define GLMGR_PINNED_MEMORY_BUFFER_SIZE ( 6 * 1024 * 1024 ) - -class CPinnedMemoryBuffer -{ - CPinnedMemoryBuffer( const CPinnedMemoryBuffer & ); - CPinnedMemoryBuffer & operator= ( const CPinnedMemoryBuffer & ); - -public: - CPinnedMemoryBuffer() - : - m_pRawBuf( NULL ) - , m_pBuf( NULL ) - , m_nSize( 0 ) - , m_nOfs( 0 ) - , m_nBufferObj( 0 ) -#ifdef HAVE_GL_ARB_SYNC - , m_nSyncObj( 0 ) -#endif - { - } - - ~CPinnedMemoryBuffer() - { - Deinit(); - } - - bool Init( uint nSize ) - { - Deinit(); - - // Guarantee 64KB alignment - m_pRawBuf = malloc( nSize + 65535 ); - m_pBuf = reinterpret_cast((reinterpret_cast(m_pRawBuf) + 65535) & (~65535)); - m_nSize = nSize; - m_nOfs = 0; - - gGL->glGenBuffersARB( 1, &m_nBufferObj ); - gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_nBufferObj ); - - gGL->glBufferDataARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_nSize, m_pBuf, GL_STREAM_COPY ); - - return true; - } - - void Deinit() - { - if ( !m_pRawBuf ) - return; - - BlockUntilNotBusy(); - - gGL->glBindBufferARB(GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_nBufferObj ); - - gGL->glBufferDataARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, 0, (void*)NULL, GL_STREAM_COPY ); - - gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, 0 ); - - gGL->glDeleteBuffersARB( 1, &m_nBufferObj ); - m_nBufferObj = 0; - - free( m_pRawBuf ); - m_pRawBuf = NULL; - m_pBuf = NULL; - - m_nSize = 0; - m_nOfs = 0; - } - - inline uint GetSize() const { return m_nSize; } - inline uint GetOfs() const { return m_nOfs; } - inline uint GetBytesRemaining() const { return m_nSize - m_nOfs; } - inline void *GetPtr() const { return m_pBuf; } - inline GLuint GetHandle() const { return m_nBufferObj; } - - void InsertFence() - { -#ifdef HAVE_GL_ARB_SYNC - if ( m_nSyncObj ) - { - gGL->glDeleteSync( m_nSyncObj ); - } - - m_nSyncObj = gGL->glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 ); -#endif - } - - void BlockUntilNotBusy() - { -#ifdef HAVE_GL_ARB_SYNC - if ( m_nSyncObj ) - { - gGL->glClientWaitSync( m_nSyncObj, GL_SYNC_FLUSH_COMMANDS_BIT, 3000000000000ULL ); - - gGL->glDeleteSync( m_nSyncObj ); - - m_nSyncObj = 0; - } -#endif - m_nOfs = 0; - } - - void Append( uint nSize ) - { - m_nOfs += nSize; - Assert( m_nOfs <= m_nSize ); - } - -private: - void *m_pRawBuf; - void *m_pBuf; - uint m_nSize; - uint m_nOfs; - - GLuint m_nBufferObj; -#ifdef HAVE_GL_ARB_SYNC - GLsync m_nSyncObj; -#endif -}; -#endif // !OSX - //===========================================================================// class GLMContext @@ -1568,7 +1442,7 @@ class GLMContext if ( nGLName != m_nBoundGLBuffer[kGLMVertexBuffer] ) { m_nBoundGLBuffer[kGLMVertexBuffer] = nGLName; - gGL->glBindBufferARB( GL_ARRAY_BUFFER_ARB, nGLName ); + gGL->glBindBuffer( GL_ARRAY_BUFFER, nGLName ); } else if ( ( curAttribs.m_pPtr == pBuf ) && ( curAttribs.m_revision == nRevision ) && @@ -1624,18 +1498,18 @@ class GLMContext void BindTexToTMU( CGLMTex *tex, int tmu ); // render targets / FBO's - void BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint = GL_FRAMEBUFFER_EXT ); // you can also choose GL_READ_FRAMEBUFFER_EXT / GL_DRAW_FRAMEBUFFER_EXT + void BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint = GL_FRAMEBUFFER ); // you can also choose GL_READ_FRAMEBUFFER_EXT / GL_DRAW_FRAMEBUFFER_EXT // buffers FORCEINLINE void BindGLBufferToCtx( GLenum nGLBufType, GLuint nGLName, bool bForce = false ) { - Assert( ( nGLBufType == GL_ARRAY_BUFFER_ARB ) || ( nGLBufType == GL_ELEMENT_ARRAY_BUFFER_ARB ) ); - - const uint nIndex = ( nGLBufType == GL_ARRAY_BUFFER_ARB ) ? kGLMVertexBuffer : kGLMIndexBuffer; + Assert( ( nGLBufType == GL_ARRAY_BUFFER ) || ( nGLBufType == GL_ELEMENT_ARRAY_BUFFER ) ); + + const uint nIndex = ( nGLBufType == GL_ARRAY_BUFFER ) ? kGLMVertexBuffer : kGLMIndexBuffer; if ( ( bForce ) || ( m_nBoundGLBuffer[nIndex] != nGLName ) ) { m_nBoundGLBuffer[nIndex] = nGLName; - gGL->glBindBufferARB( nGLBufType, nGLName ); + gGL->glBindBuffer( nGLBufType, nGLName ); } } @@ -1654,10 +1528,6 @@ class GLMContext void GenDebugFontTex( void ); void DrawDebugText( float x, float y, float z, float drawCharWidth, float drawCharHeight, char *string ); -#ifndef OSX - CPinnedMemoryBuffer *GetCurPinnedMemoryBuffer( ) { return &m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer]; } -#endif - CPersistentBuffer* GetCurPersistentBuffer( EGLMBufferType type ) { return &( m_persistentBuffer[m_nCurPersistentBuffer][type] ); } // members------------------------------------------ @@ -1859,12 +1729,6 @@ class GLMContext GLuint m_destroyPBO; CUtlVector< TextureEntry_t > m_availableTextures; -#ifndef OSX - enum { cNumPinnedMemoryBuffers = 4 }; - CPinnedMemoryBuffer m_PinnedMemoryBuffers[cNumPinnedMemoryBuffers]; - uint m_nCurPinnedMemoryBuffer; -#endif - enum { cNumPersistentBuffers = 3 }; CPersistentBuffer m_persistentBuffer[cNumPersistentBuffers][kGLMNumBufferTypes]; uint m_nCurPersistentBuffer; @@ -2320,7 +2184,7 @@ FORCEINLINE void GLMContext::BindIndexBufferToCtx( CGLMBuffer *buff ) { GLMPRINTF(( "--- GLMContext::BindIndexBufferToCtx buff %p, GL name %d", buff, (buff) ? buff->m_nHandle : -1 )); - Assert( !buff || ( buff->m_buffGLTarget == GL_ELEMENT_ARRAY_BUFFER_ARB ) ); + Assert( !buff || ( buff->m_buffGLTarget == GL_ELEMENT_ARRAY_BUFFER ) ); GLuint nGLName = buff ? buff->GetHandle() : 0; @@ -2328,14 +2192,14 @@ FORCEINLINE void GLMContext::BindIndexBufferToCtx( CGLMBuffer *buff ) return; m_nBoundGLBuffer[ kGLMIndexBuffer] = nGLName; - gGL->glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, nGLName ); + gGL->glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, nGLName ); } FORCEINLINE void GLMContext::BindVertexBufferToCtx( CGLMBuffer *buff ) { GLMPRINTF(( "--- GLMContext::BindVertexBufferToCtx buff %p, GL name %d", buff, (buff) ? buff->m_nHandle : -1 )); - Assert( !buff || ( buff->m_buffGLTarget == GL_ARRAY_BUFFER_ARB ) ); + Assert( !buff || ( buff->m_buffGLTarget == GL_ARRAY_BUFFER ) ); GLuint nGLName = buff ? buff->GetHandle() : 0; @@ -2343,7 +2207,7 @@ FORCEINLINE void GLMContext::BindVertexBufferToCtx( CGLMBuffer *buff ) return; m_nBoundGLBuffer[ kGLMVertexBuffer] = nGLName; - gGL->glBindBufferARB( GL_ARRAY_BUFFER_ARB, nGLName ); + gGL->glBindBuffer( GL_ARRAY_BUFFER, nGLName ); } FORCEINLINE void GLMContext::SetMaxUsedVertexShaderConstantsHint( uint nMaxConstants ) diff --git a/public/togles/rendermechanism.h b/public/togles/rendermechanism.h index 47be332d..0fc76982 100644 --- a/public/togles/rendermechanism.h +++ b/public/togles/rendermechanism.h @@ -35,21 +35,21 @@ #include "tier0/basetypes.h" #include "tier0/platform.h" -#include "togl/linuxwin/glmdebug.h" -#include "togl/linuxwin/glbase.h" -#include "togl/linuxwin/glentrypoints.h" -#include "togl/linuxwin/glmdisplay.h" -#include "togl/linuxwin/glmdisplaydb.h" -#include "togl/linuxwin/glmgrbasics.h" -#include "togl/linuxwin/glmgrext.h" -#include "togl/linuxwin/cglmbuffer.h" -#include "togl/linuxwin/cglmtex.h" -#include "togl/linuxwin/cglmfbo.h" -#include "togl/linuxwin/cglmprogram.h" -#include "togl/linuxwin/cglmquery.h" -#include "togl/linuxwin/glmgr.h" -#include "togl/linuxwin/dxabstract_types.h" -#include "togl/linuxwin/dxabstract.h" +#include "togles/linuxwin/glmdebug.h" +#include "togles/linuxwin/glbase.h" +#include "togles/linuxwin/glentrypoints.h" +#include "togles/linuxwin/glmdisplay.h" +#include "togles/linuxwin/glmdisplaydb.h" +#include "togles/linuxwin/glmgrbasics.h" +#include "togles/linuxwin/glmgrext.h" +#include "togles/linuxwin/cglmbuffer.h" +#include "togles/linuxwin/cglmtex.h" +#include "togles/linuxwin/cglmfbo.h" +#include "togles/linuxwin/cglmprogram.h" +#include "togles/linuxwin/cglmquery.h" +#include "togles/linuxwin/glmgr.h" +#include "togles/linuxwin/dxabstract_types.h" +#include "togles/linuxwin/dxabstract.h" #else //USE_ACTUAL_DX diff --git a/togles/linuxwin/asanstubs.cpp b/togles/linuxwin/asanstubs.cpp index ee4ce50b..d2caa6c1 100644 --- a/togles/linuxwin/asanstubs.cpp +++ b/togles/linuxwin/asanstubs.cpp @@ -1,7 +1,7 @@ typedef unsigned int uint; -#include "../public/togl/linuxwin/glmdisplay.h" -#include "../public/togl/linuxwin/glmdisplaydb.h" +#include "../public/togles/linuxwin/glmdisplay.h" +#include "../public/togles/linuxwin/glmdisplaydb.h" void GLMDisplayDB::PopulateRenderers( void ) { } void GLMDisplayDB::PopulateFakeAdapters( uint realRendererIndex ) { } // fake adapters = one real adapter times however many displays are on diff --git a/togles/linuxwin/cglmbuffer.cpp b/togles/linuxwin/cglmbuffer.cpp index ecba047b..23480c22 100644 --- a/togles/linuxwin/cglmbuffer.cpp +++ b/togles/linuxwin/cglmbuffer.cpp @@ -26,7 +26,7 @@ // //=============================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" // memdbgon -must- be the last include file in a .cpp file. #include "tier0/memdbgon.h" @@ -102,16 +102,16 @@ void CPersistentBuffer::Init( EGLMBufferType type,uint nSize ) switch ( type ) { - case kGLMVertexBuffer: m_buffGLTarget = GL_ARRAY_BUFFER_ARB; break; - case kGLMIndexBuffer: m_buffGLTarget = GL_ELEMENT_ARRAY_BUFFER_ARB; break; + case kGLMVertexBuffer: m_buffGLTarget = GL_ARRAY_BUFFER; break; + case kGLMIndexBuffer: m_buffGLTarget = GL_ELEMENT_ARRAY_BUFFER; break; default: Assert( nSize == 0 ); } if ( m_nSize > 0 ) { - gGL->glGenBuffersARB( 1, &m_nHandle ); - gGL->glBindBufferARB( m_buffGLTarget, m_nHandle ); + gGL->glGenBuffers( 1, &m_nHandle ); + gGL->glBindBuffer( m_buffGLTarget, m_nHandle ); // Create persistent immutable buffer that we will permanently map. This buffer can be written from any thread (not just // the renderthread) @@ -132,11 +132,11 @@ void CPersistentBuffer::Deinit() BlockUntilNotBusy(); - gGL->glBindBufferARB( m_buffGLTarget, m_nHandle ); + gGL->glBindBuffer( m_buffGLTarget, m_nHandle ); gGL->glUnmapBuffer( m_buffGLTarget ); - gGL->glBindBufferARB( m_buffGLTarget, 0 ); + gGL->glBindBuffer( m_buffGLTarget, 0 ); - gGL->glDeleteBuffersARB( 1, &m_nHandle ); + gGL->glDeleteBuffers( 1, &m_nHandle ); m_nSize = 0; m_nHandle = 0; @@ -438,10 +438,10 @@ CGLMBuffer::CGLMBuffer( GLMContext *pCtx, EGLMBufferType type, uint size, uint o switch ( m_type ) { - case kGLMVertexBuffer: m_buffGLTarget = GL_ARRAY_BUFFER_ARB; break; - case kGLMIndexBuffer: m_buffGLTarget = GL_ELEMENT_ARRAY_BUFFER_ARB; break; - case kGLMUniformBuffer: m_buffGLTarget = GL_UNIFORM_BUFFER_EXT; break; - case kGLMPixelBuffer: m_buffGLTarget = GL_PIXEL_UNPACK_BUFFER_ARB; break; + case kGLMVertexBuffer: m_buffGLTarget = GL_ARRAY_BUFFER; break; + case kGLMIndexBuffer: m_buffGLTarget = GL_ELEMENT_ARRAY_BUFFER; break; + case kGLMUniformBuffer: m_buffGLTarget = GL_UNIFORM_BUFFER; break; + case kGLMPixelBuffer: m_buffGLTarget = GL_PIXEL_UNPACK_BUFFER; break; default: Assert(!"Unknown buffer type" ); DXABSTRACT_BREAK_ON_ERROR(); } @@ -520,25 +520,25 @@ CGLMBuffer::CGLMBuffer( GLMContext *pCtx, EGLMBufferType type, uint size, uint o } else { - gGL->glGenBuffersARB( 1, &m_nHandle ); + gGL->glGenBuffers( 1, &m_nHandle ); m_pCtx->BindBufferToCtx( m_type, this ); // causes glBindBufferARB // buffers start out static, but if they get orphaned and gl_bufmode is non zero, // then they will get flipped to dynamic. - GLenum hint = GL_STATIC_DRAW_ARB; + GLenum hint = GL_STATIC_DRAW; switch (m_type) { - case kGLMVertexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; break; - case kGLMIndexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; break; - case kGLMUniformBuffer: hint = GL_DYNAMIC_DRAW_ARB; break; - case kGLMPixelBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; break; + case kGLMVertexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; break; + case kGLMIndexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; break; + case kGLMUniformBuffer: hint = GL_DYNAMIC_DRAW; break; + case kGLMPixelBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; break; default: Assert(!"Unknown buffer type" ); DXABSTRACT_BREAK_ON_ERROR(); } - gGL->glBufferDataARB( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); // may ultimately need more hints to set the usage correctly (esp for streaming) + gGL->glBufferData( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); // may ultimately need more hints to set the usage correctly (esp for streaming) SetModes( false, true, true ); @@ -566,7 +566,7 @@ CGLMBuffer::~CGLMBuffer( ) } else { - gGL->glDeleteBuffersARB( 1, &m_nHandle ); + gGL->glDeleteBuffers( 1, &m_nHandle ); } m_pCtx = NULL; @@ -591,11 +591,6 @@ void CGLMBuffer::SetModes( bool bAsyncMap, bool bExplicitFlush, bool bForce ) { if ( bForce || ( m_bEnableAsyncMap != bAsyncMap ) ) { - // note the sense of the parameter, it's TRUE if you *want* serialization, so for async you turn it to false. - if ( ( gGL->m_bHave_GL_APPLE_flush_buffer_range ) && ( !gGL->m_bHave_GL_ARB_map_buffer_range ) ) - { - gGL->glBufferParameteriAPPLE( m_buffGLTarget, GL_BUFFER_SERIALIZED_MODIFY_APPLE, bAsyncMap == false ); - } m_bEnableAsyncMap = bAsyncMap; } @@ -603,10 +598,6 @@ void CGLMBuffer::SetModes( bool bAsyncMap, bool bExplicitFlush, bool bForce ) { // Note that the GL_ARB_map_buffer_range path handles this in the glMapBufferRange() call in Lock(). // note the sense of the parameter, it's TRUE if you *want* auto-flush-on-unmap, so for explicit-flush, you turn it to false. - if ( ( gGL->m_bHave_GL_APPLE_flush_buffer_range ) && ( !gGL->m_bHave_GL_ARB_map_buffer_range ) ) - { - gGL->glBufferParameteriAPPLE( m_buffGLTarget, GL_BUFFER_FLUSHING_UNMAP_APPLE, bExplicitFlush == false ); - } m_bEnableExplicitFlush = bExplicitFlush; } } @@ -634,16 +625,7 @@ void CGLMBuffer::FlushRange( uint offset, uint size ) double flStart = Plat_FloatTime(); #endif - // assumes buffer is bound. - if ( gGL->m_bHave_GL_ARB_map_buffer_range ) - { - gGL->glFlushMappedBufferRange( m_buffGLTarget, (GLintptr)( offset - m_dirtyMinOffset ), (GLsizeiptr)size ); - } - else if ( gGL->m_bHave_GL_APPLE_flush_buffer_range ) - { - gGL->glFlushMappedBufferRangeAPPLE( m_buffGLTarget, (GLintptr)offset, (GLsizeiptr)size ); - } - + gGL->glFlushMappedBufferRange( m_buffGLTarget, (GLintptr)( offset - m_dirtyMinOffset ), (GLsizeiptr)size ); #ifdef REPORT_LOCK_TIME double flEnd = Plat_FloatTime(); if ( flEnd - flStart > 5.0 / 1000.0 ) @@ -792,26 +774,6 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) //DevMsg( " --> buff=%x, startOffset=%d, paramsOffset=%d, persistOffset = %d\n", this, m_nPersistentBufferStartOffset, pParams->m_nOffset, persistentBufferOffset ); } -#ifndef OSX - else if ( m_bDynamic && gGL->m_bHave_GL_AMD_pinned_memory && ( m_pCtx->GetCurPinnedMemoryBuffer()->GetBytesRemaining() >= pParams->m_nSize ) ) - { - if ( pParams->m_bDiscard ) - { - m_nRevision++; - } - - m_dirtyMinOffset = pParams->m_nOffset; - m_dirtyMaxOffset = pParams->m_nOffset + pParams->m_nSize; - - CPinnedMemoryBuffer *pTempBuffer = m_pCtx->GetCurPinnedMemoryBuffer(); - - m_nPinnedMemoryOfs = pTempBuffer->GetOfs(); - - resultPtr = static_cast( pTempBuffer->GetPtr() ) + m_nPinnedMemoryOfs; - - pTempBuffer->Append( pParams->m_nSize ); - } -#endif // OSX else if ( !g_bDisableStaticBuffer && ( pParams->m_bDiscard || pParams->m_bNoOverwrite ) && ( pParams->m_nSize <= GL_STATIC_BUFFER_SIZE ) ) { #if TOGL_SUPPORT_NULL_DEVICE @@ -824,8 +786,8 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) // observe gl_bufmode on any orphan event. // if orphaned and bufmode is nonzero, flip it to dynamic. - GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; - gGL->glBufferDataARB( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); + GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; + gGL->glBufferData( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); m_nRevision++; // revision grows on orphan event } @@ -867,8 +829,8 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) // if orphaned and bufmode is nonzero, flip it to dynamic. // We always want to call glBufferData( ..., NULL ) on discards, even though we're using the GL_MAP_INVALIDATE_BUFFER_BIT flag, because this flag is actually only a hint according to AMD. - GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW_ARB : GL_STATIC_DRAW_ARB; - gGL->glBufferDataARB( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); + GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; + gGL->glBufferData( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); m_nRevision++; // revision grows on orphan event } @@ -878,64 +840,51 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) // map char *mapPtr; - if ( gGL->m_bHave_GL_ARB_map_buffer_range ) - { - // m_bEnableAsyncMap is actually pParams->m_bNoOverwrite - GLbitfield parms = GL_MAP_WRITE_BIT | ( m_bEnableAsyncMap ? GL_MAP_UNSYNCHRONIZED_BIT : 0 ) | ( pParams->m_bDiscard ? GL_MAP_INVALIDATE_BUFFER_BIT : 0 ) | ( m_bEnableExplicitFlush ? GL_MAP_FLUSH_EXPLICIT_BIT : 0 ); + + // m_bEnableAsyncMap is actually pParams->m_bNoOverwrite + GLbitfield parms = GL_MAP_WRITE_BIT | ( m_bEnableAsyncMap ? GL_MAP_UNSYNCHRONIZED_BIT : 0 ) | ( pParams->m_bDiscard ? GL_MAP_INVALIDATE_BUFFER_BIT : 0 ) | ( m_bEnableExplicitFlush ? GL_MAP_FLUSH_EXPLICIT_BIT : 0 ); #ifdef REPORT_LOCK_TIME - double flStart = Plat_FloatTime(); + double flStart = Plat_FloatTime(); #endif - mapPtr = (char*)gGL->glMapBufferRange( m_buffGLTarget, pParams->m_nOffset, pParams->m_nSize, parms); + mapPtr = (char*)gGL->glMapBufferRange( m_buffGLTarget, pParams->m_nOffset, pParams->m_nSize, parms); #ifdef REPORT_LOCK_TIME - double flEnd = Plat_FloatTime(); - if ( flEnd - flStart > 5.0 / 1000.0 ) + double flEnd = Plat_FloatTime(); + if ( flEnd - flStart > 5.0 / 1000.0 ) + { + int nDelta = ( int )( ( flEnd - flStart ) * 1000 ); + if ( nDelta > 2 ) { - int nDelta = ( int )( ( flEnd - flStart ) * 1000 ); - if ( nDelta > 2 ) - { - Msg( "**** " ); - } - Msg( "glMapBufferRange Time=%d: ( Name=%d BufSize=%d ) Target=%p Offset=%d LockSize=%d ", nDelta, m_nHandle, m_nSize, m_buffGLTarget, pParams->m_nOffset, pParams->m_nSize ); - if ( parms & GL_MAP_WRITE_BIT ) - { - Msg( "GL_MAP_WRITE_BIT "); - } - if ( parms & GL_MAP_UNSYNCHRONIZED_BIT ) - { - Msg( "GL_MAP_UNSYNCHRONIZED_BIT "); - } - if ( parms & GL_MAP_INVALIDATE_BUFFER_BIT ) - { - Msg( "GL_MAP_INVALIDATE_BUFFER_BIT "); - } - if ( parms & GL_MAP_INVALIDATE_RANGE_BIT ) - { - Msg( "GL_MAP_INVALIDATE_RANGE_BIT "); - } - if ( parms & GL_MAP_FLUSH_EXPLICIT_BIT ) - { - Msg( "GL_MAP_FLUSH_EXPLICIT_BIT "); - } - Msg( "\n" ); + Msg( "**** " ); } + Msg( "glMapBufferRange Time=%d: ( Name=%d BufSize=%d ) Target=%p Offset=%d LockSize=%d ", nDelta, m_nHandle, m_nSize, m_buffGLTarget, pParams->m_nOffset, pParams->m_nSize ); + if ( parms & GL_MAP_WRITE_BIT ) + { + Msg( "GL_MAP_WRITE_BIT "); + } + if ( parms & GL_MAP_UNSYNCHRONIZED_BIT ) + { + Msg( "GL_MAP_UNSYNCHRONIZED_BIT "); + } + if ( parms & GL_MAP_INVALIDATE_BUFFER_BIT ) + { + Msg( "GL_MAP_INVALIDATE_BUFFER_BIT "); + } + if ( parms & GL_MAP_INVALIDATE_RANGE_BIT ) + { + Msg( "GL_MAP_INVALIDATE_RANGE_BIT "); + } + if ( parms & GL_MAP_FLUSH_EXPLICIT_BIT ) + { + Msg( "GL_MAP_FLUSH_EXPLICIT_BIT "); + } + Msg( "\n" ); + } #endif - } - else - { - mapPtr = (char*)gGL->glMapBufferARB( m_buffGLTarget, GL_WRITE_ONLY_ARB ); - } - - Assert( mapPtr ); - // calculate offset location resultPtr = mapPtr; - if ( !gGL->m_bHave_GL_ARB_map_buffer_range ) - { - resultPtr += pParams->m_nOffset; - } // set range m_dirtyMinOffset = pParams->m_nOffset; @@ -1070,34 +1019,6 @@ void CGLMBuffer::Unlock( int nActualSize, const void *pActualData ) else if ( m_type == kGLMVertexBuffer ) g_nTotalVBLockBytes += nActualSize; #endif - -#ifndef OSX - if ( m_nPinnedMemoryOfs >= 0 ) - { -#if TOGL_SUPPORT_NULL_DEVICE - if ( !g_bNullD3DDevice ) - { -#endif - if ( nActualSize ) - { - m_pCtx->BindBufferToCtx( m_type, this ); - - gGL->glCopyBufferSubData( - GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, - m_buffGLTarget, - m_nPinnedMemoryOfs, - m_dirtyMinOffset, - nActualSize ); - } - -#if TOGL_SUPPORT_NULL_DEVICE - } -#endif - - m_nPinnedMemoryOfs = -1; - } - else -#endif // !OSX if ( m_bUsingPersistentBuffer ) { if ( nActualSize ) diff --git a/togles/linuxwin/cglmfbo.cpp b/togles/linuxwin/cglmfbo.cpp index ec2418d4..e482ba9e 100644 --- a/togles/linuxwin/cglmfbo.cpp +++ b/togles/linuxwin/cglmfbo.cpp @@ -26,7 +26,7 @@ // //=============================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" // memdbgon -must- be the last include file in a .cpp file. #include "tier0/memdbgon.h" @@ -36,7 +36,7 @@ CGLMFBO::CGLMFBO( GLMContext *ctx ) m_ctx = ctx; m_ctx->CheckCurrent(); - gGL->glGenFramebuffersEXT( 1, &m_name ); + gGL->glGenFramebuffers( 1, &m_name ); memset( m_attach, 0, sizeof( m_attach ) ); } @@ -55,7 +55,7 @@ CGLMFBO::~CGLMFBO( ) } } - gGL->glDeleteFramebuffersEXT( 1, &m_name ); + gGL->glDeleteFramebuffers( 1, &m_name ); m_name = 0; m_ctx = NULL; @@ -68,22 +68,22 @@ static GLenum EncodeAttachmentFBO( EGLMFBOAttachment index ) { if (index < kAttDepth) { - return GL_COLOR_ATTACHMENT0_EXT + (int) index; + return GL_COLOR_ATTACHMENT0 + (int) index; } else { switch( index ) { case kAttDepth: - return GL_DEPTH_ATTACHMENT_EXT; + return GL_DEPTH_ATTACHMENT; break; case kAttStencil: - return GL_STENCIL_ATTACHMENT_EXT; + return GL_STENCIL_ATTACHMENT; break; case kAttDepthStencil: - return GL_DEPTH_STENCIL_ATTACHMENT_EXT; + return GL_DEPTH_STENCIL_ATTACHMENT; break; default: @@ -94,7 +94,7 @@ static GLenum EncodeAttachmentFBO( EGLMFBOAttachment index ) GLMStop(); // bad news // shouldn't get here - return GL_COLOR_ATTACHMENT0_EXT; + return GL_COLOR_ATTACHMENT0; } void CGLMFBO::TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint ) @@ -136,7 +136,7 @@ void CGLMFBO::TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attach if (layout->m_key.m_texFlags & kGLMTexMultisampled) { // it is an MSAA tex - if (fboBindPoint == GL_READ_FRAMEBUFFER_EXT) + if (fboBindPoint == GL_READ_FRAMEBUFFER) { // I think you just want to read a resolved tex. // But I will check that it is resolved first.. @@ -148,34 +148,31 @@ void CGLMFBO::TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attach useRBO = true; } } - + if (useRBO) { // MSAA path - attach the RBO, not the texture, and mark the RBO dirty - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { // you have to attach it both places... // http://www.opengl.org/wiki/GL_EXT_framebuffer_object - // bind the RBO to the GL_RENDERBUFFER_EXT target - gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); - - // attach the GL_RENDERBUFFER_EXT target to the depth and stencil attach points - gGL->glFramebufferRenderbufferEXT( fboBindPoint, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); - - gGL->glFramebufferRenderbufferEXT( fboBindPoint, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); - + // bind the RBO to the GL_RENDERBUFFER target + gGL->glBindRenderbuffer( GL_RENDERBUFFER, tex->m_rboName ); + + // attach the GL_RENDERBUFFER target to the depth and stencil attach points + gGL->glFramebufferRenderbuffer( fboBindPoint, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, tex->m_rboName); + gGL->glFramebufferRenderbuffer( fboBindPoint, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, tex->m_rboName); + // no need to leave the RBO hanging on - gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + gGL->glBindRenderbuffer( GL_RENDERBUFFER, 0 ); } else { // color attachment (likely 0) - gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); - - gGL->glFramebufferRenderbufferEXT( fboBindPoint, attachIndexGL, GL_RENDERBUFFER_EXT, tex->m_rboName); - - gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + gGL->glBindRenderbuffer( GL_RENDERBUFFER, tex->m_rboName ); + gGL->glFramebufferRenderbuffer( fboBindPoint, attachIndexGL, GL_RENDERBUFFER, tex->m_rboName); + gGL->glBindRenderbuffer( GL_RENDERBUFFER, 0 ); } tex->ForceRBODirty(); } @@ -183,26 +180,25 @@ void CGLMFBO::TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attach { // regular path - attaching a texture2d - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { // you have to attach it both places... // http://www.opengl.org/wiki/GL_EXT_framebuffer_object - gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_DEPTH_ATTACHMENT_EXT, target, tex->m_texName, params->m_mip ); - - gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_STENCIL_ATTACHMENT_EXT, target, tex->m_texName, params->m_mip ); + gGL->glFramebufferTexture2D( fboBindPoint, GL_DEPTH_ATTACHMENT, target, tex->m_texName, params->m_mip ); + gGL->glFramebufferTexture2D( fboBindPoint, GL_STENCIL_ATTACHMENT, target, tex->m_texName, params->m_mip ); } else { - gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip ); + gGL->glFramebufferTexture2D( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip ); } } } break; case GL_TEXTURE_3D: - { - gGL->glFramebufferTexture3DEXT( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip, params->m_zslice ); + { +// gGL->glFramebufferTexture3DEXT( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip, params->m_zslice ); } break; @@ -210,8 +206,8 @@ void CGLMFBO::TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attach { // adjust target to steer to the proper face of the cube map target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + params->m_face; - - gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip ); + + gGL->glFramebufferTexture2D( fboBindPoint, attachIndexGL, target, tex->m_texName, params->m_mip ); } break; } @@ -248,35 +244,35 @@ void CGLMFBO::TexDetach( EGLMFBOAttachment attachIndex, GLenum fboBindPoint ) // MSAA path - detach the RBO, not the texture // (is this the right time to resolve? probably better to wait until someone tries to sample the texture) - gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + gGL->glBindRenderbuffer( GL_RENDERBUFFER, 0 ); - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { - // detach the GL_RENDERBUFFER_EXT target at depth and stencil attach points - gGL->glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + // detach the GL_RENDERBUFFER target at depth and stencil attach points + gGL->glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); - gGL->glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + gGL->glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); } else { // color attachment (likely 0) - gGL->glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, attachIndexGL, GL_RENDERBUFFER_EXT, 0); + gGL->glFramebufferRenderbuffer( GL_FRAMEBUFFER, attachIndexGL, GL_RENDERBUFFER, 0); } } else { // plain tex detach - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { // you have to detach it both places... // http://www.opengl.org/wiki/GL_EXT_framebuffer_object - gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_DEPTH_ATTACHMENT_EXT, target, 0, 0 ); - gGL->glFramebufferTexture2DEXT( fboBindPoint, GL_STENCIL_ATTACHMENT_EXT, target, 0, 0 ); + gGL->glFramebufferTexture2D( fboBindPoint, GL_DEPTH_ATTACHMENT, target, 0, 0 ); + gGL->glFramebufferTexture2D( fboBindPoint, GL_STENCIL_ATTACHMENT, target, 0, 0 ); } else { - gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, 0, 0 ); + gGL->glFramebufferTexture2D( fboBindPoint, attachIndexGL, target, 0, 0 ); } } } @@ -284,13 +280,13 @@ void CGLMFBO::TexDetach( EGLMFBOAttachment attachIndex, GLenum fboBindPoint ) case GL_TEXTURE_3D: { - gGL->glFramebufferTexture3DEXT( fboBindPoint, attachIndexGL, target, 0, 0, 0 ); +// gGL->glFramebufferTexture3DEXT( fboBindPoint, attachIndexGL, target, 0, 0, 0 ); } break; case GL_TEXTURE_CUBE_MAP: { - gGL->glFramebufferTexture2DEXT( fboBindPoint, attachIndexGL, target, 0, 0 ); + gGL->glFramebufferTexture2D( fboBindPoint, attachIndexGL, target, 0, 0 ); } break; } @@ -315,7 +311,7 @@ void CGLMFBO::TexScrub( CGLMTex *tex ) if (m_attach[ attachIndex ].m_tex == tex) { // blammo - TexDetach( (EGLMFBOAttachment)attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + TexDetach( (EGLMFBOAttachment)attachIndex, GL_DRAW_FRAMEBUFFER ); } } } @@ -332,7 +328,9 @@ bool CGLMFBO::IsReady( void ) m_ctx->BindFBOToCtx( this ); GLenum status; - status = gGL->glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + status = gGL->glCheckFramebufferStatus(GL_FRAMEBUFFER); + +#if 0 switch(status) { case GL_FRAMEBUFFER_COMPLETE_EXT: @@ -351,5 +349,6 @@ bool CGLMFBO::IsReady( void ) /* programming error; will fail on all hardware */ break; } - return result; +#endif + return true; } diff --git a/togles/linuxwin/cglmprogram.cpp b/togles/linuxwin/cglmprogram.cpp index 8c0103b3..137c91ac 100644 --- a/togles/linuxwin/cglmprogram.cpp +++ b/togles/linuxwin/cglmprogram.cpp @@ -26,7 +26,7 @@ // //=============================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "filesystem.h" #include "tier1/fmtstr.h" @@ -84,8 +84,8 @@ GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ) GLenum result = 0; switch(type) { - case kGLMVertexProgram: result = GL_VERTEX_SHADER_ARB; break; - case kGLMFragmentProgram: result = GL_FRAGMENT_SHADER_ARB; break; + case kGLMVertexProgram: result = GL_VERTEX_SHADER; break; + case kGLMFragmentProgram: result = GL_FRAGMENT_SHADER; break; default: Assert( !"bad program type"); result = 0; break; } return result; @@ -116,16 +116,11 @@ CGLMProgram::CGLMProgram( GLMContext *ctx, EGLMProgramType type ) m_nNumUsedSamplers = GLM_SAMPLER_COUNT; m_maxVertexAttrs = kGLMVertexAttributeIndexMax; - // create an ARB vp/fp program object name. No need to bind it yet. - GLMShaderDesc *arbDesc = &m_descs[ kGLMARB ]; - Assert(gGL); - gGL->glGenProgramsARB( 1, &arbDesc->m_object.arb ); - // create a GLSL shader object. GLMShaderDesc *glslDesc = &m_descs[ kGLMGLSL ]; GLenum glslStage = GLMProgTypeToGLSLEnum( m_type ); - glslDesc->m_object.glsl = gGL->glCreateShaderObjectARB( glslStage );; + glslDesc->m_object.glsl = gGL->glCreateShader( glslStage );; m_shaderName[0] = '\0'; @@ -144,15 +139,7 @@ CGLMProgram::CGLMProgram( GLMContext *ctx, EGLMProgramType type ) CGLMProgram::~CGLMProgram( ) { m_ctx->CheckCurrent(); - - // if there is an arb program, delete it - GLMShaderDesc *arbDesc = &m_descs[ kGLMARB ]; - if (arbDesc->m_object.arb) - { - gGL->glDeleteProgramsARB( 1, &arbDesc->m_object.arb ); - arbDesc->m_object.arb = 0; - } - + // if there is a GLSL shader, delete it GLMShaderDesc *glslDesc = &m_descs[kGLMGLSL]; if (glslDesc->m_object.glsl) @@ -183,16 +170,6 @@ enum EShaderSection kGLMARBFragment, kGLMARBFragmentDisabled, kGLMGLSLVertex, kGLMGLSLVertexDisabled, kGLMGLSLFragment, kGLMGLSLFragmentDisabled, - -}; - -const char *g_shaderSectionMarkers[] = // match ordering of enum -{ - "!!ARBvp", "-!!ARBvp", // enabled and disabled markers. so you can have multiple flavors in a blob and activate the one you want. - "!!ARBfp", "-!!ARBfp", - "//GLSLvp", "-//GLSLvp", - "//GLSLfp", "-//GLSLfp", - NULL }; void CGLMProgram::SetShaderName( const char *name ) @@ -255,7 +232,7 @@ void CGLMProgram::SetProgramText( char *text ) } #endif - +#if 0 // scan the text and find sections CGLMTextSectioner sections( m_text, strlen( m_text ), g_shaderSectionMarkers ); @@ -267,61 +244,23 @@ void CGLMProgram::SetProgramText( char *text ) int markerIndex = 0; sections.GetSection( i, &subtextOffset, &subtextLength, &markerIndex ); +#endif + + uint subtextOffset = 0; + uint subtextLength = strlen( m_text ); + int markerIndex = 0; - // act on the section - GLMShaderDesc *desc = NULL; - switch( m_type ) - { - case kGLMVertexProgram: - switch( markerIndex ) - { - case kGLMARBVertex: - case kGLMGLSLVertex: - desc = &m_descs[ (markerIndex==kGLMARBVertex) ? kGLMARB : kGLMGLSL]; - - // these steps are generic across both langs - desc->m_textPresent = true; - desc->m_textOffset = subtextOffset; - desc->m_textLength = subtextLength; - desc->m_compiled = false; - desc->m_valid = false; - break; - - case kGLMARBVertexDisabled: - case kGLMGLSLVertexDisabled: - // ignore quietly - break; - - default: Assert(!"Mismatched section marker seen in SetProgramText (VP)"); break; - } - break; - - case kGLMFragmentProgram: - switch( markerIndex ) - { - case kGLMARBFragment: - case kGLMGLSLFragment: - desc = &m_descs[ (markerIndex==kGLMARBFragment) ? kGLMARB : kGLMGLSL]; - - // these steps are generic across both langs - desc->m_textPresent = true; - desc->m_textOffset = subtextOffset; - desc->m_textLength = subtextLength; - desc->m_compiled = false; - desc->m_valid = false; - break; - - case kGLMARBFragmentDisabled: - case kGLMGLSLFragmentDisabled: - // ignore quietly - break; - - default: Assert(!"Mismatched section marker seen in SetProgramText (VP)"); break; - } - break; - } - } - + // act on the section + GLMShaderDesc *desc = NULL; + desc = &m_descs[kGLMGLSL]; + + // these steps are generic across both langs + desc->m_textPresent = true; + desc->m_textOffset = subtextOffset; + desc->m_textLength = subtextLength; + desc->m_compiled = false; + desc->m_valid = false; + // find the label string // example: // trans#2871 label:vs-file vertexlit_and_unlit_generic_vs20 vs-index 294912 vs-combo 1234 @@ -369,53 +308,6 @@ void CGLMProgram::Compile( EGLMProgramLang lang ) switch( lang ) { - case kGLMARB: - { - GLMShaderDesc *arbDesc; - - arbDesc = &m_descs[ kGLMARB ]; - - // make sure no GLSL program is set up - gGL->glUseProgram(0); - // bind our program container to context - GLenum arbTarget = GLMProgTypeToARBEnum( m_type ); - - glSetEnable( arbTarget, true ); // unclear if I need this to compile or just to draw... - - gGL->glBindProgramARB( arbTarget, arbDesc->m_object.arb ); // object created or just re-bound - - char *section = m_text + arbDesc->m_textOffset; - char *lastCharOfSection = section + arbDesc->m_textLength; // actually it's one past the last textual character - lastCharOfSection; - - #if GLMDEBUG - if(noisy) - { - GLMPRINTF((">-D- CGLMProgram::Compile submitting following text for ARB %s program (name %d) ---------------------", - arbTarget == GL_FRAGMENT_PROGRAM_ARB ? "fragment" : "vertex", - arbDesc->m_object.arb )); - - // we don't have a "print this many chars" call yet - // just temporarily null terminate the text we want to print - - char saveChar = *lastCharOfSection; - - *lastCharOfSection= 0; - GLMPRINTTEXT(( section, eDebugDump )); - *lastCharOfSection= saveChar; - - GLMPRINTF(("<-D- CGLMProgram::Compile ARB EOT--" )); - } - #endif - - gGL->glProgramStringARB( arbTarget, GL_PROGRAM_FORMAT_ASCII_ARB, arbDesc->m_textLength, section ); - arbDesc->m_compiled = true; // compiled but not necessarily valid - - CheckValidity( lang ); - // leave it bound n enabled, don't care (draw will sort it all out) - } - break; - case kGLMGLSL: { GLMShaderDesc *glslDesc; @@ -425,13 +317,6 @@ void CGLMProgram::Compile( EGLMProgramLang lang ) GLenum glslStage = GLMProgTypeToGLSLEnum( m_type ); glslStage; - // there's no binding to do for GLSL. but make sure no ARB stuff is bound for tidiness. - glSetEnable( GL_VERTEX_PROGRAM_ARB, false ); - glSetEnable( GL_FRAGMENT_PROGRAM_ARB, false ); // add check errors on these - - gGL->glBindProgramARB( GL_VERTEX_PROGRAM_ARB, 0 ); - gGL->glBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, 0 ); - // no GLSL program either gGL->glUseProgram(0); @@ -445,7 +330,7 @@ void CGLMProgram::Compile( EGLMProgramLang lang ) if(noisy) { GLMPRINTF((">-D- CGLMProgram::Compile submitting following text for GLSL %s program (name %d) ---------------------", - glslStage == GL_FRAGMENT_SHADER_ARB ? "fragment" : "vertex", + glslStage == GL_FRAGMENT_SHADER ? "fragment" : "vertex", glslDesc->m_object.glsl )); // we don't have a "print this many chars" call yet @@ -461,9 +346,27 @@ void CGLMProgram::Compile( EGLMProgramLang lang ) } #endif - gGL->glShaderSourceARB( glslDesc->m_object.glsl, 1, (const GLchar **)§ion, &glslDesc->m_textLength); + gGL->glShaderSource( glslDesc->m_object.glsl, 1, (const GLchar **)§ion, &glslDesc->m_textLength); -#if GLM_FREE_SHADER_TEXT + // compile + gGL->glCompileShader( glslDesc->m_object.glsl ); + + + GLint isCompiled = 0; + gGL->glGetShaderiv(glslDesc->m_object.glsl, GL_COMPILE_STATUS, &isCompiled); + + if(isCompiled == GL_FALSE) + { + GLint maxLength = 0; + gGL->glGetShaderiv(glslDesc->m_object.glsl , GL_INFO_LOG_LENGTH, &maxLength); + + GLchar log[4096]; + gGL->glGetShaderInfoLog( glslDesc->m_object.glsl, sizeof(log), &maxLength, log ); + printf("shader compile log: %s\n", log); + printf("Shader %d source is:\n===============\n%s\nn===============\n", glslDesc->m_object.glsl, section); + } + +#if 0 //GLM_FREE_SHADER_TEXT // Free the shader program text - not needed anymore (GL has its own copy) if ( m_text && !m_descs[kGLMARB].m_textPresent ) { @@ -472,8 +375,6 @@ void CGLMProgram::Compile( EGLMProgramLang lang ) } #endif - // compile - gGL->glCompileShaderARB( glslDesc->m_object.glsl ); glslDesc->m_compiled = true; // compiled but not necessarily valid // Check shader validity at creation time. This will cause the driver to not be able to @@ -621,7 +522,7 @@ struct GLMShaderLimitDesc // macro to help make the table of what to check #ifndef LMD -#define LMD( val, flags ) { GL_PROGRAM_##val##_ARB, GL_MAX_PROGRAM_##val##_ARB, #val, flags } +#define LMD( val, flags ) { GL_PROGRAM_##val, GL_MAX_PROGRAM_##val, #val, flags } #else #error you need to use a different name for this macro. #endif @@ -629,25 +530,25 @@ struct GLMShaderLimitDesc GLMShaderLimitDesc g_glmShaderLimitDescs[] = { // VP and FP.. - LMD( INSTRUCTIONS, 3 ), - LMD( NATIVE_INSTRUCTIONS, 3 ), - LMD( NATIVE_TEMPORARIES, 3 ), - LMD( PARAMETERS, 3 ), - LMD( NATIVE_PARAMETERS, 3 ), - LMD( ATTRIBS, 3 ), - LMD( NATIVE_ATTRIBS, 3 ), +// LMD( INSTRUCTIONS, 3 ), +// LMD( NATIVE_INSTRUCTIONS, 3 ), +// LMD( NATIVE_TEMPORARIES, 3 ), +// LMD( PARAMETERS, 3 ), +// LMD( NATIVE_PARAMETERS, 3 ), +// LMD( ATTRIBS, 3 ), +// LMD( NATIVE_ATTRIBS, 3 ), // VP only.. - LMD( ADDRESS_REGISTERS, 1 ), - LMD( NATIVE_ADDRESS_REGISTERS, 1 ), +// LMD( ADDRESS_REGISTERS, 1 ), +// LMD( NATIVE_ADDRESS_REGISTERS, 1 ), // FP only.. - LMD( ALU_INSTRUCTIONS, 2 ), - LMD( NATIVE_ALU_INSTRUCTIONS, 2 ), - LMD( TEX_INSTRUCTIONS, 2 ), - LMD( NATIVE_TEX_INSTRUCTIONS, 2 ), - LMD( TEX_INDIRECTIONS, 2 ), - LMD( NATIVE_TEX_INDIRECTIONS, 2 ), +// LMD( ALU_INSTRUCTIONS, 2 ), +// LMD( NATIVE_ALU_INSTRUCTIONS, 2 ), +// LMD( TEX_INSTRUCTIONS, 2 ), +// LMD( NATIVE_TEX_INSTRUCTIONS, 2 ), +// LMD( TEX_INDIRECTIONS, 2 ), +// LMD( NATIVE_TEX_INDIRECTIONS, 2 ), { 0, 0, NULL, 0 } }; @@ -668,128 +569,34 @@ bool CGLMProgram::CheckValidity( EGLMProgramLang lang ) bool bValid = false; +//#error "What the fuck?" + switch(lang) { - case kGLMARB: - { - GLMShaderDesc *arbDesc; - arbDesc = &m_descs[ kGLMARB ]; - - GLenum arbTarget = GLMProgTypeToARBEnum( m_type ); - - Assert( arbDesc->m_compiled ); - - arbDesc->m_valid = true; // assume success til we see otherwise - - // assume program is bound. is there anything wrong with it ? - - GLint isNative=0; - gGL->glGetProgramivARB( arbTarget, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &isNative ); - - // If the program is over the hardware's limits, print out some information - if (isNative!=1) - { - arbDesc->m_valid = false; - - // check everything we can check - char checkmask = (1<m_valueEnum !=0; desc++ ) - { - if ( desc->m_flags & checkmask ) - { - // test it - GLint value = 0; - GLint limit = 0; - gGL->glGetProgramivARB(arbTarget, desc->m_valueEnum, &value); - - gGL->glGetProgramivARB(arbTarget, desc->m_limitEnum, &limit); - - if (value > limit) - { - GLMPRINTF(("-D- Invalid %s program: program has %d %s; limit is %d", targnames[ m_type ], value, desc->m_debugName, limit )); - } - } - } - } - - // syntax error check - GLint errorLine; - gGL->glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &errorLine ); - - if ( errorLine!=-1 ) - { - const GLubyte* errorString = gGL->glGetString(GL_PROGRAM_ERROR_STRING_ARB); errorString; - GLMPRINTF(( "-D- Syntax error in ARB %s program: %s",targnames[ m_type ], errorString )); - arbDesc->m_valid = false; - } - if (!arbDesc->m_valid) - { - char *temp = strdup(m_text); - temp[ arbDesc->m_textOffset + arbDesc->m_textLength ] = 0; - GLMPRINTF(("-D- ----- ARB compile failed; bad source follows -----" )); - GLMPRINTTEXT(( temp + arbDesc->m_textOffset, eDebugDump, GLMPRINTTEXT_NUMBEREDLINES )); - GLMPRINTF(("-D- -----end-----" )); - free( temp ); - } - - bValid = arbDesc->m_valid; - } - break; - case kGLMGLSL: { GLMShaderDesc *glslDesc; - GLcharARB *logString = NULL; glslDesc = &m_descs[ kGLMGLSL ]; GLenum glslStage = GLMProgTypeToGLSLEnum( m_type ); glslStage; Assert( glslDesc->m_compiled ); - + glslDesc->m_valid = true; // assume success til we see otherwise // GLSL error check - int compiled = 0, length = 0, laux = 0; + int compiled = 0; - gGL->glGetObjectParameterivARB( (GLhandleARB)glslDesc->m_object.glsl, GL_OBJECT_COMPILE_STATUS_ARB, &compiled); - gGL->glGetObjectParameterivARB( (GLhandleARB)glslDesc->m_object.glsl, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); - if ( length > 0 ) - { - logString = (GLcharARB *)malloc(length * sizeof(GLcharARB)); - gGL->glGetInfoLogARB((GLhandleARB)glslDesc->m_object.glsl, length, &laux, logString); - } - // we may not be able to check "native limits" stuff until link time. meh + gGL->glGetShaderiv(glslDesc->m_object.glsl, GL_COMPILE_STATUS, &compiled); if (!compiled) - { glslDesc->m_valid = false; - } - - if (!glslDesc->m_valid) - { - GLMPRINTF(("-D- ----- GLSL compile failed: \n %s \n",logString )); -#if !GLM_FREE_SHADER_TEXT - char *temp = strdup(m_text); - temp[ glslDesc->m_textOffset + glslDesc->m_textLength ] = 0; - GLMPRINTTEXT(( temp + glslDesc->m_textOffset, eDebugDump, GLMPRINTTEXT_NUMBEREDLINES )); - free( temp ); -#endif - GLMPRINTF(("-D- -----end-----" )); - } - - if ( logString ) - free( logString ); bValid = glslDesc->m_valid; } break; } - if ( !bValid ) - { - GLMDebugPrintf( "Compile of \"%s\" Failed:\n%s\n", m_shaderName, m_text ? m_text : "" ); - } AssertOnce( bValid ); if (bTimeShaderCompiles) @@ -884,7 +691,7 @@ CGLMShaderPair::CGLMShaderPair( GLMContext *ctx ) m_ctx = ctx; m_vertexProg = m_fragmentProg = NULL; - m_program = gGL->glCreateProgramObjectARB(); + m_program = gGL->glCreateProgram(); m_locVertexParams = -1; m_locVertexBoneParams = -1; @@ -911,7 +718,7 @@ CGLMShaderPair::~CGLMShaderPair( ) { if (m_program) { - gGL->glDeleteObjectARB( (GLhandleARB)m_program ); + gGL->glDeleteObject( m_program ); m_program = 0; } } @@ -938,8 +745,8 @@ bool CGLMShaderPair::ValidateProgramPair() } // check for success - GLint result = 0; - gGL->glGetObjectParameterivARB( m_program, GL_OBJECT_LINK_STATUS_ARB, &result ); // want GL_TRUE + GLint result = GL_TRUE; + gGL->glGetObjectParameteriv( m_program, GL_OBJECT_LINK_STATUS_ARB, &result ); // want GL_TRUE m_bCheckLinkStatus = false; if (result == GL_TRUE) @@ -955,10 +762,10 @@ bool CGLMShaderPair::ValidateProgramPair() GLint laux = 0; // do some digging - gGL->glGetObjectParameterivARB( m_program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length ); + gGL->glGetObjectParameteriv( m_program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length ); - GLcharARB *logString = (GLcharARB *)malloc( length * sizeof(GLcharARB) ); - gGL->glGetInfoLogARB( m_program, length, &laux, logString ); + GLchar *logString = (GLchar *)malloc( length * sizeof(GLchar) ); + gGL->glGetInfoLog( m_program, length, &laux, logString ); GLMPRINTF( ("-D- ----- GLSL link failed: \n %s ", logString) ); #if !GLM_FREE_SHADER_TEXT @@ -988,12 +795,12 @@ bool CGLMShaderPair::ValidateProgramPair() m_ctx->NewLinkedProgram(); - m_locVertexParams = gGL->glGetUniformLocationARB( m_program, "vc" ); - m_locVertexBoneParams = gGL->glGetUniformLocationARB( m_program, "vcbones" ); - m_locVertexScreenParams = gGL->glGetUniformLocationARB( m_program, "vcscreen" ); + m_locVertexParams = gGL->glGetUniformLocation( m_program, "vc" ); + m_locVertexBoneParams = gGL->glGetUniformLocation( m_program, "vcbones" ); + m_locVertexScreenParams = gGL->glGetUniformLocation( m_program, "vcscreen" ); m_nScreenWidthHeight = 0xFFFFFFFF; - m_locVertexInteger0 = gGL->glGetUniformLocationARB( m_program, "i0" ); + m_locVertexInteger0 = gGL->glGetUniformLocation( m_program, "i0" ); m_bHasBoolOrIntUniforms = false; if (m_locVertexInteger0 >= 0) @@ -1003,7 +810,7 @@ bool CGLMShaderPair::ValidateProgramPair() { char buf[256]; V_snprintf( buf, sizeof(buf), "b%d", i ); - m_locVertexBool[i] = gGL->glGetUniformLocationARB( m_program, buf ); + m_locVertexBool[i] = gGL->glGetUniformLocation( m_program, buf ); if (m_locVertexBool[i] != -1) m_bHasBoolOrIntUniforms = true; } @@ -1012,12 +819,12 @@ bool CGLMShaderPair::ValidateProgramPair() { char buf[256]; V_snprintf( buf, sizeof(buf), "fb%d", i ); - m_locFragmentBool[i] = gGL->glGetUniformLocationARB( m_program, buf ); + m_locFragmentBool[i] = gGL->glGetUniformLocation( m_program, buf ); if (m_locFragmentBool[i] != -1) m_bHasBoolOrIntUniforms = true; } - m_locFragmentParams = gGL->glGetUniformLocationARB( m_program, "pc" ); + m_locFragmentParams = gGL->glGetUniformLocation( m_program, "pc" ); for (uint i = 0; i < kGLMNumProgramTypes; i++) { @@ -1039,7 +846,7 @@ bool CGLMShaderPair::ValidateProgramPair() char buf[256]; V_snprintf( buf, sizeof(buf), "%cc[%i]", "vp"[i], j ); // Grab the handle of each array element, so we can more efficiently update array elements in the middle. - int l = m_UniformBufferParams[i][j] = gGL->glGetUniformLocationARB( m_program, buf ); + int l = m_UniformBufferParams[i][j] = gGL->glGetUniformLocation( m_program, buf ); if (l < 0) break; } @@ -1047,7 +854,7 @@ bool CGLMShaderPair::ValidateProgramPair() m_NumUniformBufferParams[i] = j; } - m_locFragmentFakeSRGBEnable = gGL->glGetUniformLocationARB( m_program, "flSRGBWrite" ); + m_locFragmentFakeSRGBEnable = gGL->glGetUniformLocation( m_program, "flSRGBWrite" ); m_fakeSRGBEnableValue = -1.0f; for (int sampler = 0; sampler < 16; sampler++) @@ -1055,11 +862,11 @@ bool CGLMShaderPair::ValidateProgramPair() char tmp[16]; sprintf( tmp, "sampler%d", sampler ); // sampler0 .. sampler1.. etc - GLint nLoc = gGL->glGetUniformLocationARB( m_program, tmp ); + GLint nLoc = gGL->glGetUniformLocation( m_program, tmp ); m_locSamplers[sampler] = nLoc; if (nLoc >= 0) { - gGL->glUniform1iARB( nLoc, sampler ); + gGL->glUniform1i( nLoc, sampler ); } } } @@ -1133,22 +940,22 @@ bool CGLMShaderPair::SetProgramPair( CGLMProgram *vp, CGLMProgram *fp ) // attempt link. but first, detach any previously attached programs if (m_vertexProg) { - gGL->glDetachObjectARB(m_program, m_vertexProg->m_descs[kGLMGLSL].m_object.glsl); + gGL->glDetachObject(m_program, m_vertexProg->m_descs[kGLMGLSL].m_object.glsl); m_vertexProg = NULL; } if (m_fragmentProg) { - gGL->glDetachObjectARB(m_program, m_fragmentProg->m_descs[kGLMGLSL].m_object.glsl); + gGL->glDetachObject(m_program, m_fragmentProg->m_descs[kGLMGLSL].m_object.glsl); m_fragmentProg = NULL; } // now attach - gGL->glAttachObjectARB( m_program, vp->m_descs[kGLMGLSL].m_object.glsl ); + gGL->glAttachShader( m_program, vp->m_descs[kGLMGLSL].m_object.glsl ); m_vertexProg = vp; - gGL->glAttachObjectARB( m_program, fp->m_descs[kGLMGLSL].m_object.glsl ); + gGL->glAttachShader( m_program, fp->m_descs[kGLMGLSL].m_object.glsl ); m_fragmentProg = fp; // force the locations for input attributes v0-vN to be at locations 0-N @@ -1160,7 +967,7 @@ bool CGLMShaderPair::SetProgramPair( CGLMProgram *vp, CGLMProgram *fp ) char tmp[16]; sprintf(tmp, "v%d", i); // v0 v1 v2 ... et al - gGL->glBindAttribLocationARB( m_program, i, tmp ); + gGL->glBindAttribLocation( m_program, i, tmp ); } #if !GLM_FREE_SHADER_TEXT if (CommandLine()->CheckParm("-dumpallshaders")) @@ -1175,9 +982,26 @@ bool CGLMShaderPair::SetProgramPair( CGLMProgram *vp, CGLMProgram *fp ) } } #endif - + // now link - gGL->glLinkProgramARB( m_program ); + gGL->glLinkProgram( m_program ); + + GLint isLinked = 0; + gGL->glGetShaderiv(m_program, GL_LINK_STATUS, &isLinked); + if(isLinked == GL_FALSE) + { + GLint maxLength = 0; + gGL->glGetShaderiv(m_program, GL_INFO_LOG_LENGTH, &maxLength); + + GLchar log[4096]; + gGL->glGetProgramInfoLog( m_program, sizeof(log), &maxLength, log ); + if( maxLength ) + { + printf("vp: \n%s\nfp: \n%s\n", vp->m_text, fp->m_text ); + printf("shader %d link log: %s\n", m_program, log); + } + } + m_bCheckLinkStatus = true; } else diff --git a/togles/linuxwin/cglmquery.cpp b/togles/linuxwin/cglmquery.cpp index 199780a4..c0ddbfa8 100644 --- a/togles/linuxwin/cglmquery.cpp +++ b/togles/linuxwin/cglmquery.cpp @@ -26,7 +26,7 @@ // //=============================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #ifndef _WIN32 #include @@ -77,7 +77,7 @@ CGLMQuery::CGLMQuery( GLMContext *ctx, GLMQueryParams *params ) case EOcclusion: { //make an occlusion query (and a fence to go with it) - gGL->glGenQueriesARB( 1, &m_name ); + gGL->glGenQueries( 1, &m_name ); s_nTotalOcclusionQueryCreatesOrDeletes++; GLMPRINTF(("-A- CGLMQuery(OQ) created name %d", m_name)); } @@ -114,7 +114,7 @@ CGLMQuery::~CGLMQuery() { // do a finish occlusion query ? GLMPRINTF(("-A- ~CGLMQuery(OQ) deleting name %d", m_name)); - gGL->glDeleteQueriesARB(1, &m_name ); + gGL->glDeleteQueries(1, &m_name ); s_nTotalOcclusionQueryCreatesOrDeletes++; } break; @@ -163,7 +163,7 @@ void CGLMQuery::Start( void ) // "start counting" } else { - gGL->glBeginQueryARB( GL_SAMPLES_PASSED_ARB, m_name ); + gGL->glBeginQuery( GL_SAMPLES_PASSED, m_name ); } } break; @@ -204,7 +204,7 @@ void CGLMQuery::Stop( void ) // "stop counting" } else { - gGL->glEndQueryARB( GL_SAMPLES_PASSED_ARB ); // we are only putting the request-to-stop-counting into the cmd stream. + gGL->glEndQuery( GL_SAMPLES_PASSED ); // we are only putting the request-to-stop-counting into the cmd stream. } } break; @@ -240,7 +240,7 @@ bool CGLMQuery::IsDone( void ) // prepare to pay a big price on drivers prior to 10.6.4+SLGU GLint available = 0; - gGL->glGetQueryObjectivARB(m_name, GL_QUERY_RESULT_AVAILABLE_ARB, &available ); + gGL->glGetQueryObjectiv(m_name, GL_QUERY_RESULT_AVAILABLE, &available ); m_done = (available != 0); } @@ -301,7 +301,7 @@ void CGLMQuery::Complete( uint *result ) } else { - gGL->glGetQueryObjectuivARB( m_name, GL_QUERY_RESULT_ARB, &resultval); + gGL->glGetQueryObjectuiv( m_name, GL_QUERY_RESULT, &resultval); m_done = true; } } diff --git a/togles/linuxwin/cglmtex.cpp b/togles/linuxwin/cglmtex.cpp index 30eb9e46..3dc3ef04 100644 --- a/togles/linuxwin/cglmtex.cpp +++ b/togles/linuxwin/cglmtex.cpp @@ -26,7 +26,7 @@ // //=============================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "tier0/icommandline.h" #include "glmtexinlines.h" @@ -777,11 +777,11 @@ CGLMTex::CGLMTex( GLMContext *ctx, GLMTexLayout *layout, uint levels, const char // if tex is MSAA renderable, make an RBO, else zero the RBO name and dirty bit if (layout->m_key.m_texFlags & kGLMTexMultisampled) { - gGL->glGenRenderbuffersEXT( 1, &m_rboName ); + gGL->glGenRenderbuffers( 1, &m_rboName ); // so we have enough info to go ahead and bind the RBO and put storage on it? // try it. - gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_rboName ); + gGL->glBindRenderbuffer( GL_RENDERBUFFER, m_rboName ); // quietly clamp if sample count exceeds known limit for the device int sampleCount = layout->m_key.m_texSamples; @@ -792,7 +792,7 @@ CGLMTex::CGLMTex( GLMContext *ctx, GLMTexLayout *layout, uint levels, const char } GLenum msaaFormat = (layout->m_key.m_texFlags & kGLMTexSRGB) ? layout->m_format->m_glIntFormatSRGB : layout->m_format->m_glIntFormat; - gGL->glRenderbufferStorageMultisampleEXT( GL_RENDERBUFFER_EXT, + gGL->glRenderbufferStorageMultisample( GL_RENDERBUFFER, sampleCount, // not "layout->m_key.m_texSamples" msaaFormat, layout->m_key.m_xSize, @@ -803,7 +803,7 @@ CGLMTex::CGLMTex( GLMContext *ctx, GLMTexLayout *layout, uint levels, const char printf( "\n == MSAA Tex %p %s : MSAA RBO is intformat %s (%x)", this, m_debugLabel?m_debugLabel:"", GLMDecode( eGL_ENUM, msaaFormat ), msaaFormat ); } - gGL->glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + gGL->glBindRenderbuffer( GL_RENDERBUFFER, 0 ); } else { @@ -1013,7 +1013,7 @@ CGLMTex::~CGLMTex( ) if ( m_rboName ) { - gGL->glDeleteRenderbuffersEXT( 1, &m_rboName ); + gGL->glDeleteRenderbuffers( 1, &m_rboName ); m_rboName = 0; } @@ -1120,7 +1120,7 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) { readBox = desc->m_req.m_region; } - + CGLMTex *pPrevTex = m_ctx->m_samplers[0].m_pBoundTex; m_ctx->BindTexToTMU( this, 0 ); // SelectTMU(n) is a side effect @@ -1135,9 +1135,10 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) void *sliceAddress = m_backing + m_layout->m_slices[ desc->m_sliceIndex ].m_storageOffset; // this would change for PBO //int sliceSize = m_layout->m_slices[ desc->m_sliceIndex ].m_storageSize; - + // interestingly enough, we can use the same path for both 2D and 3D fetch + switch( target ) { case GL_TEXTURE_CUBE_MAP: @@ -1153,7 +1154,7 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) { // compressed path // http://www.opengl.org/sdk/docs/man/xhtml/glGetCompressedTexImage.xml - + gGL->glGetCompressedTexImage( target, // target desc->m_req.m_mip, // level sliceAddress ); // destination @@ -1162,15 +1163,50 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) { // uncompressed path // http://www.opengl.org/sdk/docs/man/xhtml/glGetTexImage.xml + GLuint fbo; + GLint Rfbo = 0, Dfbo = 0; + + gGL->glGetIntegerv( GL_DRAW_FRAMEBUFFER_BINDING, &Dfbo ); + gGL->glGetIntegerv( GL_READ_FRAMEBUFFER_BINDING, &Rfbo ); + + /* + gl4es_glGenFramebuffers(1, &fbo); + gl4es_glBindFramebuffer(GL_FRAMEBUFFER_OES, fbo); + gl4es_glFramebufferTexture2D(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, oldBind, 0); + // Read the pixels! + gl4es_glReadPixels(0, nheight-height, width, height, format, type, img); // using "full" version with conversion of format/type + gl4es_glBindFramebuffer(GL_FRAMEBUFFER_OES, old_fbo); + gl4es_glDeleteFramebuffers(1, &fbo); + + */ + gGL->glGenFramebuffers(1, &fbo); + gGL->glBindFramebuffer(GL_FRAMEBUFFER, fbo); + gGL->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_ctx->m_samplers[0].m_pBoundTex->m_texName, 0); + + uint fmt = format->m_glDataFormat; + if( fmt == GL_BGR ) + fmt = GL_RGB; + else if( fmt == GL_BGRA ) + fmt = GL_RGBA; + + gGL->glReadPixels(0, 0, m_layout->m_slices[ desc->m_sliceIndex ].m_xSize, m_layout->m_slices[ desc->m_sliceIndex ].m_ySize, fmt , format->m_glDataType == GL_UNSIGNED_INT_8_8_8_8_REV ? GL_UNSIGNED_BYTE : format->m_glDataType, sliceAddress); + + gGL->glBindFramebuffer(GL_READ_FRAMEBUFFER, Rfbo); + gGL->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, Dfbo); + + gGL->glDeleteFramebuffers(1, &fbo); + +#if 0 gGL->glGetTexImage( target, // target desc->m_req.m_mip, // level format->m_glDataFormat, // dataformat format->m_glDataType, // datatype sliceAddress ); // destination +#endif } } - break; + break; } } else @@ -1238,10 +1274,10 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa // allow use of subimage if the target is texture2D and it has already been teximage'd bool mayUseSubImage = false; - if ( (target==GL_TEXTURE_2D) && (m_sliceFlags[ desc->m_sliceIndex ] & kSliceValid) ) - { - mayUseSubImage = gl_enabletexsubimage.GetInt() != 0; - } + //if ( (target==GL_TEXTURE_2D) && (m_sliceFlags[ desc->m_sliceIndex ] & kSliceValid) ) + //{ + // mayUseSubImage = gl_enabletexsubimage.GetInt() != 0; + //} // check flavor, 2D, 3D, or cube map // we also have the choice to use subimage if this is a tex already created. (open question as to benefit) @@ -1262,7 +1298,7 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa if (m_layout->m_key.m_texFlags & kGLMTexSRGB) { Assert( m_layout->m_format->m_glDataFormat != GL_DEPTH_COMPONENT ); - Assert( m_layout->m_format->m_glDataFormat != GL_DEPTH_STENCIL_EXT ); + Assert( m_layout->m_format->m_glDataFormat != GL_DEPTH_STENCIL ); Assert( m_layout->m_format->m_glDataFormat != GL_ALPHA ); } @@ -1366,14 +1402,14 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa gGL->glPixelStorei( GL_UNPACK_SKIP_PIXELS, writeBox.xmin ); // in pixels gGL->glPixelStorei( GL_UNPACK_SKIP_ROWS, writeBox.ymin ); // in pixels - gGL->glTexSubImage2D( target, + gGL->glTexSubImage2D( glDataFormat, desc->m_req.m_mip, // level writeBox.xmin, // xoffset into dest writeBox.ymin, // yoffset into dest writeBox.xmax - writeBox.xmin, // width (was slice->m_xSize) writeBox.ymax - writeBox.ymin, // height (was slice->m_ySize) glDataFormat, // format - glDataType, // type + glDataType == GL_UNSIGNED_INT_8_8_8_8_REV ? GL_UNSIGNED_BYTE : glDataType, // type sliceAddress // data (will be offsetted by the SKIP_PIXELS and SKIP_ROWS - let GL do the math to find the first source texel) ); @@ -1413,12 +1449,12 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa // http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html gGL->glTexImage2D( target, // target desc->m_req.m_mip, // level - intformat, // internalformat - don't use format->m_glIntFormat because we have the SRGB select going on above + glDataFormat, // internalformat - don't use format->m_glIntFormat because we have the SRGB select going on above slice->m_xSize, // width slice->m_ySize, // height 0, // border glDataFormat, // dataformat - glDataType, // datatype + glDataType == GL_UNSIGNED_INT_8_8_8_8_REV ? GL_UNSIGNED_BYTE : glDataType, // datatype noDataWrite ? NULL : sliceAddress ); // data (optionally suppressed in case ResetSRGB desires) if (m_layout->m_key.m_texFlags & kGLMTexMultisampled) diff --git a/togles/linuxwin/dx9asmtogl2.cpp b/togles/linuxwin/dx9asmtogl2.cpp index 22be8fc9..7cb89eaf 100644 --- a/togles/linuxwin/dx9asmtogl2.cpp +++ b/togles/linuxwin/dx9asmtogl2.cpp @@ -28,7 +28,7 @@ #include #include -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "tier0/dbg.h" #include "tier1/strtools.h" #include "tier1/utlbuffer.h" @@ -59,6 +59,42 @@ //#define Assert(n) if( !(n) ){ TranslationError(); } +static char g_szShadow2D[] = + "uniform sampler2D u_ShadowMap;\n" + "#define invSize 0.001953125\n" + "#define size 512.0\n" + "vec4 _shadow2D( sampler2D u_depthTex, vec3 suv)\n" + "{\n" + "vec2 p1 = suv.xy;\n" + "vec2 p2 = suv.xy+vec2(0.0,invSize);\n" + "vec2 p3 = suv.xy+vec2(invSize,0.0);\n" + "vec2 p4 = suv.xy+vec2(invSize);\n" + "float d = texture2D(u_depthTex,p1).r;\n" + "float r = float(d>suv.z);\n" + "d = texture2D(u_depthTex,p2).r;\n" + "float r2 = float(d>suv.z);\n" + "d = texture2D(u_depthTex,p3).r;\n" + "float r3 = float(d>suv.z);\n" + "d = texture2D(u_depthTex,p4).r;\n" + "float r4 = float(d>suv.z);\n" + "p1*=size;\n" + "float a = p1.y-floor(p1.y);\n" + "float b = p1.x-floor(p1.x);\n" + "float gg = mix(mix(r,r2,a),mix(r3,r4,a),b);\n" + "return vec4(gg, gg, gg, gg);" + "}\n" + "#define shadow2D _shadow2D\n"; + +static char g_szShadow2DProj[] = + "float _shadow2DProj( vec4 projection, vec2 texel, float NdotL )\n" + "{\n" + "vec3 coord = vec3( projection.xyz / ( projection.w + 0.0005 )); // z-bias\n" + "coord.s = float( clamp( float( coord.s ), texel.x, 1.0 - texel.x ));\n" + "coord.t = float( clamp( float( coord.t ), texel.y, 1.0 - texel.y ));\n" + "coord.r = float( clamp( float( coord.r ), 0.0, 1.0 ));\n" + "return _shadow2D( u_ShadowMap, coord );\n" + "}\n" + "#define shadow2DProj _shadow2DProj\n"; static char *g_szVecZeros[] = { NULL, "0.0", "vec2( 0.0, 0.0 )", "vec3( 0.0, 0.0, 0.0 )", "vec4( 0.0, 0.0, 0.0, 0.0 )" }; static char *g_szVecOnes[] = { NULL, "1.0", "vec2( 1.0, 1.0 )", "vec3( 1.0, 1.0, 1.0 )", "vec4( 1.0, 1.0, 1.0, 1.0 )" }; @@ -894,7 +930,7 @@ void D3DToGL::PrintUsageAndIndexToString( uint32 dwToken, char* strUsageUsageInd V_snprintf( strUsageUsageIndexName, nBufLen, "_psize" ); // no analog break; case D3DDECLUSAGE_TEXCOORD: - V_snprintf( strUsageUsageIndexName, nBufLen, "oT%d", dwUsageIndex ); + V_snprintf( strUsageUsageIndexName, nBufLen, "oT%d", dwUsageIndex ); break; case D3DDECLUSAGE_TANGENT: @@ -919,8 +955,7 @@ void D3DToGL::PrintUsageAndIndexToString( uint32 dwToken, char* strUsageUsageInd // if ( fSemanticFlags & SEMANTIC_OUTPUT ) // V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "gl_BackColor" : "gl_FrontColor" ); // else - V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "gl_SecondaryColor" : "gl_Color" ); - + V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "_gl_SecondaryColor" : "_gl_Color" ); break; case D3DDECLUSAGE_FOG: TranslationError(); @@ -1185,9 +1220,9 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch } else { - V_snprintf( buff, sizeof( buff ), dwRegNum == 0 ? "gl_Color" : "gl_SecondaryColor" ); + V_snprintf( buff, sizeof( buff ), dwRegNum == 0 ? "_gl_Color" : "_gl_SecondaryColor" ); } - strcat_s( pRegisterName, nBufLen, buff ); + strcat_s( pRegisterName, nBufLen, buff ); } else { @@ -1318,13 +1353,12 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch // Is this iterator centroid? if ( m_nCentroidMask & ( 0x00000001 << dwRegNum ) ) { - V_snprintf( buff, sizeof( buff ), "centroid varying vec4 oT%d", dwRegNum ); // centroid varying + V_snprintf( buff, sizeof( buff ), "centroid in vec4 oT%d", dwRegNum ); // centroid varying } else { - V_snprintf( buff, sizeof( buff ), "varying vec4 oT%d", dwRegNum ); - } - + V_snprintf( buff, sizeof( buff ), "in vec4 oT%d", dwRegNum ); + } bAllowWriteMask = false; } else // source register @@ -1345,7 +1379,13 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch break; case D3DSRO_FOG: - strcat_s( pRegisterName, nBufLen, "gl_FogFragCoord" ); + if( !m_bFogFragCoord ) + { + StrcatToHeaderCode("varying mediump vec4 _gl_FogFragCoord;\n"); + m_bFogFragCoord = true; + } + + strcat_s( pRegisterName, nBufLen, "_gl_FogFragCoord" ); m_bDeclareVSOFog = true; break; @@ -1361,11 +1401,23 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch if ( dwRegNum == 0 ) { - V_snprintf( buff, sizeof( buff ), "gl_FrontColor" ); + if( !m_bFrontColor ) + { + StrcatToHeaderCode("varying lowp vec4 _gl_FrontColor;\n"); + m_bFrontColor = true; + } + + V_snprintf( buff, sizeof( buff ), "_gl_FrontColor" ); } else if ( dwRegNum == 1 ) { - V_snprintf( buff, sizeof( buff ), "gl_FrontSecondaryColor" ); + if( !m_bFrontSecondaryColor ) + { + StrcatToHeaderCode("varying lowp vec4 _gl_FrontSecondaryColor;\n"); + m_bFrontSecondaryColor = true; + } + + V_snprintf( buff, sizeof( buff ), "_gl_FrontSecondaryColor" ); } else { @@ -1404,6 +1456,10 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch m_dwConstIntUsageMask |= 0x00000001 << dwRegNum; // Keep track of the use of this integer constant break; case D3DSPR_COLOROUT: + // TODO(nillerusr): go fck urself + if( dwRegNum+1 > m_iFragDataCount ) + m_iFragDataCount = dwRegNum+1; + V_snprintf( buff, sizeof( buff ), "gl_FragData[%d]", dwRegNum ); strcat_s( pRegisterName, nBufLen, buff ); m_bOutputColorRegister[dwRegNum] = true; @@ -1816,7 +1872,7 @@ void D3DToGL::Handle_DCL() CUtlString sParam2 = GetUsageAndIndexString( dwToken, SEMANTIC_INPUT ); sParam2 = FixGLSLSwizzle( sParam1, sParam2 ); - PrintToBuf( *m_pBufHeaderCode, "attribute vec4 %s; // ", sParam1.String() ); + PrintToBuf( *m_pBufHeaderCode, "in vec4 %s; // ", sParam1.String() ); MaintainAttributeMap( dwToken, dwRegToken ); @@ -1869,12 +1925,13 @@ void D3DToGL::Handle_DCL() char buf[256]; if ( m_nCentroidMask & ( 0x00000001 << dwUsageIndex ) ) { - V_snprintf( buf, sizeof( buf ), "centroid varying vec4 oT%d;\n", dwUsageIndex ); // centroid varying + V_snprintf( buf, sizeof( buf ), "centroid in vec4 oT%d;\n", dwUsageIndex ); // centroid varying } else { - V_snprintf( buf, sizeof( buf ), "varying vec4 oT%d;\n", dwUsageIndex ); + V_snprintf( buf, sizeof( buf ), "in vec4 oT%d;\n", dwUsageIndex ); } + StrcatToHeaderCode( buf ); } } @@ -2877,13 +2934,14 @@ void D3DToGL::Handle_UnaryOp( uint32 nInstruction ) void D3DToGL::WriteGLSLSamplerDefinitions() { int nSamplersWritten = 0; + bool m_bSampler3d = false; for ( int i=0; i < ARRAYSIZE( m_dwSamplerTypes ); i++ ) { if ( m_dwSamplerTypes[i] == SAMPLER_TYPE_2D ) { if ( ( ( 1 << i ) & m_nShadowDepthSamplerMask ) != 0 ) { - PrintToBuf( *m_pBufHeaderCode, "uniform sampler2DShadow sampler%d;\n", i ); + PrintToBuf( *m_pBufHeaderCode, "uniform sampler2D sampler%d;\n", i ); } else { @@ -2893,6 +2951,12 @@ void D3DToGL::WriteGLSLSamplerDefinitions() } else if ( m_dwSamplerTypes[i] == SAMPLER_TYPE_3D ) { + if( !m_bSampler3d ) + { + StrcatToHeaderCode( "precision mediump sampler3D;\n" ); + m_bSampler3d = true; + } + PrintToBuf( *m_pBufHeaderCode, "uniform sampler3D sampler%d;\n", i ); ++nSamplersWritten; } @@ -2941,21 +3005,27 @@ void D3DToGL::WriteGLSLOutputVariableAssignments() if ( dwUsage == D3DDECLUSAGE_COLOR ) { - PrintToBufWithIndents( *m_pBufALUCode, "%s = oTempT%d;\n", dwUsageIndex ? "gl_FrontSecondaryColor" : "gl_FrontColor", i ); + if( !m_bFrontColor ) + { + StrcatToHeaderCode("varying lowp vec4 _gl_FrontColor;\n"); + m_bFrontColor = true; + } + + PrintToBufWithIndents( *m_pBufALUCode, "%s = oTempT%d;\n", dwUsageIndex ? "gl_FrontSecondaryColor" : "_gl_FrontColor", i ); } else if ( dwUsage == D3DDECLUSAGE_TEXCOORD ) { char buf[256]; if ( m_nCentroidMask & ( 0x00000001 << dwUsageIndex ) ) { - V_snprintf( buf, sizeof( buf ), "centroid varying vec4 oT%d;\n", dwUsageIndex ); // centroid varying + V_snprintf( buf, sizeof( buf ), "centroid out vec4 oT%d;\n", dwUsageIndex ); // centroid varying } else { - V_snprintf( buf, sizeof( buf ), "varying vec4 oT%d;\n", dwUsageIndex ); + V_snprintf( buf, sizeof( buf ), "out vec4 oT%d;\n", dwUsageIndex ); } StrcatToHeaderCode( buf ); - + PrintToBufWithIndents( *m_pBufALUCode, "oT%d = oTempT%d;\n", dwUsageIndex, i ); } } @@ -2979,12 +3049,12 @@ void D3DToGL::WriteGLSLInputVariableAssignments() if ( dwUsage == D3DDECLUSAGE_COLOR ) { - PrintToBufWithIndents( *m_pBufAttribCode, "vec4 oTempT%d = %s;\n", i, dwUsageIndex ? "gl_SecondaryColor" : "gl_Color" ); + PrintToBufWithIndents( *m_pBufAttribCode, "vec4 oTempT%d = %s;\n", i, dwUsageIndex ? "_gl_SecondaryColor" : "_gl_Color" ); } else if ( dwUsage == D3DDECLUSAGE_TEXCOORD ) { PrintToBufWithIndents( *m_pBufAttribCode, "vec4 oTempT%d = oT%d;\n", i, dwUsageIndex ); - } + } } } @@ -3100,6 +3170,13 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo m_bDoFixupZ = (options & D3DToGL_OptionDoFixupZ) != 0; m_bDoFixupY = (options & D3DToGL_OptionDoFixupY) != 0; m_bDoUserClipPlanes = (options & D3DToGL_OptionDoUserClipPlanes) != 0; + + m_bFrontSecondaryColor = false; + m_bFogFragCoord = false; + m_bColor = false; + m_bFrontColor = false; + m_bSecondaryColor = false; + m_iFragDataCount = 0; m_bAddHexCodeComments = (options & D3DToGL_AddHexComments) != 0; m_bPutHexCodesAfterLines = (options & D3DToGL_PutHexCommentsAfterLines) != 0; @@ -3190,25 +3267,24 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo m_dwMinorVersion = D3DSHADER_VERSION_MINOR( dwToken ); // If pixel shader - const char *glslExtText = "#extension GL_ARB_shader_texture_lod : require\n";//m_bUseBindlessTexturing ? "#extension GL_NV_bindless_texture : require\n" : ""; + const char *glslExtText = "\n";//#extension GL_ARB_shader_texture_lod : require\n";//m_bUseBindlessTexturing ? "#extension GL_NV_bindless_texture : require\n" : ""; // 7ls - const char *glslVersionText = m_bUseBindlessTexturing ? "330 compatibility" : "120"; +// const char *glslVersionText = m_bUseBindlessTexturing ? "330 compatibility" : "120"; if ( ( dwToken & 0xFFFF0000 ) == 0xFFFF0000 ) { // must explicitly enable extensions if emitting GLSL - V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version %s\n%s", glslVersionText, glslExtText ); + V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version 300 es\nprecision mediump float;\n#define varying in\n\n%s", glslExtText ); m_bVertexShader = false; } else // vertex shader { m_bGenerateSRGBWriteSuffix = false; + V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version 300 es\nprecision mediump float;\n#define attribute in\n#define varying out\n%s//ATTRIBMAP-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx\n", glslExtText ); - V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version %s\n%s//ATTRIBMAP-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx\n", glslVersionText, glslExtText ); - // find that first '-xx' which is where the attrib map will be written later. pAttribMapStart = strstr( (char *)m_pBufHeaderCode->Base(), "-xx" ) + 1; - + m_bVertexShader = true; } @@ -3521,7 +3597,7 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo // Note that this constant packing expects .wzyx swizzles in case we ever use the SINCOS code in a ps_2_x shader // - // The Microsoft documentation on this is all kinds of broken and, strangely, these numbers don't even + // The Microsoft do cumentation on this is all kinds of broken and, strangely, these numbers don't even // match the D3DSINCOSCONST1 and D3DSINCOSCONST2 constants used by the D3D assembly sincos instruction... if ( m_bNeedsSinCosDeclarations ) { @@ -3688,7 +3764,7 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo { if ( m_bDoUserClipPlanes ) { - StrcatToALUCode( "gl_ClipVertex = vTempPos;\n" ); // if user clip is enabled, jam clip space position into gl_ClipVertex +// StrcatToALUCode( "gl_ClipVertex = vTempPos;\n" ); // if user clip is enabled, jam clip space position into gl_ClipVertex } if ( m_bDoFixupZ || m_bDoFixupY ) @@ -3746,12 +3822,12 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo { if ( m_nCentroidMask & ( 0x00000001 << i ) ) { - V_snprintf( outTexCoordBuff, sizeof( outTexCoordBuff ), "centroid varying vec4 oT%d;\n", i ); // centroid varying + V_snprintf( outTexCoordBuff, sizeof( outTexCoordBuff ), "centroid out vec4 oT%d;\n", i ); // centroid varying StrcatToHeaderCode( outTexCoordBuff ); } else { - V_snprintf( outTexCoordBuff, sizeof( outTexCoordBuff ), "varying vec4 oT%d;\n", i ); + V_snprintf( outTexCoordBuff, sizeof( outTexCoordBuff ), "out vec4 oT%d;\n", i ); StrcatToHeaderCode( outTexCoordBuff ); } } @@ -3769,7 +3845,7 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo // do some annotation at the end of the attrib block { - char temp[1000]; + char temp[5000]; if ( m_bVertexShader ) { @@ -3800,6 +3876,30 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo StrcatToHeaderCode( "OPTION ARB_fragment_program_shadow;\n" ); } + if( m_iFragDataCount || m_bGenerateSRGBWriteSuffix ) + { + char buf[256]; + snprintf(buf, sizeof buf, "out vec4 _gl_FragData[%d];\n#define gl_FragData _gl_FragData\n", m_iFragDataCount); + StrcatToHeaderCode( buf ); + } + +#define FindSubcode(a) (V_strstr((char*)m_pBufALUCode->Base(), a) != 0 || V_strstr((char*)m_pBufHeaderCode->Base(), a) != 0 || V_strstr((char*)m_pBufParamCode->Base(), a) != 0 || V_strstr((char*)m_pBufAttribCode->Base(), a) != 0 ) + + if( FindSubcode("shadow2DProj") ) + { + StrcatToHeaderCode( g_szShadow2D ); + StrcatToHeaderCode( g_szShadow2DProj ); + + } + else if( FindSubcode("shadow2D") ) + StrcatToHeaderCode( g_szShadow2D ); + + if( FindSubcode("_gl_Color") ) + StrcatToHeaderCode( "vec4 _gl_Color;\n" ); + + if( FindSubcode("_gl_SecondaryColor") ) + StrcatToHeaderCode( "vec4 _gl_SecondaryColor;\n" ); + StrcatToHeaderCode( "\nvoid main()\n{\n" ); if ( m_bUsedAtomicTempVar ) { @@ -3815,9 +3915,9 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo StrcatToALUCode( "sRGBFragData.xyz = exp( sRGBFragData.xyz );\n" ); StrcatToALUCode( "gl_FragData[0].xyz = mix( gl_FragData[0].xyz, sRGBFragData, flSRGBWrite );\n" ); } - - strcat_s( (char*)m_pBufALUCode->Base(), m_pBufALUCode->Size(), "}\n" ); + strcat_s( (char*)m_pBufALUCode->Base(), m_pBufALUCode->Size(), "}\n" ); + // Put all of the strings together for final program ( pHeaderCode + pAttribCode + pParamCode + pALUCode ) StrcatToHeaderCode( (char*)m_pBufAttribCode->Base() ); StrcatToHeaderCode( (char*)m_pBufParamCode->Base() ); diff --git a/togles/linuxwin/dx9asmtogl2.h b/togles/linuxwin/dx9asmtogl2.h index 2ab7e098..2751c5f5 100644 --- a/togles/linuxwin/dx9asmtogl2.h +++ b/togles/linuxwin/dx9asmtogl2.h @@ -82,7 +82,13 @@ private: bool m_bGenerateSRGBWriteSuffix; // set D3DToGL_OptionSRGBWriteSuffix bool m_bGenerateBoneUniformBuffer; bool m_bUseBindlessTexturing; - + bool m_bFogFragCoord; + bool m_bFrontSecondaryColor; + bool m_bColor; + bool m_bSecondaryColor; + bool m_bFrontColor; + + // Counter for dealing with nested loops int m_nLoopDepth; @@ -181,6 +187,7 @@ private: // Have they used the tangent input semantic (i.e. is g_pTangentAttributeName declared)? bool m_bTangentInputUsed; + uint m_iFragDataCount; bool m_bUsesDSTInstruction; diff --git a/togles/linuxwin/dxabstract.cpp b/togles/linuxwin/dxabstract.cpp index f4459e8e..0e0fca16 100644 --- a/togles/linuxwin/dxabstract.cpp +++ b/togles/linuxwin/dxabstract.cpp @@ -25,7 +25,7 @@ // dxabstract.cpp // //================================================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "tier0/vprof_telemetry.h" #include "tier0/dbg.h" #include "tier0/threadtools.h" @@ -2384,7 +2384,7 @@ HRESULT IDirect3DDevice9::Create( IDirect3DDevice9Params *params ) m_ctx->m_drawingFBO = m_ctx->NewFBO(); // bind it to context. will receive attachments shortly. - m_ctx->BindFBOToCtx( m_ctx->m_drawingFBO, GL_FRAMEBUFFER_EXT ); + m_ctx->BindFBOToCtx( m_ctx->m_drawingFBO, GL_FRAMEBUFFER ); m_bFBODirty = false; @@ -3235,7 +3235,7 @@ void IDirect3DDevice9::UpdateBoundFBO() m_ctx->m_drawingFBO = newFBO; } - m_ctx->BindFBOToCtx( m_ctx->m_drawingFBO, GL_FRAMEBUFFER_EXT ); + m_ctx->BindFBOToCtx( m_ctx->m_drawingFBO, GL_FRAMEBUFFER ); m_bFBODirty = false; } @@ -3873,10 +3873,8 @@ HRESULT IDirect3DDevice9::CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixe int maxTranslationSize = 50000; // size of any one translation - CUtlBuffer transbuf( 3000, numTranslations * maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); - CUtlBuffer tempbuf( 3000, maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); - - transbuf.PutString( "//GLSLfp\n" ); // this is required so GLM can crack the text apart + CUtlBuffer transbuf( 9000, numTranslations * maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); + CUtlBuffer tempbuf( 9000, maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); // note the GLSL translator wants its own buffer tempbuf.EnsureCapacity( maxTranslationSize ); @@ -4009,7 +4007,7 @@ HRESULT IDirect3DDevice9::CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixe { // find the fb outputs used by this shader/combo - const GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT }; + const GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; char *fragDataMaskPrefix = "//FRAGDATAMASK-"; @@ -4153,10 +4151,8 @@ HRESULT IDirect3DDevice9::CreateVertexShader(CONST DWORD* pFunction, IDirect3DVe int maxTranslationSize = 500000; // size of any one translation - CUtlBuffer transbuf( 1000, numTranslations * maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); - CUtlBuffer tempbuf( 1000, maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); - - transbuf.PutString( "//GLSLvp\n" ); // this is required so GLM can crack the text apart + CUtlBuffer transbuf( 5000, numTranslations * maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); + CUtlBuffer tempbuf( 5000, maxTranslationSize, CUtlBuffer::TEXT_BUFFER ); // note the GLSL translator wants its own buffer tempbuf.EnsureCapacity( maxTranslationSize ); diff --git a/togles/linuxwin/glentrypoints.cpp b/togles/linuxwin/glentrypoints.cpp index ef1f01ff..64fe576e 100644 --- a/togles/linuxwin/glentrypoints.cpp +++ b/togles/linuxwin/glentrypoints.cpp @@ -27,7 +27,7 @@ //=============================================================================// // Immediately include gl.h, etc. here to avoid compilation warnings. -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "appframework/AppFramework.h" #include "appframework/IAppSystemGroup.h" @@ -80,9 +80,9 @@ bool g_bPrintOpenGLCalls = false; fflush(stdout); \ } \ const GLenum err = glGetError_gldebugptr(); \ - if ( err == GL_INVALID_FRAMEBUFFER_OPERATION_EXT ) { \ - const GLenum fberr = gGL->glCheckFramebufferStatus( GL_FRAMEBUFFER_EXT ); \ - printf("%s triggered error GL_INVALID_FRAMEBUFFER_OPERATION_EXT! (0x%X)\n\n\n", #fn, (int) fberr); \ + if ( err == GL_INVALID_FRAMEBUFFER_OPERATION ) { \ + const GLenum fberr = gGL->glCheckFramebufferStatus( GL_FRAMEBUFFER ); \ + printf("%s triggered error GL_INVALID_FRAMEBUFFER_OPERATION! (0x%X)\n\n\n", #fn, (int) fberr); \ fflush(stdout); \ __asm__ __volatile__ ( "int $3\n\t" ); \ } else if (err != GL_NO_ERROR) { \ @@ -107,9 +107,9 @@ bool g_bPrintOpenGLCalls = false; fflush(stdout); \ } \ const GLenum err = glGetError_gldebugptr(); \ - if ( err == GL_INVALID_FRAMEBUFFER_OPERATION_EXT ) { \ - const GLenum fberr = gGL->glCheckFramebufferStatus( GL_FRAMEBUFFER_EXT ); \ - printf("%s triggered error GL_INVALID_FRAMEBUFFER_OPERATION_EXT! (0x%X)\n\n\n", #fn, (int) fberr); \ + if ( err == GL_INVALID_FRAMEBUFFER_OPERATION ) { \ + const GLenum fberr = gGL->glCheckFramebufferStatus( GL_FRAMEBUFFER ); \ + printf("%s triggered error GL_INVALID_FRAMEBUFFER_OPERATION! (0x%X)\n\n\n", #fn, (int) fberr); \ fflush(stdout); \ __asm__ __volatile__ ( "int $3\n\t" ); \ } else if (err != GL_NO_ERROR) { \ @@ -119,7 +119,7 @@ bool g_bPrintOpenGLCalls = false; } \ } -#include "togl/glfuncs.inl" +#include "togles/glfuncs.inl" #undef GL_FUNC_VOID #undef GL_FUNC #undef GL_EXT @@ -296,7 +296,9 @@ static bool CheckOpenGLExtension_internal(const char *ext, const int coremajor, return false; } } + #elif !defined ( OSX ) && !defined( __ANDROID__ ) +/* if (!ptr) { static CDynamicFunctionOpenGL< true, Display *( APIENTRY *)( ), Display* > glXGetCurrentDisplay("glXGetCurrentDisplay"); @@ -306,7 +308,7 @@ static bool CheckOpenGLExtension_internal(const char *ext, const int coremajor, extensions = glXQueryExtensionsString(glXGetCurrentDisplay(), 0); ptr = strstr(extensions, ext); } - } + }*/ #endif if (!ptr) @@ -342,7 +344,7 @@ COpenGLEntryPoints::COpenGLEntryPoints() #define GL_EXT(x,glmajor,glminor) , m_bHave_##x(CheckOpenGLExtension(#x, glmajor, glminor)) #define GL_FUNC(ext,req,ret,fn,arg,call) , fn(#fn, m_bHave_##ext) #define GL_FUNC_VOID(ext,req,fn,arg,call) , fn(#fn, m_bHave_##ext) -#include "togl/glfuncs.inl" +#include "togles/glfuncs.inl" #undef GL_FUNC_VOID #undef GL_FUNC #undef GL_EXT @@ -380,7 +382,7 @@ COpenGLEntryPoints::COpenGLEntryPoints() #ifndef ANDROID // HACK if ((m_bHave_OpenGL) && ((!m_bHave_GL_NV_fence) && (!m_bHave_GL_ARB_sync) && (!m_bHave_GL_APPLE_fence))) { - Error( "Required OpenGL extension \"GL_NV_fence\", \"GL_ARB_sync\", or \"GL_APPLE_fence\" is not supported. Please upgrade your OpenGL driver." ); + // Error( "Required OpenGL extension \"GL_NV_fence\", \"GL_ARB_sync\", or \"GL_APPLE_fence\" is not supported. Please upgrade your OpenGL driver." ); } #endif @@ -393,25 +395,26 @@ COpenGLEntryPoints::COpenGLEntryPoints() // GL_ARB_framebuffer_object is a superset of GL_EXT_framebuffer_object, // (etc) but if you don't call in through the ARB entry points, you won't // get the relaxed restrictions on mismatched attachment dimensions. - if (m_bHave_GL_ARB_framebuffer_object) +// if (m_bHave_GL_ARB_framebuffer_object) { m_bHave_GL_EXT_framebuffer_object = true; m_bHave_GL_EXT_framebuffer_blit = true; m_bHave_GL_EXT_framebuffer_multisample = true; - glBindFramebufferEXT.Force(glBindFramebuffer.Pointer()); - glBindRenderbufferEXT.Force(glBindRenderbuffer.Pointer()); - glCheckFramebufferStatusEXT.Force(glCheckFramebufferStatus.Pointer()); - glDeleteRenderbuffersEXT.Force(glDeleteRenderbuffers.Pointer()); - glFramebufferRenderbufferEXT.Force(glFramebufferRenderbuffer.Pointer()); - glFramebufferTexture2DEXT.Force(glFramebufferTexture2D.Pointer()); - glFramebufferTexture3DEXT.Force(glFramebufferTexture3D.Pointer()); - glGenFramebuffersEXT.Force(glGenFramebuffers.Pointer()); - glGenRenderbuffersEXT.Force(glGenRenderbuffers.Pointer()); - glDeleteFramebuffersEXT.Force(glDeleteFramebuffers.Pointer()); - glBlitFramebufferEXT.Force(glBlitFramebuffer.Pointer()); - glRenderbufferStorageMultisampleEXT.Force(glRenderbufferStorageMultisample.Pointer()); + + glBindFramebuffer.Force(glBindFramebuffer.Pointer()); + glBindRenderbuffer.Force(glBindRenderbuffer.Pointer()); + glCheckFramebufferStatus.Force(glCheckFramebufferStatus.Pointer()); + glDeleteRenderbuffers.Force(glDeleteRenderbuffers.Pointer()); + glFramebufferRenderbuffer.Force(glFramebufferRenderbuffer.Pointer()); + glFramebufferTexture2D.Force(glFramebufferTexture2D.Pointer()); + glFramebufferTexture3D.Force(glFramebufferTexture3D.Pointer()); + glGenFramebuffers.Force(glGenFramebuffers.Pointer()); + glGenRenderbuffers.Force(glGenRenderbuffers.Pointer()); + glDeleteFramebuffers.Force(glDeleteFramebuffers.Pointer()); + glBlitFramebuffer.Force(glBlitFramebuffer.Pointer()); + glRenderbufferStorageMultisample.Force(glRenderbufferStorageMultisample.Pointer()); } - + #if DEBUG_ALL_GLCALLS // push all GL calls through the debug wrappers. #define GL_EXT(x,glmajor,glminor) @@ -421,7 +424,7 @@ COpenGLEntryPoints::COpenGLEntryPoints() #define GL_FUNC_VOID(ext,req,fn,arg,call) \ fn##_gldebugptr = this->fn; \ this->fn.Force(fn##_gldebug); -#include "togl/glfuncs.inl" +#include "togles/glfuncs.inl" #undef GL_FUNC_VOID #undef GL_FUNC #undef GL_EXT @@ -500,7 +503,7 @@ void COpenGLEntryPoints::ClearEntryPoints() #define GL_EXT(x,glmajor,glminor) #define GL_FUNC(ext,req,ret,fn,arg,call) fn.Force( NULL ); #define GL_FUNC_VOID(ext,req,fn,arg,call) fn.Force( NULL ); - #include "togl/glfuncs.inl" + #include "togles/glfuncs.inl" #undef GL_FUNC_VOID #undef GL_FUNC #undef GL_EXT diff --git a/togles/linuxwin/glmgr.cpp b/togles/linuxwin/glmgr.cpp index 1c18720f..f2aee138 100644 --- a/togles/linuxwin/glmgr.cpp +++ b/togles/linuxwin/glmgr.cpp @@ -25,7 +25,7 @@ // glmgr.cpp // //=============================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "tier0/icommandline.h" @@ -76,28 +76,25 @@ const uint32 g_garbageTextureBits[ 4 * kDeletedTextureDim * kDeletedTextureDim ] char g_nullFragmentProgramText [] = { - "!!ARBfp1.0 \n" - "PARAM black = { 0.0, 0.0, 0.0, 1.0 }; \n" // opaque black - "MOV result.color, black; \n" - "END \n\n\n" - "//GLSLfp\n" + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 _gl_FragColor;\n" "void main()\n" "{\n" - "gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n" + "_gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n" "}\n" - }; // make dummy programs for doing texture preload via dummy draw -char g_preloadTexVertexProgramText[] = +char g_preloadTexVertexProgramText[] = // Гроб гроб кладбище пидор { - "//GLSLvp \n" - "#version 120 \n" - "varying vec4 otex; \n" + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 otex;\n" "void main() \n" "{ \n" - "vec4 pos = ftransform(); // vec4( 0.1, 0.1, 0.1, 0.1 ); \n" - "vec4 tex = vec4( 0.0, 0.0, 0.0, 0.0 ); \n" + "vec4 pos = vec4( 0.1, 0.1, 0.1, 0.1 );\n" + "vec4 tex = vec4( 0.0, 0.0, 0.0, 0.0 );\n" " \n" "gl_Position = pos; \n" "otex = tex; \n" @@ -106,9 +103,10 @@ char g_preloadTexVertexProgramText[] = char g_preload2DTexFragmentProgramText[] = { - "//GLSLfp \n" - "#version 120 \n" - "varying vec4 otex; \n" + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 _gl_FragColor;\n" + "in vec4 otex;\n" "//SAMPLERMASK-8000 // may not be needed \n" "//HIGHWATER-30 // may not be needed \n" " \n" @@ -119,18 +117,20 @@ char g_preload2DTexFragmentProgramText[] = "{ \n" "vec4 r0; \n" "r0 = texture2D( sampler15, otex.xy ); \n" - "gl_FragColor = r0; //discard; \n" + "_gl_FragColor = r0; //discard; \n" "} \n" }; char g_preload3DTexFragmentProgramText[] = { - "//GLSLfp \n" - "#version 120 \n" - "varying vec4 otex; \n" + "#version 300 es\n" + "precision mediump float;\n" + "out vec4 _gl_FragColor;\n" + "in vec4 otex;\n" "//SAMPLERMASK-8000 // may not be needed \n" "//HIGHWATER-30 // may not be needed \n" " \n" + "precision mediump sampler3D;\n" "uniform vec4 pc[31]; \n" "uniform sampler3D sampler15; \n" " \n" @@ -138,17 +138,18 @@ char g_preload3DTexFragmentProgramText[] = "{ \n" "vec4 r0; \n" "r0 = texture3D( sampler15, otex.xyz ); \n" - "gl_FragColor = r0; //discard; \n" + "_gl_FragColor = vec4(0,0,0,0); //discard; \n" "} \n" }; char g_preloadCubeTexFragmentProgramText[] = { - "//GLSLfp \n" - "#version 120 \n" - "varying vec4 otex; \n" - "//SAMPLERMASK-8000 // may not be needed \n" - "//HIGHWATER-30 // may not be needed \n" + "#version 300 es\n" + "precision mediump float;\n" + "in vec4 otex;\n" + "out vec4 _gl_FragColor;\n" + "//SAMPLERMASK-8000 // may not be needed \n" + "//HIGHWATER-30 // may not be needed \n" " \n" "uniform vec4 pc[31]; \n" "uniform samplerCube sampler15; \n" @@ -157,7 +158,7 @@ char g_preloadCubeTexFragmentProgramText[] = "{ \n" "vec4 r0; \n" "r0 = textureCube( sampler15, otex.xyz ); \n" - "gl_FragColor = r0; //discard; \n" + "_gl_FragColor = r0; //discard; \n" "} \n" }; @@ -638,19 +639,12 @@ void GLMContext::ForceFlushStates() NullProgram(); // FBO - BindFBOToCtx( m_boundReadFBO, GL_READ_FRAMEBUFFER_EXT ); - BindFBOToCtx( m_boundDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_boundReadFBO, GL_READ_FRAMEBUFFER ); + BindFBOToCtx( m_boundDrawFBO, GL_DRAW_FRAMEBUFFER ); // Current VB/IB/pinned memory buffers - gGL->glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, m_nBoundGLBuffer[ kGLMIndexBuffer] ); - gGL->glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nBoundGLBuffer[ kGLMVertexBuffer] ); - -#ifndef OSX - if ( gGL->m_bHave_GL_AMD_pinned_memory ) - { - gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].GetHandle() ); - } -#endif + gGL->glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_nBoundGLBuffer[ kGLMIndexBuffer] ); + gGL->glBindBuffer( GL_ARRAY_BUFFER, m_nBoundGLBuffer[ kGLMVertexBuffer] ); } const GLMRendererInfoFields& GLMContext::Caps( void ) @@ -827,17 +821,17 @@ enum eBlitFormatClass eDepthStencil }; -uint glAttachFromClass[ 3 ] = { GL_COLOR_ATTACHMENT0_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_DEPTH_STENCIL_ATTACHMENT_EXT }; +uint glAttachFromClass[ 3 ] = { GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_DEPTH_STENCIL_ATTACHMENT }; void glScrubFBO ( GLenum target ) { - gGL->glFramebufferRenderbufferEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, 0); - gGL->glFramebufferRenderbufferEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); - gGL->glFramebufferRenderbufferEXT ( target, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + gGL->glFramebufferRenderbuffer ( target, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); + gGL->glFramebufferRenderbuffer ( target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); + gGL->glFramebufferRenderbuffer ( target, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); - gGL->glFramebufferTexture2DEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, 0, 0 ); - gGL->glFramebufferTexture2DEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); - gGL->glFramebufferTexture2DEXT ( target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2D ( target, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2D ( target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2D ( target, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0 ); } void glAttachRBOtoFBO ( GLenum target, eBlitFormatClass formatClass, uint rboName ) @@ -845,16 +839,16 @@ void glAttachRBOtoFBO ( GLenum target, eBlitFormatClass formatClass, uint rboNam switch( formatClass ) { case eColor: - gGL->glFramebufferRenderbufferEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rboName); + gGL->glFramebufferRenderbuffer ( target, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rboName); break; case eDepth: - gGL->glFramebufferRenderbufferEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboName); + gGL->glFramebufferRenderbuffer ( target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboName); break; case eDepthStencil: - gGL->glFramebufferRenderbufferEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboName); - gGL->glFramebufferRenderbufferEXT ( target, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboName); + gGL->glFramebufferRenderbuffer ( target, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboName); + gGL->glFramebufferRenderbuffer ( target, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboName); break; } } @@ -864,15 +858,15 @@ void glAttachTex2DtoFBO ( GLenum target, eBlitFormatClass formatClass, uint texN switch( formatClass ) { case eColor: - gGL->glFramebufferTexture2DEXT ( target, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texName, texMip ); + gGL->glFramebufferTexture2D ( target, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texName, texMip ); break; case eDepth: - gGL->glFramebufferTexture2DEXT ( target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, texName, texMip ); + gGL->glFramebufferTexture2D ( target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texName, texMip ); break; case eDepthStencil: - gGL->glFramebufferTexture2DEXT ( target, GL_DEPTH_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, texName, texMip ); + gGL->glFramebufferTexture2D ( target, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, texName, texMip ); break; } } @@ -934,7 +928,7 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM blitMask = GL_DEPTH_BUFFER_BIT; break; - case GL_DEPTH_STENCIL_EXT: + case GL_DEPTH_STENCIL: formatClass = eDepthStencil; blitMask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; break; @@ -1048,14 +1042,14 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM // a resolve that can't be done directly due to constraints on scaling or flipping. // bind scratch FBO0 to read, scrub it, attach RBO - BindFBOToCtx ( m_scratchFBO[0], GL_READ_FRAMEBUFFER_EXT ); - glScrubFBO ( GL_READ_FRAMEBUFFER_EXT ); - glAttachRBOtoFBO ( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_rboName ); + BindFBOToCtx ( m_scratchFBO[0], GL_READ_FRAMEBUFFER ); + glScrubFBO ( GL_READ_FRAMEBUFFER ); + glAttachRBOtoFBO ( GL_READ_FRAMEBUFFER, formatClass, srcTex->m_rboName ); // bind scratch FBO1 to write, scrub it, attach scratch tex - BindFBOToCtx ( m_scratchFBO[1], GL_DRAW_FRAMEBUFFER_EXT ); - glScrubFBO ( GL_DRAW_FRAMEBUFFER_EXT ); - glAttachTex2DtoFBO ( GL_DRAW_FRAMEBUFFER_EXT, formatClass, srcTex->m_texName, 0 ); + BindFBOToCtx ( m_scratchFBO[1], GL_DRAW_FRAMEBUFFER ); + glScrubFBO ( GL_DRAW_FRAMEBUFFER ); + glAttachTex2DtoFBO ( GL_DRAW_FRAMEBUFFER, formatClass, srcTex->m_texName, 0 ); // set read and draw buffers appropriately gGL->glReadBuffer ( glAttachFromClass[formatClass] ); @@ -1066,15 +1060,15 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM GLenum resolveFilter = GL_NEAREST; - gGL->glBlitFramebufferEXT( 0, 0, srcTex->m_layout->m_key.m_xSize, srcTex->m_layout->m_key.m_ySize, + gGL->glBlitFramebuffer( 0, 0, srcTex->m_layout->m_key.m_xSize, srcTex->m_layout->m_key.m_ySize, 0, 0, srcTex->m_layout->m_key.m_xSize, srcTex->m_layout->m_key.m_ySize, // same source and dest rect, whole surface blitMask, resolveFilter ); // FBO1 now holds the interesting content. // scrub FBO0, bind FBO1 to READ, fall through to next stage of blit where 1 goes onto 0 (or BACK) - glScrubFBO ( GL_READ_FRAMEBUFFER_EXT ); // zap FBO0 - BindFBOToCtx ( m_scratchFBO[1], GL_READ_FRAMEBUFFER_EXT ); + glScrubFBO ( GL_READ_FRAMEBUFFER ); // zap FBO0 + BindFBOToCtx ( m_scratchFBO[1], GL_READ_FRAMEBUFFER ); srcTex->ForceRBONonDirty(); } @@ -1084,33 +1078,33 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM if (srcTex->m_pBlitSrcFBO == NULL) { srcTex->m_pBlitSrcFBO = NewFBO(); - BindFBOToCtx( srcTex->m_pBlitSrcFBO, GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx( srcTex->m_pBlitSrcFBO, GL_READ_FRAMEBUFFER ); if (blitResolves) { - glAttachRBOtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_rboName ); + glAttachRBOtoFBO( GL_READ_FRAMEBUFFER, formatClass, srcTex->m_rboName ); } else { - glAttachTex2DtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_texName, srcMip ); + glAttachTex2DtoFBO( GL_READ_FRAMEBUFFER, formatClass, srcTex->m_texName, srcMip ); } } else { - BindFBOToCtx ( srcTex->m_pBlitSrcFBO, GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx ( srcTex->m_pBlitSrcFBO, GL_READ_FRAMEBUFFER ); // GLMCheckError(); } #else // arrange source surface on FBO1 for blit directly to dest (which could be FBO0 or BACK) - BindFBOToCtx( m_scratchFBO[1], GL_READ_FRAMEBUFFER_EXT ); - glScrubFBO( GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_scratchFBO[1], GL_READ_FRAMEBUFFER ); + glScrubFBO( GL_READ_FRAMEBUFFER ); GLMCheckError(); if (blitResolves) { - glAttachRBOtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_rboName ); + glAttachRBOtoFBO( GL_READ_FRAMEBUFFER, formatClass, srcTex->m_rboName ); } else { - glAttachTex2DtoFBO( GL_READ_FRAMEBUFFER_EXT, formatClass, srcTex->m_texName, srcMip ); + glAttachTex2DtoFBO( GL_READ_FRAMEBUFFER, formatClass, srcTex->m_texName, srcMip ); } #endif @@ -1124,7 +1118,7 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM { // backbuffer is special - FBO0 is left out (either scrubbed already, or not used) - BindFBOToCtx ( NULL, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx ( NULL, GL_DRAW_FRAMEBUFFER ); gGL->glDrawBuffer ( GL_BACK ); yflip = true; @@ -1137,31 +1131,31 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM if (dstTex->m_pBlitDstFBO == NULL) { dstTex->m_pBlitDstFBO = NewFBO(); - BindFBOToCtx( dstTex->m_pBlitDstFBO, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( dstTex->m_pBlitDstFBO, GL_DRAW_FRAMEBUFFER ); if (dstTex->m_rboName) { - glAttachRBOtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_rboName ); + glAttachRBOtoFBO( GL_DRAW_FRAMEBUFFER, formatClass, dstTex->m_rboName ); } else { - glAttachTex2DtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_texName, dstMip ); + glAttachTex2DtoFBO( GL_DRAW_FRAMEBUFFER, formatClass, dstTex->m_texName, dstMip ); } } else { - BindFBOToCtx( dstTex->m_pBlitDstFBO, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( dstTex->m_pBlitDstFBO, GL_DRAW_FRAMEBUFFER ); } #else - BindFBOToCtx( m_scratchFBO[0], GL_DRAW_FRAMEBUFFER_EXT ); GLMCheckError(); - glScrubFBO( GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_scratchFBO[0], GL_DRAW_FRAMEBUFFER ); GLMCheckError(); + glScrubFBO( GL_DRAW_FRAMEBUFFER ); if (dstTex->m_rboName) { - glAttachRBOtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_rboName ); + glAttachRBOtoFBO( GL_DRAW_FRAMEBUFFER, formatClass, dstTex->m_rboName ); } else { - glAttachTex2DtoFBO( GL_DRAW_FRAMEBUFFER_EXT, formatClass, dstTex->m_texName, dstMip ); + glAttachTex2DtoFBO( GL_DRAW_FRAMEBUFFER, formatClass, dstTex->m_texName, dstMip ); } gGL->glDrawBuffer ( glAttachFromClass[formatClass] ); GLMCheckError(); @@ -1181,31 +1175,31 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM // this is blit #1 or #2 depending on what took place above. if (yflip) { - gGL->glBlitFramebufferEXT( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, + gGL->glBlitFramebuffer( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, dstRect->xmin, dstRect->ymax, dstRect->xmax, dstRect->ymin, // note dest Y's are flipped blitMask, filter ); } else { - gGL->glBlitFramebufferEXT( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, + gGL->glBlitFramebuffer( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, dstRect->xmin, dstRect->ymin, dstRect->xmax, dstRect->ymax, blitMask, filter ); } //----------------------------------------------------------------- scrub READ and maybe DRAW FBO, and unbind -// glScrubFBO ( GL_READ_FRAMEBUFFER_EXT ); - BindFBOToCtx ( NULL, GL_READ_FRAMEBUFFER_EXT ); +// glScrubFBO ( GL_READ_FRAMEBUFFER ); + BindFBOToCtx ( NULL, GL_READ_FRAMEBUFFER ); if (!blitToBack) { -// glScrubFBO ( GL_DRAW_FRAMEBUFFER_EXT ); - BindFBOToCtx ( NULL, GL_DRAW_FRAMEBUFFER_EXT ); +// glScrubFBO ( GL_DRAW_FRAMEBUFFER ); + BindFBOToCtx ( NULL, GL_DRAW_FRAMEBUFFER ); } //----------------------------------------------------------------- restore GLM's drawing FBO // restore GLM drawing FBO - BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER ); if (doPushPop) { @@ -1329,19 +1323,19 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: attachIndex = kAttColor0; - attachIndexGL = GL_COLOR_ATTACHMENT0_EXT; + attachIndexGL = GL_COLOR_ATTACHMENT0; blitMask = GL_COLOR_BUFFER_BIT; break; case GL_DEPTH_COMPONENT: attachIndex = kAttDepth; - attachIndexGL = GL_DEPTH_ATTACHMENT_EXT; + attachIndexGL = GL_DEPTH_ATTACHMENT; blitMask = GL_DEPTH_BUFFER_BIT; break; - case GL_DEPTH_STENCIL_EXT: + case GL_DEPTH_STENCIL: attachIndex = kAttDepthStencil; - attachIndexGL = GL_DEPTH_STENCIL_ATTACHMENT_EXT; + attachIndexGL = GL_DEPTH_STENCIL_ATTACHMENT; blitMask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; break; @@ -1351,31 +1345,31 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr } // set the read fb, attach read tex at appropriate attach point, set read buffer - BindFBOToCtx( m_blitReadFBO, GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_blitReadFBO, GL_READ_FRAMEBUFFER ); GLMFBOTexAttachParams attparams; attparams.m_tex = srcTex; attparams.m_face = srcFace; attparams.m_mip = srcMip; attparams.m_zslice = 0; - m_blitReadFBO->TexAttach( &attparams, attachIndex, GL_READ_FRAMEBUFFER_EXT ); + m_blitReadFBO->TexAttach( &attparams, attachIndex, GL_READ_FRAMEBUFFER ); gGL->glReadBuffer( attachIndexGL ); // set the write fb and buffer, and attach write tex - BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER ); attparams.m_tex = dstTex; attparams.m_face = dstFace; attparams.m_mip = dstMip; attparams.m_zslice = 0; - m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER ); gGL->glDrawBuffer( attachIndexGL ); // do the blit - gGL->glBlitFramebufferEXT( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, + gGL->glBlitFramebuffer( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, dstRect->xmin, dstRect->ymin, dstRect->xmax, dstRect->ymax, blitMask, filter ); @@ -1383,13 +1377,13 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr // unset the read fb and buffer, detach read tex // unset the write fb and buffer, detach write tex - m_blitReadFBO->TexDetach( attachIndex, GL_READ_FRAMEBUFFER_EXT ); + m_blitReadFBO->TexDetach( attachIndex, GL_READ_FRAMEBUFFER ); - m_blitDrawFBO->TexDetach( attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + m_blitDrawFBO->TexDetach( attachIndex, GL_DRAW_FRAMEBUFFER ); // put the original FB back in place (both read and draw) // this bind will hit both read and draw bindings - BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER ); // set the read and write buffers back to... what ? does it matter for anything but copies ? don't worry about it @@ -1414,7 +1408,7 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: attachIndex = kAttColor0; - attachIndexGL = GL_COLOR_ATTACHMENT0_EXT; + attachIndexGL = GL_COLOR_ATTACHMENT0; break; default: @@ -1422,14 +1416,14 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr break; } - BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER ); GLMFBOTexAttachParams attparams; attparams.m_tex = dstTex; attparams.m_face = dstFace; attparams.m_mip = dstMip; attparams.m_zslice = 0; - m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER ); gGL->glDrawBuffer( attachIndexGL ); @@ -1509,10 +1503,10 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr // unset the write fb and buffer, detach write tex - m_blitDrawFBO->TexDetach( attachIndex, GL_DRAW_FRAMEBUFFER_EXT ); + m_blitDrawFBO->TexDetach( attachIndex, GL_DRAW_FRAMEBUFFER ); // put the original FB back in place (both read and draw) - BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER ); } while(pushed) @@ -1563,19 +1557,19 @@ void GLMContext::ResolveTex( CGLMTex *tex, bool forceDirty ) // case GL_LUMINANCE: // case GL_LUMINANCE_ALPHA: attachIndex = kAttColor0; - attachIndexGL = GL_COLOR_ATTACHMENT0_EXT; + attachIndexGL = GL_COLOR_ATTACHMENT0; blitMask = GL_COLOR_BUFFER_BIT; break; // case GL_DEPTH_COMPONENT: // attachIndex = kAttDepth; - // attachIndexGL = GL_DEPTH_ATTACHMENT_EXT; + // attachIndexGL = GL_DEPTH_ATTACHMENT; // blitMask = GL_DEPTH_BUFFER_BIT; // break; - case GL_DEPTH_STENCIL_EXT: + case GL_DEPTH_STENCIL: attachIndex = kAttDepthStencil; - attachIndexGL = GL_DEPTH_STENCIL_ATTACHMENT_EXT; + attachIndexGL = GL_DEPTH_STENCIL_ATTACHMENT; blitMask = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; break; @@ -1586,35 +1580,35 @@ void GLMContext::ResolveTex( CGLMTex *tex, bool forceDirty ) // set the read fb, attach read RBO at appropriate attach point, set read buffer - BindFBOToCtx( m_blitReadFBO, GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_blitReadFBO, GL_READ_FRAMEBUFFER ); // going to avoid the TexAttach / TexDetach calls due to potential confusion, implement it directly here //----------------------------------------------------------------------------------- // put tex->m_rboName on the read FB's attachment - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { // you have to attach it both places... // http://www.opengl.org/wiki/GL_EXT_framebuffer_object - // bind the RBO to the GL_RENDERBUFFER_EXT target - is this extraneous ? - //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); + // bind the RBO to the GL_RENDERBUFFER target - is this extraneous ? + //glBindRenderbufferEXT( GL_RENDERBUFFER, tex->m_rboName ); - // attach the GL_RENDERBUFFER_EXT target to the depth and stencil attach points - gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); + // attach the GL_RENDERBUFFER target to the depth and stencil attach points + gGL->glFramebufferRenderbuffer( GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, tex->m_rboName); - gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, tex->m_rboName); + gGL->glFramebufferRenderbuffer( GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, tex->m_rboName); // no need to leave the RBO hanging on - //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + //glBindRenderbufferEXT( GL_RENDERBUFFER, 0 ); } else { - //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, tex->m_rboName ); + //glBindRenderbufferEXT( GL_RENDERBUFFER, tex->m_rboName ); - gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, attachIndexGL, GL_RENDERBUFFER_EXT, tex->m_rboName); + gGL->glFramebufferRenderbuffer( GL_READ_FRAMEBUFFER, attachIndexGL, GL_RENDERBUFFER, tex->m_rboName); - //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + //glBindRenderbufferEXT( GL_RENDERBUFFER, 0 ); } gGL->glReadBuffer( attachIndexGL ); @@ -1623,19 +1617,19 @@ void GLMContext::ResolveTex( CGLMTex *tex, bool forceDirty ) // put tex->m_texName on the draw FBO attachment // set the write fb and buffer, and attach write tex - BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER ); // regular path - attaching a texture2d - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { - gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, tex->m_texName, 0 ); + gGL->glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, tex->m_texName, 0 ); - gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, tex->m_texName, 0 ); + gGL->glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, tex->m_texName, 0 ); } else { - gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, attachIndexGL, GL_TEXTURE_2D, tex->m_texName, 0 ); + gGL->glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, attachIndexGL, GL_TEXTURE_2D, tex->m_texName, 0 ); } gGL->glDrawBuffer( attachIndexGL ); @@ -1643,7 +1637,7 @@ void GLMContext::ResolveTex( CGLMTex *tex, bool forceDirty ) //----------------------------------------------------------------------------------- // blit - gGL->glBlitFramebufferEXT( 0, 0, tex->m_layout->m_key.m_xSize, tex->m_layout->m_key.m_ySize, + gGL->glBlitFramebuffer( 0, 0, tex->m_layout->m_key.m_xSize, tex->m_layout->m_key.m_ySize, 0, 0, tex->m_layout->m_key.m_xSize, tex->m_layout->m_key.m_ySize, blitMask, GL_NEAREST ); // or should it be GL_LINEAR? does it matter ? @@ -1654,38 +1648,37 @@ void GLMContext::ResolveTex( CGLMTex *tex, bool forceDirty ) // unset the read fb and buffer, detach read RBO - //glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + //glBindRenderbufferEXT( GL_RENDERBUFFER, 0 ); - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { - // detach the GL_RENDERBUFFER_EXT target from the depth and stencil attach points - gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); - - gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + // detach the GL_RENDERBUFFER target from the depth and stencil attach points + gGL->glFramebufferRenderbuffer( GL_READ_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); + gGL->glFramebufferRenderbuffer( GL_READ_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); } else { - gGL->glFramebufferRenderbufferEXT( GL_READ_FRAMEBUFFER_EXT, attachIndexGL, GL_RENDERBUFFER_EXT, 0); + gGL->glFramebufferRenderbuffer( GL_READ_FRAMEBUFFER, attachIndexGL, GL_RENDERBUFFER, 0); } //----------------------------------------------------------------------------------- // unset the write fb and buffer, detach write tex - if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT_EXT) + if (attachIndexGL==GL_DEPTH_STENCIL_ATTACHMENT) { - gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0 ); - gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0 ); } else { - gGL->glFramebufferTexture2DEXT( GL_DRAW_FRAMEBUFFER_EXT, attachIndexGL, GL_TEXTURE_2D, 0, 0 ); + gGL->glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, attachIndexGL, GL_TEXTURE_2D, 0, 0 ); } // put the original FB back in place (both read and draw) // this bind will hit both read and draw bindings - BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER ); // set the read and write buffers back to... what ? does it matter for anything but copies ? don't worry about it @@ -1740,9 +1733,7 @@ void GLMContext::PreloadTex( CGLMTex *tex, bool force ) if ( !preloadPair->m_valid ) { if ( !preloadPair->ValidateProgramPair() ) - { return; - } } gGL->glUseProgram( (GLuint)preloadPair->m_program ); @@ -1795,7 +1786,7 @@ void GLMContext::PreloadTex( CGLMTex *tex, bool force ) gGL->glVertexAttribPointer( 0, 3, GL_FLOAT, 0, 0, posns ); - gGL->glDrawRangeElements( GL_TRIANGLES, 0, 3, 3, GL_UNSIGNED_INT, indices); + gGL->glDrawRangeElements( GL_TRIANGLES, 0, 2, 3, GL_UNSIGNED_INT, indices); gGL->glDisableVertexAttribArray( 0 ); @@ -1830,13 +1821,13 @@ void GLMContext::DelFBO( CGLMFBO *fbo ) if (m_boundReadFBO == fbo ) { - BindFBOToCtx( NULL, GL_READ_FRAMEBUFFER_EXT ); + BindFBOToCtx( NULL, GL_READ_FRAMEBUFFER ); m_boundReadFBO = NULL; } if (m_boundDrawFBO == fbo ) { - BindFBOToCtx( NULL, GL_DRAW_FRAMEBUFFER_EXT ); + BindFBOToCtx( NULL, GL_DRAW_FRAMEBUFFER ); m_boundDrawFBO = NULL; } @@ -2272,47 +2263,17 @@ void GLMContext::Present( CGLMTex *tex ) ProcessTextureDeletes(); -#ifdef HAVE_GL_ARB_SYNC - - if ( gGL->m_bHave_GL_AMD_pinned_memory ) - { - m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].InsertFence(); - - m_nCurPinnedMemoryBuffer = ( m_nCurPinnedMemoryBuffer + 1 ) % cNumPinnedMemoryBuffers; - - m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].BlockUntilNotBusy(); - - gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].GetHandle() ); - } - - if ( gGL->m_bHave_GL_ARB_buffer_storage ) - { - for (uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType) - { - m_persistentBuffer[m_nCurPersistentBuffer][lpType].InsertFence(); - } - - m_nCurPersistentBuffer = ( m_nCurPersistentBuffer + 1 ) % cNumPersistentBuffers; - - for (uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType) - { - m_persistentBuffer[m_nCurPersistentBuffer][lpType].BlockUntilNotBusy(); - } - } - -#endif // HAVE_GL_ARB_SYNC - bool newRefreshMode = false; // two ways to go: - + // old school, do the resolve, had the tex down to cocoamgr to actually blit. // that way is required if you are not in one-context mode (10.5.8) - + if ( (gl_blitmode.GetInt() != 0) ) { newRefreshMode = true; } - + // this is the path whether full screen or windowed... we always blit. CShowPixelsParams showparams; memset( &showparams, 0, sizeof(showparams) ); @@ -2378,13 +2339,13 @@ void GLMContext::Present( CGLMTex *tex ) // we set showparams.m_noBlit, and just let CocoaMgr handle the swap (flushbuffer / page flip) showparams.m_noBlit = true; - BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + BindFBOToCtx( NULL, GL_FRAMEBUFFER ); } else { ResolveTex( tex, true ); // dxabstract used to do this unconditionally.we still do if new refresh mode doesn't engage. - BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + BindFBOToCtx( NULL, GL_FRAMEBUFFER ); // showparams.m_noBlit is left set to 0. CocoaMgr does the blit. } @@ -2394,7 +2355,7 @@ void GLMContext::Present( CGLMTex *tex ) // put the original FB back in place (both read and draw) // this bind will hit both read and draw bindings - BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER_EXT ); + BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER ); // put em back !! m_ScissorEnable.Flush(); @@ -2490,19 +2451,6 @@ GLMContext::GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) ClearCurAttribs(); -#ifndef OSX - m_nCurPinnedMemoryBuffer = 0; - if ( gGL->m_bHave_GL_AMD_pinned_memory ) - { - for ( uint t = 0; t < cNumPinnedMemoryBuffers; t++ ) - { - m_PinnedMemoryBuffers[t].Init( GLMGR_PINNED_MEMORY_BUFFER_SIZE ); - } - - gGL->glBindBufferARB( GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, m_PinnedMemoryBuffers[m_nCurPinnedMemoryBuffer].GetHandle() ); - } -#endif // OSX - m_nCurPersistentBuffer = 0; if ( gGL->m_bHave_GL_ARB_buffer_storage ) { @@ -2569,9 +2517,9 @@ GLMContext::GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) IncrementWindowRefCount(); // If we're using GL_ARB_debug_output, go ahead and setup the callback here. - if ( gGL->m_bHave_GL_ARB_debug_output && CommandLine()->FindParm( "-gl_debug" ) ) + if ( CommandLine()->FindParm( "-gl_debug" ) ) { -#if GLMDEBUG +//#if GLMDEBUG // Turning this on is a perf loss, but it ensures that you can (at least) swap to the other // threads to see what call is currently being made. // Note that if the driver is in multithreaded mode, you can put it back into singlethreaded mode @@ -2585,16 +2533,16 @@ GLMContext::GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) printf( "GLMContext::GLMContext: GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB enabled!\n" ); #endif -#endif + // TODO(nillerusr): rewrite me!!! // This should be there if we get in here--make sure. - Assert(gGL->glDebugMessageControlARB); - gGL->glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, (const GLuint *)NULL, GL_TRUE); + gGL->glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, (const GLuint *)NULL, GL_TRUE); // Gonna filter these out, they're "chatty". - gGL->glDebugMessageControlARB(GL_DEBUG_SOURCE_API_ARB, GL_DEBUG_TYPE_OTHER_ARB, GL_DEBUG_SEVERITY_LOW_ARB, 0, (const GLuint *)NULL, GL_FALSE); - gGL->glDebugMessageCallbackARB(GL_Debug_Output_Callback, (void*)NULL); + gGL->glDebugMessageControl(GL_DEBUG_SOURCE_API_ARB, GL_DEBUG_TYPE_OTHER_ARB, GL_DEBUG_SEVERITY_LOW_ARB, 0, (const GLuint *)NULL, GL_FALSE); + gGL->glDebugMessageCallback(GL_Debug_Output_Callback, (void*)NULL); GLMDebugPrintf( "GLMContext::GLMContext: Debug output (gl_arb_debug_output) enabled!\n" ); +//#endif } @@ -2741,10 +2689,10 @@ GLMContext::GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) // Create a PBO that we can use to fill textures with bogus data asyncronously. m_nBoundGLBuffer[ kGLMPixelBuffer ] = 0; - gGL->glGenBuffersARB( 1, &m_destroyPBO ); - gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_destroyPBO ); - gGL->glBufferDataARB( GL_PIXEL_UNPACK_BUFFER_ARB, sizeof( g_garbageTextureBits ), g_garbageTextureBits, GL_STATIC_DRAW ); - gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_nBoundGLBuffer[ kGLMPixelBuffer ] ); + gGL->glGenBuffers( 1, &m_destroyPBO ); + gGL->glBindBuffer( GL_PIXEL_UNPACK_BUFFER, m_destroyPBO ); + gGL->glBufferData( GL_PIXEL_UNPACK_BUFFER, sizeof( g_garbageTextureBits ), g_garbageTextureBits, GL_STATIC_DRAW ); + gGL->glBindBuffer( GL_PIXEL_UNPACK_BUFFER, m_nBoundGLBuffer[ kGLMPixelBuffer ] ); // Create a bunch of texture names for us to use forever and ever ramen. FillTexCache( false, kGLMInitialTexCount ); @@ -2842,40 +2790,6 @@ void GLMContext::Reset() GLMContext::~GLMContext () { -#ifndef OSX - GLMGPUTimestampManagerDeinit(); - - for ( uint t = 0; t < cNumPinnedMemoryBuffers; t++ ) - { - m_PinnedMemoryBuffers[t].Deinit(); - } - - if (gGL->m_bHave_GL_ARB_buffer_storage) - { - for (uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType) - { - for (uint lpNum = 0; lpNum < cNumPersistentBuffers; ++lpNum) - { - m_persistentBuffer[lpNum][lpType].Deinit(); - } - } - } - - if ( m_bUseSamplerObjects ) - { - for( int i=0; i< GLM_SAMPLER_COUNT; i++) - { - gGL->glBindSampler( i, 0 ); - } - - for( int i=0; i< cSamplerObjectHashSize; i++) - { - gGL->glDeleteSamplers( 1, &m_samplerObjectHash[i].m_samplerObject ); - m_samplerObjectHash[i].m_samplerObject = 0; - } - } -#endif // !OSX - if (m_debugFontTex) { DelTex( m_debugFontTex ); @@ -2908,7 +2822,7 @@ GLMContext::~GLMContext () // m_texLayoutTable can be scrubbed once we know that all the tex are freed - gGL->glDeleteBuffersARB( 1, &m_destroyPBO ); + gGL->glDeleteBuffers( 1, &m_destroyPBO ); PurgeTexCache(); @@ -2958,29 +2872,29 @@ void GLMContext::BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint ) CheckCurrent(); - if ( bindPoint == GL_FRAMEBUFFER_EXT ) + if ( bindPoint == GL_FRAMEBUFFER ) { - gGL->glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fbo ? fbo->m_name : 0 ); + gGL->glBindFramebuffer( GL_FRAMEBUFFER, fbo ? fbo->m_name : 0 ); m_boundReadFBO = fbo; m_boundDrawFBO = fbo; return; } - bool targetRead = (bindPoint==GL_READ_FRAMEBUFFER_EXT); - bool targetDraw = (bindPoint==GL_DRAW_FRAMEBUFFER_EXT); + bool targetRead = (bindPoint==GL_READ_FRAMEBUFFER); + bool targetDraw = (bindPoint==GL_DRAW_FRAMEBUFFER); if (targetRead) { if (fbo) // you can pass NULL to go back to no-FBO { - gGL->glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, fbo->m_name ); + gGL->glBindFramebuffer( GL_READ_FRAMEBUFFER, fbo->m_name ); m_boundReadFBO = fbo; //dontcare fbo->m_bound = true; } else { - gGL->glBindFramebufferEXT( GL_READ_FRAMEBUFFER_EXT, 0 ); + gGL->glBindFramebuffer( GL_READ_FRAMEBUFFER, 0 ); m_boundReadFBO = NULL; } @@ -2990,14 +2904,14 @@ void GLMContext::BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint ) { if (fbo) // you can pass NULL to go back to no-FBO { - gGL->glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, fbo->m_name ); + gGL->glBindFramebuffer( GL_DRAW_FRAMEBUFFER, fbo->m_name ); m_boundDrawFBO = fbo; //dontcare fbo->m_bound = true; } else { - gGL->glBindFramebufferEXT( GL_DRAW_FRAMEBUFFER_EXT, 0 ); + gGL->glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); m_boundDrawFBO = NULL; } @@ -3023,17 +2937,17 @@ void GLMContext::BindBufferToCtx( EGLMBufferType type, CGLMBuffer *pBuff, bool b GLenum target = 0; switch( type ) { - case kGLMVertexBuffer: target = GL_ARRAY_BUFFER_ARB; break; - case kGLMIndexBuffer: target = GL_ELEMENT_ARRAY_BUFFER_ARB; break; - case kGLMUniformBuffer: target = GL_UNIFORM_BUFFER_EXT; break; - case kGLMPixelBuffer: target = GL_PIXEL_UNPACK_BUFFER_ARB; break; + case kGLMVertexBuffer: target = GL_ARRAY_BUFFER; break; + case kGLMIndexBuffer: target = GL_ELEMENT_ARRAY_BUFFER; break; + case kGLMUniformBuffer: target = GL_UNIFORM_BUFFER; break; + case kGLMPixelBuffer: target = GL_PIXEL_UNPACK_BUFFER; break; default: Assert(!"Unknown buffer type" ); } Assert( !pBuff || ( pBuff->m_buffGLTarget == target ) ); m_nBoundGLBuffer[type] = nGLName; - gGL->glBindBufferARB( target, nGLName ); + gGL->glBindBuffer( target, nGLName ); } @@ -3079,7 +2993,7 @@ void GLMContext::CleanupTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ) const GLuint oldPBO = m_nBoundGLBuffer[ kGLMPixelBuffer ]; const GLuint oldTex = ( m_samplers[ m_activeTexture ].m_pBoundTex != NULL ) ? m_samplers[ m_activeTexture ].m_pBoundTex->GetTexName() : 0; - gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, m_destroyPBO ); + gGL->glBindBuffer( GL_PIXEL_UNPACK_BUFFER, m_destroyPBO ); gGL->glBindTexture( texBind, tex ); // Clear out old data. @@ -3101,7 +3015,7 @@ void GLMContext::CleanupTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ) } gGL->glBindTexture( texBind, oldTex ); - gGL->glBindBufferARB( GL_PIXEL_UNPACK_BUFFER_ARB, oldPBO ); + gGL->glBindBuffer( GL_PIXEL_UNPACK_BUFFER, oldPBO ); } void GLMContext::DestroyTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ) @@ -5366,7 +5280,7 @@ void GLMTester::StdSetup( void ) InternalError( !ready, "drawing FBO no go"); // bind it - ctx->BindFBOToCtx( m_drawFBO, GL_FRAMEBUFFER_EXT ); + ctx->BindFBOToCtx( m_drawFBO, GL_FRAMEBUFFER ); gGL->glViewport(0, 0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); CheckGLError("stdsetup viewport"); @@ -5386,7 +5300,7 @@ void GLMTester::StdCleanup( void ) GLMContext *ctx = m_params.m_ctx; // unbind - ctx->BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + ctx->BindFBOToCtx( NULL, GL_FRAMEBUFFER ); // del FBO if (m_drawFBO) @@ -5456,10 +5370,10 @@ return; const char *decodedStr = GLMDecode( eGL_ERROR, errorcode ); const char *decodedStr2 = ""; - if ( errorcode == GL_INVALID_FRAMEBUFFER_OPERATION_EXT ) + if ( errorcode == GL_INVALID_FRAMEBUFFER_OPERATION ) { // dig up the more detailed FBO status - errorcode2 = gGL->glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT ); + errorcode2 = gGL->glCheckFramebufferStatus( GL_FRAMEBUFFER ); decodedStr2 = GLMDecode( eGL_ERROR, errorcode2 ); @@ -5904,7 +5818,7 @@ void GLMTester::Test1( void ) printf("\n -> %s\n", ready ? "pass" : "fail" ); // unbind - ctx->BindFBOToCtx( NULL, GL_FRAMEBUFFER_EXT ); + ctx->BindFBOToCtx( NULL, GL_FRAMEBUFFER ); // del FBO ctx->DelFBO(fbo); diff --git a/togles/linuxwin/glmgrbasics.cpp b/togles/linuxwin/glmgrbasics.cpp index adf60714..ce1584ec 100644 --- a/togles/linuxwin/glmgrbasics.cpp +++ b/togles/linuxwin/glmgrbasics.cpp @@ -26,7 +26,7 @@ // //=============================================================================== -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" #include "tier0/icommandline.h" #include "tier1/utlhash.h" diff --git a/togles/linuxwin/glmgrcocoa.mm b/togles/linuxwin/glmgrcocoa.mm index 717c913d..9bd997d8 100644 --- a/togles/linuxwin/glmgrcocoa.mm +++ b/togles/linuxwin/glmgrcocoa.mm @@ -19,7 +19,7 @@ #include "tier1/interface.h" #include "tier1/strtools.h" #include "tier1/utllinkedlist.h" -#include "togl/rendermechanism.h" +#include "togles/rendermechanism.h" diff --git a/wscript b/wscript index ea019053..05681f75 100644 --- a/wscript +++ b/wscript @@ -65,7 +65,6 @@ projects={ 'tier1', 'tier2', 'tier3', - 'togl', 'vgui2/matsys_controls', 'vgui2/src', 'vgui2/vgui_controls', @@ -136,6 +135,8 @@ def get_taskgen_count(self): def define_platform(conf): conf.env.DEDICATED = conf.options.DEDICATED + conf.env.TOGLES = conf.options.TOGLES + conf.env.GL = conf.options.GL if conf.options.DEDICATED: conf.options.SDL = False @@ -149,6 +150,10 @@ def define_platform(conf): 'BINK_VIDEO' ]) + if conf.options.TOGLES: + conf.env.append_unique('DEFINES', ['TOGLES']) + + if conf.options.SDL: conf.define('USE_SDL', 1) @@ -205,6 +210,9 @@ def options(opt): grp.add_option('--use-ccache', action = 'store_true', dest = 'CCACHE', default = False, help = 'build using ccache [default: %default]') + grp.add_option('--togles', action = 'store_true', dest = 'TOGLES', default = False, + help = 'build engine with ToGLES [default: %default]') + opt.load('compiler_optimizations subproject') # opt.add_subproject(projects['game']) @@ -228,6 +236,12 @@ def configure(conf): define_platform(conf) + if conf.env.TOGLES: + projects['game'] += ['togles'] + elif conf.env.GL: + projects['game'] += ['togl'] + + if conf.env.DEST_OS in ['win32', 'linux', 'darwin'] and conf.env.DEST_CPU == 'x86_64': conf.env.BIT32_MANDATORY = not conf.options.ALLOW64 if conf.env.BIT32_MANDATORY: @@ -396,4 +410,9 @@ def build(bld): if bld.env.DEDICATED: bld.add_subproject(projects['dedicated']) else: + if bld.env.TOGLES: + projects['game'] += ['togles'] + elif bld.env.GL: + projects['game'] += ['togl'] + bld.add_subproject(projects['game']) From e8dd3cece3032f2972e2207e23b8947c65f0f704 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 21 Nov 2021 18:51:30 +0300 Subject: [PATCH 03/18] Replace glBegin/glEnd --- appframework/glmdisplaydb_linuxwin.inl | 12 ++++++++--- engine/sys_mainwind.cpp | 4 ++++ public/appframework/ilaunchermgr.h | 1 + public/togl/rendermechanism.h | 7 ++++++ public/togles/linuxwin/glfuncs.h | 8 ------- togles/linuxwin/cglmtex.cpp | 12 ----------- togles/linuxwin/glentrypoints.cpp | 13 +---------- togles/linuxwin/glmgr.cpp | 30 +++++++++++++------------- 8 files changed, 37 insertions(+), 50 deletions(-) diff --git a/appframework/glmdisplaydb_linuxwin.inl b/appframework/glmdisplaydb_linuxwin.inl index 3e1d76a8..ae52a34c 100644 --- a/appframework/glmdisplaydb_linuxwin.inl +++ b/appframework/glmdisplaydb_linuxwin.inl @@ -45,7 +45,7 @@ void GLMRendererInfo::Init( GLMRendererInfoFields *info ) // If you haven't created a GL context by now (and initialized gGL), you're about to crash. - m_info.m_hasMixedAttachmentSizes = gGL->m_bHave_GL_ARB_framebuffer_object; + m_info.m_hasMixedAttachmentSizes = gGL->m_bHave_GL_EXT_framebuffer_object; m_info.m_hasBGRA = gGL->m_bHave_GL_EXT_vertex_array_bgra; // !!! FIXME: what do these do on the Mac? @@ -64,8 +64,15 @@ void GLMRendererInfo::Init( GLMRendererInfoFields *info ) m_info.m_hasNativeClipVertexMode = true; } +#ifdef TOGLES + m_info.m_hasOcclusionQuery = true; + m_info.m_hasFramebufferBlit = true; + m_info.m_hasUniformBuffers = true; +#else m_info.m_hasOcclusionQuery = gGL->m_bHave_GL_ARB_occlusion_query; m_info.m_hasFramebufferBlit = gGL->m_bHave_GL_EXT_framebuffer_blit || gGL->m_bHave_GL_ARB_framebuffer_object; + m_info.m_hasUniformBuffers = gGL->m_bHave_GL_ARB_uniform_buffer; +#endif GLint nMaxAniso = 0; gGL->glGetIntegerv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &nMaxAniso ); @@ -88,8 +95,7 @@ void GLMRendererInfo::Init( GLMRendererInfoFields *info ) m_info.m_hasBindableUniforms = false; } } - - m_info.m_hasUniformBuffers = gGL->m_bHave_GL_ARB_uniform_buffer; + m_info.m_hasPerfPackage1 = true; // this flag is Mac-specific. We do slower things if you don't have Mac OS X 10.x.y or later. Linux always does the fast path! //------------------------------------------------------------------- diff --git a/engine/sys_mainwind.cpp b/engine/sys_mainwind.cpp index 1c6ab777..ce46f8c8 100644 --- a/engine/sys_mainwind.cpp +++ b/engine/sys_mainwind.cpp @@ -915,7 +915,11 @@ bool CGame::CreateGameWindow( void ) if ( IsOpenGL() ) { +#ifdef TOGLES + V_strcat( windowName, " - OpenGLES", sizeof( windowName ) ); +#else V_strcat( windowName, " - OpenGL", sizeof( windowName ) ); +#endif } #if PIX_ENABLE || defined( PIX_INSTRUMENTATION ) diff --git a/public/appframework/ilaunchermgr.h b/public/appframework/ilaunchermgr.h index 4b433ad8..bafa67cb 100644 --- a/public/appframework/ilaunchermgr.h +++ b/public/appframework/ilaunchermgr.h @@ -16,6 +16,7 @@ #include "appframework/IAppSystem.h" #if defined( DX_TO_GL_ABSTRACTION ) + #include "togl/linuxwin/glmgrbasics.h" #include "togl/linuxwin/glmdisplay.h" diff --git a/public/togl/rendermechanism.h b/public/togl/rendermechanism.h index 47be332d..374ccaa9 100644 --- a/public/togl/rendermechanism.h +++ b/public/togl/rendermechanism.h @@ -22,6 +22,11 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // + +#ifdef TOGLES +#include "togles/rendermechanism.h" +#else + #ifndef RENDERMECHANISM_H #define RENDERMECHANISM_H @@ -71,3 +76,5 @@ #endif // defined(DX_TO_GL_ABSTRACTION) #endif // RENDERMECHANISM_H + +#endif diff --git a/public/togles/linuxwin/glfuncs.h b/public/togles/linuxwin/glfuncs.h index 5606f105..e55c8f19 100644 --- a/public/togles/linuxwin/glfuncs.h +++ b/public/togles/linuxwin/glfuncs.h @@ -28,7 +28,6 @@ GL_FUNC(OpenGL,true,GLenum,glGetError,(void),()) GL_FUNC_VOID(OpenGL,true,glActiveTexture,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glAlphaFunc,(GLenum a,GLclampf b),(a,b)) GL_FUNC_VOID(OpenGL,true,glAttachShader,(GLuint a, GLuint b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glBegin,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glBindAttribLocation,(GLuint a,GLuint b,const GLchar *c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glBindBuffer,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBindProgram,(GLenum a,GLuint b),(a,b)) @@ -73,7 +72,6 @@ GL_FUNC_VOID(OpenGL,true,glDrawRangeElementsBaseVertex,(GLenum a,GLuint b,GLuint #endif GL_FUNC_VOID(OpenGL,true,glEnable,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a)) -GL_FUNC_VOID(OpenGL,true,glEnd,(void),()) GL_FUNC_VOID(OpenGL,true,glFinish,(void),()) GL_FUNC_VOID(OpenGL,true,glFlush,(void),()) GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a)) @@ -94,13 +92,11 @@ GL_FUNC(OpenGL,true,GLint,glGetUniformLocation,(GLuint a,const GLchar *b),(a,b)) GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a)) GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glLinkProgram,(GLuint a),(a)) -//GL_FUNC(OpenGL,true,GLvoid*,glMapBufferARB,(GLenum a,GLenum b),(a,b)) GL_FUNC_VOID(OpenGL,true,glOrtho,(GLdouble a,GLdouble b,GLdouble c,GLdouble d,GLdouble e,GLdouble f),(a,b,c,d,e,f)) GL_FUNC_VOID(OpenGL,true,glPixelStorei,(GLenum a,GLint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum b),(a,b)) GL_FUNC_VOID(OpenGL,true,glPolygonOffset,(GLfloat a,GLfloat b),(a,b)) GL_FUNC_VOID(OpenGL,true,glPopAttrib,(void),()) -//GL_FUNC_VOID(OpenGL,true,glProgramStringARB,(GLenum a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glPushAttrib,(GLbitfield a),(a)) GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glScissor,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d)) @@ -116,7 +112,6 @@ GL_FUNC_VOID(OpenGL,true,glTexParameteri,(GLenum a,GLenum b,GLint c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glTexSubImage2D,(GLenum a,GLint b,GLint c,GLint d,GLsizei e,GLsizei f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) GL_FUNC_VOID(OpenGL,true,glUniform1f,(GLint a,GLfloat b),(a,b)) GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glUniform1iARB,(GLint a,GLint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glUniform4fv,(GLint a,GLsizei b,const GLfloat *c),(a,b,c)) GL_FUNC(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint a),(a)) @@ -187,9 +182,6 @@ GL_FUNC_VOID(OpenGL,false,glFlushMappedBufferRange,(GLenum a,GLintptr b,GLsizeip GL_EXT(GL_ARB_vertex_buffer_object,-1,-1) GL_FUNC_VOID(OpenGL,true,glBufferSubData,(GLenum a,GLintptr b,GLsizeiptr c,const GLvoid *d),(a,b,c,d)) GL_EXT(GL_ARB_occlusion_query,-1,-1) -GL_FUNC_VOID(GL_ARB_occlusion_query,false,glBeginQueryARB,(GLenum a,GLuint b),(a,b)) -GL_FUNC_VOID(GL_ARB_occlusion_query,false,glEndQueryARB,(GLenum a),(a)) -GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectivARB,(GLuint a,GLenum b,GLint *c),(a,b,c)) GL_FUNC_VOID(OpenGL,false,glGetQueryObjectuiv,(GLuint a,GLenum b,GLuint *c),(a,b,c)) GL_EXT(GL_APPLE_texture_range,-1,-1) GL_FUNC_VOID(GL_APPLE_texture_range,false,glTextureRangeAPPLE,(GLenum a,GLsizei b,void *c),(a,b,c)) diff --git a/togles/linuxwin/cglmtex.cpp b/togles/linuxwin/cglmtex.cpp index 3dc3ef04..0ce6a030 100644 --- a/togles/linuxwin/cglmtex.cpp +++ b/togles/linuxwin/cglmtex.cpp @@ -891,9 +891,6 @@ CGLMTex::CGLMTex( GLMContext *ctx, GLMTexLayout *layout, uint levels, const char { printf("\n minimizing storage for tex '%s' [%s] ", m_debugLabel?m_debugLabel:"-", m_layout->m_layoutSummary ); } - - if (gGL->m_bHave_GL_APPLE_texture_range) - gGL->glTexParameteri( m_layout->m_key.m_texGLTarget, GL_TEXTURE_MINIMIZE_STORAGE_APPLE, 1 ); } // after a lot of pain with texture completeness... @@ -1359,10 +1356,6 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa // set up the client storage now, one way or another // If this extension isn't supported, we just end up with two copies of the texture, one in the GL and one in app memory. // So it's safe to just go on as if this extension existed and hold the possibly-unnecessary extra RAM. - if (gGL->m_bHave_GL_APPLE_client_storage) - { - gGL->glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, m_texClientStorage ); - } switch( target ) { @@ -1509,11 +1502,6 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa break; } - if (gGL->m_bHave_GL_APPLE_client_storage) - { - gGL->glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE ); - } - if ( expandTemp ) { free( expandTemp ); diff --git a/togles/linuxwin/glentrypoints.cpp b/togles/linuxwin/glentrypoints.cpp index 64fe576e..fc9fcfe2 100644 --- a/togles/linuxwin/glentrypoints.cpp +++ b/togles/linuxwin/glentrypoints.cpp @@ -379,18 +379,6 @@ COpenGLEntryPoints::COpenGLEntryPoints() // !!! FIXME: hint Apple's drivers and not because we rely on the // !!! FIXME: functionality. If so, just remove this check (and the // !!! FIXME: GL_NV_fence code entirely). -#ifndef ANDROID // HACK - if ((m_bHave_OpenGL) && ((!m_bHave_GL_NV_fence) && (!m_bHave_GL_ARB_sync) && (!m_bHave_GL_APPLE_fence))) - { - // Error( "Required OpenGL extension \"GL_NV_fence\", \"GL_ARB_sync\", or \"GL_APPLE_fence\" is not supported. Please upgrade your OpenGL driver." ); - } -#endif - - // same extension, different name. - if (m_bHave_GL_EXT_vertex_array_bgra || m_bHave_GL_ARB_vertex_array_bgra) - { - m_bHave_GL_EXT_vertex_array_bgra = m_bHave_GL_ARB_vertex_array_bgra = true; - } // GL_ARB_framebuffer_object is a superset of GL_EXT_framebuffer_object, // (etc) but if you don't call in through the ARB entry points, you won't @@ -400,6 +388,7 @@ COpenGLEntryPoints::COpenGLEntryPoints() m_bHave_GL_EXT_framebuffer_object = true; m_bHave_GL_EXT_framebuffer_blit = true; m_bHave_GL_EXT_framebuffer_multisample = true; + m_bHave_GL_ARB_occlusion_query = true; glBindFramebuffer.Force(glBindFramebuffer.Pointer()); glBindRenderbuffer.Force(glBindRenderbuffer.Pointer()); diff --git a/togles/linuxwin/glmgr.cpp b/togles/linuxwin/glmgr.cpp index f2aee138..ec888347 100644 --- a/togles/linuxwin/glmgr.cpp +++ b/togles/linuxwin/glmgr.cpp @@ -1456,22 +1456,22 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr // immediate mode is fine - float topv = 1.0; - float botv = 0.0; - - gGL->glBegin(GL_QUADS); - gGL->glTexCoord2f ( 0.0, botv ); - gGL->glVertex3f ( -1.0, -1.0, 0.0 ); - - gGL->glTexCoord2f ( 1.0, botv ); - gGL->glVertex3f ( 1.0, -1.0, 0.0 ); - - gGL->glTexCoord2f ( 1.0, topv ); - gGL->glVertex3f ( 1.0, 1.0, 0.0 ); + const float topv = 1.0; + const float botv = 0.0; - gGL->glTexCoord2f ( 0.0, topv ); - gGL->glVertex3f ( -1.0, 1.0, 0.0 ); - gGL->glEnd(); + const float verts[] = {-1.f, -1.f, 1.f, -1.f, 1.f, 1.f, -1.f, 1.f}; + const float verts_tex[] = {0.f, botv, 1.f, botv, 1.f, topv, 0.f, topv}; + + gGL->glEnableClientState(GL_VERTEX_ARRAY); + gGL->glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + gGL->glVertexPointer(2, GL_FLOAT, 0, verts); + gGL->glTexCoordPointer(2, GL_FLOAT, 0, verts_tex); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + gGL->glDisableClientState(GL_VERTEX_ARRAY); + gGL->glDisableClientState(GL_TEXTURE_COORD_ARRAY); gGL->glBindTexture( GL_TEXTURE_2D, 0 ); From 1aa234af4d22015cdfc576c831393586ad8be513 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 21 Nov 2021 19:47:42 +0300 Subject: [PATCH 04/18] togles: use GL_EXT_buffer_storage if avalible --- public/togles/linuxwin/glfuncs.h | 4 ++-- togles/linuxwin/cglmbuffer.cpp | 10 +++++----- togles/linuxwin/glentrypoints.cpp | 4 ++-- togles/linuxwin/glmgr.cpp | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/togles/linuxwin/glfuncs.h b/public/togles/linuxwin/glfuncs.h index e55c8f19..72a5bb0f 100644 --- a/public/togles/linuxwin/glfuncs.h +++ b/public/togles/linuxwin/glfuncs.h @@ -273,8 +273,8 @@ GL_EXT(GL_EXT_texture_compression_dxt1,-1,-1) GL_EXT(GL_ANGLE_texture_compression_dxt3,-1,-1) GL_EXT(GL_ANGLE_texture_compression_dxt5,-1,-1) -GL_EXT( GL_ARB_buffer_storage, 4, 4 ) -GL_FUNC_VOID( GL_ARB_buffer_storage, false, glBufferStorage, (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags), (target, size, data, flags) ) +GL_EXT( GL_EXT_buffer_storage, -1, -1 ) +GL_FUNC_VOID( GL_EXT_buffer_storage, false, glBufferStorageEXT, (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags), (target, size, data, flags) ) // This one is an OS extension. We'll add a little helper function to look for it. #ifdef _WIN32 diff --git a/togles/linuxwin/cglmbuffer.cpp b/togles/linuxwin/cglmbuffer.cpp index 23480c22..2aa1727e 100644 --- a/togles/linuxwin/cglmbuffer.cpp +++ b/togles/linuxwin/cglmbuffer.cpp @@ -93,7 +93,7 @@ CPersistentBuffer::~CPersistentBuffer() void CPersistentBuffer::Init( EGLMBufferType type,uint nSize ) { - Assert( gGL->m_bHave_GL_ARB_buffer_storage ); + Assert( gGL->m_bHave_GL_EXT_buffer_storage ); Assert( gGL->m_bHave_GL_ARB_map_buffer_range ); m_nSize = nSize; @@ -115,10 +115,10 @@ void CPersistentBuffer::Init( EGLMBufferType type,uint nSize ) // Create persistent immutable buffer that we will permanently map. This buffer can be written from any thread (not just // the renderthread) - gGL->glBufferStorage( m_buffGLTarget, m_nSize, (const GLvoid *)NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT ); // V_GL_REQ: GL_ARB_buffer_storage, GL_ARB_map_buffer_range, GL_VERSION_4_4 + gGL->glBufferStorageEXT( m_buffGLTarget, m_nSize, (const GLvoid *)NULL, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT ); // V_GL_REQ: GL_EXT_buffer_storage, GL_ARB_map_buffer_range, GL_VERSION_4_4 // Map the buffer for all of eternity. Pointer can be used from multiple threads. - m_pImmutablePersistentBuf = gGL->glMapBufferRange( m_buffGLTarget, 0, m_nSize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT ); // V_GL_REQ: GL_ARB_map_buffer_range, GL_ARB_buffer_storage, GL_VERSION_4_4 + m_pImmutablePersistentBuf = gGL->glMapBufferRange( m_buffGLTarget, 0, m_nSize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT ); // V_GL_REQ: GL_ARB_map_buffer_range, GL_EXT_buffer_storage, GL_VERSION_4_4 Assert( m_pImmutablePersistentBuf != NULL ); } } @@ -687,7 +687,7 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) bool bUsingPersistentBuffer = false; uint padding = 0; - if ( m_bDynamic && gGL->m_bHave_GL_ARB_buffer_storage ) + if ( m_bDynamic && gGL->m_bHave_GL_EXT_buffer_storage ) { // Compute padding to add to make sure the start offset is valid CPersistentBuffer *pTempBuffer = m_pCtx->GetCurPersistentBuffer( m_type ); @@ -747,7 +747,7 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) } #endif } - else if ( m_bDynamic && gGL->m_bHave_GL_ARB_buffer_storage && ( m_pCtx->GetCurPersistentBuffer( m_type )->GetBytesRemaining() >= ( pParams->m_nSize + padding ) ) ) + else if ( m_bDynamic && gGL->m_bHave_GL_EXT_buffer_storage && ( m_pCtx->GetCurPersistentBuffer( m_type )->GetBytesRemaining() >= ( pParams->m_nSize + padding ) ) ) { CPersistentBuffer *pTempBuffer = m_pCtx->GetCurPersistentBuffer( m_type ); diff --git a/togles/linuxwin/glentrypoints.cpp b/togles/linuxwin/glentrypoints.cpp index fc9fcfe2..7349b000 100644 --- a/togles/linuxwin/glentrypoints.cpp +++ b/togles/linuxwin/glentrypoints.cpp @@ -448,12 +448,12 @@ COpenGLEntryPoints::COpenGLEntryPoints() // So disable it for now. if ( ( m_nDriverProvider == cGLDriverProviderAMD ) || CommandLine()->CheckParm( "-gl_disable_arb_buffer_storage" ) ) { - m_bHave_GL_ARB_buffer_storage = false; + m_bHave_GL_EXT_buffer_storage = false; } printf( "GL_NV_bindless_texture: %s\n", m_bHave_GL_NV_bindless_texture ? "ENABLED" : "DISABLED" ); printf( "GL_AMD_pinned_memory: %s\n", m_bHave_GL_AMD_pinned_memory ? "ENABLED" : "DISABLED" ); - printf( "GL_ARB_buffer_storage: %s\n", m_bHave_GL_ARB_buffer_storage ? "AVAILABLE" : "NOT AVAILABLE" ); + printf( "GL_EXT_buffer_storage: %s\n", m_bHave_GL_EXT_buffer_storage ? "AVAILABLE" : "NOT AVAILABLE" ); printf( "GL_EXT_texture_sRGB_decode: %s\n", m_bHave_GL_EXT_texture_sRGB_decode ? "AVAILABLE" : "NOT AVAILABLE" ); bool bGLCanDecodeS3TCTextures = m_bHave_GL_EXT_texture_compression_s3tc || ( m_bHave_GL_EXT_texture_compression_dxt1 && m_bHave_GL_ANGLE_texture_compression_dxt3 && m_bHave_GL_ANGLE_texture_compression_dxt5 ); diff --git a/togles/linuxwin/glmgr.cpp b/togles/linuxwin/glmgr.cpp index ec888347..255aa84d 100644 --- a/togles/linuxwin/glmgr.cpp +++ b/togles/linuxwin/glmgr.cpp @@ -2452,7 +2452,7 @@ GLMContext::GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) ClearCurAttribs(); m_nCurPersistentBuffer = 0; - if ( gGL->m_bHave_GL_ARB_buffer_storage ) + if ( gGL->m_bHave_GL_EXT_buffer_storage ) { for ( uint lpType = 0; lpType < kGLMNumBufferTypes; ++lpType ) { From 24b2f5892cbbb3b0cc32b8dc47a7d72586a289a7 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Fri, 26 Nov 2021 20:51:33 +0300 Subject: [PATCH 05/18] Fix shaders compilation, replace some opengl functions with opengles analogs --- public/togles/linuxwin/cglmprogram.h | 3 +- public/togles/linuxwin/glfuncs.h | 44 +- public/togles/linuxwin/glmgr.h | 52 +- togles/linuxwin/cglmprogram.cpp | 26 +- togles/linuxwin/cglmquery.cpp | 4 +- togles/linuxwin/cglmtex.cpp | 2327 +++++++++++++++++++++++++- togles/linuxwin/decompress.c | 341 ++++ togles/linuxwin/decompress.h | 19 + togles/linuxwin/decompress.o | Bin 0 -> 35548 bytes togles/linuxwin/dx9asmtogl2.cpp | 65 +- togles/linuxwin/dxabstract.cpp | 4 +- togles/linuxwin/glentrypoints.cpp | 14 +- togles/linuxwin/glmgr.cpp | 171 +- togles/linuxwin/glmgr_flush.inl | 12 +- togles/linuxwin/glmgrbasics.cpp | 615 ------- togles/linuxwin/stb_dxt_104.h | 624 +++++++ 16 files changed, 3462 insertions(+), 859 deletions(-) create mode 100644 togles/linuxwin/decompress.c create mode 100644 togles/linuxwin/decompress.h create mode 100644 togles/linuxwin/decompress.o create mode 100644 togles/linuxwin/stb_dxt_104.h diff --git a/public/togles/linuxwin/cglmprogram.h b/public/togles/linuxwin/cglmprogram.h index 9d862f64..63f74d68 100644 --- a/public/togles/linuxwin/cglmprogram.h +++ b/public/togles/linuxwin/cglmprogram.h @@ -263,7 +263,8 @@ public: GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention GLint m_locVertexBoneParams; // "vcbones" GLint m_locVertexInteger0; // "i0" - + GLint m_locAlphaRef; // "alpha_ref" + enum { cMaxVertexShaderBoolUniforms = 4, cMaxFragmentShaderBoolUniforms = 1 }; GLint m_locVertexBool[cMaxVertexShaderBoolUniforms]; // "b0", etc. diff --git a/public/togles/linuxwin/glfuncs.h b/public/togles/linuxwin/glfuncs.h index 72a5bb0f..220416a5 100644 --- a/public/togles/linuxwin/glfuncs.h +++ b/public/togles/linuxwin/glfuncs.h @@ -30,18 +30,16 @@ GL_FUNC_VOID(OpenGL,true,glAlphaFunc,(GLenum a,GLclampf b),(a,b)) GL_FUNC_VOID(OpenGL,true,glAttachShader,(GLuint a, GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBindAttribLocation,(GLuint a,GLuint b,const GLchar *c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glBindBuffer,(GLenum a,GLuint b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glBindProgram,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBindTexture,(GLenum a,GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBlendColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glBlendEquation,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glBlendFunc,(GLenum a,GLenum b),(a,b)) GL_FUNC_VOID(OpenGL,true,glBufferData,(GLenum a, GLsizeiptr b, const GLvoid *c,GLenum d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glClear,(GLbitfield a),(a)) +GL_FUNC_VOID(OpenGL,true,glClearDepthf,(GLfloat a),(a)) GL_FUNC_VOID(OpenGL,true,glClearColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glClearDepth,(GLclampd a),(a)) GL_FUNC_VOID(OpenGL,true,glReadPixels, (GLint a, GLint b, GLsizei c, GLsizei d, GLenum e, GLenum f, void * g), (a,b,c,d,e,f,g)) GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint a),(a)) -GL_FUNC_VOID(OpenGL,true,glClipPlane,(GLenum a,const GLdouble *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glColorMask,(GLboolean a,GLboolean b,GLboolean c,GLboolean d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glCompileShader,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glGetShaderiv,(GLuint a, GLenum b, GLint *c),(a,b,c)) @@ -52,20 +50,17 @@ GL_FUNC_VOID(OpenGL,true,glCompressedTexImage3D,(GLenum a,GLint b,GLenum c,GLsiz GL_FUNC(OpenGL,true,GLuint,glCreateProgram,(void),()) GL_FUNC(OpenGL,true,GLuint,glCreateShader,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDeleteBuffers,(GLsizei a,const GLuint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glDeleteObject,(GLuint a),(a)) -GL_FUNC_VOID(OpenGL,true,glDeletePrograms,(GLsizei a,const GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDeleteProgram,(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,glDepthFunc,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean a),(a)) GL_FUNC_VOID(OpenGL,true,glDepthRangef,(GLfloat a,GLfloat b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glDepthRange,(GLclampd a,GLclampd b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glDetachObject,(GLuint a,GLuint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glDisable,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c)) -GL_FUNC_VOID(OpenGL,true,glDrawBuffer,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDrawBuffers,(GLsizei a,const GLenum *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glDetachShader,(GLuint a,GLuint b),(a,b)) 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)) #ifndef OSX // 10.6/GL 2.1 compatability GL_FUNC_VOID(OpenGL,true,glDrawRangeElementsBaseVertex,(GLenum a,GLuint b,GLuint c,GLsizei d,GLenum e,const GLvoid *f, GLenum g),(a,b,c,d,e,f,g)) @@ -76,35 +71,27 @@ GL_FUNC_VOID(OpenGL,true,glFinish,(void),()) GL_FUNC_VOID(OpenGL,true,glFlush,(void),()) GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glGenBuffers,(GLsizei a,GLuint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGenPrograms,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGenTextures,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGetBooleanv,(GLenum a,GLboolean *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGetCompressedTexImage,(GLenum a,GLint b,GLvoid *c),(a,b,c)) -GL_FUNC_VOID(OpenGL,true,glGetDoublev,(GLenum a,GLdouble *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGetInfoLog,(GLuint a,GLsizei b,GLsizei *c,GLchar *d),(a,b,c,d)) +//GL_FUNC_VOID(OpenGL,true,glGetInfoLog,(GLuint a,GLsizei b,GLsizei *c,GLchar *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glGetIntegerv,(GLenum a,GLint *b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glGetObjectParameteriv,(GLuint a,GLenum b,GLint *c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glGetProgramiv,(GLenum a,GLenum b,GLint *c),(a,b,c)) GL_FUNC(OpenGL,true,const GLubyte *,glGetString,(GLenum a),(a)) -GL_FUNC_VOID(OpenGL,true,glGetTexImage,(GLenum a,GLint b,GLenum c,GLenum d,GLvoid *e),(a,b,c,d,e)) GL_FUNC(OpenGL,true,GLint,glGetUniformLocation,(GLuint a,const GLchar *b),(a,b)) GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a)) GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glLinkProgram,(GLuint a),(a)) -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,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,glPopAttrib,(void),()) -GL_FUNC_VOID(OpenGL,true,glPushAttrib,(GLbitfield a),(a)) GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glScissor,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glShaderSource,(GLuint a,GLsizei b,const GLchar **c,const GLint *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glStencilFunc,(GLenum a,GLint b,GLuint c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glStencilMask,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glStencilOp,(GLenum a,GLenum b,GLenum c),(a,b,c)) -GL_FUNC_VOID(OpenGL,true,glTexCoord2f,(GLfloat a,GLfloat b),(a,b)) GL_FUNC_VOID(OpenGL,true,glTexImage2D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLint f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) GL_FUNC_VOID(OpenGL,true,glTexImage3D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLenum h,GLenum i,const GLvoid *j),(a,b,c,d,e,f,g,h,i,j)) GL_FUNC_VOID(OpenGL,true,glTexParameterfv,(GLenum a,GLenum b,const GLfloat *c),(a,b,c)) @@ -115,16 +102,9 @@ GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint b),(a,b)) GL_FUNC_VOID(OpenGL,true,glUniform4fv,(GLint a,GLsizei b,const GLfloat *c),(a,b,c)) GL_FUNC(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint a),(a)) -GL_FUNC_VOID(OpenGL,true,glVertex3f,(GLfloat a,GLfloat b,GLfloat c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glVertexAttribPointer,(GLuint a,GLint b,GLenum c,GLboolean d,GLsizei e,const GLvoid *f),(a,b,c,d,e,f)) GL_FUNC_VOID(OpenGL,true,glViewport,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glEnableClientState,(GLenum a),(a)) -GL_FUNC_VOID(OpenGL,true,glDisableClientState,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glClientActiveTexture,(GLenum a),(a)) -GL_FUNC_VOID(OpenGL,true,glVertexPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glTexCoordPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glProgramEnvParameters4fvEXT,(GLenum a,GLuint b,GLsizei c,const GLfloat *d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glColor4sv,(const GLshort *a),(a)) GL_FUNC_VOID(OpenGL,true,glStencilOpSeparate,(GLenum a,GLenum b,GLenum c,GLenum d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glStencilFuncSeparate,(GLenum a,GLenum b,GLint c,GLuint d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glGetTexLevelParameteriv,(GLenum a,GLint b,GLenum c,GLint *d),(a,b,c,d)) @@ -164,11 +144,6 @@ GL_FUNC_VOID(GL_ARB_sync,false,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),( GL_FUNC_VOID(GL_ARB_sync,false,glDeleteSync,(GLsync a),(a)) GL_FUNC(GL_ARB_sync,false,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b)) #endif -GL_EXT(GL_EXT_draw_buffers2,-1,-1) -GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glColorMaskIndexedEXT,(GLuint a,GLboolean b,GLboolean c,GLboolean d,GLboolean e),(a,b,c,d,e)) -GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glEnableIndexedEXT,(GLenum a,GLuint b),(a,b)) -GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glDisableIndexedEXT,(GLenum a,GLuint b),(a,b)) -GL_FUNC_VOID(GL_EXT_draw_buffers2,true,glGetBooleanIndexedvEXT,(GLenum a,GLuint b,GLboolean *c),(a,b,c)) GL_EXT(GL_EXT_bindable_uniform,-1,-1) GL_FUNC_VOID(GL_EXT_bindable_uniform,false,glUniformBufferEXT,(GLuint a,GLint b,GLuint c),(a,b,c)) GL_FUNC(GL_EXT_bindable_uniform,false,int,glGetUniformBufferSizeEXT,(GLenum a, GLenum b),(a,b)) @@ -212,7 +187,7 @@ GL_FUNC_VOID(OpenGL,false,glDeleteRenderbuffers,(GLsizei a,const GLuint *b),(a,b GL_FUNC_VOID(OpenGL,false,glFramebufferRenderbuffer,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,false,glFramebufferTexture2D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e)) GL_FUNC_VOID(OpenGL,false,glFramebufferTexture3D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f)) -GL_FUNC_VOID(OpenGL,false,glGenFramebuffers,(GLsizei a,GLuint *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glGenFramebuffers,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,false,glGenRenderbuffers,(GLsizei a,GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,false,glDeleteFramebuffers,(GLsizei a,const GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,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)) @@ -248,9 +223,6 @@ GL_FUNC_VOID(OpenGL,true,glGenQueries,(GLsizei n, GLuint *ids), (n, ids)) GL_FUNC_VOID(OpenGL,true,glDeleteQueries,(GLsizei n, const GLuint *ids),(n, ids)) GL_FUNC_VOID(OpenGL,true,glBeginQuery,(GLenum target, GLuint id), (target, id)) GL_FUNC_VOID(OpenGL,true,glEndQuery,(GLenum target), (target)) -GL_FUNC_VOID(OpenGL,true,glQueryCounter,(GLuint id, GLenum target), (id, target)) -GL_FUNC_VOID(OpenGL,true,glGetQueryObjectiv,(GLuint id, GLenum pname, GLint *params), (id, pname, params)) -GL_FUNC_VOID(OpenGL,true,glGetQueryObjectui64v,(GLuint id, GLenum pname, GLuint64 *params), (id, pname, params)) GL_FUNC_VOID(OpenGL,true,glCopyBufferSubData,(GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size),(readtarget, writetarget, readoffset, writeoffset, size)) #endif // !OSX @@ -264,8 +236,6 @@ GL_FUNC_VOID(OpenGL,true,glBindVertexArray,(GLuint a),(a)) #endif // !OSX GL_EXT(GL_EXT_texture_sRGB_decode,-1,-1) -GL_FUNC_VOID(OpenGL,true,glPushClientAttrib,(GLbitfield a),(a)) -GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),()) GL_EXT(GL_NVX_gpu_memory_info,-1,-1) GL_EXT(GL_ATI_meminfo,-1,-1) GL_EXT(GL_EXT_texture_compression_s3tc,-1,-1) diff --git a/public/togles/linuxwin/glmgr.h b/public/togles/linuxwin/glmgr.h index c1af97c1..a5ec89d6 100644 --- a/public/togles/linuxwin/glmgr.h +++ b/public/togles/linuxwin/glmgr.h @@ -198,9 +198,11 @@ FORCEINLINE void glGetEnumv( GLenum which, GLenum *dst ) // shorthand macros #define EQ(fff) ( (src.fff) == (fff) ) + //rasterizer struct GLAlphaTestEnable_t { GLint enable; inline bool operator==(const GLAlphaTestEnable_t& src) const { return EQ(enable); } }; struct GLAlphaTestFunc_t { GLenum func; GLclampf ref; inline bool operator==(const GLAlphaTestFunc_t& src) const { return EQ(func) && EQ(ref); } }; +struct GLAlphaTest_t { GLint enable; GLenum func; GLclampf ref; }; struct GLCullFaceEnable_t { GLint enable; inline bool operator==(const GLCullFaceEnable_t& src) const { return EQ(enable); } }; struct GLCullFrontFace_t { GLenum value; inline bool operator==(const GLCullFrontFace_t& src) const { return EQ(value); } }; struct GLPolygonMode_t { GLenum values[2]; inline bool operator==(const GLPolygonMode_t& src) const { return EQ(values[0]) && EQ(values[1]); } }; @@ -209,7 +211,7 @@ struct GLScissorEnable_t { GLint enable; inline bool operator==(co struct GLScissorBox_t { GLint x,y; GLsizei width, height; inline bool operator==(const GLScissorBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } }; struct GLAlphaToCoverageEnable_t{ GLint enable; inline bool operator==(const GLAlphaToCoverageEnable_t& src) const { return EQ(enable); } }; struct GLViewportBox_t { GLint x,y; GLsizei width, height; uint widthheight; inline bool operator==(const GLViewportBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } }; -struct GLViewportDepthRange_t { GLdouble flNear,flFar; inline bool operator==(const GLViewportDepthRange_t& src) const { return EQ(flNear) && EQ(flFar); } }; +struct GLViewportDepthRange_t { GLfloat flNear,flFar; inline bool operator==(const GLViewportDepthRange_t& src) const { return EQ(flNear) && EQ(flFar); } }; struct GLClipPlaneEnable_t { GLint enable; inline bool operator==(const GLClipPlaneEnable_t& src) const { return EQ(enable); } }; struct GLClipPlaneEquation_t { GLfloat x,y,z,w; inline bool operator==(const GLClipPlaneEquation_t& src) const { return EQ(x) && EQ(y) && EQ(z) && EQ(w); } }; @@ -235,7 +237,7 @@ struct GLStencilWriteMask_t { GLint mask; inline bool operator==(c //clearing struct GLClearColor_t { GLfloat r,g,b,a; inline bool operator==(const GLClearColor_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } }; -struct GLClearDepth_t { GLdouble d; inline bool operator==(const GLClearDepth_t& src) const { return EQ(d); } }; +struct GLClearDepth_t { GLfloat d; inline bool operator==(const GLClearDepth_t& src) const { return EQ(d); } }; struct GLClearStencil_t { GLint s; inline bool operator==(const GLClearStencil_t& src) const { return EQ(s); } }; #undef EQ @@ -306,15 +308,20 @@ template void GLContextGetDefaultIndexed( T *dst, int index ); //=============================================================================== // template specializations for each type of state + +static GLAlphaTest_t g_alpha_test; + // --- GLAlphaTestEnable --- FORCEINLINE void GLContextSet( GLAlphaTestEnable_t *src ) { - glSetEnable( GL_ALPHA_TEST, src->enable != 0 ); +// glSetEnable( GL_ALPHA_TEST, src->enable != 0 ); + g_alpha_test.enable = src->enable; } FORCEINLINE void GLContextGet( GLAlphaTestEnable_t *dst ) { - dst->enable = gGL->glIsEnabled( GL_ALPHA_TEST ); +// dst->enable = gGL->glIsEnabled( GL_ALPHA_TEST ); + dst->enable = g_alpha_test.enable; } FORCEINLINE void GLContextGetDefault( GLAlphaTestEnable_t *dst ) @@ -326,12 +333,16 @@ FORCEINLINE void GLContextGetDefault( GLAlphaTestEnable_t *dst ) FORCEINLINE void GLContextSet( GLAlphaTestFunc_t *src ) { // gGL->glAlphaFunc( src->func, src->ref ); + g_alpha_test.func = src->func; + g_alpha_test.ref = src->ref; } FORCEINLINE void GLContextGet( GLAlphaTestFunc_t *dst ) { - glGetEnumv( GL_ALPHA_TEST_FUNC, &dst->func ); - gGL->glGetFloatv( GL_ALPHA_TEST_REF, &dst->ref ); +// glGetEnumv( GL_ALPHA_TEST_FUNC, &dst->func ); +// gGL->glGetFloatv( GL_ALPHA_TEST_REF, &dst->ref ); + dst->func = g_alpha_test.func; + dst->ref = g_alpha_test.ref; } FORCEINLINE void GLContextGetDefault( GLAlphaTestFunc_t *dst ) @@ -502,7 +513,7 @@ FORCEINLINE void GLContextSet( GLViewportDepthRange_t *src ) FORCEINLINE void GLContextGet( GLViewportDepthRange_t *dst ) { - gGL->glGetDoublev ( GL_DEPTH_RANGE, &dst->flNear ); + gGL->glGetFloatv( GL_DEPTH_RANGE, &dst->flNear ); } FORCEINLINE void GLContextGetDefault( GLViewportDepthRange_t *dst ) @@ -584,12 +595,26 @@ FORCEINLINE void GLContextGetDefault( GLColorMaskSingle_t *dst ) // --- GLColorMaskMultiple --- FORCEINLINE void GLContextSetIndexed( GLColorMaskMultiple_t *src, int index ) { - gGL->glColorMaskIndexedEXT ( index, src->r, src->g, src->b, src->a ); + GLint Rfbo = 0, Dfbo = 0; + + gGL->glGetIntegerv( GL_DRAW_FRAMEBUFFER_BINDING, &Dfbo ); + gGL->glGetIntegerv( GL_READ_FRAMEBUFFER_BINDING, &Rfbo ); + GLint target = Dfbo == Rfbo?GL_FRAMEBUFFER:GL_DRAW_FRAMEBUFFER; + gGL->glBindFramebuffer( target, index ); + gGL->glColorMask ( src->r, src->g, src->b, src->a ); + gGL->glBindFramebuffer( target, Dfbo ); } FORCEINLINE void GLContextGetIndexed( GLColorMaskMultiple_t *dst, int index ) { - gGL->glGetBooleanIndexedvEXT ( GL_COLOR_WRITEMASK, index, (GLboolean*)&dst->r ); + GLint Rfbo = 0, Dfbo = 0; + + gGL->glGetIntegerv( GL_DRAW_FRAMEBUFFER_BINDING, &Dfbo ); + gGL->glGetIntegerv( GL_READ_FRAMEBUFFER_BINDING, &Rfbo ); + GLint target = Dfbo == Rfbo?GL_FRAMEBUFFER:GL_DRAW_FRAMEBUFFER; + gGL->glBindFramebuffer( target, index ); + gGL->glGetBooleanv( GL_COLOR_WRITEMASK, (GLboolean*)&dst->r ); + gGL->glBindFramebuffer( target, Dfbo ); } FORCEINLINE void GLContextGetDefaultIndexed( GLColorMaskMultiple_t *dst, int index ) @@ -698,7 +723,7 @@ FORCEINLINE void GLContextSet( GLBlendEnableSRGB_t *src ) FORCEINLINE void GLContextGet( GLBlendEnableSRGB_t *dst ) { - //dst->enable = glIsEnabled( GL_FRAMEBUFFER_SRGB_EXT ); +// dst->enable = gGL->glIsEnabled( GL_FRAMEBUFFER_SRGB_EXT ); dst->enable = true; // wtf ? } @@ -864,13 +889,12 @@ FORCEINLINE void GLContextGetDefault( GLClearColor_t *dst ) // --- GLClearDepth --- FORCEINLINE void GLContextSet( GLClearDepth_t *src ) { -// TOFUCK: wut -// gGL->glClearDepth ( src->d ); + gGL->glClearDepthf( src->d ); } FORCEINLINE void GLContextGet( GLClearDepth_t *dst ) { - gGL->glGetDoublev ( GL_DEPTH_CLEAR_VALUE, &dst->d ); + gGL->glGetFloatv( GL_DEPTH_CLEAR_VALUE, &dst->d ); } FORCEINLINE void GLContextGetDefault( GLClearDepth_t *dst ) @@ -2285,7 +2309,7 @@ public: }; #define kMaxCrawlFrames 100 -#define kMaxCrawlText (kMaxCrawlFrames * 256) +#define kMaxCrawlText (kMaxCrawlFrames * 256) class CStackCrawlParams { public: diff --git a/togles/linuxwin/cglmprogram.cpp b/togles/linuxwin/cglmprogram.cpp index 137c91ac..50d4830c 100644 --- a/togles/linuxwin/cglmprogram.cpp +++ b/togles/linuxwin/cglmprogram.cpp @@ -718,7 +718,7 @@ CGLMShaderPair::~CGLMShaderPair( ) { if (m_program) { - gGL->glDeleteObject( m_program ); + gGL->glDeleteProgram( m_program ); m_program = 0; } } @@ -746,7 +746,7 @@ bool CGLMShaderPair::ValidateProgramPair() // check for success GLint result = GL_TRUE; - gGL->glGetObjectParameteriv( m_program, GL_OBJECT_LINK_STATUS_ARB, &result ); // want GL_TRUE + gGL->glGetProgramiv(m_program, GL_LINK_STATUS, &result); m_bCheckLinkStatus = false; if (result == GL_TRUE) @@ -762,12 +762,6 @@ bool CGLMShaderPair::ValidateProgramPair() GLint laux = 0; // do some digging - gGL->glGetObjectParameteriv( m_program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length ); - - GLchar *logString = (GLchar *)malloc( length * sizeof(GLchar) ); - gGL->glGetInfoLog( m_program, length, &laux, logString ); - - GLMPRINTF( ("-D- ----- GLSL link failed: \n %s ", logString) ); #if !GLM_FREE_SHADER_TEXT char *vtemp = strdup( m_vertexProg->m_text ); vtemp[m_vertexProg->m_descs[kGLMGLSL].m_textOffset + m_vertexProg->m_descs[kGLMGLSL].m_textLength] = 0; @@ -784,8 +778,6 @@ bool CGLMShaderPair::ValidateProgramPair() free( ftemp ); free( vtemp ); #endif - free( logString ); - GLMPRINTF( ("-D- -----end-----") ); } @@ -793,11 +785,15 @@ bool CGLMShaderPair::ValidateProgramPair() { gGL->glUseProgram( m_program ); + printf("Sample text\n"); + m_ctx->NewLinkedProgram(); m_locVertexParams = gGL->glGetUniformLocation( m_program, "vc" ); m_locVertexBoneParams = gGL->glGetUniformLocation( m_program, "vcbones" ); m_locVertexScreenParams = gGL->glGetUniformLocation( m_program, "vcscreen" ); + m_locAlphaRef = gGL->glGetUniformLocation( m_program, "alpha_ref" ); + m_nScreenWidthHeight = 0xFFFFFFFF; m_locVertexInteger0 = gGL->glGetUniformLocation( m_program, "i0" ); @@ -940,13 +936,13 @@ bool CGLMShaderPair::SetProgramPair( CGLMProgram *vp, CGLMProgram *fp ) // attempt link. but first, detach any previously attached programs if (m_vertexProg) { - gGL->glDetachObject(m_program, m_vertexProg->m_descs[kGLMGLSL].m_object.glsl); + gGL->glDetachShader(m_program, m_vertexProg->m_descs[kGLMGLSL].m_object.glsl); m_vertexProg = NULL; } if (m_fragmentProg) { - gGL->glDetachObject(m_program, m_fragmentProg->m_descs[kGLMGLSL].m_object.glsl); + gGL->glDetachShader(m_program, m_fragmentProg->m_descs[kGLMGLSL].m_object.glsl); m_fragmentProg = NULL; } @@ -987,7 +983,7 @@ bool CGLMShaderPair::SetProgramPair( CGLMProgram *vp, CGLMProgram *fp ) gGL->glLinkProgram( m_program ); GLint isLinked = 0; - gGL->glGetShaderiv(m_program, GL_LINK_STATUS, &isLinked); + gGL->glGetProgramiv(m_program, GL_LINK_STATUS, &isLinked); if(isLinked == GL_FALSE) { GLint maxLength = 0; @@ -997,8 +993,8 @@ bool CGLMShaderPair::SetProgramPair( CGLMProgram *vp, CGLMProgram *fp ) gGL->glGetProgramInfoLog( m_program, sizeof(log), &maxLength, log ); if( maxLength ) { - printf("vp: \n%s\nfp: \n%s\n", vp->m_text, fp->m_text ); - printf("shader %d link log: %s\n", m_program, log); + Msg("vp: \n%s\nfp: \n%s\n", vp->m_text, fp->m_text ); + Msg("shader %d link log: %s\n", m_program, log); } } diff --git a/togles/linuxwin/cglmquery.cpp b/togles/linuxwin/cglmquery.cpp index c0ddbfa8..ffc7f247 100644 --- a/togles/linuxwin/cglmquery.cpp +++ b/togles/linuxwin/cglmquery.cpp @@ -239,8 +239,8 @@ bool CGLMQuery::IsDone( void ) { // prepare to pay a big price on drivers prior to 10.6.4+SLGU - GLint available = 0; - gGL->glGetQueryObjectiv(m_name, GL_QUERY_RESULT_AVAILABLE, &available ); + GLuint available = 0; + gGL->glGetQueryObjectuiv(m_name, GL_QUERY_RESULT_AVAILABLE, &available ); m_done = (available != 0); } diff --git a/togles/linuxwin/cglmtex.cpp b/togles/linuxwin/cglmtex.cpp index 0ce6a030..747ed01e 100644 --- a/togles/linuxwin/cglmtex.cpp +++ b/togles/linuxwin/cglmtex.cpp @@ -28,6 +28,10 @@ #include "togles/rendermechanism.h" +extern "C" { +#include "decompress.h" +} + #include "tier0/icommandline.h" #include "glmtexinlines.h" @@ -75,7 +79,7 @@ int sEncodeLayoutAsIndex( GLMTexLayoutKey *key ) // if not all power of two index |= 2; } - + if (GetFormatDesc( key->m_texFormat )->m_chunkSize >1 ) { index |= 4; @@ -173,6 +177,7 @@ const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format ) { if (g_formatDescTable[i].m_d3dFormat == format) { + return &g_formatDescTable[i]; } } @@ -1055,7 +1060,7 @@ void CGLMTex::CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z int zStride = 0; GLMTexFormatDesc *format = m_layout->m_format; - if (format->m_chunkSize==1) + if (format->m_chunkSize==1) { // figure out row stride and layer stride yStride = format->m_bytesPerSquareChunk * m_layout->m_slices[sliceIndex].m_xSize; // bytes per texel row (y stride) @@ -1151,10 +1156,12 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) { // compressed path // http://www.opengl.org/sdk/docs/man/xhtml/glGetCompressedTexImage.xml - + // TODO(nillerusr): implement me! +/* gGL->glGetCompressedTexImage( target, // target desc->m_req.m_mip, // level sliceAddress ); // destination +*/ } else { @@ -1165,17 +1172,6 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) gGL->glGetIntegerv( GL_DRAW_FRAMEBUFFER_BINDING, &Dfbo ); gGL->glGetIntegerv( GL_READ_FRAMEBUFFER_BINDING, &Rfbo ); - - /* - gl4es_glGenFramebuffers(1, &fbo); - gl4es_glBindFramebuffer(GL_FRAMEBUFFER_OES, fbo); - gl4es_glFramebufferTexture2D(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, oldBind, 0); - // Read the pixels! - gl4es_glReadPixels(0, nheight-height, width, height, format, type, img); // using "full" version with conversion of format/type - gl4es_glBindFramebuffer(GL_FRAMEBUFFER_OES, old_fbo); - gl4es_glDeleteFramebuffers(1, &fbo); - - */ gGL->glGenFramebuffers(1, &fbo); gGL->glBindFramebuffer(GL_FRAMEBUFFER, fbo); @@ -1214,6 +1210,2301 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) m_ctx->BindTexToTMU( pPrevTex, 0 ); } +struct mem_s +{ + const int value; + const char *str; +} g_glEnums[] = +{ +{ 0x0000, "GL_ZERO" }, +{ 0x0001, "GL_ONE" }, +{ 0x0004, "GL_TRIANGLES" }, +{ 0x0005, "GL_TRIANGLE_STRIP" }, +{ 0x0006, "GL_TRIANGLE_FAN" }, +{ 0x0007, "GL_QUADS" }, +{ 0x0008, "GL_QUAD_STRIP" }, +{ 0x0009, "GL_POLYGON" }, +{ 0x0200, "GL_NEVER" }, +{ 0x0201, "GL_LESS" }, +{ 0x0202, "GL_EQUAL" }, +{ 0x0203, "GL_LEQUAL" }, +{ 0x0204, "GL_GREATER" }, +{ 0x0205, "GL_NOTEQUAL" }, +{ 0x0206, "GL_GEQUAL" }, +{ 0x0207, "GL_ALWAYS" }, +{ 0x0300, "GL_SRC_COLOR" }, +{ 0x0301, "GL_ONE_MINUS_SRC_COLOR" }, +{ 0x0302, "GL_SRC_ALPHA" }, +{ 0x0303, "GL_ONE_MINUS_SRC_ALPHA" }, +{ 0x0304, "GL_DST_ALPHA" }, +{ 0x0305, "GL_ONE_MINUS_DST_ALPHA" }, +{ 0x0306, "GL_DST_COLOR" }, +{ 0x0307, "GL_ONE_MINUS_DST_COLOR" }, +{ 0x0308, "GL_SRC_ALPHA_SATURATE" }, +{ 0x0400, "GL_FRONT_LEFT" }, +{ 0x0401, "GL_FRONT_RIGHT" }, +{ 0x0402, "GL_BACK_LEFT" }, +{ 0x0403, "GL_BACK_RIGHT" }, +{ 0x0404, "GL_FRONT" }, +{ 0x0405, "GL_BACK" }, +{ 0x0406, "GL_LEFT" }, +{ 0x0407, "GL_RIGHT" }, +{ 0x0408, "GL_FRONT_AND_BACK" }, +{ 0x0409, "GL_AUX0" }, +{ 0x040A, "GL_AUX1" }, +{ 0x040B, "GL_AUX2" }, +{ 0x040C, "GL_AUX3" }, +{ 0x0500, "GL_INVALID_ENUM" }, +{ 0x0501, "GL_INVALID_VALUE" }, +{ 0x0502, "GL_INVALID_OPERATION" }, +{ 0x0503, "GL_STACK_OVERFLOW" }, +{ 0x0504, "GL_STACK_UNDERFLOW" }, +{ 0x0505, "GL_OUT_OF_MEMORY" }, +{ 0x0506, "GL_INVALID_FRAMEBUFFER_OPERATION" }, +{ 0x0600, "GL_2D" }, +{ 0x0601, "GL_3D" }, +{ 0x0602, "GL_3D_COLOR" }, +{ 0x0603, "GL_3D_COLOR_TEXTURE" }, +{ 0x0604, "GL_4D_COLOR_TEXTURE" }, +{ 0x0700, "GL_PASS_THROUGH_TOKEN" }, +{ 0x0701, "GL_POINT_TOKEN" }, +{ 0x0702, "GL_LINE_TOKEN" }, +{ 0x0703, "GL_POLYGON_TOKEN" }, +{ 0x0704, "GL_BITMAP_TOKEN" }, +{ 0x0705, "GL_DRAW_PIXEL_TOKEN" }, +{ 0x0706, "GL_COPY_PIXEL_TOKEN" }, +{ 0x0707, "GL_LINE_RESET_TOKEN" }, +{ 0x0800, "GL_EXP" }, +{ 0x0801, "GL_EXP2" }, +{ 0x0900, "GL_CW" }, +{ 0x0901, "GL_CCW" }, +{ 0x0A00, "GL_COEFF" }, +{ 0x0A01, "GL_ORDER" }, +{ 0x0A02, "GL_DOMAIN" }, +{ 0x0B00, "GL_CURRENT_COLOR" }, +{ 0x0B01, "GL_CURRENT_INDEX" }, +{ 0x0B02, "GL_CURRENT_NORMAL" }, +{ 0x0B03, "GL_CURRENT_TEXTURE_COORDS" }, +{ 0x0B04, "GL_CURRENT_RASTER_COLOR" }, +{ 0x0B05, "GL_CURRENT_RASTER_INDEX" }, +{ 0x0B06, "GL_CURRENT_RASTER_TEXTURE_COORDS" }, +{ 0x0B07, "GL_CURRENT_RASTER_POSITION" }, +{ 0x0B08, "GL_CURRENT_RASTER_POSITION_VALID" }, +{ 0x0B09, "GL_CURRENT_RASTER_DISTANCE" }, +{ 0x0B10, "GL_POINT_SMOOTH" }, +{ 0x0B11, "GL_POINT_SIZE" }, +{ 0x0B12, "GL_POINT_SIZE_RANGE" }, +{ 0x0B12, "GL_SMOOTH_POINT_SIZE_RANGE" }, +{ 0x0B13, "GL_POINT_SIZE_GRANULARITY" }, +{ 0x0B13, "GL_SMOOTH_POINT_SIZE_GRANULARITY" }, +{ 0x0B20, "GL_LINE_SMOOTH" }, +{ 0x0B21, "GL_LINE_WIDTH" }, +{ 0x0B22, "GL_LINE_WIDTH_RANGE" }, +{ 0x0B22, "GL_SMOOTH_LINE_WIDTH_RANGE" }, +{ 0x0B23, "GL_LINE_WIDTH_GRANULARITY" }, +{ 0x0B23, "GL_SMOOTH_LINE_WIDTH_GRANULARITY" }, +{ 0x0B24, "GL_LINE_STIPPLE" }, +{ 0x0B25, "GL_LINE_STIPPLE_PATTERN" }, +{ 0x0B26, "GL_LINE_STIPPLE_REPEAT" }, +{ 0x0B30, "GL_LIST_MODE" }, +{ 0x0B31, "GL_MAX_LIST_NESTING" }, +{ 0x0B32, "GL_LIST_BASE" }, +{ 0x0B33, "GL_LIST_INDEX" }, +{ 0x0B40, "GL_POLYGON_MODE" }, +{ 0x0B41, "GL_POLYGON_SMOOTH" }, +{ 0x0B42, "GL_POLYGON_STIPPLE" }, +{ 0x0B43, "GL_EDGE_FLAG" }, +{ 0x0B44, "GL_CULL_FACE" }, +{ 0x0B45, "GL_CULL_FACE_MODE" }, +{ 0x0B46, "GL_FRONT_FACE" }, +{ 0x0B50, "GL_LIGHTING" }, +{ 0x0B51, "GL_LIGHT_MODEL_LOCAL_VIEWER" }, +{ 0x0B52, "GL_LIGHT_MODEL_TWO_SIDE" }, +{ 0x0B53, "GL_LIGHT_MODEL_AMBIENT" }, +{ 0x0B54, "GL_SHADE_MODEL" }, +{ 0x0B55, "GL_COLOR_MATERIAL_FACE" }, +{ 0x0B56, "GL_COLOR_MATERIAL_PARAMETER" }, +{ 0x0B57, "GL_COLOR_MATERIAL" }, +{ 0x0B60, "GL_FOG" }, +{ 0x0B61, "GL_FOG_INDEX" }, +{ 0x0B62, "GL_FOG_DENSITY" }, +{ 0x0B63, "GL_FOG_START" }, +{ 0x0B64, "GL_FOG_END" }, +{ 0x0B65, "GL_FOG_MODE" }, +{ 0x0B66, "GL_FOG_COLOR" }, +{ 0x0B70, "GL_DEPTH_RANGE" }, +{ 0x0B71, "GL_DEPTH_TEST" }, +{ 0x0B72, "GL_DEPTH_WRITEMASK" }, +{ 0x0B73, "GL_DEPTH_CLEAR_VALUE" }, +{ 0x0B74, "GL_DEPTH_FUNC" }, +{ 0x0B80, "GL_ACCUM_CLEAR_VALUE" }, +{ 0x0B90, "GL_STENCIL_TEST" }, +{ 0x0B91, "GL_STENCIL_CLEAR_VALUE" }, +{ 0x0B92, "GL_STENCIL_FUNC" }, +{ 0x0B93, "GL_STENCIL_VALUE_MASK" }, +{ 0x0B94, "GL_STENCIL_FAIL" }, +{ 0x0B95, "GL_STENCIL_PASS_DEPTH_FAIL" }, +{ 0x0B96, "GL_STENCIL_PASS_DEPTH_PASS" }, +{ 0x0B97, "GL_STENCIL_REF" }, +{ 0x0B98, "GL_STENCIL_WRITEMASK" }, +{ 0x0BA0, "GL_MATRIX_MODE" }, +{ 0x0BA1, "GL_NORMALIZE" }, +{ 0x0BA2, "GL_VIEWPORT" }, +{ 0x0BA3, "GL_MODELVIEW_STACK_DEPTH" }, +{ 0x0BA4, "GL_PROJECTION_STACK_DEPTH" }, +{ 0x0BA5, "GL_TEXTURE_STACK_DEPTH" }, +{ 0x0BA6, "GL_MODELVIEW_MATRIX" }, +{ 0x0BA7, "GL_PROJECTION_MATRIX" }, +{ 0x0BA8, "GL_TEXTURE_MATRIX" }, +{ 0x0BB0, "GL_ATTRIB_STACK_DEPTH" }, +{ 0x0BB1, "GL_CLIENT_ATTRIB_STACK_DEPTH" }, +{ 0x0BC0, "GL_ALPHA_TEST" }, +{ 0x0BC1, "GL_ALPHA_TEST_FUNC" }, +{ 0x0BC2, "GL_ALPHA_TEST_REF" }, +{ 0x0BD0, "GL_DITHER" }, +{ 0x0BE0, "GL_BLEND_DST" }, +{ 0x0BE1, "GL_BLEND_SRC" }, +{ 0x0BE2, "GL_BLEND" }, +{ 0x0BF0, "GL_LOGIC_OP_MODE" }, +{ 0x0BF1, "GL_INDEX_LOGIC_OP" }, +{ 0x0BF2, "GL_COLOR_LOGIC_OP" }, +{ 0x0C00, "GL_AUX_BUFFERS" }, +{ 0x0C01, "GL_DRAW_BUFFER" }, +{ 0x0C02, "GL_READ_BUFFER" }, +{ 0x0C10, "GL_SCISSOR_BOX" }, +{ 0x0C11, "GL_SCISSOR_TEST" }, +{ 0x0C20, "GL_INDEX_CLEAR_VALUE" }, +{ 0x0C21, "GL_INDEX_WRITEMASK" }, +{ 0x0C22, "GL_COLOR_CLEAR_VALUE" }, +{ 0x0C23, "GL_COLOR_WRITEMASK" }, +{ 0x0C30, "GL_INDEX_MODE" }, +{ 0x0C31, "GL_RGBA_MODE" }, +{ 0x0C32, "GL_DOUBLEBUFFER" }, +{ 0x0C33, "GL_STEREO" }, +{ 0x0C40, "GL_RENDER_MODE" }, +{ 0x0C50, "GL_PERSPECTIVE_CORRECTION_HINT" }, +{ 0x0C51, "GL_POINT_SMOOTH_HINT" }, +{ 0x0C52, "GL_LINE_SMOOTH_HINT" }, +{ 0x0C53, "GL_POLYGON_SMOOTH_HINT" }, +{ 0x0C54, "GL_FOG_HINT" }, +{ 0x0C60, "GL_TEXTURE_GEN_S" }, +{ 0x0C61, "GL_TEXTURE_GEN_T" }, +{ 0x0C62, "GL_TEXTURE_GEN_R" }, +{ 0x0C63, "GL_TEXTURE_GEN_Q" }, +{ 0x0C70, "GL_PIXEL_MAP_I_TO_I" }, +{ 0x0C71, "GL_PIXEL_MAP_S_TO_S" }, +{ 0x0C72, "GL_PIXEL_MAP_I_TO_R" }, +{ 0x0C73, "GL_PIXEL_MAP_I_TO_G" }, +{ 0x0C74, "GL_PIXEL_MAP_I_TO_B" }, +{ 0x0C75, "GL_PIXEL_MAP_I_TO_A" }, +{ 0x0C76, "GL_PIXEL_MAP_R_TO_R" }, +{ 0x0C77, "GL_PIXEL_MAP_G_TO_G" }, +{ 0x0C78, "GL_PIXEL_MAP_B_TO_B" }, +{ 0x0C79, "GL_PIXEL_MAP_A_TO_A" }, +{ 0x0CB0, "GL_PIXEL_MAP_I_TO_I_SIZE" }, +{ 0x0CB1, "GL_PIXEL_MAP_S_TO_S_SIZE" }, +{ 0x0CB2, "GL_PIXEL_MAP_I_TO_R_SIZE" }, +{ 0x0CB3, "GL_PIXEL_MAP_I_TO_G_SIZE" }, +{ 0x0CB4, "GL_PIXEL_MAP_I_TO_B_SIZE" }, +{ 0x0CB5, "GL_PIXEL_MAP_I_TO_A_SIZE" }, +{ 0x0CB6, "GL_PIXEL_MAP_R_TO_R_SIZE" }, +{ 0x0CB7, "GL_PIXEL_MAP_G_TO_G_SIZE" }, +{ 0x0CB8, "GL_PIXEL_MAP_B_TO_B_SIZE" }, +{ 0x0CB9, "GL_PIXEL_MAP_A_TO_A_SIZE" }, +{ 0x0CF0, "GL_UNPACK_SWAP_BYTES" }, +{ 0x0CF1, "GL_UNPACK_LSB_FIRST" }, +{ 0x0CF2, "GL_UNPACK_ROW_LENGTH" }, +{ 0x0CF3, "GL_UNPACK_SKIP_ROWS" }, +{ 0x0CF4, "GL_UNPACK_SKIP_PIXELS" }, +{ 0x0CF5, "GL_UNPACK_ALIGNMENT" }, +{ 0x0D00, "GL_PACK_SWAP_BYTES" }, +{ 0x0D01, "GL_PACK_LSB_FIRST" }, +{ 0x0D02, "GL_PACK_ROW_LENGTH" }, +{ 0x0D03, "GL_PACK_SKIP_ROWS" }, +{ 0x0D04, "GL_PACK_SKIP_PIXELS" }, +{ 0x0D05, "GL_PACK_ALIGNMENT" }, +{ 0x0D10, "GL_MAP_COLOR" }, +{ 0x0D11, "GL_MAP_STENCIL" }, +{ 0x0D12, "GL_INDEX_SHIFT" }, +{ 0x0D13, "GL_INDEX_OFFSET" }, +{ 0x0D14, "GL_RED_SCALE" }, +{ 0x0D15, "GL_RED_BIAS" }, +{ 0x0D16, "GL_ZOOM_X" }, +{ 0x0D17, "GL_ZOOM_Y" }, +{ 0x0D18, "GL_GREEN_SCALE" }, +{ 0x0D19, "GL_GREEN_BIAS" }, +{ 0x0D1A, "GL_BLUE_SCALE" }, +{ 0x0D1B, "GL_BLUE_BIAS" }, +{ 0x0D1C, "GL_ALPHA_SCALE" }, +{ 0x0D1D, "GL_ALPHA_BIAS" }, +{ 0x0D1E, "GL_DEPTH_SCALE" }, +{ 0x0D1F, "GL_DEPTH_BIAS" }, +{ 0x0D30, "GL_MAX_EVAL_ORDER" }, +{ 0x0D31, "GL_MAX_LIGHTS" }, +{ 0x0D32, "GL_MAX_CLIP_PLANES" }, +{ 0x0D33, "GL_MAX_TEXTURE_SIZE" }, +{ 0x0D34, "GL_MAX_PIXEL_MAP_TABLE" }, +{ 0x0D35, "GL_MAX_ATTRIB_STACK_DEPTH" }, +{ 0x0D36, "GL_MAX_MODELVIEW_STACK_DEPTH" }, +{ 0x0D37, "GL_MAX_NAME_STACK_DEPTH" }, +{ 0x0D38, "GL_MAX_PROJECTION_STACK_DEPTH" }, +{ 0x0D39, "GL_MAX_TEXTURE_STACK_DEPTH" }, +{ 0x0D3A, "GL_MAX_VIEWPORT_DIMS" }, +{ 0x0D3B, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH" }, +{ 0x0D50, "GL_SUBPIXEL_BITS" }, +{ 0x0D51, "GL_INDEX_BITS" }, +{ 0x0D52, "GL_RED_BITS" }, +{ 0x0D53, "GL_GREEN_BITS" }, +{ 0x0D54, "GL_BLUE_BITS" }, +{ 0x0D55, "GL_ALPHA_BITS" }, +{ 0x0D56, "GL_DEPTH_BITS" }, +{ 0x0D57, "GL_STENCIL_BITS" }, +{ 0x0D58, "GL_ACCUM_RED_BITS" }, +{ 0x0D59, "GL_ACCUM_GREEN_BITS" }, +{ 0x0D5A, "GL_ACCUM_BLUE_BITS" }, +{ 0x0D5B, "GL_ACCUM_ALPHA_BITS" }, +{ 0x0D70, "GL_NAME_STACK_DEPTH" }, +{ 0x0D80, "GL_AUTO_NORMAL" }, +{ 0x0D90, "GL_MAP1_COLOR_4" }, +{ 0x0D91, "GL_MAP1_INDEX" }, +{ 0x0D92, "GL_MAP1_NORMAL" }, +{ 0x0D93, "GL_MAP1_TEXTURE_COORD_1" }, +{ 0x0D94, "GL_MAP1_TEXTURE_COORD_2" }, +{ 0x0D95, "GL_MAP1_TEXTURE_COORD_3" }, +{ 0x0D96, "GL_MAP1_TEXTURE_COORD_4" }, +{ 0x0D97, "GL_MAP1_VERTEX_3" }, +{ 0x0D98, "GL_MAP1_VERTEX_4" }, +{ 0x0DB0, "GL_MAP2_COLOR_4" }, +{ 0x0DB1, "GL_MAP2_INDEX" }, +{ 0x0DB2, "GL_MAP2_NORMAL" }, +{ 0x0DB3, "GL_MAP2_TEXTURE_COORD_1" }, +{ 0x0DB4, "GL_MAP2_TEXTURE_COORD_2" }, +{ 0x0DB5, "GL_MAP2_TEXTURE_COORD_3" }, +{ 0x0DB6, "GL_MAP2_TEXTURE_COORD_4" }, +{ 0x0DB7, "GL_MAP2_VERTEX_3" }, +{ 0x0DB8, "GL_MAP2_VERTEX_4" }, +{ 0x0DD0, "GL_MAP1_GRID_DOMAIN" }, +{ 0x0DD1, "GL_MAP1_GRID_SEGMENTS" }, +{ 0x0DD2, "GL_MAP2_GRID_DOMAIN" }, +{ 0x0DD3, "GL_MAP2_GRID_SEGMENTS" }, +{ 0x0DE0, "GL_TEXTURE_1D" }, +{ 0x0DE1, "GL_TEXTURE_2D" }, +{ 0x0DF0, "GL_FEEDBACK_BUFFER_POINTER" }, +{ 0x0DF1, "GL_FEEDBACK_BUFFER_SIZE" }, +{ 0x0DF2, "GL_FEEDBACK_BUFFER_TYPE" }, +{ 0x0DF3, "GL_SELECTION_BUFFER_POINTER" }, +{ 0x0DF4, "GL_SELECTION_BUFFER_SIZE" }, +{ 0x1000, "GL_TEXTURE_WIDTH" }, +{ 0x1001, "GL_TEXTURE_HEIGHT" }, +{ 0x1003, "GL_TEXTURE_INTERNAL_FORMAT" }, +{ 0x1004, "GL_TEXTURE_BORDER_COLOR" }, +{ 0x1005, "GL_TEXTURE_BORDER" }, +{ 0x1100, "GL_DONT_CARE" }, +{ 0x1101, "GL_FASTEST" }, +{ 0x1102, "GL_NICEST" }, +{ 0x1200, "GL_AMBIENT" }, +{ 0x1201, "GL_DIFFUSE" }, +{ 0x1202, "GL_SPECULAR" }, +{ 0x1203, "GL_POSITION" }, +{ 0x1204, "GL_SPOT_DIRECTION" }, +{ 0x1205, "GL_SPOT_EXPONENT" }, +{ 0x1206, "GL_SPOT_CUTOFF" }, +{ 0x1207, "GL_CONSTANT_ATTENUATION" }, +{ 0x1208, "GL_LINEAR_ATTENUATION" }, +{ 0x1209, "GL_QUADRATIC_ATTENUATION" }, +{ 0x1300, "GL_COMPILE" }, +{ 0x1301, "GL_COMPILE_AND_EXECUTE" }, +{ 0x1400, "GL_BYTE " }, +{ 0x1401, "GL_UBYTE" }, +{ 0x1402, "GL_SHORT" }, +{ 0x1403, "GL_USHRT" }, +{ 0x1404, "GL_INT " }, +{ 0x1405, "GL_UINT " }, +{ 0x1406, "GL_FLOAT" }, +{ 0x1407, "GL_2_BYTES" }, +{ 0x1408, "GL_3_BYTES" }, +{ 0x1409, "GL_4_BYTES" }, +{ 0x140A, "GL_DOUBLE" }, +{ 0x140B, "GL_HALF_FLOAT" }, +{ 0x1500, "GL_CLEAR" }, +{ 0x1501, "GL_AND" }, +{ 0x1502, "GL_AND_REVERSE" }, +{ 0x1503, "GL_COPY" }, +{ 0x1504, "GL_AND_INVERTED" }, +{ 0x1505, "GL_NOOP" }, +{ 0x1506, "GL_XOR" }, +{ 0x1507, "GL_OR" }, +{ 0x1508, "GL_NOR" }, +{ 0x1509, "GL_EQUIV" }, +{ 0x150A, "GL_INVERT" }, +{ 0x150B, "GL_OR_REVERSE" }, +{ 0x150C, "GL_COPY_INVERTED" }, +{ 0x150D, "GL_OR_INVERTED" }, +{ 0x150E, "GL_NAND" }, +{ 0x150F, "GL_SET" }, +{ 0x1600, "GL_EMISSION" }, +{ 0x1601, "GL_SHININESS" }, +{ 0x1602, "GL_AMBIENT_AND_DIFFUSE" }, +{ 0x1603, "GL_COLOR_INDEXES" }, +{ 0x1700, "GL_MODELVIEW" }, +{ 0x1700, "GL_MODELVIEW0_ARB" }, +{ 0x1701, "GL_PROJECTION" }, +{ 0x1702, "GL_TEXTURE" }, +{ 0x1800, "GL_COLOR" }, +{ 0x1801, "GL_DEPTH" }, +{ 0x1802, "GL_STENCIL" }, +{ 0x1900, "GL_COLOR_INDEX" }, +{ 0x1901, "GL_STENCIL_INDEX" }, +{ 0x1902, "GL_DEPTH_COMPONENT" }, +{ 0x1903, "GL_RED" }, +{ 0x1904, "GL_GREEN" }, +{ 0x1905, "GL_BLUE" }, +{ 0x1906, "GL_ALPHA" }, +{ 0x1907, "GL_RGB" }, +{ 0x1908, "GL_RGBA" }, +{ 0x1909, "GL_LUMINANCE" }, +{ 0x190A, "GL_LUMINANCE_ALPHA" }, +{ 0x1A00, "GL_BITMAP" }, +{ 0x1B00, "GL_POINT" }, +{ 0x1B01, "GL_LINE" }, +{ 0x1B02, "GL_FILL" }, +{ 0x1C00, "GL_RENDER" }, +{ 0x1C01, "GL_FEEDBACK" }, +{ 0x1C02, "GL_SELECT" }, +{ 0x1D00, "GL_FLAT" }, +{ 0x1D01, "GL_SMOOTH" }, +{ 0x1E00, "GL_KEEP" }, +{ 0x1E01, "GL_REPLACE" }, +{ 0x1E02, "GL_INCR" }, +{ 0x1E03, "GL_DECR" }, +{ 0x1F00, "GL_VENDOR" }, +{ 0x1F01, "GL_RENDERER" }, +{ 0x1F02, "GL_VERSION" }, +{ 0x1F03, "GL_EXTENSIONS" }, +{ 0x2000, "GL_S" }, +{ 0x2001, "GL_T" }, +{ 0x2002, "GL_R" }, +{ 0x2003, "GL_Q" }, +{ 0x2100, "GL_MODULATE" }, +{ 0x2101, "GL_DECAL" }, +{ 0x2200, "GL_TEXTURE_ENV_MODE" }, +{ 0x2201, "GL_TEXTURE_ENV_COLOR" }, +{ 0x2300, "GL_TEXTURE_ENV" }, +{ 0x2400, "GL_EYE_LINEAR" }, +{ 0x2401, "GL_OBJECT_LINEAR" }, +{ 0x2402, "GL_SPHERE_MAP" }, +{ 0x2500, "GL_TEXTURE_GEN_MODE" }, +{ 0x2501, "GL_OBJECT_PLANE" }, +{ 0x2502, "GL_EYE_PLANE" }, +{ 0x2600, "GL_NEAREST" }, +{ 0x2601, "GL_LINEAR" }, +{ 0x2700, "GL_NEAREST_MIPMAP_NEAREST" }, +{ 0x2701, "GL_LINEAR_MIPMAP_NEAREST" }, +{ 0x2702, "GL_NEAREST_MIPMAP_LINEAR" }, +{ 0x2703, "GL_LINEAR_MIPMAP_LINEAR" }, +{ 0x2800, "GL_TEXTURE_MAG_FILTER" }, +{ 0x2801, "GL_TEXTURE_MIN_FILTER" }, +{ 0x2802, "GL_TEXTURE_WRAP_S" }, +{ 0x2803, "GL_TEXTURE_WRAP_T" }, +{ 0x2900, "GL_CLAMP" }, +{ 0x2901, "GL_REPEAT" }, +{ 0x2A00, "GL_POLYGON_OFFSET_UNITS" }, +{ 0x2A01, "GL_POLYGON_OFFSET_POINT" }, +{ 0x2A02, "GL_POLYGON_OFFSET_LINE" }, +{ 0x2A10, "GL_R3_G3_B2" }, +{ 0x2A20, "GL_V2F" }, +{ 0x2A21, "GL_V3F" }, +{ 0x2A22, "GL_C4UB_V2F" }, +{ 0x2A23, "GL_C4UB_V3F" }, +{ 0x2A24, "GL_C3F_V3F" }, +{ 0x2A25, "GL_N3F_V3F" }, +{ 0x2A26, "GL_C4F_N3F_V3F" }, +{ 0x2A27, "GL_T2F_V3F" }, +{ 0x2A28, "GL_T4F_V4F" }, +{ 0x2A29, "GL_T2F_C4UB_V3F" }, +{ 0x2A2A, "GL_T2F_C3F_V3F" }, +{ 0x2A2B, "GL_T2F_N3F_V3F" }, +{ 0x2A2C, "GL_T2F_C4F_N3F_V3F" }, +{ 0x2A2D, "GL_T4F_C4F_N3F_V4F" }, +{ 0x3000, "GL_CLIP_PLANE0" }, +{ 0x3001, "GL_CLIP_PLANE1" }, +{ 0x3002, "GL_CLIP_PLANE2" }, +{ 0x3003, "GL_CLIP_PLANE3" }, +{ 0x3004, "GL_CLIP_PLANE4" }, +{ 0x3005, "GL_CLIP_PLANE5" }, +{ 0x4000, "GL_LIGHT0" }, +{ 0x4001, "GL_LIGHT1" }, +{ 0x4002, "GL_LIGHT2" }, +{ 0x4003, "GL_LIGHT3" }, +{ 0x4004, "GL_LIGHT4" }, +{ 0x4005, "GL_LIGHT5" }, +{ 0x4006, "GL_LIGHT6" }, +{ 0x4007, "GL_LIGHT7" }, +{ 0x8000, "GL_ABGR_EXT" }, +{ 0x8001, "GL_CONSTANT_COLOR" }, +{ 0x8002, "GL_ONE_MINUS_CONSTANT_COLOR" }, +{ 0x8003, "GL_CONSTANT_ALPHA" }, +{ 0x8004, "GL_ONE_MINUS_CONSTANT_ALPHA" }, +{ 0x8005, "GL_BLEND_COLOR" }, +{ 0x8006, "GL_FUNC_ADD" }, +{ 0x8007, "GL_MIN" }, +{ 0x8008, "GL_MAX" }, +{ 0x8009, "GL_BLEND_EQUATION_RGB" }, +{ 0x8009, "GL_BLEND_EQUATION" }, +{ 0x800A, "GL_FUNC_SUBTRACT" }, +{ 0x800B, "GL_FUNC_REVERSE_SUBTRACT" }, +{ 0x8010, "GL_CONVOLUTION_1D" }, +{ 0x8011, "GL_CONVOLUTION_2D" }, +{ 0x8012, "GL_SEPARABLE_2D" }, +{ 0x8013, "GL_CONVOLUTION_BORDER_MODE" }, +{ 0x8014, "GL_CONVOLUTION_FILTER_SCALE" }, +{ 0x8015, "GL_CONVOLUTION_FILTER_BIAS" }, +{ 0x8016, "GL_REDUCE" }, +{ 0x8017, "GL_CONVOLUTION_FORMAT" }, +{ 0x8018, "GL_CONVOLUTION_WIDTH" }, +{ 0x8019, "GL_CONVOLUTION_HEIGHT" }, +{ 0x801A, "GL_MAX_CONVOLUTION_WIDTH" }, +{ 0x801B, "GL_MAX_CONVOLUTION_HEIGHT" }, +{ 0x801C, "GL_POST_CONVOLUTION_RED_SCALE" }, +{ 0x801D, "GL_POST_CONVOLUTION_GREEN_SCALE" }, +{ 0x801E, "GL_POST_CONVOLUTION_BLUE_SCALE" }, +{ 0x801F, "GL_POST_CONVOLUTION_ALPHA_SCALE" }, +{ 0x8020, "GL_POST_CONVOLUTION_RED_BIAS" }, +{ 0x8021, "GL_POST_CONVOLUTION_GREEN_BIAS" }, +{ 0x8022, "GL_POST_CONVOLUTION_BLUE_BIAS" }, +{ 0x8023, "GL_POST_CONVOLUTION_ALPHA_BIAS" }, +{ 0x8024, "GL_HISTOGRAM" }, +{ 0x8025, "GL_PROXY_HISTOGRAM" }, +{ 0x8026, "GL_HISTOGRAM_WIDTH" }, +{ 0x8027, "GL_HISTOGRAM_FORMAT" }, +{ 0x8028, "GL_HISTOGRAM_RED_SIZE" }, +{ 0x8029, "GL_HISTOGRAM_GREEN_SIZE" }, +{ 0x802A, "GL_HISTOGRAM_BLUE_SIZE" }, +{ 0x802B, "GL_HISTOGRAM_ALPHA_SIZE" }, +{ 0x802C, "GL_HISTOGRAM_LUMINANCE_SIZE" }, +{ 0x802D, "GL_HISTOGRAM_SINK" }, +{ 0x802E, "GL_MINMAX" }, +{ 0x802F, "GL_MINMAX_FORMAT" }, +{ 0x8030, "GL_MINMAX_SINK" }, +{ 0x8031, "GL_TABLE_TOO_LARGE" }, +{ 0x8032, "GL_UNSIGNED_BYTE_3_3_2" }, +{ 0x8033, "GL_UNSIGNED_SHORT_4_4_4_4" }, +{ 0x8034, "GL_UNSIGNED_SHORT_5_5_5_1" }, +{ 0x8035, "GL_UNSIGNED_INT_8_8_8_8" }, +{ 0x8036, "GL_UNSIGNED_INT_10_10_10_2" }, +{ 0x8037, "GL_POLYGON_OFFSET_FILL" }, +{ 0x8038, "GL_POLYGON_OFFSET_FACTOR" }, +{ 0x803A, "GL_RESCALE_NORMAL" }, +{ 0x803B, "GL_ALPHA4" }, +{ 0x803C, "GL_ALPHA8" }, +{ 0x803D, "GL_ALPHA12" }, +{ 0x803E, "GL_ALPHA16" }, +{ 0x803F, "GL_LUMINANCE4" }, +{ 0x8040, "GL_LUMINANCE8" }, +{ 0x8041, "GL_LUMINANCE12" }, +{ 0x8042, "GL_LUMINANCE16" }, +{ 0x8043, "GL_LUMINANCE4_ALPHA4" }, +{ 0x8044, "GL_LUMINANCE6_ALPHA2" }, +{ 0x8045, "GL_LUMINANCE8_ALPHA8" }, +{ 0x8046, "GL_LUMINANCE12_ALPHA4" }, +{ 0x8047, "GL_LUMINANCE12_ALPHA12" }, +{ 0x8048, "GL_LUMINANCE16_ALPHA16" }, +{ 0x8049, "GL_INTENSITY" }, +{ 0x804A, "GL_INTENSITY4" }, +{ 0x804B, "GL_INTENSITY8" }, +{ 0x804C, "GL_INTENSITY12" }, +{ 0x804D, "GL_INTENSITY16" }, +{ 0x804F, "GL_RGB4" }, +{ 0x8050, "GL_RGB5" }, +{ 0x8051, "GL_RGB8" }, +{ 0x8052, "GL_RGB10" }, +{ 0x8053, "GL_RGB12" }, +{ 0x8054, "GL_RGB16" }, +{ 0x8055, "GL_RGBA2" }, +{ 0x8056, "GL_RGBA4" }, +{ 0x8057, "GL_RGB5_A1" }, +{ 0x8058, "GL_RGBA8" }, +{ 0x8059, "GL_RGB10_A2" }, +{ 0x805A, "GL_RGBA12" }, +{ 0x805B, "GL_RGBA16" }, +{ 0x805C, "GL_TEXTURE_RED_SIZE" }, +{ 0x805D, "GL_TEXTURE_GREEN_SIZE" }, +{ 0x805E, "GL_TEXTURE_BLUE_SIZE" }, +{ 0x805F, "GL_TEXTURE_ALPHA_SIZE" }, +{ 0x8060, "GL_TEXTURE_LUMINANCE_SIZE" }, +{ 0x8061, "GL_TEXTURE_INTENSITY_SIZE" }, +{ 0x8063, "GL_PROXY_TEXTURE_1D" }, +{ 0x8064, "GL_PROXY_TEXTURE_2D" }, +{ 0x8066, "GL_TEXTURE_PRIORITY" }, +{ 0x8067, "GL_TEXTURE_RESIDENT" }, +{ 0x8068, "GL_TEXTURE_BINDING_1D" }, +{ 0x8069, "GL_TEXTURE_BINDING_2D" }, +{ 0x806A, "GL_TEXTURE_BINDING_3D" }, +{ 0x806B, "GL_PACK_SKIP_IMAGES" }, +{ 0x806C, "GL_PACK_IMAGE_HEIGHT" }, +{ 0x806D, "GL_UNPACK_SKIP_IMAGES" }, +{ 0x806E, "GL_UNPACK_IMAGE_HEIGHT" }, +{ 0x806F, "GL_TEXTURE_3D" }, +{ 0x8070, "GL_PROXY_TEXTURE_3D" }, +{ 0x8071, "GL_TEXTURE_DEPTH" }, +{ 0x8072, "GL_TEXTURE_WRAP_R" }, +{ 0x8073, "GL_MAX_3D_TEXTURE_SIZE" }, +{ 0x8074, "GL_VERTEX_ARRAY" }, +{ 0x8075, "GL_NORMAL_ARRAY" }, +{ 0x8076, "GL_COLOR_ARRAY" }, +{ 0x8077, "GL_INDEX_ARRAY" }, +{ 0x8078, "GL_TEXTURE_COORD_ARRAY" }, +{ 0x8079, "GL_EDGE_FLAG_ARRAY" }, +{ 0x807A, "GL_VERTEX_ARRAY_SIZE" }, +{ 0x807B, "GL_VERTEX_ARRAY_TYPE" }, +{ 0x807C, "GL_VERTEX_ARRAY_STRIDE" }, +{ 0x807E, "GL_NORMAL_ARRAY_TYPE" }, +{ 0x807F, "GL_NORMAL_ARRAY_STRIDE" }, +{ 0x8081, "GL_COLOR_ARRAY_SIZE" }, +{ 0x8082, "GL_COLOR_ARRAY_TYPE" }, +{ 0x8083, "GL_COLOR_ARRAY_STRIDE" }, +{ 0x8085, "GL_INDEX_ARRAY_TYPE" }, +{ 0x8086, "GL_INDEX_ARRAY_STRIDE" }, +{ 0x8088, "GL_TEXTURE_COORD_ARRAY_SIZE" }, +{ 0x8089, "GL_TEXTURE_COORD_ARRAY_TYPE" }, +{ 0x808A, "GL_TEXTURE_COORD_ARRAY_STRIDE" }, +{ 0x808C, "GL_EDGE_FLAG_ARRAY_STRIDE" }, +{ 0x808E, "GL_VERTEX_ARRAY_POINTER" }, +{ 0x808F, "GL_NORMAL_ARRAY_POINTER" }, +{ 0x8090, "GL_COLOR_ARRAY_POINTER" }, +{ 0x8091, "GL_INDEX_ARRAY_POINTER" }, +{ 0x8092, "GL_TEXTURE_COORD_ARRAY_POINTER" }, +{ 0x8093, "GL_EDGE_FLAG_ARRAY_POINTER" }, +{ 0x809D, "GL_MULTISAMPLE_ARB" }, +{ 0x809D, "GL_MULTISAMPLE" }, +{ 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE_ARB" }, +{ 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE" }, +{ 0x809F, "GL_SAMPLE_ALPHA_TO_ONE_ARB" }, +{ 0x809F, "GL_SAMPLE_ALPHA_TO_ONE" }, +{ 0x80A0, "GL_SAMPLE_COVERAGE_ARB" }, +{ 0x80A0, "GL_SAMPLE_COVERAGE" }, +{ 0x80A0, "GL_SAMPLE_MASK_EXT" }, +{ 0x80A1, "GL_1PASS_EXT" }, +{ 0x80A2, "GL_2PASS_0_EXT" }, +{ 0x80A3, "GL_2PASS_1_EXT" }, +{ 0x80A4, "GL_4PASS_0_EXT" }, +{ 0x80A5, "GL_4PASS_1_EXT" }, +{ 0x80A6, "GL_4PASS_2_EXT" }, +{ 0x80A7, "GL_4PASS_3_EXT" }, +{ 0x80A8, "GL_SAMPLE_BUFFERS" }, +{ 0x80A9, "GL_SAMPLES" }, +{ 0x80AA, "GL_SAMPLE_COVERAGE_VALUE" }, +{ 0x80AB, "GL_SAMPLE_COVERAGE_INVERT" }, +{ 0x80AC, "GL_SAMPLE_PATTERN_EXT" }, +{ 0x80B1, "GL_COLOR_MATRIX" }, +{ 0x80B2, "GL_COLOR_MATRIX_STACK_DEPTH" }, +{ 0x80B3, "GL_MAX_COLOR_MATRIX_STACK_DEPTH" }, +{ 0x80B4, "GL_POST_COLOR_MATRIX_RED_SCALE" }, +{ 0x80B5, "GL_POST_COLOR_MATRIX_GREEN_SCALE" }, +{ 0x80B6, "GL_POST_COLOR_MATRIX_BLUE_SCALE" }, +{ 0x80B7, "GL_POST_COLOR_MATRIX_ALPHA_SCALE" }, +{ 0x80B8, "GL_POST_COLOR_MATRIX_RED_BIAS" }, +{ 0x80B9, "GL_POST_COLOR_MATRIX_GREEN_BIAS" }, +{ 0x80BA, "GL_POST_COLOR_MATRIX_BLUE_BIAS" }, +{ 0x80BB, "GL_POST_COLOR_MATRIX_ALPHA_BIAS" }, +{ 0x80BF, "GL_TEXTURE_COMPARE_FAIL_VALUE_ARB" }, +{ 0x80C8, "GL_BLEND_DST_RGB" }, +{ 0x80C9, "GL_BLEND_SRC_RGB" }, +{ 0x80CA, "GL_BLEND_DST_ALPHA" }, +{ 0x80CB, "GL_BLEND_SRC_ALPHA" }, +{ 0x80CC, "GL_422_EXT" }, +{ 0x80CD, "GL_422_REV_EXT" }, +{ 0x80CE, "GL_422_AVERAGE_EXT" }, +{ 0x80CF, "GL_422_REV_AVERAGE_EXT" }, +{ 0x80D0, "GL_COLOR_TABLE" }, +{ 0x80D1, "GL_POST_CONVOLUTION_COLOR_TABLE" }, +{ 0x80D2, "GL_POST_COLOR_MATRIX_COLOR_TABLE" }, +{ 0x80D3, "GL_PROXY_COLOR_TABLE" }, +{ 0x80D4, "GL_PROXY_POST_CONVOLUTION_COLOR_TABLE" }, +{ 0x80D5, "GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE" }, +{ 0x80D6, "GL_COLOR_TABLE_SCALE" }, +{ 0x80D7, "GL_COLOR_TABLE_BIAS" }, +{ 0x80D8, "GL_COLOR_TABLE_FORMAT" }, +{ 0x80D9, "GL_COLOR_TABLE_WIDTH" }, +{ 0x80DA, "GL_COLOR_TABLE_RED_SIZE" }, +{ 0x80DB, "GL_COLOR_TABLE_GREEN_SIZE" }, +{ 0x80DC, "GL_COLOR_TABLE_BLUE_SIZE" }, +{ 0x80DD, "GL_COLOR_TABLE_ALPHA_SIZE" }, +{ 0x80DE, "GL_COLOR_TABLE_LUMINANCE_SIZE" }, +{ 0x80DF, "GL_COLOR_TABLE_INTENSITY_SIZE" }, +{ 0x80E0, "GL_BGR_EXT" }, +{ 0x80E0, "GL_BGR" }, +{ 0x80E1, "GL_BGRA_EXT" }, +{ 0x80E1, "GL_BGRA" }, +{ 0x80E1, "GL_BGRA" }, +{ 0x80E2, "GL_COLOR_INDEX1_EXT" }, +{ 0x80E3, "GL_COLOR_INDEX2_EXT" }, +{ 0x80E4, "GL_COLOR_INDEX4_EXT" }, +{ 0x80E5, "GL_COLOR_INDEX8_EXT" }, +{ 0x80E6, "GL_COLOR_INDEX12_EXT" }, +{ 0x80E7, "GL_COLOR_INDEX16_EXT" }, +{ 0x80E8, "GL_MAX_ELEMENTS_VERTICES_EXT" }, +{ 0x80E8, "GL_MAX_ELEMENTS_VERTICES" }, +{ 0x80E9, "GL_MAX_ELEMENTS_INDICES_EXT" }, +{ 0x80E9, "GL_MAX_ELEMENTS_INDICES" }, +{ 0x80ED, "GL_TEXTURE_INDEX_SIZE_EXT" }, +{ 0x80F0, "GL_CLIP_VOLUME_CLIPPING_HINT_EXT" }, +{ 0x8126, "GL_POINT_SIZE_MIN_ARB" }, +{ 0x8126, "GL_POINT_SIZE_MIN" }, +{ 0x8127, "GL_POINT_SIZE_MAX_ARB" }, +{ 0x8127, "GL_POINT_SIZE_MAX" }, +{ 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE_ARB" }, +{ 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE" }, +{ 0x8129, "GL_POINT_DISTANCE_ATTENUATION_ARB" }, +{ 0x8129, "GL_POINT_DISTANCE_ATTENUATION" }, +{ 0x812D, "GL_CLAMP_TO_BORDER_ARB" }, +{ 0x812D, "GL_CLAMP_TO_BORDER" }, +{ 0x812F, "GL_CLAMP_TO_EDGE" }, +{ 0x813A, "GL_TEXTURE_MIN_LOD" }, +{ 0x813B, "GL_TEXTURE_MAX_LOD" }, +{ 0x813C, "GL_TEXTURE_BASE_LEVEL" }, +{ 0x813D, "GL_TEXTURE_MAX_LEVEL" }, +{ 0x8151, "GL_CONSTANT_BORDER" }, +{ 0x8153, "GL_REPLICATE_BORDER" }, +{ 0x8154, "GL_CONVOLUTION_BORDER_COLOR" }, +{ 0x8191, "GL_GENERATE_MIPMAP" }, +{ 0x8192, "GL_GENERATE_MIPMAP_HINT" }, +{ 0x81A5, "GL_DEPTH_COMPONENT16_ARB" }, +{ 0x81A5, "GL_DEPTH_COMPONENT16" }, +{ 0x81A6, "GL_DEPTH_COMPONENT24_ARB" }, +{ 0x81A6, "GL_DEPTH_COMPONENT24" }, +{ 0x81A7, "GL_DEPTH_COMPONENT32_ARB" }, +{ 0x81A7, "GL_DEPTH_COMPONENT32" }, +{ 0x81A8, "GL_ARRAY_ELEMENT_LOCK_FIRST_EXT" }, +{ 0x81A9, "GL_ARRAY_ELEMENT_LOCK_COUNT_EXT" }, +{ 0x81AA, "GL_CULL_VERTEX_EXT" }, +{ 0x81AB, "GL_CULL_VERTEX_EYE_POSITION_EXT" }, +{ 0x81AC, "GL_CULL_VERTEX_OBJECT_POSITION_EXT" }, +{ 0x81AD, "GL_IUI_V2F_EXT" }, +{ 0x81AE, "GL_IUI_V3F_EXT" }, +{ 0x81AF, "GL_IUI_N3F_V2F_EXT" }, +{ 0x81B0, "GL_IUI_N3F_V3F_EXT" }, +{ 0x81B1, "GL_T2F_IUI_V2F_EXT" }, +{ 0x81B2, "GL_T2F_IUI_V3F_EXT" }, +{ 0x81B3, "GL_T2F_IUI_N3F_V2F_EXT" }, +{ 0x81B4, "GL_T2F_IUI_N3F_V3F_EXT" }, +{ 0x81B5, "GL_INDEX_TEST_EXT" }, +{ 0x81B6, "GL_INDEX_TEST_FUNC_EXT" }, +{ 0x81B7, "GL_INDEX_TEST_REF_EXT" }, +{ 0x81B8, "GL_INDEX_MATERIAL_EXT" }, +{ 0x81B9, "GL_INDEX_MATERIAL_PARAMETER_EXT" }, +{ 0x81BA, "GL_INDEX_MATERIAL_FACE_EXT" }, +{ 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL_EXT" }, +{ 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL" }, +{ 0x81F9, "GL_SINGLE_COLOR_EXT" }, +{ 0x81F9, "GL_SINGLE_COLOR" }, +{ 0x81FA, "GL_SEPARATE_SPECULAR_COLOR_EXT" }, +{ 0x81FA, "GL_SEPARATE_SPECULAR_COLOR" }, +{ 0x81FB, "GL_SHARED_TEXTURE_PALETTE_EXT" }, +{ 0x8210, "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING" }, +{ 0x8211, "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE" }, +{ 0x8212, "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE" }, +{ 0x8213, "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE" }, +{ 0x8214, "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE" }, +{ 0x8215, "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE" }, +{ 0x8216, "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE" }, +{ 0x8217, "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE" }, +{ 0x8218, "GL_FRAMEBUFFER_DEFAULT" }, +{ 0x8219, "GL_FRAMEBUFFER_UNDEFINED" }, +{ 0x821A, "GL_DEPTH_STENCIL_ATTACHMENT" }, +{ 0x8225, "GL_COMPRESSED_RED" }, +{ 0x8226, "GL_COMPRESSED_RG" }, +{ 0x8227, "GL_RG" }, +{ 0x8228, "GL_RG_INTEGER" }, +{ 0x8229, "GL_R8" }, +{ 0x822A, "GL_R16" }, +{ 0x822B, "GL_RG8" }, +{ 0x822C, "GL_RG16" }, +{ 0x822D, "GL_R16F" }, +{ 0x822E, "GL_R32F" }, +{ 0x822F, "GL_RG16F" }, +{ 0x8230, "GL_RG32F" }, +{ 0x8231, "GL_R8I" }, +{ 0x8232, "GL_R8UI" }, +{ 0x8233, "GL_R16I" }, +{ 0x8234, "GL_R16UI" }, +{ 0x8235, "GL_R32I" }, +{ 0x8236, "GL_R32UI" }, +{ 0x8237, "GL_RG8I" }, +{ 0x8238, "GL_RG8UI" }, +{ 0x8239, "GL_RG16I" }, +{ 0x823A, "GL_RG16UI" }, +{ 0x823B, "GL_RG32I" }, +{ 0x823C, "GL_RG32UI" }, +{ 0x8330, "GL_PIXEL_TRANSFORM_2D_EXT" }, +{ 0x8331, "GL_PIXEL_MAG_FILTER_EXT" }, +{ 0x8332, "GL_PIXEL_MIN_FILTER_EXT" }, +{ 0x8333, "GL_PIXEL_CUBIC_WEIGHT_EXT" }, +{ 0x8334, "GL_CUBIC_EXT" }, +{ 0x8335, "GL_AVERAGE_EXT" }, +{ 0x8336, "GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" }, +{ 0x8337, "GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" }, +{ 0x8338, "GL_PIXEL_TRANSFORM_2D_MATRIX_EXT" }, +{ 0x8349, "GL_FRAGMENT_MATERIAL_EXT" }, +{ 0x834A, "GL_FRAGMENT_NORMAL_EXT" }, +{ 0x834C, "GL_FRAGMENT_COLOR_EXT" }, +{ 0x834D, "GL_ATTENUATION_EXT" }, +{ 0x834E, "GL_SHADOW_ATTENUATION_EXT" }, +{ 0x834F, "GL_TEXTURE_APPLICATION_MODE_EXT" }, +{ 0x8350, "GL_TEXTURE_LIGHT_EXT" }, +{ 0x8351, "GL_TEXTURE_MATERIAL_FACE_EXT" }, +{ 0x8352, "GL_TEXTURE_MATERIAL_PARAMETER_EXT" }, +{ 0x8362, "GL_UNSIGNED_BYTE_2_3_3_REV" }, +{ 0x8363, "GL_UNSIGNED_SHORT_5_6_5" }, +{ 0x8364, "GL_UNSIGNED_SHORT_5_6_5_REV" }, +{ 0x8365, "GL_UNSIGNED_SHORT_4_4_4_4_REV" }, +{ 0x8366, "GL_UNSIGNED_SHORT_1_5_5_5_REV" }, +{ 0x8367, "GL_UNSIGNED_INT_8_8_8_8_REV" }, +{ 0x8368, "GL_UNSIGNED_INT_2_10_10_10_REV" }, +{ 0x8370, "GL_MIRRORED_REPEAT_ARB" }, +{ 0x8370, "GL_MIRRORED_REPEAT" }, +{ 0x83F0, "GL_COMPRESSED_RGB_S3TC_DXT1_EXT" }, +{ 0x83F1, "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT" }, +{ 0x83F2, "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT" }, +{ 0x83F3, "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT" }, +{ 0x8439, "GL_TANGENT_ARRAY_EXT" }, +{ 0x843A, "GL_BINORMAL_ARRAY_EXT" }, +{ 0x843B, "GL_CURRENT_TANGENT_EXT" }, +{ 0x843C, "GL_CURRENT_BINORMAL_EXT" }, +{ 0x843E, "GL_TANGENT_ARRAY_TYPE_EXT" }, +{ 0x843F, "GL_TANGENT_ARRAY_STRIDE_EXT" }, +{ 0x8440, "GL_BINORMAL_ARRAY_TYPE_EXT" }, +{ 0x8441, "GL_BINORMAL_ARRAY_STRIDE_EXT" }, +{ 0x8442, "GL_TANGENT_ARRAY_POINTER_EXT" }, +{ 0x8443, "GL_BINORMAL_ARRAY_POINTER_EXT" }, +{ 0x8444, "GL_MAP1_TANGENT_EXT" }, +{ 0x8445, "GL_MAP2_TANGENT_EXT" }, +{ 0x8446, "GL_MAP1_BINORMAL_EXT" }, +{ 0x8447, "GL_MAP2_BINORMAL_EXT" }, +{ 0x8450, "GL_FOG_COORD_SRC" }, +{ 0x8450, "GL_FOG_COORDINATE_SOURCE_EXT" }, +{ 0x8450, "GL_FOG_COORDINATE_SOURCE" }, +{ 0x8451, "GL_FOG_COORD" }, +{ 0x8451, "GL_FOG_COORDINATE_EXT" }, +{ 0x8451, "GL_FOG_COORDINATE" }, +{ 0x8452, "GL_FRAGMENT_DEPTH_EXT" }, +{ 0x8452, "GL_FRAGMENT_DEPTH" }, +{ 0x8453 , "GL_CURRENT_FOG_COORD" }, +{ 0x8453 , "GL_CURRENT_FOG_COORDINATE" }, +{ 0x8453, "GL_CURRENT_FOG_COORDINATE_EXT" }, +{ 0x8454, "GL_FOG_COORD_ARRAY_TYPE" }, +{ 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE_EXT" }, +{ 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE" }, +{ 0x8455, "GL_FOG_COORD_ARRAY_STRIDE" }, +{ 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE_EXT" }, +{ 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE" }, +{ 0x8456, "GL_FOG_COORD_ARRAY_POINTER" }, +{ 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER_EXT" }, +{ 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER" }, +{ 0x8457, "GL_FOG_COORD_ARRAY" }, +{ 0x8457, "GL_FOG_COORDINATE_ARRAY_EXT" }, +{ 0x8457, "GL_FOG_COORDINATE_ARRAY" }, +{ 0x8458, "GL_COLOR_SUM_ARB" }, +{ 0x8458, "GL_COLOR_SUM_EXT" }, +{ 0x8458, "GL_COLOR_SUM" }, +{ 0x8459, "GL_CURRENT_SECONDARY_COLOR_EXT" }, +{ 0x8459, "GL_CURRENT_SECONDARY_COLOR" }, +{ 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE_EXT" }, +{ 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE" }, +{ 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE_EXT" }, +{ 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE" }, +{ 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT" }, +{ 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE" }, +{ 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER_EXT" }, +{ 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER" }, +{ 0x845E, "GL_SECONDARY_COLOR_ARRAY_EXT" }, +{ 0x845E, "GL_SECONDARY_COLOR_ARRAY" }, +{ 0x845F, "GL_CURRENT_RASTER_SECONDARY_COLOR" }, +{ 0x846D, "GL_ALIASED_POINT_SIZE_RANGE" }, +{ 0x846E, "GL_ALIASED_LINE_WIDTH_RANGE" }, +{ 0x84C0, "GL_TEXTURE0" }, +{ 0x84C1, "GL_TEXTURE1" }, +{ 0x84C2, "GL_TEXTURE2" }, +{ 0x84C3, "GL_TEXTURE3" }, +{ 0x84C4, "GL_TEXTURE4" }, +{ 0x84C5, "GL_TEXTURE5" }, +{ 0x84C6, "GL_TEXTURE6" }, +{ 0x84C7, "GL_TEXTURE7" }, +{ 0x84C8, "GL_TEXTURE8" }, +{ 0x84C9, "GL_TEXTURE9" }, +{ 0x84CA, "GL_TEXTURE10" }, +{ 0x84CB, "GL_TEXTURE11" }, +{ 0x84CC, "GL_TEXTURE12" }, +{ 0x84CD, "GL_TEXTURE13" }, +{ 0x84CE, "GL_TEXTURE14" }, +{ 0x84CF, "GL_TEXTURE15" }, +{ 0x84D0, "GL_TEXTURE16" }, +{ 0x84D1, "GL_TEXTURE17" }, +{ 0x84D2, "GL_TEXTURE18" }, +{ 0x84D3, "GL_TEXTURE19" }, +{ 0x84D4, "GL_TEXTURE20" }, +{ 0x84D5, "GL_TEXTURE21" }, +{ 0x84D6, "GL_TEXTURE22" }, +{ 0x84D7, "GL_TEXTURE23" }, +{ 0x84D8, "GL_TEXTURE24" }, +{ 0x84D9, "GL_TEXTURE25" }, +{ 0x84DA, "GL_TEXTURE26" }, +{ 0x84DB, "GL_TEXTURE27" }, +{ 0x84DC, "GL_TEXTURE28" }, +{ 0x84DD, "GL_TEXTURE29" }, +{ 0x84DE, "GL_TEXTURE30" }, +{ 0x84DF, "GL_TEXTURE31" }, +{ 0x84E0, "GL_ACTIVE_TEXTURE" }, +{ 0x84E1, "GL_CLIENT_ACTIVE_TEXTURE" }, +{ 0x84E2, "GL_MAX_TEXTURE_UNITS" }, +{ 0x84E3, "GL_TRANSPOSE_MODELVIEW_MATRIX" }, +{ 0x84E4, "GL_TRANSPOSE_PROJECTION_MATRIX" }, +{ 0x84E5, "GL_TRANSPOSE_TEXTURE_MATRIX" }, +{ 0x84E6, "GL_TRANSPOSE_COLOR_MATRIX" }, +{ 0x84E7, "GL_SUBTRACT" }, +{ 0x84E8, "GL_MAX_RENDERBUFFER_SIZE" }, +{ 0x84E9, "GL_COMPRESSED_ALPHA" }, +{ 0x84EA, "GL_COMPRESSED_LUMINANCE" }, +{ 0x84EB, "GL_COMPRESSED_LUMINANCE_ALPHA" }, +{ 0x84EC, "GL_COMPRESSED_INTENSITY" }, +{ 0x84ED, "GL_COMPRESSED_RGB" }, +{ 0x84EE, "GL_COMPRESSED_RGBA" }, +{ 0x84EF, "GL_TEXTURE_COMPRESSION_HINT" }, +{ 0x84F5, "GL_TEXTURE_RECTANGLE_EXT" }, +{ 0x84F6, "GL_TEXTURE_BINDING_RECTANGLE_EXT" }, +{ 0x84F7, "GL_PROXY_TEXTURE_RECTANGLE_EXT" }, +{ 0x84F8, "GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT" }, +{ 0x84F9, "GL_DEPTH_STENCIL" }, +{ 0x84FA, "GL_UNSIGNED_INT_24_8" }, +{ 0x84FD, "GL_MAX_TEXTURE_LOD_BIAS" }, +{ 0x84FE, "GL_TEXTURE_MAX_ANISOTROPY_EXT" }, +{ 0x84FF, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT" }, +{ 0x8500, "GL_TEXTURE_FILTER_CONTROL" }, +{ 0x8501, "GL_TEXTURE_LOD_BIAS" }, +{ 0x8502, "GL_MODELVIEW1_STACK_DEPTH_EXT" }, +{ 0x8506, "GL_MODELVIEW_MATRIX1_EXT" }, +{ 0x8507, "GL_INCR_WRAP" }, +{ 0x8508, "GL_DECR_WRAP" }, +{ 0x8509, "GL_VERTEX_WEIGHTING_EXT" }, +{ 0x850A, "GL_MODELVIEW1_ARB" }, +{ 0x850B, "GL_CURRENT_VERTEX_WEIGHT_EXT" }, +{ 0x850C, "GL_VERTEX_WEIGHT_ARRAY_EXT" }, +{ 0x850D, "GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT" }, +{ 0x850E, "GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT" }, +{ 0x850F, "GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT" }, +{ 0x8510, "GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT" }, +{ 0x8511, "GL_NORMAL_MAP_ARB" }, +{ 0x8511, "GL_NORMAL_MAP_EXT" }, +{ 0x8511, "GL_NORMAL_MAP" }, +{ 0x8512, "GL_REFLECTION_MAP_ARB" }, +{ 0x8512, "GL_REFLECTION_MAP_EXT" }, +{ 0x8512, "GL_REFLECTION_MAP" }, +{ 0x8513, "GL_TEXTURE_CUBE_MAP_ARB" }, +{ 0x8513, "GL_TEXTURE_CUBE_MAP_EXT" }, +{ 0x8513, "GL_TEXTURE_CUBE_MAP" }, +{ 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_ARB" }, +{ 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_EXT" }, +{ 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP" }, +{ 0x8515, "GL_TEXTURE_CUBE_MAP_POSITIVE_X" }, +{ 0x8516, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X" }, +{ 0x8517, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y" }, +{ 0x8518, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y" }, +{ 0x8519, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z" }, +{ 0x851A, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" }, +{ 0x851B, "GL_PROXY_TEXTURE_CUBE_MAP" }, +{ 0x851C, "GL_MAX_CUBE_MAP_TEXTURE_SIZE" }, +{ 0x851D, "GL_VERTEX_ARRAY_RANGE_APPLE" }, +{ 0x851E, "GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE" }, +{ 0x851F, "GL_VERTEX_ARRAY_STORAGE_HINT_APPLE" }, +{ 0x8520, "GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE" }, +{ 0x8521, "GL_VERTEX_ARRAY_RANGE_POINTER_APPLE" }, +{ 0x8570, "GL_COMBINE_ARB" }, +{ 0x8570, "GL_COMBINE_EXT" }, +{ 0x8570, "GL_COMBINE" }, +{ 0x8571, "GL_COMBINE_RGB_ARB" }, +{ 0x8571, "GL_COMBINE_RGB_EXT" }, +{ 0x8571, "GL_COMBINE_RGB" }, +{ 0x8572, "GL_COMBINE_ALPHA_ARB" }, +{ 0x8572, "GL_COMBINE_ALPHA_EXT" }, +{ 0x8572, "GL_COMBINE_ALPHA" }, +{ 0x8573, "GL_RGB_SCALE_ARB" }, +{ 0x8573, "GL_RGB_SCALE_EXT" }, +{ 0x8573, "GL_RGB_SCALE" }, +{ 0x8574, "GL_ADD_SIGNED_ARB" }, +{ 0x8574, "GL_ADD_SIGNED_EXT" }, +{ 0x8574, "GL_ADD_SIGNED" }, +{ 0x8575, "GL_INTERPOLATE_ARB" }, +{ 0x8575, "GL_INTERPOLATE_EXT" }, +{ 0x8575, "GL_INTERPOLATE" }, +{ 0x8576, "GL_CONSTANT_ARB" }, +{ 0x8576, "GL_CONSTANT_EXT" }, +{ 0x8576, "GL_CONSTANT" }, +{ 0x8577, "GL_PRIMARY_COLOR_ARB" }, +{ 0x8577, "GL_PRIMARY_COLOR_EXT" }, +{ 0x8577, "GL_PRIMARY_COLOR" }, +{ 0x8578, "GL_PREVIOUS_ARB" }, +{ 0x8578, "GL_PREVIOUS_EXT" }, +{ 0x8578, "GL_PREVIOUS" }, +{ 0x8580, "GL_SOURCE0_RGB_ARB" }, +{ 0x8580, "GL_SOURCE0_RGB_EXT" }, +{ 0x8580, "GL_SOURCE0_RGB" }, +{ 0x8580, "GL_SRC0_RGB" }, +{ 0x8581, "GL_SOURCE1_RGB_ARB" }, +{ 0x8581, "GL_SOURCE1_RGB_EXT" }, +{ 0x8581, "GL_SOURCE1_RGB" }, +{ 0x8581, "GL_SRC1_RGB" }, +{ 0x8582, "GL_SOURCE2_RGB_ARB" }, +{ 0x8582, "GL_SOURCE2_RGB_EXT" }, +{ 0x8582, "GL_SOURCE2_RGB" }, +{ 0x8582, "GL_SRC2_RGB" }, +{ 0x8583, "GL_SOURCE3_RGB_ARB" }, +{ 0x8583, "GL_SOURCE3_RGB_EXT" }, +{ 0x8583, "GL_SOURCE3_RGB" }, +{ 0x8583, "GL_SRC3_RGB" }, +{ 0x8584, "GL_SOURCE4_RGB_ARB" }, +{ 0x8584, "GL_SOURCE4_RGB_EXT" }, +{ 0x8584, "GL_SOURCE4_RGB" }, +{ 0x8584, "GL_SRC4_RGB" }, +{ 0x8585, "GL_SOURCE5_RGB_ARB" }, +{ 0x8585, "GL_SOURCE5_RGB_EXT" }, +{ 0x8585, "GL_SOURCE5_RGB" }, +{ 0x8585, "GL_SRC5_RGB" }, +{ 0x8586, "GL_SOURCE6_RGB_ARB" }, +{ 0x8586, "GL_SOURCE6_RGB_EXT" }, +{ 0x8586, "GL_SOURCE6_RGB" }, +{ 0x8586, "GL_SRC6_RGB" }, +{ 0x8587, "GL_SOURCE7_RGB_ARB" }, +{ 0x8587, "GL_SOURCE7_RGB_EXT" }, +{ 0x8587, "GL_SOURCE7_RGB" }, +{ 0x8587, "GL_SRC7_RGB" }, +{ 0x8588, "GL_SOURCE0_ALPHA_ARB" }, +{ 0x8588, "GL_SOURCE0_ALPHA_EXT" }, +{ 0x8588, "GL_SOURCE0_ALPHA" }, +{ 0x8588, "GL_SRC0_ALPHA" }, +{ 0x8589, "GL_SOURCE1_ALPHA_ARB" }, +{ 0x8589, "GL_SOURCE1_ALPHA_EXT" }, +{ 0x8589, "GL_SOURCE1_ALPHA" }, +{ 0x8589, "GL_SRC1_ALPHA" }, +{ 0x858A, "GL_SOURCE2_ALPHA_ARB" }, +{ 0x858A, "GL_SOURCE2_ALPHA_EXT" }, +{ 0x858A, "GL_SOURCE2_ALPHA" }, +{ 0x858A, "GL_SRC2_ALPHA" }, +{ 0x858B, "GL_SOURCE3_ALPHA_ARB" }, +{ 0x858B, "GL_SOURCE3_ALPHA_EXT" }, +{ 0x858B, "GL_SOURCE3_ALPHA" }, +{ 0x858B, "GL_SRC3_ALPHA" }, +{ 0x858C, "GL_SOURCE4_ALPHA_ARB" }, +{ 0x858C, "GL_SOURCE4_ALPHA_EXT" }, +{ 0x858C, "GL_SOURCE4_ALPHA" }, +{ 0x858C, "GL_SRC4_ALPHA" }, +{ 0x858D, "GL_SOURCE5_ALPHA_ARB" }, +{ 0x858D, "GL_SOURCE5_ALPHA_EXT" }, +{ 0x858D, "GL_SOURCE5_ALPHA" }, +{ 0x858D, "GL_SRC5_ALPHA" }, +{ 0x858E, "GL_SOURCE6_ALPHA_ARB" }, +{ 0x858E, "GL_SOURCE6_ALPHA_EXT" }, +{ 0x858E, "GL_SOURCE6_ALPHA" }, +{ 0x858E, "GL_SRC6_ALPHA" }, +{ 0x858F, "GL_SOURCE7_ALPHA_ARB" }, +{ 0x858F, "GL_SOURCE7_ALPHA_EXT" }, +{ 0x858F, "GL_SOURCE7_ALPHA" }, +{ 0x858F, "GL_SRC7_ALPHA" }, +{ 0x8590, "GL_OPERAND0_RGB_ARB" }, +{ 0x8590, "GL_OPERAND0_RGB_EXT" }, +{ 0x8590, "GL_OPERAND0_RGB" }, +{ 0x8591, "GL_OPERAND1_RGB_ARB" }, +{ 0x8591, "GL_OPERAND1_RGB_EXT" }, +{ 0x8591, "GL_OPERAND1_RGB" }, +{ 0x8592, "GL_OPERAND2_RGB_ARB" }, +{ 0x8592, "GL_OPERAND2_RGB_EXT" }, +{ 0x8592, "GL_OPERAND2_RGB" }, +{ 0x8593, "GL_OPERAND3_RGB_ARB" }, +{ 0x8593, "GL_OPERAND3_RGB_EXT" }, +{ 0x8593, "GL_OPERAND3_RGB" }, +{ 0x8594, "GL_OPERAND4_RGB_ARB" }, +{ 0x8594, "GL_OPERAND4_RGB_EXT" }, +{ 0x8594, "GL_OPERAND4_RGB" }, +{ 0x8595, "GL_OPERAND5_RGB_ARB" }, +{ 0x8595, "GL_OPERAND5_RGB_EXT" }, +{ 0x8595, "GL_OPERAND5_RGB" }, +{ 0x8596, "GL_OPERAND6_RGB_ARB" }, +{ 0x8596, "GL_OPERAND6_RGB_EXT" }, +{ 0x8596, "GL_OPERAND6_RGB" }, +{ 0x8597, "GL_OPERAND7_RGB_ARB" }, +{ 0x8597, "GL_OPERAND7_RGB_EXT" }, +{ 0x8597, "GL_OPERAND7_RGB" }, +{ 0x8598, "GL_OPERAND0_ALPHA_ARB" }, +{ 0x8598, "GL_OPERAND0_ALPHA_EXT" }, +{ 0x8598, "GL_OPERAND0_ALPHA" }, +{ 0x8599, "GL_OPERAND1_ALPHA_ARB" }, +{ 0x8599, "GL_OPERAND1_ALPHA_EXT" }, +{ 0x8599, "GL_OPERAND1_ALPHA" }, +{ 0x859A, "GL_OPERAND2_ALPHA_ARB" }, +{ 0x859A, "GL_OPERAND2_ALPHA_EXT" }, +{ 0x859A, "GL_OPERAND2_ALPHA" }, +{ 0x859B, "GL_OPERAND3_ALPHA_ARB" }, +{ 0x859B, "GL_OPERAND3_ALPHA_EXT" }, +{ 0x859B, "GL_OPERAND3_ALPHA" }, +{ 0x859C, "GL_OPERAND4_ALPHA_ARB" }, +{ 0x859C, "GL_OPERAND4_ALPHA_EXT" }, +{ 0x859C, "GL_OPERAND4_ALPHA" }, +{ 0x859D, "GL_OPERAND5_ALPHA_ARB" }, +{ 0x859D, "GL_OPERAND5_ALPHA_EXT" }, +{ 0x859D, "GL_OPERAND5_ALPHA" }, +{ 0x859E, "GL_OPERAND6_ALPHA_ARB" }, +{ 0x859E, "GL_OPERAND6_ALPHA_EXT" }, +{ 0x859E, "GL_OPERAND6_ALPHA" }, +{ 0x859F, "GL_OPERAND7_ALPHA_ARB" }, +{ 0x859F, "GL_OPERAND7_ALPHA_EXT" }, +{ 0x859F, "GL_OPERAND7_ALPHA" }, +{ 0x85AE, "GL_PERTURB_EXT" }, +{ 0x85AF, "GL_TEXTURE_NORMAL_EXT" }, +{ 0x85B4, "GL_STORAGE_CLIENT_APPLE" }, +{ 0x85B5, "GL_VERTEX_ARRAY_BINDING_APPLE" }, +{ 0x85BD, "GL_STORAGE_PRIVATE_APPLE" }, +{ 0x85BE, "GL_STORAGE_CACHED_APPLE" }, +{ 0x85BF, "GL_STORAGE_SHARED_APPLE" }, +{ 0x8620, "GL_VERTEX_PROGRAM_ARB" }, +{ 0x8620, "GL_VERTEX_PROGRAM_NV" }, +{ 0x8621, "GL_VERTEX_STATE_PROGRAM_NV" }, +{ 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" }, +{ 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" }, +{ 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED" }, +{ 0x8623, "GL_ATTRIB_ARRAY_SIZE_NV" }, +{ 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" }, +{ 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" }, +{ 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE" }, +{ 0x8624, "GL_ATTRIB_ARRAY_STRIDE_NV" }, +{ 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" }, +{ 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" }, +{ 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE" }, +{ 0x8625, "GL_ATTRIB_ARRAY_TYPE_NV" }, +{ 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" }, +{ 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" }, +{ 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE" }, +{ 0x8626, "GL_CURRENT_ATTRIB_NV" }, +{ 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" }, +{ 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" }, +{ 0x8626, "GL_CURRENT_VERTEX_ATTRIB" }, +{ 0x8627, "GL_PROGRAM_LENGTH_ARB" }, +{ 0x8627, "GL_PROGRAM_LENGTH_NV" }, +{ 0x8628, "GL_PROGRAM_STRING_ARB" }, +{ 0x8628, "GL_PROGRAM_STRING_NV" }, +{ 0x8629, "GL_MODELVIEW_PROJECTION_NV" }, +{ 0x862A, "GL_IDENTITY_NV" }, +{ 0x862B, "GL_INVERSE_NV" }, +{ 0x862C, "GL_TRANSPOSE_NV" }, +{ 0x862D, "GL_INVERSE_TRANSPOSE_NV" }, +{ 0x862E, "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB" }, +{ 0x862E, "GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV" }, +{ 0x862F, "GL_MAX_PROGRAM_MATRICES_ARB" }, +{ 0x862F, "GL_MAX_TRACK_MATRICES_NV" }, +{ 0x8630, "GL_MATRIX0_NV" }, +{ 0x8631, "GL_MATRIX1_NV" }, +{ 0x8632, "GL_MATRIX2_NV" }, +{ 0x8633, "GL_MATRIX3_NV" }, +{ 0x8634, "GL_MATRIX4_NV" }, +{ 0x8635, "GL_MATRIX5_NV" }, +{ 0x8636, "GL_MATRIX6_NV" }, +{ 0x8637, "GL_MATRIX7_NV" }, +{ 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_ARB" }, +{ 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_NV" }, +{ 0x8641, "GL_CURRENT_MATRIX_ARB" }, +{ 0x8641, "GL_CURRENT_MATRIX_NV" }, +{ 0x8642, "GL_PROGRAM_POINT_SIZE_EXT" }, +{ 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" }, +{ 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" }, +{ 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_NV" }, +{ 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE" }, +{ 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" }, +{ 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" }, +{ 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_NV" }, +{ 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE" }, +{ 0x8644, "GL_PROGRAM_PARAMETER_NV" }, +{ 0x8645, "GL_ATTRIB_ARRAY_POINTER_NV" }, +{ 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" }, +{ 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" }, +{ 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER" }, +{ 0x8646, "GL_PROGRAM_TARGET_NV" }, +{ 0x8647, "GL_PROGRAM_RESIDENT_NV" }, +{ 0x8648, "GL_TRACK_MATRIX_NV" }, +{ 0x8649, "GL_TRACK_MATRIX_TRANSFORM_NV" }, +{ 0x864A, "GL_VERTEX_PROGRAM_BINDING_NV" }, +{ 0x864B, "GL_PROGRAM_ERROR_POSITION_ARB" }, +{ 0x864B, "GL_PROGRAM_ERROR_POSITION_NV" }, +{ 0x8650, "GL_VERTEX_ATTRIB_ARRAY0_NV" }, +{ 0x8651, "GL_VERTEX_ATTRIB_ARRAY1_NV" }, +{ 0x8652, "GL_VERTEX_ATTRIB_ARRAY2_NV" }, +{ 0x8653, "GL_VERTEX_ATTRIB_ARRAY3_NV" }, +{ 0x8654, "GL_VERTEX_ATTRIB_ARRAY4_NV" }, +{ 0x8655, "GL_VERTEX_ATTRIB_ARRAY5_NV" }, +{ 0x8656, "GL_VERTEX_ATTRIB_ARRAY6_NV" }, +{ 0x8657, "GL_VERTEX_ATTRIB_ARRAY7_NV" }, +{ 0x8658, "GL_VERTEX_ATTRIB_ARRAY8_NV" }, +{ 0x8659, "GL_VERTEX_ATTRIB_ARRAY9_NV" }, +{ 0x865A, "GL_VERTEX_ATTRIB_ARRAY10_NV" }, +{ 0x865B, "GL_VERTEX_ATTRIB_ARRAY11_NV" }, +{ 0x865C, "GL_VERTEX_ATTRIB_ARRAY12_NV" }, +{ 0x865D, "GL_VERTEX_ATTRIB_ARRAY13_NV" }, +{ 0x865E, "GL_VERTEX_ATTRIB_ARRAY14_NV" }, +{ 0x865F, "GL_VERTEX_ATTRIB_ARRAY15_NV" }, +{ 0x8660, "GL_MAP1_VERTEX_ATTRIB0_4_NV" }, +{ 0x8661, "GL_MAP1_VERTEX_ATTRIB1_4_NV" }, +{ 0x8662, "GL_MAP1_VERTEX_ATTRIB2_4_NV" }, +{ 0x8663, "GL_MAP1_VERTEX_ATTRIB3_4_NV" }, +{ 0x8664, "GL_MAP1_VERTEX_ATTRIB4_4_NV" }, +{ 0x8665, "GL_MAP1_VERTEX_ATTRIB5_4_NV" }, +{ 0x8666, "GL_MAP1_VERTEX_ATTRIB6_4_NV" }, +{ 0x8667, "GL_MAP1_VERTEX_ATTRIB7_4_NV" }, +{ 0x8668, "GL_MAP1_VERTEX_ATTRIB8_4_NV" }, +{ 0x8669, "GL_MAP1_VERTEX_ATTRIB9_4_NV" }, +{ 0x866A, "GL_MAP1_VERTEX_ATTRIB10_4_NV" }, +{ 0x866B, "GL_MAP1_VERTEX_ATTRIB11_4_NV" }, +{ 0x866C, "GL_MAP1_VERTEX_ATTRIB12_4_NV" }, +{ 0x866D, "GL_MAP1_VERTEX_ATTRIB13_4_NV" }, +{ 0x866E, "GL_MAP1_VERTEX_ATTRIB14_4_NV" }, +{ 0x866F, "GL_MAP1_VERTEX_ATTRIB15_4_NV" }, +{ 0x8670, "GL_MAP2_VERTEX_ATTRIB0_4_NV" }, +{ 0x8671, "GL_MAP2_VERTEX_ATTRIB1_4_NV" }, +{ 0x8672, "GL_MAP2_VERTEX_ATTRIB2_4_NV" }, +{ 0x8673, "GL_MAP2_VERTEX_ATTRIB3_4_NV" }, +{ 0x8674, "GL_MAP2_VERTEX_ATTRIB4_4_NV" }, +{ 0x8675, "GL_MAP2_VERTEX_ATTRIB5_4_NV" }, +{ 0x8676, "GL_MAP2_VERTEX_ATTRIB6_4_NV" }, +{ 0x8677, "GL_MAP2_VERTEX_ATTRIB7_4_NV" }, +{ 0x8677, "GL_PROGRAM_BINDING_ARB" }, +{ 0x8677, "GL_PROGRAM_NAME_ARB" }, +{ 0x8678, "GL_MAP2_VERTEX_ATTRIB8_4_NV" }, +{ 0x8679, "GL_MAP2_VERTEX_ATTRIB9_4_NV" }, +{ 0x867A, "GL_MAP2_VERTEX_ATTRIB10_4_NV" }, +{ 0x867B, "GL_MAP2_VERTEX_ATTRIB11_4_NV" }, +{ 0x867C, "GL_MAP2_VERTEX_ATTRIB12_4_NV" }, +{ 0x867D, "GL_MAP2_VERTEX_ATTRIB13_4_NV" }, +{ 0x867E, "GL_MAP2_VERTEX_ATTRIB14_4_NV" }, +{ 0x867F, "GL_MAP2_VERTEX_ATTRIB15_4_NV" }, +{ 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB" }, +{ 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE" }, +{ 0x86A1, "GL_TEXTURE_COMPRESSED_ARB" }, +{ 0x86A1, "GL_TEXTURE_COMPRESSED" }, +{ 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB" }, +{ 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS" }, +{ 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS_ARB" }, +{ 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS" }, +{ 0x86A4, "GL_MAX_VERTEX_UNITS_ARB" }, +{ 0x86A5, "GL_ACTIVE_VERTEX_UNITS_ARB" }, +{ 0x86A6, "GL_WEIGHT_SUM_UNITY_ARB" }, +{ 0x86A7, "GL_VERTEX_BLEND_ARB" }, +{ 0x86A8, "GL_CURRENT_WEIGHT_ARB" }, +{ 0x86A9, "GL_WEIGHT_ARRAY_TYPE_ARB" }, +{ 0x86AA, "GL_WEIGHT_ARRAY_STRIDE_ARB" }, +{ 0x86AB, "GL_WEIGHT_ARRAY_SIZE_ARB" }, +{ 0x86AC, "GL_WEIGHT_ARRAY_POINTER_ARB" }, +{ 0x86AD, "GL_WEIGHT_ARRAY_ARB" }, +{ 0x86AE, "GL_DOT3_RGB_ARB" }, +{ 0x86AE, "GL_DOT3_RGB" }, +{ 0x86AF, "GL_DOT3_RGBA_ARB" }, +{ 0x86AF, "GL_DOT3_RGBA" }, +{ 0x8722, "GL_MODELVIEW2_ARB" }, +{ 0x8723, "GL_MODELVIEW3_ARB" }, +{ 0x8724, "GL_MODELVIEW4_ARB" }, +{ 0x8725, "GL_MODELVIEW5_ARB" }, +{ 0x8726, "GL_MODELVIEW6_ARB" }, +{ 0x8727, "GL_MODELVIEW7_ARB" }, +{ 0x8728, "GL_MODELVIEW8_ARB" }, +{ 0x8729, "GL_MODELVIEW9_ARB" }, +{ 0x872A, "GL_MODELVIEW10_ARB" }, +{ 0x872B, "GL_MODELVIEW11_ARB" }, +{ 0x872C, "GL_MODELVIEW12_ARB" }, +{ 0x872D, "GL_MODELVIEW13_ARB" }, +{ 0x872E, "GL_MODELVIEW14_ARB" }, +{ 0x872F, "GL_MODELVIEW15_ARB" }, +{ 0x8730, "GL_MODELVIEW16_ARB" }, +{ 0x8731, "GL_MODELVIEW17_ARB" }, +{ 0x8732, "GL_MODELVIEW18_ARB" }, +{ 0x8733, "GL_MODELVIEW19_ARB" }, +{ 0x8734, "GL_MODELVIEW20_ARB" }, +{ 0x8735, "GL_MODELVIEW21_ARB" }, +{ 0x8736, "GL_MODELVIEW22_ARB" }, +{ 0x8737, "GL_MODELVIEW23_ARB" }, +{ 0x8738, "GL_MODELVIEW24_ARB" }, +{ 0x8739, "GL_MODELVIEW25_ARB" }, +{ 0x873A, "GL_MODELVIEW26_ARB" }, +{ 0x873B, "GL_MODELVIEW27_ARB" }, +{ 0x873C, "GL_MODELVIEW28_ARB" }, +{ 0x873D, "GL_MODELVIEW29_ARB" }, +{ 0x873E, "GL_MODELVIEW30_ARB" }, +{ 0x873F, "GL_MODELVIEW31_ARB" }, +{ 0x8742, "GL_MIRROR_CLAMP_EXT" }, +{ 0x8743, "GL_MIRROR_CLAMP_TO_EDGE_EXT" }, +{ 0x8764, "GL_BUFFER_SIZE_ARB" }, +{ 0x8764, "GL_BUFFER_SIZE" }, +{ 0x8765, "GL_BUFFER_USAGE_ARB" }, +{ 0x8765, "GL_BUFFER_USAGE" }, +{ 0x8780, "GL_VERTEX_SHADER_EXT" }, +{ 0x8781, "GL_VERTEX_SHADER_BINDING_EXT" }, +{ 0x8782, "GL_OP_INDEX_EXT" }, +{ 0x8783, "GL_OP_NEGATE_EXT" }, +{ 0x8784, "GL_OP_DOT3_EXT" }, +{ 0x8785, "GL_OP_DOT4_EXT" }, +{ 0x8786, "GL_OP_MUL_EXT" }, +{ 0x8787, "GL_OP_ADD_EXT" }, +{ 0x8788, "GL_OP_MADD_EXT" }, +{ 0x8789, "GL_OP_FRAC_EXT" }, +{ 0x878A, "GL_OP_MAX_EXT" }, +{ 0x878B, "GL_OP_MIN_EXT" }, +{ 0x878C, "GL_OP_SET_GE_EXT" }, +{ 0x878D, "GL_OP_SET_LT_EXT" }, +{ 0x878E, "GL_OP_CLAMP_EXT" }, +{ 0x878F, "GL_OP_FLOOR_EXT" }, +{ 0x8790, "GL_OP_ROUND_EXT" }, +{ 0x8791, "GL_OP_EXP_BASE_2_EXT" }, +{ 0x8792, "GL_OP_LOG_BASE_2_EXT" }, +{ 0x8793, "GL_OP_POWER_EXT" }, +{ 0x8794, "GL_OP_RECIP_EXT" }, +{ 0x8795, "GL_OP_RECIP_SQRT_EXT" }, +{ 0x8796, "GL_OP_SUB_EXT" }, +{ 0x8797, "GL_OP_CROSS_PRODUCT_EXT" }, +{ 0x8798, "GL_OP_MULTIPLY_MATRIX_EXT" }, +{ 0x8799, "GL_OP_MOV_EXT" }, +{ 0x879A, "GL_OUTPUT_VERTEX_EXT" }, +{ 0x879B, "GL_OUTPUT_COLOR0_EXT" }, +{ 0x879C, "GL_OUTPUT_COLOR1_EXT" }, +{ 0x879D, "GL_OUTPUT_TEXTURE_COORD0_EXT" }, +{ 0x879E, "GL_OUTPUT_TEXTURE_COORD1_EXT" }, +{ 0x879F, "GL_OUTPUT_TEXTURE_COORD2_EXT" }, +{ 0x87A0, "GL_OUTPUT_TEXTURE_COORD3_EXT" }, +{ 0x87A1, "GL_OUTPUT_TEXTURE_COORD4_EXT" }, +{ 0x87A2, "GL_OUTPUT_TEXTURE_COORD5_EXT" }, +{ 0x87A3, "GL_OUTPUT_TEXTURE_COORD6_EXT" }, +{ 0x87A4, "GL_OUTPUT_TEXTURE_COORD7_EXT" }, +{ 0x87A5, "GL_OUTPUT_TEXTURE_COORD8_EXT" }, +{ 0x87A6, "GL_OUTPUT_TEXTURE_COORD9_EXT" }, +{ 0x87A7, "GL_OUTPUT_TEXTURE_COORD10_EXT" }, +{ 0x87A8, "GL_OUTPUT_TEXTURE_COORD11_EXT" }, +{ 0x87A9, "GL_OUTPUT_TEXTURE_COORD12_EXT" }, +{ 0x87AA, "GL_OUTPUT_TEXTURE_COORD13_EXT" }, +{ 0x87AB, "GL_OUTPUT_TEXTURE_COORD14_EXT" }, +{ 0x87AC, "GL_OUTPUT_TEXTURE_COORD15_EXT" }, +{ 0x87AD, "GL_OUTPUT_TEXTURE_COORD16_EXT" }, +{ 0x87AE, "GL_OUTPUT_TEXTURE_COORD17_EXT" }, +{ 0x87AF, "GL_OUTPUT_TEXTURE_COORD18_EXT" }, +{ 0x87B0, "GL_OUTPUT_TEXTURE_COORD19_EXT" }, +{ 0x87B1, "GL_OUTPUT_TEXTURE_COORD20_EXT" }, +{ 0x87B2, "GL_OUTPUT_TEXTURE_COORD21_EXT" }, +{ 0x87B3, "GL_OUTPUT_TEXTURE_COORD22_EXT" }, +{ 0x87B4, "GL_OUTPUT_TEXTURE_COORD23_EXT" }, +{ 0x87B5, "GL_OUTPUT_TEXTURE_COORD24_EXT" }, +{ 0x87B6, "GL_OUTPUT_TEXTURE_COORD25_EXT" }, +{ 0x87B7, "GL_OUTPUT_TEXTURE_COORD26_EXT" }, +{ 0x87B8, "GL_OUTPUT_TEXTURE_COORD27_EXT" }, +{ 0x87B9, "GL_OUTPUT_TEXTURE_COORD28_EXT" }, +{ 0x87BA, "GL_OUTPUT_TEXTURE_COORD29_EXT" }, +{ 0x87BB, "GL_OUTPUT_TEXTURE_COORD30_EXT" }, +{ 0x87BC, "GL_OUTPUT_TEXTURE_COORD31_EXT" }, +{ 0x87BD, "GL_OUTPUT_FOG_EXT" }, +{ 0x87BE, "GL_SCALAR_EXT" }, +{ 0x87BF, "GL_VECTOR_EXT" }, +{ 0x87C0, "GL_MATRIX_EXT" }, +{ 0x87C1, "GL_VARIANT_EXT" }, +{ 0x87C2, "GL_INVARIANT_EXT" }, +{ 0x87C3, "GL_LOCAL_CONSTANT_EXT" }, +{ 0x87C4, "GL_LOCAL_EXT" }, +{ 0x87C5, "GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT" }, +{ 0x87C6, "GL_MAX_VERTEX_SHADER_VARIANTS_EXT" }, +{ 0x87C7, "GL_MAX_VERTEX_SHADER_INVARIANTS_EXT" }, +{ 0x87C8, "GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" }, +{ 0x87C9, "GL_MAX_VERTEX_SHADER_LOCALS_EXT" }, +{ 0x87CA, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT" }, +{ 0x87CB, "GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT" }, +{ 0x87CC, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" }, +{ 0x87CD, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT" }, +{ 0x87CE, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT" }, +{ 0x87CF, "GL_VERTEX_SHADER_INSTRUCTIONS_EXT" }, +{ 0x87D0, "GL_VERTEX_SHADER_VARIANTS_EXT" }, +{ 0x87D1, "GL_VERTEX_SHADER_INVARIANTS_EXT" }, +{ 0x87D2, "GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" }, +{ 0x87D3, "GL_VERTEX_SHADER_LOCALS_EXT" }, +{ 0x87D4, "GL_VERTEX_SHADER_OPTIMIZED_EXT" }, +{ 0x87D5, "GL_X_EXT" }, +{ 0x87D6, "GL_Y_EXT" }, +{ 0x87D7, "GL_Z_EXT" }, +{ 0x87D8, "GL_W_EXT" }, +{ 0x87D9, "GL_NEGATIVE_X_EXT" }, +{ 0x87DA, "GL_NEGATIVE_Y_EXT" }, +{ 0x87DB, "GL_NEGATIVE_Z_EXT" }, +{ 0x87DC, "GL_NEGATIVE_W_EXT" }, +{ 0x87DF, "GL_NEGATIVE_ONE_EXT" }, +{ 0x87E0, "GL_NORMALIZED_RANGE_EXT" }, +{ 0x87E1, "GL_FULL_RANGE_EXT" }, +{ 0x87E2, "GL_CURRENT_VERTEX_EXT" }, +{ 0x87E3, "GL_MVP_MATRIX_EXT" }, +{ 0x87E4, "GL_VARIANT_VALUE_EXT" }, +{ 0x87E5, "GL_VARIANT_DATATYPE_EXT" }, +{ 0x87E6, "GL_VARIANT_ARRAY_STRIDE_EXT" }, +{ 0x87E7, "GL_VARIANT_ARRAY_TYPE_EXT" }, +{ 0x87E8, "GL_VARIANT_ARRAY_EXT" }, +{ 0x87E9, "GL_VARIANT_ARRAY_POINTER_EXT" }, +{ 0x87EA, "GL_INVARIANT_VALUE_EXT" }, +{ 0x87EB, "GL_INVARIANT_DATATYPE_EXT" }, +{ 0x87EC, "GL_LOCAL_CONSTANT_VALUE_EXT" }, +{ 0x87Ed, "GL_LOCAL_CONSTANT_DATATYPE_EXT" }, +{ 0x8800, "GL_STENCIL_BACK_FUNC_ATI" }, +{ 0x8800, "GL_STENCIL_BACK_FUNC" }, +{ 0x8801, "GL_STENCIL_BACK_FAIL_ATI" }, +{ 0x8801, "GL_STENCIL_BACK_FAIL" }, +{ 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI" }, +{ 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL" }, +{ 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI" }, +{ 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS" }, +{ 0x8804, "GL_FRAGMENT_PROGRAM_ARB" }, +{ 0x8805, "GL_PROGRAM_ALU_INSTRUCTIONS_ARB" }, +{ 0x8806, "GL_PROGRAM_TEX_INSTRUCTIONS_ARB" }, +{ 0x8807, "GL_PROGRAM_TEX_INDIRECTIONS_ARB" }, +{ 0x8808, "GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" }, +{ 0x8809, "GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" }, +{ 0x880A, "GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" }, +{ 0x880B, "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB" }, +{ 0x880C, "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB" }, +{ 0x880D, "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB" }, +{ 0x880E, "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" }, +{ 0x880F, "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" }, +{ 0x8810, "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" }, +{ 0x8814, "GL_RGBA_FLOAT32_APPLE" }, +{ 0x8814, "GL_RGBA_FLOAT32_ATI" }, +{ 0x8814, "GL_RGBA32F_ARB" }, +{ 0x8815, "GL_RGB_FLOAT32_APPLE" }, +{ 0x8815, "GL_RGB_FLOAT32_ATI" }, +{ 0x8815, "GL_RGB32F_ARB" }, +{ 0x8816, "GL_ALPHA_FLOAT32_APPLE" }, +{ 0x8816, "GL_ALPHA_FLOAT32_ATI" }, +{ 0x8816, "GL_ALPHA32F_ARB" }, +{ 0x8817, "GL_INTENSITY_FLOAT32_APPLE" }, +{ 0x8817, "GL_INTENSITY_FLOAT32_ATI" }, +{ 0x8817, "GL_INTENSITY32F_ARB" }, +{ 0x8818, "GL_LUMINANCE_FLOAT32_APPLE" }, +{ 0x8818, "GL_LUMINANCE_FLOAT32_ATI" }, +{ 0x8818, "GL_LUMINANCE32F_ARB" }, +{ 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_APPLE" }, +{ 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_ATI" }, +{ 0x8819, "GL_LUMINANCE_ALPHA32F_ARB" }, +{ 0x881A, "GL_RGBA_FLOAT16_APPLE" }, +{ 0x881A, "GL_RGBA_FLOAT16_ATI" }, +{ 0x881A, "GL_RGBA16F_ARB" }, +{ 0x881B, "GL_RGB_FLOAT16_APPLE" }, +{ 0x881B, "GL_RGB_FLOAT16_ATI" }, +{ 0x881B, "GL_RGB16F_ARB" }, +{ 0x881C, "GL_ALPHA_FLOAT16_APPLE" }, +{ 0x881C, "GL_ALPHA_FLOAT16_ATI" }, +{ 0x881C, "GL_ALPHA16F_ARB" }, +{ 0x881D, "GL_INTENSITY_FLOAT16_APPLE" }, +{ 0x881D, "GL_INTENSITY_FLOAT16_ATI" }, +{ 0x881D, "GL_INTENSITY16F_ARB" }, +{ 0x881E, "GL_LUMINANCE_FLOAT16_APPLE" }, +{ 0x881E, "GL_LUMINANCE_FLOAT16_ATI" }, +{ 0x881E, "GL_LUMINANCE16F_ARB" }, +{ 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_APPLE" }, +{ 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_ATI" }, +{ 0x881F, "GL_LUMINANCE_ALPHA16F_ARB" }, +{ 0x8820, "GL_RGBA_FLOAT_MODE_ARB" }, +{ 0x8824, "GL_MAX_DRAW_BUFFERS_ARB" }, +{ 0x8824, "GL_MAX_DRAW_BUFFERS" }, +{ 0x8825, "GL_DRAW_BUFFER0_ARB" }, +{ 0x8825, "GL_DRAW_BUFFER0" }, +{ 0x8826, "GL_DRAW_BUFFER1_ARB" }, +{ 0x8826, "GL_DRAW_BUFFER1" }, +{ 0x8827, "GL_DRAW_BUFFER2_ARB" }, +{ 0x8827, "GL_DRAW_BUFFER2" }, +{ 0x8828, "GL_DRAW_BUFFER3_ARB" }, +{ 0x8828, "GL_DRAW_BUFFER3" }, +{ 0x8829, "GL_DRAW_BUFFER4_ARB" }, +{ 0x8829, "GL_DRAW_BUFFER4" }, +{ 0x882A, "GL_DRAW_BUFFER5_ARB" }, +{ 0x882A, "GL_DRAW_BUFFER5" }, +{ 0x882B, "GL_DRAW_BUFFER6_ARB" }, +{ 0x882B, "GL_DRAW_BUFFER6" }, +{ 0x882C, "GL_DRAW_BUFFER7_ARB" }, +{ 0x882C, "GL_DRAW_BUFFER7" }, +{ 0x882D, "GL_DRAW_BUFFER8_ARB" }, +{ 0x882D, "GL_DRAW_BUFFER8" }, +{ 0x882E, "GL_DRAW_BUFFER9_ARB" }, +{ 0x882E, "GL_DRAW_BUFFER9" }, +{ 0x882F, "GL_DRAW_BUFFER10_ARB" }, +{ 0x882F, "GL_DRAW_BUFFER10" }, +{ 0x8830, "GL_DRAW_BUFFER11_ARB" }, +{ 0x8830, "GL_DRAW_BUFFER11" }, +{ 0x8831, "GL_DRAW_BUFFER12_ARB" }, +{ 0x8831, "GL_DRAW_BUFFER12" }, +{ 0x8832, "GL_DRAW_BUFFER13_ARB" }, +{ 0x8832, "GL_DRAW_BUFFER13" }, +{ 0x8833, "GL_DRAW_BUFFER14_ARB" }, +{ 0x8833, "GL_DRAW_BUFFER14" }, +{ 0x8834, "GL_DRAW_BUFFER15_ARB" }, +{ 0x8834, "GL_DRAW_BUFFER15" }, +{ 0x883D, "GL_ALPHA_BLEND_EQUATION_ATI" }, +{ 0x883D, "GL_BLEND_EQUATION_ALPHA_EXT" }, +{ 0x883D, "GL_BLEND_EQUATION_ALPHA" }, +{ 0x884A, "GL_TEXTURE_DEPTH_SIZE_ARB" }, +{ 0x884A, "GL_TEXTURE_DEPTH_SIZE" }, +{ 0x884B, "GL_DEPTH_TEXTURE_MODE_ARB" }, +{ 0x884B, "GL_DEPTH_TEXTURE_MODE" }, +{ 0x884C, "GL_TEXTURE_COMPARE_MODE_ARB" }, +{ 0x884C, "GL_TEXTURE_COMPARE_MODE" }, +{ 0x884D, "GL_TEXTURE_COMPARE_FUNC_ARB" }, +{ 0x884D, "GL_TEXTURE_COMPARE_FUNC" }, +{ 0x884E, "GL_COMPARE_R_TO_TEXTURE_ARB" }, +{ 0x884E, "GL_COMPARE_R_TO_TEXTURE" }, +{ 0x884E, "GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT" }, +{ 0x8861, "GL_POINT_SPRITE_ARB" }, +{ 0x8861, "GL_POINT_SPRITE" }, +{ 0x8862, "GL_COORD_REPLACE_ARB" }, +{ 0x8862, "GL_COORD_REPLACE" }, +{ 0x8864, "GL_QUERY_COUNTER_BITS_ARB" }, +{ 0x8864, "GL_QUERY_COUNTER_BITS" }, +{ 0x8865, "GL_CURRENT_QUERY_ARB" }, +{ 0x8865, "GL_CURRENT_QUERY" }, +{ 0x8866, "GL_QUERY_RESULT_ARB" }, +{ 0x8866, "GL_QUERY_RESULT" }, +{ 0x8867, "GL_QUERY_RESULT_AVAILABLE_ARB" }, +{ 0x8867, "GL_QUERY_RESULT_AVAILABLE" }, +{ 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" }, +{ 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" }, +{ 0x8869, "GL_MAX_VERTEX_ATTRIBS" }, +{ 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" }, +{ 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" }, +{ 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED" }, +{ 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" }, +{ 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" }, +{ 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" }, +{ 0x8871, "GL_MAX_TEXTURE_COORDS" }, +{ 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, +{ 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, +{ 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" }, +{ 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS" }, +{ 0x8874, "GL_PROGRAM_ERROR_STRING_ARB" }, +{ 0x8875, "GL_PROGRAM_FORMAT_ASCII_ARB" }, +{ 0x8876, "GL_PROGRAM_FORMAT_ARB" }, +{ 0x8890, "GL_DEPTH_BOUNDS_TEST_EXT" }, +{ 0x8891, "GL_DEPTH_BOUNDS_EXT" }, +{ 0x8892, "GL_ARRAY_BUFFER_ARB" }, +{ 0x8892, "GL_ARRAY_BUFFER" }, +{ 0x8893, "GL_ELEMENT_ARRAY_BUFFER_ARB" }, +{ 0x8893, "GL_ELEMENT_ARRAY_BUFFER" }, +{ 0x8894, "GL_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x8894, "GL_ARRAY_BUFFER_BINDING" }, +{ 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING" }, +{ 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING" }, +{ 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING" }, +{ 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING" }, +{ 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING" }, +{ 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING" }, +{ 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING" }, +{ 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING" }, +{ 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING" }, +{ 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING" }, +{ 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING" }, +{ 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB" }, +{ 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING" }, +{ 0x88A0, "GL_PROGRAM_INSTRUCTIONS_ARB" }, +{ 0x88A1, "GL_MAX_PROGRAM_INSTRUCTIONS_ARB" }, +{ 0x88A2, "GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB" }, +{ 0x88A3, "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB" }, +{ 0x88A4, "GL_PROGRAM_TEMPORARIES_ARB" }, +{ 0x88A5, "GL_MAX_PROGRAM_TEMPORARIES_ARB" }, +{ 0x88A6, "GL_PROGRAM_NATIVE_TEMPORARIES_ARB" }, +{ 0x88A7, "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB" }, +{ 0x88A8, "GL_PROGRAM_PARAMETERS_ARB" }, +{ 0x88A9, "GL_MAX_PROGRAM_PARAMETERS_ARB" }, +{ 0x88AA, "GL_PROGRAM_NATIVE_PARAMETERS_ARB" }, +{ 0x88AB, "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB" }, +{ 0x88AC, "GL_PROGRAM_ATTRIBS_ARB" }, +{ 0x88AD, "GL_MAX_PROGRAM_ATTRIBS_ARB" }, +{ 0x88AE, "GL_PROGRAM_NATIVE_ATTRIBS_ARB" }, +{ 0x88AF, "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB" }, +{ 0x88B0, "GL_PROGRAM_ADDRESS_REGISTERS_ARB" }, +{ 0x88B1, "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB" }, +{ 0x88B2, "GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" }, +{ 0x88B3, "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" }, +{ 0x88B4, "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB" }, +{ 0x88B5, "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB" }, +{ 0x88B6, "GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB" }, +{ 0x88B7, "GL_TRANSPOSE_CURRENT_MATRIX_ARB" }, +{ 0x88B8, "GL_READ_ONLY_ARB" }, +{ 0x88B8, "GL_READ_ONLY" }, +{ 0x88B9, "GL_WRITE_ONLY_ARB" }, +{ 0x88B9, "GL_WRITE_ONLY" }, +{ 0x88BA, "GL_READ_WRITE_ARB" }, +{ 0x88BA, "GL_READ_WRITE" }, +{ 0x88BB, "GL_BUFFER_ACCESS_ARB" }, +{ 0x88BB, "GL_BUFFER_ACCESS" }, +{ 0x88BC, "GL_BUFFER_MAPPED_ARB" }, +{ 0x88BC, "GL_BUFFER_MAPPED" }, +{ 0x88BD, "GL_BUFFER_MAP_POINTER_ARB" }, +{ 0x88BD, "GL_BUFFER_MAP_POINTER" }, +{ 0x88C0, "GL_MATRIX0_ARB" }, +{ 0x88C1, "GL_MATRIX1_ARB" }, +{ 0x88C2, "GL_MATRIX2_ARB" }, +{ 0x88C3, "GL_MATRIX3_ARB" }, +{ 0x88C4, "GL_MATRIX4_ARB" }, +{ 0x88C5, "GL_MATRIX5_ARB" }, +{ 0x88C6, "GL_MATRIX6_ARB" }, +{ 0x88C7, "GL_MATRIX7_ARB" }, +{ 0x88C8, "GL_MATRIX8_ARB" }, +{ 0x88C9, "GL_MATRIX9_ARB" }, +{ 0x88CA, "GL_MATRIX10_ARB" }, +{ 0x88CB, "GL_MATRIX11_ARB" }, +{ 0x88CC, "GL_MATRIX12_ARB" }, +{ 0x88CD, "GL_MATRIX13_ARB" }, +{ 0x88CE, "GL_MATRIX14_ARB" }, +{ 0x88CF, "GL_MATRIX15_ARB" }, +{ 0x88D0, "GL_MATRIX16_ARB" }, +{ 0x88D1, "GL_MATRIX17_ARB" }, +{ 0x88D2, "GL_MATRIX18_ARB" }, +{ 0x88D3, "GL_MATRIX19_ARB" }, +{ 0x88D4, "GL_MATRIX20_ARB" }, +{ 0x88D5, "GL_MATRIX21_ARB" }, +{ 0x88D6, "GL_MATRIX22_ARB" }, +{ 0x88D7, "GL_MATRIX23_ARB" }, +{ 0x88D8, "GL_MATRIX24_ARB" }, +{ 0x88D9, "GL_MATRIX25_ARB" }, +{ 0x88DA, "GL_MATRIX26_ARB" }, +{ 0x88DB, "GL_MATRIX27_ARB" }, +{ 0x88DC, "GL_MATRIX28_ARB" }, +{ 0x88DD, "GL_MATRIX29_ARB" }, +{ 0x88DE, "GL_MATRIX30_ARB" }, +{ 0x88DF, "GL_MATRIX31_ARB" }, +{ 0x88E0, "GL_STREAM_DRAW_ARB" }, +{ 0x88E0, "GL_STREAM_DRAW" }, +{ 0x88E1, "GL_STREAM_READ_ARB" }, +{ 0x88E1, "GL_STREAM_READ" }, +{ 0x88E2, "GL_STREAM_COPY_ARB" }, +{ 0x88E2, "GL_STREAM_COPY" }, +{ 0x88E4, "GL_STATIC_DRAW_ARB" }, +{ 0x88E4, "GL_STATIC_DRAW" }, +{ 0x88E5, "GL_STATIC_READ_ARB" }, +{ 0x88E5, "GL_STATIC_READ" }, +{ 0x88E6, "GL_STATIC_COPY_ARB" }, +{ 0x88E6, "GL_STATIC_COPY" }, +{ 0x88E8, "GL_DYNAMIC_DRAW_ARB" }, +{ 0x88E8, "GL_DYNAMIC_DRAW" }, +{ 0x88E9, "GL_DYNAMIC_READ_ARB" }, +{ 0x88E9, "GL_DYNAMIC_READ" }, +{ 0x88EA, "GL_DYNAMIC_COPY_ARB" }, +{ 0x88EA, "GL_DYNAMIC_COPY" }, +{ 0x88EB, "GL_PIXEL_PACK_BUFFER_ARB" }, +{ 0x88EB, "GL_PIXEL_PACK_BUFFER" }, +{ 0x88EC, "GL_PIXEL_UNPACK_BUFFER_ARB" }, +{ 0x88EC, "GL_PIXEL_UNPACK_BUFFER" }, +{ 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING_ARB" }, +{ 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING" }, +{ 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING_ARB" }, +{ 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING" }, +{ 0x88F0, "GL_DEPTH24_STENCIL8_EXT" }, +{ 0x88F0, "GL_DEPTH24_STENCIL8" }, +{ 0x88F1, "GL_TEXTURE_STENCIL_SIZE_EXT" }, +{ 0x88F1, "GL_TEXTURE_STENCIL_SIZE" }, +{ 0x88FD, "GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT" }, +{ 0x88FE, "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB" }, +{ 0x88FF, "GL_MAX_ARRAY_TEXTURE_LAYERS_EXT" }, +{ 0x8904, "GL_MIN_PROGRAM_TEXEL_OFFSET_EXT" }, +{ 0x8905, "GL_MAX_PROGRAM_TEXEL_OFFSET_EXT" }, +{ 0x8910, "GL_STENCIL_TEST_TWO_SIDE_EXT" }, +{ 0x8911, "GL_ACTIVE_STENCIL_FACE_EXT" }, +{ 0x8912, "GL_MIRROR_CLAMP_TO_BORDER_EXT" }, +{ 0x8914, "GL_SAMPLES_PASSED_ARB" }, +{ 0x8914, "GL_SAMPLES_PASSED" }, +{ 0x891A, "GL_CLAMP_VERTEX_COLOR_ARB" }, +{ 0x891B, "GL_CLAMP_FRAGMENT_COLOR_ARB" }, +{ 0x891C, "GL_CLAMP_READ_COLOR_ARB" }, +{ 0x891D, "GL_FIXED_ONLY_ARB" }, +{ 0x8920, "GL_FRAGMENT_SHADER_EXT" }, +{ 0x896D, "GL_SECONDARY_INTERPOLATOR_EXT" }, +{ 0x896E, "GL_NUM_FRAGMENT_REGISTERS_EXT" }, +{ 0x896F, "GL_NUM_FRAGMENT_CONSTANTS_EXT" }, +{ 0x8A0C, "GL_ELEMENT_ARRAY_APPLE" }, +{ 0x8A0D, "GL_ELEMENT_ARRAY_TYPE_APPLE" }, +{ 0x8A0E, "GL_ELEMENT_ARRAY_POINTER_APPLE" }, +{ 0x8A0F, "GL_COLOR_FLOAT_APPLE" }, +{ 0x8A11, "GL_UNIFORM_BUFFER" }, +{ 0x8A28, "GL_UNIFORM_BUFFER_BINDING" }, +{ 0x8A29, "GL_UNIFORM_BUFFER_START" }, +{ 0x8A2A, "GL_UNIFORM_BUFFER_SIZE" }, +{ 0x8A2B, "GL_MAX_VERTEX_UNIFORM_BLOCKS" }, +{ 0x8A2C, "GL_MAX_GEOMETRY_UNIFORM_BLOCKS" }, +{ 0x8A2D, "GL_MAX_FRAGMENT_UNIFORM_BLOCKS" }, +{ 0x8A2E, "GL_MAX_COMBINED_UNIFORM_BLOCKS" }, +{ 0x8A2F, "GL_MAX_UNIFORM_BUFFER_BINDINGS" }, +{ 0x8A30, "GL_MAX_UNIFORM_BLOCK_SIZE" }, +{ 0x8A31, "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS" }, +{ 0x8A32, "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS" }, +{ 0x8A33, "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS" }, +{ 0x8A34, "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT" }, +{ 0x8A35, "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH" }, +{ 0x8A36, "GL_ACTIVE_UNIFORM_BLOCKS" }, +{ 0x8A37, "GL_UNIFORM_TYPE" }, +{ 0x8A38, "GL_UNIFORM_SIZE" }, +{ 0x8A39, "GL_UNIFORM_NAME_LENGTH" }, +{ 0x8A3A, "GL_UNIFORM_BLOCK_INDEX" }, +{ 0x8A3B, "GL_UNIFORM_OFFSET" }, +{ 0x8A3C, "GL_UNIFORM_ARRAY_STRIDE" }, +{ 0x8A3D, "GL_UNIFORM_MATRIX_STRIDE" }, +{ 0x8A3E, "GL_UNIFORM_IS_ROW_MAJOR" }, +{ 0x8A3F, "GL_UNIFORM_BLOCK_BINDING" }, +{ 0x8A40, "GL_UNIFORM_BLOCK_DATA_SIZE" }, +{ 0x8A41, "GL_UNIFORM_BLOCK_NAME_LENGTH" }, +{ 0x8A42, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS" }, +{ 0x8A43, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES" }, +{ 0x8A44, "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER" }, +{ 0x8A45, "GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER" }, +{ 0x8A46, "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER" }, +{ 0x8B30, "GL_FRAGMENT_SHADER_ARB" }, +{ 0x8B30, "GL_FRAGMENT_SHADER" }, +{ 0x8B31, "GL_VERTEX_SHADER_ARB" }, +{ 0x8B31, "GL_VERTEX_SHADER" }, +{ 0x8B40, "GL_PROGRAM_OBJECT_ARB" }, +{ 0x8B48, "GL_SHADER_OBJECT_ARB" }, +{ 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB" }, +{ 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS" }, +{ 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB" }, +{ 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS" }, +{ 0x8B4B, "GL_MAX_VARYING_COMPONENTS_EXT" }, +{ 0x8B4B, "GL_MAX_VARYING_FLOATS_ARB" }, +{ 0x8B4B, "GL_MAX_VARYING_FLOATS" }, +{ 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB" }, +{ 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS" }, +{ 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB" }, +{ 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS" }, +{ 0x8B4E, "GL_OBJECT_TYPE_ARB" }, +{ 0x8B4F, "GL_OBJECT_SUBTYPE_ARB" }, +{ 0x8B4F, "GL_SHADER_TYPE" }, +{ 0x8B50, "GL_FLOAT_VEC2_ARB" }, +{ 0x8B50, "GL_FLOAT_VEC2" }, +{ 0x8B51, "GL_FLOAT_VEC3_ARB" }, +{ 0x8B51, "GL_FLOAT_VEC3" }, +{ 0x8B52, "GL_FLOAT_VEC4_ARB" }, +{ 0x8B52, "GL_FLOAT_VEC4" }, +{ 0x8B53, "GL_INT_VEC2_ARB" }, +{ 0x8B53, "GL_INT_VEC2" }, +{ 0x8B54, "GL_INT_VEC3_ARB" }, +{ 0x8B54, "GL_INT_VEC3" }, +{ 0x8B55, "GL_INT_VEC4_ARB" }, +{ 0x8B55, "GL_INT_VEC4" }, +{ 0x8B56, "GL_BOOL_ARB" }, +{ 0x8B56, "GL_BOOL" }, +{ 0x8B57, "GL_BOOL_VEC2_ARB" }, +{ 0x8B57, "GL_BOOL_VEC2" }, +{ 0x8B58, "GL_BOOL_VEC3_ARB" }, +{ 0x8B58, "GL_BOOL_VEC3" }, +{ 0x8B59, "GL_BOOL_VEC4_ARB" }, +{ 0x8B59, "GL_BOOL_VEC4" }, +{ 0x8B5A, "GL_FLOAT_MAT2_ARB" }, +{ 0x8B5A, "GL_FLOAT_MAT2" }, +{ 0x8B5B, "GL_FLOAT_MAT3_ARB" }, +{ 0x8B5B, "GL_FLOAT_MAT3" }, +{ 0x8B5C, "GL_FLOAT_MAT4_ARB" }, +{ 0x8B5C, "GL_FLOAT_MAT4" }, +{ 0x8B5D, "GL_SAMPLER_1D_ARB" }, +{ 0x8B5D, "GL_SAMPLER_1D" }, +{ 0x8B5E, "GL_SAMPLER_2D_ARB" }, +{ 0x8B5E, "GL_SAMPLER_2D" }, +{ 0x8B5F, "GL_SAMPLER_3D_ARB" }, +{ 0x8B5F, "GL_SAMPLER_3D" }, +{ 0x8B60, "GL_SAMPLER_CUBE_ARB" }, +{ 0x8B60, "GL_SAMPLER_CUBE" }, +{ 0x8B61, "GL_SAMPLER_1D_SHADOW_ARB" }, +{ 0x8B61, "GL_SAMPLER_1D_SHADOW" }, +{ 0x8B62, "GL_SAMPLER_2D_SHADOW_ARB" }, +{ 0x8B62, "GL_SAMPLER_2D_SHADOW" }, +{ 0x8B63, "GL_SAMPLER_2D_RECT_ARB" }, +{ 0x8B64, "GL_SAMPLER_2D_RECT_SHADOW_ARB" }, +{ 0x8B65, "GL_FLOAT_MAT2x3" }, +{ 0x8B66, "GL_FLOAT_MAT2x4" }, +{ 0x8B67, "GL_FLOAT_MAT3x2" }, +{ 0x8B68, "GL_FLOAT_MAT3x4" }, +{ 0x8B69, "GL_FLOAT_MAT4x2" }, +{ 0x8B6A, "GL_FLOAT_MAT4x3" }, +{ 0x8B80, "GL_DELETE_STATUS" }, +{ 0x8B80, "GL_OBJECT_DELETE_STATUS_ARB" }, +{ 0x8B81, "GL_COMPILE_STATUS" }, +{ 0x8B81, "GL_OBJECT_COMPILE_STATUS_ARB" }, +{ 0x8B82, "GL_LINK_STATUS" }, +{ 0x8B82, "GL_OBJECT_LINK_STATUS_ARB" }, +{ 0x8B83, "GL_OBJECT_VALIDATE_STATUS_ARB" }, +{ 0x8B83, "GL_VALIDATE_STATUS" }, +{ 0x8B84, "GL_INFO_LOG_LENGTH" }, +{ 0x8B84, "GL_OBJECT_INFO_LOG_LENGTH_ARB" }, +{ 0x8B85, "GL_ATTACHED_SHADERS" }, +{ 0x8B85, "GL_OBJECT_ATTACHED_OBJECTS_ARB" }, +{ 0x8B86, "GL_ACTIVE_UNIFORMS" }, +{ 0x8B86, "GL_OBJECT_ACTIVE_UNIFORMS_ARB" }, +{ 0x8B87, "GL_ACTIVE_UNIFORM_MAX_LENGTH" }, +{ 0x8B87, "GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB" }, +{ 0x8B88, "GL_OBJECT_SHADER_SOURCE_LENGTH_ARB" }, +{ 0x8B88, "GL_SHADER_SOURCE_LENGTH" }, +{ 0x8B89, "GL_ACTIVE_ATTRIBUTES" }, +{ 0x8B89, "GL_OBJECT_ACTIVE_ATTRIBUTES_ARB" }, +{ 0x8B8A, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH" }, +{ 0x8B8A, "GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB" }, +{ 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB" }, +{ 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT" }, +{ 0x8B8C, "GL_SHADING_LANGUAGE_VERSION_ARB" }, +{ 0x8B8C, "GL_SHADING_LANGUAGE_VERSION" }, +{ 0x8B8D, "GL_CURRENT_PROGRAM" }, +{ 0x8C10, "GL_TEXTURE_RED_TYPE_ARB" }, +{ 0x8C10, "GL_TEXTURE_RED_TYPE" }, +{ 0x8C11, "GL_TEXTURE_GREEN_TYPE_ARB" }, +{ 0x8C11, "GL_TEXTURE_GREEN_TYPE" }, +{ 0x8C12, "GL_TEXTURE_BLUE_TYPE_ARB" }, +{ 0x8C12, "GL_TEXTURE_BLUE_TYPE" }, +{ 0x8C13, "GL_TEXTURE_ALPHA_TYPE_ARB" }, +{ 0x8C13, "GL_TEXTURE_ALPHA_TYPE" }, +{ 0x8C14, "GL_TEXTURE_LUMINANCE_TYPE_ARB" }, +{ 0x8C15, "GL_TEXTURE_INTENSITY_TYPE_ARB" }, +{ 0x8C16, "GL_TEXTURE_DEPTH_TYPE_ARB" }, +{ 0x8C16, "GL_TEXTURE_DEPTH_TYPE" }, +{ 0x8C17, "GL_UNSIGNED_NORMALIZED_ARB" }, +{ 0x8C17, "GL_UNSIGNED_NORMALIZED" }, +{ 0x8C18, "GL_TEXTURE_1D_ARRAY_EXT" }, +{ 0x8C19, "GL_PROXY_TEXTURE_1D_ARRAY_EXT" }, +{ 0x8C1A, "GL_TEXTURE_2D_ARRAY_EXT" }, +{ 0x8C1B, "GL_PROXY_TEXTURE_2D_ARRAY_EXT" }, +{ 0x8C1C, "GL_TEXTURE_BINDING_1D_ARRAY_EXT" }, +{ 0x8C1D, "GL_TEXTURE_BINDING_2D_ARRAY_EXT" }, +{ 0x8C29, "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT" }, +{ 0x8C3A, "GL_R11F_G11F_B10F_EXT" }, +{ 0x8C3B, "GL_UNSIGNED_INT_10F_11F_11F_REV_EXT" }, +{ 0x8C3C, "GL_RGBA_SIGNED_COMPONENTS_EXT" }, +{ 0x8C3D, "GL_RGB9_E5_EXT" }, +{ 0x8C3E, "GL_UNSIGNED_INT_5_9_9_9_REV_EXT" }, +{ 0x8C3F, "GL_TEXTURE_SHARED_SIZE_EXT" }, +{ 0x8C40, "GL_SRGB_EXT" }, +{ 0x8C40, "GL_SRGB" }, +{ 0x8C41, "GL_SRGB8_EXT" }, +{ 0x8C41, "GL_SRGB8" }, +{ 0x8C42, "GL_SRGB_ALPHA_EXT" }, +{ 0x8C42, "GL_SRGB_ALPHA" }, +{ 0x8C43, "GL_SRGB8_ALPHA8_EXT" }, +{ 0x8C43, "GL_SRGB8_ALPHA8" }, +{ 0x8C44, "GL_SLUMINANCE_ALPHA_EXT" }, +{ 0x8C44, "GL_SLUMINANCE_ALPHA" }, +{ 0x8C45, "GL_SLUMINANCE8_ALPHA8_EXT" }, +{ 0x8C45, "GL_SLUMINANCE8_ALPHA8" }, +{ 0x8C46, "GL_SLUMINANCE_EXT" }, +{ 0x8C46, "GL_SLUMINANCE" }, +{ 0x8C47, "GL_SLUMINANCE8_EXT" }, +{ 0x8C47, "GL_SLUMINANCE8" }, +{ 0x8C48, "GL_COMPRESSED_SRGB_EXT" }, +{ 0x8C48, "GL_COMPRESSED_SRGB" }, +{ 0x8C49, "GL_COMPRESSED_SRGB_ALPHA_EXT" }, +{ 0x8C49, "GL_COMPRESSED_SRGB_ALPHA" }, +{ 0x8C4A, "GL_COMPRESSED_SLUMINANCE_EXT" }, +{ 0x8C4A, "GL_COMPRESSED_SLUMINANCE" }, +{ 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA_EXT" }, +{ 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA" }, +{ 0x8C4C, "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT" }, +{ 0x8C4D, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT" }, +{ 0x8C4E, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT" }, +{ 0x8C4F, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT" }, +{ 0x8C76, "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT" }, +{ 0x8C7F, "GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT" }, +{ 0x8C80, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT" }, +{ 0x8C83, "GL_TRANSFORM_FEEDBACK_VARYINGS_EXT" }, +{ 0x8C84, "GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT" }, +{ 0x8C85, "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT" }, +{ 0x8C87, "GL_PRIMITIVES_GENERATED_EXT" }, +{ 0x8C88, "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT" }, +{ 0x8C89, "GL_RASTERIZER_DISCARD_EXT" }, +{ 0x8C8A, "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT" }, +{ 0x8C8B, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT" }, +{ 0x8C8C, "GL_INTERLEAVED_ATTRIBS_EXT" }, +{ 0x8C8D, "GL_SEPARATE_ATTRIBS_EXT" }, +{ 0x8C8E, "GL_TRANSFORM_FEEDBACK_BUFFER_EXT" }, +{ 0x8C8F, "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT" }, +{ 0x8CA0, "GL_POINT_SPRITE_COORD_ORIGIN" }, +{ 0x8CA1, "GL_LOWER_LEFT" }, +{ 0x8CA2, "GL_UPPER_LEFT" }, +{ 0x8CA3, "GL_STENCIL_BACK_REF" }, +{ 0x8CA4, "GL_STENCIL_BACK_VALUE_MASK" }, +{ 0x8CA5, "GL_STENCIL_BACK_WRITEMASK" }, +{ 0x8CA6, "GL_DRAW_FRAMEBUFFER_BINDING_EXT" }, +{ 0x8CA6, "GL_FRAMEBUFFER_BINDING_EXT" }, +{ 0x8CA6, "GL_FRAMEBUFFER_BINDING" }, +{ 0x8CA7, "GL_RENDERBUFFER_BINDING_EXT" }, +{ 0x8CA7, "GL_RENDERBUFFER_BINDING" }, +{ 0x8CA8, "GL_READ_FRAMEBUFFER_EXT" }, +{ 0x8CA8, "GL_READ_FRAMEBUFFER" }, +{ 0x8CA9, "GL_DRAW_FRAMEBUFFER_EXT" }, +{ 0x8CA9, "GL_DRAW_FRAMEBUFFER" }, +{ 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING_EXT" }, +{ 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING" }, +{ 0x8CAB, "GL_RENDERBUFFER_SAMPLES_EXT" }, +{ 0x8CAB, "GL_RENDERBUFFER_SAMPLES" }, +{ 0x8CAC, "GL_DEPTH_COMPONENT32F" }, +{ 0x8CAD, "GL_DEPTH32F_STENCIL8" }, +{ 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT" }, +{ 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE" }, +{ 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT" }, +{ 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME" }, +{ 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT" }, +{ 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL" }, +{ 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT" }, +{ 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" }, +{ 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT" }, +{ 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT" }, +{ 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER" }, +{ 0x8CD5, "GL_FRAMEBUFFER_COMPLETE_EXT" }, +{ 0x8CD5, "GL_FRAMEBUFFER_COMPLETE" }, +{ 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT" }, +{ 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT" }, +{ 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT" }, +{ 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" }, +{ 0x8CD9, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT" }, +{ 0x8CDA, "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT" }, +{ 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT" }, +{ 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER" }, +{ 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT" }, +{ 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER" }, +{ 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED_EXT" }, +{ 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED" }, +{ 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS_EXT" }, +{ 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS" }, +{ 0x8CE0, "GL_COLOR_ATTACHMENT0_EXT" }, +{ 0x8CE0, "GL_COLOR_ATTACHMENT0" }, +{ 0x8CE1, "GL_COLOR_ATTACHMENT1_EXT" }, +{ 0x8CE1, "GL_COLOR_ATTACHMENT1" }, +{ 0x8CE2, "GL_COLOR_ATTACHMENT2_EXT" }, +{ 0x8CE2, "GL_COLOR_ATTACHMENT2" }, +{ 0x8CE3, "GL_COLOR_ATTACHMENT3_EXT" }, +{ 0x8CE3, "GL_COLOR_ATTACHMENT3" }, +{ 0x8CE4, "GL_COLOR_ATTACHMENT4_EXT" }, +{ 0x8CE4, "GL_COLOR_ATTACHMENT4" }, +{ 0x8CE5, "GL_COLOR_ATTACHMENT5_EXT" }, +{ 0x8CE5, "GL_COLOR_ATTACHMENT5" }, +{ 0x8CE6, "GL_COLOR_ATTACHMENT6_EXT" }, +{ 0x8CE6, "GL_COLOR_ATTACHMENT6" }, +{ 0x8CE7, "GL_COLOR_ATTACHMENT7_EXT" }, +{ 0x8CE7, "GL_COLOR_ATTACHMENT7" }, +{ 0x8CE8, "GL_COLOR_ATTACHMENT8_EXT" }, +{ 0x8CE8, "GL_COLOR_ATTACHMENT8" }, +{ 0x8CE9, "GL_COLOR_ATTACHMENT9_EXT" }, +{ 0x8CE9, "GL_COLOR_ATTACHMENT9" }, +{ 0x8CEA, "GL_COLOR_ATTACHMENT10_EXT" }, +{ 0x8CEA, "GL_COLOR_ATTACHMENT10" }, +{ 0x8CEB, "GL_COLOR_ATTACHMENT11_EXT" }, +{ 0x8CEB, "GL_COLOR_ATTACHMENT11" }, +{ 0x8CEC, "GL_COLOR_ATTACHMENT12_EXT" }, +{ 0x8CEC, "GL_COLOR_ATTACHMENT12" }, +{ 0x8CED, "GL_COLOR_ATTACHMENT13_EXT" }, +{ 0x8CED, "GL_COLOR_ATTACHMENT13" }, +{ 0x8CEE, "GL_COLOR_ATTACHMENT14_EXT" }, +{ 0x8CEE, "GL_COLOR_ATTACHMENT14" }, +{ 0x8CEF, "GL_COLOR_ATTACHMENT15_EXT" }, +{ 0x8CEF, "GL_COLOR_ATTACHMENT15" }, +{ 0x8D00, "GL_DEPTH_ATTACHMENT_EXT" }, +{ 0x8D00, "GL_DEPTH_ATTACHMENT" }, +{ 0x8D20, "GL_STENCIL_ATTACHMENT_EXT" }, +{ 0x8D20, "GL_STENCIL_ATTACHMENT" }, +{ 0x8D40, "GL_FRAMEBUFFER_EXT" }, +{ 0x8D40, "GL_FRAMEBUFFER" }, +{ 0x8D41, "GL_RENDERBUFFER_EXT" }, +{ 0x8D41, "GL_RENDERBUFFER" }, +{ 0x8D42, "GL_RENDERBUFFER_WIDTH_EXT" }, +{ 0x8D42, "GL_RENDERBUFFER_WIDTH" }, +{ 0x8D43, "GL_RENDERBUFFER_HEIGHT_EXT" }, +{ 0x8D43, "GL_RENDERBUFFER_HEIGHT" }, +{ 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT_EXT" }, +{ 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT" }, +{ 0x8D46, "GL_STENCIL_INDEX1_EXT" }, +{ 0x8D46, "GL_STENCIL_INDEX1" }, +{ 0x8D47, "GL_STENCIL_INDEX4_EXT" }, +{ 0x8D47, "GL_STENCIL_INDEX4" }, +{ 0x8D48, "GL_STENCIL_INDEX8_EXT" }, +{ 0x8D48, "GL_STENCIL_INDEX8" }, +{ 0x8D49, "GL_STENCIL_INDEX16_EXT" }, +{ 0x8D49, "GL_STENCIL_INDEX16" }, +{ 0x8D50, "GL_RENDERBUFFER_RED_SIZE_EXT" }, +{ 0x8D50, "GL_RENDERBUFFER_RED_SIZE" }, +{ 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE_EXT" }, +{ 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE" }, +{ 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE_EXT" }, +{ 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE" }, +{ 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE_EXT" }, +{ 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE" }, +{ 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE_EXT" }, +{ 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE" }, +{ 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE_EXT" }, +{ 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE" }, +{ 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT" }, +{ 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" }, +{ 0x8D57, "GL_MAX_SAMPLES_EXT" }, +{ 0x8D57, "GL_MAX_SAMPLES" }, +{ 0x8D70, "GL_RGBA32UI_EXT" }, +{ 0x8D71, "GL_RGB32UI_EXT" }, +{ 0x8D72, "GL_ALPHA32UI_EXT" }, +{ 0x8D73, "GL_INTENSITY32UI_EXT" }, +{ 0x8D74, "GL_LUMINANCE32UI_EXT" }, +{ 0x8D75, "GL_LUMINANCE_ALPHA32UI_EXT" }, +{ 0x8D76, "GL_RGBA16UI_EXT" }, +{ 0x8D77, "GL_RGB16UI_EXT" }, +{ 0x8D78, "GL_ALPHA16UI_EXT" }, +{ 0x8D79, "GL_INTENSITY16UI_EXT" }, +{ 0x8D7A, "GL_LUMINANCE16UI_EXT" }, +{ 0x8D7B, "GL_LUMINANCE_ALPHA16UI_EXT" }, +{ 0x8D7C, "GL_RGBA8UI_EXT" }, +{ 0x8D7D, "GL_RGB8UI_EXT" }, +{ 0x8D7E, "GL_ALPHA8UI_EXT" }, +{ 0x8D7F, "GL_INTENSITY8UI_EXT" }, +{ 0x8D80, "GL_LUMINANCE8UI_EXT" }, +{ 0x8D81, "GL_LUMINANCE_ALPHA8UI_EXT" }, +{ 0x8D82, "GL_RGBA32I_EXT" }, +{ 0x8D83, "GL_RGB32I_EXT" }, +{ 0x8D84, "GL_ALPHA32I_EXT" }, +{ 0x8D85, "GL_INTENSITY32I_EXT" }, +{ 0x8D86, "GL_LUMINANCE32I_EXT" }, +{ 0x8D87, "GL_LUMINANCE_ALPHA32I_EXT" }, +{ 0x8D88, "GL_RGBA16I_EXT" }, +{ 0x8D89, "GL_RGB16I_EXT" }, +{ 0x8D8A, "GL_ALPHA16I_EXT" }, +{ 0x8D8B, "GL_INTENSITY16I_EXT" }, +{ 0x8D8C, "GL_LUMINANCE16I_EXT" }, +{ 0x8D8D, "GL_LUMINANCE_ALPHA16I_EXT" }, +{ 0x8D8E, "GL_RGBA8I_EXT" }, +{ 0x8D8F, "GL_RGB8I_EXT" }, +{ 0x8D90, "GL_ALPHA8I_EXT" }, +{ 0x8D91, "GL_INTENSITY8I_EXT" }, +{ 0x8D92, "GL_LUMINANCE8I_EXT" }, +{ 0x8D93, "GL_LUMINANCE_ALPHA8I_EXT" }, +{ 0x8D94, "GL_RED_INTEGER_EXT" }, +{ 0x8D95, "GL_GREEN_INTEGER_EXT" }, +{ 0x8D96, "GL_BLUE_INTEGER_EXT" }, +{ 0x8D97, "GL_ALPHA_INTEGER_EXT" }, +{ 0x8D98, "GL_RGB_INTEGER_EXT" }, +{ 0x8D99, "GL_RGBA_INTEGER_EXT" }, +{ 0x8D9A, "GL_BGR_INTEGER_EXT" }, +{ 0x8D9B, "GL_BGRA_INTEGER_EXT" }, +{ 0x8D9C, "GL_LUMINANCE_INTEGER_EXT" }, +{ 0x8D9D, "GL_LUMINANCE_ALPHA_INTEGER_EXT" }, +{ 0x8D9E, "GL_RGBA_INTEGER_MODE_EXT" }, +{ 0x8DA7, "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT" }, +{ 0x8DA8, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT" }, +{ 0x8DA9, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT" }, +{ 0x8DAD, "GL_FLOAT_32_UNSIGNED_INT_24_8_REV" }, +{ 0x8DB9, "GL_FRAMEBUFFER_SRGB_EXT" }, +{ 0x8DBA, "GL_FRAMEBUFFER_SRGB_CAPABLE_EXT" }, +{ 0x8DBB, "GL_COMPRESSED_RED_RGTC1" }, +{ 0x8DBC, "GL_COMPRESSED_SIGNED_RED_RGTC1" }, +{ 0x8DBD, "GL_COMPRESSED_RG_RGTC2" }, +{ 0x8DBE, "GL_COMPRESSED_SIGNED_RG_RGTC2" }, +{ 0x8DC0, "GL_SAMPLER_1D_ARRAY_EXT" }, +{ 0x8DC1, "GL_SAMPLER_2D_ARRAY_EXT" }, +{ 0x8DC2, "GL_SAMPLER_BUFFER_EXT" }, +{ 0x8DC3, "GL_SAMPLER_1D_ARRAY_SHADOW_EXT" }, +{ 0x8DC4, "GL_SAMPLER_2D_ARRAY_SHADOW_EXT" }, +{ 0x8DC5, "GL_SAMPLER_CUBE_SHADOW_EXT" }, +{ 0x8DC6, "GL_UNSIGNED_INT_VEC2_EXT" }, +{ 0x8DC7, "GL_UNSIGNED_INT_VEC3_EXT" }, +{ 0x8DC8, "GL_UNSIGNED_INT_VEC4_EXT" }, +{ 0x8DC9, "GL_INT_SAMPLER_1D_EXT" }, +{ 0x8DCA, "GL_INT_SAMPLER_2D_EXT" }, +{ 0x8DCB, "GL_INT_SAMPLER_3D_EXT" }, +{ 0x8DCC, "GL_INT_SAMPLER_CUBE_EXT" }, +{ 0x8DCD, "GL_INT_SAMPLER_2D_RECT_EXT" }, +{ 0x8DCE, "GL_INT_SAMPLER_1D_ARRAY_EXT" }, +{ 0x8DCF, "GL_INT_SAMPLER_2D_ARRAY_EXT" }, +{ 0x8DD0, "GL_INT_SAMPLER_BUFFER_EXT" }, +{ 0x8DD1, "GL_UNSIGNED_INT_SAMPLER_1D_EXT" }, +{ 0x8DD2, "GL_UNSIGNED_INT_SAMPLER_2D_EXT" }, +{ 0x8DD3, "GL_UNSIGNED_INT_SAMPLER_3D_EXT" }, +{ 0x8DD4, "GL_UNSIGNED_INT_SAMPLER_CUBE_EXT" }, +{ 0x8DD5, "GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT" }, +{ 0x8DD6, "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT" }, +{ 0x8DD7, "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT" }, +{ 0x8DD8, "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT" }, +{ 0x8DD9, "GL_GEOMETRY_SHADER_EXT" }, +{ 0x8DDA, "GL_GEOMETRY_VERTICES_OUT_EXT" }, +{ 0x8DDB, "GL_GEOMETRY_INPUT_TYPE_EXT" }, +{ 0x8DDC, "GL_GEOMETRY_OUTPUT_TYPE_EXT" }, +{ 0x8DDD, "GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT" }, +{ 0x8DDE, "GL_MAX_VERTEX_VARYING_COMPONENTS_EXT" }, +{ 0x8DDF, "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT" }, +{ 0x8DE0, "GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT" }, +{ 0x8DE1, "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT" }, +{ 0x8DE2, "GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT" }, +{ 0x8DE3, "GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT" }, +{ 0x8DE4, "GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT" }, +{ 0x8DED, "GL_MAX_BINDABLE_UNIFORM_SIZE_EXT" }, +{ 0x8DEE, "GL_UNIFORM_BUFFER_EXT" }, +{ 0x8DEF, "GL_UNIFORM_BUFFER_BINDING_EXT" }, +{ 0x8E4C, "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT" }, +{ 0x8E4D, "GL_FIRST_VERTEX_CONVENTION_EXT" }, +{ 0x8E4E, "GL_LAST_VERTEX_CONVENTION_EXT" }, +{ 0x8E4F, "GL_PROVOKING_VERTEX_EXT" } +}; + +const char *get_enum_str(uint val) +{ + for(int i = 0; i < ARRAYSIZE(g_glEnums); i++) + { + if( g_glEnums[i].value == val ) + return g_glEnums[i].str; + } + + return "UNKNOWN"; +} + +typedef union { + uint16_t bin; + struct { + uint16_t sign:1; + uint16_t exp:5; + uint16_t mant:10; + } x; +} halffloat_t; + +typedef union { + float f; + uint32_t bin; + struct { + uint32_t sign:1; + uint32_t exp:8; + uint32_t mant:23; + } x; +} fullfloat_t; + +static inline float float_h2f(halffloat_t t) +{ + fullfloat_t tmp; + tmp.x.sign = t.x.sign; // copy sign + if(t.x.exp==0 /*&& t.mant==0*/) { + // 0 and denormal? + tmp.x.exp=0; + tmp.x.mant=0; + } else if (t.x.exp==31) { + // Inf / NaN + tmp.x.exp=255; + tmp.x.mant=(t.x.mant<<13); + } else { + tmp.x.mant=(t.x.mant<<13); + tmp.x.exp = t.x.exp+0x38; + } + + return tmp.f; +} + +void TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void * data) +{ + if( type == GL_UNSIGNED_INT_8_8_8_8_REV ) + type = GL_UNSIGNED_BYTE; + + if( format == GL_BGR ) + format = GL_RGB; + + if( format == GL_BGRA ) + format = GL_RGBA; + + if( internalformat == GL_SRGB8 && format == GL_RGBA ) + internalformat = GL_SRGB8_ALPHA8; + + if( format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA ) + internalformat = format; + +#if 0 + if( internalformat == GL_SRGB8 ) + internalformat = GL_RGB; + if( internalformat == GL_SRGB8_ALPHA8 ) + internalformat = GL_RGBA;*/ + + if( data ) + { + if( internalformat == GL_RGBA16F ) + { + uint16_t *_data = (uint16_t*)data; + uint8_t *new_data = (uint8_t*)data; + + for( int i = 0; i < width*height*4; i+=4 ) + { + halffloat_t fl; + fl.bin = _data[i]; new_data[i] = float_h2f(fl)*255; + fl.bin = _data[i+1]; new_data[i+1] = float_h2f(fl)*255; + fl.bin = _data[i+2]; new_data[i+2] = float_h2f(fl)*255; + fl.bin = _data[i+3]; new_data[i+3] = float_h2f(fl)*255; + } + internalformat = GL_RGBA; + type = GL_UNSIGNED_BYTE; + } + else if( internalformat == GL_RGBA16 ) + { + uint16_t *_data = (uint16_t*)data; + uint8_t *new_data = (uint8_t*)data; + + for( int i = 0; i < width*height*4; i+=4 ) + { + new_data[i] = _data[i] >> 8; + new_data[i+1] = _data[i+1] >> 8; + new_data[i+2] = _data[i+2] >> 8; + new_data[i+3] = _data[i+3] >> 8; + } + + data = new_data; + internalformat = GL_RGBA; + type = GL_UNSIGNED_BYTE; + } + } +#endif + + gGL->glTexImage2D(target, level, internalformat, width, height, border, format, type, data); +} + +GLboolean isDXTc(GLenum format) { + switch (format) { + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: + return 1; + } + return 0; +} + +GLboolean isDXTcSRGB(GLenum format) { + switch (format) { + case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: + return 1; + } + return 0; +} + +static GLboolean isDXTcAlpha(GLenum format) { + switch (format) { + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: + return 1; + } + return 0; +} + +GLvoid *uncompressDXTc(GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, int transparent0, int* simpleAlpha, int* complexAlpha, const GLvoid *data) { + // uncompress a DXTc image + // get pixel size of uncompressed image => fixed RGBA + int pixelsize = 4; +/* if (format==COMPRESSED_RGB_S3TC_DXT1_EXT) + pixelsize = 3;*/ + // check with the size of the input data stream if the stream is in fact uncompressed + if (imageSize == width*height*pixelsize || data==NULL) { + // uncompressed stream + return (GLvoid*)data; + } + // alloc memory + GLvoid *pixels = malloc(((width+3)&~3)*((height+3)&~3)*pixelsize); + // uncompress loop + int blocksize; + switch (format) { + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: + blocksize = 8; + break; + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: + case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: + blocksize = 16; + break; + } + uintptr_t src = (uintptr_t) data; + for (int y=0; yglTexImage2D(target, 0, internalformat, width, height, border, format, type, data); + + TexImage2D( target, level, intformat, width, height, border, format, type, pixels ); +} // TexSubImage should work properly on every driver stack and GPU--enabling by default. ConVar gl_enabletexsubimage( "gl_enabletexsubimage", "1" ); @@ -1373,7 +3664,7 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa // compressed path // http://www.opengl.org/sdk/docs/man/xhtml/glCompressedTexImage2D.xml - gGL->glCompressedTexImage2D( target, // target + CompressedTexImage2D( target, // target desc->m_req.m_mip, // level intformat, // internalformat - don't use format->m_glIntFormat because we have the SRGB select going on above slice->m_xSize, // width @@ -1440,14 +3731,14 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa // uncompressed path // http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html - gGL->glTexImage2D( target, // target + TexImage2D( target, // target desc->m_req.m_mip, // level - glDataFormat, // internalformat - don't use format->m_glIntFormat because we have the SRGB select going on above + intformat, // internalformat - don't use format->m_glIntFormat because we have the SRGB select going on above slice->m_xSize, // width slice->m_ySize, // height 0, // border glDataFormat, // dataformat - glDataType == GL_UNSIGNED_INT_8_8_8_8_REV ? GL_UNSIGNED_BYTE : glDataType, // datatype + glDataType, // datatype noDataWrite ? NULL : sliceAddress ); // data (optionally suppressed in case ResetSRGB desires) if (m_layout->m_key.m_texFlags & kGLMTexMultisampled) diff --git a/togles/linuxwin/decompress.c b/togles/linuxwin/decompress.c new file mode 100644 index 00000000..eabd6893 --- /dev/null +++ b/togles/linuxwin/decompress.c @@ -0,0 +1,341 @@ +#include +#include + +/* +DXT1/DXT3/DXT5 texture decompression + +The original code is from Benjamin Dobell, see below for details. Compared to +the original this one adds DXT3 decompression, is valid C89, and is x64 +compatible as it uses fixed size integers everywhere. It also uses a different +PackRGBA order. + +--- + +Copyright (c) 2012, Matth�us G. "Anteru" Chajdas (http://anteru.net) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +Copyright (C) 2009 Benjamin Dobell, Glass Echidna + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- +*/ +static uint32_t PackRGBA (uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + return r | (g << 8) | (b << 16) | (a << 24); +} + +static void DecompressBlockDXT1Internal (const uint8_t* block, + uint32_t* output, + uint32_t outputStride, + int transparent0, int* simpleAlpha, int *complexAlpha, + const uint8_t* alphaValues) +{ + uint32_t temp, code; + + uint16_t color0, color1; + uint8_t r0, g0, b0, r1, g1, b1; + + int i, j; + + color0 = *(const uint16_t*)(block); + color1 = *(const uint16_t*)(block + 2); + + temp = (color0 >> 11) * 255 + 16; + r0 = (uint8_t)((temp/32 + temp)/32); + temp = ((color0 & 0x07E0) >> 5) * 255 + 32; + g0 = (uint8_t)((temp/64 + temp)/64); + temp = (color0 & 0x001F) * 255 + 16; + b0 = (uint8_t)((temp/32 + temp)/32); + + temp = (color1 >> 11) * 255 + 16; + r1 = (uint8_t)((temp/32 + temp)/32); + temp = ((color1 & 0x07E0) >> 5) * 255 + 32; + g1 = (uint8_t)((temp/64 + temp)/64); + temp = (color1 & 0x001F) * 255 + 16; + b1 = (uint8_t)((temp/32 + temp)/32); + + code = *(const uint32_t*)(block + 4); + + if (color0 > color1) { + for (j = 0; j < 4; ++j) { + for (i = 0; i < 4; ++i) { + uint32_t finalColor, positionCode; + uint8_t alpha; + + alpha = alphaValues [j*4+i]; + + finalColor = 0; + positionCode = (code >> 2*(4*j+i)) & 0x03; + + switch (positionCode) { + case 0: + finalColor = PackRGBA(r0, g0, b0, alpha); + break; + case 1: + finalColor = PackRGBA(r1, g1, b1, alpha); + break; + case 2: + finalColor = PackRGBA((2*r0+r1)/3, (2*g0+g1)/3, (2*b0+b1)/3, alpha); + break; + case 3: + finalColor = PackRGBA((r0+2*r1)/3, (g0+2*g1)/3, (b0+2*b1)/3, alpha); + break; + } + if(!alpha) + *simpleAlpha = 1; + else if(alpha<0xff) + *complexAlpha = 1; + output [j*outputStride + i] = finalColor; + } + } + } else { + for (j = 0; j < 4; ++j) { + for (i = 0; i < 4; ++i) { + uint32_t finalColor, positionCode; + uint8_t alpha; + + alpha = alphaValues [j*4+i]; + + finalColor = 0; + positionCode = (code >> 2*(4*j+i)) & 0x03; + + switch (positionCode) { + case 0: + finalColor = PackRGBA(r0, g0, b0, alpha); + break; + case 1: + finalColor = PackRGBA(r1, g1, b1, alpha); + break; + case 2: + finalColor = PackRGBA((r0+r1)/2, (g0+g1)/2, (b0+b1)/2, alpha); + break; + case 3: + if(transparent0) alpha=0; + finalColor = PackRGBA(0, 0, 0, alpha); + break; + } + + if(!alpha) + *simpleAlpha = 1; + else if(alpha<0xff) + *complexAlpha = 1; + + output [j*outputStride + i] = finalColor; + } + } + } +} + +/* +void DecompressBlockDXT1(): Decompresses one block of a DXT1 texture and stores the resulting pixels at the appropriate offset in 'image'. + +uint32_t x: x-coordinate of the first pixel in the block. +uint32_t y: y-coordinate of the first pixel in the block. +uint32_t width: width of the texture being decompressed. +const uint8_t *blockStorage: pointer to the block to decompress. +uint32_t *image: pointer to image where the decompressed pixel data should be stored. +*/ +void DecompressBlockDXT1(uint32_t x, uint32_t y, uint32_t width, + const uint8_t* blockStorage, + int transparent0, int* simpleAlpha, int *complexAlpha, + uint32_t* image) +{ + static const uint8_t const_alpha [] = { + 255, 255, 255, 255, + 255, 255, 255, 255, + 255, 255, 255, 255, + 255, 255, 255, 255 + }; + + DecompressBlockDXT1Internal (blockStorage, + image + x + (y * width), width, transparent0, simpleAlpha, complexAlpha, const_alpha); +} + +/* +void DecompressBlockDXT5(): Decompresses one block of a DXT5 texture and stores the resulting pixels at the appropriate offset in 'image'. + +uint32_t x: x-coordinate of the first pixel in the block. +uint32_t y: y-coordinate of the first pixel in the block. +uint32_t width: width of the texture being decompressed. +const uint8_t *blockStorage: pointer to the block to decompress. +uint32_t *image: pointer to image where the decompressed pixel data should be stored. +*/ +void DecompressBlockDXT5(uint32_t x, uint32_t y, uint32_t width, + const uint8_t* blockStorage, + int transparent0, int* simpleAlpha, int *complexAlpha, + uint32_t* image) +{ + uint8_t alpha0, alpha1; + const uint8_t* bits; + uint32_t alphaCode1; + uint16_t alphaCode2; + + uint16_t color0, color1; + uint8_t r0, g0, b0, r1, g1, b1; + + int i, j; + + uint32_t temp, code; + + alpha0 = *(blockStorage); + alpha1 = *(blockStorage + 1); + + bits = blockStorage + 2; + alphaCode1 = bits[2] | (bits[3] << 8) | (bits[4] << 16) | (bits[5] << 24); + alphaCode2 = bits[0] | (bits[1] << 8); + + color0 = *(const uint16_t*)(blockStorage + 8); + color1 = *(const uint16_t*)(blockStorage + 10); + + temp = (color0 >> 11) * 255 + 16; + r0 = (uint8_t)((temp/32 + temp)/32); + temp = ((color0 & 0x07E0) >> 5) * 255 + 32; + g0 = (uint8_t)((temp/64 + temp)/64); + temp = (color0 & 0x001F) * 255 + 16; + b0 = (uint8_t)((temp/32 + temp)/32); + + temp = (color1 >> 11) * 255 + 16; + r1 = (uint8_t)((temp/32 + temp)/32); + temp = ((color1 & 0x07E0) >> 5) * 255 + 32; + g1 = (uint8_t)((temp/64 + temp)/64); + temp = (color1 & 0x001F) * 255 + 16; + b1 = (uint8_t)((temp/32 + temp)/32); + + code = *(const uint32_t*)(blockStorage + 12); + + for (j = 0; j < 4; j++) { + for (i = 0; i < 4; i++) { + uint8_t finalAlpha; + int alphaCode, alphaCodeIndex; + uint8_t colorCode; + uint32_t finalColor; + + alphaCodeIndex = 3*(4*j+i); + if (alphaCodeIndex <= 12) { + alphaCode = (alphaCode2 >> alphaCodeIndex) & 0x07; + } else if (alphaCodeIndex == 15) { + alphaCode = (alphaCode2 >> 15) | ((alphaCode1 << 1) & 0x06); + } else /* alphaCodeIndex >= 18 && alphaCodeIndex <= 45 */ { + alphaCode = (alphaCode1 >> (alphaCodeIndex - 16)) & 0x07; + } + + if (alphaCode == 0) { + finalAlpha = alpha0; + } else if (alphaCode == 1) { + finalAlpha = alpha1; + } else { + if (alpha0 > alpha1) { + finalAlpha = (uint8_t)(((8-alphaCode)*alpha0 + (alphaCode-1)*alpha1)/7); + } else { + if (alphaCode == 6) { + finalAlpha = 0; + } else if (alphaCode == 7) { + finalAlpha = 255; + } else { + finalAlpha = (uint8_t)(((6-alphaCode)*alpha0 + (alphaCode-1)*alpha1)/5); + } + } + } + + colorCode = (code >> 2*(4*j+i)) & 0x03; + finalColor = 0; + + switch (colorCode) { + case 0: + finalColor = PackRGBA(r0, g0, b0, finalAlpha); + break; + case 1: + finalColor = PackRGBA(r1, g1, b1, finalAlpha); + break; + case 2: + finalColor = PackRGBA((2*r0+r1)/3, (2*g0+g1)/3, (2*b0+b1)/3, finalAlpha); + break; + case 3: + finalColor = PackRGBA((r0+2*r1)/3, (g0+2*g1)/3, (b0+2*b1)/3, finalAlpha); + break; + } + + if(finalAlpha==0) *simpleAlpha = 1; + else if(finalAlpha<0xff) *complexAlpha = 1; + + image [i + x + (width* (y+j))] = finalColor; + } + } +} + +/* +void DecompressBlockDXT3(): Decompresses one block of a DXT3 texture and stores the resulting pixels at the appropriate offset in 'image'. + +uint32_t x: x-coordinate of the first pixel in the block. +uint32_t y: y-coordinate of the first pixel in the block. +uint32_t height: height of the texture being decompressed. +const uint8_t *blockStorage: pointer to the block to decompress. +uint32_t *image: pointer to image where the decompressed pixel data should be stored. +*/ +void DecompressBlockDXT3(uint32_t x, uint32_t y, uint32_t width, + const uint8_t* blockStorage, + int transparent0, int* simpleAlpha, int *complexAlpha, + uint32_t* image) +{ + int i; + + uint8_t alphaValues [16] = { 0 }; + + for (i = 0; i < 4; ++i) { + const uint16_t* alphaData = (const uint16_t*) (blockStorage); + + alphaValues [i*4 + 0] = (((*alphaData) >> 0) & 0xF ) * 17; + alphaValues [i*4 + 1] = (((*alphaData) >> 4) & 0xF ) * 17; + alphaValues [i*4 + 2] = (((*alphaData) >> 8) & 0xF ) * 17; + alphaValues [i*4 + 3] = (((*alphaData) >> 12) & 0xF) * 17; + + blockStorage += 2; + } + + DecompressBlockDXT1Internal (blockStorage, + image + x + (y * width), width, transparent0, simpleAlpha, complexAlpha, alphaValues); +} + +// Texture DXT1 / DXT5 compression +// Using STB "on file" library +// go there https://github.com/nothings/stb +// for more details and other libs + +#define STB_DXT_IMPLEMENTATION +#include "stb_dxt_104.h" diff --git a/togles/linuxwin/decompress.h b/togles/linuxwin/decompress.h new file mode 100644 index 00000000..e9e5da83 --- /dev/null +++ b/togles/linuxwin/decompress.h @@ -0,0 +1,19 @@ +#ifndef _GL4ES_DECOMPRESS_H_ +#define _GL4ES_DECOMPRESS_H_ + +void DecompressBlockDXT1(uint32_t x, uint32_t y, uint32_t width, + const uint8_t* blockStorage, + int transparent0, int* simpleAlpha, int *complexAlpha, + uint32_t* image); + +void DecompressBlockDXT3(uint32_t x, uint32_t y, uint32_t width, + const uint8_t* blockStorage, + int transparent0, int* simpleAlpha, int *complexAlpha, + uint32_t* image); + +void DecompressBlockDXT5(uint32_t x, uint32_t y, uint32_t width, + const uint8_t* blockStorage, + int transparent0, int* simpleAlpha, int *complexAlpha, + uint32_t* image); + +#endif // _GL4ES_DECOMPRESS_H_ diff --git a/togles/linuxwin/decompress.o b/togles/linuxwin/decompress.o new file mode 100644 index 0000000000000000000000000000000000000000..3e88c1046fa3c29e782b4c3fc597b8552ee8b93d GIT binary patch literal 35548 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 LxVe$qnrHtX@qk%C literal 0 HcmV?d00001 diff --git a/togles/linuxwin/dx9asmtogl2.cpp b/togles/linuxwin/dx9asmtogl2.cpp index 7cb89eaf..b2c541ab 100644 --- a/togles/linuxwin/dx9asmtogl2.cpp +++ b/togles/linuxwin/dx9asmtogl2.cpp @@ -69,13 +69,13 @@ static char g_szShadow2D[] = "vec2 p2 = suv.xy+vec2(0.0,invSize);\n" "vec2 p3 = suv.xy+vec2(invSize,0.0);\n" "vec2 p4 = suv.xy+vec2(invSize);\n" - "float d = texture2D(u_depthTex,p1).r;\n" + "float d = texture(u_depthTex,p1).r;\n" "float r = float(d>suv.z);\n" - "d = texture2D(u_depthTex,p2).r;\n" + "d = texture(u_depthTex,p2).r;\n" "float r2 = float(d>suv.z);\n" - "d = texture2D(u_depthTex,p3).r;\n" + "d = texture(u_depthTex,p3).r;\n" "float r3 = float(d>suv.z);\n" - "d = texture2D(u_depthTex,p4).r;\n" + "d = texture(u_depthTex,p4).r;\n" "float r4 = float(d>suv.z);\n" "p1*=size;\n" "float a = p1.y-floor(p1.y);\n" @@ -955,7 +955,7 @@ void D3DToGL::PrintUsageAndIndexToString( uint32 dwToken, char* strUsageUsageInd // if ( fSemanticFlags & SEMANTIC_OUTPUT ) // V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "gl_BackColor" : "gl_FrontColor" ); // else - V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "_gl_SecondaryColor" : "_gl_Color" ); + V_snprintf( strUsageUsageIndexName, nBufLen, dwUsageIndex != 0 ? "_gl_FrontSecondaryColor" : "_gl_FrontColor" ); break; case D3DDECLUSAGE_FOG: TranslationError(); @@ -1220,7 +1220,7 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch } else { - V_snprintf( buff, sizeof( buff ), dwRegNum == 0 ? "_gl_Color" : "_gl_SecondaryColor" ); + V_snprintf( buff, sizeof( buff ), dwRegNum == 0 ? "_gl_FrontColor" : "_gl_FrontSecondaryColor" ); } strcat_s( pRegisterName, nBufLen, buff ); } @@ -1456,7 +1456,6 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch m_dwConstIntUsageMask |= 0x00000001 << dwRegNum; // Keep track of the use of this integer constant break; case D3DSPR_COLOROUT: - // TODO(nillerusr): go fck urself if( dwRegNum+1 > m_iFragDataCount ) m_iFragDataCount = dwRegNum+1; @@ -2546,7 +2545,7 @@ void D3DToGL::Handle_TEX( uint32 dwToken, bool bIsTexLDL ) V_snprintf( szExtra, sizeof( szExtra ), ".%c", GetSwizzleComponent( pSrc0Reg, 3 ) ); V_strncat( szLOD, szExtra, sizeof( szLOD ) ); - PrintToBufWithIndents( *m_pBufALUCode, "%s = %s( %s, %s, %s );\n", pDestReg, bIsShadowSampler ? "shadow2DLod" : "texture2DLod", pSrc1Reg, sCoordVar.String(), szLOD ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s( %s, %s, %s );\n", pDestReg, bIsShadowSampler ? "shadow2DLod" : "textureLod", pSrc1Reg, sCoordVar.String(), szLOD ); } else if ( bIsShadowSampler ) { @@ -2564,12 +2563,12 @@ void D3DToGL::Handle_TEX( uint32 dwToken, bool bIsTexLDL ) // We use the vec4 variant of texture2DProj() intentionally here, since it lines up well with Direct3D. CUtlString s4DProjCoords = EnsureNumSwizzleComponents( pSrc0Reg, 4 ); // Ensure vec4 variant - PrintToBufWithIndents( *m_pBufALUCode, "%s = texture2DProj( %s, %s );\n", pDestReg, pSrc1Reg, s4DProjCoords.String() ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = textureProj( %s, %s );\n", pDestReg, pSrc1Reg, s4DProjCoords.String() ); } - else + else { CUtlString sCoordVar = EnsureNumSwizzleComponents( pSrc0Reg, bIsShadowSampler ? 3 : 2 ); - PrintToBufWithIndents( *m_pBufALUCode, "%s = texture2D( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = texture( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); } } else if ( nSamplerType == SAMPLER_TYPE_3D ) @@ -2580,7 +2579,7 @@ void D3DToGL::Handle_TEX( uint32 dwToken, bool bIsTexLDL ) } CUtlString sCoordVar = EnsureNumSwizzleComponents( pSrc0Reg, 3 ); - PrintToBufWithIndents( *m_pBufALUCode, "%s = texture3D( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = texture( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); } else if ( nSamplerType == SAMPLER_TYPE_CUBE ) { @@ -2590,7 +2589,7 @@ void D3DToGL::Handle_TEX( uint32 dwToken, bool bIsTexLDL ) } CUtlString sCoordVar = EnsureNumSwizzleComponents( pSrc0Reg, 3 ); - PrintToBufWithIndents( *m_pBufALUCode, "%s = textureCube( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = texture( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar.String() ); } else { @@ -3049,7 +3048,7 @@ void D3DToGL::WriteGLSLInputVariableAssignments() if ( dwUsage == D3DDECLUSAGE_COLOR ) { - PrintToBufWithIndents( *m_pBufAttribCode, "vec4 oTempT%d = %s;\n", i, dwUsageIndex ? "_gl_SecondaryColor" : "_gl_Color" ); + PrintToBufWithIndents( *m_pBufAttribCode, "vec4 oTempT%d = %s;\n", i, dwUsageIndex ? "_gl_FrontSecondaryColor" : "_gl_FrontColor" ); } else if ( dwUsage == D3DDECLUSAGE_TEXCOORD ) { @@ -3182,6 +3181,10 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo m_bPutHexCodesAfterLines = (options & D3DToGL_PutHexCommentsAfterLines) != 0; m_bGeneratingDebugText = (options & D3DToGL_GeneratingDebugText) != 0; m_bGenerateSRGBWriteSuffix = (options & D3DToGL_OptionSRGBWriteSuffix) != 0; +// m_bGenerateSRGBWriteSuffix = true; + + if( debugLabel && ( V_strstr( debugLabel ,"vertexlit_and_unlit_generic_bump_ps") )) + m_bGenerateSRGBWriteSuffix = true; m_NumIndentTabs = 1; // start code indented one tab m_nLoopDepth = 0; @@ -3675,6 +3678,7 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo } // Control bit for sRGB Write suffix + if ( m_bGenerateSRGBWriteSuffix ) { // R500 Hookup @@ -3889,33 +3893,38 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo { StrcatToHeaderCode( g_szShadow2D ); StrcatToHeaderCode( g_szShadow2DProj ); - } else if( FindSubcode("shadow2D") ) - StrcatToHeaderCode( g_szShadow2D ); - - if( FindSubcode("_gl_Color") ) - StrcatToHeaderCode( "vec4 _gl_Color;\n" ); - - if( FindSubcode("_gl_SecondaryColor") ) - StrcatToHeaderCode( "vec4 _gl_SecondaryColor;\n" ); + StrcatToHeaderCode( g_szShadow2D ); + if( FindSubcode("_gl_FrontColor") && !m_bFrontColor ) + StrcatToHeaderCode( "in vec4 _gl_FrontColor;\n" ); + + if( FindSubcode("_gl_FrontSecondaryColor") && !m_bFrontSecondaryColor ) + StrcatToHeaderCode( "in vec4 _gl_FrontSecondaryColor;\n" ); + + if( m_iFragDataCount && bVertexShader ) + StrcatToHeaderCode( "\nuniform float alpha_ref;\n" ); + StrcatToHeaderCode( "\nvoid main()\n{\n" ); if ( m_bUsedAtomicTempVar ) { PrintToBufWithIndents( *m_pBufHeaderCode, "vec4 %s;\n\n", g_pAtomicTempVarName ); } - + // sRGB Write suffix if ( m_bGenerateSRGBWriteSuffix ) { - StrcatToALUCode( "vec3 sRGBFragData;\n" ); - StrcatToALUCode( "sRGBFragData.xyz = log( gl_FragData[0].xyz );\n" ); - StrcatToALUCode( "sRGBFragData.xyz = sRGBFragData.xyz * vec3( 0.454545f, 0.454545f, 0.454545f );\n" ); - StrcatToALUCode( "sRGBFragData.xyz = exp( sRGBFragData.xyz );\n" ); - StrcatToALUCode( "gl_FragData[0].xyz = mix( gl_FragData[0].xyz, sRGBFragData, flSRGBWrite );\n" ); + // StrcatToALUCode( "vec3 sRGBFragData;\n" ); + // StrcatToALUCode( "sRGBFragData.xyz = log( gl_FragData[0].xyz );\n" ); + // StrcatToALUCode( "sRGBFragData.xyz = sRGBFragData.xyz * vec3( 0.754545f, 0.754545f, 0.754545f );\n" ); + // StrcatToALUCode( "sRGBFragData.xyz = exp( sRGBFragData.xyz );\n" ); + StrcatToALUCode( "gl_FragData[0].xyz = pow(gl_FragData[0].xyz, vec3(1.0/2.2));\n" ); } + if( m_iFragDataCount && bVertexShader ) + StrcatToALUCode( "if( gl_FragData[0].a < alpha_ref ) { discard; };\n" ); + strcat_s( (char*)m_pBufALUCode->Base(), m_pBufALUCode->Size(), "}\n" ); // Put all of the strings together for final program ( pHeaderCode + pAttribCode + pParamCode + pALUCode ) diff --git a/togles/linuxwin/dxabstract.cpp b/togles/linuxwin/dxabstract.cpp index 0e0fca16..5da2623f 100644 --- a/togles/linuxwin/dxabstract.cpp +++ b/togles/linuxwin/dxabstract.cpp @@ -1201,8 +1201,8 @@ static void FillD3DCaps9( const GLMRendererInfoFields &glmRendererInfo, D3DCAPS9 pCaps->MaxPixelShader30InstructionSlots = 0; #if DX_TO_GL_ABSTRACTION - pCaps->FakeSRGBWrite = !glmRendererInfo.m_hasGammaWrites; - pCaps->CanDoSRGBReadFromRTs = !glmRendererInfo.m_cantAttachSRGB; + pCaps->FakeSRGBWrite = true;//!glmRendererInfo.m_hasGammaWrites; + pCaps->CanDoSRGBReadFromRTs = true;//!glmRendererInfo.m_cantAttachSRGB; pCaps->MixedSizeTargets = glmRendererInfo.m_hasMixedAttachmentSizes; #endif } diff --git a/togles/linuxwin/glentrypoints.cpp b/togles/linuxwin/glentrypoints.cpp index 7349b000..80fec0ee 100644 --- a/togles/linuxwin/glentrypoints.cpp +++ b/togles/linuxwin/glentrypoints.cpp @@ -389,6 +389,14 @@ COpenGLEntryPoints::COpenGLEntryPoints() m_bHave_GL_EXT_framebuffer_blit = true; m_bHave_GL_EXT_framebuffer_multisample = true; m_bHave_GL_ARB_occlusion_query = true; + m_bHave_GL_ARB_map_buffer_range = true; + m_bHave_GL_ARB_vertex_buffer_object = true; + m_bHave_GL_ARB_vertex_array_bgra = true; + m_bHave_GL_EXT_vertex_array_bgra = true; + m_bHave_GL_ARB_debug_output = true; + m_bHave_GL_EXT_direct_state_access = false; + m_bHave_GL_EXT_framebuffer_multisample_blit_scaled = true; + m_bHave_GL_EXT_texture_sRGB_decode = true; glBindFramebuffer.Force(glBindFramebuffer.Pointer()); glBindRenderbuffer.Force(glBindRenderbuffer.Pointer()); @@ -456,12 +464,6 @@ COpenGLEntryPoints::COpenGLEntryPoints() printf( "GL_EXT_buffer_storage: %s\n", m_bHave_GL_EXT_buffer_storage ? "AVAILABLE" : "NOT AVAILABLE" ); printf( "GL_EXT_texture_sRGB_decode: %s\n", m_bHave_GL_EXT_texture_sRGB_decode ? "AVAILABLE" : "NOT AVAILABLE" ); - bool bGLCanDecodeS3TCTextures = m_bHave_GL_EXT_texture_compression_s3tc || ( m_bHave_GL_EXT_texture_compression_dxt1 && m_bHave_GL_ANGLE_texture_compression_dxt3 && m_bHave_GL_ANGLE_texture_compression_dxt5 ); - if ( !bGLCanDecodeS3TCTextures ) - { - Error( "This application requires either the GL_EXT_texture_compression_s3tc, or the GL_EXT_texture_compression_dxt1 + GL_ANGLE_texture_compression_dxt3 + GL_ANGLE_texture_compression_dxt5 OpenGL extensions. Please install S3TC texture support.\n" ); - } - #ifdef OSX if ( CommandLine()->FindParm( "-glmnosrgbdecode" ) ) { diff --git a/togles/linuxwin/glmgr.cpp b/togles/linuxwin/glmgr.cpp index 255aa84d..295d85bb 100644 --- a/togles/linuxwin/glmgr.cpp +++ b/togles/linuxwin/glmgr.cpp @@ -92,11 +92,11 @@ char g_preloadTexVertexProgramText[] = // Гроб гроб кладбище п "precision mediump float;\n" "out vec4 otex;\n" "void main() \n" - "{ \n" + "{\n" "vec4 pos = vec4( 0.1, 0.1, 0.1, 0.1 );\n" "vec4 tex = vec4( 0.0, 0.0, 0.0, 0.0 );\n" - " \n" - "gl_Position = pos; \n" + "\n" + "gl_Position = pos;\n" "otex = tex; \n" "} \n" }; @@ -116,7 +116,7 @@ char g_preload2DTexFragmentProgramText[] = "void main() \n" "{ \n" "vec4 r0; \n" - "r0 = texture2D( sampler15, otex.xy ); \n" + "r0 = texture( sampler15, otex.xy ); \n" "_gl_FragColor = r0; //discard; \n" "} \n" }; @@ -137,7 +137,7 @@ char g_preload3DTexFragmentProgramText[] = "void main() \n" "{ \n" "vec4 r0; \n" - "r0 = texture3D( sampler15, otex.xyz ); \n" + "r0 = texture( sampler15, otex.xyz ); \n" "_gl_FragColor = vec4(0,0,0,0); //discard; \n" "} \n" }; @@ -157,7 +157,7 @@ char g_preloadCubeTexFragmentProgramText[] = "void main() \n" "{ \n" "vec4 r0; \n" - "r0 = textureCube( sampler15, otex.xyz ); \n" + "r0 = texture( sampler15, otex.xyz ); \n" "_gl_FragColor = r0; //discard; \n" "} \n" }; @@ -449,6 +449,20 @@ GLMgr::~GLMgr() { } +extern void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, + GLsizei width, GLsizei height, GLint border, + GLsizei imageSize, const GLvoid *data); + +extern void TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void * data); + //=============================================================================== GLMContext *GLMgr::NewContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) @@ -953,14 +967,6 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM bool srcGamma = srcTex && ((srcTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0); bool dstGamma = dstTex && ((dstTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0); - bool doPushPop = (srcGamma != dstGamma) && gl_radar7954721_workaround_mixed.GetInt() && m_caps.m_nv; // workaround for cross gamma blit problems on NV - // ^^ need to re-check this on some post-10.6.3 build on NV to see if it was fixed - - if (doPushPop) - { - gGL->glPushAttrib( 0 ); - } - //----------------------------------------------------------------- figure out the plan bool blitTwoStep = false; // think positive @@ -1052,8 +1058,8 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM glAttachTex2DtoFBO ( GL_DRAW_FRAMEBUFFER, formatClass, srcTex->m_texName, 0 ); // set read and draw buffers appropriately - gGL->glReadBuffer ( glAttachFromClass[formatClass] ); - gGL->glDrawBuffer ( glAttachFromClass[formatClass] ); + gGL->glReadBuffer( glAttachFromClass[formatClass] ); + gGL->glDrawBuffers( 1, &glAttachFromClass[formatClass] ); // blit#1 - to resolve to scratch // implicitly means no scaling, thus will be done with NEAREST sampling @@ -1117,10 +1123,12 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM if (blitToBack) { // backbuffer is special - FBO0 is left out (either scrubbed already, or not used) - - BindFBOToCtx ( NULL, GL_DRAW_FRAMEBUFFER ); - gGL->glDrawBuffer ( GL_BACK ); - + + BindFBOToCtx( NULL, GL_DRAW_FRAMEBUFFER ); + + GLenum bufs = GL_BACK; + gGL->glDrawBuffers( 1, &bufs ); + yflip = true; } else @@ -1201,12 +1209,6 @@ void GLMContext::Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcM // restore GLM drawing FBO BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER ); - if (doPushPop) - { - gGL->glPopAttrib( ); - } - - //----------------------------------------------------------------- restore old scissor state if (oldsciss.enable) { @@ -1258,39 +1260,6 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr GLMPRINTF(( "-D- dst tex layout is %s", dstTex->m_layout->m_layoutSummary )); } - int pushed = 0; - uint pushmask = gl_radar7954721_workaround_maskval.GetInt(); - //GL_COLOR_BUFFER_BIT - //| GL_CURRENT_BIT - //| GL_ENABLE_BIT - //| GL_FOG_BIT - //| GL_PIXEL_MODE_BIT - //| GL_SCISSOR_BIT - //| GL_STENCIL_BUFFER_BIT - //| GL_TEXTURE_BIT - //GL_VIEWPORT_BIT - //; - - if (gl_radar7954721_workaround_all.GetInt()!=0) - { - gGL->glPushAttrib( pushmask ); - pushed++; - } - else - { - bool srcGamma = (srcTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0; - bool dstGamma = (dstTex->m_layout->m_key.m_texFlags & kGLMTexSRGB) != 0; - - if (srcGamma != dstGamma) - { - if (gl_radar7954721_workaround_mixed.GetInt()) - { - gGL->glPushAttrib( pushmask ); - pushed++; - } - } - } - if (useBlitFB) { // state we need to save @@ -1354,8 +1323,7 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr attparams.m_zslice = 0; m_blitReadFBO->TexAttach( &attparams, attachIndex, GL_READ_FRAMEBUFFER ); - gGL->glReadBuffer( attachIndexGL ); - + gGL->glDrawBuffers( 1, &attachIndexGL ); // set the write fb and buffer, and attach write tex BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER ); @@ -1366,7 +1334,7 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr attparams.m_zslice = 0; m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER ); - gGL->glDrawBuffer( attachIndexGL ); + gGL->glDrawBuffers( 1, &attachIndexGL ); // do the blit gGL->glBlitFramebuffer( srcRect->xmin, srcRect->ymin, srcRect->xmax, srcRect->ymax, @@ -1425,8 +1393,8 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr attparams.m_zslice = 0; m_blitDrawFBO->TexAttach( &attparams, attachIndex, GL_DRAW_FRAMEBUFFER ); - gGL->glDrawBuffer( attachIndexGL ); - + gGL->glDrawBuffers( 1, &attachIndexGL ); + // attempt to just set states directly the way we want them, then use the latched states to repair them afterward. NullProgram(); // out of program mode @@ -1456,25 +1424,24 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr // immediate mode is fine +#if 0 // Does it needed? const float topv = 1.0; const float botv = 0.0; const float verts[] = {-1.f, -1.f, 1.f, -1.f, 1.f, 1.f, -1.f, 1.f}; - const float verts_tex[] = {0.f, botv, 1.f, botv, 1.f, topv, 0.f, topv}; - - gGL->glEnableClientState(GL_VERTEX_ARRAY); - gGL->glEnableClientState(GL_TEXTURE_COORD_ARRAY); - + const float verts_tex[] = {0.f, botv, 1.f, botv, 1.f, topv, 0.f, topv}; + gGL->glVertexPointer(2, GL_FLOAT, 0, verts); gGL->glTexCoordPointer(2, GL_FLOAT, 0, verts_tex); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + gGL->glDrawArrays(GL_TRIANGLE_FAN, 0, 4); gGL->glDisableClientState(GL_VERTEX_ARRAY); gGL->glDisableClientState(GL_TEXTURE_COORD_ARRAY); - +#endif + gGL->glBindTexture( GL_TEXTURE_2D, 0 ); - + gGL->glDisable(GL_TEXTURE_2D); BindTexToTMU( m_samplers[0].m_pBoundTex, 0 ); @@ -1509,12 +1476,6 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr BindFBOToCtx( m_drawingFBO, GL_FRAMEBUFFER ); } - while(pushed) - { - gGL->glPopAttrib(); - pushed--; - } - RestoreSavedColorMask(); } @@ -1632,7 +1593,7 @@ void GLMContext::ResolveTex( CGLMTex *tex, bool forceDirty ) gGL->glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, attachIndexGL, GL_TEXTURE_2D, tex->m_texName, 0 ); } - gGL->glDrawBuffer( attachIndexGL ); + gGL->glDrawBuffers( 1, &attachIndexGL ); //----------------------------------------------------------------------------------- @@ -2369,10 +2330,6 @@ void GLMContext::Present( CGLMTex *tex ) tmMessage( TELEMETRY_LEVEL2, TMMF_ICON_EXCLAMATION, "VS Uniform Calls: %u, VS Uniforms: %u|VS Uniform Bone Calls: %u, VS Bone Uniforms: %u|PS Uniform Calls: %u, PS Uniforms: %u", m_nTotalVSUniformCalls, m_nTotalVSUniformsSet, m_nTotalVSUniformBoneCalls, m_nTotalVSUniformsBoneSet, m_nTotalPSUniformCalls, m_nTotalPSUniformsSet ); m_nTotalVSUniformCalls = 0, m_nTotalVSUniformBoneCalls = 0, m_nTotalVSUniformsSet = 0, m_nTotalVSUniformsBoneSet = 0, m_nTotalPSUniformCalls = 0, m_nTotalPSUniformsSet = 0; #endif - -#ifndef OSX - GLMGPUTimestampManagerTick(); -#endif } //=============================================================================== @@ -2845,7 +2802,6 @@ void GLMContext::BindTexToTMU( CGLMTex *pTex, int tmu ) if ( !pTex ) { - gGL->glBindTexture( GL_TEXTURE_1D, 0 ); gGL->glBindTexture( GL_TEXTURE_2D, 0 ); gGL->glBindTexture( GL_TEXTURE_3D, 0 ); gGL->glBindTexture( GL_TEXTURE_CUBE_MAP, 0 ); @@ -2853,7 +2809,6 @@ void GLMContext::BindTexToTMU( CGLMTex *pTex, int tmu ) else { const GLenum texGLTarget = pTex->m_texGLTarget; - if ( texGLTarget != GL_TEXTURE_1D ) gGL->glBindTexture( GL_TEXTURE_1D, 0 ); if ( texGLTarget != GL_TEXTURE_2D ) gGL->glBindTexture( GL_TEXTURE_2D, 0 ); if ( texGLTarget != GL_TEXTURE_3D ) gGL->glBindTexture( GL_TEXTURE_3D, 0 ); if ( texGLTarget != GL_TEXTURE_CUBE_MAP ) gGL->glBindTexture( GL_TEXTURE_CUBE_MAP, 0 ); @@ -3006,11 +2961,11 @@ void GLMContext::CleanupTex( GLenum texBind, GLMTexLayout* pLayout, GLuint tex ) const int dataSize = ( chunks * chunks ) * pLayout->m_format->m_bytesPerSquareChunk; Assert( dataSize <= ( sizeof( uint32) * ARRAYSIZE( g_garbageTextureBits ) ) ); - gGL->glCompressedTexImage2D( texBind, i, pLayout->m_format->m_glIntFormat, mipDim, mipDim, 0, dataSize, 0 ); + CompressedTexImage2D( texBind, i, pLayout->m_format->m_glIntFormat, mipDim, mipDim, 0, dataSize, 0 ); } else { - gGL->glTexImage2D( texBind, i, pLayout->m_format->m_glIntFormat, mipDim, mipDim, 0, pLayout->m_format->m_glDataFormat, pLayout->m_format->m_glDataType, 0 ); + TexImage2D( texBind, i, pLayout->m_format->m_glIntFormat, mipDim, mipDim, 0, pLayout->m_format->m_glDataFormat, pLayout->m_format->m_glDataType, 0 ); } } @@ -4412,8 +4367,7 @@ void GLMContext::DebugHook( GLMDebugHookInfo *info ) break; case 2: - short fakecolor[4] = { 0, 0, 0, 0 }; - gGL->glColor4sv( fakecolor ); // break to OGLP + // What the fuck? break; } // re-flush all GLM states so you can fiddle with them in the debugger. then run the batch again and spin.. @@ -4766,36 +4720,11 @@ void GLMContext::DrawDebugText( float x, float y, float z, float drawCharWidth, gGL->glEnable(GL_TEXTURE_2D); - if (0) - { - gGL->glEnableClientState(GL_VERTEX_ARRAY); - - gGL->glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - gGL->glVertexPointer( 3, GL_FLOAT, sizeof( vtx[0] ), &vtx[0].x ); - - gGL->glClientActiveTexture(GL_TEXTURE0); - - gGL->glTexCoordPointer( 2, GL_FLOAT, sizeof( vtx[0] ), &vtx[0].u ); - } - else - { - SetVertexAttributes( &vertSetup ); - } + SetVertexAttributes( &vertSetup ); gGL->glDrawArrays( GL_QUADS, 0, stringlen * 4 ); - // disable all the input streams - if (0) - { - gGL->glDisableClientState(GL_VERTEX_ARRAY); - - gGL->glDisableClientState(GL_TEXTURE_COORD_ARRAY); - } - else - { - SetVertexAttributes( NULL ); - } + SetVertexAttributes( NULL ); gGL->glDisable(GL_TEXTURE_2D); @@ -5288,7 +5217,7 @@ void GLMTester::StdSetup( void ) gGL->glScissor( 0,0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); CheckGLError("stdsetup scissor"); - gGL->glOrtho( -1,1, -1,1, -1,1 ); + //gGL->glOrtho( -1,1, -1,1, -1,1 ); CheckGLError("stdsetup ortho"); // activate debug font @@ -5331,7 +5260,7 @@ void GLMTester::Clear( void ) gGL->glViewport(0, 0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); gGL->glScissor( 0,0, (GLsizei) m_drawWidth, (GLsizei) m_drawHeight ); - gGL->glOrtho( -1,1, -1,1, -1,1 ); + //gGL->glOrtho( -1,1, -1,1, -1,1 ); CheckGLError("clearing viewport"); // clear to black @@ -6000,7 +5929,9 @@ void GLMTester::Test3( void ) void GLMTriggerDebuggerBreak() { // we call an obscure GL function which we know has been breakpointed in the OGLP function list - static signed short nada[] = { -1,-1,-1,-1 }; - gGL->glColor4sv( nada ); + +// What the fuck is that? +// static signed short nada[] = { -1,-1,-1,-1 }; +// gGL->glColor4sv( nada ); } #endif diff --git a/togles/linuxwin/glmgr_flush.inl b/togles/linuxwin/glmgr_flush.inl index fcddd616..6061dfde 100644 --- a/togles/linuxwin/glmgr_flush.inl +++ b/togles/linuxwin/glmgr_flush.inl @@ -1,5 +1,7 @@ // BE VERY VERY CAREFUL what you do in these function. They are extremely hot, and calling the wrong GL API's in here will crush perf. (especially on NVidia threaded drivers). +#include "togles/linuxwin/glmgr.h" + FORCEINLINE uint32 bitmix32(uint32 a) { a -= (a<<6); @@ -433,7 +435,6 @@ FORCEINLINE void GLMContext::FlushDrawStates( uint nStartIndex, uint nEndIndex, } } - // see if VS uses i0, b0, b1, b2, b3. // use a glUniform1i to set any one of these if active. skip all of them if no dirties reported. // my kingdom for the UBO extension! @@ -478,6 +479,15 @@ FORCEINLINE void GLMContext::FlushDrawStates( uint nStartIndex, uint nEndIndex, } } + + if( m_pBoundPair->m_locAlphaRef ) + { + if( !m_AlphaTestEnable.GetData().enable ) + gGL->glUniform1f( m_pBoundPair->m_locAlphaRef, 0.0 ); + else + gGL->glUniform1f( m_pBoundPair->m_locAlphaRef, m_AlphaTestFunc.GetData().ref ); + } + Assert( ( m_pDevice->m_streams[0].m_vtxBuffer && ( m_pDevice->m_streams[0].m_vtxBuffer->m_vtxBuffer == m_pDevice->m_vtx_buffers[0] ) ) || ( ( !m_pDevice->m_streams[0].m_vtxBuffer ) && ( m_pDevice->m_vtx_buffers[0] == m_pDevice->m_pDummy_vtx_buffer ) ) ); Assert( ( m_pDevice->m_streams[1].m_vtxBuffer && ( m_pDevice->m_streams[1].m_vtxBuffer->m_vtxBuffer == m_pDevice->m_vtx_buffers[1] ) ) || ( ( !m_pDevice->m_streams[1].m_vtxBuffer ) && ( m_pDevice->m_vtx_buffers[1] == m_pDevice->m_pDummy_vtx_buffer ) ) ); Assert( ( m_pDevice->m_streams[2].m_vtxBuffer && ( m_pDevice->m_streams[2].m_vtxBuffer->m_vtxBuffer == m_pDevice->m_vtx_buffers[2] ) ) || ( ( !m_pDevice->m_streams[2].m_vtxBuffer ) && ( m_pDevice->m_vtx_buffers[2] == m_pDevice->m_pDummy_vtx_buffer ) ) ); diff --git a/togles/linuxwin/glmgrbasics.cpp b/togles/linuxwin/glmgrbasics.cpp index ce1584ec..fb408dda 100644 --- a/togles/linuxwin/glmgrbasics.cpp +++ b/togles/linuxwin/glmgrbasics.cpp @@ -3116,624 +3116,13 @@ void GLMSetIndent( int indent ) char sg_pPIXName[128]; -#ifndef OSX -ConVar gl_telemetry_gpu_pipeline_flushing( "gl_telemetry_gpu_pipeline_flushing", "0" ); - -class CGPUTimestampManager -{ - CGPUTimestampManager( const CGPUTimestampManager & ); - CGPUTimestampManager& operator= ( CGPUTimestampManager & ); - -public: - CGPUTimestampManager() : - m_bInitialized( false ), - m_nCurFrame( 0 ), - m_flGPUToCPUOffsetInS( 0 ), - m_flGPUToS( 0 ), - m_flRdtscToS( 0 ), - m_flSToRdtsc( 0 ), - m_nFreeQueryPoolSize( 0 ), - m_nOutstandingQueriesHead( 0 ), - m_nOutstandingQueriesTail( 0 ), - m_nNumOutstandingQueryZones( 0 ), - m_nQueryZoneStackSize( 0 ), - m_nNumFinishedZones( 0 ), - m_nTotalSpanWorkCount( 0 ) - { - memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ; - memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) ); - memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) ); - memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) ); - } - - ~CGPUTimestampManager() - { - Deinit(); - } - - inline bool IsInitialized() const { return m_bInitialized; } - inline uint GetCurFrame() const { return m_nCurFrame; } - - void Init() - { - Deinit(); - - memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ; - memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) ); - memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) ); - memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) ); - - InitRdtsc(); - - m_nCurFrame = 0; - - gGL->glGenQueries( cFreeQueryPoolSize, m_FreeQueryPool ); - m_nFreeQueryPoolSize = cFreeQueryPoolSize; - - m_nOutstandingQueriesHead = 0; - m_nOutstandingQueriesTail = 0; - m_nNumOutstandingQueryZones = 0; - - m_nQueryZoneStackSize = 0; - m_nNumFinishedZones = 0; - - m_bInitialized = true; - - m_nTotalSpanWorkCount = 0; - - Calibrate(); - } - - void Calibrate() - { - if ( !m_bInitialized ) - return; - - PipelineFlush(); - - m_flGPUToS = 1.0 / 1000000000.0; - - //0.99997541250006794; - //0.99997530000006662; - // Correction factor to prevent excessive drift, only calibrated on my system, we need a better way of computing/recording this. - double flGPURatio = 0.99997425000007034000; - - const uint NT = 1; - for ( uint nTrial = 0; nTrial < NT; nTrial++ ) - { - const uint R = 16; - double flClockOffsetsInS[R]; - for ( uint q = 0; q < R; q++) - { - uint64 nBestTotalCPUTimestamp = (uint64)-1; - uint64 nBestCPUTimestamp = 0; - GLuint64 nBestGPUTimestamp = 0; - - for ( uint i = 0; i < 10; i++) - { - const uint64 nStartCPUTimestamp = Plat_Rdtsc(); - - gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP); - PipelineFlush(); - - const uint64 nEndCPUTimestamp = Plat_Rdtsc(); - - GLint nAvailable; - do - { - gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable ); - } while ( !nAvailable ); - - GLuint64 nGPUTimestamp; - gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTimestamp ); - - const uint64 nTotalCPUTimestamp = nEndCPUTimestamp - nStartCPUTimestamp; - if ( nTotalCPUTimestamp < nBestTotalCPUTimestamp ) - { - nBestTotalCPUTimestamp = nTotalCPUTimestamp; - nBestCPUTimestamp = nStartCPUTimestamp; - nBestGPUTimestamp = nGPUTimestamp; - } - } - - double flCPUTimestampTimeInSeconds = nBestCPUTimestamp * m_flRdtscToS; - double flGPUTimestampTimeInSeconds = nBestGPUTimestamp * m_flGPUToS * flGPURatio; - - flClockOffsetsInS[q] = flCPUTimestampTimeInSeconds - flGPUTimestampTimeInSeconds; - - ThreadSleep(100); - - DbgPrintf("%f %f %1.20f\n", flCPUTimestampTimeInSeconds, flGPUTimestampTimeInSeconds, flClockOffsetsInS[q] ); - } - - m_flGPUToCPUOffsetInS = 0.0f; - for ( uint i = 0; i < R; i++ ) - m_flGPUToCPUOffsetInS += flClockOffsetsInS[i]; - m_flGPUToCPUOffsetInS /= R; - - if ( NT > 1 ) - { - DbgPrintf("------- Ratio: %2.20f\n", flGPURatio ); - - double flDelta = flClockOffsetsInS[0] - flClockOffsetsInS[R - 1]; - - DbgPrintf("------- %1.20f\n", flDelta ); - -#if 1 - if ( flDelta < 0.0000005f ) - { - flGPURatio += .000000125f; - } - else if ( flDelta > 0.0000005f ) - { - flGPURatio -= .000000125f; - } -#else - if ( flDelta < 0.0000005f ) - { - flGPURatio += .0000000125f; - } - else if ( flDelta > 0.0000005f ) - { - flGPURatio -= .0000000125f; - } -#endif - } - } - - m_flGPUToS *= flGPURatio; - -#if 0 - // dump drift over time to debugger output - double flLatency = 0; - for ( ; ; ) - { - // test - const uint64 nStartCPUTime = Plat_Rdtsc(); - - gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP); - - PipelineFlush(); - - GLint nAvailable; - do - { - gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable ); - } while ( !nAvailable ); - - GLuint64 nGPUTime; - gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTime ); - - double flStartGPUTime = ( ( nGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ); - - flLatency = flStartGPUTime - nStartCPUTime * m_flRdtscToS; - DbgPrintf("%f\n", flLatency ); - } -#endif - } - - void Deinit() - { - if ( !m_bInitialized ) - return; - - if ( m_nFreeQueryPoolSize ) - { - gGL->glDeleteQueries( m_nFreeQueryPoolSize, m_FreeQueryPool ); - } - m_nFreeQueryPoolSize = 0; - - for ( uint i = 0; i < m_nNumOutstandingQueryZones; i++ ) - { - QueryZone_t &query = m_OutstandingQueryZones[ ( m_nOutstandingQueriesHead + i ) % cMaxQueryZones ]; - if ( query.m_nBeginQuery ) - { - gGL->glDeleteQueries( 1, &query.m_nBeginQuery ); - } - if ( query.m_nEndQuery ) - { - gGL->glDeleteQueries( 1, &query.m_nEndQuery ); - } - } - m_nOutstandingQueriesHead = 0; - m_nOutstandingQueriesTail = 0; - m_nNumOutstandingQueryZones = 0; - - for ( uint i = 0; i < m_nQueryZoneStackSize; i++ ) - { - QueryZone_t &query = m_QueryZoneStack[i]; - if ( query.m_nBeginQuery ) - { - gGL->glDeleteQueries( 1, &query.m_nBeginQuery ); - } - if ( query.m_nEndQuery ) - { - gGL->glDeleteQueries( 1, &query.m_nEndQuery ); - } - } - m_nQueryZoneStackSize = 0; - - m_flGPUToCPUOffsetInS = 0; - m_flGPUToS = 0; - m_flRdtscToS = 0; - m_flSToRdtsc = 0; - - m_bInitialized = false; - } - - // pName is assumed to be a telemetry dynamic string! - void BeginZone( const char *pName ) - { - if ( !m_bInitialized ) - return; - - if ( m_nQueryZoneStackSize >= cMaxQueryZoneStackSize ) - { - Panic( "Increase cMaxQueryZoneStackSize!" ); - } - - QueryZone_t &zone = m_QueryZoneStack[m_nQueryZoneStackSize]; - - zone.m_pName = pName; - - zone.m_nBeginQuery = AllocQueryHandle(); - zone.m_nEndQuery = 0; - zone.m_nStackLevel = m_nQueryZoneStackSize; - - zone.m_nTotalGPUWorkCount = g_nTotalDrawsOrClears; -#if GL_TELEMETRY_GPU_ZONES - zone.m_nTotalGPUWorkCount += g_TelemetryGPUStats.GetTotal(); -#endif - - gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nBeginQuery, GL_TIMESTAMP ); - - m_nQueryZoneStackSize++; - } - - void EndZone() - { - if ( !m_bInitialized ) - return; - - if ( ( !m_nQueryZoneStackSize ) || ( m_nNumOutstandingQueryZones == cMaxQueryZones ) ) - { - Panic( "Query zone error!" ); - } - - m_nQueryZoneStackSize--; - - uint nCurGPUWorkCount = g_nTotalDrawsOrClears; -#if GL_TELEMETRY_GPU_ZONES - nCurGPUWorkCount += g_TelemetryGPUStats.GetTotal(); -#endif - - uint nTotalDraws = nCurGPUWorkCount - m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount; - - m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery = AllocQueryHandle(); - gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery, GL_TIMESTAMP ); - m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount = nTotalDraws; - - m_OutstandingQueryZones[m_nOutstandingQueriesHead] = m_QueryZoneStack[m_nQueryZoneStackSize]; - m_nOutstandingQueriesHead = ( m_nOutstandingQueriesHead + 1 ) % cMaxQueryZones; - m_nNumOutstandingQueryZones++; - - COMPILE_TIME_ASSERT( ( int )cMaxQueryZones > ( int )cMaxQueryZoneStackSize ); - if ( m_nNumOutstandingQueryZones >= ( cMaxQueryZones - cMaxQueryZoneStackSize ) ) - { - tmMessage( TELEMETRY_LEVEL2, TMMF_ICON_NOTE | TMMF_SEVERITY_WARNING, "CGPUTimestampManager::EndZone: Too many outstanding query zones - forcing a pipeline flush! This is probably expensive." ); - - FlushOutstandingQueries( true ); - } - - if ( gl_telemetry_gpu_pipeline_flushing.GetBool() ) - { - PipelineFlush(); - } - } - - void Tick() - { - m_nCurFrame++; - - if ( !m_bInitialized ) - return; - - if ( m_nQueryZoneStackSize > 0 ) - { - Panic( "Zone stack is not empty!" ); - } - - FlushOutstandingQueries( false ); - - tmMessage( TELEMETRY_LEVEL2, 0, "Total PIX timespan GPU work count: %u", m_nTotalSpanWorkCount ); - - m_nTotalSpanWorkCount = 0; - } - - void FlushOutstandingQueries( bool bForce ) - { - tmZone( TELEMETRY_LEVEL2, 0, "FlushOutstandingQueries: %u", m_nNumOutstandingQueryZones ); - - if ( bForce ) - { - PipelineFlush(); - } - - while ( m_nNumOutstandingQueryZones ) - { - QueryZone_t &zone = m_OutstandingQueryZones[m_nOutstandingQueriesTail]; - - GLint nEndAvailable = 0; - do - { - gGL->glGetQueryObjectiv( zone.m_nEndQuery, GL_QUERY_RESULT_AVAILABLE, &nEndAvailable ); - - } while ( ( bForce ) && ( nEndAvailable == 0 ) ); - - if ( !nEndAvailable ) - { - if ( bForce ) - { - Panic( "Query results not available after a full pipeline flush!" ); - } - break; - } - - GLuint64 nBeginGPUTime, nEndGPUTime; - gGL->glGetQueryObjectui64v( zone.m_nBeginQuery, GL_QUERY_RESULT, &nBeginGPUTime ); - gGL->glGetQueryObjectui64v( zone.m_nEndQuery, GL_QUERY_RESULT, &nEndGPUTime ); - - ReleaseQueryHandle( zone.m_nBeginQuery ); - zone.m_nBeginQuery = 0; - - ReleaseQueryHandle( zone.m_nEndQuery ); - zone.m_nEndQuery = 0; - - if ( m_nNumFinishedZones >= cMaxQueryZones ) - { - Panic( "Too many finished zones!" ); - } - - FinishedQueryZone_t &finishedZone = m_FinishedZones[m_nNumFinishedZones]; - finishedZone.m_pName = zone.m_pName; - finishedZone.m_nBeginGPUTime = nBeginGPUTime; - finishedZone.m_nEndGPUTime = nEndGPUTime; - finishedZone.m_nStackLevel = zone.m_nStackLevel; - finishedZone.m_nTotalGPUWorkCount = zone.m_nTotalGPUWorkCount; - m_nNumFinishedZones++; - - if ( !zone.m_nStackLevel ) - { - std::sort( m_FinishedZones, m_FinishedZones + m_nNumFinishedZones ); - FlushFinishedZones(); - m_nNumFinishedZones = 0; - } - - m_nOutstandingQueriesTail = ( m_nOutstandingQueriesTail + 1 ) % cMaxQueryZones; - m_nNumOutstandingQueryZones--; - } - } - -private: - bool m_bInitialized; - uint m_nCurFrame; - - double m_flGPUToCPUOffsetInS; - double m_flGPUToS; - double m_flRdtscToS; - double m_flSToRdtsc; - - enum { cMaxQueryZones = 4096, cFreeQueryPoolSize = cMaxQueryZones * 2 }; - GLuint m_FreeQueryPool[cFreeQueryPoolSize ]; - uint m_nFreeQueryPoolSize; - - GLuint AllocQueryHandle() - { - if ( !m_nFreeQueryPoolSize ) - { - Panic( "Out of query handles!"); - } - return m_FreeQueryPool[--m_nFreeQueryPoolSize]; - } - - void ReleaseQueryHandle( GLuint nHandle ) - { - if ( m_nFreeQueryPoolSize >= cFreeQueryPoolSize ) - { - Panic( "Query handle error!" ); - } - m_FreeQueryPool[m_nFreeQueryPoolSize++] = nHandle; - } - - struct QueryZone_t - { - const char *m_pName; - GLuint m_nBeginQuery; - GLuint m_nEndQuery; - uint m_nStackLevel; - uint m_nTotalGPUWorkCount; - }; - - QueryZone_t m_OutstandingQueryZones[cMaxQueryZones]; - uint m_nOutstandingQueriesHead; // index of first outstanding query (oldest) - uint m_nOutstandingQueriesTail; // index where next query goes (newest) - uint m_nNumOutstandingQueryZones; - - enum { cMaxQueryZoneStackSize = 256 }; - QueryZone_t m_QueryZoneStack[cMaxQueryZoneStackSize]; - uint m_nQueryZoneStackSize; - - struct FinishedQueryZone_t - { - const char *m_pName; - GLuint64 m_nBeginGPUTime; - GLuint64 m_nEndGPUTime; - uint m_nStackLevel; - uint m_nTotalGPUWorkCount; - - inline bool operator< ( const FinishedQueryZone_t &rhs ) const - { - if ( m_nBeginGPUTime == rhs.m_nBeginGPUTime) - return m_nStackLevel < rhs.m_nStackLevel; - - return m_nBeginGPUTime < rhs.m_nBeginGPUTime; - } - }; - - FinishedQueryZone_t m_FinishedZones[cMaxQueryZones]; - uint m_nNumFinishedZones; - - uint m_nTotalSpanWorkCount; - - void InitRdtsc() - { - m_flRdtscToS = 0.0f; - m_flSToRdtsc = 0.0f; - - for ( uint i = 0; i < 10; i++ ) - { - uint64 t0 = Plat_Rdtsc(); - double d0 = Plat_FloatTime(); - - ThreadSleep( 250 ); - - uint64 t1 = Plat_Rdtsc(); - double d1 = Plat_FloatTime(); - - double flRdtscToS = ( d1 - d0 ) / ( t1 - t0 ); - double flSToRdtsc = ( t1 - t0 ) / ( d1 - d0 ); - if ( flSToRdtsc > m_flSToRdtsc ) - { - m_flRdtscToS = flRdtscToS; - m_flSToRdtsc = flSToRdtsc; - } - } - } - - void PipelineFlush() - { -#ifdef HAVE_GL_ARB_SYNC - GLsync nSyncObj = gGL->glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 ); - if ( nSyncObj ) - { - gGL->glClientWaitSync( nSyncObj, GL_SYNC_FLUSH_COMMANDS_BIT, 300000000000ULL ); - gGL->glDeleteSync( nSyncObj ); - } -#endif - } - - inline void NewTimeSpan( uint64 nStartGPUTime, uint64 nEndGPUTime, const char *pName, uint nTotalDraws ) - { - // apparently we must use level0 for timespans? - tmBeginTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nStartGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws ); - tmEndTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nEndGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws ); - } - - void FlushFinishedZones() - { - for ( uint i = 0; i < m_nNumFinishedZones; i++ ) - { - FinishedQueryZone_t &zone = m_FinishedZones[i]; - if ( !zone.m_nTotalGPUWorkCount ) - continue; - - bool bEmit = false; - if ( i == ( m_nNumFinishedZones - 1 ) ) - bEmit = true; - else - { - FinishedQueryZone_t &nextZone = m_FinishedZones[i + 1]; - bEmit = zone.m_nEndGPUTime <= nextZone.m_nBeginGPUTime; - } - - if ( bEmit ) - { - uint64 nStartGPUTime = ( ( zone.m_nBeginGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc; - uint64 nEndGPUTime = ( ( zone.m_nEndGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc; - - NewTimeSpan( nStartGPUTime, nEndGPUTime, zone.m_pName, zone.m_nTotalGPUWorkCount ); - - m_nTotalSpanWorkCount += zone.m_nTotalGPUWorkCount; - } - } - } - - void Panic( const char *pMsg ) - { - DXABSTRACT_BREAK_ON_ERROR(); - Error( "%s", pMsg ); - } - - static void DbgPrintf( const char *pFmt, ... ) - { - va_list vargs; - va_start( vargs, pFmt ); - char buf[1024]; - V_vsnprintf( buf, sizeof( buf ), pFmt, vargs ); - -#ifdef WIN32 - OutputDebugStringA( buf ); -#else - printf( "%s", buf ); -#endif - - va_end( vargs ); - } -}; - - -static CGPUTimestampManager g_GPUTimestampManager; - -void GLMGPUTimestampManagerInit() -{ - g_GPUTimestampManager.Init(); -} - -void GLMGPUTimestampManagerDeinit() -{ - g_GPUTimestampManager.Deinit(); -} - ConVar gl_telemetry_gpu( "gl_telemetry_gpu", "0" ); static bool g_bPrevTelemetryGPU; -void GLMGPUTimestampManagerTick() -{ - if ( g_bPrevTelemetryGPU != gl_telemetry_gpu.GetBool() ) - { - if ( !gl_telemetry_gpu.GetBool() ) - g_GPUTimestampManager.Deinit(); - else - { -#if !PIX_ENABLE || !GL_TELEMETRY_GPU_ZONES - ConMsg( "Must define PIX_ENABLE and GL_TELEMETRY_GPU_ZONES to use this feature" ); -#else - g_GPUTimestampManager.Init(); -#endif - } - - g_bPrevTelemetryGPU = gl_telemetry_gpu.GetBool(); - } - - g_GPUTimestampManager.Tick(); -} - -#endif // !OSX - static uint g_nPIXEventIndex; void GLMBeginPIXEvent( const char *str ) { -#ifndef OSX - char szName[1024]; - V_snprintf( szName, sizeof( szName ), "[ID:%u FR:%u] %s", g_nPIXEventIndex, g_GPUTimestampManager.GetCurFrame(), str ); - const char *p = tmDynamicString( TELEMETRY_LEVEL2, szName ); //p can be null if tm is getting shut down - tmEnter( TELEMETRY_LEVEL2, TMZF_NONE, "PIX %s", p ? p : "" ); - - g_nPIXEventIndex++; - - g_GPUTimestampManager.BeginZone( p ); -#endif // !OSX V_strncpy( sg_pPIXName, str, 128 ); #if defined( OSX ) && defined( CGLPROFILER_ENABLE ) @@ -3748,10 +3137,6 @@ void GLMBeginPIXEvent( const char *str ) void GLMEndPIXEvent( void ) { -#ifndef OSX - g_GPUTimestampManager.EndZone(); -#endif - #if defined( OSX ) && defined( CGLPROFILER_ENABLE ) CGLSetOption( kCGLGOComment, (GLint)sg_pPIXName ); #endif diff --git a/togles/linuxwin/stb_dxt_104.h b/togles/linuxwin/stb_dxt_104.h new file mode 100644 index 00000000..bec72798 --- /dev/null +++ b/togles/linuxwin/stb_dxt_104.h @@ -0,0 +1,624 @@ +// stb_dxt.h - v1.04 - DXT1/DXT5 compressor - public domain +// original by fabian "ryg" giesen - ported to C by stb +// use '#define STB_DXT_IMPLEMENTATION' before including to create the implementation +// +// USAGE: +// call stb_compress_dxt_block() for every block (you must pad) +// source should be a 4x4 block of RGBA data in row-major order; +// A is ignored if you specify alpha=0; you can turn on dithering +// and "high quality" using mode. +// +// version history: +// v1.04 - (ryg) default to no rounding bias for lerped colors (as per S3TC/DX10 spec); +// single color match fix (allow for inexact color interpolation); +// optimal DXT5 index finder; "high quality" mode that runs multiple refinement steps. +// v1.03 - (stb) endianness support +// v1.02 - (stb) fix alpha encoding bug +// v1.01 - (stb) fix bug converting to RGB that messed up quality, thanks ryg & cbloom +// v1.00 - (stb) first release + +#ifndef STB_INCLUDE_STB_DXT_H +#define STB_INCLUDE_STB_DXT_H + +// compression mode (bitflags) +#define STB_DXT_NORMAL 0 +#define STB_DXT_DITHER 1 // use dithering. dubious win. never use for normal maps and the like! +#define STB_DXT_HIGHQUAL 2 // high quality mode, does two refinement steps instead of 1. ~30-40% slower. + +void stb_compress_dxt_block(unsigned char *dest, const unsigned char *src, int alpha, int mode); +#define STB_COMPRESS_DXT_BLOCK + +#ifdef STB_DXT_IMPLEMENTATION + +// configuration options for DXT encoder. set them in the project/makefile or just define +// them at the top. + +// STB_DXT_USE_ROUNDING_BIAS +// use a rounding bias during color interpolation. this is closer to what "ideal" +// interpolation would do but doesn't match the S3TC/DX10 spec. old versions (pre-1.03) +// implicitly had this turned on. +// +// in case you're targeting a specific type of hardware (e.g. console programmers): +// NVidia and Intel GPUs (as of 2010) as well as DX9 ref use DXT decoders that are closer +// to STB_DXT_USE_ROUNDING_BIAS. AMD/ATI, S3 and DX10 ref are closer to rounding with no bias. +// you also see "(a*5 + b*3) / 8" on some old GPU designs. +// #define STB_DXT_USE_ROUNDING_BIAS + +#include +#include +#include // memset + +static unsigned char stb__Expand5[32]; +static unsigned char stb__Expand6[64]; +static unsigned char stb__OMatch5[256][2]; +static unsigned char stb__OMatch6[256][2]; +static unsigned char stb__QuantRBTab[256+16]; +static unsigned char stb__QuantGTab[256+16]; + +static int stb__Mul8Bit(int a, int b) +{ + int t = a*b + 128; + return (t + (t >> 8)) >> 8; +} + +static void stb__From16Bit(unsigned char *out, unsigned short v) +{ + int rv = (v & 0xf800) >> 11; + int gv = (v & 0x07e0) >> 5; + int bv = (v & 0x001f) >> 0; + + out[0] = stb__Expand5[rv]; + out[1] = stb__Expand6[gv]; + out[2] = stb__Expand5[bv]; + out[3] = 0; +} + +static unsigned short stb__As16Bit(int r, int g, int b) +{ + return (stb__Mul8Bit(r,31) << 11) + (stb__Mul8Bit(g,63) << 5) + stb__Mul8Bit(b,31); +} + +// linear interpolation at 1/3 point between a and b, using desired rounding type +static int stb__Lerp13(int a, int b) +{ +#ifdef STB_DXT_USE_ROUNDING_BIAS + // with rounding bias + return a + stb__Mul8Bit(b-a, 0x55); +#else + // without rounding bias + // replace "/ 3" by "* 0xaaab) >> 17" if your compiler sucks or you really need every ounce of speed. + return (2*a + b) / 3; +#endif +} + +// lerp RGB color +static void stb__Lerp13RGB(unsigned char *out, unsigned char *p1, unsigned char *p2) +{ + out[0] = stb__Lerp13(p1[0], p2[0]); + out[1] = stb__Lerp13(p1[1], p2[1]); + out[2] = stb__Lerp13(p1[2], p2[2]); +} + +/****************************************************************************/ + +// compute table to reproduce constant colors as accurately as possible +static void stb__PrepareOptTable(unsigned char *Table,const unsigned char *expand,int size) +{ + int i,mn,mx; + for (i=0;i<256;i++) { + int bestErr = 256; + for (mn=0;mn> 4)]; + ep1[0] = bp[ 0] - dp[ 0]; + dp[ 4] = quant[bp[ 4] + ((7*ep1[0] + 3*ep2[2] + 5*ep2[1] + ep2[0]) >> 4)]; + ep1[1] = bp[ 4] - dp[ 4]; + dp[ 8] = quant[bp[ 8] + ((7*ep1[1] + 3*ep2[3] + 5*ep2[2] + ep2[1]) >> 4)]; + ep1[2] = bp[ 8] - dp[ 8]; + dp[12] = quant[bp[12] + ((7*ep1[2] + 5*ep2[3] + ep2[2]) >> 4)]; + ep1[3] = bp[12] - dp[12]; + bp += 16; + dp += 16; + et = ep1, ep1 = ep2, ep2 = et; // swap + } + } +} + +// The color matching function +static unsigned int stb__MatchColorsBlock(unsigned char *block, unsigned char *color,int dither) +{ + unsigned int mask = 0; + int dirr = color[0*4+0] - color[1*4+0]; + int dirg = color[0*4+1] - color[1*4+1]; + int dirb = color[0*4+2] - color[1*4+2]; + int dots[16]; + int stops[4]; + int i; + int c0Point, halfPoint, c3Point; + + for(i=0;i<16;i++) + dots[i] = block[i*4+0]*dirr + block[i*4+1]*dirg + block[i*4+2]*dirb; + + for(i=0;i<4;i++) + stops[i] = color[i*4+0]*dirr + color[i*4+1]*dirg + color[i*4+2]*dirb; + + // think of the colors as arranged on a line; project point onto that line, then choose + // next color out of available ones. we compute the crossover points for "best color in top + // half"/"best in bottom half" and then the same inside that subinterval. + // + // relying on this 1d approximation isn't always optimal in terms of euclidean distance, + // but it's very close and a lot faster. + // http://cbloomrants.blogspot.com/2008/12/12-08-08-dxtc-summary.html + + c0Point = (stops[1] + stops[3]) >> 1; + halfPoint = (stops[3] + stops[2]) >> 1; + c3Point = (stops[2] + stops[0]) >> 1; + + if(!dither) { + // the version without dithering is straightforward + for (i=15;i>=0;i--) { + int dot = dots[i]; + mask <<= 2; + + if(dot < halfPoint) + mask |= (dot < c0Point) ? 1 : 3; + else + mask |= (dot < c3Point) ? 2 : 0; + } + } else { + // with floyd-steinberg dithering + int err[8],*ep1 = err,*ep2 = err+4; + int *dp = dots, y; + + c0Point <<= 4; + halfPoint <<= 4; + c3Point <<= 4; + for(i=0;i<8;i++) + err[i] = 0; + + for(y=0;y<4;y++) + { + int dot,lmask,step; + + dot = (dp[0] << 4) + (3*ep2[1] + 5*ep2[0]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[0] = dp[0] - stops[step]; + lmask = step; + + dot = (dp[1] << 4) + (7*ep1[0] + 3*ep2[2] + 5*ep2[1] + ep2[0]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[1] = dp[1] - stops[step]; + lmask |= step<<2; + + dot = (dp[2] << 4) + (7*ep1[1] + 3*ep2[3] + 5*ep2[2] + ep2[1]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[2] = dp[2] - stops[step]; + lmask |= step<<4; + + dot = (dp[3] << 4) + (7*ep1[2] + 5*ep2[3] + ep2[2]); + if(dot < halfPoint) + step = (dot < c0Point) ? 1 : 3; + else + step = (dot < c3Point) ? 2 : 0; + ep1[3] = dp[3] - stops[step]; + lmask |= step<<6; + + dp += 4; + mask |= lmask << (y*8); + { int *et = ep1; ep1 = ep2; ep2 = et; } // swap + } + } + + return mask; +} + +// The color optimization function. (Clever code, part 1) +static void stb__OptimizeColorsBlock(unsigned char *block, unsigned short *pmax16, unsigned short *pmin16) +{ + int mind = 0x7fffffff,maxd = -0x7fffffff; + unsigned char *minp, *maxp; + double magn; + int v_r,v_g,v_b; + static const int nIterPower = 4; + float covf[6],vfr,vfg,vfb; + + // determine color distribution + int cov[6]; + int mu[3],min[3],max[3]; + int ch,i,iter; + + for(ch=0;ch<3;ch++) + { + const unsigned char *bp = ((const unsigned char *) block) + ch; + int muv,minv,maxv; + + muv = minv = maxv = bp[0]; + for(i=4;i<64;i+=4) + { + muv += bp[i]; + if (bp[i] < minv) minv = bp[i]; + else if (bp[i] > maxv) maxv = bp[i]; + } + + mu[ch] = (muv + 8) >> 4; + min[ch] = minv; + max[ch] = maxv; + } + + // determine covariance matrix + for (i=0;i<6;i++) + cov[i] = 0; + + for (i=0;i<16;i++) + { + int r = block[i*4+0] - mu[0]; + int g = block[i*4+1] - mu[1]; + int b = block[i*4+2] - mu[2]; + + cov[0] += r*r; + cov[1] += r*g; + cov[2] += r*b; + cov[3] += g*g; + cov[4] += g*b; + cov[5] += b*b; + } + + // convert covariance matrix to float, find principal axis via power iter + for(i=0;i<6;i++) + covf[i] = cov[i] / 255.0f; + + vfr = (float) (max[0] - min[0]); + vfg = (float) (max[1] - min[1]); + vfb = (float) (max[2] - min[2]); + + for(iter=0;iter magn) magn = fabs(vfg); + if (fabs(vfb) > magn) magn = fabs(vfb); + + if(magn < 4.0f) { // too small, default to luminance + v_r = 299; // JPEG YCbCr luma coefs, scaled by 1000. + v_g = 587; + v_b = 114; + } else { + magn = 512.0 / magn; + v_r = (int) (vfr * magn); + v_g = (int) (vfg * magn); + v_b = (int) (vfb * magn); + } + + // Pick colors at extreme points + for(i=0;i<16;i++) + { + int dot = block[i*4+0]*v_r + block[i*4+1]*v_g + block[i*4+2]*v_b; + + if (dot < mind) { + mind = dot; + minp = block+i*4; + } + + if (dot > maxd) { + maxd = dot; + maxp = block+i*4; + } + } + + *pmax16 = stb__As16Bit(maxp[0],maxp[1],maxp[2]); + *pmin16 = stb__As16Bit(minp[0],minp[1],minp[2]); +} + +static int stb__sclamp(float y, int p0, int p1) +{ + int x = (int) y; + if (x < p0) return p0; + if (x > p1) return p1; + return x; +} + +// The refinement function. (Clever code, part 2) +// Tries to optimize colors to suit block contents better. +// (By solving a least squares system via normal equations+Cramer's rule) +static int stb__RefineBlock(unsigned char *block, unsigned short *pmax16, unsigned short *pmin16, unsigned int mask) +{ + static const int w1Tab[4] = { 3,0,2,1 }; + static const int prods[4] = { 0x090000,0x000900,0x040102,0x010402 }; + // ^some magic to save a lot of multiplies in the accumulating loop... + // (precomputed products of weights for least squares system, accumulated inside one 32-bit register) + + float frb,fg; + unsigned short oldMin, oldMax, min16, max16; + int i, akku = 0, xx,xy,yy; + int At1_r,At1_g,At1_b; + int At2_r,At2_g,At2_b; + unsigned int cm = mask; + + oldMin = *pmin16; + oldMax = *pmax16; + + if((mask ^ (mask<<2)) < 4) // all pixels have the same index? + { + // yes, linear system would be singular; solve using optimal + // single-color match on average color + int r = 8, g = 8, b = 8; + for (i=0;i<16;++i) { + r += block[i*4+0]; + g += block[i*4+1]; + b += block[i*4+2]; + } + + r >>= 4; g >>= 4; b >>= 4; + + max16 = (stb__OMatch5[r][0]<<11) | (stb__OMatch6[g][0]<<5) | stb__OMatch5[b][0]; + min16 = (stb__OMatch5[r][1]<<11) | (stb__OMatch6[g][1]<<5) | stb__OMatch5[b][1]; + } else { + At1_r = At1_g = At1_b = 0; + At2_r = At2_g = At2_b = 0; + for (i=0;i<16;++i,cm>>=2) { + int step = cm&3; + int w1 = w1Tab[step]; + int r = block[i*4+0]; + int g = block[i*4+1]; + int b = block[i*4+2]; + + akku += prods[step]; + At1_r += w1*r; + At1_g += w1*g; + At1_b += w1*b; + At2_r += r; + At2_g += g; + At2_b += b; + } + + At2_r = 3*At2_r - At1_r; + At2_g = 3*At2_g - At1_g; + At2_b = 3*At2_b - At1_b; + + // extract solutions and decide solvability + xx = akku >> 16; + yy = (akku >> 8) & 0xff; + xy = (akku >> 0) & 0xff; + + frb = 3.0f * 31.0f / 255.0f / (xx*yy - xy*xy); + fg = frb * 63.0f / 31.0f; + + // solve. + max16 = stb__sclamp((At1_r*yy - At2_r*xy)*frb+0.5f,0,31) << 11; + max16 |= stb__sclamp((At1_g*yy - At2_g*xy)*fg +0.5f,0,63) << 5; + max16 |= stb__sclamp((At1_b*yy - At2_b*xy)*frb+0.5f,0,31) << 0; + + min16 = stb__sclamp((At2_r*xx - At1_r*xy)*frb+0.5f,0,31) << 11; + min16 |= stb__sclamp((At2_g*xx - At1_g*xy)*fg +0.5f,0,63) << 5; + min16 |= stb__sclamp((At2_b*xx - At1_b*xy)*frb+0.5f,0,31) << 0; + } + + *pmin16 = min16; + *pmax16 = max16; + return oldMin != min16 || oldMax != max16; +} + +// Color block compression +static void stb__CompressColorBlock(unsigned char *dest, unsigned char *block, int mode) +{ + unsigned int mask; + int i; + int dither; + int refinecount; + unsigned short max16, min16; + unsigned char dblock[16*4],color[4*4]; + + dither = mode & STB_DXT_DITHER; + refinecount = (mode & STB_DXT_HIGHQUAL) ? 2 : 1; + + // check if block is constant + for (i=1;i<16;i++) + if (((unsigned int *) block)[i] != ((unsigned int *) block)[0]) + break; + + if(i == 16) { // constant color + int r = block[0], g = block[1], b = block[2]; + mask = 0xaaaaaaaa; + max16 = (stb__OMatch5[r][0]<<11) | (stb__OMatch6[g][0]<<5) | stb__OMatch5[b][0]; + min16 = (stb__OMatch5[r][1]<<11) | (stb__OMatch6[g][1]<<5) | stb__OMatch5[b][1]; + } else { + // first step: compute dithered version for PCA if desired + if(dither) + stb__DitherBlock(dblock,block); + + // second step: pca+map along principal axis + stb__OptimizeColorsBlock(dither ? dblock : block,&max16,&min16); + if (max16 != min16) { + stb__EvalColors(color,max16,min16); + mask = stb__MatchColorsBlock(block,color,dither); + } else + mask = 0; + + // third step: refine (multiple times if requested) + for (i=0;i> 8); + dest[2] = (unsigned char) (min16); + dest[3] = (unsigned char) (min16 >> 8); + dest[4] = (unsigned char) (mask); + dest[5] = (unsigned char) (mask >> 8); + dest[6] = (unsigned char) (mask >> 16); + dest[7] = (unsigned char) (mask >> 24); +} + +// Alpha block compression (this is easy for a change) +static void stb__CompressAlphaBlock(unsigned char *dest,unsigned char *src,int mode) +{ + int i,dist,bias,dist4,dist2,bits,mask; + + // find min/max color + int mn,mx; + mn = mx = src[3]; + + for (i=1;i<16;i++) + { + if (src[i*4+3] < mn) mn = src[i*4+3]; + else if (src[i*4+3] > mx) mx = src[i*4+3]; + } + + // encode them + ((unsigned char *)dest)[0] = mx; + ((unsigned char *)dest)[1] = mn; + dest += 2; + + // determine bias and emit color indices + // given the choice of mx/mn, these indices are optimal: + // http://fgiesen.wordpress.com/2009/12/15/dxt5-alpha-block-index-determination/ + dist = mx-mn; + dist4 = dist*4; + dist2 = dist*2; + bias = (dist < 8) ? (dist - 1) : (dist/2 + 2); + bias -= mn * 7; + bits = 0,mask=0; + + for (i=0;i<16;i++) { + int a = src[i*4+3]*7 + bias; + int ind,t; + + // select index. this is a "linear scale" lerp factor between 0 (val=min) and 7 (val=max). + t = (a >= dist4) ? -1 : 0; ind = t & 4; a -= dist4 & t; + t = (a >= dist2) ? -1 : 0; ind += t & 2; a -= dist2 & t; + ind += (a >= dist); + + // turn linear scale into DXT index (0/1 are extremal pts) + ind = -ind & 7; + ind ^= (2 > ind); + + // write index + mask |= ind << bits; + if((bits += 3) >= 8) { + *dest++ = mask; + mask >>= 8; + bits -= 8; + } + } +} + +static void stb__InitDXT() +{ + int i; + for(i=0;i<32;i++) + stb__Expand5[i] = (i<<3)|(i>>2); + + for(i=0;i<64;i++) + stb__Expand6[i] = (i<<2)|(i>>4); + + for(i=0;i<256+16;i++) + { + int v = i-8 < 0 ? 0 : i-8 > 255 ? 255 : i-8; + stb__QuantRBTab[i] = stb__Expand5[stb__Mul8Bit(v,31)]; + stb__QuantGTab[i] = stb__Expand6[stb__Mul8Bit(v,63)]; + } + + stb__PrepareOptTable(&stb__OMatch5[0][0],stb__Expand5,32); + stb__PrepareOptTable(&stb__OMatch6[0][0],stb__Expand6,64); +} + +void stb_compress_dxt_block(unsigned char *dest, const unsigned char *src, int alpha, int mode) +{ + static int init=1; + if (init) { + stb__InitDXT(); + init=0; + } + + if (alpha) { + stb__CompressAlphaBlock(dest,(unsigned char*) src,mode); + dest += 8; + } + + stb__CompressColorBlock(dest,(unsigned char*) src,mode); +} +#endif // STB_DXT_IMPLEMENTATION + +#endif // STB_INCLUDE_STB_DXT_H From 8703d8bbf4109cd1f910646bc9eacce315db5fc9 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Fri, 26 Nov 2021 20:57:45 +0300 Subject: [PATCH 06/18] togles: update wscript --- togles/wscript | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/togles/wscript b/togles/wscript index ab31edfe..bc796860 100755 --- a/togles/wscript +++ b/togles/wscript @@ -31,7 +31,8 @@ def build(bld): 'linuxwin/cglmprogram.cpp', 'linuxwin/cglmbuffer.cpp', 'linuxwin/cglmquery.cpp', - 'linuxwin/asanstubs.cpp' + 'linuxwin/asanstubs.cpp', + 'linuxwin/decompress.c' ] includes = [ From d651c2b38dcc9c361f719f56067320e71dd8a3a4 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 9 Jan 2022 19:20:00 +0300 Subject: [PATCH 07/18] Fix font problems --- common/iconv.h | 87 +++++++++++++++++++ engine/host.cpp | 2 +- launcher/launcher.cpp | 6 +- lib/android/armeabi-v7a/libandroid_support.a | Bin 924694 -> 926484 bytes vgui2/vgui_surfacelib/linuxfont.cpp | 10 ++- 5 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 common/iconv.h diff --git a/common/iconv.h b/common/iconv.h new file mode 100644 index 00000000..3ef7ed7d --- /dev/null +++ b/common/iconv.h @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#pragma once + +/** + * @file iconv.h + * @brief Character encoding conversion. + */ + +#include +#include + +__BEGIN_DECLS + +/* If we just use void* in the typedef, the compiler exposes that in error messages. */ +struct __iconv_t; + +/** + * The `iconv_t` type that represents an instance of a converter. + */ +typedef struct __iconv_t* iconv_t; + +/** + * [iconv_open(3)](http://man7.org/linux/man-pages/man3/iconv_open.3.html) allocates a new converter + * from `__src_encoding` to `__dst_encoding`. + * + * Returns a new `iconv_t` on success and returns `((iconv_t) -1)` and sets `errno` on failure. + * + * Available since API level 28. + */ + +#if __ANDROID_API__ >= 28 +iconv_t iconv_open(const char* __src_encoding, const char* __dst_encoding) __INTRODUCED_IN(28); + +/** + * [iconv(3)](http://man7.org/linux/man-pages/man3/iconv.3.html) converts characters from one + * encoding to another. + * + * Android supports the `utf8`, `ascii`, `usascii`, `utf16be`, `utf16le`, `utf32be`, `utf32le`, + * and `wchart` encodings. Android also supports the GNU `//IGNORE` and `//TRANSLIT` extensions. + * + * Returns the number of characters converted on success and returns `((size_t) -1)` and + * sets `errno` on failure. + * + * Available since API level 28. + */ +size_t iconv(iconv_t __converter, char** __src_buf, size_t* __src_bytes_left, char** __dst_buf, size_t* __dst_bytes_left) __INTRODUCED_IN(28); + +/** + * [iconv_close(3)](http://man7.org/linux/man-pages/man3/iconv_close.3.html) deallocates a converter + * returned by iconv_open(). + * + * Returns 0 on success and returns -1 and sets `errno` on failure. + * + * Available since API level 28. + */ +int iconv_close(iconv_t __converter) __INTRODUCED_IN(28); +#endif /* __ANDROID_API__ >= 28 */ + + +__END_DECLS diff --git a/engine/host.cpp b/engine/host.cpp index 067f9ee8..57370866 100644 --- a/engine/host.cpp +++ b/engine/host.cpp @@ -3903,7 +3903,7 @@ void Host_PostInit() EngineVGui()->PostInit(); } -#if defined( LINUX ) +#if defined( LINUX ) && !defined ANDROID const char en_US[] = "en_US.UTF-8"; const char *CurrentLocale = setlocale( LC_ALL, NULL ); if ( !CurrentLocale ) diff --git a/launcher/launcher.cpp b/launcher/launcher.cpp index 7c7f663b..217db87c 100644 --- a/launcher/launcher.cpp +++ b/launcher/launcher.cpp @@ -1192,7 +1192,7 @@ extern "C" __declspec(DLL_EXPORT) int LauncherMain( HINSTANCE hInstance, HINSTAN DLL_EXPORT int LauncherMain( int argc, char **argv ) #endif { -#ifdef LINUX +#if defined LINUX && !defined ANDROID // Temporary fix to stop us from crashing in printf/sscanf functions that don't expect // localization to mess with your "." and "," float seperators. Mac OSX also sets LANG // to en_US.UTF-8 before starting up (in info.plist I believe). @@ -1208,12 +1208,12 @@ DLL_EXPORT int LauncherMain( int argc, char **argv ) const char *CurrentLocale = setlocale( LC_ALL, NULL ); if ( Q_stricmp( CurrentLocale, en_US ) ) { - Warning( "WARNING: setlocale('%s') failed, using locale:'%s'. International characters may not work.\n", en_US, CurrentLocale ); + Msg( "WARNING: setlocale('%s') failed, using locale:'%s'. International characters may not work.\n", en_US, CurrentLocale ); } #endif // LINUX -#if defined LINUX && defined USE_SDL && defined TOGLES +#if defined LINUX && defined USE_SDL && defined TOGLES && !defined ANDROID SDL_SetHint(SDL_HINT_VIDEO_X11_FORCE_EGL, "1"); #endif diff --git a/lib/android/armeabi-v7a/libandroid_support.a b/lib/android/armeabi-v7a/libandroid_support.a index 30a81d72e8ae976751fb5fc59b1951aaa2a8e6a0..c19cd8cca93c3637b64e2f06c54dc631a010910c 100644 GIT binary patch delta 33575 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

?m&`=ph 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 VzPFny(i^(swEQqp_>wj9{{SR6-ktye delta 31281 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 Aga7~l diff --git a/vgui2/vgui_surfacelib/linuxfont.cpp b/vgui2/vgui_surfacelib/linuxfont.cpp index f94d7a40..c77065b2 100644 --- a/vgui2/vgui_surfacelib/linuxfont.cpp +++ b/vgui2/vgui_surfacelib/linuxfont.cpp @@ -42,6 +42,8 @@ inline int32_t INT_2FIXED6(int32_t x) { return x << 6; } bool CLinuxFont::ms_bSetFriendlyNameCacheLessFunc = false; CUtlRBTree< CLinuxFont::font_name_entry > CLinuxFont::m_FriendlyNameCache; +#define ANDROID 1 + //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- @@ -422,9 +424,9 @@ char *FindFontAndroid(bool bBold, int italic) else if( italic ) fontFileNamePost = "Italic"; else - fontFileName = "Regular"; + fontFileNamePost = "Regular"; - char dataFile[MAX_PATH]; + static char dataFile[MAX_PATH]; if( fontFileNamePost ) snprintf( dataFile, sizeof dataFile, "/system/fonts/%s-%s.ttf", fontFileName, fontFileNamePost ); @@ -435,7 +437,7 @@ char *FindFontAndroid(bool bBold, int italic) { fontFileNamePost = NULL; fontFileName = "DroidSans"; - if( bBold > 500 ) + if( bBold ) fontFileNamePost = "Bold"; if( fontFileNamePost ) @@ -468,7 +470,7 @@ char *CLinuxFont::GetFontFileName( const char *windowsFontName, int flags ) #ifdef ANDROID char *filename = FindFontAndroid( bBold, italic ); - Msg("Android font: %s", filename); + Msg("Android font: %s\n", filename); if( !filename ) return NULL; return strdup( filename ); #else From ead7bfc155ea022f81982c44e3a42678f622c1a7 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 9 Jan 2022 19:32:21 +0300 Subject: [PATCH 08/18] Update ToGLES( fix occlusion query and other small things ) --- appframework/glmdisplaydb_linuxwin.inl | 1 + appframework/sdlmgr.cpp | 15 +- game/client/hud.cpp | 2 +- materialsystem/cmaterialsystem.cpp | 5 + .../shaderapidx9/vertexshaderdx8.cpp | 11 +- public/togles/linuxwin/glentrypoints.h | 83 +++-- public/togles/linuxwin/glfuncs.h | 63 ++-- public/togles/linuxwin/glmdebug.h | 1 - public/togles/linuxwin/glmgr.h | 40 ++- togles/linuxwin/cglmbuffer.cpp | 20 +- togles/linuxwin/cglmprogram.cpp | 6 +- togles/linuxwin/cglmquery.cpp | 4 +- togles/linuxwin/cglmtex.cpp | 296 +++++++++++------- togles/linuxwin/dx9asmtogl2.cpp | 34 +- togles/linuxwin/dxabstract.cpp | 10 +- togles/linuxwin/glentrypoints.cpp | 34 +- togles/linuxwin/glmgr.cpp | 14 +- 17 files changed, 373 insertions(+), 266 deletions(-) diff --git a/appframework/glmdisplaydb_linuxwin.inl b/appframework/glmdisplaydb_linuxwin.inl index ae52a34c..3a516f2a 100644 --- a/appframework/glmdisplaydb_linuxwin.inl +++ b/appframework/glmdisplaydb_linuxwin.inl @@ -42,6 +42,7 @@ void GLMRendererInfo::Init( GLMRendererInfoFields *info ) m_info.m_atiNewer = true; m_info.m_hasGammaWrites = true; + m_info.m_cantAttachSRGB = false; // If you haven't created a GL context by now (and initialized gGL), you're about to crash. diff --git a/appframework/sdlmgr.cpp b/appframework/sdlmgr.cpp index d466411e..4fc1878e 100644 --- a/appframework/sdlmgr.cpp +++ b/appframework/sdlmgr.cpp @@ -60,6 +60,7 @@ const int kBogusSwapInterval = INT_MAX; #if defined ANDROID || defined TOGLES static void *l_gl4es = NULL; static void *l_egl = NULL; +static void *l_gles = NULL; typedef void *(*t_glGetProcAddress)( const char * ); t_glGetProcAddress _glGetProcAddress; @@ -194,7 +195,14 @@ void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, vo #if defined ANDROID || defined TOGLES // SDL does the right thing, so we never need to use tier0 in this case. if( _glGetProcAddress ) + { retval = _glGetProcAddress(fn); + + Msg("_glGetProcAddress(%s) = %x\n", fn, retval); + + if( !retval && l_gles ) + retval = dlsym( l_gles, fn ); + } //printf("CDynamicFunctionOpenGL: SDL_GL_GetProcAddress(\"%s\") returned %p\n", fn, retval); if ((retval == NULL) && (fallback != NULL)) { @@ -507,8 +515,8 @@ InitReturnVal_t CSDLMgr::Init() SDL_GL_SetAttribute( SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG ); } -#ifdef TOGLES - if (SDL_GL_LoadLibrary("libGLESv2.so") == -1) +#if defined( TOGLES ) + if (SDL_GL_LoadLibrary("libGLESv3.so") == -1) #else if (SDL_GL_LoadLibrary(NULL) == -1) #endif @@ -583,6 +591,7 @@ InitReturnVal_t CSDLMgr::Init() #ifdef TOGLES l_egl = dlopen("libEGL.so", RTLD_LAZY); + l_gles = dlopen("libGLESv3.so", RTLD_LAZY); if( l_egl ) _glGetProcAddress = (t_glGetProcAddress)dlsym(l_egl, "eglGetProcAddress"); @@ -590,7 +599,6 @@ InitReturnVal_t CSDLMgr::Init() SET_GL_ATTR(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SET_GL_ATTR(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SET_GL_ATTR(SDL_GL_CONTEXT_MINOR_VERSION, 0); - #elif ANDROID bool m_bOGL = false; @@ -1405,6 +1413,7 @@ void CSDLMgr::ShowPixels( CShowPixelsParams *params ) m_flPrevGLSwapWindowTime = tm.GetDurationInProgress().GetMillisecondsF(); + CheckGLError( __LINE__ ); } #endif // DX_TO_GL_ABSTRACTION diff --git a/game/client/hud.cpp b/game/client/hud.cpp index cbc2c849..c32f4b4f 100644 --- a/game/client/hud.cpp +++ b/game/client/hud.cpp @@ -811,7 +811,7 @@ void CHud::RefreshHudTextures() // check to see if we have sprites for this res; if not, step down LoadHudTextures( textureList, "scripts/hud_textures", NULL ); - //LoadHudTextures( textureList, "scripts/mod_textures", NULL ); + LoadHudTextures( textureList, "scripts/mod_textures", NULL ); // fix up all the texture icons first int c = textureList.Count(); diff --git a/materialsystem/cmaterialsystem.cpp b/materialsystem/cmaterialsystem.cpp index 3d19a168..0618d0c0 100644 --- a/materialsystem/cmaterialsystem.cpp +++ b/materialsystem/cmaterialsystem.cpp @@ -1872,7 +1872,12 @@ void CMaterialSystem::ReadConfigFromConVars( MaterialSystem_Config_t *pConfig ) pConfig->m_fGammaTVExponent = mat_monitorgamma_tv_exp.GetFloat(); pConfig->m_bGammaTVEnabled = mat_monitorgamma_tv_enabled.GetBool(); +#ifdef TOGLES + pConfig->m_nAASamples = 0; +#else pConfig->m_nAASamples = mat_antialias.GetInt(); +#endif + pConfig->m_nAAQuality = mat_aaquality.GetInt(); pConfig->bShowDiffuse = mat_diffuse.GetInt() ? true : false; // pConfig->bAllowCheats = false; // hack diff --git a/materialsystem/shaderapidx9/vertexshaderdx8.cpp b/materialsystem/shaderapidx9/vertexshaderdx8.cpp index b3f1063c..aa4931f2 100644 --- a/materialsystem/shaderapidx9/vertexshaderdx8.cpp +++ b/materialsystem/shaderapidx9/vertexshaderdx8.cpp @@ -160,13 +160,16 @@ static FILE *GetDebugFileHandle( void ) #ifdef DX_TO_GL_ABSTRACTION // mat_autoload_glshaders instructs the engine to load a cached shader table at startup // it will try for glshaders.cfg first, then fall back to glbaseshaders.cfg if not found -ConVar mat_autoload_glshaders( "mat_autoload_glshaders", "1" ); - // mat_autosave_glshaders instructs the engine to save out the shader table at key points // to the filename glshaders.cfg // -ConVar mat_autosave_glshaders( "mat_autosave_glshaders", "1" ); - +#ifdef ANDROID + ConVar mat_autosave_glshaders( "mat_autosave_glshaders", "0" ); + ConVar mat_autoload_glshaders( "mat_autoload_glshaders", "0" ); +#else + ConVar mat_autosave_glshaders( "mat_autosave_glshaders", "1" ); + ConVar mat_autoload_glshaders( "mat_autoload_glshaders", "1" ); +#endif #endif //----------------------------------------------------------------------------- diff --git a/public/togles/linuxwin/glentrypoints.h b/public/togles/linuxwin/glentrypoints.h index 80611984..a7874463 100644 --- a/public/togles/linuxwin/glentrypoints.h +++ b/public/togles/linuxwin/glentrypoints.h @@ -38,8 +38,18 @@ #include "interface.h" #include "togles/rendermechanism.h" +#ifdef LINUX +#include +#endif + void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, void *fallback=NULL); +/* +#define GL_USE_EXECUTE_HELPER_FOR_ALL_API_CALLS 1 +#define GL_TRACK_API_TIME 1 +#define GL_DUMP_ALL_API_CALLS 1 +*/ + #if GL_USE_EXECUTE_HELPER_FOR_ALL_API_CALLS class CGLExecuteHelperBase { @@ -47,7 +57,7 @@ public: inline void StartCall(const char *pName); inline void StopCall(const char *pName); #if GL_TRACK_API_TIME - TmU64 m_nStartTime; + uint64 m_nStartTime; #endif }; @@ -308,13 +318,14 @@ public: GLDriverProvider_t m_nDriverProvider; #ifdef OSX -#define GL_EXT(x,glmajor,glminor) bool m_bHave_##x; -#define GL_FUNC(ext,req,ret,fn,arg,call) CDynamicFunctionOpenGL< req, ret (*) arg, ret > fn; -#define GL_FUNC_VOID(ext,req,fn,arg,call) CDynamicFunctionOpenGL< req, void (*) arg, void > fn; -#else #define GL_EXT(x,glmajor,glminor) bool m_bHave_##x; -#define GL_FUNC(ext,req,ret,fn,arg,call) CDynamicFunctionOpenGL< req, ret (APIENTRY *) arg, ret > fn; -#define GL_FUNC_VOID(ext,req,fn,arg,call) CDynamicFunctionOpenGL< req, void (APIENTRY *) arg, void > fn; +#define GL_FUNC(ext,req,ret,fn,arg,call) CDynamicFunctionOpenGL< req, ret (*) arg, ret > fn; +#define GL_FUNC_VOID(ext,req,fn,arg,call) CDynamicFunctionOpenGL< req, void (*) arg, void > fn; +#else +#define _APIENTRY __attribute__((pcs("aapcs"))) APIENTRY +#define GL_EXT(x,glmajor,glminor) bool m_bHave_##x; +#define GL_FUNC(ext,req,ret,fn,arg,call) CDynamicFunctionOpenGL< req, ret (_APIENTRY *) arg, ret > fn; +#define GL_FUNC_VOID(ext,req,fn,arg,call) CDynamicFunctionOpenGL< req, void (_APIENTRY *) arg, void > fn; #endif #include "togles/glfuncs.inl" #undef GL_FUNC_VOID @@ -347,54 +358,30 @@ typedef void * (*GL_GetProcAddressCallbackFunc_t)(const char *, bool &, const bo DLL_IMPORT void ClearOpenGLEntryPoints(); #endif +inline uint64 get_nsecs() +{ + struct timespec time={0,0}; + clock_gettime(CLOCK_MONOTONIC, &time); + return time.tv_nsec; +} + #if GL_USE_EXECUTE_HELPER_FOR_ALL_API_CALLS inline void CGLExecuteHelperBase::StartCall(const char *pName) { (void)pName; - -#if GL_TELEMETRY_ZONES - tmEnter( TELEMETRY_LEVEL3, TMZF_NONE, pName ); -#endif - -#if GL_TRACK_API_TIME - m_nStartTime = tmFastTime(); -#endif - -#if GL_DUMP_ALL_API_CALLS - static bool s_bDumpCalls; - if ( s_bDumpCalls ) - { - char buf[128]; - buf[0] = 'G'; - buf[1] = 'L'; - buf[2] = ':'; - size_t l = strlen( pName ); - memcpy( buf + 3, pName, l ); - buf[3 + l] = '\n'; - buf[4 + l] = '\0'; - Plat_DebugString( buf ); - } -#endif + m_nStartTime = get_nsecs(); } inline void CGLExecuteHelperBase::StopCall(const char *pName) -{ -#if GL_TRACK_API_TIME - uint64 nTotalCycles = tmFastTime() - m_nStartTime; -#endif - -#if GL_TELEMETRY_ZONES - tmLeave( TELEMETRY_LEVEL3 ); -#endif - -#if GL_TRACK_API_TIME - //double flMilliseconds = g_Telemetry.flRDTSCToMilliSeconds * nTotalCycles; - if (gGL) - { - gGL->m_nTotalGLCycles += nTotalCycles; - gGL->m_nTotalGLCalls++; - } -#endif +{ + if( gGL ) + { + uint64 time = get_nsecs() - m_nStartTime; + printf("Function %s finished in %llu\n", pName, time); + + if( strcmp(pName, "glBufferSubData") == 0 && time > 1000000 ) + DebuggerBreak(); + } } #endif diff --git a/public/togles/linuxwin/glfuncs.h b/public/togles/linuxwin/glfuncs.h index 220416a5..39dfdc87 100644 --- a/public/togles/linuxwin/glfuncs.h +++ b/public/togles/linuxwin/glfuncs.h @@ -36,7 +36,6 @@ 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,glBufferData,(GLenum a, GLsizeiptr b, const GLvoid *c,GLenum d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glClear,(GLbitfield a),(a)) -GL_FUNC_VOID(OpenGL,true,glClearDepthf,(GLfloat 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,glReadPixels, (GLint a, GLint b, GLsizei c, GLsizei d, GLenum e, GLenum f, void * g), (a,b,c,d,e,f,g)) GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint a),(a)) @@ -55,13 +54,18 @@ GL_FUNC_VOID(OpenGL,true,glDeleteShader,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glDeleteTextures,(GLsizei a,const GLuint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean a),(a)) -GL_FUNC_VOID(OpenGL,true,glDepthRangef,(GLfloat a,GLfloat b),(a,b)) GL_FUNC_VOID(OpenGL,true,glDisable,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glDrawBuffers,(GLsizei a,const GLenum *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glDetachShader,(GLuint a,GLuint b),(a,b)) 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,glGetSynciv,(GLsync a, GLenum b, GLsizei c, GLsizei *d, GLint *e),(a,b,c,d,e)) +GL_FUNC(OpenGL,true,GLenum,glClientWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glDeleteSync,(GLsync a),(a)) +GL_FUNC(OpenGL,true,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b)) + #ifndef OSX // 10.6/GL 2.1 compatability GL_FUNC_VOID(OpenGL,true,glDrawRangeElementsBaseVertex,(GLenum a,GLuint b,GLuint c,GLsizei d,GLenum e,const GLvoid *f, GLenum g),(a,b,c,d,e,f,g)) #endif @@ -73,7 +77,6 @@ GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glGenBuffers,(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,glGetFloatv,(GLenum a,GLfloat *b),(a,b)) //GL_FUNC_VOID(OpenGL,true,glGetInfoLog,(GLuint a,GLsizei b,GLsizei *c,GLchar *d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glGetIntegerv,(GLenum a,GLint *b),(a,b)) GL_FUNC_VOID(OpenGL,true,glGetProgramiv,(GLenum a,GLenum b,GLint *c),(a,b,c)) @@ -85,7 +88,6 @@ GL_FUNC_VOID(OpenGL,true,glLinkProgram,(GLuint a),(a)) //GL_FUNC_VOID(OpenGL,true,glOrtho,(GLdouble a,GLdouble b,GLdouble c,GLdouble d,GLdouble e,GLdouble f),(a,b,c,d,e,f)) GL_FUNC_VOID(OpenGL,true,glPixelStorei,(GLenum a,GLint b),(a,b)) //GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glPolygonOffset,(GLfloat a,GLfloat b),(a,b)) GL_FUNC_VOID(OpenGL,true,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,glShaderSource,(GLuint a,GLsizei b,const GLchar **c,const GLint *d),(a,b,c,d)) @@ -94,12 +96,9 @@ 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,glTexImage2D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLint f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) GL_FUNC_VOID(OpenGL,true,glTexImage3D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLenum h,GLenum i,const GLvoid *j),(a,b,c,d,e,f,g,h,i,j)) -GL_FUNC_VOID(OpenGL,true,glTexParameterfv,(GLenum a,GLenum b,const GLfloat *c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glTexParameteri,(GLenum a,GLenum b,GLint c),(a,b,c)) GL_FUNC_VOID(OpenGL,true,glTexSubImage2D,(GLenum a,GLint b,GLint c,GLint d,GLsizei e,GLsizei f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i)) -GL_FUNC_VOID(OpenGL,true,glUniform1f,(GLint a,GLfloat b),(a,b)) GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint b),(a,b)) -GL_FUNC_VOID(OpenGL,true,glUniform4fv,(GLint a,GLsizei b,const GLfloat *c),(a,b,c)) GL_FUNC(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glVertexAttribPointer,(GLuint a,GLint b,GLenum c,GLboolean d,GLsizei e,const GLvoid *f),(a,b,c,d,e,f)) @@ -108,22 +107,8 @@ GL_FUNC_VOID(OpenGL,true,glClientActiveTexture,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glStencilOpSeparate,(GLenum a,GLenum b,GLenum c,GLenum d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glStencilFuncSeparate,(GLenum a,GLenum b,GLint c,GLuint d),(a,b,c,d)) GL_FUNC_VOID(OpenGL,true,glGetTexLevelParameteriv,(GLenum a,GLint b,GLenum c,GLint *d),(a,b,c,d)) -GL_FUNC_VOID(OpenGL,true,glColor4f,(GLfloat a,GLfloat b,GLfloat c,GLfloat d),(a,b,c,d)) GL_EXT(GL_EXT_framebuffer_object,-1,-1) GL_EXT(GL_EXT_framebuffer_blit,-1,-1) -GL_EXT(GL_EXT_framebuffer_multisample,-1,-1) -/*GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindRenderbufferEXT,(GLenum a,GLuint b),(a,b)) -GL_FUNC(GL_EXT_framebuffer_object,false,GLenum,glCheckFramebufferStatusEXT,(GLenum a),(a)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteRenderbuffersEXT,(GLsizei a,const GLuint *b),(a,b)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferRenderbufferEXT,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture2DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture3DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenFramebuffersEXT,(GLsizei a,GLuint *b),(a,b)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenRenderbuffersEXT,(GLsizei a,GLuint *b),(a,b)) -GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteFramebuffersEXT,(GLsizei a,const GLuint *b),(a,b)) -GL_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_multisample,false,glRenderbufferStorageMultisampleEXT,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e))*/ GL_EXT(GL_APPLE_fence,-1,-1) GL_FUNC(GL_APPLE_fence,false,GLboolean,glTestFenceAPPLE,(GLuint a),(a)) GL_FUNC_VOID(GL_APPLE_fence,false,glSetFenceAPPLE,(GLuint a),(a)) @@ -137,13 +122,8 @@ GL_FUNC_VOID(GL_NV_fence,false,glFinishFenceNV,(GLuint a),(a)) GL_FUNC_VOID(GL_NV_fence,false,glDeleteFencesNV,(GLsizei a,const GLuint *b),(a,b)) GL_FUNC_VOID(GL_NV_fence,false,glGenFencesNV,(GLsizei a,GLuint *b),(a,b)) GL_EXT(GL_ARB_sync,3,2) -#ifdef HAVE_GL_ARB_SYNC -GL_FUNC_VOID(GL_ARB_sync,false,glGetSynciv,(GLsync a, GLenum b, GLsizei c, GLsizei *d, GLint *e),(a,b,c,d,e)) -GL_FUNC(GL_ARB_sync,false,GLenum,glClientWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c)) -GL_FUNC_VOID(GL_ARB_sync,false,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c)) -GL_FUNC_VOID(GL_ARB_sync,false,glDeleteSync,(GLsync a),(a)) -GL_FUNC(GL_ARB_sync,false,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b)) -#endif +//#ifdef HAVE_GL_ARB_SYNC +//#endif 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(GL_EXT_bindable_uniform,false,int,glGetUniformBufferSizeEXT,(GLenum a, GLenum b),(a,b)) @@ -165,6 +145,7 @@ GL_EXT(GL_APPLE_client_storage,-1,-1) GL_EXT(GL_ARB_uniform_buffer,-1,-1) GL_EXT(GL_ARB_vertex_array_bgra,-1,-1) GL_EXT(GL_EXT_vertex_array_bgra,-1,-1) +GL_EXT(GL_EXT_framebuffer_multisample_blit_scaled,-1,-1) GL_EXT(GL_ARB_framebuffer_object,3,0) /*GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindFramebuffer,(GLenum a,GLuint b),(a,b)) @@ -208,9 +189,7 @@ GL_FUNC_VOID(OpenGL, true, glGenSamplers, (GLuint a, GLuint *b), (a, b)) GL_FUNC_VOID(OpenGL, true, glDeleteSamplers, (GLsizei a, const GLuint *b), (a, b)) GL_FUNC_VOID(OpenGL, true, glBindSampler, (GLuint a, GLuint b), (a, b)) GL_FUNC_VOID(OpenGL, true, glSamplerParameteri, (GLuint a, GLenum b, GLint c), (a, b, c)) -GL_FUNC_VOID(OpenGL, true, glSamplerParameterf, (GLuint a, GLenum b, GLfloat c), (a, b, c)) -GL_FUNC_VOID(OpenGL, true, glSamplerParameterfv, (GLuint a, GLenum b, const GLfloat *c), (a, b, c)) -GL_FUNC(GL_NV_bindless_texture, false, GLuint64, glGetTextureHandleNV, (GLuint texture), (texture)) +/*GL_FUNC(GL_NV_bindless_texture, false, GLuint64, glGetTextureHandleNV, (GLuint texture), (texture)) GL_FUNC(GL_NV_bindless_texture, false, GLuint64, glGetTextureSamplerHandleNV, (GLuint texture, GLuint sampler), (texture, sampler)) GL_FUNC_VOID(GL_NV_bindless_texture, false, glMakeTextureHandleResidentNV, (GLuint64 handle), (handle)) GL_FUNC_VOID(GL_NV_bindless_texture, false, glMakeTextureHandleNonResidentNV, (GLuint64 handle), (handle)) @@ -218,7 +197,7 @@ GL_FUNC_VOID(GL_NV_bindless_texture, false, glUniformHandleui64NV, (GLint locati GL_FUNC_VOID(GL_NV_bindless_texture, false, glUniformHandleui64vNV, (int location, GLsizei count, const GLuint64 *value), (location count, value)) GL_FUNC_VOID(GL_NV_bindless_texture, false, glProgramUniformHandleui64NV, (GLuint program, GLint location, GLuint64 value), (program, location, value)) GL_FUNC_VOID(GL_NV_bindless_texture, false, glProgramUniformHandleui64vNV, (GLuint program, GLint location, GLsizei count, const GLuint64 *values), (program, location, count, values)) -GL_FUNC(GL_NV_bindless_texture, false, GLboolean, glIsTextureHandleResidentNV, (GLuint64 handle), (handle)) +GL_FUNC(GL_NV_bindless_texture, false, GLboolean, glIsTextureHandleResidentNV, (GLuint64 handle), (handle))*/ GL_FUNC_VOID(OpenGL,true,glGenQueries,(GLsizei n, GLuint *ids), (n, ids)) GL_FUNC_VOID(OpenGL,true,glDeleteQueries,(GLsizei n, const GLuint *ids),(n, ids)) GL_FUNC_VOID(OpenGL,true,glBeginQuery,(GLenum target, GLuint id), (target, id)) @@ -227,7 +206,6 @@ GL_FUNC_VOID(OpenGL,true,glCopyBufferSubData,(GLenum readtarget, GLenum writetar #endif // !OSX GL_EXT(GL_AMD_pinned_memory,-1,-1) -GL_EXT(GL_EXT_framebuffer_multisample_blit_scaled,-1,-1) #ifndef OSX GL_FUNC_VOID(OpenGL,true,glGenVertexArrays,(GLsizei n, GLuint *arrays),(n, arrays)) @@ -235,6 +213,9 @@ GL_FUNC_VOID(OpenGL,true,glDeleteVertexArrays,(GLsizei n, GLuint *arrays),(n, ar GL_FUNC_VOID(OpenGL,true,glBindVertexArray,(GLuint a),(a)) #endif // !OSX +GL_EXT(GL_QCOM_alpha_test,-1,-1) + + GL_EXT(GL_EXT_texture_sRGB_decode,-1,-1) GL_EXT(GL_NVX_gpu_memory_info,-1,-1) GL_EXT(GL_ATI_meminfo,-1,-1) @@ -243,8 +224,12 @@ GL_EXT(GL_EXT_texture_compression_dxt1,-1,-1) GL_EXT(GL_ANGLE_texture_compression_dxt3,-1,-1) GL_EXT(GL_ANGLE_texture_compression_dxt5,-1,-1) +GL_EXT( GL_EXT_color_buffer_half_float, -1, -1 ) +GL_EXT( GL_EXT_texture_norm16, -1, -1 ) GL_EXT( GL_EXT_buffer_storage, -1, -1 ) GL_FUNC_VOID( GL_EXT_buffer_storage, false, glBufferStorageEXT, (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags), (target, size, data, flags) ) +//GL_FUNC_VOID(OpenGL, false,glGetTexImage,(GLenum a,GLint b,GLenum c,GLenum d,GLvoid *e),(a,b,c,d,e)) + // This one is an OS extension. We'll add a little helper function to look for it. #ifdef _WIN32 @@ -252,3 +237,15 @@ GL_FUNC_VOID( GL_EXT_buffer_storage, false, glBufferStorageEXT, (GLenum target, #else GL_EXT(GLX_EXT_swap_control_tear,-1,-1) #endif + +GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glPolygonOffset,(GLfloat a,GLfloat b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glTexParameterfv,(GLenum a,GLenum b,const GLfloat *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glUniform1f,(GLint a,GLfloat b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glUniform4fv,(GLint a,GLsizei b,const GLfloat *c),(a,b,c)) +GL_FUNC_VOID(OpenGL,true,glColor4f,(GLfloat a,GLfloat b,GLfloat c,GLfloat d),(a,b,c,d)) +GL_FUNC_VOID(OpenGL,true,glSamplerParameterf,(GLuint a, GLenum b, GLfloat c), (a, b, c)) +GL_FUNC_VOID(OpenGL,true,glSamplerParameterfv,(GLuint a, GLenum b, const GLfloat *c), (a, b, c)) +GL_FUNC_VOID(GL_QCOM_alpha_test,false,glAlphaFuncQCOM,(GLenum a, GLfloat b),(a,b)) +GL_FUNC_VOID(OpenGL,true,glClearDepthf,(GLfloat a),(a)) +GL_FUNC_VOID(OpenGL,true,glDepthRangef,(GLfloat a,GLfloat b),(a,b)) diff --git a/public/togles/linuxwin/glmdebug.h b/public/togles/linuxwin/glmdebug.h index 08cb6f91..f73e28a1 100644 --- a/public/togles/linuxwin/glmdebug.h +++ b/public/togles/linuxwin/glmdebug.h @@ -55,7 +55,6 @@ #endif #endif - //=============================================================================== // debug channels diff --git a/public/togles/linuxwin/glmgr.h b/public/togles/linuxwin/glmgr.h index a5ec89d6..d3179776 100644 --- a/public/togles/linuxwin/glmgr.h +++ b/public/togles/linuxwin/glmgr.h @@ -65,6 +65,10 @@ #define GLM_OPENGL_DEFAULT_DEVICE_ID 1 #define GLM_OPENGL_LOW_PERF_DEVICE_ID 2 +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 + extern void GLMDebugPrintf( const char *pMsg, ... ); extern uint g_nTotalDrawsOrClears, g_nTotalVBLockBytes, g_nTotalIBLockBytes; @@ -314,14 +318,18 @@ static GLAlphaTest_t g_alpha_test; // --- GLAlphaTestEnable --- FORCEINLINE void GLContextSet( GLAlphaTestEnable_t *src ) { -// glSetEnable( GL_ALPHA_TEST, src->enable != 0 ); - g_alpha_test.enable = src->enable; + if( gGL->m_bHave_GL_QCOM_alpha_test ) + glSetEnable( GL_ALPHA_TEST_QCOM, src->enable != 0 ); + else + g_alpha_test.enable = src->enable; } FORCEINLINE void GLContextGet( GLAlphaTestEnable_t *dst ) { -// dst->enable = gGL->glIsEnabled( GL_ALPHA_TEST ); - dst->enable = g_alpha_test.enable; + if( gGL->m_bHave_GL_QCOM_alpha_test ) + dst->enable = gGL->glIsEnabled( GL_ALPHA_TEST_QCOM ); + else + dst->enable = g_alpha_test.enable; } FORCEINLINE void GLContextGetDefault( GLAlphaTestEnable_t *dst ) @@ -332,17 +340,25 @@ FORCEINLINE void GLContextGetDefault( GLAlphaTestEnable_t *dst ) // --- GLAlphaTestFunc --- FORCEINLINE void GLContextSet( GLAlphaTestFunc_t *src ) { -// gGL->glAlphaFunc( src->func, src->ref ); + if( gGL->m_bHave_GL_QCOM_alpha_test ) + gGL->glAlphaFuncQCOM( src->func, src->ref ); + g_alpha_test.func = src->func; g_alpha_test.ref = src->ref; } FORCEINLINE void GLContextGet( GLAlphaTestFunc_t *dst ) { -// glGetEnumv( GL_ALPHA_TEST_FUNC, &dst->func ); -// gGL->glGetFloatv( GL_ALPHA_TEST_REF, &dst->ref ); - dst->func = g_alpha_test.func; - dst->ref = g_alpha_test.ref; + if( gGL->m_bHave_GL_QCOM_alpha_test ) + { + glGetEnumv( GL_ALPHA_TEST_FUNC_QCOM, &dst->func ); + gGL->glGetFloatv( GL_ALPHA_TEST_REF_QCOM, &dst->ref ); + } + else + { + dst->func = g_alpha_test.func; + dst->ref = g_alpha_test.ref; + } } FORCEINLINE void GLContextGetDefault( GLAlphaTestFunc_t *dst ) @@ -723,8 +739,8 @@ FORCEINLINE void GLContextSet( GLBlendEnableSRGB_t *src ) FORCEINLINE void GLContextGet( GLBlendEnableSRGB_t *dst ) { -// dst->enable = gGL->glIsEnabled( GL_FRAMEBUFFER_SRGB_EXT ); - dst->enable = true; // wtf ? + dst->enable = gGL->glIsEnabled( GL_FRAMEBUFFER_SRGB_EXT ); +// dst->enable = true; // wtf ? } FORCEINLINE void GLContextGetDefault( GLBlendEnableSRGB_t *dst ) @@ -1403,7 +1419,7 @@ class GLMContext else { m_FakeBlendEnableSRGB = src->enable != 0; - } + } // note however that we're still tracking what this mode should be, so FlushDrawStates can look at it and adjust the pixel shader // if fake SRGB mode is in place (m_caps.m_hasGammaWrites is false) } diff --git a/togles/linuxwin/cglmbuffer.cpp b/togles/linuxwin/cglmbuffer.cpp index 2aa1727e..14679260 100644 --- a/togles/linuxwin/cglmbuffer.cpp +++ b/togles/linuxwin/cglmbuffer.cpp @@ -37,7 +37,7 @@ bool g_bUsePseudoBufs = false; //( Plat_GetCommandLineA() ) ? ( strstr( Plat_Get // Significant perf degradation on some OSX parts if static buffers not disabled bool g_bDisableStaticBuffer = true; #else -bool g_bDisableStaticBuffer = false; //( Plat_GetCommandLineA() ) ? ( strstr( Plat_GetCommandLineA(), "-gl_disable_static_buffer" ) != NULL ) : false; +bool g_bDisableStaticBuffer = true; //( Plat_GetCommandLineA() ) ? ( strstr( Plat_GetCommandLineA(), "-gl_disable_static_buffer" ) != NULL ) : false; #endif // http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt @@ -93,8 +93,8 @@ CPersistentBuffer::~CPersistentBuffer() void CPersistentBuffer::Init( EGLMBufferType type,uint nSize ) { - Assert( gGL->m_bHave_GL_EXT_buffer_storage ); - Assert( gGL->m_bHave_GL_ARB_map_buffer_range ); +// Assert( gGL->m_bHave_GL_EXT_buffer_storage ); +// Assert( gGL->m_bHave_GL_ARB_map_buffer_range ); m_nSize = nSize; m_nOffset = 0; @@ -527,13 +527,13 @@ CGLMBuffer::CGLMBuffer( GLMContext *pCtx, EGLMBufferType type, uint size, uint o // buffers start out static, but if they get orphaned and gl_bufmode is non zero, // then they will get flipped to dynamic. - GLenum hint = GL_STATIC_DRAW; + GLenum hint = GL_STREAM_DRAW; switch (m_type) { - case kGLMVertexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; break; - case kGLMIndexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; break; + case kGLMVertexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STREAM_DRAW; break; + case kGLMIndexBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STREAM_DRAW; break; case kGLMUniformBuffer: hint = GL_DYNAMIC_DRAW; break; - case kGLMPixelBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; break; + case kGLMPixelBuffer: hint = m_bDynamic ? GL_DYNAMIC_DRAW : GL_STREAM_DRAW; break; default: Assert(!"Unknown buffer type" ); DXABSTRACT_BREAK_ON_ERROR(); } @@ -786,7 +786,7 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) // observe gl_bufmode on any orphan event. // if orphaned and bufmode is nonzero, flip it to dynamic. - GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; + GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW : GL_STREAM_DRAW; gGL->glBufferData( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); m_nRevision++; // revision grows on orphan event @@ -829,7 +829,7 @@ void CGLMBuffer::Lock( GLMBuffLockParams *pParams, char **pAddressOut ) // if orphaned and bufmode is nonzero, flip it to dynamic. // We always want to call glBufferData( ..., NULL ) on discards, even though we're using the GL_MAP_INVALIDATE_BUFFER_BIT flag, because this flag is actually only a hint according to AMD. - GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; + GLenum hint = gl_bufmode.GetInt() ? GL_DYNAMIC_DRAW : GL_STREAM_DRAW; gGL->glBufferData( m_buffGLTarget, m_nSize, (const GLvoid*)NULL, hint ); m_nRevision++; // revision grows on orphan event @@ -1047,7 +1047,7 @@ void CGLMBuffer::Unlock( int nActualSize, const void *pActualData ) Assert( nActualSize <= (int)( m_dirtyMaxOffset - m_dirtyMinOffset ) ); glBufferSubDataMaxSize( m_buffGLTarget, m_dirtyMinOffset, nActualSize, pActualData ? pActualData : m_pStaticBuffer ); - + #ifdef REPORT_LOCK_TIME double flEnd = Plat_FloatTime(); if ( flEnd - flStart > 5.0 / 1000.0 ) diff --git a/togles/linuxwin/cglmprogram.cpp b/togles/linuxwin/cglmprogram.cpp index 50d4830c..c2629099 100644 --- a/togles/linuxwin/cglmprogram.cpp +++ b/togles/linuxwin/cglmprogram.cpp @@ -362,8 +362,8 @@ void CGLMProgram::Compile( EGLMProgramLang lang ) GLchar log[4096]; gGL->glGetShaderInfoLog( glslDesc->m_object.glsl, sizeof(log), &maxLength, log ); - printf("shader compile log: %s\n", log); - printf("Shader %d source is:\n===============\n%s\nn===============\n", glslDesc->m_object.glsl, section); + Msg("shader compile log: %s\n", log); + Msg("Shader %d source is:\n===============\n%s\nn===============\n", glslDesc->m_object.glsl, section); } #if 0 //GLM_FREE_SHADER_TEXT @@ -785,8 +785,6 @@ bool CGLMShaderPair::ValidateProgramPair() { gGL->glUseProgram( m_program ); - printf("Sample text\n"); - m_ctx->NewLinkedProgram(); m_locVertexParams = gGL->glGetUniformLocation( m_program, "vc" ); diff --git a/togles/linuxwin/cglmquery.cpp b/togles/linuxwin/cglmquery.cpp index ffc7f247..99aac9f8 100644 --- a/togles/linuxwin/cglmquery.cpp +++ b/togles/linuxwin/cglmquery.cpp @@ -163,7 +163,7 @@ void CGLMQuery::Start( void ) // "start counting" } else { - gGL->glBeginQuery( GL_SAMPLES_PASSED, m_name ); + gGL->glBeginQuery( GL_ANY_SAMPLES_PASSED, m_name ); } } break; @@ -204,7 +204,7 @@ void CGLMQuery::Stop( void ) // "stop counting" } else { - gGL->glEndQuery( GL_SAMPLES_PASSED ); // we are only putting the request-to-stop-counting into the cmd stream. + gGL->glEndQuery( GL_ANY_SAMPLES_PASSED ); // we are only putting the request-to-stop-counting into the cmd stream. } } break; diff --git a/togles/linuxwin/cglmtex.cpp b/togles/linuxwin/cglmtex.cpp index 747ed01e..67d73faf 100644 --- a/togles/linuxwin/cglmtex.cpp +++ b/togles/linuxwin/cglmtex.cpp @@ -114,7 +114,7 @@ const GLMTexFormatDesc g_formatDescTable[] = { "_A8R8G8B8", D3DFMT_A8R8G8B8, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 1, 4 }, { "_A4R4G4B4", D3DFMT_A4R4G4B4, GL_RGBA4, 0, GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 1, 2 }, { "_X8R8G8B8", D3DFMT_X8R8G8B8, GL_RGB8, GL_SRGB8_EXT, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 1, 4 }, - + { "_X1R5G5B5", D3DFMT_X1R5G5B5, GL_RGB5, 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 1, 2 }, { "_A1R5G5B5", D3DFMT_A1R5G5B5, GL_RGB5_A1, 0, GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 1, 2 }, @@ -1106,6 +1106,8 @@ void CGLMTex::CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z *zStrideOut = zStride; } +extern void convert_texture( GLint &internalformat, GLsizei width, GLsizei height, GLenum &format, GLenum &type, void *data ); + void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) { GLMRegion readBox; @@ -1177,26 +1179,24 @@ void CGLMTex::ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice ) gGL->glBindFramebuffer(GL_FRAMEBUFFER, fbo); gGL->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_ctx->m_samplers[0].m_pBoundTex->m_texName, 0); - uint fmt = format->m_glDataFormat; + GLenum fmt = format->m_glDataFormat; if( fmt == GL_BGR ) fmt = GL_RGB; else if( fmt == GL_BGRA ) fmt = GL_RGBA; - - gGL->glReadPixels(0, 0, m_layout->m_slices[ desc->m_sliceIndex ].m_xSize, m_layout->m_slices[ desc->m_sliceIndex ].m_ySize, fmt , format->m_glDataType == GL_UNSIGNED_INT_8_8_8_8_REV ? GL_UNSIGNED_BYTE : format->m_glDataType, sliceAddress); + + gGL->glReadPixels(0, 0, m_layout->m_slices[ desc->m_sliceIndex ].m_xSize, m_layout->m_slices[ desc->m_sliceIndex ].m_ySize, fmt, format->m_glDataType == GL_UNSIGNED_INT_8_8_8_8_REV ? GL_UNSIGNED_BYTE : format->m_glDataType, sliceAddress); + GLint intformat = format->m_glDataFormat; + GLenum _format = format->m_glDataFormat; + GLenum _type = format->m_glDataType; + // TODO(nillerusr): Don't convert, should change m_format to another one + convert_texture(intformat, m_layout->m_slices[ desc->m_sliceIndex ].m_xSize, m_layout->m_slices[ desc->m_sliceIndex ].m_ySize, _format, _type, sliceAddress); + gGL->glBindFramebuffer(GL_READ_FRAMEBUFFER, Rfbo); gGL->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, Dfbo); gGL->glDeleteFramebuffers(1, &fbo); - -#if 0 - gGL->glGetTexImage( target, // target - desc->m_req.m_mip, // level - format->m_glDataFormat, // dataformat - format->m_glDataType, // datatype - sliceAddress ); // destination -#endif } } break; @@ -3258,7 +3258,6 @@ const char *get_enum_str(uint val) if( g_glEnums[i].value == val ) return g_glEnums[i].str; } - return "UNKNOWN"; } @@ -3301,6 +3300,148 @@ static inline float float_h2f(halffloat_t t) return tmp.f; } +static inline halffloat_t float_f2h(float f) +{ + fullfloat_t tmp; + halffloat_t ret; + tmp.f = f; + ret.x.sign = tmp.x.sign; + if (tmp.x.exp == 0) { + // O and denormal + ret.bin = 0; + } else if (tmp.x.exp==255) { + // Inf / NaN + ret.x.exp = 31; + ret.x.mant = tmp.x.mant>>13; + } else if(tmp.x.exp>0x71) { + // flush to 0 + ret.x.exp = 0; + ret.x.mant = 0; + } else if(tmp.x.exp<0x8e) { + // clamp to max + ret.x.exp = 30; + ret.x.mant = 1023; + } else { + ret.x.exp = tmp.x.exp - 38; + ret.x.mant = tmp.x.mant>>13; + } + + return ret; +} + +static uint8_t srgb_table[256] = {0}; +void pixel_srgb_inplace(GLvoid* pixels, GLuint size, GLuint width, GLuint height) +{ +// return; + if(!srgb_table[255]) { + // create table + for (int i=1; i<256; ++i) { + srgb_table[i] = floorf(255.f*powf(i/255.f, 2.2f)+0.5f); + } + } + uint8_t *data = (uint8_t*)pixels; + int sz = width*height*size; + for (int i=0; i < sz; i += size) + { + data[i] = srgb_table[data[i]]; + data[i+1] = srgb_table[data[i+1]]; + data[i+2] = srgb_table[data[i+2]]; + } +} + + + +void convert_texture( GLint &internalformat, GLsizei width, GLsizei height, GLenum &format, GLenum &type, void *data ) +{ +// printf("internalformat=%s format=%s type=%s\n", get_enum_str(internalformat), get_enum_str(format), get_enum_str(type)); + + if( internalformat == GL_SRGB8 && (format == GL_RGBA || format == GL_BGRA )) + internalformat = GL_SRGB8_ALPHA8; + + if( format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA ) + internalformat = format; + +// if( internalformat == GL_SRGB8_ALPHA8 ) +// internalformat = GL_RGBA; + +// if( internalformat == GL_SRGB8 ) +// internalformat = GL_RGB; + + if( data ) + { + uint8_t *_data = (uint8_t*)data; + + if( format == GL_BGR ) + { + for( int i = 0; i < width*height*3; i+=3 ) + { + uint8_t tmp = _data[i]; + _data[i] = _data[i+2]; + _data[i+2] = tmp; + } + format = GL_RGB; + } + else if( format == GL_BGRA ) + { + for( int i = 0; i < width*height*4; i+=4 ) + { + uint8_t tmp = _data[i]; + _data[i] = _data[i+2]; + _data[i+2] = tmp; + } + format = GL_RGBA; + } + + if( internalformat == GL_RGBA16 && !gGL->m_bHave_GL_EXT_texture_norm16 ) + { + uint16_t *_data = (uint16_t*)data; + uint8_t *new_data = (uint8_t*)data; + + for( int i = 0; i < width*height*4; i+=4 ) + { + new_data[i] = _data[i] >> 8; + new_data[i+1] = _data[i+1] >> 8; + new_data[i+2] = _data[i+2] >> 8; + new_data[i+3] = _data[i+3] >> 8; + } + + internalformat = GL_RGBA; + format = GL_RGBA; + type = GL_UNSIGNED_BYTE; + } + else if( internalformat == GL_SRGB8_ALPHA8 ) + { +// pixel_srgb_inplace( data, 4, width, height ); + internalformat = GL_RGBA; + } + else if( internalformat == GL_SRGB8 ) + { +// pixel_srgb_inplace( data, 3, width, height ); + internalformat = GL_RGB; + } + + } + else + { + if( format == GL_BGR ) + format = GL_RGB; + else if( format == GL_BGRA ) + format = GL_RGBA; + + if( internalformat == GL_RGBA16 && !gGL->m_bHave_GL_EXT_texture_norm16 ) + { + internalformat = GL_RGBA; + format = GL_RGBA; + type = GL_UNSIGNED_BYTE; + } + } + + if( type == GL_UNSIGNED_INT_8_8_8_8_REV ) + type = GL_UNSIGNED_BYTE; + +// printf("internalformat=%s format=%s type=%s\n==========================================\n", get_enum_str(internalformat), get_enum_str(format), get_enum_str(type)); +} + void TexImage2D(GLenum target, GLint level, GLint internalformat, @@ -3311,65 +3452,8 @@ void TexImage2D(GLenum target, GLenum type, const void * data) { - if( type == GL_UNSIGNED_INT_8_8_8_8_REV ) - type = GL_UNSIGNED_BYTE; - - if( format == GL_BGR ) - format = GL_RGB; + convert_texture( internalformat, width, height, format, type, data ); - if( format == GL_BGRA ) - format = GL_RGBA; - - if( internalformat == GL_SRGB8 && format == GL_RGBA ) - internalformat = GL_SRGB8_ALPHA8; - - if( format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA ) - internalformat = format; - -#if 0 - if( internalformat == GL_SRGB8 ) - internalformat = GL_RGB; - if( internalformat == GL_SRGB8_ALPHA8 ) - internalformat = GL_RGBA;*/ - - if( data ) - { - if( internalformat == GL_RGBA16F ) - { - uint16_t *_data = (uint16_t*)data; - uint8_t *new_data = (uint8_t*)data; - - for( int i = 0; i < width*height*4; i+=4 ) - { - halffloat_t fl; - fl.bin = _data[i]; new_data[i] = float_h2f(fl)*255; - fl.bin = _data[i+1]; new_data[i+1] = float_h2f(fl)*255; - fl.bin = _data[i+2]; new_data[i+2] = float_h2f(fl)*255; - fl.bin = _data[i+3]; new_data[i+3] = float_h2f(fl)*255; - } - internalformat = GL_RGBA; - type = GL_UNSIGNED_BYTE; - } - else if( internalformat == GL_RGBA16 ) - { - uint16_t *_data = (uint16_t*)data; - uint8_t *new_data = (uint8_t*)data; - - for( int i = 0; i < width*height*4; i+=4 ) - { - new_data[i] = _data[i] >> 8; - new_data[i+1] = _data[i+1] >> 8; - new_data[i+2] = _data[i+2] >> 8; - new_data[i+3] = _data[i+3] >> 8; - } - - data = new_data; - internalformat = GL_RGBA; - type = GL_UNSIGNED_BYTE; - } - } -#endif - gGL->glTexImage2D(target, level, internalformat, width, height, border, format, type, data); } @@ -3501,10 +3585,28 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, if( srgb ) intformat = GL_SRGB8_ALPHA8; } - //gGL->glTexImage2D(target, 0, internalformat, width, height, border, format, type, data); - TexImage2D( target, level, intformat, width, height, border, format, type, pixels ); + gGL->glTexImage2D(target, level, intformat, width, height, border, format, type, pixels); + //TexImage2D( target, level, intformat, width, height, border, format, type, pixels ); + if( data != pixels ) + free(pixels); } + +void TexSubImage2D( GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLint internalformat, + GLenum type, + const void * data) +{ + convert_texture( internalformat, width, height, format, type, data ); + gGL->glTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, data); +} + // TexSubImage should work properly on every driver stack and GPU--enabling by default. ConVar gl_enabletexsubimage( "gl_enabletexsubimage", "1" ); @@ -3562,11 +3664,11 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa // allow use of subimage if the target is texture2D and it has already been teximage'd bool mayUseSubImage = false; - //if ( (target==GL_TEXTURE_2D) && (m_sliceFlags[ desc->m_sliceIndex ] & kSliceValid) ) - //{ - // mayUseSubImage = gl_enabletexsubimage.GetInt() != 0; - //} - + if ( (target==GL_TEXTURE_2D) && (m_sliceFlags[ desc->m_sliceIndex ] & kSliceValid) ) + { +// mayUseSubImage = gl_enabletexsubimage.GetInt() != 0; + } + // check flavor, 2D, 3D, or cube map // we also have the choice to use subimage if this is a tex already created. (open question as to benefit) @@ -3681,54 +3783,28 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa { // go subimage2D if it's a replacement, not a creation - gGL->glPixelStorei( GL_UNPACK_ROW_LENGTH, slice->m_xSize ); // in pixels gGL->glPixelStorei( GL_UNPACK_SKIP_PIXELS, writeBox.xmin ); // in pixels gGL->glPixelStorei( GL_UNPACK_SKIP_ROWS, writeBox.ymin ); // in pixels - - gGL->glTexSubImage2D( glDataFormat, + + TexSubImage2D( target, desc->m_req.m_mip, // level writeBox.xmin, // xoffset into dest writeBox.ymin, // yoffset into dest writeBox.xmax - writeBox.xmin, // width (was slice->m_xSize) writeBox.ymax - writeBox.ymin, // height (was slice->m_ySize) glDataFormat, // format - glDataType == GL_UNSIGNED_INT_8_8_8_8_REV ? GL_UNSIGNED_BYTE : glDataType, // type + intformat, + glDataType, // type sliceAddress // data (will be offsetted by the SKIP_PIXELS and SKIP_ROWS - let GL do the math to find the first source texel) ); gGL->glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); gGL->glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0 ); - gGL->glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); - - /* - //http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml - glTexSubImage2D( target, - desc->m_req.m_mip, // level - 0, // xoffset - 0, // yoffset - slice->m_xSize, // width - slice->m_ySize, // height - glDataFormat, // format - glDataType, // type - sliceAddress // data - ); - */ + gGL->glPixelStorei( GL_UNPACK_SKIP_ROWS, 0 ); } else - { - if (m_layout->m_key.m_texFlags & kGLMTexRenderable) - { - if (gl_rt_forcergba.GetInt()) - { - if (glDataFormat == GL_BGRA) - { - // change it - glDataFormat = GL_RGBA; - } - } - } - + { // uncompressed path // http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html TexImage2D( target, // target diff --git a/togles/linuxwin/dx9asmtogl2.cpp b/togles/linuxwin/dx9asmtogl2.cpp index b2c541ab..f97d2e7f 100644 --- a/togles/linuxwin/dx9asmtogl2.cpp +++ b/togles/linuxwin/dx9asmtogl2.cpp @@ -1381,7 +1381,7 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch case D3DSRO_FOG: if( !m_bFogFragCoord ) { - StrcatToHeaderCode("varying mediump vec4 _gl_FogFragCoord;\n"); + StrcatToHeaderCode("varying highp vec4 _gl_FogFragCoord;\n"); m_bFogFragCoord = true; } @@ -1403,7 +1403,7 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch { if( !m_bFrontColor ) { - StrcatToHeaderCode("varying lowp vec4 _gl_FrontColor;\n"); + StrcatToHeaderCode("varying highp vec4 _gl_FrontColor;\n"); m_bFrontColor = true; } @@ -1413,7 +1413,7 @@ void D3DToGL::PrintParameterToString ( uint32 dwToken, uint32 dwSourceOrDest, ch { if( !m_bFrontSecondaryColor ) { - StrcatToHeaderCode("varying lowp vec4 _gl_FrontSecondaryColor;\n"); + StrcatToHeaderCode("varying highp vec4 _gl_FrontSecondaryColor;\n"); m_bFrontSecondaryColor = true; } @@ -2545,14 +2545,14 @@ void D3DToGL::Handle_TEX( uint32 dwToken, bool bIsTexLDL ) V_snprintf( szExtra, sizeof( szExtra ), ".%c", GetSwizzleComponent( pSrc0Reg, 3 ) ); V_strncat( szLOD, szExtra, sizeof( szLOD ) ); - PrintToBufWithIndents( *m_pBufALUCode, "%s = %s( %s, %s, %s );\n", pDestReg, bIsShadowSampler ? "shadow2DLod" : "textureLod", pSrc1Reg, sCoordVar.String(), szLOD ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = %s( %s, %s, %s );\n", pDestReg, "textureLod", pSrc1Reg, sCoordVar.String(), szLOD ); } else if ( bIsShadowSampler ) { // .z is meant to contain the object depth, while .xy contains the 2D tex coords CUtlString sCoordVar3D = EnsureNumSwizzleComponents( pSrc0Reg, 3 ); - PrintToBufWithIndents( *m_pBufALUCode, "%s = shadow2D( %s, %s );\n", pDestReg, pSrc1Reg, sCoordVar3D.String() ); + PrintToBufWithIndents( *m_pBufALUCode, "%s = vec4(texture( %s, %s ));\n", pDestReg, pSrc1Reg, sCoordVar3D.String() ); Assert( m_dwSamplerTypes[dwSrc1Token & D3DSP_REGNUM_MASK] == SAMPLER_TYPE_2D ); } else if( ( OpcodeSpecificData( dwToken ) << D3DSP_OPCODESPECIFICCONTROL_SHIFT ) == D3DSI_TEXLD_PROJECT ) @@ -2934,13 +2934,19 @@ void D3DToGL::WriteGLSLSamplerDefinitions() { int nSamplersWritten = 0; bool m_bSampler3d = false; + bool m_bShadowSampler = false; for ( int i=0; i < ARRAYSIZE( m_dwSamplerTypes ); i++ ) { if ( m_dwSamplerTypes[i] == SAMPLER_TYPE_2D ) { if ( ( ( 1 << i ) & m_nShadowDepthSamplerMask ) != 0 ) { - PrintToBuf( *m_pBufHeaderCode, "uniform sampler2D sampler%d;\n", i ); + if( !m_bShadowSampler ) + { + PrintToBuf( *m_pBufHeaderCode, "precision lowp sampler2DShadow;\n", i ); + m_bShadowSampler = true; + } + PrintToBuf( *m_pBufHeaderCode, "uniform sampler2DShadow sampler%d;\n", i ); } else { @@ -2955,7 +2961,6 @@ void D3DToGL::WriteGLSLSamplerDefinitions() StrcatToHeaderCode( "precision mediump sampler3D;\n" ); m_bSampler3d = true; } - PrintToBuf( *m_pBufHeaderCode, "uniform sampler3D sampler%d;\n", i ); ++nSamplersWritten; } @@ -3006,7 +3011,7 @@ void D3DToGL::WriteGLSLOutputVariableAssignments() { if( !m_bFrontColor ) { - StrcatToHeaderCode("varying lowp vec4 _gl_FrontColor;\n"); + StrcatToHeaderCode("varying highp vec4 _gl_FrontColor;\n"); m_bFrontColor = true; } @@ -3181,9 +3186,9 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo m_bPutHexCodesAfterLines = (options & D3DToGL_PutHexCommentsAfterLines) != 0; m_bGeneratingDebugText = (options & D3DToGL_GeneratingDebugText) != 0; m_bGenerateSRGBWriteSuffix = (options & D3DToGL_OptionSRGBWriteSuffix) != 0; -// m_bGenerateSRGBWriteSuffix = true; + m_bGenerateSRGBWriteSuffix = false; - if( debugLabel && ( V_strstr( debugLabel ,"vertexlit_and_unlit_generic_bump_ps") )) + if( debugLabel && (V_strstr( debugLabel ,"vertexlit_and_unlit_generic_ps") || V_strstr( debugLabel ,"vertexlit_and_unlit_generic_bump_ps") ) ) m_bGenerateSRGBWriteSuffix = true; m_NumIndentTabs = 1; // start code indented one tab @@ -3277,13 +3282,13 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo if ( ( dwToken & 0xFFFF0000 ) == 0xFFFF0000 ) { // must explicitly enable extensions if emitting GLSL - V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version 300 es\nprecision mediump float;\n#define varying in\n\n%s", glslExtText ); + V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version 300 es\nprecision highp float;\n#define varying in\n\n%s", glslExtText ); m_bVertexShader = false; } else // vertex shader { m_bGenerateSRGBWriteSuffix = false; - V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version 300 es\nprecision mediump float;\n#define attribute in\n#define varying out\n%s//ATTRIBMAP-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx\n", glslExtText ); + V_snprintf( (char *)m_pBufHeaderCode->Base(), m_pBufHeaderCode->Size(), "#version 300 es\nprecision highp float;\n#define attribute in\n#define varying out\n%s//ATTRIBMAP-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx-xx\n", glslExtText ); // find that first '-xx' which is where the attrib map will be written later. pAttribMapStart = strstr( (char *)m_pBufHeaderCode->Base(), "-xx" ) + 1; @@ -3889,14 +3894,15 @@ int D3DToGL::TranslateShader( uint32* code, CUtlBuffer *pBufDisassembledCode, bo #define FindSubcode(a) (V_strstr((char*)m_pBufALUCode->Base(), a) != 0 || V_strstr((char*)m_pBufHeaderCode->Base(), a) != 0 || V_strstr((char*)m_pBufParamCode->Base(), a) != 0 || V_strstr((char*)m_pBufAttribCode->Base(), a) != 0 ) +/* if( FindSubcode("shadow2DProj") ) { StrcatToHeaderCode( g_szShadow2D ); StrcatToHeaderCode( g_szShadow2DProj ); } else if( FindSubcode("shadow2D") ) - StrcatToHeaderCode( g_szShadow2D ); - + StrcatToHeaderCode( g_szShadow2D );*/ + if( FindSubcode("_gl_FrontColor") && !m_bFrontColor ) StrcatToHeaderCode( "in vec4 _gl_FrontColor;\n" ); diff --git a/togles/linuxwin/dxabstract.cpp b/togles/linuxwin/dxabstract.cpp index 5da2623f..84d6a3f3 100644 --- a/togles/linuxwin/dxabstract.cpp +++ b/togles/linuxwin/dxabstract.cpp @@ -1201,8 +1201,8 @@ static void FillD3DCaps9( const GLMRendererInfoFields &glmRendererInfo, D3DCAPS9 pCaps->MaxPixelShader30InstructionSlots = 0; #if DX_TO_GL_ABSTRACTION - pCaps->FakeSRGBWrite = true;//!glmRendererInfo.m_hasGammaWrites; - pCaps->CanDoSRGBReadFromRTs = true;//!glmRendererInfo.m_cantAttachSRGB; + pCaps->FakeSRGBWrite = !glmRendererInfo.m_hasGammaWrites; + pCaps->CanDoSRGBReadFromRTs = !glmRendererInfo.m_cantAttachSRGB; pCaps->MixedSizeTargets = glmRendererInfo.m_hasMixedAttachmentSizes; #endif } @@ -1320,9 +1320,9 @@ HRESULT IDirect3D9::CheckDeviceFormat(UINT Adapter,D3DDEVTYPE DeviceType,D3DFORM | D3DUSAGE_QUERY_VERTEXTEXTURE; (void)knownUsageMask; - // FramebufferSRGB stuff. - // basically a format is only allowed to have SRGB usage for writing, if you have the framebuffer SRGB extension. - // so, check for that capability with GLM adapter db, and if it's not there, don't mark that bit as usable in any of our formats. + // FramebufferSRGB stuff. + // basically a format is only allowed to have SRGB usage for writing, if you have the framebuffer SRGB extension. + // so, check for that capability with GLM adapter db, and if it's not there, don't mark that bit as usable in any of our formats. GLMDisplayDB *db = GetDisplayDB(); int glmRendererIndex = -1; int glmDisplayIndex = -1; diff --git a/togles/linuxwin/glentrypoints.cpp b/togles/linuxwin/glentrypoints.cpp index 80fec0ee..394f4f99 100644 --- a/togles/linuxwin/glentrypoints.cpp +++ b/togles/linuxwin/glentrypoints.cpp @@ -333,6 +333,9 @@ static bool CheckOpenGLExtension(const char *ext, const int coremajor, const int return retval; } +extern bool g_bUsePseudoBufs; +extern bool g_bDisableStaticBuffer; + // The GL context you want entry points for must be current when you hit this constructor! COpenGLEntryPoints::COpenGLEntryPoints() : m_nTotalGLCycles(0) @@ -387,17 +390,24 @@ COpenGLEntryPoints::COpenGLEntryPoints() { m_bHave_GL_EXT_framebuffer_object = true; m_bHave_GL_EXT_framebuffer_blit = true; - m_bHave_GL_EXT_framebuffer_multisample = true; - m_bHave_GL_ARB_occlusion_query = true; m_bHave_GL_ARB_map_buffer_range = true; + m_bHave_GL_EXT_direct_state_access = false; + m_bHave_GL_ARB_occlusion_query = true; + m_bHave_GL_EXT_buffer_storage = false; m_bHave_GL_ARB_vertex_buffer_object = true; - m_bHave_GL_ARB_vertex_array_bgra = true; - m_bHave_GL_EXT_vertex_array_bgra = true; m_bHave_GL_ARB_debug_output = true; - m_bHave_GL_EXT_direct_state_access = false; - m_bHave_GL_EXT_framebuffer_multisample_blit_scaled = true; - m_bHave_GL_EXT_texture_sRGB_decode = true; + m_bHave_GL_ARB_sync = true; + // m_bHave_GL_EXT_texture_sRGB_decode = true; + + if( CommandLine()->FindParm( "-gl_enable_pseudobufs" ) ) + g_bUsePseudoBufs = true; + if( CommandLine()->FindParm( "-gl_enable_static_buffer" ) ) + g_bDisableStaticBuffer = false; + if( CommandLine()->FindParm( "-gl_enable_buffer_storage" ) ) + m_bHave_GL_EXT_buffer_storage = true; + +#if 0 glBindFramebuffer.Force(glBindFramebuffer.Pointer()); glBindRenderbuffer.Force(glBindRenderbuffer.Pointer()); glCheckFramebufferStatus.Force(glCheckFramebufferStatus.Pointer()); @@ -410,6 +420,7 @@ COpenGLEntryPoints::COpenGLEntryPoints() glDeleteFramebuffers.Force(glDeleteFramebuffers.Pointer()); glBlitFramebuffer.Force(glBlitFramebuffer.Pointer()); glRenderbufferStorageMultisample.Force(glRenderbufferStorageMultisample.Pointer()); +#endif } #if DEBUG_ALL_GLCALLS @@ -417,10 +428,10 @@ COpenGLEntryPoints::COpenGLEntryPoints() #define GL_EXT(x,glmajor,glminor) #define GL_FUNC(ext,req,ret,fn,arg,call) \ fn##_gldebugptr = this->fn; \ - this->fn.Force(fn##_gldebug); +// this->fn.Force(fn##_gldebug); #define GL_FUNC_VOID(ext,req,fn,arg,call) \ fn##_gldebugptr = this->fn; \ - this->fn.Force(fn##_gldebug); +// this->fn.Force(fn##_gldebug); #include "togles/glfuncs.inl" #undef GL_FUNC_VOID #undef GL_FUNC @@ -434,6 +445,7 @@ COpenGLEntryPoints::COpenGLEntryPoints() if ( ( m_bHave_GL_NV_bindless_texture ) && ( !CommandLine()->CheckParm( "-gl_nv_bindless_texturing" ) ) ) { m_bHave_GL_NV_bindless_texture = false; +#if 0 glGetTextureHandleNV.Force( NULL ); glGetTextureSamplerHandleNV.Force( NULL ); glMakeTextureHandleResidentNV.Force( NULL ); @@ -443,6 +455,7 @@ COpenGLEntryPoints::COpenGLEntryPoints() glProgramUniformHandleui64NV.Force( NULL ); glProgramUniformHandleui64vNV.Force( NULL ); glIsTextureHandleResidentNV.Force( NULL ); +#endif } if ( !CommandLine()->CheckParm( "-gl_amd_pinned_memory" ) ) @@ -501,6 +514,3 @@ void COpenGLEntryPoints::ClearEntryPoints() } // Turn off memdbg macros (turned on up top) since this is included like a header #include "tier0/memdbgoff.h" - - - diff --git a/togles/linuxwin/glmgr.cpp b/togles/linuxwin/glmgr.cpp index 295d85bb..2e523cf9 100644 --- a/togles/linuxwin/glmgr.cpp +++ b/togles/linuxwin/glmgr.cpp @@ -229,7 +229,7 @@ void APIENTRY GL_Debug_Output_Callback(GLenum source, GLenum type, GLuint id, GL if ( ( type == GL_DEBUG_TYPE_ERROR_ARB ) && ( g_bDebugOutputBreakpoints ) ) { - DebuggerBreak(); +// DebuggerBreak(); } } @@ -592,13 +592,13 @@ void GLMContext::ForceFlushStates() m_DepthBias.Flush(); - m_ScissorEnable.Flush(); + m_ScissorEnable.Flush(); m_ScissorBox.Flush(); - m_ViewportBox.Flush(); + m_ViewportBox.Flush(); m_ViewportDepthRange.Flush(); - m_ColorMaskSingle.Flush(); + m_ColorMaskSingle.Flush(); m_BlendEnable.Flush(); m_BlendFactor.Flush(); @@ -819,7 +819,7 @@ void GLMContext::ProcessTextureDeletes() } } -// push and pop attrib when blit has mixed srgb source and dest? +// push and pop attrib when blit has mixed srgb source and dest? ConVar gl_radar7954721_workaround_mixed ( "gl_radar7954721_workaround_mixed", "1" ); // push and pop attrib on any blit? @@ -1323,7 +1323,7 @@ void GLMContext::BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int sr attparams.m_zslice = 0; m_blitReadFBO->TexAttach( &attparams, attachIndex, GL_READ_FRAMEBUFFER ); - gGL->glDrawBuffers( 1, &attachIndexGL ); + gGL->glReadBuffer( attachIndexGL ); // set the write fb and buffer, and attach write tex BindFBOToCtx( m_blitDrawFBO, GL_DRAW_FRAMEBUFFER ); @@ -2648,7 +2648,7 @@ GLMContext::GLMContext( IDirect3DDevice9 *pDevice, GLMDisplayParams *params ) gGL->glGenBuffers( 1, &m_destroyPBO ); gGL->glBindBuffer( GL_PIXEL_UNPACK_BUFFER, m_destroyPBO ); - gGL->glBufferData( GL_PIXEL_UNPACK_BUFFER, sizeof( g_garbageTextureBits ), g_garbageTextureBits, GL_STATIC_DRAW ); + gGL->glBufferData( GL_PIXEL_UNPACK_BUFFER, sizeof( g_garbageTextureBits ), g_garbageTextureBits, GL_STREAM_DRAW ); gGL->glBindBuffer( GL_PIXEL_UNPACK_BUFFER, m_nBoundGLBuffer[ kGLMPixelBuffer ] ); // Create a bunch of texture names for us to use forever and ever ramen. From 05ab85e8535414b37431b379a8752c5cbae2fdfe Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 9 Jan 2022 19:57:09 +0300 Subject: [PATCH 09/18] make achivements work without steam( partially ) --- game/client/achievement_notification_panel.cpp | 8 +++++--- game/shared/achievementmgr.cpp | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/game/client/achievement_notification_panel.cpp b/game/client/achievement_notification_panel.cpp index 61c31384..66c6b104 100644 --- a/game/client/achievement_notification_panel.cpp +++ b/game/client/achievement_notification_panel.cpp @@ -101,11 +101,12 @@ void CAchievementNotificationPanel::FireGameEvent( IGameEvent * event ) int iMax = event->GetInt( "max_val" ); wchar_t szLocalizedName[256]=L""; +#if 0 if ( IsPC() ) { // shouldn't ever get achievement progress if steam not running and user logged in, but check just in case if ( !steamapicontext->SteamUserStats() ) - { + { Msg( "Steam not running, achievement progress notification not displayed\n" ); } else @@ -115,6 +116,7 @@ void CAchievementNotificationPanel::FireGameEvent( IGameEvent * event ) } } else +#endif { // on X360 we need to show our own achievement progress UI @@ -245,7 +247,7 @@ void CAchievementNotificationPanel::SetXAndWide( Panel *pPanel, int x, int wide pPanel->SetWide( wide ); } -CON_COMMAND_F( achievement_notification_test, "Test the hud notification UI", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ) +CON_COMMAND_F( achievement_notification_test, "Test the hud notification UI", FCVAR_CHEAT ) { static int iCount=0; @@ -269,4 +271,4 @@ CON_COMMAND_F( achievement_notification_test, "Test the hud notification UI", FC #endif iCount++; -} \ No newline at end of file +} diff --git a/game/shared/achievementmgr.cpp b/game/shared/achievementmgr.cpp index ba1fab2b..606443bc 100644 --- a/game/shared/achievementmgr.cpp +++ b/game/shared/achievementmgr.cpp @@ -930,7 +930,7 @@ void CAchievementMgr::AwardAchievement( int iAchievementID ) pAchievement->OnAchieved(); // [tj] - IGameEvent * event = gameeventmanager->CreateEvent( "achievement_earned_local" ); + IGameEvent * event = gameeventmanager->CreateEvent( "achievement_earned" ); if ( event ) { event->SetInt( "achievement", pAchievement->GetAchievementID() ); @@ -1033,6 +1033,8 @@ extern bool IsInCommentaryMode( void ); //----------------------------------------------------------------------------- bool CAchievementMgr::CheckAchievementsEnabled() { + return true; + // if PC, Steam must be running and user logged in if ( IsPC() && !LoggedIntoSteam() ) { From 1d8149a3b35eadde062c900d31ad93f87b667ad8 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 9 Jan 2022 19:58:08 +0300 Subject: [PATCH 10/18] client: add touch editor --- game/client/touch.cpp | 352 +++++++++++++++++++++++++++++++++++++----- game/client/touch.h | 22 ++- game/client/wscript | 2 +- game/server/wscript | 2 +- 4 files changed, 330 insertions(+), 48 deletions(-) diff --git a/game/client/touch.cpp b/game/client/touch.cpp index 586f616e..efc258b6 100644 --- a/game/client/touch.cpp +++ b/game/client/touch.cpp @@ -9,6 +9,9 @@ #include "ienginevgui.h" #include "in_buttons.h" #include "base_texture.h" +#include "filesystem.h" +#include "tier0/icommandline.h" +#include "vgui_controls/Button.h" extern ConVar cl_sidespeed; extern ConVar cl_forwardspeed; @@ -129,7 +132,12 @@ CON_COMMAND( touch_settexture, "add native touch button" ) CON_COMMAND( touch_enableedit, "enable button editing mode" ) { - gTouch.EnableTouchEdit(); + gTouch.EnableTouchEdit(true); +} + +CON_COMMAND( touch_disableedit, "disable button editing mode" ) +{ + gTouch.EnableTouchEdit(false); } CON_COMMAND( touch_setcolor, "change button color" ) @@ -161,28 +169,40 @@ CON_COMMAND( touch_setflags, "change button flags" ) CON_COMMAND( touch_show, "show button" ) { - + if( args.ArgC() >= 2 ) + gTouch.ShowButton( args[1] ); + else + Msg( "Usage: touch_show \n" ); } CON_COMMAND( touch_hide, "hide button" ) { - + if( args.ArgC() >= 2 ) + gTouch.HideButton( args[1] ); + else + Msg( "Usage: touch_hide \n" ); } CON_COMMAND( touch_list, "list buttons" ) { - + gTouch.ListButtons(); } CON_COMMAND( touch_removeall, "remove all buttons" ) { - + gTouch.RemoveButtons(); } +CON_COMMAND( touch_writeconfig, "save current config" ) +{ + gTouch.WriteConfig(); +} + +/* CON_COMMAND( touch_loaddefaults, "generate config from defaults" ) { -} +} CON_COMMAND( touch_roundall, "round all buttons coordinates to grid" ) { @@ -198,12 +218,9 @@ CON_COMMAND( touch_reloadconfig, "load config, not saving changes" ) { } +*/ -CON_COMMAND( touch_writeconfig, "save current config" ) -{ - -} - +/* CON_COMMAND( touch_fade, "start fade animation for selected buttons" ) { @@ -212,7 +229,7 @@ CON_COMMAND( touch_fade, "start fade animation for selected buttons" ) CON_COMMAND( touch_toggleselection, "toggle visibility on selected button in editor" ) { -} +}*/ void CTouchControls::Init() { @@ -224,9 +241,13 @@ void CTouchControls::Init() vgui::surface()->DrawSetTextureRGBA( base_textureID, base_img_rgba, 120, 96, 0, true ); } - engine->GetScreenSize( screen_w, screen_h ); + int w,h; + engine->GetScreenSize( w, h ); + screen_w = w; screen_h = h; - initialized = true; + Msg("grid_x: %f, grid_y: %x\n", GRID_X, GRID_Y); + configchanged = false; + config_loaded = false; btns.EnsureCapacity( 64 ); look_finger = move_finger = resize_finger = -1; forward = side = 0; @@ -243,10 +264,10 @@ void CTouchControls::Init() showtexture = hidetexture = resettexture = closetexture = joytexture = 0; configchanged = false; - rgba_t color(255, 255, 255, 255); + rgba_t color(255, 255, 255, 155); - AddButton( "_look", "", "", 0.5, 0, 1, 1, color, 0, 0, 0 ); - AddButton( "_move", "", "", 0, 0, 0.5, 1, color, 0, 0, 0 ); + AddButton( "look", "", "_look", 0.5, 0, 1, 1, color, 0, 0, 0 ); + AddButton( "move", "", "_move", 0, 0, 0.5, 1, color, 0, 0, 0 ); AddButton( "use", "vgui/touch/use", "+use", 0.880000, 0.213333, 1.000000, 0.426667, color ); AddButton( "jump", "vgui/touch/jump", "+jump", 0.880000, 0.462222, 1.000000, 0.675556, color ); @@ -254,7 +275,8 @@ void CTouchControls::Init() AddButton( "attack2", "vgui/touch/shoot_alt", "+attack2", 0.760000, 0.320000, 0.880000, 0.533333, color ); AddButton( "duck", "vgui/touch/crouch", "+duck", 0.880000, 0.746667, 1.000000, 0.960000, color ); AddButton( "tduck", "vgui/touch/tduck", ";+duck", 0.560000, 0.817778, 0.620000, 0.924444, color ); - AddButton( "zoom", "vgui/touch/zoom", "+scoreboard", 0.680000, 0.00000, 0.760000, 0.142222, color ); + AddButton( "zoom", "vgui/touch/zoom", "+zoom", 0.680000, 0.00000, 0.760000, 0.142222, color ); +// AddButton( "score", "vgui/touch/map", "+score", 0.680000, 0.00000, 0.760000, 0.142222, color ); AddButton( "speed", "vgui/touch/speed", "+speed", 0.180000, 0.568889, 0.280000, 0.746667, color ); AddButton( "loadquick", "vgui/touch/load", "load quick", 0.760000, 0.000000, 0.840000, 0.142222, color ); AddButton( "savequick", "vgui/touch/save", "save quick", 0.840000, 0.000000, 0.920000, 0.142222, color ); @@ -262,8 +284,19 @@ void CTouchControls::Init() AddButton( "flashlight", "vgui/touch/flash_light_filled", "impulse 100", 0.920000, 0.000000, 1.000000, 0.142222, color ); AddButton( "invnext", "vgui/touch/next_weap", "invnext", 0.000000, 0.533333, 0.120000, 0.746667, color ); AddButton( "invprev", "vgui/touch/prev_weap", "invprev", 0.000000, 0.071111, 0.120000, 0.284444, color ); - //AddButton( "edit", "vgui/touch/settings", "touch_enableedit", 0.420000, 0.000000, 0.500000, 0.151486, color ); + AddButton( "edit", "vgui/touch/settings", "touch_enableedit", 0.420000, 0.000000, 0.500000, 0.151486, color ); AddButton( "menu", "vgui/touch/menu", "gameui_activate", 0.000000, 0.00000, 0.080000, 0.142222, color ); +// AddButton( "lie", "vgui/touch/lie", "+alt1", 0.580000, 0.568889, 0.680000, 0.746667, color ); + + char buf[256]; + Q_snprintf(buf, sizeof buf, "exec %s\n", touch_config_file.GetString()); + engine->ClientCmd_Unrestricted(buf); + + Q_snprintf(buf, sizeof buf, "cfg/%s", touch_config_file.GetString()); + if( !filesystem->FileExists(buf) ) + WriteConfig(); + + initialized = true; } void CTouchControls::Shutdown( ) @@ -271,6 +304,25 @@ void CTouchControls::Shutdown( ) btns.PurgeAndDeleteElements(); } +void CTouchControls::RemoveButtons() +{ + btns.PurgeAndDeleteElements(); +} + +void CTouchControls::ListButtons() +{ + CUtlLinkedList::iterator it; + for( it = btns.begin(); it != btns.end(); it++ ) + { + CTouchButton *b = *it; + + Msg( "%s %s %s %f %f %f %f %d %d %d %d %d\n", + b->name, b->texturefile, b->command, + b->x1, b->y1, b->x2, b->y2, + b->color.r, b->color.g, b->color.b, b->color.a, b->flags ); + } +} + void CTouchControls::IN_CheckCoords( float *x1, float *y1, float *x2, float *y2 ) { /// TODO: grid check here @@ -328,7 +380,7 @@ void CTouchControls::Frame() vgui::surface()->DrawSetTexture(base_textureID); const int off = 50; - vgui::surface()->DrawTexturedRect( off, off, screen_w*0.3+off, 0.24f*screen_w+off ); + vgui::surface()->DrawTexturedRect( off, off, screen_w*0.3f+off, 0.24f*screen_w+off ); } if( touch_enable.GetBool() && !enginevgui->IsGameUIVisible() ) Paint(); @@ -339,16 +391,36 @@ void CTouchControls::Paint( ) if (!initialized) return; + + if( state == state_edit ) + { + vgui::surface()->DrawSetColor(255, 0, 0, 200); + float x,y; + + for( x = 0.0f; x < 1.0f; x += GRID_X ) + vgui::surface()->DrawLine( screen_w*x, 0, screen_w*x, screen_h ); + + for( y = 0.0f; y < 1.0f; y += GRID_Y ) + vgui::surface()->DrawLine( 0, screen_h*y, screen_w, screen_h*y ); + } + CUtlLinkedList::iterator it; for( it = btns.begin(); it != btns.end(); it++ ) { CTouchButton *btn = *it; - if( btn->type == touch_move || btn->type == touch_look ) - continue; - vgui::surface()->DrawSetColor(255, 255, 255, 155); - vgui::surface()->DrawSetTexture( btn->textureID ); - vgui::surface()->DrawTexturedRect( btn->x1*screen_w, btn->y1*screen_h, btn->x2*screen_w, btn->y2*screen_h ); + if( btn->type != touch_move && btn->type != touch_look && !(btn->flags & TOUCH_FL_HIDE) ) + { + vgui::surface()->DrawSetTexture( btn->textureID ); + vgui::surface()->DrawSetColor(btn->color.r, btn->color.g, btn->color.b, btn->color.a); + vgui::surface()->DrawTexturedRect( btn->x1*screen_w, btn->y1*screen_h, btn->x2*screen_w, btn->y2*screen_h ); + } + + if( state == state_edit && !(btn->flags & TOUCH_FL_NOEDIT) ) + { + vgui::surface()->DrawSetColor(255, 0, 0, 50); + vgui::surface()->DrawFilledRect( btn->x1*screen_w, btn->y1*screen_h, btn->x2*screen_w, btn->y2*screen_h ); + } } } @@ -361,21 +433,23 @@ void CTouchControls::AddButton( const char *name, const char *texturefile, const Q_strncpy( btn->texturefile, texturefile, sizeof(btn->texturefile) ); Q_strncpy( btn->command, command, sizeof(btn->command) ); - IN_CheckCoords(&x1, &y1, &x2, &y2); + if( round ) + IN_CheckCoords(&x1, &y1, &x2, &y2); if( round == round_aspect ) - y2 = y1 + ( x2 - x1 ) * (((float)screen_w)/screen_h); + y2 = y1 + ( x2 - x1 ) * (((float)screen_w)/screen_h) * aspect; btn->x1 = x1; btn->y1 = y1; btn->x2 = x2; btn->y2 = y2; + btn->flags = flags; - IN_CheckCoords(&btn->x1, &btn->y1, &btn->x2, &btn->y2); + //IN_CheckCoords(&btn->x1, &btn->y1, &btn->x2, &btn->y2); - if( Q_strcmp(name, "_look") == 0 ) + if( Q_strcmp(command, "_look") == 0 ) type = touch_look; - else if( Q_strcmp(name, "_move") == 0 ) + else if( Q_strcmp(command, "_move") == 0 ) type = touch_move; btn->color = color; @@ -390,12 +464,16 @@ void CTouchControls::AddButton( const char *name, const char *texturefile, const void CTouchControls::ShowButton( const char *name ) { - + CTouchButton *btn = FindButton( name ); + if( btn ) + btn->flags &= ~TOUCH_FL_HIDE; } void CTouchControls::HideButton(const char *name) { - + CTouchButton *btn = FindButton( name ); + if( btn ) + btn->flags |= TOUCH_FL_HIDE; } void CTouchControls::SetTexture(const char *name, const char *file) @@ -448,6 +526,7 @@ CTouchButton *CTouchControls::FindButton( const char *name ) if( Q_strncmp( button->name, name, sizeof(button->name)) == 0 ) return button; } + return NULL; } void CTouchControls::ProcessEvent(touch_event_t *ev) @@ -455,13 +534,96 @@ void CTouchControls::ProcessEvent(touch_event_t *ev) if( !touch_enable.GetBool() ) return; + if( state == state_edit ) + { + EditEvent(ev); + return; + } + if( ev->type == IE_FingerMotion ) FingerMotion( ev ); else FingerPress( ev ); } -void CTouchControls::FingerMotion(touch_event_t *ev) +void CTouchControls::EditEvent(touch_event_t *ev) +{ + float x = ev->x / (float)screen_w; + float y = ev->y / (float)screen_h; + + //CUtlLinkedList::iterator it; + + if( ev->type == IE_FingerDown ) + { + //for( it = btns.end(); it != btns.begin(); it-- ) unexpected, doesn't work + for( int i = btns.Count()-1; i >= 0; i-- ) + { + CTouchButton *btn = btns[i]; + if( x > btn->x1 && x < btn->x2 && y > btn->y1 && y < btn->y2 ) + { + if( btn->flags & TOUCH_FL_HIDE ) + continue; + + if( btn->flags & TOUCH_FL_NOEDIT ) + { + engine->ClientCmd_Unrestricted( btn->command ); + continue; + } + + if( move_finger == -1 ) + { + move_finger = ev->fingerid; + selection = btn; + dx = x; dy = y; + break; + } + else if( resize_finger == -1 ) + { + resize_finger = ev->fingerid; + dx2 = x; dy2 = y; + } + } + } + } + else if( ev->type == IE_FingerUp ) + { + if( ev->fingerid == move_finger ) + { + move_finger = -1; + IN_CheckCoords( &selection->x1, &selection->y1, &selection->x2, &selection->y2 ); + selection = nullptr; + dx = dy = 0.f; + } + else if( ev->fingerid == resize_finger ) + resize_finger = -1; + } + else // IE_FingerMotion + { + if( !selection ) + return; + + if( move_finger == ev->fingerid ) + { + selection->x1 += x-dx; + selection->x2 += x-dx; + selection->y1 += y-dy; + selection->y2 += y-dy; + + dx = x; + dy = y; + } + else if( resize_finger == ev->fingerid ) + { + selection->x2 += x-dx2; + selection->y2 += y-dy2; + + dx2 = x; dy2 = y; + } + } +} + + +void CTouchControls::FingerMotion(touch_event_t *ev) // finger in my ass { float x = ev->x / (float)screen_w; float y = ev->y / (float)screen_h; @@ -506,6 +668,9 @@ void CTouchControls::FingerPress(touch_event_t *ev) CTouchButton *btn = *it; if( x > btn->x1 && x < btn->x2 && y > btn->y1 && y < btn->y2 ) { + if( btn->flags & TOUCH_FL_HIDE ) + continue; + btn->finger = ev->fingerid; if( btn->type == touch_move ) { @@ -539,6 +704,10 @@ void CTouchControls::FingerPress(touch_event_t *ev) for( it = btns.begin(); it != btns.end(); it++ ) { CTouchButton *btn = *it; + + if( btn->flags & TOUCH_FL_HIDE ) + continue; + if( btn->finger == ev->fingerid ) { btn->finger = -1; @@ -563,10 +732,117 @@ void CTouchControls::FingerPress(touch_event_t *ev) } } -void CTouchControls::EnableTouchEdit() +void CTouchControls::EnableTouchEdit(bool enable) { - state = state_edit; - resize_finger = move_finger = look_finger = wheel_finger = -1; - move_button = NULL; - configchanged = true; + if( enable ) + { + state = state_edit; + resize_finger = move_finger = look_finger = wheel_finger = -1; + move_button = NULL; + configchanged = true; + AddButton( "close_edit", "vgui/touch/exit", "touch_disableedit", 0.010000, 0.837778, 0.080000, 0.980000, rgba_t(255,255,255,255), 0, 1.f, TOUCH_FL_NOEDIT ); + } + else + { + state = state_none; + resize_finger = move_finger = look_finger = wheel_finger = -1; + move_button = NULL; + configchanged = false; + RemoveButton("close_edit"); + WriteConfig(); + } +} + +void CTouchControls::WriteConfig() +{ + FileHandle_t f; + char newconfigfile[128]; + char oldconfigfile[128]; + char configfile[128]; + + if( btns.IsEmpty() ) + return; + + if( CommandLine()->FindParm("-nowriteconfig") ) + return; + + DevMsg( "Touch_WriteConfig(): %s\n", touch_config_file.GetString() ); + + Q_snprintf( newconfigfile, 64, "cfg/%s.new", touch_config_file.GetString() ); + Q_snprintf( oldconfigfile, 64, "cfg/%s.bak", touch_config_file.GetString() ); + Q_snprintf( configfile, 64, "cfg/%s", touch_config_file.GetString() ); + + f = filesystem->Open( newconfigfile , "w+"); + + if( f ) + { + CTouchButton *button; + filesystem->FPrintf( f, "//=======================================================================\n"); + filesystem->FPrintf( f, "//\t\t\ttouchscreen config\n" ); + filesystem->FPrintf( f, "//=======================================================================\n" ); + filesystem->FPrintf( f, "\ntouch_config_file \"%s\"\n", touch_config_file.GetString() ); + filesystem->FPrintf( f, "\n// touch cvars\n" ); + filesystem->FPrintf( f, "\n// sensitivity settings\n" ); + filesystem->FPrintf( f, "touch_pitch \"%f\"\n", touch_pitch.GetFloat() ); + filesystem->FPrintf( f, "touch_yaw \"%f\"\n", touch_yaw.GetFloat() ); + filesystem->FPrintf( f, "touch_forwardzone \"%f\"\n", touch_forwardzone.GetFloat() ); + filesystem->FPrintf( f, "touch_sidezone \"%f\"\n", touch_sidezone.GetFloat() ); +/* filesystem->FPrintf( f, "touch_nonlinear_look \"%d\"\n",touch_nonlinear_look.GetBool() ); + filesystem->FPrintf( f, "touch_pow_factor \"%f\"\n", touch_pow_factor->value ); + filesystem->FPrintf( f, "touch_pow_mult \"%f\"\n", touch_pow_mult->value ); + filesystem->FPrintf( f, "touch_exp_mult \"%f\"\n", touch_exp_mult->value );*/ + filesystem->FPrintf( f, "\n// grid settings\n" ); + filesystem->FPrintf( f, "touch_grid_count \"%d\"\n", touch_grid_count.GetInt() ); + filesystem->FPrintf( f, "touch_grid_enable \"%d\"\n", touch_grid_enable.GetInt() ); +/* + filesystem->FPrintf( f, "\n// global overstroke (width, r, g, b, a)\n" ); + filesystem->FPrintf( f, "touch_set_stroke %d %d %d %d %d\n", touch.swidth, touch.scolor[0], touch.scolor[1], touch.scolor[2], touch.scolor[3] ); + filesystem->FPrintf( f, "\n// highlight when pressed\n" ); + filesystem->FPrintf( f, "touch_highlight_r \"%f\"\n", touch_highlight_r->value ); + filesystem->FPrintf( f, "touch_highlight_g \"%f\"\n", touch_highlight_g->value ); + filesystem->FPrintf( f, "touch_highlight_b \"%f\"\n", touch_highlight_b->value ); + filesystem->FPrintf( f, "touch_highlight_a \"%f\"\n", touch_highlight_a->value ); + filesystem->FPrintf( f, "\n// _joy and _dpad options\n" ); + filesystem->FPrintf( f, "touch_dpad_radius \"%f\"\n", touch_dpad_radius->value ); + filesystem->FPrintf( f, "touch_joy_radius \"%f\"\n", touch_joy_radius->value ); +*/ + filesystem->FPrintf( f, "\n// how much slowdown when Precise Look button pressed\n" ); + filesystem->FPrintf( f, "touch_precise_amount \"%f\"\n", touch_precise_amount.GetFloat() ); +// filesystem->FPrintf( f, "\n// enable/disable move indicator\n" ); +// filesystem->FPrintf( f, "touch_move_indicator \"%f\"\n", touch_move_indicator ); + + filesystem->FPrintf( f, "\n// reset menu state when execing config\n" ); + //filesystem->FPrintf( f, "touch_setclientonly 0\n" ); + filesystem->FPrintf( f, "\n// touch buttons\n" ); + filesystem->FPrintf( f, "touch_removeall\n" ); + + CUtlLinkedList::iterator it; + for( it = btns.begin(); it != btns.end(); it++ ) + { + CTouchButton *b = *it; + + if( b->flags & TOUCH_FL_CLIENT ) + continue; //skip temporary buttons + + if( b->flags & TOUCH_FL_DEF_SHOW ) + b->flags &= ~TOUCH_FL_HIDE; + + if( b->flags & TOUCH_FL_DEF_HIDE ) + b->flags |= TOUCH_FL_HIDE; + + float aspect = ( b->y2 - b->y1 ) / ( ( b->x2 - b->x1 )/(screen_h/screen_w) ); + + filesystem->FPrintf( f, "touch_addbutton \"%s\" \"%s\" \"%s\" %f %f %f %f %d %d %d %d %d %f\n", + b->name, b->texturefile, b->command, + b->x1, b->y1, b->x2, b->y2, + b->color.r, b->color.g, b->color.b, b->color.a, b->flags, aspect ); + } + + filesystem->Close(f); + + filesystem->RemoveFile(oldconfigfile); + filesystem->RenameFile(configfile, oldconfigfile ); + filesystem->RenameFile(newconfigfile, configfile); + } + else DevMsg( "Couldn't write %s.\n", configfile ); } diff --git a/game/client/touch.h b/game/client/touch.h index 1876fa22..d4692a3e 100644 --- a/game/client/touch.h +++ b/game/client/touch.h @@ -1,4 +1,5 @@ #include "utllinkedlist.h" +#include "vgui/ISurface.h" #include "vgui/VGUI.h" #include #include "cbase.h" @@ -11,7 +12,7 @@ extern "C" int getAssets(); #define GRID_COUNT touch_grid_count.GetInt() #define GRID_COUNT_X (GRID_COUNT) #define GRID_COUNT_Y (GRID_COUNT * screen_h / screen_w) -#define GRID_X (1.0/GRID_COUNT_X) +#define GRID_X (1.0f/GRID_COUNT_X) #define GRID_Y (screen_w/screen_h/GRID_COUNT_X) #define GRID_ROUND_X(x) ((float)round( x * GRID_COUNT_X ) / GRID_COUNT_X) #define GRID_ROUND_Y(x) ((float)round( x * GRID_COUNT_Y ) / GRID_COUNT_Y) @@ -157,12 +158,13 @@ public: void Paint( ); void Frame( ); - void AddButton( const char *name, const char *texturefile, const char *command, float x1, float y1, float x2, float y2, rgba_t color = rgba_t(255, 255, 255, 255), int round = 2, float aspect = 1, int flags = 0 ); + void AddButton( const char *name, const char *texturefile, const char *command, float x1, float y1, float x2, float y2, rgba_t color = rgba_t(255, 255, 255, 255), int round = 2, float aspect = 1.f, int flags = 0 ); void RemoveButton( const char *name ); void HideButton( const char *name ); void ShowButton( const char *name ); - + void ListButtons(); + void RemoveButtons(); CTouchButton *FindButton( const char *name ); // bool FindNextButton( const char *name, CTouchButton &button ); @@ -170,9 +172,10 @@ public: void SetColor( const char *name, rgba_t color ); void SetCommand( const char *name, const char *cmd ); void SetFlags( const char *name, int flags ); - + void WriteConfig(); void IN_CheckCoords( float *x1, float *y1, float *x2, float *y2 ); + void InitGrid(); void Move( float frametime, CUserCmd *cmd ); @@ -182,11 +185,13 @@ public: void FingerPress( touch_event_t *ev ); void FingerMotion( touch_event_t *ev ); - void EnableTouchEdit(); + void EditEvent( touch_event_t *ev ); + + void EnableTouchEdit(bool enable); CTouchPanel *touchPanel; private: - bool initialized; + bool initialized = false; ETouchState state; CUtlLinkedList btns; @@ -196,7 +201,7 @@ private: CTouchButton *move_button; float move_start_x, move_start_y; - float dx, dy; + float dx, dy, dx2, dy2; // editing CTouchButton *edit; @@ -214,13 +219,14 @@ private: int closetexture; int joytexture; // touch indicator bool configchanged; + bool config_loaded; vgui::HFont textfont; int mouse_events; int base_textureID; bool m_bHaveAssets; - int screen_h, screen_w; + float screen_h, screen_w; }; extern CTouchControls gTouch; diff --git a/game/client/wscript b/game/client/wscript index 3d8e1fe0..9b9a50e4 100755 --- a/game/client/wscript +++ b/game/client/wscript @@ -64,7 +64,7 @@ def build(bld): install_path = bld.env.PREFIX if bld.env.DEST_OS != 'android': - install_path += '/hl2/bin' + install_path += '/'+bld.env.GAMES+'/bin' source = [ 'touch.cpp', 'arch.c' ] diff --git a/game/server/wscript b/game/server/wscript index 92c37a03..a474c2f8 100755 --- a/game/server/wscript +++ b/game/server/wscript @@ -57,7 +57,7 @@ def build(bld): install_path = bld.env.PREFIX if bld.env.DEST_OS != 'android': - install_path += '/hl2/bin' + install_path += '/'+bld.env.GAMES+'/bin' source = game["sources"] includes += game["includes"] From 1f3436945f401d2eec9150c741a151b331aee83f Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 9 Jan 2022 19:59:13 +0300 Subject: [PATCH 11/18] saveload fix --- engine/host_saverestore.cpp | 18 +++++++++++------- game/shared/saverestore.cpp | 14 ++++++++++---- public/datamap.h | 8 ++++---- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/engine/host_saverestore.cpp b/engine/host_saverestore.cpp index 74b66192..3ae1feaa 100644 --- a/engine/host_saverestore.cpp +++ b/engine/host_saverestore.cpp @@ -2128,8 +2128,8 @@ int CSaveRestore::SaveReadNameAndComment( FileHandle_t f, OUT_Z_CAP(nameSize) ch int nNumberOfFields; char *pData; - int nFieldSize; - + short nFieldSize; + pData = pSaveData; // Allocate a table for the strings, and parse the table @@ -2148,9 +2148,12 @@ int CSaveRestore::SaveReadNameAndComment( FileHandle_t f, OUT_Z_CAP(nameSize) ch pTokenList = NULL; // short, short (size, index of field name) - nFieldSize = *(short *)pData; + + Q_memcpy( &nFieldSize, pData, sizeof(short) ); pData += sizeof(short); - pFieldName = pTokenList[ *(short *)pData ]; + short index = 0; + Q_memcpy( &index, pData, sizeof(short) ); + pFieldName = pTokenList[index]; if ( !pFieldName || Q_stricmp( pFieldName, "GameHeader" ) ) { @@ -2161,7 +2164,7 @@ int CSaveRestore::SaveReadNameAndComment( FileHandle_t f, OUT_Z_CAP(nameSize) ch // int (fieldcount) pData += sizeof(short); - nNumberOfFields = *(int*)pData; + Q_memcpy( &nNumberOfFields, pData, sizeof(int) ); pData += nFieldSize; // Each field is a short (size), short (index of name), binary string of "size" bytes (data) @@ -2172,10 +2175,11 @@ int CSaveRestore::SaveReadNameAndComment( FileHandle_t f, OUT_Z_CAP(nameSize) ch // szName // Actual Data - nFieldSize = *(short *)pData; + Q_memcpy( &nFieldSize, pData, sizeof(short) ); pData += sizeof(short); - pFieldName = pTokenList[ *(short *)pData ]; + Q_memcpy( &index, pData, sizeof(short) ); + pFieldName = pTokenList[index]; pData += sizeof(short); if ( !Q_stricmp( pFieldName, "comment" ) ) diff --git a/game/shared/saverestore.cpp b/game/shared/saverestore.cpp index cc8abfcf..36025baf 100644 --- a/game/shared/saverestore.cpp +++ b/game/shared/saverestore.cpp @@ -152,7 +152,7 @@ const char *UTIL_FunctionToName( datamap_t *pMap, inputfunc_t *function ) // This is used to save/restore function pointers (convert text back to pointer) // Input : *pName - name of the member function //----------------------------------------------------------------------------- -inputfunc_t *UTIL_FunctionFromName( datamap_t *pMap, const char *pName ) +inputfunc_t UTIL_FunctionFromName( datamap_t *pMap, const char *pName ) { while ( pMap ) { @@ -170,7 +170,7 @@ inputfunc_t *UTIL_FunctionFromName( datamap_t *pMap, const char *pName ) { if ( FStrEq( pName, pMap->dataDesc[i].fieldName ) ) { - return EXTRACT_INPUTFUNC_FUNCTIONPTR(pMap->dataDesc[i].inputFunc); + return pMap->dataDesc[i].inputFunc; } } } @@ -2240,8 +2240,14 @@ int CRestore::ReadFunction( datamap_t *pMap, inputfunc_t **pValue, int count, in if ( *pszFunctionName == 0 ) *pValue = NULL; else - *pValue = UTIL_FunctionFromName( pMap, pszFunctionName ); - + { + inputfunc_t func = UTIL_FunctionFromName( pMap, pszFunctionName ); +#ifdef GNUC + Q_memcpy( (void*)pValue, &func, sizeof(void*)*2 ); +#else + Q_memcpy( (void*)pValue, &func, sizeof(void*) ); +#endif + } return 0; } diff --git a/public/datamap.h b/public/datamap.h index 936f4436..c9d340b4 100644 --- a/public/datamap.h +++ b/public/datamap.h @@ -113,9 +113,9 @@ DECLARE_FIELD_SIZE( FIELD_SOUNDNAME, sizeof(int)) DECLARE_FIELD_SIZE( FIELD_INPUT, sizeof(int)) #ifdef POSIX // pointer to members under gnuc are 8bytes if you have a virtual func -DECLARE_FIELD_SIZE( FIELD_FUNCTION, sizeof(uint64)) +DECLARE_FIELD_SIZE( FIELD_FUNCTION, 2 * sizeof(void *)) #else -DECLARE_FIELD_SIZE( FIELD_FUNCTION, sizeof(int *)) +DECLARE_FIELD_SIZE( FIELD_FUNCTION, sizeof(void *)) #endif DECLARE_FIELD_SIZE( FIELD_VMATRIX, 16 * sizeof(float)) DECLARE_FIELD_SIZE( FIELD_VMATRIX_WORLDSPACE, 16 * sizeof(float)) @@ -202,7 +202,7 @@ extern ISaveRestoreOps *eventFuncs; #define DEFINE_OUTPUT( name, outputname ) { FIELD_CUSTOM, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_OUTPUT | FTYPEDESC_SAVE | FTYPEDESC_KEY, outputname, eventFuncs } // replaces EXPORT table for portability and non-DLL based systems (xbox) -#define DEFINE_FUNCTION_RAW( function, func_type ) { FIELD_VOID, nameHolder.GenerateName(#function), { NULL, NULL }, 1, FTYPEDESC_FUNCTIONTABLE, NULL, NULL, (inputfunc_t)((func_type)(&classNameTypedef::function)) } +#define DEFINE_FUNCTION_RAW( function, func_type ) { FIELD_VOID, nameHolder.GenerateName(#function), { NULL, NULL }, 1, FTYPEDESC_FUNCTIONTABLE, NULL, NULL, (inputfunc_t)(&classNameTypedef::function) } #define DEFINE_FUNCTION( function ) DEFINE_FUNCTION_RAW( function, inputfunc_t ) @@ -278,7 +278,7 @@ struct typedescription_t // Used to track exclusion of baseclass fields int override_count; - + // Tolerance for field errors for float fields float fieldTolerance; }; From 9d77bb17c596220aec9b0744db001f662d0bc0ee Mon Sep 17 00:00:00 2001 From: nillerusr <42746659+nillerusr@users.noreply.github.com> Date: Sun, 9 Jan 2022 17:04:47 +0300 Subject: [PATCH 12/18] Add proportionality support for GameUI panels (#35) * Add proportionality support for GameUI panels * Add Android platform define * Fix button wrong state on fast clicking Co-authored-by: JusicP --- common/GameUI/cvarslider.cpp | 28 +++++----- engine/vgui_baseui_interface.cpp | 5 ++ gameui/BasePanel.cpp | 4 +- gameui/CreateMultiplayerGameDialog.cpp | 11 +++- gameui/GameConsole.cpp | 7 +++ gameui/NewGameDialog.cpp | 20 +++---- gameui/OptionsDialog.cpp | 12 ++++- gameui/OptionsSubAudio.cpp | 74 ++++++++++++++------------ gameui/OptionsSubVideo.cpp | 74 ++++++++++++++------------ gameui/TGAImagePanel.cpp | 20 +++++-- gameui/TGAImagePanel.h | 1 + public/tier0/platform.h | 5 ++ vgui2/vgui_controls/BuildGroup.cpp | 2 +- vgui2/vgui_controls/Button.cpp | 18 ++++--- vgui2/vgui_controls/Frame.cpp | 28 +++++----- vgui2/vgui_controls/ImagePanel.cpp | 15 ++++++ vgui2/vgui_controls/MessageBox.cpp | 49 +++++++++++------ vgui2/vgui_controls/PropertyDialog.cpp | 26 ++++++--- vgui2/vgui_controls/QueryBox.cpp | 22 ++++++-- vgui2/vgui_controls/consoledialog.cpp | 25 ++++++--- 20 files changed, 296 insertions(+), 150 deletions(-) diff --git a/common/GameUI/cvarslider.cpp b/common/GameUI/cvarslider.cpp index 72205386..ee48c590 100644 --- a/common/GameUI/cvarslider.cpp +++ b/common/GameUI/cvarslider.cpp @@ -53,20 +53,20 @@ CCvarSlider::CCvarSlider( Panel *parent, const char *panelName, char const *capt void CCvarSlider::SetupSlider( float minValue, float maxValue, const char *cvarname, bool bAllowOutOfRange ) { // make sure min/max don't go outside cvar range if there's one - ConVarRef var( cvarname, true ); - if ( var.IsValid() ) - { - float flCVarMin; - if ( var.GetMin( flCVarMin ) ) - { - minValue = m_bUseConVarMinMax ? flCVarMin : MAX( minValue, flCVarMin ); - } - float flCVarMax; - if ( var.GetMax( flCVarMax ) ) - { - maxValue = m_bUseConVarMinMax ? flCVarMax : MIN( maxValue, flCVarMax ); - } - } + //ConVarRef var( cvarname, true ); + //if ( var.IsValid() ) + //{ + // float flCVarMin; + // if ( var.GetMin( flCVarMin ) ) + // { + // minValue = m_bUseConVarMinMax ? flCVarMin : MAX( minValue, flCVarMin ); + // } + // float flCVarMax; + // if ( var.GetMax( flCVarMax ) ) + // { + // maxValue = m_bUseConVarMinMax ? flCVarMax : MIN( maxValue, flCVarMax ); + // } + //} m_flMinValue = minValue; m_flMaxValue = maxValue; diff --git a/engine/vgui_baseui_interface.cpp b/engine/vgui_baseui_interface.cpp index 368485a4..8d5f6f1d 100644 --- a/engine/vgui_baseui_interface.cpp +++ b/engine/vgui_baseui_interface.cpp @@ -696,6 +696,11 @@ void CEngineVGui::Init() COM_TimestampedLog( "Building Panels (staticGameUIPanel)" ); staticGameUIPanel = new CEnginePanel( staticPanel, "GameUI Panel" ); + if (IsAndroid() || CommandLine()->CheckParm("-gameuiproportionality")) + { + staticGameUIPanel->SetProportional(true); + } + staticGameUIPanel->SetBounds( 0, 0, videomode->GetModeUIWidth(), videomode->GetModeUIHeight() ); staticGameUIPanel->SetPaintBorderEnabled(false); staticGameUIPanel->SetPaintBackgroundEnabled(false); diff --git a/gameui/BasePanel.cpp b/gameui/BasePanel.cpp index eaabd91c..16e75081 100644 --- a/gameui/BasePanel.cpp +++ b/gameui/BasePanel.cpp @@ -1983,12 +1983,14 @@ void CBasePanel::RunMenuCommand(const char *command) { if ( IsPC() ) { +#ifndef NO_STEAM if ( !steamapicontext->SteamUser() || !steamapicontext->SteamUser()->BLoggedOn() ) { - vgui::MessageBox *pMessageBox = new vgui::MessageBox("#GameUI_Achievements_SteamRequired_Title", "#GameUI_Achievements_SteamRequired_Message"); + vgui::MessageBox *pMessageBox = new vgui::MessageBox("#GameUI_Achievements_SteamRequired_Title", "#GameUI_Achievements_SteamRequired_Message", this); pMessageBox->DoModal(); return; } +#endif OnOpenAchievementsDialog(); } else diff --git a/gameui/CreateMultiplayerGameDialog.cpp b/gameui/CreateMultiplayerGameDialog.cpp index a372255e..c8b2b52c 100644 --- a/gameui/CreateMultiplayerGameDialog.cpp +++ b/gameui/CreateMultiplayerGameDialog.cpp @@ -34,7 +34,16 @@ CCreateMultiplayerGameDialog::CCreateMultiplayerGameDialog(vgui::Panel *parent) { m_bBotsEnabled = false; SetDeleteSelfOnClose(true); - SetSize(348, 460); + + int w = 348; + int h = 460; + if (IsProportional()) + { + w = scheme()->GetProportionalScaledValueEx(GetScheme(), w); + h = scheme()->GetProportionalScaledValueEx(GetScheme(), h); + } + + SetSize(w, h); SetTitle("#GameUI_CreateServer", true); SetOKButtonText("#GameUI_Start"); diff --git a/gameui/GameConsole.cpp b/gameui/GameConsole.cpp index 5f1cb0c6..8bd55b72 100644 --- a/gameui/GameConsole.cpp +++ b/gameui/GameConsole.cpp @@ -148,6 +148,13 @@ void CGameConsole::SetParent( int parent ) return; m_pConsole->SetParent( static_cast( parent )); + + // apply proportionality from parent + if (vgui::ipanel()->IsProportional(static_cast(parent))) + { + m_pConsole->SetProportional(true); + m_pConsole->InvalidateLayout(true, true); + } #endif } diff --git a/gameui/NewGameDialog.cpp b/gameui/NewGameDialog.cpp index 2d768618..e349f65d 100644 --- a/gameui/NewGameDialog.cpp +++ b/gameui/NewGameDialog.cpp @@ -161,16 +161,6 @@ public: SetPaintBackgroundEnabled( false ); - // the image has the same name as the config file - char szMaterial[ MAX_PATH ]; - Q_snprintf( szMaterial, sizeof(szMaterial), "chapters/%s", chapterConfigFile ); - char *ext = strstr( szMaterial, "." ); - if ( ext ) - { - *ext = 0; - } - m_pLevelPic->SetImage( szMaterial ); - KeyValues *pKeys = NULL; if ( GameUI().IsConsoleUI() ) { @@ -178,6 +168,16 @@ public: } LoadControlSettings( "Resource/NewGameChapterPanel.res", NULL, pKeys ); + // the image has the same name as the config file + char szMaterial[MAX_PATH]; + Q_snprintf(szMaterial, sizeof(szMaterial), "chapters/%s", chapterConfigFile); + char* ext = strstr(szMaterial, "."); + if (ext) + { + *ext = 0; + } + m_pLevelPic->SetImage(szMaterial); + int px, py; m_pLevelPicBorder->GetPos( px, py ); SetSize( m_pLevelPicBorder->GetWide(), py + m_pLevelPicBorder->GetTall() ); diff --git a/gameui/OptionsDialog.cpp b/gameui/OptionsDialog.cpp index b1dedfe8..c166a15b 100644 --- a/gameui/OptionsDialog.cpp +++ b/gameui/OptionsDialog.cpp @@ -45,7 +45,17 @@ using namespace vgui; COptionsDialog::COptionsDialog(vgui::Panel *parent) : PropertyDialog(parent, "OptionsDialog") { SetDeleteSelfOnClose(true); - SetBounds(0, 0, 512, 406); + + int w = 512; + int h = 406; + if (IsProportional()) + { + w = scheme()->GetProportionalScaledValueEx(GetScheme(), w); + h = scheme()->GetProportionalScaledValueEx(GetScheme(), h); + } + + SetBounds(0, 0, w, h); + SetSizeable( false ); SetTitle("#GameUI_Options", true); diff --git a/gameui/OptionsSubAudio.cpp b/gameui/OptionsSubAudio.cpp index 9a4d6aec..d1fffeba 100644 --- a/gameui/OptionsSubAudio.cpp +++ b/gameui/OptionsSubAudio.cpp @@ -383,39 +383,47 @@ void COptionsSubAudio::RunTestSpeakers() //----------------------------------------------------------------------------- class COptionsSubAudioThirdPartyCreditsDlg : public vgui::Frame { - DECLARE_CLASS_SIMPLE( COptionsSubAudioThirdPartyCreditsDlg, vgui::Frame ); + DECLARE_CLASS_SIMPLE(COptionsSubAudioThirdPartyCreditsDlg, vgui::Frame); public: - COptionsSubAudioThirdPartyCreditsDlg( vgui::VPANEL hParent ) : BaseClass( NULL, NULL ) - { - // parent is ignored, since we want look like we're steal focus from the parent (we'll become modal below) + COptionsSubAudioThirdPartyCreditsDlg(vgui::VPANEL hParent) : BaseClass(NULL, NULL) + { + // parent is ignored, since we want look like we're steal focus from the parent (we'll become modal below) + int w = 500; + int h = 200; + if (ipanel()->IsProportional(hParent)) + { + SetProportional(true); + w = scheme()->GetProportionalScaledValueEx(GetScheme(), w); + h = scheme()->GetProportionalScaledValueEx(GetScheme(), h); + } - SetTitle("#GameUI_ThirdPartyAudio_Title", true); - SetSize( 500, 200 ); - LoadControlSettings( "resource/OptionsSubAudioThirdPartyDlg.res" ); - MoveToCenterOfScreen(); - SetSizeable( false ); - SetDeleteSelfOnClose( true ); - } + SetTitle("#GameUI_ThirdPartyAudio_Title", true); + SetSize(w, h); + LoadControlSettings("resource/OptionsSubAudioThirdPartyDlg.res"); + MoveToCenterOfScreen(); + SetSizeable(false); + SetDeleteSelfOnClose(true); + } - virtual void Activate() - { - BaseClass::Activate(); + virtual void Activate() + { + BaseClass::Activate(); - input()->SetAppModalSurface(GetVPanel()); - } + input()->SetAppModalSurface(GetVPanel()); + } - void OnKeyCodeTyped(KeyCode code) - { - // force ourselves to be closed if the escape key it pressed - if (code == KEY_ESCAPE) - { - Close(); - } - else - { - BaseClass::OnKeyCodeTyped(code); - } - } + void OnKeyCodeTyped(KeyCode code) + { + // force ourselves to be closed if the escape key it pressed + if (code == KEY_ESCAPE) + { + Close(); + } + else + { + BaseClass::OnKeyCodeTyped(code); + } + } }; @@ -424,9 +432,9 @@ public: //----------------------------------------------------------------------------- void COptionsSubAudio::OpenThirdPartySoundCreditsDialog() { - if (!m_OptionsSubAudioThirdPartyCreditsDlg.Get()) - { - m_OptionsSubAudioThirdPartyCreditsDlg = new COptionsSubAudioThirdPartyCreditsDlg(GetVParent()); - } - m_OptionsSubAudioThirdPartyCreditsDlg->Activate(); + if (!m_OptionsSubAudioThirdPartyCreditsDlg.Get()) + { + m_OptionsSubAudioThirdPartyCreditsDlg = new COptionsSubAudioThirdPartyCreditsDlg(GetVParent()); + } + m_OptionsSubAudioThirdPartyCreditsDlg->Activate(); } diff --git a/gameui/OptionsSubVideo.cpp b/gameui/OptionsSubVideo.cpp index 57db4015..45cf34e1 100644 --- a/gameui/OptionsSubVideo.cpp +++ b/gameui/OptionsSubVideo.cpp @@ -1714,39 +1714,47 @@ void COptionsSubVideo::LaunchBenchmark() //----------------------------------------------------------------------------- class COptionsSubVideoThirdPartyCreditsDlg : public vgui::Frame { - DECLARE_CLASS_SIMPLE( COptionsSubVideoThirdPartyCreditsDlg, vgui::Frame ); + DECLARE_CLASS_SIMPLE(COptionsSubVideoThirdPartyCreditsDlg, vgui::Frame); public: - COptionsSubVideoThirdPartyCreditsDlg( vgui::VPANEL hParent ) : BaseClass( NULL, NULL ) - { - // parent is ignored, since we want look like we're steal focus from the parent (we'll become modal below) + COptionsSubVideoThirdPartyCreditsDlg(vgui::VPANEL hParent) : BaseClass(NULL, NULL) + { + // parent is ignored, since we want look like we're steal focus from the parent (we'll become modal below) + int w = 500; + int h = 200; + if (ipanel()->IsProportional(hParent)) + { + SetProportional(true); + w = scheme()->GetProportionalScaledValueEx(GetScheme(), w); + h = scheme()->GetProportionalScaledValueEx(GetScheme(), h); + } - SetTitle("#GameUI_ThirdPartyVideo_Title", true); - SetSize( 500, 200 ); - LoadControlSettings( "resource/OptionsSubVideoThirdPartyDlg.res" ); - MoveToCenterOfScreen(); - SetSizeable( false ); - SetDeleteSelfOnClose( true ); - } + SetTitle("#GameUI_ThirdPartyVideo_Title", true); + SetSize(w, h); + LoadControlSettings("resource/OptionsSubVideoThirdPartyDlg.res"); + MoveToCenterOfScreen(); + SetSizeable(false); + SetDeleteSelfOnClose(true); + } - virtual void Activate() - { - BaseClass::Activate(); + virtual void Activate() + { + BaseClass::Activate(); - input()->SetAppModalSurface(GetVPanel()); - } + input()->SetAppModalSurface(GetVPanel()); + } - void OnKeyCodeTyped(KeyCode code) - { - // force ourselves to be closed if the escape key it pressed - if (code == KEY_ESCAPE) - { - Close(); - } - else - { - BaseClass::OnKeyCodeTyped(code); - } - } + void OnKeyCodeTyped(KeyCode code) + { + // force ourselves to be closed if the escape key it pressed + if (code == KEY_ESCAPE) + { + Close(); + } + else + { + BaseClass::OnKeyCodeTyped(code); + } + } }; @@ -1755,9 +1763,9 @@ public: //----------------------------------------------------------------------------- void COptionsSubVideo::OpenThirdPartyVideoCreditsDialog() { - if (!m_OptionsSubVideoThirdPartyCreditsDlg.Get()) - { - m_OptionsSubVideoThirdPartyCreditsDlg = new COptionsSubVideoThirdPartyCreditsDlg(GetVParent()); - } - m_OptionsSubVideoThirdPartyCreditsDlg->Activate(); + if (!m_OptionsSubVideoThirdPartyCreditsDlg.Get()) + { + m_OptionsSubVideoThirdPartyCreditsDlg = new COptionsSubVideoThirdPartyCreditsDlg(GetVParent()); + } + m_OptionsSubVideoThirdPartyCreditsDlg->Activate(); } diff --git a/gameui/TGAImagePanel.cpp b/gameui/TGAImagePanel.cpp index 927b401e..94951c1c 100644 --- a/gameui/TGAImagePanel.cpp +++ b/gameui/TGAImagePanel.cpp @@ -19,6 +19,10 @@ CTGAImagePanel::CTGAImagePanel( vgui::Panel *parent, const char *name ) : BaseCl m_bHasValidTexture = false; m_bLoadedTexture = false; m_szTGAName[0] = 0; + m_iImageWidth = 0; + m_iImageHeight = 0; + m_iImageRealWidth = 0; + m_iImageRealHeight = 0; SetPaintBackgroundEnabled( false ); } @@ -63,8 +67,19 @@ void CTGAImagePanel::Paint() // set the textureID surface()->DrawSetTextureRGBA( m_iTextureID, tga.Base(), m_iImageWidth, m_iImageHeight, false, true ); m_bHasValidTexture = true; + + surface()->DrawGetTextureSize(m_iTextureID, m_iImageRealWidth, m_iImageRealHeight); + if (IsProportional()) + { + m_iImageRealWidth = scheme()->GetProportionalScaledValueEx(GetScheme(), m_iImageRealWidth); + m_iImageRealHeight = scheme()->GetProportionalScaledValueEx(GetScheme(), m_iImageRealHeight); + + m_iImageWidth = scheme()->GetProportionalScaledValueEx(GetScheme(), m_iImageWidth); + m_iImageHeight = scheme()->GetProportionalScaledValueEx(GetScheme(), m_iImageHeight); + } + // set our size to be the size of the tga - SetSize( m_iImageWidth, m_iImageHeight ); + SetSize(m_iImageWidth, m_iImageHeight); } else #endif @@ -77,10 +92,9 @@ void CTGAImagePanel::Paint() int wide, tall; if ( m_bHasValidTexture ) { - surface()->DrawGetTextureSize( m_iTextureID, wide, tall ); surface()->DrawSetTexture( m_iTextureID ); surface()->DrawSetColor( 255, 255, 255, 255 ); - surface()->DrawTexturedRect( 0, 0, wide, tall ); + surface()->DrawTexturedRect( 0, 0, m_iImageRealWidth, m_iImageRealHeight ); } else { diff --git a/gameui/TGAImagePanel.h b/gameui/TGAImagePanel.h index 1c8d36ef..c5b7a8ae 100644 --- a/gameui/TGAImagePanel.h +++ b/gameui/TGAImagePanel.h @@ -34,6 +34,7 @@ public: private: int m_iTextureID; int m_iImageWidth, m_iImageHeight; + int m_iImageRealWidth, m_iImageRealHeight; bool m_bHasValidTexture, m_bLoadedTexture; char m_szTGAName[256]; }; diff --git a/public/tier0/platform.h b/public/tier0/platform.h index a7e55f6f..69970444 100644 --- a/public/tier0/platform.h +++ b/public/tier0/platform.h @@ -245,6 +245,11 @@ typedef signed char int8; #define IsPlatform64Bits() false #endif +#ifdef _ANDROID + #define IsAndroid() true +#else + #define IsAndroid() false +#endif // From steam/steamtypes.h // RTime32 // We use this 32 bit time representing real world time. diff --git a/vgui2/vgui_controls/BuildGroup.cpp b/vgui2/vgui_controls/BuildGroup.cpp index 328b1de6..bef4a3c0 100644 --- a/vgui2/vgui_controls/BuildGroup.cpp +++ b/vgui2/vgui_controls/BuildGroup.cpp @@ -5,7 +5,7 @@ // $NoKeywords: $ // //=============================================================================// - //========= Copyright © 1996-2003, Valve LLC, All rights reserved. ============ + //========= Copyright � 1996-2003, Valve LLC, All rights reserved. ============ // // The copyright to the contents herein is the property of Valve, L.L.C. // The contents may be used and/or copied only with the written permission of diff --git a/vgui2/vgui_controls/Button.cpp b/vgui2/vgui_controls/Button.cpp index cb998607..aa46eda8 100644 --- a/vgui2/vgui_controls/Button.cpp +++ b/vgui2/vgui_controls/Button.cpp @@ -71,7 +71,6 @@ void Button::Init() _keyFocusBorder = NULL; m_bSelectionStateSaved = false; m_bStaySelectedOnClick = false; - m_bStaySelectedOnClick = false; m_bStayArmedOnClick = false; m_sArmedSoundName = UTL_INVAL_SYMBOL; m_sDepressedSoundName = UTL_INVAL_SYMBOL; @@ -140,11 +139,12 @@ void Button::SetSelected( bool state ) InvalidateLayout(false); } - if ( !m_bStayArmedOnClick && state && _buttonFlags.IsFlagSet( ARMED ) ) - { - _buttonFlags.SetFlag( ARMED, false ); - InvalidateLayout(false); - } + // Jusic: idk what is it for + //if (!m_bStayArmedOnClick && state && _buttonFlags.IsFlagSet(ARMED)) + //{ + // _buttonFlags.SetFlag( ARMED, false ); + // InvalidateLayout(false); + //} } void Button::SetBlink( bool state ) @@ -877,7 +877,11 @@ void Button::ApplySettings( KeyValues *inResourceData ) SetReleasedSound(sound); } - _activationType = (ActivationType_t)inResourceData->GetInt( "button_activation_type", ACTIVATE_ONRELEASED ); + int iButtonActivationType = inResourceData->GetInt( "button_activation_type", -1 ); + if (iButtonActivationType != -1) + { + _activationType = (ActivationType_t)iButtonActivationType; + } } diff --git a/vgui2/vgui_controls/Frame.cpp b/vgui2/vgui_controls/Frame.cpp index 35b5d761..eec463a2 100644 --- a/vgui2/vgui_controls/Frame.cpp +++ b/vgui2/vgui_controls/Frame.cpp @@ -1224,12 +1224,24 @@ void Frame::PerformLayout() // move everything into place int wide, tall; GetSize(wide, tall); - + + float scale = 1; + if (IsProportional()) + { + int screenW, screenH; + surface()->GetScreenSize(screenW, screenH); + + int proW, proH; + surface()->GetProportionalBase(proW, proH); + + scale = ((float)(screenH) / (float)(proH)); + } + #if !defined( _X360 ) int DRAGGER_SIZE = GetDraggerSize(); int CORNER_SIZE = GetCornerSize(); int CORNER_SIZE2 = CORNER_SIZE * 2; - int BOTTOMRIGHTSIZE = GetBottomRightSize(); + int BOTTOMRIGHTSIZE = GetBottomRightSize() * scale; _topGrip->SetBounds(CORNER_SIZE, 0, wide - CORNER_SIZE2, DRAGGER_SIZE); _leftGrip->SetBounds(0, CORNER_SIZE, DRAGGER_SIZE, tall - CORNER_SIZE2); @@ -1260,18 +1272,6 @@ void Frame::PerformLayout() _minimizeToSysTrayButton->MoveToFront(); _menuButton->SetBounds(5+2, 5+3, GetCaptionHeight()-5, GetCaptionHeight()-5); #endif - - float scale = 1; - if (IsProportional()) - { - int screenW, screenH; - surface()->GetScreenSize( screenW, screenH ); - - int proW,proH; - surface()->GetProportionalBase( proW, proH ); - - scale = ( (float)( screenH ) / (float)( proH ) ); - } #if !defined( _X360 ) int offset_start = (int)( 20 * scale ); diff --git a/vgui2/vgui_controls/ImagePanel.cpp b/vgui2/vgui_controls/ImagePanel.cpp index 97ceb43d..8173aab9 100644 --- a/vgui2/vgui_controls/ImagePanel.cpp +++ b/vgui2/vgui_controls/ImagePanel.cpp @@ -90,6 +90,21 @@ void ImagePanel::SetImage(const char *imageName) m_pszImageName = new char[ len ]; Q_strncpy(m_pszImageName, imageName, len ); InvalidateLayout(false, true); // force applyschemesettings to run + + if (IsProportional() && m_pImage && !m_bScaleImage) + { + float scale = 1; + int screenW, screenH; + surface()->GetScreenSize(screenW, screenH); + + int proW, proH; + surface()->GetProportionalBase(proW, proH); + + scale = ((float)(screenH) / (float)(proH)); + + m_fScaleAmount = scale; + m_bScaleImage = true; + } } //----------------------------------------------------------------------------- diff --git a/vgui2/vgui_controls/MessageBox.cpp b/vgui2/vgui_controls/MessageBox.cpp index e825e6bc..558ed10f 100644 --- a/vgui2/vgui_controls/MessageBox.cpp +++ b/vgui2/vgui_controls/MessageBox.cpp @@ -145,9 +145,15 @@ void MessageBox::ApplySchemeSettings(IScheme *pScheme) int wide, tall; m_pMessageLabel->GetContentSize(wide, tall); m_pMessageLabel->SetSize(wide, tall); + + int indent = 100; + if (IsProportional()) + { + indent = scheme()->GetProportionalScaledValueEx(GetScheme(), 100); + } - wide += 100; - tall += 100; + wide += indent; + tall += indent; SetSize(wide, tall); if ( m_bShowMessageBoxOverCursor ) @@ -243,7 +249,7 @@ void MessageBox::ShowWindow(Frame *pFrameOver) // Purpose: Put the text and OK buttons in correct place //----------------------------------------------------------------------------- void MessageBox::PerformLayout() -{ +{ int x, y, wide, tall; GetClientArea(x, y, wide, tall); wide += x; @@ -255,38 +261,51 @@ void MessageBox::PerformLayout() int oldWide, oldTall; m_pOkButton->GetSize(oldWide, oldTall); + // calc proportionality scale + float scale = 1; + if (IsProportional()) + { + int screenW, screenH; + surface()->GetScreenSize(screenW, screenH); + + int proW, proH; + surface()->GetProportionalBase(proW, proH); + + scale = ((float)(screenH) / (float)(proH)); + } + int btnWide, btnTall; m_pOkButton->GetContentSize(btnWide, btnTall); - btnWide = max(oldWide, btnWide + 10); - btnTall = max(oldTall, btnTall + 10); + btnWide = max(oldWide, btnWide + 10 * scale); + btnTall = max(oldTall, btnTall + 10 * scale); m_pOkButton->SetSize(btnWide, btnTall); - + int btnWide2 = 0, btnTall2 = 0; if ( m_pCancelButton->IsVisible() ) { m_pCancelButton->GetSize(oldWide, oldTall); m_pCancelButton->GetContentSize(btnWide2, btnTall2); - btnWide2 = max(oldWide, btnWide2 + 10); - btnTall2 = max(oldTall, btnTall2 + 10); - m_pCancelButton->SetSize(btnWide2, btnTall2); + btnWide2 = max(oldWide, btnWide2 + 10 * scale); + btnTall2 = max(oldTall, btnTall2 + 10 * scale); + m_pCancelButton->SetSize(btnWide2, boxTall); } - boxWidth = max(boxWidth, m_pMessageLabel->GetWide() + 100); - boxWidth = max(boxWidth, (btnWide + btnWide2) * 2 + 30); + boxWidth = max(boxWidth, m_pMessageLabel->GetWide() + 100 * scale); + boxWidth = max(boxWidth, (btnWide + btnWide2) * 2 + 30 * scale); SetSize(boxWidth, boxTall); GetSize(boxWidth, boxTall); - m_pMessageLabel->SetPos((wide/2)-(m_pMessageLabel->GetWide()/2) + x, y + 5 ); + m_pMessageLabel->SetPos((wide/2)-(m_pMessageLabel->GetWide()/2) + x, y + 5 * scale); if ( !m_pCancelButton->IsVisible() ) { - m_pOkButton->SetPos((wide/2)-(m_pOkButton->GetWide()/2) + x, tall - m_pOkButton->GetTall() - 15); + m_pOkButton->SetPos((wide/2)-(m_pOkButton->GetWide()/2) + x, tall - m_pOkButton->GetTall() - 15 * scale); } else { - m_pOkButton->SetPos((wide/4)-(m_pOkButton->GetWide()/2) + x, tall - m_pOkButton->GetTall() - 15); - m_pCancelButton->SetPos((3*wide/4)-(m_pOkButton->GetWide()/2) + x, tall - m_pOkButton->GetTall() - 15); + m_pOkButton->SetPos((wide/4)-(m_pOkButton->GetWide()/2) + x, tall - m_pOkButton->GetTall() - 15 * scale); + m_pCancelButton->SetPos((3*wide/4)-(m_pOkButton->GetWide()/2) + x, tall - m_pOkButton->GetTall() - 15 * scale); } BaseClass::PerformLayout(); diff --git a/vgui2/vgui_controls/PropertyDialog.cpp b/vgui2/vgui_controls/PropertyDialog.cpp index 568b23e2..e5c193b2 100644 --- a/vgui2/vgui_controls/PropertyDialog.cpp +++ b/vgui2/vgui_controls/PropertyDialog.cpp @@ -115,24 +115,36 @@ void PropertyDialog::PerformLayout() GetClientArea(x, y, wide, tall); _propertySheet->SetBounds(x, y, wide, tall - iBottom); + // calc button size and indent for proportionality + int iBtnWide = 72; + int iBtnTall = 24; + int iWideIndent = 8; + int iTallIndent = 4; + if (IsProportional()) + { + iBtnWide = scheme()->GetProportionalScaledValueEx(GetScheme(), iBtnWide); + iBtnTall = scheme()->GetProportionalScaledValueEx(GetScheme(), iBtnTall); + iWideIndent = scheme()->GetProportionalScaledValueEx(GetScheme(), iWideIndent); + iTallIndent = scheme()->GetProportionalScaledValueEx(GetScheme(), iTallIndent); + } // move the buttons to the bottom-right corner - int xpos = x + wide - 80; - int ypos = tall + y - 28; + int xpos = x + wide - iBtnWide - iWideIndent; + int ypos = tall + y - iBtnTall - iTallIndent; if (_applyButton->IsVisible()) { - _applyButton->SetBounds(xpos, ypos, 72, 24); - xpos -= 80; + _applyButton->SetBounds(xpos, ypos, iBtnWide, iBtnTall); + xpos -= iBtnWide + iWideIndent; } if (_cancelButton->IsVisible()) { - _cancelButton->SetBounds(xpos, ypos, 72, 24); - xpos -= 80; + _cancelButton->SetBounds(xpos, ypos, iBtnWide, iBtnTall); + xpos -= iBtnWide + iWideIndent; } - _okButton->SetBounds(xpos, ypos, 72, 24); + _okButton->SetBounds(xpos, ypos, iBtnWide, iBtnTall); _propertySheet->InvalidateLayout(); // tell the propertysheet to redraw! Repaint(); diff --git a/vgui2/vgui_controls/QueryBox.cpp b/vgui2/vgui_controls/QueryBox.cpp index 44226993..2cf355c4 100644 --- a/vgui2/vgui_controls/QueryBox.cpp +++ b/vgui2/vgui_controls/QueryBox.cpp @@ -9,6 +9,7 @@ //=============================================================================// #include +#include #include #include @@ -89,10 +90,23 @@ void QueryBox::PerformLayout() int oldWide, oldTall; m_pCancelButton->GetSize(oldWide, oldTall); + // calc proportionality scale + float scale = 1; + if (IsProportional()) + { + int screenW, screenH; + surface()->GetScreenSize(screenW, screenH); + + int proW, proH; + surface()->GetProportionalBase(proW, proH); + + scale = ((float)(screenH) / (float)(proH)); + } + int btnWide, btnTall; m_pCancelButton->GetContentSize(btnWide, btnTall); - btnWide = max(oldWide, btnWide + 10); - btnTall = max(oldTall, btnTall + 10); + btnWide = max(oldWide, btnWide + 10 * scale); + btnTall = max(oldTall, btnTall + 10 * scale); m_pCancelButton->SetSize(btnWide, btnTall); //nt boxWidth, boxTall; @@ -100,8 +114,8 @@ void QueryBox::PerformLayout() // wide = max(wide, btnWide * 2 + 100); // SetSize(wide, tall); - m_pOkButton->SetPos((wide/2)-(m_pOkButton->GetWide())-1 + x, tall - m_pOkButton->GetTall() - 15); - m_pCancelButton->SetPos((wide/2) + x+16, tall - m_pCancelButton->GetTall() - 15); + m_pOkButton->SetPos((wide/2)-(m_pOkButton->GetWide())-1 + x, tall - m_pOkButton->GetTall() - 15 * scale); + m_pCancelButton->SetPos((wide/2) + x+16*scale, tall - m_pCancelButton->GetTall() - 15 * scale); } diff --git a/vgui2/vgui_controls/consoledialog.cpp b/vgui2/vgui_controls/consoledialog.cpp index 908f6aa2..61a257ac 100644 --- a/vgui2/vgui_controls/consoledialog.cpp +++ b/vgui2/vgui_controls/consoledialog.cpp @@ -844,12 +844,24 @@ void CConsolePanel::PerformLayout() if ( !m_bStatusVersion ) { - const int inset = 8; - const int entryHeight = 24; - const int topHeight = 4; - const int entryInset = 4; - const int submitWide = 64; - const int submitInset = 7; // x inset to pull the submit button away from the frame grab + float scale = 1; + if (IsProportional()) + { + int screenW, screenH; + surface()->GetScreenSize(screenW, screenH); + + int proW, proH; + surface()->GetProportionalBase(proW, proH); + + scale = ((float)(screenH) / (float)(proH)); + } + + const int inset = 8 * scale; + const int entryHeight = 24 * scale; + const int topHeight = 4 * scale; + const int entryInset = 4 * scale; + const int submitWide = 64 * scale; + const int submitInset = 7 * scale; // x inset to pull the submit button away from the frame grab m_pHistory->SetPos(inset, inset + topHeight); m_pHistory->SetSize(wide - (inset * 2), tall - (entryInset * 2 + inset * 2 + topHeight + entryHeight)); @@ -931,6 +943,7 @@ void CConsolePanel::ApplySchemeSettings(IScheme *pScheme) m_DPrintColor = GetSchemeColor("Console.DevTextColor", pScheme); m_pHistory->SetFont( pScheme->GetFont( "ConsoleText", IsProportional() ) ); m_pCompletionList->SetFont( pScheme->GetFont( "DefaultSmall", IsProportional() ) ); + m_pEntry->SetFont( pScheme->GetFont( "DefaultSmall", IsProportional() ) ); InvalidateLayout(); } From 4a329b2e1da324cab2e3e68bd86499031a46779b Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 9 Jan 2022 22:28:24 +0300 Subject: [PATCH 13/18] fix compilation with msvc --- public/datamap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/datamap.h b/public/datamap.h index c9d340b4..243db5ed 100644 --- a/public/datamap.h +++ b/public/datamap.h @@ -202,7 +202,7 @@ extern ISaveRestoreOps *eventFuncs; #define DEFINE_OUTPUT( name, outputname ) { FIELD_CUSTOM, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_OUTPUT | FTYPEDESC_SAVE | FTYPEDESC_KEY, outputname, eventFuncs } // replaces EXPORT table for portability and non-DLL based systems (xbox) -#define DEFINE_FUNCTION_RAW( function, func_type ) { FIELD_VOID, nameHolder.GenerateName(#function), { NULL, NULL }, 1, FTYPEDESC_FUNCTIONTABLE, NULL, NULL, (inputfunc_t)(&classNameTypedef::function) } +#define DEFINE_FUNCTION_RAW( function, func_type ) { FIELD_VOID, nameHolder.GenerateName(#function), { NULL, NULL }, 1, FTYPEDESC_FUNCTIONTABLE, NULL, NULL, (inputfunc_t)((func_type)(&classNameTypedef::function)) } #define DEFINE_FUNCTION( function ) DEFINE_FUNCTION_RAW( function, inputfunc_t ) From 61bd00c12b27dda35b1c0b1440e43440d8552944 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Sun, 9 Jan 2022 22:33:59 +0300 Subject: [PATCH 14/18] Oops, typo fix --- vgui2/src/Surface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vgui2/src/Surface.cpp b/vgui2/src/Surface.cpp index 2f623208..51ad5186 100644 --- a/vgui2/src/Surface.cpp +++ b/vgui2/src/Surface.cpp @@ -388,7 +388,7 @@ private: CUtlDict< IImage *, unsigned short > m_FileTypeImages; - enum { BASE_HEIGHT = 480, BASE_WIDTH = 640 }; + enum { BASE_HEIGHT = 600, BASE_WIDTH = 800 }; bool LoadTGA(Texture *texture, const char *filename); bool LoadBMP(Texture *texture, const char *filename); From 463e4eb5845d9707d3df5dad70cec1d2339aad9f Mon Sep 17 00:00:00 2001 From: JusicP Date: Sun, 9 Jan 2022 20:17:11 +0200 Subject: [PATCH 15/18] Fix ypos scale for chapters panel --- gameui/NewGameDialog.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gameui/NewGameDialog.cpp b/gameui/NewGameDialog.cpp index e349f65d..1c341752 100644 --- a/gameui/NewGameDialog.cpp +++ b/gameui/NewGameDialog.cpp @@ -615,6 +615,11 @@ void CNewGameDialog::ApplySettings( KeyValues *inResourceData ) BaseClass::ApplySettings( inResourceData ); int ypos = inResourceData->GetInt( "chapterypos", 40 ); + if (IsProportional()) + { + ypos = scheme()->GetProportionalScaledValueEx(GetScheme(), ypos); + } + for ( int i = 0; i < NUM_SLOTS; ++i ) { m_PanelYPos[i] = ypos; From 94fb7d4c00c3fed1eaaaf0b044cc940cb4b7f4eb Mon Sep 17 00:00:00 2001 From: JusicP Date: Sun, 9 Jan 2022 20:21:50 +0200 Subject: [PATCH 16/18] Add xpos scale for chapters panel --- gameui/NewGameDialog.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/gameui/NewGameDialog.cpp b/gameui/NewGameDialog.cpp index 1c341752..36325e3c 100644 --- a/gameui/NewGameDialog.cpp +++ b/gameui/NewGameDialog.cpp @@ -525,11 +525,23 @@ CNewGameDialog::CNewGameDialog(vgui::Panel *parent, bool bCommentaryMode) : Base return; } + int indent = 8; + if ( IsProportional() ) + { + indent = scheme()->GetProportionalScaledValueEx( GetScheme(), indent ); + } + + int wide = 16; + if ( IsProportional() ) + { + wide = scheme()->GetProportionalScaledValueEx( GetScheme(), wide ); + } + // Layout panel positions relative to the dialog center. - int panelWidth = m_ChapterPanels[0]->GetWide() + 16; + int panelWidth = m_ChapterPanels[0]->GetWide() + wide; int dialogWidth = GetWide(); - m_PanelXPos[2] = ( dialogWidth - panelWidth ) / 2 + 8; + m_PanelXPos[2] = ( dialogWidth - panelWidth ) / 2 + indent; if (m_ChapterPanels.Count() > 1) { @@ -553,8 +565,8 @@ CNewGameDialog::CNewGameDialog(vgui::Panel *parent, bool bCommentaryMode) : Base int panelHeight; m_ChapterPanels[0]->GetSize( panelWidth, panelHeight ); - m_pCenterBg->SetWide( panelWidth + 16 ); - m_pCenterBg->SetPos( m_PanelXPos[2] - 8, m_PanelYPos[2] - (m_pCenterBg->GetTall() - panelHeight) + 8 ); + m_pCenterBg->SetWide( panelWidth + wide); + m_pCenterBg->SetPos( m_PanelXPos[2] - indent, m_PanelYPos[2] - (m_pCenterBg->GetTall() - panelHeight) + indent ); m_pCenterBg->SetBgColor( Color( 190, 115, 0, 255 ) ); // start the first item selected @@ -615,9 +627,9 @@ void CNewGameDialog::ApplySettings( KeyValues *inResourceData ) BaseClass::ApplySettings( inResourceData ); int ypos = inResourceData->GetInt( "chapterypos", 40 ); - if (IsProportional()) + if ( IsProportional() ) { - ypos = scheme()->GetProportionalScaledValueEx(GetScheme(), ypos); + ypos = scheme()->GetProportionalScaledValueEx( GetScheme(), ypos ); } for ( int i = 0; i < NUM_SLOTS; ++i ) From 0fb75b41fd45b924aac4f50e0daacce7b4829720 Mon Sep 17 00:00:00 2001 From: nillerusr Date: Wed, 19 Jan 2022 18:59:42 +0300 Subject: [PATCH 17/18] fix build with clang, fix saverestore again, android mod launcher support --- common/iconv.h | 9 +- datamodel/dmattribute.cpp | 50 +- engine/matsys_interface.cpp | 3 + game/client/base_texture.h | 11523 ---------------- game/client/interpolatedvar.h | 2 +- game/client/third/minizip/CMakeLists.txt | 364 - game/client/third/minizip/LICENSE | 17 - game/client/third/minizip/Minizip.podspec | 37 - game/client/third/minizip/README.md | 177 - game/client/third/minizip/lib/aes/aes.h | 270 - game/client/third/minizip/lib/aes/aescrypt.c | 301 - game/client/third/minizip/lib/aes/aeskey.c | 554 - game/client/third/minizip/lib/aes/aesopt.h | 776 -- game/client/third/minizip/lib/aes/aestab.c | 418 - game/client/third/minizip/lib/aes/aestab.h | 173 - .../client/third/minizip/lib/aes/brg_endian.h | 127 - game/client/third/minizip/lib/aes/brg_types.h | 191 - game/client/third/minizip/lib/aes/hmac.c | 209 - game/client/third/minizip/lib/aes/hmac.h | 119 - game/client/third/minizip/lib/aes/pwd2key.c | 182 - game/client/third/minizip/lib/aes/pwd2key.h | 45 - game/client/third/minizip/lib/aes/sha1.c | 283 - game/client/third/minizip/lib/aes/sha1.h | 72 - game/client/third/minizip/lib/bzip2/LICENSE | 42 - .../third/minizip/lib/bzip2/blocksort.c | 1094 -- game/client/third/minizip/lib/bzip2/bzlib.c | 1572 --- game/client/third/minizip/lib/bzip2/bzlib.h | 282 - .../third/minizip/lib/bzip2/bzlib_private.h | 509 - .../client/third/minizip/lib/bzip2/compress.c | 672 - .../client/third/minizip/lib/bzip2/crctable.c | 104 - .../third/minizip/lib/bzip2/decompress.c | 646 - game/client/third/minizip/lib/bzip2/huffman.c | 205 - .../third/minizip/lib/bzip2/randtable.c | 84 - .../third/minizip/lib/liblzma/api/lzma.h | 321 - .../third/minizip/lib/liblzma/api/lzma/base.h | 654 - .../minizip/lib/liblzma/api/lzma/check.h | 150 - .../minizip/lib/liblzma/api/lzma/container.h | 619 - .../minizip/lib/liblzma/api/lzma/filter.h | 425 - .../minizip/lib/liblzma/api/lzma/lzma12.h | 420 - .../minizip/lib/liblzma/api/lzma/version.h | 121 - .../third/minizip/lib/liblzma/api/lzma/vli.h | 166 - .../third/minizip/lib/liblzma/check/check.c | 174 - .../third/minizip/lib/liblzma/check/check.h | 172 - .../minizip/lib/liblzma/check/crc32_fast.c | 82 - .../minizip/lib/liblzma/check/crc32_table.c | 19 - .../lib/liblzma/check/crc32_table_be.h | 525 - .../lib/liblzma/check/crc32_table_le.h | 525 - .../minizip/lib/liblzma/check/crc_macros.h | 30 - .../lib/liblzma/common/alone_decoder.c | 227 - .../lib/liblzma/common/alone_decoder.h | 23 - .../lib/liblzma/common/alone_encoder.c | 160 - .../third/minizip/lib/liblzma/common/common.c | 443 - .../third/minizip/lib/liblzma/common/common.h | 313 - .../lib/liblzma/common/filter_encoder.c | 238 - .../lib/liblzma/common/filter_encoder.h | 27 - .../third/minizip/lib/liblzma/common/index.h | 73 - .../minizip/lib/liblzma/common/memcmplen.h | 175 - .../minizip/lib/liblzma/common/sysdefs.h | 204 - .../lib/liblzma/common/tuklib_common.h | 71 - .../lib/liblzma/common/tuklib_config.h | 7 - .../lib/liblzma/common/tuklib_integer.h | 523 - .../client/third/minizip/lib/liblzma/config.h | 497 - .../third/minizip/lib/liblzma/lz/lz_decoder.c | 306 - .../third/minizip/lib/liblzma/lz/lz_decoder.h | 234 - .../third/minizip/lib/liblzma/lz/lz_encoder.c | 616 - .../third/minizip/lib/liblzma/lz/lz_encoder.h | 327 - .../minizip/lib/liblzma/lz/lz_encoder_hash.h | 108 - .../lib/liblzma/lz/lz_encoder_hash_table.h | 68 - .../minizip/lib/liblzma/lz/lz_encoder_mf.c | 744 - .../third/minizip/lib/liblzma/lzma/fastpos.h | 141 - .../minizip/lib/liblzma/lzma/fastpos_table.c | 519 - .../minizip/lib/liblzma/lzma/lzma2_encoder.h | 43 - .../minizip/lib/liblzma/lzma/lzma_common.h | 224 - .../minizip/lib/liblzma/lzma/lzma_decoder.c | 1058 -- .../minizip/lib/liblzma/lzma/lzma_decoder.h | 53 - .../minizip/lib/liblzma/lzma/lzma_encoder.c | 677 - .../minizip/lib/liblzma/lzma/lzma_encoder.h | 58 - .../liblzma/lzma/lzma_encoder_optimum_fast.c | 170 - .../lzma/lzma_encoder_optimum_normal.c | 855 -- .../lib/liblzma/lzma/lzma_encoder_presets.c | 64 - .../lib/liblzma/lzma/lzma_encoder_private.h | 148 - .../minizip/lib/liblzma/rangecoder/price.h | 92 - .../lib/liblzma/rangecoder/price_table.c | 22 - .../lib/liblzma/rangecoder/range_common.h | 73 - .../lib/liblzma/rangecoder/range_decoder.h | 185 - .../lib/liblzma/rangecoder/range_encoder.h | 231 - game/client/third/minizip/minizip.c | 762 - game/client/third/minizip/minizip.pc.cmakein | 13 - game/client/third/minizip/mz.h | 110 - game/client/third/minizip/mz_compat.c | 681 - game/client/third/minizip/mz_compat.h | 302 - game/client/third/minizip/mz_os.c | 195 - game/client/third/minizip/mz_os.h | 71 - game/client/third/minizip/mz_os_posix.c | 182 - game/client/third/minizip/mz_os_posix.h | 68 - game/client/third/minizip/mz_os_win32.c | 346 - game/client/third/minizip/mz_os_win32.h | 69 - game/client/third/minizip/mz_strm.c | 580 - game/client/third/minizip/mz_strm.h | 146 - game/client/third/minizip/mz_strm_aes.c | 350 - game/client/third/minizip/mz_strm_aes.h | 48 - game/client/third/minizip/mz_strm_buf.c | 397 - game/client/third/minizip/mz_strm_buf.h | 45 - game/client/third/minizip/mz_strm_bzip.c | 384 - game/client/third/minizip/mz_strm_bzip.h | 48 - game/client/third/minizip/mz_strm_lzma.c | 419 - game/client/third/minizip/mz_strm_lzma.h | 48 - game/client/third/minizip/mz_strm_mem.c | 278 - game/client/third/minizip/mz_strm_mem.h | 51 - game/client/third/minizip/mz_strm_pkcrypt.c | 352 - game/client/third/minizip/mz_strm_pkcrypt.h | 56 - game/client/third/minizip/mz_strm_posix.c | 232 - game/client/third/minizip/mz_strm_posix.h | 67 - game/client/third/minizip/mz_strm_split.c | 405 - game/client/third/minizip/mz_strm_split.h | 46 - game/client/third/minizip/mz_strm_win32.c | 292 - game/client/third/minizip/mz_strm_win32.h | 67 - game/client/third/minizip/mz_strm_zlib.c | 395 - game/client/third/minizip/mz_strm_zlib.h | 48 - game/client/third/minizip/mz_zip.c | 1714 --- game/client/third/minizip/mz_zip.h | 164 - game/client/third/minizip/test/empty.zip | Bin 22 -> 0 bytes game/client/third/minizip/test/test.c | 331 - game/client/third/minizip/test/test.h | 23 - game/client/third/minizip/test/test.py | 202 - game/client/touch.cpp | 18 - game/client/touch.h | 4 - game/shared/saverestore.cpp | 8 +- gameui/wscript | 1 + launcher/android.cpp | 3 +- lib/android/armeabi-v7a/libandroid_support.a | Bin 926484 -> 1245960 bytes lib/android/armeabi-v7a/libfreetype2.a | Bin 2170376 -> 4221634 bytes materialsystem/shaderapidx9/shaderapidx8.cpp | 2 +- public/Color.h | 4 +- public/datamap.h | 2 +- public/togl/linuxwin/dxabstract_types.h | 1 + scripts/waifulib/compiler_optimizations.py | 2 +- serverbrowser/CustomGames.cpp | 2 +- tier1/interface.cpp | 13 +- tier1/strtools.cpp | 1 + vgui2/vgui_surfacelib/linuxfont.cpp | 2 - wscript | 3 +- 142 files changed, 59 insertions(+), 45506 deletions(-) delete mode 100644 game/client/base_texture.h delete mode 100755 game/client/third/minizip/CMakeLists.txt delete mode 100755 game/client/third/minizip/LICENSE delete mode 100755 game/client/third/minizip/Minizip.podspec delete mode 100755 game/client/third/minizip/README.md delete mode 100755 game/client/third/minizip/lib/aes/aes.h delete mode 100755 game/client/third/minizip/lib/aes/aescrypt.c delete mode 100755 game/client/third/minizip/lib/aes/aeskey.c delete mode 100755 game/client/third/minizip/lib/aes/aesopt.h delete mode 100755 game/client/third/minizip/lib/aes/aestab.c delete mode 100755 game/client/third/minizip/lib/aes/aestab.h delete mode 100755 game/client/third/minizip/lib/aes/brg_endian.h delete mode 100755 game/client/third/minizip/lib/aes/brg_types.h delete mode 100755 game/client/third/minizip/lib/aes/hmac.c delete mode 100755 game/client/third/minizip/lib/aes/hmac.h delete mode 100755 game/client/third/minizip/lib/aes/pwd2key.c delete mode 100755 game/client/third/minizip/lib/aes/pwd2key.h delete mode 100755 game/client/third/minizip/lib/aes/sha1.c delete mode 100755 game/client/third/minizip/lib/aes/sha1.h delete mode 100755 game/client/third/minizip/lib/bzip2/LICENSE delete mode 100755 game/client/third/minizip/lib/bzip2/blocksort.c delete mode 100755 game/client/third/minizip/lib/bzip2/bzlib.c delete mode 100755 game/client/third/minizip/lib/bzip2/bzlib.h delete mode 100755 game/client/third/minizip/lib/bzip2/bzlib_private.h delete mode 100755 game/client/third/minizip/lib/bzip2/compress.c delete mode 100755 game/client/third/minizip/lib/bzip2/crctable.c delete mode 100755 game/client/third/minizip/lib/bzip2/decompress.c delete mode 100755 game/client/third/minizip/lib/bzip2/huffman.c delete mode 100755 game/client/third/minizip/lib/bzip2/randtable.c delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma.h delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma/base.h delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma/check.h delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma/container.h delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma/filter.h delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma/lzma12.h delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma/version.h delete mode 100755 game/client/third/minizip/lib/liblzma/api/lzma/vli.h delete mode 100755 game/client/third/minizip/lib/liblzma/check/check.c delete mode 100755 game/client/third/minizip/lib/liblzma/check/check.h delete mode 100755 game/client/third/minizip/lib/liblzma/check/crc32_fast.c delete mode 100755 game/client/third/minizip/lib/liblzma/check/crc32_table.c delete mode 100755 game/client/third/minizip/lib/liblzma/check/crc32_table_be.h delete mode 100755 game/client/third/minizip/lib/liblzma/check/crc32_table_le.h delete mode 100755 game/client/third/minizip/lib/liblzma/check/crc_macros.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/alone_decoder.c delete mode 100755 game/client/third/minizip/lib/liblzma/common/alone_decoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/alone_encoder.c delete mode 100755 game/client/third/minizip/lib/liblzma/common/common.c delete mode 100755 game/client/third/minizip/lib/liblzma/common/common.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/filter_encoder.c delete mode 100755 game/client/third/minizip/lib/liblzma/common/filter_encoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/index.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/memcmplen.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/sysdefs.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/tuklib_common.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/tuklib_config.h delete mode 100755 game/client/third/minizip/lib/liblzma/common/tuklib_integer.h delete mode 100755 game/client/third/minizip/lib/liblzma/config.h delete mode 100755 game/client/third/minizip/lib/liblzma/lz/lz_decoder.c delete mode 100755 game/client/third/minizip/lib/liblzma/lz/lz_decoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/lz/lz_encoder.c delete mode 100755 game/client/third/minizip/lib/liblzma/lz/lz_encoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash.h delete mode 100755 game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash_table.h delete mode 100755 game/client/third/minizip/lib/liblzma/lz/lz_encoder_mf.c delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/fastpos.h delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/fastpos_table.c delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma2_encoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_common.h delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.c delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.c delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_fast.c delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_normal.c delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_presets.c delete mode 100755 game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_private.h delete mode 100755 game/client/third/minizip/lib/liblzma/rangecoder/price.h delete mode 100755 game/client/third/minizip/lib/liblzma/rangecoder/price_table.c delete mode 100755 game/client/third/minizip/lib/liblzma/rangecoder/range_common.h delete mode 100755 game/client/third/minizip/lib/liblzma/rangecoder/range_decoder.h delete mode 100755 game/client/third/minizip/lib/liblzma/rangecoder/range_encoder.h delete mode 100755 game/client/third/minizip/minizip.c delete mode 100755 game/client/third/minizip/minizip.pc.cmakein delete mode 100755 game/client/third/minizip/mz.h delete mode 100755 game/client/third/minizip/mz_compat.c delete mode 100755 game/client/third/minizip/mz_compat.h delete mode 100755 game/client/third/minizip/mz_os.c delete mode 100755 game/client/third/minizip/mz_os.h delete mode 100755 game/client/third/minizip/mz_os_posix.c delete mode 100755 game/client/third/minizip/mz_os_posix.h delete mode 100755 game/client/third/minizip/mz_os_win32.c delete mode 100755 game/client/third/minizip/mz_os_win32.h delete mode 100755 game/client/third/minizip/mz_strm.c delete mode 100755 game/client/third/minizip/mz_strm.h delete mode 100755 game/client/third/minizip/mz_strm_aes.c delete mode 100755 game/client/third/minizip/mz_strm_aes.h delete mode 100755 game/client/third/minizip/mz_strm_buf.c delete mode 100755 game/client/third/minizip/mz_strm_buf.h delete mode 100755 game/client/third/minizip/mz_strm_bzip.c delete mode 100755 game/client/third/minizip/mz_strm_bzip.h delete mode 100755 game/client/third/minizip/mz_strm_lzma.c delete mode 100755 game/client/third/minizip/mz_strm_lzma.h delete mode 100755 game/client/third/minizip/mz_strm_mem.c delete mode 100755 game/client/third/minizip/mz_strm_mem.h delete mode 100755 game/client/third/minizip/mz_strm_pkcrypt.c delete mode 100755 game/client/third/minizip/mz_strm_pkcrypt.h delete mode 100755 game/client/third/minizip/mz_strm_posix.c delete mode 100755 game/client/third/minizip/mz_strm_posix.h delete mode 100755 game/client/third/minizip/mz_strm_split.c delete mode 100755 game/client/third/minizip/mz_strm_split.h delete mode 100755 game/client/third/minizip/mz_strm_win32.c delete mode 100755 game/client/third/minizip/mz_strm_win32.h delete mode 100755 game/client/third/minizip/mz_strm_zlib.c delete mode 100755 game/client/third/minizip/mz_strm_zlib.h delete mode 100755 game/client/third/minizip/mz_zip.c delete mode 100755 game/client/third/minizip/mz_zip.h delete mode 100755 game/client/third/minizip/test/empty.zip delete mode 100755 game/client/third/minizip/test/test.c delete mode 100755 game/client/third/minizip/test/test.h delete mode 100755 game/client/third/minizip/test/test.py diff --git a/common/iconv.h b/common/iconv.h index 3ef7ed7d..6cf88588 100644 --- a/common/iconv.h +++ b/common/iconv.h @@ -55,8 +55,7 @@ typedef struct __iconv_t* iconv_t; * Available since API level 28. */ -#if __ANDROID_API__ >= 28 -iconv_t iconv_open(const char* __src_encoding, const char* __dst_encoding) __INTRODUCED_IN(28); +iconv_t iconv_open(const char* __src_encoding, const char* __dst_encoding); /** * [iconv(3)](http://man7.org/linux/man-pages/man3/iconv.3.html) converts characters from one @@ -70,7 +69,7 @@ iconv_t iconv_open(const char* __src_encoding, const char* __dst_encoding) __INT * * Available since API level 28. */ -size_t iconv(iconv_t __converter, char** __src_buf, size_t* __src_bytes_left, char** __dst_buf, size_t* __dst_bytes_left) __INTRODUCED_IN(28); +size_t iconv(iconv_t __converter, char** __src_buf, size_t* __src_bytes_left, char** __dst_buf, size_t* __dst_bytes_left); /** * [iconv_close(3)](http://man7.org/linux/man-pages/man3/iconv_close.3.html) deallocates a converter @@ -80,8 +79,6 @@ size_t iconv(iconv_t __converter, char** __src_buf, size_t* __src_bytes_left, ch * * Available since API level 28. */ -int iconv_close(iconv_t __converter) __INTRODUCED_IN(28); -#endif /* __ANDROID_API__ >= 28 */ - +int iconv_close(iconv_t __converter); __END_DECLS diff --git a/datamodel/dmattribute.cpp b/datamodel/dmattribute.cpp index 3569b4dc..71a0d52b 100644 --- a/datamodel/dmattribute.cpp +++ b/datamodel/dmattribute.cpp @@ -721,7 +721,7 @@ public: virtual void Undo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { array.Set( m_nSlot, m_OldValue ); @@ -730,7 +730,7 @@ public: virtual void Redo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { array.Set( m_nSlot, m_Value ); @@ -789,7 +789,7 @@ public: virtual void Undo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { for ( int i = 0; i < m_nCount; ++i ) @@ -801,7 +801,7 @@ public: virtual void Redo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { for ( int i = 0; i < m_nCount; ++i ) @@ -838,7 +838,7 @@ public: virtual void Undo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { array.RemoveMultiple( m_nIndex, m_nCount ); @@ -847,7 +847,7 @@ public: virtual void Redo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { T defaultVal; @@ -888,7 +888,7 @@ public: virtual void Undo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { array.Remove( m_nIndex ); @@ -897,7 +897,7 @@ public: virtual void Redo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { array.InsertBefore( m_nIndex, m_newValue ); @@ -955,7 +955,7 @@ public: virtual void Undo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { if ( m_bFastRemove ) @@ -993,7 +993,7 @@ public: virtual void Redo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { if ( m_bFastRemove ) @@ -1015,7 +1015,7 @@ public: static char buf[ 128 ]; const char *base = BaseClass::GetDesc(); - Q_snprintf( buf, sizeof( buf ), "%s (%s) = remove( pos %i, count %i )", base, GetAttributeName(), m_nIndex, m_nCount ); + Q_snprintf( buf, sizeof( buf ), "%s (%s) = remove( pos %i, count %i )", base, this->GetAttributeName(), m_nIndex, m_nCount ); return buf; } @@ -1097,7 +1097,7 @@ public: virtual void Undo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { array.RemoveAll(); @@ -1110,7 +1110,7 @@ public: virtual void Redo() { - CDmrArray array( GetAttribute() ); + CDmrArray array( this->GetAttribute() ); if ( array.IsValid() ) { array.RemoveAll(); @@ -2734,7 +2734,7 @@ CDmaArrayConstBase::CDmaArrayConstBase( ) template< class T, class B > int CDmaArrayConstBase::Find( const T &value ) const { - return Value().Find( value ); + return this->Value().Find( value ); } @@ -2747,7 +2747,7 @@ int CDmaArrayBase::AddToTail() T defaultVal; CDmAttributeInfo::SetDefaultValue( defaultVal ); CDmArrayAttributeOp accessor( this->m_pAttribute ); - return accessor.InsertBefore( Value().Count(), defaultVal ); + return accessor.InsertBefore( this->Value().Count(), defaultVal ); } template< class T, class B > @@ -2763,7 +2763,7 @@ template< class T, class B > int CDmaArrayBase::AddToTail( const T& src ) { CDmArrayAttributeOp accessor( this->m_pAttribute ); - return accessor.InsertBefore( Value().Count(), src ); + return accessor.InsertBefore( this->Value().Count(), src ); } template< class T, class B > @@ -2777,7 +2777,7 @@ template< class T, class B > int CDmaArrayBase::AddMultipleToTail( int num ) { CDmArrayAttributeOp accessor( this->m_pAttribute ); - return accessor.InsertMultipleBefore( Value().Count(), num ); + return accessor.InsertMultipleBefore( this->Value().Count(), num ); } template< class T, class B > @@ -2790,7 +2790,7 @@ int CDmaArrayBase::InsertMultipleBefore( int elem, int num ) template< class T, class B > void CDmaArrayBase::EnsureCount( int num ) { - int nCurrentCount = Value().Count(); + int nCurrentCount = this->Value().Count(); if ( nCurrentCount < num ) { AddMultipleToTail( num - nCurrentCount ); @@ -2879,7 +2879,7 @@ void CDmaArrayBase::RemoveMultiple( int elem, int num ) template< class T, class B > void CDmaArrayBase::EnsureCapacity( int num ) { - Value().EnsureCapacity( num ); + this->Value().EnsureCapacity( num ); } template< class T, class B > @@ -2894,10 +2894,10 @@ void CDmaArrayBase::Purge() // Attribute initialization //----------------------------------------------------------------------------- template< class T, class B > -void CDmaDecorator::Init( CDmElement *pOwner, const char *pAttributeName, int nFlags = 0 ) +void CDmaDecorator::Init( CDmElement *pOwner, const char *pAttributeName, int nFlags ) { Assert( pOwner ); - this->m_pAttribute = pOwner->AddExternalAttribute( pAttributeName, CDmAttributeInfo >::AttributeType(), &Value() ); + this->m_pAttribute = pOwner->AddExternalAttribute( pAttributeName, CDmAttributeInfo >::AttributeType(), &(this->Value()) ); Assert( this->m_pAttribute ); if ( nFlags ) { @@ -2915,12 +2915,12 @@ void CDmrDecoratorConst::Init( const CDmAttribute* pAttribute ) if ( pAttribute && pAttribute->GetType() == CDmAttributeInfo< CUtlVector< T > >::AttributeType() ) { this->m_pAttribute = const_cast( pAttribute ); - Attach( this->m_pAttribute->GetAttributeData() ); + this->Attach( this->m_pAttribute->GetAttributeData() ); } else { this->m_pAttribute = NULL; - Attach( NULL ); + this->Attach( NULL ); } } @@ -2948,12 +2948,12 @@ void CDmrDecorator::Init( CDmAttribute* pAttribute ) if ( pAttribute && pAttribute->GetType() == CDmAttributeInfo< CUtlVector< T > >::AttributeType() ) { this->m_pAttribute = pAttribute; - Attach( this->m_pAttribute->GetAttributeData() ); + this->Attach( this->m_pAttribute->GetAttributeData() ); } else { this->m_pAttribute = NULL; - Attach( NULL ); + this->Attach( NULL ); } } diff --git a/engine/matsys_interface.cpp b/engine/matsys_interface.cpp index d3067bf8..d49235c9 100644 --- a/engine/matsys_interface.cpp +++ b/engine/matsys_interface.cpp @@ -251,6 +251,9 @@ static const char *s_pRegistryConVars[] = #if defined( OSX ) #define MOD_VIDEO_CONFIG_SETTINGS "videoconfig_mac.cfg" #define USE_VIDEOCONFIG_FILE 1 +#elif defined( ANDROID ) + #define MOD_VIDEO_CONFIG_SETTINGS "videoconfig_android.cfg" + #define USE_VIDEOCONFIG_FILE 1 #elif defined( POSIX ) #define MOD_VIDEO_CONFIG_SETTINGS "videoconfig_linux.cfg" #define USE_VIDEOCONFIG_FILE 1 diff --git a/game/client/base_texture.h b/game/client/base_texture.h deleted file mode 100644 index 65793db0..00000000 --- a/game/client/base_texture.h +++ /dev/null @@ -1,11523 +0,0 @@ -unsigned char base_img_rgba[] = -{ -203, 196, 183, 100, -204, 196, 183, 100, -204, 196, 183, 100, -205, 197, 184, 100, -205, 197, 184, 100, -206, 198, 185, 100, -206, 198, 185, 100, -207, 201, 187, 100, -208, 203, 191, 100, -208, 204, 192, 100, -209, 204, 192, 100, -210, 204, 192, 100, -209, 204, 192, 100, -209, 205, 193, 100, -209, 205, 193, 100, -210, 206, 195, 100, -211, 207, 195, 100, -212, 208, 198, 100, -212, 209, 199, 100, -214, 209, 201, 100, -215, 210, 203, 100, -215, 210, 204, 100, -214, 210, 203, 100, -214, 211, 204, 100, -213, 209, 203, 100, -213, 210, 202, 100, -212, 212, 206, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 215, 210, 100, -217, 216, 211, 100, -217, 216, 214, 100, -218, 217, 216, 100, -218, 217, 215, 100, -218, 217, 217, 100, -219, 217, 218, 100, -219, 217, 218, 100, -220, 218, 219, 100, -220, 220, 220, 100, -220, 220, 222, 100, -221, 221, 223, 100, -222, 222, 224, 100, -222, 222, 224, 100, -222, 222, 224, 100, -223, 223, 226, 100, -223, 223, 226, 100, -223, 223, 226, 100, -224, 224, 227, 100, -224, 223, 229, 100, -225, 224, 230, 100, -225, 224, 230, 100, -226, 225, 231, 100, -225, 226, 232, 100, -225, 228, 232, 100, -226, 228, 232, 100, -226, 227, 234, 100, -225, 227, 236, 100, -224, 228, 237, 100, -224, 228, 237, 100, -224, 228, 237, 100, -224, 228, 237, 100, -224, 228, 237, 100, -223, 227, 237, 100, -223, 227, 239, 100, -223, 227, 238, 100, -223, 227, 238, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -222, 226, 238, 100, -222, 223, 236, 100, -228, 230, 241, 100, -158, 134, 133, 100, -121, 79, 72, 100, -133, 92, 93, 100, -124, 80, 79, 100, -119, 74, 71, 100, -112, 67, 64, 100, -105, 52, 48, 100, -101, 44, 36, 100, -100, 42, 30, 100, -99, 39, 24, 100, -99, 37, 23, 100, -103, 41, 24, 100, -108, 46, 27, 100, -114, 52, 36, 100, -127, 67, 51, 100, -138, 80, 62, 100, -143, 90, 67, 100, -199, 178, 157, 100, -218, 208, 195, 100, -216, 206, 196, 100, -218, 212, 207, 100, -217, 215, 217, 100, -220, 217, 223, 100, -223, 220, 228, 100, -223, 221, 232, 100, -226, 224, 237, 100, -227, 225, 240, 100, -227, 225, 239, 100, -229, 227, 238, 100, -229, 227, 238, 100, -229, 227, 238, 100, -230, 228, 238, 100, -229, 228, 235, 100, -230, 228, 236, 100, -231, 228, 237, 100, -233, 231, 239, 100, -233, 231, 235, 100, -229, 226, 228, 100, -228, 222, 222, 100, -230, 222, 222, 100, -231, 226, 229, 100, -232, 231, 236, 100, -234, 232, 236, 100, -233, 230, 235, 100, -230, 228, 231, 100, -203, 196, 182, 100, -203, 195, 182, 100, -204, 196, 183, 100, -205, 197, 184, 100, -205, 197, 184, 100, -206, 198, 185, 100, -205, 197, 184, 100, -207, 200, 187, 100, -207, 202, 190, 100, -207, 203, 191, 100, -208, 204, 192, 100, -208, 204, 192, 100, -208, 204, 192, 100, -208, 204, 192, 100, -209, 205, 194, 100, -209, 205, 196, 100, -210, 206, 195, 100, -212, 208, 199, 100, -212, 208, 200, 100, -213, 208, 201, 100, -213, 209, 202, 100, -214, 208, 203, 100, -212, 210, 203, 100, -212, 212, 204, 100, -210, 210, 203, 100, -212, 210, 204, 100, -213, 211, 206, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 215, 210, 100, -217, 216, 211, 100, -217, 216, 214, 100, -218, 216, 217, 100, -218, 216, 216, 100, -218, 216, 217, 100, -219, 216, 218, 100, -219, 217, 218, 100, -220, 218, 220, 100, -220, 220, 222, 100, -220, 220, 222, 100, -221, 221, 223, 100, -222, 222, 224, 100, -222, 222, 223, 100, -221, 221, 224, 100, -222, 221, 227, 100, -223, 222, 228, 100, -223, 222, 228, 100, -224, 223, 229, 100, -224, 223, 229, 100, -224, 224, 230, 100, -226, 225, 231, 100, -225, 227, 231, 100, -222, 227, 231, 100, -223, 228, 232, 100, -223, 228, 233, 100, -223, 228, 235, 100, -224, 228, 237, 100, -224, 228, 237, 100, -224, 228, 237, 100, -224, 228, 236, 100, -223, 227, 237, 100, -224, 228, 238, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -222, 226, 238, 100, -222, 226, 238, 100, -223, 227, 239, 100, -220, 223, 235, 100, -228, 231, 242, 100, -185, 168, 171, 100, -122, 79, 71, 100, -136, 94, 94, 100, -132, 88, 88, 100, -124, 79, 79, 100, -124, 80, 82, 100, -125, 78, 84, 100, -122, 72, 79, 100, -117, 66, 67, 100, -117, 63, 63, 100, -119, 64, 63, 100, -122, 65, 58, 100, -125, 68, 59, 100, -130, 72, 65, 100, -136, 78, 70, 100, -140, 83, 69, 100, -145, 92, 72, 100, -199, 179, 157, 100, -220, 210, 195, 100, -215, 206, 195, 100, -218, 212, 207, 100, -217, 215, 217, 100, -220, 217, 224, 100, -221, 220, 229, 100, -224, 222, 233, 100, -226, 224, 237, 100, -227, 225, 238, 100, -228, 225, 236, 100, -227, 225, 235, 100, -228, 226, 235, 100, -229, 227, 234, 100, -229, 228, 236, 100, -231, 230, 238, 100, -233, 231, 239, 100, -231, 227, 232, 100, -220, 208, 203, 100, -213, 188, 173, 100, -209, 180, 158, 100, -209, 179, 152, 100, -210, 180, 153, 100, -211, 185, 159, 100, -216, 195, 175, 100, -223, 208, 199, 100, -227, 220, 218, 100, -230, 228, 229, 100, -203, 195, 182, 100, -203, 195, 182, 100, -204, 196, 183, 100, -205, 197, 184, 100, -205, 197, 184, 100, -205, 197, 184, 100, -205, 197, 184, 100, -205, 200, 187, 100, -205, 201, 189, 100, -206, 202, 190, 100, -207, 203, 191, 100, -208, 204, 192, 100, -208, 204, 192, 100, -208, 204, 192, 100, -209, 205, 195, 100, -209, 205, 196, 100, -210, 206, 197, 100, -211, 207, 199, 100, -211, 207, 200, 100, -213, 208, 202, 100, -213, 208, 202, 100, -213, 209, 202, 100, -212, 211, 203, 100, -212, 212, 204, 100, -210, 210, 204, 100, -211, 210, 205, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 215, 210, 100, -217, 216, 211, 100, -217, 216, 211, 100, -217, 216, 214, 100, -218, 216, 217, 100, -218, 216, 217, 100, -218, 216, 217, 100, -218, 217, 217, 100, -218, 217, 218, 100, -219, 218, 221, 100, -219, 219, 221, 100, -220, 220, 222, 100, -220, 220, 222, 100, -221, 221, 223, 100, -222, 222, 223, 100, -222, 222, 224, 100, -223, 222, 228, 100, -223, 222, 228, 100, -223, 222, 228, 100, -224, 223, 229, 100, -224, 223, 229, 100, -225, 224, 230, 100, -224, 226, 231, 100, -223, 227, 232, 100, -222, 227, 231, 100, -223, 228, 232, 100, -223, 228, 234, 100, -223, 227, 236, 100, -223, 227, 236, 100, -224, 228, 237, 100, -224, 228, 237, 100, -223, 227, 236, 100, -223, 227, 237, 100, -223, 227, 240, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -221, 225, 237, 100, -220, 223, 235, 100, -226, 229, 239, 100, -198, 189, 195, 100, -126, 86, 80, 100, -135, 92, 90, 100, -137, 93, 95, 100, -128, 84, 84, 100, -127, 82, 84, 100, -132, 87, 95, 100, -135, 88, 98, 100, -133, 87, 95, 100, -131, 84, 95, 100, -131, 82, 90, 100, -131, 79, 81, 100, -133, 79, 81, 100, -137, 81, 80, 100, -140, 84, 77, 100, -142, 85, 70, 100, -147, 98, 73, 100, -174, 145, 117, 100, -214, 202, 186, 100, -221, 215, 207, 100, -219, 215, 214, 100, -218, 216, 222, 100, -221, 217, 226, 100, -223, 220, 230, 100, -224, 222, 233, 100, -226, 223, 234, 100, -226, 224, 235, 100, -227, 225, 236, 100, -229, 228, 236, 100, -230, 230, 239, 100, -231, 229, 238, 100, -229, 224, 229, 100, -223, 214, 212, 100, -215, 198, 188, 100, -204, 176, 153, 100, -200, 165, 132, 100, -204, 164, 130, 100, -204, 167, 134, 100, -206, 169, 136, 100, -208, 171, 136, 100, -209, 171, 134, 100, -207, 169, 132, 100, -206, 171, 133, 100, -207, 175, 144, 100, -212, 186, 164, 100, -203, 195, 182, 100, -203, 195, 182, 100, -204, 196, 183, 100, -205, 197, 184, 100, -205, 197, 184, 100, -205, 197, 184, 100, -204, 197, 185, 100, -204, 200, 188, 100, -205, 201, 189, 100, -206, 201, 189, 100, -208, 203, 191, 100, -208, 204, 192, 100, -208, 204, 192, 100, -209, 204, 192, 100, -209, 205, 195, 100, -209, 205, 196, 100, -210, 206, 197, 100, -211, 206, 199, 100, -212, 207, 201, 100, -212, 207, 201, 100, -213, 208, 202, 100, -212, 210, 203, 100, -212, 212, 204, 100, -212, 212, 204, 100, -210, 210, 203, 100, -211, 210, 205, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 215, 210, 100, -217, 216, 211, 100, -217, 216, 213, 100, -218, 216, 215, 100, -218, 216, 217, 100, -218, 216, 217, 100, -218, 216, 217, 100, -217, 217, 218, 100, -218, 218, 219, 100, -219, 219, 221, 100, -219, 219, 221, 100, -220, 220, 222, 100, -220, 220, 222, 100, -221, 221, 223, 100, -221, 221, 223, 100, -221, 221, 224, 100, -222, 221, 227, 100, -222, 222, 228, 100, -222, 223, 228, 100, -224, 223, 229, 100, -224, 224, 229, 100, -224, 224, 230, 100, -222, 226, 231, 100, -222, 227, 231, 100, -223, 228, 232, 100, -223, 227, 233, 100, -223, 227, 235, 100, -223, 227, 236, 100, -223, 227, 236, 100, -224, 228, 237, 100, -223, 227, 236, 100, -223, 227, 237, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -221, 225, 237, 100, -219, 222, 234, 100, -227, 229, 242, 100, -190, 179, 185, 100, -126, 86, 81, 100, -133, 90, 87, 100, -138, 94, 96, 100, -135, 91, 92, 100, -132, 88, 89, 100, -137, 91, 98, 100, -139, 93, 102, 100, -138, 92, 102, 100, -136, 90, 100, 100, -133, 85, 92, 100, -133, 82, 88, 100, -136, 85, 88, 100, -139, 85, 82, 100, -143, 86, 76, 100, -144, 87, 68, 100, -153, 103, 77, 100, -167, 123, 94, 100, -180, 146, 119, 100, -209, 192, 178, 100, -219, 212, 209, 100, -221, 218, 225, 100, -223, 222, 233, 100, -225, 224, 237, 100, -226, 226, 240, 100, -228, 227, 240, 100, -229, 228, 240, 100, -228, 222, 232, 100, -221, 211, 211, 100, -214, 198, 190, 100, -209, 187, 171, 100, -205, 176, 152, 100, -201, 166, 138, 100, -198, 161, 127, 100, -200, 162, 127, 100, -201, 165, 130, 100, -201, 166, 132, 100, -201, 166, 134, 100, -204, 168, 137, 100, -205, 169, 137, 100, -206, 170, 137, 100, -209, 173, 140, 100, -209, 173, 137, 100, -208, 172, 134, 100, -206, 169, 132, 100, -202, 195, 182, 100, -203, 195, 182, 100, -203, 195, 182, 100, -204, 196, 183, 100, -205, 197, 184, 100, -205, 196, 183, 100, -204, 197, 185, 100, -204, 200, 188, 100, -204, 200, 188, 100, -205, 201, 189, 100, -207, 202, 190, 100, -207, 203, 191, 100, -208, 204, 192, 100, -208, 204, 193, 100, -208, 204, 195, 100, -209, 205, 196, 100, -210, 206, 197, 100, -211, 207, 198, 100, -212, 207, 199, 100, -213, 208, 202, 100, -213, 208, 202, 100, -211, 210, 203, 100, -212, 212, 204, 100, -211, 211, 203, 100, -211, 210, 204, 100, -212, 211, 206, 100, -213, 212, 207, 100, -215, 214, 209, 100, -216, 215, 210, 100, -217, 216, 212, 100, -218, 217, 215, 100, -218, 216, 215, 100, -218, 216, 217, 100, -218, 216, 217, 100, -218, 217, 217, 100, -218, 217, 219, 100, -218, 218, 220, 100, -219, 219, 221, 100, -219, 219, 221, 100, -220, 220, 222, 100, -220, 220, 222, 100, -220, 220, 222, 100, -221, 221, 223, 100, -221, 221, 226, 100, -220, 221, 226, 100, -221, 222, 227, 100, -220, 224, 228, 100, -221, 224, 228, 100, -222, 224, 229, 100, -222, 225, 230, 100, -221, 226, 230, 100, -222, 227, 231, 100, -222, 227, 232, 100, -223, 227, 235, 100, -223, 226, 236, 100, -223, 227, 236, 100, -223, 227, 236, 100, -223, 227, 236, 100, -223, 227, 237, 100, -224, 227, 239, 100, -223, 227, 238, 100, -223, 227, 238, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -221, 225, 237, 100, -220, 224, 236, 100, -219, 222, 234, 100, -225, 231, 244, 100, -173, 157, 159, 100, -127, 88, 81, 100, -137, 94, 91, 100, -140, 97, 97, 100, -138, 94, 95, 100, -136, 92, 93, 100, -141, 96, 104, 100, -145, 100, 109, 100, -142, 97, 106, 100, -137, 93, 100, 100, -136, 90, 96, 100, -136, 86, 93, 100, -138, 87, 90, 100, -142, 89, 84, 100, -147, 91, 78, 100, -146, 89, 69, 100, -155, 104, 76, 100, -175, 129, 96, 100, -182, 136, 101, 100, -186, 144, 110, 100, -196, 160, 131, 100, -203, 174, 151, 100, -207, 184, 171, 100, -211, 192, 180, 100, -216, 197, 190, 100, -217, 200, 196, 100, -212, 194, 185, 100, -200, 172, 153, 100, -198, 162, 133, 100, -197, 160, 126, 100, -196, 159, 121, 100, -198, 160, 125, 100, -199, 162, 130, 100, -200, 164, 131, 100, -198, 162, 131, 100, -198, 161, 130, 100, -199, 163, 131, 100, -201, 164, 134, 100, -202, 165, 136, 100, -204, 167, 138, 100, -205, 168, 138, 100, -207, 171, 139, 100, -208, 172, 139, 100, -208, 173, 138, 100, -209, 173, 136, 100, -201, 195, 181, 100, -203, 195, 182, 100, -203, 195, 182, 100, -204, 196, 183, 100, -204, 196, 183, 100, -203, 196, 183, 100, -203, 197, 183, 100, -204, 200, 187, 100, -204, 200, 188, 100, -205, 201, 189, 100, -207, 203, 191, 100, -207, 203, 191, 100, -208, 204, 192, 100, -208, 204, 193, 100, -208, 204, 195, 100, -208, 204, 195, 100, -209, 205, 196, 100, -210, 206, 197, 100, -211, 206, 199, 100, -213, 207, 202, 100, -213, 208, 202, 100, -211, 209, 202, 100, -211, 212, 203, 100, -212, 212, 204, 100, -211, 210, 205, 100, -212, 211, 206, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 215, 210, 100, -217, 216, 210, 100, -217, 216, 213, 100, -218, 216, 217, 100, -218, 216, 217, 100, -218, 217, 217, 100, -217, 217, 217, 100, -218, 217, 219, 100, -218, 218, 220, 100, -219, 219, 221, 100, -218, 218, 220, 100, -220, 220, 222, 100, -220, 220, 222, 100, -221, 221, 223, 100, -221, 220, 225, 100, -220, 221, 226, 100, -217, 222, 226, 100, -219, 224, 228, 100, -219, 224, 228, 100, -220, 225, 229, 100, -220, 225, 229, 100, -220, 225, 229, 100, -221, 226, 230, 100, -222, 227, 231, 100, -222, 227, 234, 100, -223, 227, 236, 100, -222, 226, 235, 100, -223, 227, 236, 100, -223, 227, 236, 100, -223, 227, 236, 100, -223, 227, 238, 100, -224, 226, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -223, 227, 239, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -221, 225, 237, 100, -222, 226, 238, 100, -221, 225, 237, 100, -220, 224, 237, 100, -219, 223, 234, 100, -222, 227, 238, 100, -151, 129, 123, 100, -130, 91, 80, 100, -136, 95, 88, 100, -144, 102, 102, 100, -143, 101, 102, 100, -140, 98, 101, 100, -142, 99, 108, 100, -144, 101, 110, 100, -143, 100, 109, 100, -140, 97, 104, 100, -140, 96, 102, 100, -140, 94, 98, 100, -142, 93, 92, 100, -145, 92, 85, 100, -148, 92, 78, 100, -147, 91, 68, 100, -161, 109, 78, 100, -178, 133, 96, 100, -189, 146, 111, 100, -195, 155, 119, 100, -196, 155, 119, 100, -198, 157, 121, 100, -201, 160, 126, 100, -200, 161, 127, 100, -198, 160, 128, 100, -195, 157, 126, 100, -194, 156, 124, 100, -196, 157, 125, 100, -195, 158, 126, 100, -195, 157, 124, 100, -195, 156, 122, 100, -194, 155, 122, 100, -192, 156, 124, 100, -192, 156, 126, 100, -194, 156, 129, 100, -196, 159, 131, 100, -197, 160, 132, 100, -200, 163, 135, 100, -200, 163, 135, 100, -200, 163, 135, 100, -203, 166, 137, 100, -204, 167, 138, 100, -206, 169, 139, 100, -207, 171, 138, 100, -208, 171, 137, 100, -201, 194, 180, 100, -202, 194, 181, 100, -203, 195, 182, 100, -204, 196, 183, 100, -203, 196, 183, 100, -201, 196, 183, 100, -201, 197, 185, 100, -203, 199, 187, 100, -204, 200, 188, 100, -205, 201, 189, 100, -206, 202, 190, 100, -207, 203, 191, 100, -207, 203, 191, 100, -208, 204, 193, 100, -208, 204, 195, 100, -208, 204, 195, 100, -209, 204, 196, 100, -210, 205, 197, 100, -210, 206, 198, 100, -211, 206, 200, 100, -211, 208, 201, 100, -209, 209, 201, 100, -211, 211, 203, 100, -212, 211, 205, 100, -212, 211, 206, 100, -213, 212, 207, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 215, 210, 100, -216, 215, 210, 100, -217, 216, 213, 100, -218, 216, 217, 100, -218, 217, 217, 100, -217, 217, 217, 100, -217, 217, 218, 100, -217, 217, 219, 100, -218, 218, 220, 100, -219, 219, 221, 100, -219, 219, 221, 100, -219, 219, 221, 100, -220, 220, 222, 100, -221, 221, 223, 100, -220, 220, 225, 100, -219, 221, 226, 100, -216, 221, 225, 100, -217, 222, 226, 100, -218, 223, 227, 100, -220, 225, 229, 100, -220, 225, 229, 100, -221, 226, 230, 100, -222, 227, 231, 100, -222, 227, 232, 100, -222, 226, 234, 100, -223, 226, 236, 100, -223, 227, 236, 100, -222, 226, 235, 100, -222, 226, 235, 100, -223, 227, 237, 100, -223, 227, 236, 100, -222, 227, 238, 100, -223, 227, 239, 100, -223, 227, 239, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -221, 225, 237, 100, -221, 225, 237, 100, -221, 225, 237, 100, -221, 225, 237, 100, -220, 224, 236, 100, -218, 221, 233, 100, -227, 230, 244, 100, -203, 199, 204, 100, -131, 99, 88, 100, -136, 98, 86, 100, -135, 95, 87, 100, -145, 103, 102, 100, -148, 106, 108, 100, -147, 104, 110, 100, -147, 104, 112, 100, -148, 105, 114, 100, -148, 105, 113, 100, -145, 101, 109, 100, -143, 101, 105, 100, -143, 99, 100, 100, -146, 97, 95, 100, -148, 95, 84, 100, -148, 95, 77, 100, -152, 100, 76, 100, -171, 122, 89, 100, -185, 141, 104, 100, -191, 151, 115, 100, -196, 157, 121, 100, -200, 162, 128, 100, -203, 165, 132, 100, -202, 163, 132, 100, -196, 160, 129, 100, -194, 159, 127, 100, -197, 161, 129, 100, -197, 162, 130, 100, -196, 157, 126, 100, -194, 154, 124, 100, -192, 153, 122, 100, -190, 151, 121, 100, -188, 149, 120, 100, -187, 150, 120, 100, -189, 152, 125, 100, -192, 155, 130, 100, -193, 156, 131, 100, -193, 156, 131, 100, -195, 157, 133, 100, -194, 156, 132, 100, -195, 157, 133, 100, -198, 161, 136, 100, -202, 165, 137, 100, -204, 167, 139, 100, -205, 169, 137, 100, -206, 170, 136, 100, -201, 193, 180, 100, -201, 194, 180, 100, -200, 195, 181, 100, -200, 196, 182, 100, -200, 195, 183, 100, -199, 195, 182, 100, -201, 198, 184, 100, -203, 199, 188, 100, -203, 199, 187, 100, -204, 200, 188, 100, -206, 202, 190, 100, -206, 202, 190, 100, -206, 203, 190, 100, -208, 204, 192, 100, -208, 204, 194, 100, -208, 204, 195, 100, -208, 204, 196, 100, -209, 205, 198, 100, -210, 205, 199, 100, -208, 207, 199, 100, -208, 209, 201, 100, -210, 210, 202, 100, -212, 212, 203, 100, -212, 211, 206, 100, -212, 211, 206, 100, -213, 212, 207, 100, -213, 212, 207, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 215, 211, 100, -217, 217, 216, 100, -217, 217, 217, 100, -217, 217, 217, 100, -217, 217, 217, 100, -217, 217, 219, 100, -217, 217, 219, 100, -218, 218, 220, 100, -219, 219, 221, 100, -219, 219, 221, 100, -219, 219, 221, 100, -220, 220, 222, 100, -220, 220, 222, 100, -218, 221, 225, 100, -217, 222, 226, 100, -216, 221, 225, 100, -217, 222, 226, 100, -217, 222, 226, 100, -219, 224, 229, 100, -220, 225, 229, 100, -220, 225, 229, 100, -221, 226, 230, 100, -221, 225, 232, 100, -220, 224, 234, 100, -222, 226, 235, 100, -222, 226, 235, 100, -222, 226, 235, 100, -222, 226, 235, 100, -223, 227, 238, 100, -223, 227, 237, 100, -223, 227, 238, 100, -222, 227, 239, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -222, 226, 238, 100, -221, 225, 237, 100, -221, 225, 237, 100, -221, 225, 237, 100, -221, 225, 237, 100, -220, 225, 236, 100, -219, 223, 235, 100, -219, 223, 235, 100, -226, 230, 243, 100, -215, 212, 223, 100, -148, 122, 115, 100, -133, 96, 82, 100, -137, 100, 89, 100, -135, 94, 85, 100, -145, 102, 98, 100, -151, 109, 111, 100, -149, 106, 112, 100, -149, 108, 115, 100, -151, 108, 116, 100, -150, 107, 114, 100, -148, 106, 111, 100, -144, 103, 104, 100, -147, 101, 100, 100, -150, 101, 95, 100, -149, 100, 87, 100, -148, 99, 78, 100, -165, 117, 91, 100, -182, 139, 107, 100, -192, 150, 118, 100, -196, 156, 123, 100, -199, 161, 127, 100, -203, 164, 131, 100, -202, 164, 130, 100, -196, 160, 126, 100, -196, 160, 128, 100, -197, 161, 129, 100, -197, 161, 129, 100, -194, 157, 125, 100, -193, 154, 123, 100, -193, 154, 123, 100, -190, 151, 121, 100, -186, 147, 117, 100, -183, 144, 115, 100, -181, 144, 116, 100, -184, 147, 123, 100, -187, 149, 127, 100, -188, 150, 131, 100, -189, 152, 133, 100, -186, 151, 131, 100, -186, 150, 131, 100, -189, 153, 133, 100, -194, 156, 133, 100, -196, 159, 132, 100, -199, 162, 134, 100, -201, 165, 133, 100, -205, 167, 133, 100, -201, 193, 180, 100, -200, 194, 180, 100, -200, 195, 181, 100, -199, 196, 181, 100, -199, 196, 181, 100, -199, 196, 181, 100, -201, 198, 183, 100, -202, 198, 186, 100, -203, 199, 187, 100, -204, 200, 188, 100, -205, 201, 189, 100, -207, 202, 190, 100, -206, 202, 190, 100, -207, 203, 192, 100, -208, 204, 195, 100, -208, 204, 195, 100, -208, 205, 196, 100, -206, 206, 198, 100, -207, 206, 199, 100, -207, 207, 199, 100, -208, 208, 200, 100, -210, 210, 201, 100, -212, 212, 204, 100, -212, 211, 206, 100, -211, 210, 205, 100, -213, 212, 206, 100, -213, 212, 207, 100, -214, 213, 208, 100, -215, 214, 209, 100, -216, 214, 212, 100, -216, 216, 216, 100, -216, 216, 216, 100, -217, 217, 216, 100, -216, 216, 217, 100, -217, 217, 219, 100, -217, 217, 219, 100, -217, 217, 219, 100, -218, 218, 220, 100, -219, 219, 221, 100, -219, 219, 221, 100, -219, 220, 222, 100, -219, 220, 222, 100, -217, 221, 224, 100, -216, 221, 226, 100, -217, 222, 226, 100, -218, 223, 227, 100, -218, 223, 227, 100, -219, 224, 230, 100, -220, 225, 229, 100, -220, 225, 229, 100, -222, 224, 230, 100, -221, 225, 232, 100, -221, 225, 234, 100, -221, 225, 234, 100, -222, 226, 234, 100, -222, 226, 235, 100, -222, 226, 235, 100, -223, 226, 237, 100, -223, 226, 238, 100, -222, 226, 238, 100, -222, 225, 236, 100, -222, 225, 236, 100, -221, 225, 236, 100, -221, 225, 236, 100, -221, 223, 236, 100, -220, 224, 236, 100, -220, 223, 235, 100, -220, 224, 236, 100, -221, 224, 236, 100, -222, 226, 239, 100, -226, 230, 243, 100, -223, 225, 235, 100, -197, 189, 195, 100, -151, 123, 114, 100, -136, 101, 86, 100, -140, 104, 91, 100, -140, 100, 90, 100, -135, 95, 87, 100, -143, 100, 96, 100, -154, 110, 110, 100, -148, 106, 109, 100, -149, 111, 116, 100, -152, 114, 118, 100, -153, 113, 119, 100, -145, 104, 109, 100, -142, 98, 98, 100, -150, 101, 97, 100, -151, 103, 93, 100, -148, 100, 85, 100, -161, 113, 90, 100, -183, 139, 110, 100, -192, 152, 120, 100, -195, 157, 124, 100, -200, 161, 130, 100, -202, 163, 130, 100, -202, 163, 129, 100, -200, 163, 128, 100, -197, 161, 129, 100, -197, 161, 129, 100, -196, 160, 128, 100, -193, 157, 125, 100, -193, 155, 123, 100, -194, 154, 123, 100, -192, 153, 123, 100, -189, 150, 121, 100, -182, 143, 114, 100, -177, 137, 112, 100, -177, 137, 113, 100, -178, 140, 120, 100, -180, 141, 124, 100, -181, 145, 126, 100, -181, 146, 128, 100, -182, 148, 129, 100, -183, 148, 129, 100, -185, 149, 130, 100, -191, 153, 131, 100, -192, 155, 127, 100, -193, 157, 126, 100, -199, 162, 130, 100, -202, 163, 127, 100, -201, 193, 180, 100, -200, 194, 180, 100, -201, 195, 181, 100, -199, 195, 181, 100, -199, 196, 181, 100, -199, 196, 181, 100, -201, 198, 184, 100, -202, 199, 186, 100, -202, 198, 186, 100, -203, 200, 187, 100, -205, 201, 189, 100, -206, 201, 190, 100, -206, 202, 190, 100, -207, 203, 192, 100, -208, 204, 195, 100, -208, 204, 196, 100, -207, 204, 196, 100, -206, 206, 198, 100, -207, 207, 199, 100, -208, 207, 199, 100, -208, 208, 200, 100, -208, 209, 200, 100, -211, 210, 204, 100, -211, 210, 205, 100, -210, 209, 204, 100, -211, 210, 206, 100, -212, 211, 207, 100, -214, 213, 208, 100, -215, 214, 211, 100, -216, 214, 214, 100, -217, 214, 216, 100, -216, 216, 216, 100, -215, 216, 216, 100, -216, 216, 217, 100, -217, 217, 219, 100, -217, 217, 219, 100, -217, 217, 219, 100, -217, 217, 219, 100, -218, 218, 220, 100, -219, 219, 221, 100, -218, 220, 221, 100, -217, 222, 222, 100, -216, 222, 224, 100, -216, 221, 225, 100, -217, 222, 226, 100, -218, 223, 227, 100, -218, 223, 227, 100, -219, 224, 229, 100, -220, 224, 229, 100, -220, 225, 229, 100, -223, 224, 231, 100, -221, 225, 234, 100, -221, 225, 234, 100, -221, 225, 234, 100, -221, 225, 234, 100, -221, 225, 234, 100, -221, 225, 234, 100, -222, 225, 234, 100, -222, 225, 234, 100, -221, 226, 234, 100, -224, 227, 237, 100, -227, 229, 240, 100, -225, 230, 241, 100, -226, 231, 242, 100, -228, 229, 242, 100, -226, 229, 242, 100, -225, 230, 241, 100, -225, 229, 242, 100, -224, 226, 239, 100, -216, 214, 223, 100, -196, 185, 186, 100, -166, 144, 137, 100, -144, 113, 100, 100, -146, 110, 93, 100, -146, 113, 97, 100, -143, 108, 96, 100, -145, 104, 95, 100, -143, 103, 94, 100, -147, 104, 98, 100, -154, 111, 106, 100, -147, 105, 107, 100, -153, 116, 121, 100, -154, 118, 122, 100, -152, 113, 117, 100, -140, 98, 98, 100, -147, 103, 98, 100, -151, 107, 97, 100, -148, 105, 88, 100, -164, 119, 99, 100, -190, 146, 120, 100, -194, 153, 124, 100, -196, 157, 127, 100, -200, 161, 130, 100, -200, 161, 130, 100, -201, 162, 130, 100, -201, 162, 130, 100, -200, 163, 131, 100, -199, 163, 131, 100, -198, 162, 130, 100, -197, 161, 129, 100, -198, 161, 129, 100, -197, 158, 127, 100, -195, 156, 126, 100, -192, 152, 122, 100, -187, 149, 118, 100, -174, 134, 107, 100, -167, 126, 105, 100, -166, 125, 106, 100, -171, 133, 115, 100, -171, 132, 116, 100, -172, 135, 121, 100, -176, 139, 123, 100, -179, 143, 126, 100, -184, 146, 126, 100, -184, 146, 125, 100, -187, 151, 123, 100, -190, 154, 123, 100, -193, 156, 123, 100, -197, 158, 122, 100, -197, 159, 120, 100, -200, 192, 179, 100, -201, 193, 180, 100, -200, 194, 180, 100, -199, 195, 180, 100, -198, 195, 180, 100, -198, 195, 181, 100, -201, 197, 185, 100, -202, 198, 186, 100, -202, 198, 186, 100, -204, 200, 188, 100, -205, 201, 189, 100, -205, 201, 189, 100, -206, 202, 190, 100, -207, 203, 194, 100, -208, 204, 195, 100, -208, 203, 196, 100, -207, 204, 196, 100, -206, 206, 198, 100, -206, 206, 198, 100, -207, 207, 199, 100, -207, 207, 199, 100, -208, 208, 200, 100, -209, 209, 203, 100, -210, 209, 204, 100, -210, 209, 204, 100, -211, 210, 207, 100, -211, 210, 206, 100, -213, 212, 207, 100, -214, 213, 210, 100, -215, 214, 213, 100, -216, 214, 215, 100, -215, 215, 215, 100, -215, 215, 215, 100, -215, 215, 218, 100, -217, 217, 219, 100, -217, 217, 219, 100, -217, 217, 219, 100, -217, 217, 219, 100, -218, 218, 220, 100, -218, 219, 221, 100, -216, 220, 221, 100, -215, 222, 221, 100, -216, 221, 224, 100, -216, 221, 225, 100, -217, 222, 225, 100, -217, 222, 226, 100, -218, 223, 227, 100, -219, 224, 227, 100, -220, 225, 229, 100, -220, 225, 229, 100, -221, 224, 231, 100, -220, 224, 233, 100, -221, 225, 234, 100, -221, 225, 234, 100, -221, 225, 234, 100, -221, 224, 233, 100, -220, 225, 233, 100, -224, 228, 237, 100, -226, 229, 240, 100, -224, 227, 237, 100, -218, 217, 222, 100, -207, 202, 201, 100, -198, 190, 188, 100, -197, 188, 186, 100, -196, 187, 185, 100, -198, 190, 188, 100, -201, 191, 192, 100, -193, 180, 179, 100, -181, 161, 153, 100, -166, 140, 125, 100, -156, 126, 107, 100, -158, 122, 105, 100, -158, 124, 109, 100, -154, 121, 104, 100, -152, 119, 101, 100, -150, 115, 100, 100, -151, 111, 98, 100, -150, 111, 98, 100, -152, 109, 103, 100, -152, 109, 102, 100, -146, 103, 97, 100, -156, 119, 119, 100, -158, 118, 118, 100, -146, 103, 100, 100, -145, 103, 96, 100, -154, 111, 99, 100, -152, 110, 95, 100, -165, 123, 104, 100, -190, 148, 125, 100, -196, 156, 130, 100, -195, 156, 128, 100, -196, 157, 128, 100, -197, 158, 128, 100, -198, 159, 128, 100, -199, 160, 129, 100, -200, 163, 133, 100, -200, 164, 132, 100, -200, 164, 132, 100, -200, 164, 132, 100, -200, 164, 132, 100, -203, 164, 133, 100, -200, 161, 130, 100, -196, 157, 126, 100, -192, 153, 122, 100, -187, 148, 118, 100, -167, 127, 101, 100, -157, 116, 97, 100, -153, 111, 97, 100, -159, 119, 107, 100, -158, 119, 107, 100, -165, 124, 114, 100, -170, 132, 117, 100, -175, 137, 120, 100, -180, 142, 121, 100, -184, 146, 120, 100, -188, 150, 117, 100, -189, 152, 116, 100, -190, 151, 118, 100, -191, 153, 116, 100, -192, 153, 115, 100, -200, 192, 179, 100, -200, 192, 179, 100, -200, 193, 180, 100, -199, 195, 180, 100, -198, 195, 180, 100, -198, 195, 180, 100, -201, 197, 185, 100, -202, 198, 186, 100, -202, 198, 186, 100, -204, 200, 188, 100, -204, 200, 188, 100, -205, 201, 189, 100, -206, 202, 190, 100, -206, 202, 193, 100, -207, 204, 194, 100, -208, 204, 195, 100, -207, 204, 195, 100, -205, 205, 197, 100, -206, 206, 198, 100, -206, 206, 198, 100, -207, 207, 199, 100, -207, 207, 200, 100, -209, 208, 203, 100, -210, 209, 204, 100, -210, 209, 204, 100, -211, 210, 205, 100, -211, 211, 206, 100, -213, 212, 207, 100, -214, 213, 208, 100, -215, 214, 213, 100, -215, 214, 215, 100, -215, 215, 215, 100, -215, 215, 216, 100, -215, 215, 217, 100, -216, 216, 218, 100, -217, 217, 219, 100, -217, 217, 219, 100, -217, 217, 219, 100, -217, 218, 220, 100, -216, 220, 221, 100, -215, 221, 221, 100, -216, 222, 221, 100, -216, 221, 224, 100, -215, 220, 225, 100, -216, 221, 225, 100, -217, 222, 226, 100, -217, 222, 226, 100, -218, 223, 227, 100, -219, 224, 228, 100, -220, 225, 230, 100, -220, 225, 232, 100, -220, 224, 233, 100, -220, 225, 232, 100, -222, 224, 232, 100, -222, 225, 233, 100, -225, 228, 236, 100, -222, 223, 231, 100, -216, 212, 213, 100, -210, 197, 191, 100, -199, 179, 165, 100, -183, 157, 137, 100, -173, 143, 119, 100, -170, 139, 116, 100, -170, 139, 117, 100, -168, 140, 118, 100, -165, 135, 114, 100, -167, 135, 116, 100, -166, 135, 117, 100, -166, 135, 116, 100, -166, 136, 117, 100, -167, 138, 120, 100, -166, 134, 117, 100, -162, 130, 112, 100, -162, 128, 111, 100, -161, 126, 109, 100, -160, 121, 105, 100, -157, 118, 103, 100, -155, 116, 101, 100, -156, 114, 105, 100, -158, 115, 108, 100, -148, 105, 91, 100, -152, 109, 99, 100, -149, 106, 97, 100, -148, 104, 98, 100, -161, 118, 110, 100, -161, 118, 108, 100, -169, 128, 112, 100, -190, 149, 130, 100, -198, 157, 134, 100, -196, 156, 131, 100, -195, 155, 127, 100, -196, 157, 128, 100, -197, 158, 130, 100, -199, 160, 131, 100, -200, 161, 130, 100, -201, 164, 135, 100, -203, 166, 136, 100, -202, 166, 134, 100, -202, 166, 136, 100, -203, 166, 135, 100, -201, 162, 131, 100, -199, 160, 129, 100, -196, 157, 126, 100, -194, 155, 125, 100, -188, 149, 119, 100, -172, 132, 106, 100, -145, 103, 88, 100, -144, 101, 94, 100, -146, 103, 96, 100, -148, 107, 100, 100, -158, 118, 107, 100, -165, 125, 110, 100, -172, 133, 115, 100, -177, 140, 112, 100, -182, 144, 111, 100, -185, 146, 112, 100, -187, 148, 111, 100, -186, 147, 111, 100, -185, 146, 109, 100, -185, 145, 108, 100, -199, 192, 179, 100, -199, 193, 179, 100, -200, 194, 180, 100, -199, 194, 180, 100, -197, 194, 180, 100, -198, 194, 182, 100, -201, 197, 184, 100, -202, 197, 185, 100, -202, 198, 186, 100, -203, 199, 187, 100, -204, 200, 188, 100, -205, 201, 189, 100, -205, 201, 190, 100, -206, 202, 193, 100, -207, 203, 194, 100, -208, 204, 195, 100, -207, 204, 196, 100, -205, 205, 197, 100, -206, 206, 198, 100, -206, 206, 198, 100, -206, 206, 198, 100, -208, 207, 200, 100, -209, 208, 203, 100, -209, 208, 203, 100, -209, 208, 203, 100, -210, 209, 204, 100, -212, 211, 206, 100, -213, 212, 207, 100, -214, 213, 209, 100, -215, 213, 213, 100, -215, 214, 215, 100, -216, 216, 216, 100, -216, 216, 217, 100, -216, 216, 216, 100, -217, 217, 219, 100, -217, 217, 219, 100, -218, 218, 220, 100, -218, 217, 220, 100, -217, 218, 220, 100, -215, 221, 221, 100, -215, 221, 221, 100, -216, 222, 221, 100, -215, 220, 223, 100, -216, 221, 225, 100, -216, 221, 225, 100, -217, 222, 226, 100, -216, 221, 225, 100, -217, 222, 227, 100, -219, 223, 227, 100, -219, 224, 229, 100, -220, 224, 231, 100, -220, 225, 231, 100, -221, 225, 230, 100, -224, 225, 231, 100, -222, 223, 229, 100, -207, 195, 188, 100, -197, 174, 157, 100, -196, 166, 140, 100, -195, 162, 131, 100, -193, 159, 127, 100, -186, 154, 127, 100, -182, 150, 127, 100, -182, 150, 130, 100, -182, 151, 130, 100, -177, 150, 129, 100, -173, 144, 124, 100, -171, 143, 122, 100, -172, 143, 125, 100, -171, 144, 124, 100, -169, 141, 122, 100, -167, 137, 119, 100, -167, 134, 117, 100, -165, 132, 116, 100, -164, 130, 117, 100, -165, 129, 117, 100, -167, 127, 116, 100, -166, 126, 115, 100, -164, 124, 114, 100, -163, 121, 112, 100, -164, 121, 111, 100, -160, 117, 102, 100, -153, 110, 94, 100, -154, 111, 98, 100, -163, 120, 111, 100, -164, 123, 113, 100, -168, 128, 119, 100, -188, 148, 130, 100, -197, 157, 133, 100, -196, 156, 129, 100, -196, 157, 128, 100, -197, 158, 129, 100, -199, 160, 131, 100, -199, 160, 131, 100, -199, 160, 131, 100, -202, 163, 134, 100, -202, 165, 136, 100, -203, 167, 136, 100, -203, 167, 136, 100, -202, 165, 136, 100, -204, 167, 136, 100, -204, 164, 134, 100, -203, 164, 134, 100, -200, 161, 131, 100, -197, 158, 129, 100, -190, 151, 122, 100, -183, 142, 115, 100, -156, 112, 95, 100, -125, 82, 75, 100, -133, 90, 83, 100, -140, 98, 92, 100, -148, 107, 99, 100, -160, 121, 104, 100, -170, 132, 105, 100, -177, 139, 107, 100, -179, 140, 107, 100, -181, 140, 107, 100, -184, 141, 106, 100, -185, 141, 104, 100, -184, 141, 105, 100, -182, 142, 106, 100, -198, 192, 178, 100, -198, 194, 179, 100, -199, 193, 179, 100, -198, 194, 179, 100, -197, 193, 181, 100, -198, 194, 182, 100, -200, 196, 184, 100, -201, 197, 185, 100, -201, 197, 185, 100, -203, 199, 187, 100, -203, 199, 187, 100, -204, 200, 188, 100, -205, 201, 190, 100, -206, 202, 193, 100, -207, 203, 194, 100, -207, 203, 194, 100, -207, 203, 196, 100, -205, 205, 197, 100, -205, 205, 197, 100, -205, 205, 197, 100, -205, 205, 197, 100, -207, 206, 200, 100, -208, 207, 203, 100, -208, 207, 202, 100, -209, 208, 203, 100, -209, 208, 203, 100, -210, 210, 204, 100, -211, 211, 206, 100, -213, 212, 210, 100, -215, 214, 214, 100, -215, 214, 215, 100, -215, 215, 215, 100, -215, 215, 215, 100, -215, 215, 216, 100, -216, 216, 218, 100, -217, 217, 219, 100, -217, 218, 219, 100, -217, 217, 219, 100, -216, 218, 219, 100, -214, 220, 220, 100, -215, 221, 221, 100, -215, 221, 222, 100, -215, 220, 224, 100, -215, 220, 224, 100, -216, 221, 225, 100, -216, 221, 225, 100, -215, 220, 224, 100, -219, 222, 226, 100, -219, 222, 227, 100, -219, 224, 228, 100, -219, 224, 230, 100, -220, 225, 229, 100, -222, 224, 229, 100, -222, 222, 226, 100, -191, 174, 158, 100, -185, 153, 122, 100, -193, 161, 131, 100, -196, 164, 136, 100, -196, 165, 137, 100, -195, 164, 138, 100, -188, 160, 134, 100, -186, 157, 133, 100, -189, 157, 135, 100, -189, 157, 137, 100, -183, 154, 131, 100, -178, 147, 123, 100, -174, 143, 122, 100, -172, 142, 122, 100, -171, 141, 121, 100, -169, 139, 120, 100, -170, 137, 120, 100, -169, 136, 119, 100, -168, 134, 121, 100, -167, 133, 121, 100, -168, 132, 121, 100, -168, 127, 118, 100, -168, 128, 118, 100, -169, 130, 118, 100, -166, 127, 112, 100, -166, 125, 110, 100, -168, 127, 112, 100, -165, 124, 109, 100, -167, 126, 113, 100, -167, 127, 114, 100, -170, 131, 115, 100, -186, 149, 127, 100, -193, 155, 131, 100, -195, 156, 129, 100, -198, 158, 129, 100, -199, 159, 130, 100, -199, 160, 131, 100, -200, 160, 131, 100, -200, 160, 132, 100, -201, 164, 135, 100, -199, 162, 133, 100, -200, 163, 134, 100, -203, 166, 137, 100, -204, 167, 138, 100, -205, 168, 139, 100, -204, 168, 139, 100, -205, 168, 139, 100, -204, 166, 137, 100, -205, 165, 136, 100, -200, 162, 133, 100, -194, 154, 126, 100, -184, 143, 114, 100, -174, 128, 106, 100, -125, 81, 73, 100, -119, 75, 71, 100, -133, 90, 84, 100, -145, 102, 93, 100, -161, 121, 98, 100, -171, 132, 101, 100, -174, 135, 105, 100, -174, 134, 103, 100, -177, 134, 103, 100, -180, 135, 102, 100, -182, 138, 100, 100, -183, 139, 104, 100, -183, 141, 107, 100, -197, 192, 178, 100, -197, 193, 179, 100, -199, 193, 179, 100, -198, 193, 179, 100, -197, 193, 181, 100, -198, 194, 182, 100, -199, 195, 183, 100, -201, 197, 185, 100, -201, 197, 185, 100, -202, 198, 186, 100, -202, 198, 186, 100, -204, 200, 189, 100, -205, 201, 191, 100, -206, 202, 193, 100, -206, 202, 193, 100, -207, 203, 194, 100, -206, 204, 195, 100, -205, 205, 197, 100, -205, 205, 197, 100, -206, 206, 198, 100, -206, 205, 198, 100, -207, 206, 201, 100, -208, 207, 202, 100, -209, 208, 203, 100, -209, 208, 203, 100, -208, 208, 203, 100, -209, 210, 204, 100, -210, 210, 207, 100, -212, 211, 211, 100, -213, 213, 213, 100, -213, 213, 213, 100, -215, 215, 215, 100, -214, 214, 214, 100, -214, 214, 215, 100, -216, 216, 217, 100, -217, 217, 219, 100, -217, 217, 219, 100, -216, 217, 219, 100, -215, 218, 219, 100, -214, 220, 220, 100, -214, 220, 220, 100, -215, 220, 223, 100, -215, 219, 224, 100, -215, 220, 224, 100, -216, 221, 225, 100, -216, 221, 225, 100, -217, 221, 226, 100, -218, 222, 226, 100, -218, 223, 227, 100, -218, 223, 227, 100, -219, 224, 228, 100, -218, 223, 227, 100, -226, 227, 233, 100, -193, 179, 170, 100, -179, 146, 118, 100, -189, 158, 132, 100, -191, 160, 136, 100, -192, 160, 135, 100, -193, 161, 135, 100, -192, 160, 135, 100, -192, 159, 136, 100, -192, 159, 135, 100, -193, 161, 136, 100, -193, 161, 138, 100, -188, 156, 132, 100, -181, 149, 125, 100, -177, 145, 124, 100, -175, 142, 123, 100, -173, 140, 121, 100, -171, 138, 117, 100, -170, 136, 118, 100, -169, 136, 118, 100, -170, 136, 120, 100, -171, 134, 119, 100, -171, 132, 118, 100, -172, 133, 119, 100, -172, 133, 119, 100, -172, 133, 117, 100, -171, 132, 117, 100, -169, 130, 115, 100, -170, 131, 116, 100, -167, 128, 112, 100, -167, 128, 112, 100, -175, 137, 118, 100, -189, 151, 129, 100, -193, 156, 129, 100, -194, 157, 131, 100, -197, 160, 134, 100, -200, 162, 135, 100, -198, 161, 133, 100, -199, 161, 132, 100, -199, 161, 132, 100, -199, 162, 133, 100, -202, 165, 136, 100, -201, 164, 135, 100, -202, 165, 136, 100, -204, 167, 138, 100, -205, 168, 139, 100, -206, 169, 140, 100, -207, 170, 141, 100, -207, 170, 141, 100, -204, 168, 139, 100, -205, 167, 138, 100, -203, 164, 135, 100, -197, 158, 129, 100, -185, 144, 116, 100, -175, 129, 102, 100, -132, 90, 76, 100, -101, 61, 57, 100, -128, 85, 76, 100, -146, 104, 86, 100, -161, 121, 94, 100, -167, 128, 99, 100, -167, 127, 99, 100, -170, 126, 97, 100, -172, 126, 96, 100, -174, 128, 97, 100, -177, 132, 99, 100, -181, 136, 105, 100, -182, 140, 108, 100, -195, 192, 177, 100, -196, 193, 178, 100, -196, 192, 177, 100, -196, 193, 179, 100, -196, 192, 180, 100, -197, 193, 181, 100, -199, 195, 183, 100, -200, 196, 184, 100, -201, 197, 185, 100, -202, 198, 186, 100, -203, 199, 187, 100, -204, 200, 189, 100, -205, 201, 192, 100, -205, 201, 192, 100, -206, 202, 193, 100, -206, 203, 194, 100, -204, 204, 194, 100, -204, 204, 196, 100, -205, 205, 197, 100, -205, 205, 197, 100, -205, 204, 198, 100, -206, 205, 200, 100, -208, 207, 202, 100, -208, 207, 202, 100, -208, 207, 202, 100, -208, 207, 202, 100, -209, 209, 204, 100, -211, 210, 208, 100, -211, 211, 211, 100, -213, 213, 213, 100, -213, 213, 213, 100, -214, 214, 214, 100, -214, 214, 215, 100, -214, 214, 216, 100, -215, 215, 217, 100, -216, 216, 218, 100, -215, 216, 218, 100, -215, 218, 219, 100, -213, 219, 219, 100, -213, 219, 219, 100, -214, 220, 220, 100, -215, 221, 221, 100, -215, 220, 223, 100, -216, 221, 225, 100, -216, 221, 225, 100, -216, 221, 225, 100, -217, 222, 226, 100, -217, 222, 226, 100, -218, 223, 227, 100, -218, 223, 227, 100, -218, 223, 227, 100, -221, 226, 231, 100, -210, 205, 206, 100, -173, 143, 121, 100, -183, 151, 126, 100, -187, 155, 134, 100, -188, 156, 133, 100, -188, 156, 131, 100, -190, 158, 134, 100, -192, 160, 135, 100, -193, 162, 136, 100, -196, 164, 139, 100, -194, 162, 136, 100, -192, 160, 135, 100, -187, 155, 130, 100, -181, 149, 127, 100, -179, 147, 127, 100, -177, 144, 124, 100, -173, 141, 118, 100, -172, 138, 115, 100, -173, 137, 119, 100, -172, 137, 119, 100, -172, 136, 118, 100, -173, 134, 116, 100, -172, 133, 115, 100, -172, 133, 116, 100, -171, 132, 116, 100, -171, 132, 116, 100, -173, 134, 117, 100, -173, 134, 118, 100, -171, 132, 115, 100, -170, 130, 113, 100, -177, 138, 117, 100, -192, 154, 131, 100, -195, 157, 133, 100, -197, 160, 136, 100, -200, 163, 137, 100, -202, 165, 139, 100, -200, 163, 137, 100, -201, 164, 138, 100, -202, 165, 137, 100, -201, 165, 136, 100, -202, 165, 137, 100, -205, 168, 139, 100, -204, 167, 138, 100, -205, 168, 139, 100, -206, 169, 141, 100, -206, 169, 140, 100, -207, 170, 142, 100, -208, 171, 145, 100, -208, 171, 143, 100, -209, 172, 145, 100, -204, 168, 141, 100, -202, 163, 136, 100, -196, 157, 128, 100, -184, 144, 116, 100, -174, 128, 101, 100, -142, 97, 80, 100, -87, 48, 45, 100, -120, 76, 65, 100, -147, 102, 81, 100, -156, 114, 91, 100, -157, 116, 89, 100, -162, 117, 91, 100, -164, 119, 89, 100, -166, 119, 89, 100, -169, 121, 92, 100, -172, 127, 96, 100, -177, 133, 104, 100, -177, 137, 107, 100, -195, 192, 177, 100, -195, 192, 177, 100, -195, 192, 177, 100, -196, 192, 179, 100, -196, 192, 180, 100, -197, 193, 181, 100, -199, 195, 183, 100, -199, 195, 183, 100, -200, 196, 184, 100, -201, 197, 185, 100, -202, 198, 186, 100, -203, 199, 187, 100, -204, 200, 189, 100, -205, 201, 192, 100, -206, 202, 193, 100, -206, 202, 193, 100, -204, 204, 194, 100, -204, 204, 196, 100, -205, 205, 197, 100, -205, 205, 197, 100, -204, 203, 198, 100, -205, 204, 199, 100, -206, 205, 200, 100, -207, 206, 201, 100, -207, 207, 203, 100, -207, 208, 202, 100, -209, 209, 205, 100, -210, 210, 208, 100, -211, 211, 210, 100, -212, 212, 212, 100, -213, 213, 213, 100, -214, 214, 216, 100, -214, 214, 216, 100, -214, 214, 216, 100, -214, 215, 217, 100, -215, 215, 217, 100, -214, 216, 218, 100, -213, 219, 219, 100, -213, 219, 219, 100, -213, 219, 219, 100, -214, 220, 220, 100, -214, 220, 220, 100, -214, 220, 223, 100, -215, 220, 224, 100, -216, 221, 225, 100, -216, 221, 225, 100, -216, 221, 225, 100, -217, 222, 226, 100, -217, 222, 226, 100, -217, 222, 227, 100, -217, 221, 226, 100, -224, 227, 233, 100, -185, 169, 156, 100, -172, 141, 113, 100, -183, 155, 129, 100, -184, 155, 131, 100, -187, 155, 130, 100, -188, 156, 131, 100, -190, 158, 135, 100, -191, 159, 134, 100, -193, 161, 136, 100, -193, 162, 135, 100, -193, 162, 134, 100, -194, 162, 136, 100, -192, 160, 134, 100, -188, 156, 131, 100, -184, 152, 130, 100, -180, 148, 124, 100, -178, 145, 121, 100, -176, 142, 118, 100, -174, 139, 118, 100, -177, 139, 118, 100, -178, 139, 120, 100, -178, 140, 120, 100, -177, 139, 120, 100, -176, 138, 119, 100, -174, 135, 118, 100, -173, 134, 117, 100, -172, 133, 116, 100, -173, 134, 116, 100, -173, 134, 117, 100, -179, 141, 124, 100, -193, 155, 136, 100, -197, 159, 136, 100, -199, 161, 138, 100, -201, 163, 140, 100, -200, 162, 139, 100, -200, 163, 137, 100, -201, 164, 138, 100, -202, 165, 139, 100, -204, 166, 140, 100, -203, 166, 138, 100, -202, 165, 137, 100, -204, 167, 139, 100, -205, 168, 140, 100, -205, 168, 142, 100, -206, 169, 143, 100, -208, 171, 145, 100, -207, 170, 144, 100, -207, 170, 144, 100, -209, 172, 146, 100, -208, 171, 145, 100, -205, 168, 142, 100, -202, 165, 139, 100, -197, 158, 131, 100, -187, 146, 118, 100, -173, 126, 100, 100, -146, 100, 82, 100, -83, 46, 43, 100, -107, 65, 55, 100, -140, 93, 75, 100, -147, 101, 82, 100, -153, 106, 82, 100, -155, 108, 82, 100, -157, 111, 83, 100, -159, 113, 85, 100, -164, 117, 88, 100, -170, 123, 95, 100, -172, 127, 101, 100, -171, 130, 102, 100, -195, 192, 177, 100, -196, 191, 177, 100, -195, 192, 177, 100, -195, 191, 179, 100, -195, 191, 179, 100, -197, 193, 181, 100, -199, 195, 183, 100, -199, 194, 182, 100, -201, 197, 185, 100, -201, 197, 185, 100, -202, 198, 186, 100, -203, 199, 188, 100, -204, 200, 189, 100, -205, 201, 192, 100, -205, 201, 192, 100, -206, 202, 193, 100, -206, 203, 195, 100, -204, 205, 197, 100, -204, 204, 196, 100, -205, 205, 197, 100, -204, 204, 197, 100, -206, 205, 200, 100, -206, 205, 200, 100, -207, 206, 201, 100, -207, 206, 201, 100, -207, 208, 202, 100, -208, 209, 204, 100, -210, 210, 209, 100, -211, 211, 209, 100, -212, 212, 212, 100, -212, 212, 212, 100, -213, 213, 213, 100, -213, 213, 213, 100, -212, 214, 215, 100, -214, 215, 217, 100, -215, 215, 218, 100, -213, 217, 218, 100, -213, 219, 219, 100, -213, 219, 219, 100, -213, 219, 219, 100, -213, 220, 219, 100, -213, 219, 221, 100, -214, 219, 223, 100, -215, 220, 224, 100, -216, 221, 225, 100, -216, 221, 225, 100, -216, 221, 225, 100, -217, 222, 226, 100, -217, 222, 226, 100, -216, 221, 226, 100, -219, 225, 229, 100, -210, 210, 211, 100, -166, 143, 122, 100, -177, 149, 123, 100, -181, 155, 128, 100, -184, 156, 129, 100, -187, 155, 131, 100, -188, 156, 131, 100, -189, 157, 132, 100, -190, 157, 132, 100, -192, 159, 132, 100, -192, 162, 134, 100, -197, 166, 138, 100, -199, 168, 140, 100, -199, 168, 139, 100, -197, 166, 139, 100, -195, 163, 137, 100, -194, 161, 135, 100, -195, 159, 134, 100, -191, 156, 131, 100, -187, 152, 127, 100, -187, 150, 125, 100, -189, 152, 128, 100, -188, 154, 129, 100, -188, 152, 131, 100, -187, 149, 127, 100, -183, 145, 125, 100, -177, 138, 121, 100, -176, 138, 122, 100, -179, 141, 127, 100, -182, 146, 132, 100, -191, 157, 141, 100, -195, 159, 142, 100, -197, 160, 141, 100, -198, 160, 139, 100, -199, 161, 138, 100, -200, 162, 139, 100, -200, 163, 137, 100, -202, 165, 139, 100, -202, 165, 139, 100, -202, 165, 139, 100, -202, 165, 137, 100, -203, 166, 139, 100, -205, 168, 142, 100, -207, 170, 144, 100, -207, 170, 144, 100, -208, 171, 145, 100, -209, 172, 146, 100, -208, 171, 146, 100, -207, 169, 144, 100, -206, 169, 145, 100, -205, 167, 143, 100, -204, 166, 141, 100, -201, 164, 139, 100, -195, 157, 131, 100, -187, 145, 119, 100, -172, 127, 100, 100, -147, 100, 82, 100, -81, 45, 41, 100, -90, 51, 44, 100, -134, 87, 71, 100, -141, 96, 79, 100, -145, 98, 79, 100, -147, 100, 76, 100, -150, 103, 77, 100, -154, 107, 80, 100, -159, 111, 85, 100, -164, 117, 91, 100, -165, 120, 94, 100, -167, 122, 97, 100, -195, 191, 176, 100, -197, 191, 177, 100, -196, 191, 177, 100, -194, 191, 178, 100, -194, 190, 178, 100, -197, 193, 181, 100, -198, 194, 182, 100, -198, 194, 182, 100, -202, 196, 184, 100, -201, 197, 185, 100, -201, 197, 185, 100, -202, 198, 189, 100, -203, 199, 191, 100, -204, 200, 191, 100, -205, 201, 192, 100, -206, 201, 193, 100, -205, 202, 195, 100, -204, 204, 196, 100, -204, 204, 196, 100, -205, 205, 196, 100, -203, 203, 196, 100, -205, 204, 199, 100, -206, 205, 200, 100, -206, 205, 200, 100, -207, 206, 201, 100, -207, 208, 202, 100, -208, 208, 205, 100, -209, 209, 208, 100, -211, 211, 210, 100, -211, 211, 211, 100, -212, 212, 212, 100, -212, 212, 212, 100, -213, 212, 213, 100, -210, 214, 215, 100, -210, 215, 216, 100, -212, 217, 217, 100, -212, 218, 218, 100, -212, 218, 218, 100, -213, 219, 219, 100, -213, 219, 220, 100, -213, 220, 219, 100, -214, 219, 221, 100, -214, 219, 223, 100, -215, 220, 224, 100, -215, 220, 224, 100, -216, 221, 225, 100, -216, 221, 225, 100, -216, 221, 225, 100, -217, 222, 226, 100, -216, 220, 224, 100, -223, 227, 233, 100, -189, 179, 170, 100, -164, 136, 112, 100, -178, 150, 127, 100, -180, 153, 126, 100, -185, 154, 130, 100, -187, 155, 132, 100, -187, 154, 129, 100, -189, 154, 129, 100, -189, 153, 127, 100, -191, 158, 131, 100, -195, 164, 136, 100, -198, 167, 139, 100, -201, 170, 142, 100, -202, 171, 143, 100, -202, 171, 143, 100, -203, 171, 143, 100, -205, 169, 142, 100, -207, 169, 143, 100, -205, 168, 142, 100, -202, 166, 138, 100, -202, 166, 139, 100, -200, 167, 140, 100, -198, 164, 138, 100, -199, 162, 140, 100, -200, 162, 139, 100, -196, 157, 137, 100, -188, 150, 133, 100, -184, 149, 133, 100, -187, 153, 139, 100, -192, 158, 147, 100, -194, 160, 147, 100, -190, 157, 139, 100, -193, 157, 139, 100, -196, 157, 136, 100, -199, 160, 138, 100, -200, 162, 139, 100, -201, 164, 137, 100, -201, 164, 138, 100, -202, 165, 139, 100, -203, 166, 140, 100, -204, 167, 141, 100, -206, 169, 143, 100, -209, 171, 146, 100, -211, 173, 149, 100, -211, 173, 149, 100, -212, 175, 152, 100, -212, 174, 151, 100, -209, 171, 148, 100, -207, 168, 146, 100, -206, 168, 146, 100, -204, 166, 144, 100, -198, 160, 139, 100, -195, 157, 137, 100, -191, 153, 131, 100, -183, 144, 119, 100, -172, 128, 102, 100, -147, 101, 80, 100, -77, 44, 41, 100, -69, 34, 29, 100, -127, 82, 64, 100, -134, 90, 74, 100, -139, 92, 74, 100, -141, 93, 71, 100, -142, 95, 71, 100, -147, 100, 73, 100, -152, 105, 80, 100, -156, 108, 84, 100, -158, 111, 86, 100, -161, 114, 93, 100, -195, 191, 176, 100, -195, 192, 177, 100, -195, 192, 177, 100, -195, 191, 178, 100, -194, 190, 178, 100, -196, 192, 180, 100, -197, 193, 181, 100, -199, 195, 183, 100, -200, 196, 184, 100, -201, 197, 185, 100, -201, 197, 185, 100, -202, 198, 188, 100, -203, 199, 190, 100, -204, 199, 190, 100, -203, 201, 191, 100, -203, 202, 192, 100, -204, 203, 194, 100, -203, 203, 195, 100, -204, 204, 196, 100, -205, 205, 197, 100, -204, 203, 196, 100, -204, 203, 198, 100, -206, 205, 200, 100, -206, 205, 200, 100, -206, 206, 200, 100, -207, 209, 202, 100, -208, 208, 203, 100, -209, 209, 206, 100, -210, 210, 210, 100, -210, 210, 210, 100, -211, 211, 211, 100, -212, 212, 212, 100, -212, 212, 213, 100, -209, 213, 214, 100, -210, 216, 216, 100, -211, 217, 217, 100, -212, 218, 218, 100, -213, 219, 219, 100, -213, 219, 219, 100, -213, 219, 219, 100, -213, 219, 219, 100, -213, 219, 221, 100, -214, 219, 223, 100, -215, 220, 224, 100, -215, 220, 224, 100, -214, 219, 224, 100, -215, 220, 224, 100, -216, 221, 225, 100, -217, 222, 226, 100, -216, 222, 226, 100, -217, 219, 224, 100, -170, 150, 132, 100, -169, 141, 114, 100, -177, 151, 124, 100, -183, 153, 127, 100, -186, 154, 130, 100, -185, 153, 128, 100, -186, 151, 125, 100, -183, 145, 120, 100, -187, 151, 125, 100, -194, 161, 133, 100, -196, 165, 137, 100, -199, 168, 140, 100, -202, 171, 143, 100, -202, 171, 143, 100, -203, 173, 145, 100, -206, 173, 146, 100, -209, 173, 147, 100, -210, 173, 147, 100, -210, 173, 147, 100, -208, 171, 144, 100, -206, 170, 143, 100, -204, 170, 143, 100, -204, 169, 142, 100, -204, 167, 141, 100, -206, 168, 143, 100, -205, 167, 143, 100, -199, 164, 141, 100, -199, 167, 147, 100, -202, 169, 152, 100, -199, 165, 150, 100, -192, 158, 143, 100, -188, 155, 136, 100, -192, 156, 137, 100, -193, 158, 136, 100, -198, 161, 137, 100, -200, 162, 139, 100, -200, 163, 138, 100, -200, 162, 139, 100, -203, 165, 141, 100, -204, 167, 142, 100, -205, 168, 141, 100, -206, 169, 143, 100, -210, 172, 149, 100, -210, 172, 149, 100, -211, 172, 150, 100, -212, 174, 152, 100, -213, 175, 153, 100, -210, 172, 149, 100, -207, 169, 147, 100, -206, 168, 149, 100, -203, 165, 146, 100, -197, 159, 141, 100, -193, 154, 137, 100, -189, 151, 132, 100, -181, 142, 118, 100, -167, 124, 100, 100, -144, 97, 78, 100, -72, 43, 39, 100, -41, 18, 16, 100, -110, 67, 52, 100, -130, 85, 71, 100, -133, 86, 67, 100, -135, 87, 68, 100, -138, 90, 69, 100, -141, 94, 71, 100, -144, 96, 74, 100, -147, 98, 78, 100, -152, 104, 85, 100, -155, 108, 91, 100, -195, 190, 176, 100, -194, 191, 176, 100, -194, 191, 176, 100, -194, 190, 178, 100, -194, 190, 178, 100, -196, 192, 180, 100, -198, 194, 182, 100, -198, 194, 182, 100, -199, 195, 183, 100, -200, 196, 184, 100, -201, 197, 185, 100, -202, 198, 188, 100, -202, 198, 189, 100, -202, 199, 190, 100, -201, 201, 191, 100, -202, 202, 192, 100, -202, 203, 194, 100, -204, 204, 196, 100, -204, 204, 196, 100, -205, 205, 197, 100, -204, 204, 195, 100, -204, 204, 197, 100, -206, 205, 200, 100, -205, 206, 200, 100, -205, 206, 200, 100, -206, 207, 201, 100, -207, 208, 202, 100, -208, 208, 206, 100, -209, 209, 209, 100, -210, 210, 210, 100, -211, 211, 211, 100, -212, 212, 212, 100, -212, 212, 214, 100, -210, 214, 215, 100, -209, 216, 216, 100, -211, 217, 217, 100, -212, 218, 218, 100, -213, 219, 219, 100, -212, 218, 219, 100, -213, 219, 219, 100, -213, 219, 220, 100, -213, 218, 222, 100, -213, 218, 222, 100, -214, 219, 223, 100, -214, 219, 223, 100, -214, 219, 222, 100, -214, 219, 223, 100, -215, 220, 224, 100, -215, 220, 224, 100, -218, 225, 230, 100, -203, 200, 198, 100, -163, 136, 111, 100, -172, 144, 121, 100, -176, 148, 126, 100, -183, 151, 130, 100, -182, 149, 130, 100, -181, 147, 125, 100, -175, 138, 113, 100, -176, 140, 114, 100, -187, 153, 126, 100, -194, 162, 134, 100, -199, 167, 139, 100, -203, 171, 144, 100, -202, 171, 143, 100, -205, 174, 146, 100, -208, 177, 149, 100, -210, 175, 148, 100, -211, 174, 148, 100, -210, 173, 147, 100, -212, 175, 149, 100, -212, 175, 149, 100, -209, 172, 146, 100, -207, 170, 144, 100, -208, 171, 144, 100, -207, 170, 144, 100, -206, 169, 141, 100, -206, 169, 142, 100, -205, 169, 141, 100, -207, 174, 148, 100, -210, 177, 155, 100, -200, 168, 146, 100, -191, 157, 137, 100, -189, 153, 132, 100, -192, 154, 135, 100, -193, 156, 134, 100, -196, 158, 135, 100, -199, 161, 138, 100, -201, 163, 140, 100, -202, 164, 141, 100, -203, 165, 142, 100, -205, 167, 143, 100, -205, 167, 145, 100, -206, 168, 145, 100, -210, 172, 151, 100, -210, 172, 151, 100, -212, 175, 155, 100, -215, 178, 156, 100, -214, 176, 154, 100, -209, 171, 148, 100, -207, 169, 147, 100, -204, 166, 148, 100, -200, 164, 146, 100, -195, 157, 140, 100, -188, 149, 132, 100, -181, 142, 125, 100, -173, 134, 114, 100, -161, 120, 98, 100, -138, 96, 76, 100, -72, 40, 36, 100, -20, 7, 10, 100, -72, 37, 26, 100, -125, 75, 60, 100, -127, 79, 64, 100, -130, 81, 66, 100, -133, 85, 65, 100, -136, 88, 67, 100, -141, 90, 71, 100, -143, 93, 73, 100, -145, 97, 81, 100, -147, 100, 85, 100, -195, 191, 176, 100, -194, 191, 176, 100, -194, 191, 176, 100, -194, 190, 177, 100, -194, 190, 178, 100, -196, 192, 180, 100, -197, 193, 181, 100, -196, 192, 180, 100, -198, 194, 182, 100, -199, 195, 183, 100, -200, 196, 184, 100, -201, 197, 188, 100, -202, 198, 189, 100, -201, 199, 189, 100, -200, 200, 190, 100, -202, 201, 192, 100, -202, 202, 194, 100, -203, 203, 195, 100, -204, 204, 196, 100, -205, 205, 197, 100, -204, 204, 196, 100, -204, 204, 197, 100, -205, 204, 199, 100, -205, 205, 200, 100, -205, 206, 200, 100, -205, 206, 200, 100, -206, 207, 201, 100, -208, 208, 204, 100, -210, 210, 208, 100, -210, 210, 210, 100, -211, 211, 210, 100, -211, 211, 212, 100, -211, 212, 214, 100, -209, 214, 214, 100, -209, 215, 215, 100, -210, 216, 216, 100, -211, 217, 217, 100, -212, 218, 218, 100, -212, 218, 219, 100, -213, 219, 219, 100, -213, 219, 220, 100, -213, 218, 222, 100, -213, 218, 222, 100, -214, 219, 223, 100, -214, 219, 223, 100, -213, 218, 223, 100, -214, 219, 223, 100, -215, 220, 224, 100, -215, 219, 223, 100, -220, 226, 232, 100, -185, 175, 167, 100, -161, 131, 106, 100, -172, 144, 123, 100, -173, 145, 125, 100, -178, 147, 128, 100, -177, 144, 125, 100, -173, 136, 118, 100, -164, 126, 104, 100, -174, 140, 114, 100, -186, 155, 128, 100, -193, 162, 135, 100, -200, 168, 144, 100, -201, 169, 144, 100, -202, 169, 144, 100, -204, 172, 147, 100, -208, 175, 149, 100, -210, 175, 148, 100, -210, 175, 149, 100, -210, 174, 148, 100, -211, 174, 148, 100, -212, 175, 148, 100, -211, 174, 148, 100, -211, 174, 147, 100, -211, 174, 147, 100, -208, 171, 143, 100, -208, 171, 142, 100, -207, 170, 141, 100, -205, 167, 138, 100, -206, 169, 140, 100, -211, 176, 149, 100, -200, 165, 142, 100, -189, 152, 129, 100, -190, 152, 128, 100, -191, 153, 130, 100, -194, 156, 132, 100, -196, 158, 135, 100, -198, 160, 137, 100, -201, 163, 140, 100, -201, 162, 141, 100, -202, 165, 143, 100, -204, 167, 146, 100, -204, 167, 148, 100, -205, 169, 149, 100, -206, 171, 153, 100, -208, 174, 156, 100, -208, 174, 155, 100, -210, 176, 156, 100, -212, 175, 155, 100, -207, 170, 147, 100, -203, 167, 145, 100, -202, 164, 145, 100, -196, 160, 141, 100, -192, 155, 138, 100, -185, 146, 130, 100, -176, 137, 121, 100, -165, 126, 110, 100, -154, 114, 98, 100, -129, 90, 74, 100, -63, 35, 32, 100, -20, 8, 14, 100, -21, 7, 6, 100, -96, 51, 37, 100, -120, 70, 53, 100, -122, 73, 57, 100, -128, 80, 60, 100, -132, 82, 62, 100, -136, 84, 66, 100, -137, 88, 70, 100, -141, 93, 78, 100, -143, 95, 79, 100, -194, 191, 176, 100, -194, 190, 177, 100, -194, 190, 177, 100, -194, 190, 178, 100, -195, 190, 178, 100, -196, 191, 179, 100, -196, 192, 180, 100, -196, 192, 180, 100, -198, 194, 182, 100, -199, 195, 183, 100, -200, 196, 184, 100, -200, 196, 186, 100, -201, 197, 188, 100, -200, 199, 190, 100, -200, 200, 190, 100, -202, 201, 193, 100, -202, 202, 194, 100, -203, 203, 195, 100, -203, 203, 195, 100, -204, 204, 196, 100, -204, 204, 196, 100, -204, 204, 197, 100, -204, 203, 199, 100, -205, 203, 198, 100, -204, 204, 199, 100, -205, 206, 200, 100, -206, 207, 201, 100, -207, 208, 204, 100, -209, 209, 208, 100, -209, 209, 209, 100, -210, 210, 210, 100, -211, 211, 211, 100, -211, 212, 212, 100, -209, 214, 213, 100, -209, 215, 214, 100, -209, 215, 215, 100, -210, 216, 216, 100, -210, 216, 216, 100, -211, 217, 217, 100, -212, 218, 218, 100, -211, 217, 218, 100, -212, 218, 221, 100, -213, 218, 222, 100, -213, 218, 222, 100, -213, 218, 223, 100, -213, 218, 224, 100, -214, 219, 223, 100, -214, 219, 223, 100, -214, 219, 223, 100, -219, 223, 229, 100, -171, 154, 142, 100, -159, 130, 108, 100, -168, 141, 121, 100, -170, 142, 124, 100, -172, 143, 127, 100, -170, 136, 122, 100, -157, 120, 106, 100, -154, 119, 99, 100, -175, 143, 120, 100, -187, 155, 132, 100, -192, 160, 138, 100, -198, 165, 146, 100, -198, 166, 144, 100, -200, 168, 144, 100, -205, 173, 150, 100, -207, 175, 151, 100, -209, 176, 154, 100, -209, 177, 154, 100, -209, 176, 150, 100, -212, 175, 151, 100, -214, 176, 152, 100, -213, 176, 150, 100, -212, 175, 150, 100, -213, 175, 151, 100, -210, 173, 147, 100, -210, 173, 145, 100, -208, 171, 143, 100, -204, 167, 138, 100, -203, 167, 137, 100, -207, 170, 143, 100, -198, 161, 137, 100, -189, 151, 128, 100, -188, 151, 129, 100, -189, 151, 128, 100, -193, 155, 133, 100, -198, 160, 139, 100, -199, 161, 140, 100, -201, 162, 143, 100, -200, 162, 144, 100, -200, 165, 146, 100, -201, 168, 149, 100, -202, 168, 149, 100, -202, 169, 151, 100, -202, 169, 152, 100, -203, 171, 153, 100, -203, 170, 152, 100, -205, 172, 156, 100, -204, 167, 150, 100, -187, 145, 124, 100, -178, 134, 110, 100, -179, 136, 112, 100, -192, 151, 130, 100, -190, 151, 133, 100, -180, 141, 125, 100, -171, 132, 117, 100, -157, 118, 105, 100, -144, 104, 92, 100, -118, 81, 68, 100, -54, 31, 31, 100, -24, 14, 18, 100, -4, 0, 4, 100, -33, 13, 9, 100, -95, 51, 38, 100, -113, 64, 46, 100, -120, 69, 51, 100, -125, 75, 58, 100, -130, 78, 59, 100, -133, 81, 64, 100, -136, 85, 68, 100, -138, 90, 70, 100, -193, 190, 176, 100, -193, 189, 178, 100, -193, 190, 177, 100, -194, 190, 178, 100, -194, 190, 178, 100, -195, 191, 179, 100, -195, 191, 179, 100, -195, 191, 179, 100, -197, 193, 181, 100, -198, 194, 182, 100, -199, 195, 183, 100, -200, 196, 184, 100, -201, 198, 188, 100, -199, 200, 187, 100, -200, 200, 189, 100, -200, 200, 192, 100, -202, 202, 194, 100, -202, 202, 194, 100, -203, 203, 195, 100, -204, 204, 196, 100, -204, 204, 196, 100, -204, 204, 197, 100, -205, 204, 199, 100, -205, 204, 199, 100, -205, 205, 199, 100, -205, 206, 200, 100, -205, 206, 200, 100, -206, 206, 204, 100, -207, 207, 207, 100, -208, 208, 208, 100, -209, 209, 209, 100, -211, 210, 211, 100, -211, 211, 211, 100, -209, 213, 211, 100, -208, 214, 213, 100, -209, 215, 215, 100, -209, 215, 215, 100, -211, 217, 217, 100, -211, 217, 217, 100, -211, 217, 217, 100, -211, 217, 218, 100, -212, 217, 221, 100, -213, 218, 222, 100, -213, 218, 222, 100, -213, 218, 222, 100, -213, 218, 222, 100, -214, 219, 223, 100, -215, 220, 224, 100, -216, 221, 225, 100, -213, 216, 220, 100, -158, 139, 125, 100, -156, 128, 109, 100, -163, 135, 122, 100, -164, 136, 124, 100, -166, 136, 126, 100, -159, 124, 115, 100, -140, 102, 93, 100, -145, 112, 94, 100, -177, 145, 125, 100, -185, 153, 134, 100, -189, 158, 139, 100, -192, 159, 141, 100, -194, 161, 142, 100, -200, 167, 148, 100, -205, 172, 153, 100, -207, 174, 153, 100, -208, 176, 155, 100, -208, 176, 155, 100, -209, 176, 154, 100, -212, 176, 156, 100, -213, 178, 154, 100, -213, 178, 154, 100, -213, 177, 154, 100, -213, 175, 153, 100, -212, 174, 151, 100, -209, 172, 148, 100, -209, 172, 146, 100, -207, 169, 142, 100, -203, 166, 136, 100, -206, 169, 140, 100, -202, 164, 139, 100, -188, 150, 127, 100, -187, 149, 127, 100, -191, 152, 133, 100, -193, 155, 137, 100, -196, 158, 140, 100, -199, 161, 143, 100, -199, 162, 144, 100, -198, 163, 144, 100, -197, 165, 146, 100, -198, 165, 148, 100, -200, 165, 149, 100, -200, 167, 151, 100, -201, 168, 153, 100, -201, 168, 155, 100, -199, 168, 157, 100, -199, 166, 159, 100, -186, 148, 140, 100, -169, 120, 112, 100, -168, 111, 99, 100, -163, 103, 85, 100, -161, 107, 86, 100, -178, 136, 114, 100, -176, 138, 121, 100, -163, 124, 109, 100, -150, 110, 99, 100, -134, 93, 84, 100, -106, 71, 62, 100, -47, 27, 27, 100, -23, 13, 17, 100, -10, 4, 7, 100, -6, 1, 4, 100, -36, 15, 13, 100, -93, 48, 36, 100, -109, 57, 40, 100, -117, 65, 47, 100, -124, 72, 53, 100, -128, 75, 57, 100, -132, 79, 60, 100, -135, 84, 67, 100, -193, 189, 175, 100, -193, 189, 177, 100, -192, 188, 176, 100, -193, 189, 177, 100, -193, 189, 177, 100, -194, 191, 179, 100, -194, 190, 178, 100, -194, 190, 178, 100, -197, 193, 181, 100, -198, 194, 182, 100, -199, 195, 183, 100, -200, 196, 184, 100, -200, 197, 187, 100, -199, 200, 187, 100, -200, 200, 188, 100, -201, 201, 191, 100, -201, 201, 193, 100, -203, 203, 195, 100, -203, 203, 195, 100, -204, 204, 196, 100, -204, 204, 195, 100, -204, 204, 197, 100, -205, 204, 199, 100, -204, 204, 199, 100, -204, 205, 199, 100, -205, 206, 200, 100, -205, 206, 200, 100, -206, 206, 203, 100, -207, 207, 207, 100, -209, 209, 209, 100, -210, 210, 210, 100, -210, 211, 210, 100, -210, 211, 210, 100, -208, 212, 211, 100, -208, 214, 213, 100, -208, 214, 214, 100, -208, 214, 214, 100, -209, 215, 215, 100, -210, 216, 216, 100, -211, 217, 216, 100, -211, 217, 218, 100, -211, 216, 220, 100, -212, 217, 221, 100, -213, 218, 222, 100, -213, 218, 222, 100, -213, 218, 222, 100, -213, 218, 222, 100, -214, 219, 223, 100, -216, 222, 226, 100, -207, 208, 210, 100, -149, 128, 113, 100, -154, 126, 112, 100, -158, 130, 119, 100, -159, 131, 121, 100, -159, 128, 122, 100, -148, 114, 106, 100, -122, 84, 77, 100, -143, 109, 93, 100, -174, 142, 122, 100, -178, 146, 129, 100, -185, 152, 136, 100, -187, 154, 137, 100, -192, 159, 140, 100, -197, 168, 149, 100, -202, 171, 153, 100, -206, 173, 155, 100, -208, 175, 157, 100, -208, 175, 156, 100, -209, 176, 158, 100, -210, 176, 157, 100, -212, 177, 157, 100, -211, 177, 158, 100, -211, 178, 158, 100, -211, 176, 155, 100, -209, 174, 155, 100, -208, 171, 152, 100, -207, 170, 150, 100, -205, 168, 146, 100, -202, 165, 142, 100, -205, 168, 143, 100, -196, 158, 136, 100, -185, 147, 126, 100, -186, 148, 130, 100, -190, 152, 137, 100, -193, 155, 140, 100, -193, 157, 142, 100, -194, 160, 144, 100, -194, 162, 144, 100, -195, 161, 145, 100, -195, 161, 145, 100, -195, 161, 149, 100, -197, 162, 151, 100, -198, 165, 154, 100, -198, 165, 156, 100, -197, 166, 157, 100, -195, 164, 157, 100, -193, 162, 159, 100, -177, 142, 140, 100, -152, 105, 107, 100, -150, 90, 94, 100, -155, 84, 82, 100, -144, 74, 61, 100, -147, 92, 73, 100, -169, 129, 111, 100, -158, 119, 107, 100, -141, 102, 93, 100, -122, 85, 75, 100, -96, 65, 56, 100, -42, 25, 22, 100, -23, 12, 14, 100, -13, 4, 7, 100, -12, 4, 7, 100, -10, 2, 4, 100, -40, 17, 12, 100, -87, 45, 31, 100, -104, 55, 37, 100, -114, 65, 46, 100, -121, 69, 50, 100, -124, 72, 51, 100, -130, 77, 57, 100, -193, 188, 174, 100, -192, 189, 175, 100, -192, 188, 176, 100, -192, 188, 176, 100, -193, 189, 177, 100, -194, 190, 178, 100, -194, 190, 178, 100, -195, 191, 179, 100, -197, 193, 181, 100, -198, 194, 182, 100, -199, 195, 183, 100, -199, 195, 183, 100, -199, 196, 183, 100, -199, 199, 186, 100, -199, 199, 189, 100, -200, 200, 190, 100, -201, 201, 191, 100, -202, 202, 194, 100, -203, 203, 195, 100, -204, 204, 196, 100, -204, 204, 195, 100, -204, 203, 196, 100, -204, 204, 199, 100, -204, 204, 199, 100, -204, 205, 199, 100, -204, 205, 200, 100, -205, 206, 200, 100, -207, 208, 202, 100, -208, 209, 205, 100, -209, 209, 206, 100, -209, 209, 208, 100, -209, 211, 210, 100, -206, 211, 209, 100, -205, 211, 210, 100, -206, 212, 213, 100, -207, 213, 213, 100, -209, 215, 215, 100, -209, 215, 215, 100, -209, 215, 215, 100, -210, 216, 216, 100, -211, 216, 217, 100, -211, 216, 219, 100, -211, 216, 220, 100, -212, 217, 221, 100, -213, 218, 223, 100, -213, 218, 223, 100, -213, 218, 222, 100, -213, 217, 221, 100, -216, 222, 227, 100, -201, 200, 201, 100, -143, 119, 104, 100, -153, 124, 112, 100, -154, 126, 117, 100, -155, 127, 121, 100, -153, 124, 120, 100, -138, 106, 103, 100, -110, 72, 70, 100, -134, 100, 88, 100, -164, 134, 117, 100, -168, 138, 126, 100, -178, 144, 131, 100, -184, 151, 134, 100, -192, 160, 144, 100, -196, 167, 152, 100, -197, 168, 156, 100, -202, 173, 161, 100, -203, 172, 161, 100, -205, 173, 159, 100, -206, 174, 158, 100, -206, 175, 159, 100, -207, 176, 160, 100, -209, 177, 162, 100, -208, 175, 159, 100, -207, 174, 158, 100, -204, 171, 156, 100, -200, 166, 149, 100, -198, 165, 146, 100, -194, 161, 144, 100, -193, 159, 143, 100, -198, 164, 147, 100, -187, 151, 134, 100, -178, 139, 123, 100, -179, 143, 128, 100, -183, 147, 134, 100, -187, 152, 140, 100, -188, 153, 141, 100, -187, 153, 140, 100, -189, 155, 144, 100, -190, 156, 145, 100, -192, 158, 148, 100, -193, 160, 150, 100, -193, 160, 153, 100, -193, 161, 153, 100, -190, 159, 154, 100, -190, 159, 155, 100, -188, 157, 153, 100, -185, 154, 151, 100, -176, 145, 143, 100, -155, 115, 116, 100, -127, 78, 83, 100, -115, 52, 60, 100, -111, 45, 45, 100, -118, 63, 55, 100, -151, 109, 95, 100, -152, 112, 103, 100, -129, 94, 85, 100, -112, 79, 69, 100, -89, 60, 50, 100, -46, 27, 24, 100, -29, 14, 17, 100, -20, 8, 11, 100, -16, 5, 8, 100, -19, 7, 10, 100, -21, 8, 5, 100, -48, 22, 13, 100, -81, 41, 28, 100, -92, 45, 26, 100, -110, 59, 39, 100, -116, 65, 44, 100, -120, 68, 47, 100, -191, 188, 172, 100, -191, 188, 173, 100, -191, 187, 174, 100, -191, 187, 175, 100, -192, 188, 176, 100, -194, 190, 178, 100, -194, 190, 178, 100, -194, 190, 178, 100, -196, 192, 180, 100, -197, 193, 181, 100, -198, 194, 182, 100, -199, 195, 183, 100, -200, 196, 184, 100, -202, 197, 188, 100, -199, 199, 189, 100, -200, 200, 190, 100, -200, 200, 190, 100, -201, 201, 193, 100, -202, 202, 194, 100, -203, 203, 195, 100, -203, 203, 196, 100, -204, 204, 196, 100, -204, 205, 198, 100, -203, 205, 199, 100, -204, 205, 199, 100, -204, 205, 199, 100, -205, 206, 200, 100, -206, 207, 201, 100, -207, 208, 202, 100, -207, 208, 205, 100, -208, 208, 208, 100, -208, 210, 209, 100, -205, 211, 209, 100, -206, 212, 211, 100, -206, 212, 213, 100, -207, 213, 213, 100, -208, 214, 214, 100, -209, 215, 215, 100, -209, 215, 215, 100, -209, 215, 215, 100, -210, 216, 216, 100, -210, 216, 218, 100, -211, 216, 220, 100, -212, 217, 221, 100, -212, 217, 222, 100, -212, 217, 222, 100, -213, 218, 222, 100, -212, 217, 221, 100, -217, 223, 229, 100, -195, 194, 193, 100, -138, 113, 99, 100, -149, 122, 108, 100, -153, 125, 116, 100, -155, 127, 121, 100, -152, 123, 118, 100, -138, 106, 104, 100, -113, 78, 76, 100, -128, 93, 86, 100, -152, 122, 110, 100, -161, 131, 120, 100, -161, 125, 109, 100, -168, 132, 116, 100, -187, 157, 146, 100, -188, 158, 147, 100, -190, 160, 150, 100, -196, 166, 156, 100, -198, 168, 158, 100, -199, 170, 159, 100, -201, 172, 160, 100, -201, 172, 161, 100, -201, 172, 161, 100, -203, 173, 161, 100, -203, 169, 158, 100, -200, 166, 156, 100, -196, 162, 150, 100, -191, 157, 143, 100, -187, 154, 137, 100, -184, 150, 137, 100, -190, 156, 145, 100, -195, 162, 150, 100, -184, 148, 137, 100, -171, 132, 120, 100, -173, 137, 125, 100, -177, 143, 131, 100, -181, 147, 136, 100, -182, 149, 137, 100, -184, 150, 140, 100, -187, 153, 143, 100, -187, 152, 143, 100, -187, 155, 147, 100, -186, 156, 149, 100, -186, 155, 152, 100, -186, 156, 152, 100, -186, 155, 152, 100, -183, 152, 149, 100, -182, 151, 148, 100, -179, 148, 145, 100, -172, 141, 139, 100, -162, 131, 130, 100, -143, 104, 108, 100, -123, 78, 84, 100, -108, 62, 64, 100, -117, 73, 74, 100, -138, 98, 95, 100, -134, 97, 92, 100, -116, 81, 75, 100, -101, 70, 60, 100, -82, 54, 47, 100, -51, 33, 27, 100, -37, 23, 22, 100, -31, 17, 18, 100, -26, 13, 13, 100, -33, 17, 15, 100, -44, 24, 19, 100, -56, 30, 18, 100, -124, 97, 76, 100, -140, 109, 87, 100, -93, 51, 29, 100, -102, 55, 33, 100, -111, 60, 40, 100, -189, 186, 172, 100, -190, 186, 172, 100, -190, 186, 173, 100, -190, 186, 174, 100, -192, 188, 176, 100, -193, 189, 177, 100, -194, 190, 178, 100, -194, 190, 178, 100, -195, 191, 179, 100, -196, 192, 180, 100, -198, 194, 182, 100, -198, 194, 182, 100, -199, 195, 184, 100, -199, 196, 187, 100, -198, 198, 188, 100, -200, 200, 190, 100, -200, 200, 192, 100, -201, 201, 193, 100, -202, 202, 194, 100, -202, 202, 194, 100, -203, 203, 195, 100, -204, 204, 196, 100, -203, 203, 197, 100, -203, 204, 198, 100, -204, 205, 199, 100, -204, 205, 199, 100, -205, 206, 200, 100, -205, 206, 200, 100, -206, 207, 201, 100, -208, 208, 204, 100, -208, 208, 208, 100, -208, 209, 209, 100, -206, 210, 209, 100, -205, 212, 210, 100, -206, 212, 212, 100, -207, 213, 213, 100, -208, 214, 214, 100, -209, 215, 215, 100, -208, 214, 214, 100, -208, 214, 214, 100, -209, 215, 215, 100, -210, 215, 218, 100, -210, 215, 219, 100, -211, 216, 220, 100, -212, 217, 221, 100, -211, 217, 220, 100, -211, 217, 221, 100, -212, 217, 220, 100, -217, 224, 228, 100, -191, 189, 188, 100, -136, 109, 95, 100, -149, 121, 107, 100, -155, 127, 116, 100, -161, 133, 124, 100, -159, 130, 124, 100, -154, 123, 119, 100, -132, 96, 95, 100, -123, 88, 82, 100, -147, 115, 104, 100, -151, 118, 105, 100, -143, 93, 83, 100, -154, 107, 103, 100, -172, 141, 138, 100, -179, 148, 143, 100, -185, 154, 148, 100, -189, 158, 152, 100, -192, 162, 155, 100, -194, 165, 158, 100, -195, 166, 160, 100, -196, 166, 161, 100, -198, 167, 161, 100, -196, 166, 156, 100, -195, 162, 153, 100, -193, 158, 149, 100, -190, 156, 145, 100, -186, 153, 138, 100, -183, 149, 132, 100, -189, 155, 141, 100, -199, 165, 153, 100, -198, 164, 152, 100, -190, 156, 144, 100, -173, 134, 124, 100, -168, 128, 118, 100, -174, 136, 126, 100, -178, 142, 131, 100, -180, 144, 134, 100, -182, 148, 138, 100, -184, 150, 141, 100, -184, 151, 146, 100, -181, 150, 146, 100, -180, 149, 146, 100, -180, 149, 146, 100, -178, 146, 144, 100, -177, 146, 143, 100, -175, 143, 140, 100, -173, 139, 137, 100, -169, 137, 134, 100, -164, 131, 128, 100, -158, 123, 121, 100, -149, 112, 114, 100, -137, 100, 103, 100, -128, 90, 93, 100, -124, 87, 89, 100, -122, 85, 86, 100, -116, 80, 78, 100, -104, 72, 65, 100, -91, 62, 51, 100, -78, 52, 41, 100, -63, 42, 37, 100, -55, 38, 38, 100, -48, 32, 32, 100, -44, 30, 27, 100, -51, 33, 30, 100, -62, 38, 29, 100, -87, 60, 37, 100, -178, 159, 129, 100, -208, 193, 168, 100, -172, 148, 125, 100, -110, 73, 54, 100, -94, 51, 32, 100, -188, 184, 173, 100, -188, 184, 172, 100, -188, 184, 172, 100, -189, 185, 173, 100, -191, 187, 175, 100, -193, 189, 177, 100, -193, 189, 177, 100, -194, 190, 178, 100, -194, 190, 178, 100, -196, 192, 180, 100, -197, 193, 181, 100, -198, 194, 182, 100, -199, 196, 183, 100, -197, 198, 186, 100, -197, 197, 188, 100, -199, 199, 189, 100, -200, 200, 191, 100, -200, 200, 192, 100, -201, 201, 193, 100, -202, 202, 194, 100, -203, 203, 195, 100, -203, 203, 195, 100, -204, 203, 197, 100, -204, 203, 198, 100, -204, 205, 199, 100, -204, 205, 199, 100, -204, 205, 199, 100, -205, 206, 200, 100, -206, 207, 201, 100, -207, 207, 203, 100, -208, 208, 206, 100, -208, 210, 208, 100, -205, 211, 209, 100, -204, 210, 208, 100, -206, 211, 210, 100, -207, 213, 212, 100, -207, 213, 214, 100, -208, 214, 214, 100, -208, 214, 214, 100, -208, 214, 213, 100, -208, 214, 215, 100, -209, 214, 218, 100, -209, 214, 218, 100, -210, 215, 219, 100, -211, 215, 220, 100, -210, 217, 221, 100, -209, 217, 220, 100, -211, 216, 220, 100, -216, 223, 228, 100, -190, 187, 185, 100, -136, 107, 91, 100, -152, 123, 109, 100, -162, 134, 120, 100, -170, 142, 128, 100, -171, 142, 131, 100, -169, 139, 130, 100, -146, 112, 111, 100, -118, 84, 79, 100, -138, 106, 93, 100, -141, 96, 88, 100, -135, 70, 73, 100, -138, 90, 93, 100, -160, 126, 124, 100, -170, 138, 134, 100, -177, 146, 143, 100, -180, 149, 146, 100, -182, 153, 149, 100, -185, 156, 152, 100, -187, 157, 153, 100, -190, 160, 157, 100, -192, 161, 158, 100, -191, 160, 155, 100, -190, 157, 150, 100, -189, 155, 145, 100, -186, 152, 141, 100, -185, 151, 135, 100, -189, 154, 137, 100, -198, 164, 150, 100, -204, 170, 159, 100, -204, 170, 157, 100, -195, 161, 148, 100, -180, 142, 131, 100, -168, 128, 117, 100, -171, 132, 118, 100, -178, 138, 125, 100, -179, 141, 132, 100, -179, 142, 135, 100, -180, 145, 140, 100, -180, 146, 143, 100, -178, 146, 144, 100, -176, 144, 142, 100, -173, 140, 138, 100, -171, 137, 135, 100, -168, 132, 131, 100, -164, 129, 127, 100, -161, 126, 124, 100, -158, 122, 120, 100, -153, 115, 114, 100, -149, 109, 110, 100, -141, 101, 105, 100, -131, 94, 96, 100, -127, 91, 94, 100, -118, 82, 83, 100, -109, 74, 72, 100, -105, 69, 68, 100, -96, 64, 59, 100, -88, 58, 48, 100, -80, 54, 44, 100, -73, 51, 47, 100, -70, 50, 50, 100, -67, 50, 50, 100, -68, 49, 47, 100, -70, 50, 44, 100, -78, 51, 38, 100, -121, 94, 70, 100, -196, 180, 154, 100, -193, 178, 153, 100, -205, 191, 165, 100, -194, 175, 151, 100, -132, 102, 82, 100, -187, 183, 171, 100, -187, 183, 170, 100, -187, 183, 171, 100, -188, 184, 172, 100, -191, 187, 175, 100, -192, 188, 176, 100, -193, 189, 177, 100, -194, 190, 178, 100, -194, 190, 178, 100, -195, 191, 179, 100, -197, 193, 182, 100, -197, 193, 183, 100, -199, 194, 184, 100, -198, 196, 187, 100, -197, 197, 187, 100, -198, 198, 188, 100, -198, 198, 189, 100, -199, 199, 191, 100, -200, 200, 192, 100, -201, 201, 193, 100, -202, 202, 194, 100, -203, 203, 195, 100, -203, 202, 196, 100, -202, 202, 197, 100, -203, 204, 198, 100, -204, 205, 199, 100, -204, 205, 199, 100, -204, 205, 199, 100, -205, 205, 201, 100, -206, 206, 204, 100, -207, 207, 205, 100, -205, 209, 207, 100, -203, 209, 207, 100, -204, 210, 208, 100, -206, 212, 210, 100, -206, 212, 210, 100, -208, 212, 212, 100, -207, 214, 214, 100, -207, 213, 213, 100, -207, 213, 213, 100, -207, 213, 213, 100, -209, 215, 216, 100, -209, 214, 218, 100, -210, 215, 219, 100, -209, 215, 219, 100, -208, 216, 220, 100, -208, 216, 219, 100, -209, 215, 218, 100, -215, 222, 227, 100, -189, 187, 184, 100, -135, 108, 88, 100, -156, 127, 107, 100, -170, 141, 122, 100, -175, 146, 130, 100, -175, 145, 133, 100, -174, 144, 134, 100, -148, 117, 115, 100, -112, 80, 83, 100, -123, 91, 83, 100, -121, 76, 67, 100, -107, 49, 52, 100, -134, 93, 92, 100, -157, 121, 119, 100, -159, 127, 124, 100, -164, 133, 131, 100, -169, 136, 133, 100, -173, 141, 138, 100, -178, 147, 144, 100, -180, 150, 146, 100, -184, 153, 150, 100, -187, 154, 152, 100, -187, 154, 152, 100, -187, 152, 145, 100, -187, 151, 141, 100, -186, 149, 138, 100, -187, 151, 135, 100, -195, 160, 143, 100, -203, 170, 152, 100, -207, 173, 160, 100, -206, 172, 158, 100, -200, 165, 147, 100, -189, 151, 135, 100, -176, 137, 121, 100, -172, 133, 116, 100, -172, 133, 119, 100, -175, 134, 127, 100, -174, 133, 127, 100, -171, 133, 129, 100, -169, 132, 130, 100, -169, 131, 130, 100, -166, 129, 128, 100, -163, 126, 124, 100, -162, 122, 121, 100, -157, 117, 116, 100, -152, 113, 111, 100, -148, 109, 107, 100, -145, 104, 104, 100, -140, 98, 99, 100, -136, 94, 97, 100, -130, 88, 91, 100, -124, 82, 84, 100, -118, 78, 77, 100, -110, 73, 72, 100, -103, 68, 67, 100, -99, 64, 59, 100, -99, 66, 58, 100, -98, 67, 56, 100, -87, 58, 53, 100, -80, 56, 50, 100, -77, 56, 54, 100, -77, 56, 56, 100, -81, 59, 57, 100, -87, 61, 53, 100, -93, 64, 43, 100, -159, 136, 111, 100, -200, 187, 163, 100, -193, 181, 158, 100, -196, 183, 161, 100, -202, 189, 166, 100, -205, 191, 167, 100, -186, 181, 169, 100, -187, 182, 169, 100, -186, 183, 170, 100, -187, 183, 171, 100, -189, 185, 173, 100, -191, 187, 175, 100, -192, 188, 176, 100, -193, 189, 177, 100, -193, 189, 177, 100, -194, 190, 178, 100, -196, 192, 182, 100, -197, 193, 185, 100, -198, 194, 184, 100, -197, 195, 184, 100, -195, 196, 186, 100, -197, 197, 187, 100, -198, 198, 188, 100, -198, 198, 190, 100, -199, 199, 191, 100, -200, 200, 192, 100, -200, 200, 192, 100, -201, 201, 193, 100, -202, 202, 196, 100, -202, 203, 197, 100, -203, 204, 197, 100, -203, 204, 199, 100, -204, 204, 199, 100, -204, 205, 199, 100, -204, 205, 200, 100, -205, 205, 203, 100, -204, 207, 204, 100, -203, 207, 206, 100, -203, 209, 207, 100, -204, 209, 207, 100, -204, 210, 208, 100, -205, 211, 209, 100, -207, 211, 211, 100, -206, 212, 212, 100, -207, 212, 212, 100, -207, 212, 212, 100, -206, 212, 212, 100, -207, 213, 213, 100, -208, 213, 216, 100, -209, 213, 218, 100, -209, 214, 218, 100, -207, 215, 218, 100, -207, 215, 218, 100, -207, 214, 217, 100, -213, 220, 226, 100, -190, 187, 186, 100, -136, 109, 88, 100, -159, 131, 105, 100, -171, 143, 122, 100, -176, 147, 132, 100, -176, 146, 136, 100, -175, 145, 135, 100, -151, 119, 118, 100, -114, 83, 90, 100, -100, 67, 68, 100, -122, 83, 74, 100, -120, 77, 74, 100, -143, 105, 101, 100, -150, 113, 108, 100, -152, 117, 113, 100, -156, 122, 119, 100, -162, 124, 121, 100, -167, 130, 128, 100, -170, 134, 133, 100, -167, 132, 131, 100, -165, 129, 129, 100, -164, 126, 127, 100, -167, 128, 126, 100, -171, 132, 127, 100, -177, 138, 129, 100, -181, 142, 130, 100, -191, 155, 140, 100, -202, 168, 151, 100, -206, 172, 158, 100, -206, 172, 160, 100, -203, 168, 153, 100, -201, 164, 146, 100, -191, 152, 134, 100, -177, 139, 119, 100, -171, 133, 111, 100, -172, 133, 112, 100, -174, 135, 118, 100, -171, 133, 116, 100, -170, 130, 118, 100, -168, 128, 119, 100, -163, 123, 114, 100, -160, 120, 113, 100, -155, 115, 110, 100, -150, 109, 103, 100, -145, 103, 98, 100, -138, 96, 90, 100, -135, 93, 87, 100, -130, 88, 84, 100, -125, 82, 81, 100, -122, 80, 79, 100, -118, 77, 77, 100, -116, 74, 73, 100, -111, 70, 67, 100, -106, 67, 62, 100, -102, 66, 60, 100, -105, 69, 61, 100, -115, 80, 69, 100, -115, 81, 68, 100, -91, 62, 53, 100, -85, 60, 54, 100, -83, 61, 57, 100, -83, 60, 59, 100, -87, 63, 59, 100, -95, 67, 57, 100, -113, 85, 62, 100, -186, 169, 144, 100, -195, 183, 163, 100, -194, 183, 163, 100, -198, 186, 169, 100, -197, 185, 168, 100, -199, 188, 169, 100, -184, 180, 168, 100, -185, 181, 169, 100, -185, 181, 169, 100, -186, 182, 170, 100, -189, 185, 173, 100, -190, 186, 174, 100, -190, 186, 174, 100, -192, 188, 176, 100, -193, 189, 177, 100, -194, 190, 178, 100, -195, 191, 181, 100, -196, 192, 184, 100, -197, 193, 184, 100, -195, 194, 184, 100, -195, 195, 185, 100, -196, 196, 186, 100, -198, 198, 188, 100, -198, 198, 189, 100, -200, 200, 192, 100, -200, 200, 192, 100, -199, 200, 192, 100, -201, 201, 193, 100, -202, 202, 195, 100, -202, 203, 197, 100, -203, 204, 198, 100, -202, 203, 198, 100, -203, 204, 198, 100, -204, 205, 199, 100, -204, 205, 199, 100, -204, 205, 200, 100, -205, 205, 201, 100, -205, 206, 203, 100, -205, 209, 206, 100, -206, 210, 207, 100, -207, 211, 209, 100, -206, 212, 211, 100, -207, 212, 212, 100, -208, 213, 212, 100, -207, 214, 213, 100, -207, 216, 214, 100, -207, 216, 215, 100, -207, 213, 213, 100, -207, 213, 213, 100, -207, 212, 216, 100, -209, 213, 217, 100, -207, 214, 217, 100, -206, 214, 217, 100, -206, 213, 217, 100, -212, 219, 224, 100, -189, 187, 188, 100, -139, 112, 89, 100, -159, 133, 103, 100, -170, 142, 120, 100, -175, 146, 129, 100, -175, 146, 134, 100, -173, 143, 134, 100, -148, 117, 115, 100, -119, 88, 94, 100, -83, 51, 60, 100, -111, 75, 68, 100, -135, 95, 86, 100, -137, 97, 90, 100, -142, 102, 96, 100, -146, 106, 101, 100, -149, 109, 103, 100, -145, 104, 100, 100, -139, 99, 94, 100, -142, 102, 96, 100, -149, 110, 100, 100, -157, 118, 104, 100, -166, 128, 111, 100, -174, 135, 117, 100, -179, 141, 120, 100, -182, 144, 124, 100, -188, 150, 131, 100, -197, 160, 143, 100, -200, 166, 149, 100, -202, 169, 155, 100, -198, 163, 151, 100, -189, 153, 135, 100, -188, 150, 129, 100, -186, 148, 122, 100, -183, 144, 116, 100, -184, 145, 117, 100, -185, 145, 117, 100, -188, 148, 122, 100, -188, 148, 126, 100, -186, 147, 128, 100, -186, 147, 129, 100, -186, 146, 128, 100, -183, 142, 125, 100, -179, 138, 122, 100, -174, 134, 115, 100, -169, 128, 109, 100, -161, 119, 100, 100, -152, 109, 91, 100, -145, 100, 83, 100, -136, 92, 77, 100, -129, 85, 74, 100, -120, 79, 70, 100, -117, 75, 66, 100, -120, 79, 68, 100, -121, 81, 69, 100, -122, 82, 70, 100, -122, 82, 71, 100, -125, 86, 73, 100, -118, 83, 68, 100, -95, 65, 57, 100, -90, 63, 57, 100, -89, 63, 58, 100, -89, 62, 59, 100, -92, 65, 59, 100, -96, 68, 54, 100, -139, 116, 92, 100, -196, 185, 162, 100, -193, 181, 165, 100, -196, 185, 171, 100, -199, 187, 175, 100, -200, 188, 175, 100, -200, 188, 174, 100, -182, 178, 166, 100, -183, 179, 167, 100, -184, 180, 168, 100, -186, 182, 170, 100, -188, 184, 172, 100, -189, 185, 173, 100, -189, 185, 173, 100, -191, 187, 175, 100, -193, 189, 177, 100, -194, 190, 177, 100, -194, 190, 179, 100, -195, 192, 182, 100, -196, 193, 184, 100, -194, 194, 184, 100, -195, 195, 185, 100, -196, 196, 186, 100, -197, 197, 187, 100, -198, 198, 189, 100, -199, 199, 191, 100, -199, 199, 191, 100, -200, 200, 192, 100, -200, 200, 192, 100, -202, 202, 194, 100, -202, 203, 195, 100, -202, 203, 197, 100, -202, 203, 197, 100, -203, 204, 198, 100, -203, 204, 199, 100, -204, 204, 200, 100, -204, 205, 199, 100, -207, 210, 204, 100, -207, 210, 204, 100, -206, 204, 198, 100, -205, 199, 193, 100, -204, 197, 191, 100, -205, 197, 191, 100, -206, 198, 192, 100, -206, 200, 194, 100, -204, 195, 190, 100, -203, 184, 180, 100, -204, 188, 183, 100, -210, 212, 211, 100, -206, 212, 212, 100, -207, 212, 212, 100, -207, 212, 215, 100, -206, 214, 217, 100, -207, 213, 217, 100, -207, 211, 216, 100, -212, 218, 223, 100, -188, 186, 184, 100, -142, 114, 89, 100, -158, 129, 102, 100, -170, 141, 121, 100, -172, 143, 127, 100, -173, 143, 132, 100, -170, 140, 132, 100, -145, 114, 113, 100, -122, 89, 97, 100, -89, 58, 68, 100, -79, 45, 44, 100, -128, 88, 75, 100, -134, 94, 83, 100, -134, 94, 83, 100, -127, 88, 77, 100, -124, 84, 75, 100, -138, 99, 85, 100, -162, 124, 104, 100, -178, 139, 120, 100, -189, 151, 128, 100, -195, 157, 132, 100, -199, 162, 137, 100, -202, 165, 137, 100, -203, 165, 134, 100, -201, 162, 129, 100, -198, 159, 129, 100, -196, 158, 130, 100, -197, 159, 133, 100, -201, 165, 142, 100, -198, 161, 137, 100, -188, 148, 120, 100, -191, 152, 122, 100, -194, 155, 124, 100, -192, 152, 121, 100, -189, 150, 119, 100, -187, 149, 119, 100, -186, 146, 120, 100, -183, 142, 120, 100, -177, 139, 121, 100, -174, 137, 119, 100, -176, 135, 119, 100, -178, 138, 122, 100, -180, 138, 122, 100, -181, 139, 122, 100, -183, 142, 121, 100, -183, 142, 120, 100, -183, 141, 118, 100, -178, 135, 110, 100, -175, 129, 103, 100, -168, 122, 97, 100, -157, 113, 92, 100, -150, 106, 83, 100, -146, 102, 78, 100, -144, 100, 78, 100, -141, 98, 78, 100, -134, 94, 74, 100, -129, 91, 70, 100, -114, 79, 64, 100, -96, 66, 57, 100, -95, 66, 57, 100, -91, 63, 55, 100, -91, 63, 57, 100, -94, 67, 58, 100, -101, 74, 57, 100, -165, 149, 126, 100, -197, 186, 170, 100, -195, 183, 171, 100, -197, 187, 178, 100, -197, 189, 180, 100, -198, 188, 179, 100, -200, 188, 178, 100, -181, 178, 162, 100, -181, 178, 164, 100, -182, 178, 167, 100, -184, 180, 168, 100, -187, 183, 171, 100, -188, 184, 172, 100, -189, 185, 173, 100, -190, 186, 174, 100, -192, 188, 176, 100, -193, 189, 177, 100, -194, 190, 178, 100, -194, 192, 179, 100, -196, 193, 183, 100, -194, 194, 184, 100, -195, 195, 185, 100, -196, 196, 185, 100, -196, 196, 186, 100, -198, 198, 189, 100, -199, 199, 191, 100, -199, 199, 191, 100, -199, 199, 191, 100, -200, 200, 192, 100, -200, 200, 192, 100, -200, 201, 193, 100, -200, 201, 195, 100, -201, 202, 196, 100, -202, 203, 197, 100, -203, 204, 198, 100, -203, 205, 199, 100, -205, 208, 201, 100, -199, 183, 175, 100, -193, 159, 151, 100, -190, 144, 136, 100, -188, 139, 129, 100, -186, 140, 128, 100, -189, 144, 131, 100, -191, 148, 136, 100, -189, 148, 138, 100, -193, 148, 140, 100, -191, 131, 125, 100, -172, 98, 85, 100, -196, 173, 168, 100, -212, 223, 224, 100, -207, 214, 214, 100, -207, 214, 215, 100, -206, 210, 214, 100, -206, 210, 214, 100, -206, 210, 214, 100, -212, 218, 223, 100, -176, 171, 162, 100, -144, 113, 83, 100, -160, 129, 101, 100, -171, 139, 119, 100, -170, 141, 124, 100, -171, 141, 130, 100, -166, 135, 129, 100, -141, 109, 112, 100, -123, 89, 98, 100, -94, 61, 73, 100, -78, 45, 44, 100, -129, 90, 74, 100, -129, 90, 75, 100, -121, 82, 66, 100, -132, 92, 74, 100, -157, 118, 95, 100, -175, 135, 111, 100, -180, 139, 117, 100, -180, 139, 117, 100, -179, 138, 118, 100, -181, 141, 118, 100, -183, 144, 120, 100, -188, 150, 124, 100, -196, 157, 130, 100, -203, 165, 134, 100, -205, 166, 133, 100, -203, 164, 131, 100, -203, 164, 130, 100, -197, 158, 124, 100, -186, 147, 113, 100, -189, 149, 117, 100, -191, 152, 121, 100, -190, 151, 120, 100, -189, 149, 119, 100, -190, 149, 118, 100, -190, 150, 120, 100, -188, 148, 119, 100, -184, 144, 114, 100, -178, 138, 112, 100, -171, 131, 104, 100, -165, 123, 102, 100, -161, 119, 104, 100, -158, 115, 100, 100, -157, 114, 100, 100, -160, 116, 101, 100, -163, 120, 104, 100, -167, 123, 105, 100, -168, 125, 104, 100, -168, 123, 101, 100, -166, 120, 95, 100, -165, 119, 93, 100, -161, 115, 89, 100, -156, 109, 82, 100, -150, 104, 78, 100, -142, 98, 73, 100, -139, 97, 71, 100, -138, 99, 73, 100, -120, 81, 65, 100, -100, 66, 56, 100, -99, 69, 58, 100, -93, 65, 55, 100, -93, 64, 56, 100, -96, 68, 55, 100, -114, 89, 68, 100, -184, 171, 153, 100, -194, 184, 174, 100, -194, 185, 178, 100, -196, 188, 183, 100, -197, 190, 185, 100, -198, 189, 183, 100, -198, 188, 180, 100, -180, 177, 162, 100, -181, 178, 163, 100, -182, 178, 166, 100, -183, 179, 167, 100, -185, 181, 169, 100, -186, 182, 170, 100, -188, 184, 172, 100, -190, 186, 174, 100, -191, 187, 175, 100, -193, 189, 177, 100, -194, 190, 178, 100, -194, 190, 178, 100, -195, 191, 179, 100, -194, 193, 182, 100, -193, 193, 184, 100, -194, 194, 184, 100, -195, 195, 185, 100, -196, 196, 186, 100, -197, 197, 188, 100, -197, 197, 189, 100, -198, 198, 190, 100, -199, 199, 191, 100, -199, 199, 191, 100, -199, 200, 192, 100, -200, 201, 195, 100, -201, 202, 196, 100, -200, 201, 195, 100, -201, 203, 197, 100, -203, 204, 197, 100, -186, 152, 148, 100, -180, 123, 117, 100, -183, 127, 119, 100, -186, 131, 122, 100, -186, 135, 125, 100, -190, 141, 130, 100, -194, 150, 140, 100, -194, 150, 141, 100, -194, 150, 143, 100, -191, 134, 130, 100, -167, 92, 87, 100, -150, 72, 59, 100, -182, 141, 130, 100, -206, 196, 191, 100, -200, 193, 188, 100, -205, 204, 201, 100, -208, 214, 217, 100, -205, 212, 216, 100, -205, 209, 214, 100, -208, 211, 215, 100, -157, 138, 118, 100, -147, 113, 80, 100, -160, 127, 100, 100, -170, 136, 116, 100, -170, 137, 121, 100, -169, 137, 126, 100, -158, 127, 122, 100, -135, 103, 106, 100, -120, 88, 94, 100, -92, 60, 68, 100, -87, 53, 47, 100, -133, 94, 75, 100, -136, 98, 79, 100, -149, 110, 88, 100, -159, 118, 96, 100, -159, 118, 95, 100, -158, 117, 95, 100, -159, 118, 94, 100, -166, 126, 99, 100, -170, 131, 102, 100, -176, 137, 105, 100, -180, 142, 108, 100, -184, 145, 112, 100, -189, 150, 118, 100, -194, 156, 124, 100, -199, 160, 127, 100, -199, 160, 127, 100, -195, 156, 120, 100, -188, 149, 112, 100, -186, 146, 111, 100, -187, 149, 114, 100, -188, 149, 117, 100, -190, 151, 120, 100, -192, 152, 122, 100, -194, 152, 123, 100, -193, 153, 122, 100, -194, 155, 123, 100, -195, 156, 124, 100, -193, 154, 120, 100, -191, 149, 113, 100, -189, 145, 111, 100, -181, 137, 108, 100, -173, 130, 100, 100, -169, 124, 96, 100, -164, 118, 95, 100, -161, 115, 95, 100, -161, 115, 95, 100, -160, 115, 91, 100, -160, 113, 90, 100, -158, 111, 86, 100, -156, 109, 83, 100, -153, 106, 81, 100, -148, 101, 75, 100, -144, 97, 72, 100, -143, 97, 70, 100, -143, 98, 71, 100, -144, 103, 75, 100, -127, 88, 67, 100, -105, 71, 55, 100, -103, 72, 59, 100, -99, 71, 58, 100, -97, 70, 58, 100, -96, 68, 52, 100, -136, 113, 93, 100, -193, 182, 170, 100, -192, 184, 177, 100, -196, 188, 186, 100, -197, 190, 189, 100, -197, 191, 190, 100, -197, 190, 185, 100, -198, 190, 184, 100, -179, 176, 161, 100, -180, 177, 161, 100, -181, 177, 164, 100, -182, 178, 166, 100, -185, 181, 169, 100, -186, 182, 170, 100, -188, 184, 172, 100, -190, 186, 174, 100, -190, 186, 174, 100, -192, 188, 176, 100, -194, 190, 178, 100, -194, 190, 178, 100, -195, 190, 178, 100, -194, 191, 179, 100, -192, 192, 181, 100, -194, 194, 184, 100, -195, 195, 185, 100, -196, 196, 186, 100, -196, 196, 186, 100, -196, 196, 187, 100, -197, 197, 189, 100, -198, 198, 190, 100, -198, 198, 190, 100, -198, 199, 191, 100, -199, 200, 193, 100, -198, 199, 193, 100, -198, 199, 194, 100, -202, 203, 196, 100, -179, 146, 145, 100, -171, 109, 110, 100, -179, 120, 120, 100, -179, 125, 124, 100, -179, 128, 125, 100, -181, 134, 131, 100, -186, 140, 138, 100, -190, 146, 142, 100, -192, 150, 148, 100, -189, 138, 137, 100, -156, 89, 85, 100, -140, 67, 61, 100, -177, 121, 112, 100, -189, 140, 128, 100, -187, 138, 125, 100, -187, 141, 124, 100, -185, 139, 121, 100, -195, 168, 159, 100, -207, 203, 202, 100, -211, 219, 223, 100, -184, 179, 174, 100, -145, 111, 80, 100, -152, 115, 85, 100, -161, 125, 99, 100, -168, 133, 111, 100, -171, 135, 118, 100, -168, 134, 123, 100, -156, 122, 118, 100, -132, 98, 99, 100, -114, 82, 86, 100, -85, 54, 59, 100, -89, 54, 47, 100, -142, 103, 82, 100, -152, 111, 87, 100, -154, 113, 89, 100, -153, 114, 87, 100, -157, 117, 90, 100, -163, 122, 92, 100, -171, 131, 95, 100, -179, 139, 104, 100, -184, 145, 108, 100, -188, 150, 111, 100, -191, 154, 115, 100, -192, 154, 116, 100, -193, 154, 119, 100, -193, 154, 121, 100, -194, 156, 120, 100, -193, 155, 118, 100, -190, 152, 115, 100, -189, 152, 115, 100, -189, 150, 117, 100, -187, 148, 115, 100, -189, 148, 117, 100, -190, 151, 121, 100, -192, 153, 124, 100, -195, 156, 127, 100, -196, 157, 128, 100, -198, 159, 130, 100, -200, 161, 133, 100, -199, 160, 131, 100, -198, 158, 127, 100, -197, 155, 124, 100, -194, 150, 117, 100, -189, 144, 107, 100, -184, 139, 100, 100, -179, 134, 95, 100, -176, 130, 96, 100, -177, 130, 101, 100, -175, 129, 99, 100, -171, 124, 95, 100, -165, 118, 90, 100, -159, 112, 85, 100, -154, 107, 79, 100, -149, 102, 74, 100, -150, 103, 76, 100, -153, 108, 79, 100, -153, 108, 77, 100, -152, 107, 76, 100, -132, 91, 67, 100, -107, 71, 53, 100, -104, 74, 56, 100, -102, 74, 56, 100, -100, 71, 54, 100, -101, 73, 54, 100, -158, 141, 124, 100, -194, 186, 177, 100, -190, 184, 183, 100, -194, 188, 190, 100, -196, 191, 192, 100, -197, 191, 193, 100, -196, 190, 189, 100, -196, 191, 186, 100, -177, 174, 159, 100, -179, 176, 161, 100, -180, 176, 163, 100, -181, 177, 165, 100, -183, 179, 167, 100, -185, 181, 169, 100, -187, 183, 171, 100, -189, 185, 173, 100, -190, 186, 174, 100, -192, 188, 176, 100, -194, 190, 178, 100, -194, 190, 178, 100, -194, 190, 178, 100, -192, 190, 179, 100, -192, 192, 182, 100, -194, 194, 184, 100, -194, 194, 184, 100, -195, 195, 185, 100, -196, 196, 186, 100, -195, 195, 187, 100, -195, 195, 187, 100, -197, 197, 189, 100, -197, 198, 190, 100, -197, 198, 190, 100, -197, 198, 190, 100, -195, 196, 190, 100, -202, 206, 199, 100, -178, 159, 155, 100, -150, 90, 97, 100, -170, 111, 117, 100, -169, 112, 118, 100, -171, 119, 123, 100, -172, 123, 126, 100, -177, 132, 135, 100, -181, 137, 140, 100, -178, 134, 135, 100, -180, 132, 135, 100, -157, 94, 98, 100, -128, 58, 57, 100, -156, 92, 94, 100, -191, 139, 138, 100, -188, 138, 132, 100, -185, 135, 125, 100, -184, 134, 121, 100, -180, 126, 105, 100, -179, 123, 99, 100, -183, 139, 120, 100, -197, 170, 158, 100, -167, 136, 115, 100, -147, 109, 77, 100, -152, 116, 86, 100, -163, 126, 101, 100, -167, 128, 107, 100, -169, 132, 115, 100, -166, 132, 119, 100, -153, 117, 114, 100, -130, 94, 94, 100, -113, 79, 82, 100, -79, 48, 52, 100, -88, 53, 43, 100, -146, 105, 81, 100, -153, 112, 86, 100, -158, 119, 90, 100, -165, 126, 96, 100, -172, 133, 97, 100, -180, 141, 102, 100, -187, 147, 110, 100, -190, 152, 116, 100, -192, 154, 119, 100, -193, 154, 120, 100, -194, 155, 121, 100, -194, 155, 122, 100, -194, 155, 122, 100, -193, 154, 121, 100, -193, 154, 120, 100, -193, 155, 121, 100, -192, 154, 118, 100, -189, 150, 115, 100, -185, 146, 113, 100, -187, 148, 116, 100, -187, 147, 117, 100, -188, 148, 119, 100, -190, 151, 122, 100, -191, 152, 126, 100, -192, 155, 129, 100, -194, 156, 131, 100, -195, 158, 132, 100, -195, 158, 129, 100, -195, 158, 129, 100, -194, 155, 125, 100, -192, 152, 122, 100, -188, 147, 115, 100, -184, 140, 103, 100, -177, 132, 92, 100, -174, 126, 89, 100, -172, 122, 87, 100, -170, 123, 90, 100, -170, 124, 90, 100, -165, 119, 88, 100, -163, 117, 85, 100, -161, 114, 84, 100, -163, 117, 84, 100, -166, 119, 86, 100, -167, 120, 90, 100, -164, 119, 86, 100, -160, 116, 80, 100, -138, 98, 69, 100, -108, 71, 53, 100, -107, 76, 56, 100, -104, 75, 56, 100, -101, 72, 53, 100, -111, 84, 63, 100, -174, 162, 149, 100, -190, 185, 180, 100, -190, 186, 188, 100, -192, 190, 194, 100, -193, 191, 194, 100, -195, 190, 194, 100, -196, 191, 193, 100, -197, 191, 190, 100, -175, 172, 156, 100, -177, 174, 159, 100, -179, 176, 162, 100, -180, 177, 164, 100, -182, 178, 166, 100, -185, 181, 169, 100, -186, 182, 170, 100, -188, 184, 172, 100, -189, 185, 173, 100, -191, 187, 175, 100, -192, 188, 176, 100, -193, 189, 177, 100, -193, 190, 177, 100, -191, 192, 179, 100, -191, 191, 181, 100, -192, 192, 182, 100, -193, 193, 183, 100, -194, 194, 184, 100, -194, 194, 186, 100, -194, 194, 187, 100, -195, 195, 187, 100, -196, 196, 188, 100, -196, 196, 188, 100, -197, 197, 189, 100, -197, 198, 191, 100, -196, 197, 191, 100, -199, 200, 193, 100, -143, 106, 108, 100, -132, 71, 81, 100, -155, 97, 110, 100, -157, 108, 119, 100, -162, 115, 124, 100, -169, 126, 136, 100, -170, 129, 142, 100, -174, 131, 147, 100, -171, 128, 138, 100, -158, 102, 110, 100, -125, 58, 62, 100, -132, 68, 75, 100, -168, 116, 124, 100, -176, 124, 128, 100, -172, 120, 120, 100, -171, 120, 118, 100, -168, 118, 114, 100, -170, 120, 109, 100, -175, 121, 104, 100, -181, 126, 106, 100, -183, 126, 104, 100, -180, 127, 101, 100, -163, 118, 92, 100, -155, 116, 88, 100, -162, 125, 99, 100, -165, 127, 105, 100, -166, 127, 112, 100, -163, 125, 113, 100, -150, 112, 108, 100, -125, 89, 89, 100, -111, 75, 79, 100, -73, 40, 44, 100, -96, 59, 47, 100, -149, 109, 82, 100, -155, 116, 88, 100, -162, 123, 92, 100, -170, 130, 98, 100, -179, 140, 105, 100, -185, 146, 112, 100, -187, 149, 116, 100, -188, 152, 120, 100, -190, 153, 122, 100, -193, 154, 123, 100, -194, 155, 125, 100, -194, 155, 125, 100, -194, 155, 125, 100, -193, 154, 123, 100, -193, 154, 121, 100, -195, 156, 125, 100, -192, 153, 123, 100, -190, 151, 119, 100, -187, 149, 118, 100, -186, 148, 118, 100, -183, 146, 116, 100, -183, 145, 116, 100, -182, 144, 115, 100, -181, 142, 119, 100, -183, 146, 123, 100, -185, 147, 125, 100, -185, 148, 125, 100, -187, 149, 125, 100, -186, 148, 121, 100, -185, 147, 118, 100, -185, 146, 117, 100, -182, 144, 113, 100, -183, 139, 107, 100, -180, 134, 101, 100, -172, 127, 88, 100, -170, 122, 84, 100, -167, 120, 82, 100, -165, 120, 83, 100, -167, 121, 87, 100, -169, 123, 89, 100, -169, 123, 89, 100, -171, 125, 90, 100, -168, 122, 86, 100, -166, 121, 84, 100, -161, 116, 82, 100, -155, 112, 80, 100, -140, 100, 74, 100, -110, 74, 55, 100, -106, 73, 54, 100, -103, 75, 55, 100, -101, 71, 52, 100, -123, 99, 79, 100, -182, 174, 164, 100, -187, 182, 182, 100, -189, 186, 192, 100, -191, 189, 196, 100, -193, 190, 198, 100, -193, 191, 197, 100, -194, 192, 194, 100, -196, 191, 194, 100, -173, 170, 152, 100, -175, 172, 157, 100, -177, 174, 159, 100, -180, 177, 162, 100, -182, 178, 166, 100, -183, 179, 167, 100, -185, 181, 169, 100, -187, 183, 171, 100, -188, 184, 172, 100, -190, 186, 174, 100, -191, 187, 175, 100, -192, 188, 176, 100, -192, 189, 177, 100, -190, 192, 177, 100, -191, 191, 180, 100, -191, 191, 181, 100, -191, 191, 181, 100, -192, 192, 182, 100, -193, 193, 184, 100, -193, 193, 185, 100, -194, 194, 186, 100, -195, 195, 187, 100, -196, 196, 188, 100, -197, 197, 189, 100, -196, 197, 189, 100, -196, 197, 190, 100, -195, 195, 187, 100, -125, 86, 90, 100, -112, 63, 77, 100, -131, 81, 94, 100, -142, 97, 110, 100, -148, 105, 120, 100, -156, 115, 134, 100, -158, 122, 143, 100, -161, 121, 144, 100, -156, 111, 128, 100, -128, 69, 73, 100, -114, 50, 57, 100, -151, 96, 110, 100, -167, 118, 132, 100, -163, 111, 121, 100, -156, 104, 111, 100, -156, 104, 109, 100, -152, 100, 103, 100, -155, 100, 101, 100, -160, 105, 96, 100, -168, 111, 99, 100, -178, 122, 104, 100, -173, 120, 99, 100, -163, 112, 88, 100, -167, 120, 94, 100, -167, 123, 97, 100, -164, 127, 104, 100, -163, 125, 109, 100, -160, 120, 108, 100, -144, 104, 100, 100, -122, 83, 82, 100, -105, 69, 71, 100, -69, 35, 36, 100, -116, 77, 58, 100, -152, 112, 82, 100, -151, 111, 81, 100, -160, 121, 89, 100, -173, 135, 102, 100, -179, 142, 111, 100, -181, 144, 115, 100, -182, 145, 116, 100, -183, 146, 118, 100, -184, 147, 118, 100, -185, 147, 118, 100, -189, 150, 122, 100, -189, 150, 121, 100, -189, 151, 122, 100, -189, 152, 123, 100, -188, 150, 122, 100, -189, 151, 123, 100, -187, 149, 121, 100, -184, 146, 116, 100, -181, 144, 114, 100, -180, 142, 113, 100, -179, 141, 111, 100, -179, 141, 111, 100, -178, 140, 111, 100, -174, 137, 111, 100, -173, 134, 108, 100, -171, 132, 106, 100, -171, 132, 106, 100, -172, 132, 108, 100, -174, 134, 110, 100, -174, 134, 109, 100, -173, 134, 106, 100, -173, 133, 105, 100, -174, 131, 102, 100, -176, 131, 100, 100, -173, 128, 95, 100, -172, 127, 92, 100, -172, 128, 90, 100, -173, 127, 90, 100, -173, 127, 91, 100, -171, 125, 90, 100, -170, 124, 88, 100, -169, 123, 86, 100, -166, 120, 84, 100, -161, 115, 82, 100, -156, 110, 79, 100, -147, 105, 76, 100, -130, 93, 68, 100, -108, 74, 54, 100, -109, 78, 56, 100, -107, 79, 57, 100, -104, 75, 53, 100, -135, 115, 98, 100, -183, 178, 174, 100, -184, 182, 184, 100, -189, 186, 195, 100, -191, 189, 198, 100, -192, 190, 200, 100, -194, 191, 199, 100, -194, 191, 196, 100, -193, 191, 194, 100, -172, 169, 153, 100, -173, 170, 155, 100, -175, 172, 158, 100, -179, 176, 161, 100, -181, 177, 163, 100, -183, 179, 167, 100, -184, 180, 168, 100, -186, 182, 170, 100, -187, 183, 171, 100, -189, 185, 173, 100, -190, 186, 174, 100, -191, 187, 175, 100, -192, 189, 176, 100, -190, 191, 177, 100, -190, 190, 179, 100, -191, 191, 181, 100, -191, 191, 181, 100, -192, 192, 181, 100, -192, 192, 183, 100, -193, 193, 185, 100, -193, 193, 185, 100, -194, 194, 186, 100, -195, 195, 187, 100, -195, 196, 188, 100, -196, 197, 189, 100, -193, 194, 186, 100, -199, 202, 193, 100, -149, 125, 124, 100, -98, 56, 70, 100, -103, 62, 76, 100, -129, 84, 101, 100, -137, 94, 113, 100, -139, 99, 121, 100, -143, 107, 130, 100, -137, 96, 115, 100, -123, 71, 80, 100, -103, 44, 45, 100, -124, 68, 78, 100, -143, 90, 106, 100, -147, 98, 114, 100, -149, 101, 113, 100, -144, 94, 104, 100, -144, 93, 102, 100, -142, 88, 95, 100, -145, 88, 93, 100, -152, 96, 96, 100, -157, 100, 95, 100, -164, 107, 97, 100, -154, 99, 84, 100, -155, 102, 82, 100, -166, 115, 90, 100, -169, 122, 95, 100, -167, 124, 99, 100, -162, 123, 102, 100, -154, 115, 103, 100, -137, 96, 93, 100, -117, 76, 76, 100, -94, 57, 57, 100, -81, 44, 37, 100, -147, 108, 79, 100, -155, 116, 86, 100, -147, 108, 77, 100, -161, 123, 91, 100, -170, 134, 104, 100, -173, 137, 108, 100, -175, 138, 109, 100, -177, 138, 109, 100, -176, 138, 109, 100, -177, 139, 111, 100, -177, 139, 111, 100, -180, 140, 112, 100, -182, 143, 114, 100, -184, 145, 117, 100, -184, 148, 119, 100, -183, 146, 117, 100, -185, 148, 118, 100, -185, 148, 118, 100, -181, 142, 108, 100, -182, 143, 107, 100, -185, 146, 110, 100, -187, 149, 113, 100, -190, 151, 118, 100, -193, 154, 120, 100, -193, 154, 121, 100, -191, 152, 119, 100, -187, 148, 115, 100, -182, 143, 110, 100, -174, 135, 104, 100, -169, 130, 100, 100, -165, 126, 97, 100, -164, 123, 96, 100, -165, 124, 96, 100, -167, 125, 98, 100, -169, 125, 97, 100, -170, 125, 94, 100, -173, 128, 97, 100, -177, 132, 99, 100, -178, 132, 97, 100, -177, 131, 95, 100, -173, 127, 90, 100, -168, 122, 86, 100, -163, 117, 81, 100, -159, 113, 79, 100, -155, 109, 77, 100, -149, 103, 74, 100, -141, 99, 70, 100, -127, 87, 61, 100, -108, 73, 50, 100, -111, 80, 56, 100, -114, 86, 62, 100, -108, 79, 57, 100, -144, 125, 112, 100, -182, 177, 176, 100, -185, 181, 187, 100, -189, 186, 197, 100, -191, 189, 201, 100, -192, 190, 204, 100, -193, 191, 202, 100, -194, 191, 199, 100, -193, 190, 196, 100, -164, 165, 152, 100, -172, 168, 154, 100, -176, 173, 157, 100, -179, 175, 160, 100, -180, 176, 163, 100, -182, 177, 166, 100, -183, 179, 167, 100, -185, 181, 169, 100, -187, 183, 171, 100, -188, 184, 172, 100, -190, 186, 174, 100, -191, 187, 175, 100, -191, 187, 175, 100, -191, 189, 176, 100, -189, 190, 178, 100, -190, 190, 180, 100, -191, 191, 180, 100, -191, 191, 181, 100, -192, 192, 182, 100, -191, 191, 183, 100, -193, 193, 185, 100, -194, 194, 186, 100, -194, 194, 186, 100, -195, 196, 188, 100, -194, 195, 188, 100, -192, 193, 187, 100, -207, 209, 203, 100, -151, 145, 141, 100, -94, 60, 62, 100, -101, 58, 69, 100, -115, 71, 85, 100, -129, 85, 101, 100, -125, 84, 100, 100, -122, 81, 96, 100, -116, 68, 76, 100, -100, 44, 45, 100, -106, 52, 58, 100, -124, 73, 85, 100, -127, 77, 91, 100, -126, 79, 95, 100, -128, 83, 96, 100, -128, 83, 94, 100, -131, 83, 92, 100, -133, 82, 92, 100, -133, 80, 87, 100, -139, 87, 90, 100, -147, 92, 93, 100, -150, 93, 93, 100, -146, 87, 81, 100, -150, 92, 81, 100, -154, 97, 80, 100, -163, 112, 92, 100, -165, 116, 93, 100, -162, 114, 88, 100, -158, 115, 94, 100, -132, 92, 83, 100, -110, 70, 70, 100, -82, 46, 46, 100, -102, 63, 48, 100, -165, 126, 93, 100, -158, 119, 86, 100, -152, 113, 81, 100, -160, 122, 91, 100, -162, 124, 95, 100, -165, 126, 98, 100, -166, 126, 98, 100, -164, 124, 95, 100, -168, 129, 97, 100, -176, 137, 103, 100, -183, 145, 107, 100, -188, 150, 113, 100, -191, 153, 116, 100, -192, 154, 118, 100, -191, 153, 119, 100, -189, 151, 116, 100, -186, 148, 111, 100, -183, 145, 107, 100, -182, 144, 106, 100, -183, 144, 107, 100, -187, 149, 112, 100, -189, 150, 116, 100, -192, 153, 120, 100, -193, 155, 123, 100, -195, 156, 124, 100, -196, 156, 123, 100, -196, 157, 125, 100, -195, 156, 123, 100, -191, 153, 117, 100, -187, 149, 109, 100, -183, 143, 104, 100, -179, 135, 98, 100, -175, 130, 95, 100, -172, 128, 95, 100, -171, 126, 94, 100, -170, 125, 93, 100, -172, 127, 95, 100, -173, 128, 97, 100, -172, 126, 96, 100, -171, 124, 93, 100, -167, 121, 87, 100, -161, 115, 82, 100, -156, 109, 76, 100, -151, 104, 73, 100, -145, 99, 69, 100, -142, 98, 67, 100, -140, 96, 67, 100, -131, 91, 63, 100, -113, 77, 52, 100, -113, 80, 55, 100, -113, 85, 61, 100, -110, 82, 60, 100, -147, 133, 123, 100, -180, 174, 178, 100, -184, 181, 188, 100, -187, 185, 197, 100, -191, 189, 202, 100, -192, 190, 204, 100, -192, 191, 203, 100, -193, 191, 200, 100, -194, 191, 199, 100, -155, 160, 152, 100, -164, 169, 159, 100, -162, 164, 153, 100, -166, 167, 155, 100, -178, 176, 162, 100, -181, 177, 165, 100, -183, 179, 167, 100, -184, 180, 168, 100, -185, 181, 169, 100, -188, 184, 172, 100, -188, 184, 172, 100, -190, 186, 174, 100, -191, 186, 175, 100, -190, 188, 175, 100, -188, 190, 176, 100, -189, 190, 177, 100, -190, 190, 180, 100, -191, 191, 181, 100, -191, 191, 181, 100, -191, 191, 183, 100, -192, 192, 184, 100, -193, 193, 185, 100, -194, 194, 186, 100, -193, 194, 186, 100, -194, 195, 188, 100, -201, 202, 196, 100, -133, 133, 130, 100, -41, 40, 39, 100, -77, 60, 56, 100, -114, 74, 76, 100, -103, 59, 68, 100, -100, 57, 64, 100, -104, 61, 68, 100, -104, 60, 63, 100, -98, 48, 51, 100, -100, 46, 49, 100, -108, 56, 63, 100, -109, 62, 71, 100, -113, 67, 81, 100, -112, 70, 84, 100, -109, 66, 78, 100, -111, 67, 77, 100, -114, 70, 79, 100, -120, 75, 84, 100, -127, 80, 88, 100, -130, 80, 86, 100, -134, 84, 89, 100, -131, 77, 82, 100, -133, 78, 80, 100, -138, 81, 79, 100, -141, 84, 77, 100, -153, 98, 86, 100, -158, 105, 87, 100, -157, 106, 83, 100, -160, 114, 88, 100, -151, 108, 88, 100, -107, 69, 63, 100, -69, 34, 34, 100, -115, 76, 56, 100, -164, 125, 92, 100, -157, 118, 86, 100, -152, 113, 79, 100, -151, 112, 82, 100, -152, 112, 83, 100, -154, 113, 83, 100, -159, 120, 87, 100, -172, 134, 98, 100, -185, 147, 105, 100, -191, 153, 111, 100, -193, 157, 114, 100, -195, 157, 117, 100, -195, 156, 119, 100, -194, 156, 119, 100, -189, 151, 114, 100, -188, 150, 112, 100, -183, 145, 107, 100, -179, 142, 102, 100, -180, 142, 102, 100, -183, 145, 107, 100, -185, 146, 111, 100, -186, 147, 113, 100, -189, 150, 116, 100, -192, 153, 120, 100, -193, 154, 121, 100, -193, 154, 121, 100, -192, 153, 120, 100, -190, 151, 118, 100, -188, 149, 113, 100, -186, 146, 110, 100, -186, 144, 106, 100, -184, 140, 100, 100, -180, 135, 92, 100, -175, 130, 88, 100, -173, 128, 86, 100, -171, 125, 88, 100, -170, 124, 89, 100, -166, 120, 89, 100, -161, 114, 86, 100, -159, 112, 83, 100, -156, 109, 79, 100, -153, 106, 77, 100, -149, 103, 72, 100, -146, 98, 69, 100, -145, 98, 67, 100, -146, 101, 69, 100, -147, 101, 72, 100, -145, 103, 73, 100, -122, 84, 58, 100, -117, 84, 58, 100, -119, 90, 67, 100, -115, 89, 67, 100, -148, 138, 133, 100, -176, 171, 179, 100, -183, 180, 189, 100, -187, 185, 198, 100, -190, 188, 202, 100, -191, 189, 203, 100, -191, 189, 203, 100, -192, 190, 201, 100, -193, 190, 198, 100, -166, 170, 161, 100, -138, 144, 138, 100, -126, 133, 130, 100, -154, 160, 151, 100, -162, 169, 156, 100, -172, 173, 162, 100, -178, 177, 163, 100, -182, 179, 166, 100, -185, 180, 169, 100, -187, 183, 171, 100, -188, 184, 172, 100, -189, 185, 173, 100, -190, 186, 174, 100, -190, 187, 175, 100, -190, 188, 175, 100, -190, 190, 176, 100, -190, 191, 179, 100, -191, 191, 181, 100, -191, 191, 181, 100, -190, 190, 181, 100, -190, 190, 182, 100, -190, 190, 182, 100, -190, 190, 182, 100, -200, 200, 192, 100, -185, 186, 178, 100, -102, 103, 96, 100, -43, 43, 37, 100, -44, 43, 38, 100, -39, 36, 31, 100, -80, 63, 58, 100, -100, 63, 64, 100, -94, 50, 56, 100, -89, 46, 51, 100, -84, 37, 38, 100, -92, 44, 46, 100, -107, 58, 61, 100, -103, 55, 62, 100, -103, 57, 68, 100, -104, 61, 71, 100, -102, 61, 70, 100, -106, 64, 73, 100, -105, 62, 71, 100, -107, 65, 74, 100, -107, 64, 73, 100, -117, 72, 81, 100, -119, 74, 80, 100, -118, 73, 79, 100, -120, 74, 78, 100, -123, 78, 80, 100, -128, 81, 79, 100, -133, 82, 78, 100, -139, 87, 81, 100, -147, 95, 85, 100, -150, 98, 83, 100, -153, 100, 82, 100, -158, 108, 85, 100, -147, 103, 80, 100, -92, 53, 39, 100, -124, 84, 57, 100, -152, 113, 80, 100, -153, 113, 81, 100, -154, 114, 80, 100, -151, 113, 78, 100, -156, 117, 81, 100, -168, 129, 91, 100, -179, 141, 101, 100, -187, 150, 109, 100, -191, 153, 113, 100, -193, 155, 115, 100, -195, 157, 117, 100, -193, 154, 115, 100, -193, 155, 117, 100, -192, 154, 116, 100, -190, 152, 114, 100, -186, 149, 108, 100, -183, 145, 106, 100, -183, 145, 108, 100, -184, 146, 108, 100, -184, 145, 109, 100, -185, 144, 108, 100, -186, 146, 109, 100, -187, 148, 114, 100, -190, 151, 118, 100, -192, 153, 120, 100, -192, 153, 120, 100, -189, 151, 116, 100, -187, 149, 113, 100, -185, 146, 109, 100, -184, 145, 107, 100, -183, 141, 104, 100, -182, 138, 99, 100, -178, 133, 93, 100, -172, 127, 85, 100, -167, 122, 80, 100, -165, 120, 81, 100, -165, 120, 82, 100, -165, 118, 85, 100, -161, 115, 82, 100, -160, 113, 84, 100, -160, 114, 82, 100, -159, 113, 80, 100, -157, 111, 76, 100, -155, 109, 75, 100, -155, 109, 75, 100, -156, 110, 76, 100, -156, 111, 77, 100, -155, 112, 77, 100, -132, 93, 62, 100, -117, 82, 55, 100, -120, 90, 66, 100, -120, 97, 75, 100, -148, 139, 141, 100, -172, 169, 178, 100, -183, 181, 193, 100, -188, 185, 200, 100, -190, 187, 201, 100, -190, 188, 202, 100, -191, 188, 203, 100, -192, 190, 202, 100, -193, 191, 199, 100, -169, 161, 142, 100, -161, 159, 146, 100, -160, 164, 154, 100, -165, 169, 160, 100, -166, 173, 163, 100, -171, 175, 167, 100, -172, 175, 164, 100, -176, 177, 163, 100, -182, 179, 164, 100, -185, 182, 168, 100, -187, 183, 171, 100, -188, 185, 172, 100, -190, 186, 174, 100, -190, 186, 174, 100, -191, 187, 175, 100, -191, 188, 176, 100, -190, 190, 176, 100, -189, 190, 179, 100, -189, 189, 179, 100, -189, 189, 179, 100, -187, 187, 178, 100, -190, 190, 182, 100, -189, 190, 182, 100, -149, 149, 140, 100, -84, 84, 75, 100, -59, 59, 49, 100, -62, 62, 52, 100, -72, 69, 61, 100, -78, 74, 68, 100, -103, 99, 91, 100, -129, 114, 105, 100, -107, 73, 70, 100, -94, 52, 51, 100, -128, 99, 94, 100, -123, 92, 89, 100, -91, 47, 48, 100, -106, 60, 63, 100, -106, 62, 71, 100, -101, 58, 67, 100, -102, 59, 66, 100, -102, 59, 66, 100, -100, 57, 65, 100, -105, 62, 71, 100, -107, 64, 73, 100, -109, 66, 74, 100, -109, 65, 73, 100, -108, 65, 71, 100, -114, 72, 79, 100, -113, 74, 81, 100, -117, 77, 79, 100, -124, 81, 80, 100, -126, 79, 78, 100, -128, 78, 75, 100, -131, 79, 75, 100, -145, 91, 77, 100, -148, 95, 74, 100, -154, 105, 79, 100, -157, 109, 83, 100, -152, 108, 76, 100, -153, 113, 77, 100, -154, 114, 79, 100, -153, 115, 78, 100, -160, 123, 82, 100, -172, 136, 93, 100, -179, 142, 100, 100, -182, 146, 104, 100, -185, 149, 107, 100, -189, 151, 112, 100, -193, 155, 117, 100, -194, 156, 119, 100, -192, 154, 118, 100, -189, 151, 116, 100, -183, 144, 109, 100, -180, 141, 109, 100, -181, 142, 110, 100, -175, 136, 104, 100, -170, 130, 97, 100, -175, 135, 101, 100, -180, 140, 106, 100, -183, 143, 110, 100, -184, 143, 111, 100, -184, 144, 112, 100, -185, 146, 113, 100, -188, 149, 115, 100, -188, 150, 116, 100, -188, 149, 114, 100, -188, 146, 110, 100, -186, 143, 104, 100, -181, 138, 99, 100, -178, 134, 96, 100, -177, 133, 94, 100, -174, 129, 90, 100, -172, 127, 87, 100, -169, 124, 84, 100, -164, 119, 80, 100, -166, 121, 83, 100, -169, 123, 87, 100, -173, 127, 91, 100, -175, 129, 92, 100, -173, 128, 89, 100, -171, 126, 87, 100, -169, 123, 86, 100, -169, 121, 83, 100, -165, 120, 81, 100, -162, 117, 78, 100, -159, 113, 77, 100, -156, 113, 77, 100, -134, 96, 65, 100, -115, 79, 54, 100, -117, 88, 65, 100, -125, 104, 88, 100, -148, 141, 148, 100, -169, 166, 177, 100, -183, 181, 194, 100, -187, 185, 199, 100, -188, 187, 201, 100, -189, 188, 202, 100, -190, 189, 203, 100, -191, 189, 201, 100, -192, 190, 200, 100, -204, 171, 135, 100, -197, 170, 137, 100, -186, 167, 141, 100, -177, 165, 146, 100, -171, 164, 151, 100, -166, 165, 156, 100, -168, 170, 163, 100, -171, 174, 166, 100, -175, 177, 166, 100, -178, 178, 166, 100, -179, 179, 167, 100, -180, 180, 168, 100, -186, 183, 171, 100, -191, 188, 176, 100, -191, 187, 175, 100, -191, 187, 175, 100, -191, 188, 175, 100, -188, 187, 175, 100, -192, 191, 181, 100, -193, 193, 183, 100, -193, 194, 184, 100, -186, 185, 177, 100, -142, 142, 133, 100, -108, 106, 96, 100, -96, 92, 83, 100, -90, 86, 77, 100, -115, 111, 102, 100, -136, 131, 124, 100, -131, 126, 120, 100, -108, 101, 96, 100, -114, 106, 101, 100, -128, 117, 108, 100, -156, 144, 134, 100, -180, 179, 168, 100, -161, 157, 146, 100, -131, 110, 103, 100, -100, 63, 61, 100, -99, 57, 58, 100, -101, 58, 64, 100, -99, 56, 61, 100, -98, 56, 60, 100, -97, 55, 60, 100, -101, 58, 65, 100, -108, 66, 74, 100, -114, 73, 81, 100, -110, 68, 74, 100, -108, 65, 72, 100, -111, 68, 75, 100, -111, 72, 77, 100, -112, 71, 77, 100, -117, 75, 81, 100, -119, 74, 75, 100, -114, 66, 66, 100, -123, 73, 72, 100, -133, 80, 75, 100, -137, 81, 67, 100, -146, 90, 73, 100, -146, 93, 70, 100, -158, 112, 83, 100, -159, 114, 80, 100, -154, 112, 74, 100, -151, 111, 72, 100, -165, 125, 85, 100, -174, 134, 92, 100, -179, 139, 96, 100, -179, 140, 100, 100, -181, 142, 101, 100, -184, 145, 105, 100, -184, 147, 106, 100, -183, 146, 104, 100, -177, 138, 100, 100, -172, 133, 96, 100, -150, 112, 78, 100, -142, 103, 70, 100, -160, 121, 89, 100, -172, 131, 100, 100, -179, 139, 105, 100, -187, 147, 112, 100, -192, 153, 118, 100, -193, 153, 121, 100, -194, 155, 122, 100, -195, 156, 123, 100, -196, 157, 124, 100, -192, 153, 119, 100, -188, 150, 113, 100, -183, 143, 107, 100, -180, 136, 99, 100, -180, 135, 97, 100, -178, 134, 95, 100, -175, 130, 91, 100, -170, 125, 86, 100, -167, 122, 84, 100, -166, 121, 84, 100, -166, 121, 83, 100, -165, 119, 81, 100, -168, 122, 86, 100, -173, 128, 89, 100, -177, 132, 93, 100, -180, 134, 98, 100, -179, 134, 96, 100, -176, 131, 92, 100, -174, 129, 91, 100, -172, 126, 88, 100, -168, 123, 84, 100, -164, 118, 81, 100, -159, 114, 79, 100, -155, 111, 77, 100, -133, 95, 65, 100, -112, 77, 53, 100, -115, 86, 65, 100, -125, 111, 103, 100, -146, 142, 153, 100, -167, 165, 177, 100, -181, 180, 193, 100, -182, 186, 198, 100, -185, 188, 200, 100, -189, 188, 202, 100, -190, 188, 202, 100, -191, 189, 202, 100, -191, 189, 200, 100, -206, 173, 139, 100, -207, 173, 138, 100, -205, 172, 136, 100, -202, 172, 137, 100, -199, 169, 135, 100, -189, 166, 138, 100, -179, 162, 140, 100, -169, 160, 141, 100, -162, 161, 152, 100, -163, 165, 158, 100, -164, 168, 160, 100, -168, 172, 163, 100, -166, 169, 159, 100, -167, 166, 156, 100, -190, 187, 174, 100, -192, 187, 175, 100, -189, 186, 174, 100, -196, 192, 180, 100, -173, 169, 158, 100, -151, 148, 139, 100, -143, 141, 133, 100, -113, 108, 102, 100, -68, 62, 60, 100, -95, 89, 86, 100, -146, 141, 133, 100, -137, 132, 125, 100, -121, 116, 111, 100, -94, 89, 85, 100, -75, 69, 66, 100, -91, 86, 82, 100, -127, 122, 115, 100, -141, 136, 128, 100, -154, 150, 142, 100, -147, 143, 134, 100, -143, 138, 129, 100, -147, 142, 132, 100, -132, 120, 110, 100, -100, 72, 64, 100, -89, 52, 49, 100, -92, 52, 54, 100, -96, 56, 58, 100, -98, 57, 60, 100, -99, 59, 61, 100, -93, 58, 59, 100, -92, 57, 60, 100, -98, 61, 64, 100, -96, 58, 61, 100, -96, 56, 61, 100, -105, 67, 71, 100, -112, 73, 77, 100, -112, 74, 80, 100, -113, 73, 76, 100, -116, 72, 71, 100, -114, 68, 66, 100, -117, 67, 64, 100, -119, 66, 61, 100, -130, 74, 60, 100, -139, 86, 65, 100, -144, 96, 72, 100, -153, 106, 78, 100, -159, 113, 80, 100, -162, 118, 79, 100, -162, 118, 79, 100, -167, 123, 83, 100, -165, 121, 80, 100, -174, 130, 90, 100, -182, 139, 95, 100, -184, 144, 99, 100, -185, 148, 103, 100, -187, 150, 104, 100, -185, 147, 101, 100, -181, 143, 100, 100, -171, 134, 92, 100, -180, 143, 102, 100, -189, 151, 111, 100, -190, 153, 113, 100, -191, 153, 116, 100, -190, 152, 116, 100, -191, 152, 118, 100, -192, 154, 119, 100, -193, 154, 121, 100, -194, 155, 122, 100, -195, 156, 123, 100, -195, 156, 121, 100, -193, 154, 118, 100, -190, 150, 112, 100, -187, 144, 104, 100, -179, 135, 96, 100, -172, 127, 88, 100, -169, 124, 86, 100, -169, 124, 85, 100, -166, 121, 83, 100, -163, 117, 81, 100, -161, 115, 79, 100, -162, 116, 80, 100, -164, 118, 83, 100, -168, 122, 87, 100, -172, 126, 91, 100, -176, 130, 95, 100, -177, 131, 96, 100, -175, 129, 94, 100, -173, 127, 91, 100, -170, 124, 88, 100, -168, 122, 85, 100, -163, 118, 80, 100, -159, 114, 76, 100, -152, 108, 73, 100, -133, 94, 65, 100, -109, 75, 51, 100, -113, 84, 64, 100, -129, 118, 115, 100, -144, 142, 155, 100, -166, 164, 178, 100, -180, 179, 193, 100, -181, 185, 197, 100, -183, 188, 200, 100, -186, 189, 201, 100, -189, 188, 202, 100, -190, 188, 202, 100, -190, 188, 200, 100, -209, 174, 141, 100, -208, 174, 141, 100, -206, 172, 138, 100, -206, 173, 139, 100, -207, 173, 138, 100, -207, 175, 139, 100, -208, 175, 138, 100, -203, 172, 136, 100, -194, 168, 137, 100, -184, 163, 139, 100, -170, 160, 140, 100, -162, 159, 149, 100, -152, 153, 145, 100, -134, 136, 128, 100, -150, 151, 139, 100, -187, 183, 171, 100, -197, 191, 178, 100, -164, 160, 147, 100, -77, 72, 66, 100, -57, 51, 48, 100, -72, 66, 64, 100, -69, 63, 63, 100, -43, 37, 38, 100, -100, 94, 89, 100, -144, 138, 132, 100, -96, 90, 85, 100, -68, 63, 59, 100, -101, 96, 91, 100, -132, 127, 121, 100, -144, 140, 131, 100, -138, 134, 125, 100, -152, 148, 139, 100, -149, 145, 136, 100, -143, 139, 130, 100, -140, 136, 127, 100, -124, 119, 111, 100, -112, 105, 99, 100, -110, 101, 94, 100, -113, 100, 93, 100, -93, 74, 67, 100, -83, 58, 52, 100, -75, 42, 38, 100, -79, 46, 42, 100, -78, 47, 44, 100, -72, 41, 39, 100, -77, 43, 43, 100, -89, 53, 53, 100, -90, 52, 53, 100, -94, 58, 60, 100, -99, 62, 64, 100, -108, 72, 73, 100, -107, 72, 71, 100, -107, 69, 68, 100, -113, 69, 69, 100, -115, 68, 66, 100, -117, 70, 67, 100, -125, 75, 66, 100, -128, 75, 59, 100, -122, 72, 53, 100, -142, 95, 72, 100, -155, 109, 81, 100, -170, 125, 88, 100, -158, 113, 74, 100, -145, 100, 60, 100, -167, 123, 79, 100, -177, 135, 88, 100, -180, 138, 92, 100, -183, 140, 95, 100, -183, 143, 98, 100, -184, 145, 100, 100, -183, 144, 100, 100, -179, 141, 97, 100, -177, 138, 95, 100, -182, 144, 102, 100, -181, 143, 103, 100, -180, 142, 103, 100, -182, 143, 107, 100, -184, 146, 108, 100, -183, 146, 107, 100, -185, 147, 110, 100, -187, 149, 114, 100, -188, 150, 114, 100, -186, 148, 112, 100, -185, 147, 109, 100, -185, 147, 108, 100, -183, 145, 106, 100, -184, 141, 102, 100, -183, 139, 100, 100, -179, 135, 94, 100, -170, 125, 84, 100, -163, 118, 78, 100, -162, 117, 78, 100, -163, 118, 81, 100, -165, 120, 83, 100, -164, 118, 82, 100, -164, 118, 82, 100, -168, 122, 88, 100, -171, 125, 92, 100, -173, 127, 93, 100, -172, 126, 92, 100, -172, 126, 91, 100, -169, 123, 88, 100, -166, 120, 85, 100, -163, 117, 81, 100, -162, 117, 79, 100, -159, 114, 77, 100, -155, 111, 76, 100, -136, 98, 68, 100, -112, 77, 54, 100, -112, 82, 63, 100, -131, 119, 123, 100, -144, 141, 156, 100, -164, 162, 176, 100, -177, 179, 192, 100, -180, 184, 196, 100, -183, 187, 199, 100, -186, 189, 201, 100, -188, 188, 201, 100, -190, 188, 201, 100, -190, 188, 201, 100, -211, 175, 142, 100, -212, 176, 142, 100, -211, 175, 141, 100, -212, 175, 142, 100, -212, 176, 144, 100, -208, 174, 141, 100, -206, 174, 140, 100, -206, 175, 141, 100, -205, 175, 140, 100, -208, 176, 141, 100, -205, 175, 141, 100, -197, 169, 138, 100, -187, 168, 141, 100, -169, 157, 138, 100, -125, 119, 104, 100, -135, 131, 119, 100, -173, 169, 157, 100, -93, 89, 79, 100, -43, 38, 35, 100, -37, 32, 35, 100, -33, 29, 32, 100, -48, 43, 39, 100, -108, 103, 92, 100, -120, 115, 104, 100, -86, 81, 75, 100, -84, 79, 75, 100, -119, 114, 109, 100, -151, 147, 139, 100, -146, 141, 134, 100, -136, 132, 123, 100, -151, 147, 138, 100, -147, 141, 133, 100, -136, 132, 123, 100, -136, 132, 123, 100, -128, 124, 116, 100, -124, 119, 112, 100, -133, 127, 119, 100, -137, 130, 122, 100, -138, 132, 124, 100, -140, 134, 125, 100, -134, 126, 117, 100, -115, 101, 92, 100, -89, 64, 57, 100, -75, 44, 36, 100, -77, 46, 38, 100, -77, 45, 40, 100, -87, 53, 48, 100, -93, 57, 55, 100, -92, 56, 56, 100, -93, 57, 56, 100, -100, 65, 62, 100, -104, 70, 67, 100, -107, 70, 69, 100, -109, 66, 67, 100, -113, 71, 71, 100, -121, 77, 75, 100, -114, 67, 61, 100, -110, 61, 51, 100, -117, 67, 54, 100, -129, 80, 64, 100, -144, 98, 74, 100, -158, 111, 81, 100, -161, 115, 81, 100, -156, 111, 69, 100, -167, 123, 76, 100, -173, 130, 80, 100, -180, 138, 87, 100, -183, 142, 93, 100, -185, 147, 100, 100, -185, 148, 103, 100, -185, 148, 103, 100, -186, 149, 103, 100, -186, 148, 104, 100, -189, 151, 109, 100, -188, 151, 108, 100, -189, 151, 112, 100, -190, 152, 116, 100, -190, 152, 114, 100, -190, 152, 114, 100, -190, 151, 114, 100, -189, 151, 113, 100, -186, 149, 109, 100, -183, 144, 106, 100, -180, 142, 102, 100, -178, 137, 96, 100, -179, 135, 96, 100, -179, 136, 94, 100, -178, 134, 93, 100, -178, 133, 92, 100, -175, 130, 87, 100, -170, 126, 83, 100, -165, 121, 77, 100, -163, 118, 78, 100, -165, 119, 81, 100, -166, 121, 80, 100, -169, 124, 85, 100, -171, 126, 87, 100, -173, 127, 90, 100, -172, 126, 90, 100, -172, 126, 90, 100, -170, 124, 89, 100, -168, 122, 86, 100, -164, 118, 82, 100, -161, 115, 79, 100, -156, 111, 74, 100, -155, 109, 75, 100, -156, 112, 77, 100, -142, 104, 72, 100, -117, 82, 57, 100, -112, 83, 60, 100, -128, 118, 122, 100, -143, 141, 157, 100, -161, 160, 173, 100, -176, 176, 190, 100, -182, 182, 195, 100, -183, 184, 197, 100, -187, 186, 199, 100, -189, 187, 201, 100, -188, 187, 196, 100, -190, 189, 197, 100, -212, 176, 143, 100, -209, 173, 139, 100, -210, 175, 142, 100, -212, 176, 144, 100, -212, 176, 144, 100, -213, 176, 144, 100, -212, 176, 144, 100, -210, 176, 144, 100, -207, 177, 143, 100, -205, 176, 142, 100, -208, 175, 142, 100, -209, 175, 142, 100, -207, 176, 141, 100, -207, 177, 143, 100, -198, 171, 138, 100, -175, 153, 126, 100, -155, 143, 123, 100, -143, 140, 128, 100, -59, 59, 55, 100, -14, 12, 12, 100, -33, 29, 28, 100, -128, 121, 112, 100, -159, 151, 140, 100, -102, 95, 86, 100, -89, 84, 76, 100, -142, 138, 129, 100, -155, 151, 141, 100, -137, 133, 124, 100, -119, 115, 106, 100, -143, 139, 130, 100, -145, 141, 131, 100, -131, 127, 119, 100, -125, 121, 114, 100, -114, 110, 102, 100, -110, 104, 98, 100, -117, 112, 106, 100, -121, 116, 108, 100, -117, 110, 103, 100, -137, 131, 123, 100, -138, 133, 125, 100, -137, 132, 124, 100, -146, 141, 131, 100, -138, 130, 117, 100, -113, 84, 66, 100, -92, 57, 43, 100, -79, 47, 38, 100, -80, 46, 38, 100, -89, 54, 49, 100, -93, 58, 54, 100, -92, 60, 58, 100, -89, 58, 55, 100, -92, 60, 57, 100, -107, 72, 69, 100, -119, 80, 81, 100, -117, 74, 77, 100, -114, 72, 72, 100, -109, 63, 57, 100, -110, 61, 56, 100, -116, 67, 60, 100, -126, 77, 64, 100, -136, 86, 69, 100, -152, 103, 80, 100, -154, 104, 76, 100, -154, 106, 69, 100, -168, 124, 75, 100, -181, 139, 87, 100, -187, 146, 94, 100, -187, 150, 99, 100, -192, 155, 108, 100, -193, 156, 110, 100, -195, 158, 113, 100, -195, 158, 114, 100, -198, 160, 120, 100, -198, 161, 121, 100, -199, 162, 123, 100, -202, 165, 127, 100, -201, 163, 125, 100, -200, 163, 125, 100, -198, 161, 123, 100, -196, 159, 120, 100, -195, 157, 117, 100, -192, 155, 112, 100, -186, 149, 107, 100, -182, 144, 103, 100, -178, 138, 95, 100, -175, 131, 88, 100, -173, 128, 86, 100, -172, 128, 86, 100, -173, 128, 86, 100, -173, 128, 86, 100, -172, 128, 85, 100, -172, 127, 81, 100, -171, 123, 77, 100, -170, 121, 77, 100, -171, 123, 79, 100, -171, 126, 83, 100, -173, 127, 85, 100, -174, 129, 89, 100, -173, 129, 88, 100, -172, 126, 87, 100, -171, 125, 86, 100, -169, 122, 85, 100, -165, 120, 82, 100, -159, 113, 77, 100, -156, 110, 74, 100, -152, 106, 71, 100, -148, 104, 69, 100, -141, 101, 69, 100, -120, 84, 58, 100, -110, 81, 59, 100, -126, 116, 118, 100, -141, 140, 156, 100, -161, 159, 172, 100, -176, 174, 187, 100, -182, 180, 194, 100, -184, 182, 196, 100, -187, 186, 199, 100, -186, 186, 200, 100, -187, 186, 199, 100, -189, 187, 194, 100, -213, 176, 146, 100, -214, 177, 146, 100, -213, 177, 145, 100, -212, 176, 143, 100, -212, 176, 143, 100, -212, 176, 144, 100, -211, 175, 143, 100, -212, 176, 143, 100, -211, 177, 144, 100, -211, 177, 145, 100, -210, 175, 143, 100, -210, 176, 144, 100, -208, 177, 144, 100, -206, 177, 143, 100, -208, 177, 143, 100, -210, 178, 145, 100, -207, 176, 143, 100, -202, 177, 148, 100, -160, 144, 122, 100, -86, 75, 59, 100, -135, 124, 110, 100, -154, 146, 133, 100, -117, 108, 97, 100, -122, 113, 101, 100, -138, 131, 119, 100, -150, 143, 131, 100, -148, 141, 130, 100, -138, 133, 124, 100, -136, 131, 123, 100, -137, 132, 124, 100, -120, 116, 107, 100, -121, 115, 107, 100, -110, 105, 98, 100, -111, 106, 99, 100, -117, 112, 105, 100, -112, 107, 100, 100, -112, 107, 100, 100, -125, 121, 113, 100, -136, 131, 123, 100, -131, 126, 120, 100, -130, 125, 118, 100, -129, 125, 115, 100, -130, 117, 100, 100, -137, 102, 69, 100, -136, 100, 66, 100, -106, 71, 48, 100, -77, 42, 31, 100, -78, 43, 34, 100, -89, 56, 48, 100, -91, 60, 54, 100, -87, 57, 52, 100, -90, 58, 56, 100, -99, 65, 62, 100, -110, 74, 72, 100, -123, 83, 82, 100, -115, 74, 75, 100, -106, 64, 62, 100, -111, 67, 59, 100, -116, 68, 62, 100, -121, 70, 61, 100, -129, 75, 63, 100, -135, 81, 66, 100, -144, 92, 68, 100, -149, 98, 66, 100, -170, 125, 80, 100, -194, 152, 100, 100, -194, 154, 102, 100, -196, 160, 108, 100, -199, 163, 116, 100, -200, 163, 118, 100, -199, 163, 121, 100, -200, 164, 124, 100, -202, 167, 130, 100, -203, 168, 132, 100, -205, 169, 135, 100, -206, 170, 135, 100, -204, 169, 132, 100, -203, 168, 131, 100, -202, 167, 130, 100, -200, 164, 127, 100, -200, 163, 124, 100, -198, 161, 120, 100, -196, 158, 116, 100, -193, 155, 114, 100, -190, 152, 109, 100, -187, 147, 103, 100, -183, 141, 97, 100, -179, 136, 92, 100, -175, 131, 89, 100, -174, 129, 86, 100, -173, 129, 84, 100, -173, 129, 83, 100, -175, 128, 83, 100, -175, 127, 80, 100, -175, 126, 80, 100, -176, 126, 83, 100, -176, 127, 84, 100, -176, 127, 84, 100, -175, 128, 87, 100, -175, 126, 84, 100, -172, 123, 81, 100, -169, 120, 81, 100, -165, 118, 79, 100, -160, 113, 75, 100, -155, 109, 74, 100, -153, 107, 73, 100, -146, 100, 67, 100, -136, 95, 64, 100, -119, 82, 56, 100, -111, 82, 62, 100, -125, 114, 118, 100, -137, 135, 150, 100, -158, 156, 169, 100, -176, 174, 187, 100, -180, 180, 191, 100, -183, 181, 192, 100, -180, 176, 183, 100, -184, 172, 169, 100, -192, 171, 157, 100, -193, 166, 144, 100, -208, 171, 142, 100, -210, 173, 143, 100, -211, 175, 144, 100, -211, 175, 143, 100, -210, 173, 142, 100, -210, 174, 141, 100, -209, 172, 141, 100, -209, 172, 141, 100, -213, 177, 146, 100, -214, 178, 146, 100, -212, 175, 143, 100, -211, 177, 145, 100, -209, 177, 145, 100, -209, 177, 144, 100, -208, 177, 143, 100, -207, 178, 144, 100, -208, 177, 143, 100, -208, 176, 142, 100, -211, 180, 145, 100, -213, 184, 149, 100, -182, 160, 130, 100, -160, 144, 118, 100, -127, 114, 97, 100, -131, 120, 108, 100, -146, 138, 127, 100, -149, 141, 131, 100, -152, 143, 132, 100, -153, 146, 135, 100, -156, 150, 140, 100, -152, 147, 139, 100, -144, 140, 131, 100, -141, 136, 127, 100, -139, 134, 125, 100, -139, 135, 126, 100, -139, 135, 126, 100, -138, 134, 125, 100, -147, 142, 133, 100, -149, 145, 136, 100, -141, 137, 128, 100, -136, 131, 123, 100, -131, 127, 118, 100, -128, 124, 116, 100, -119, 96, 74, 100, -128, 90, 55, 100, -136, 101, 66, 100, -145, 108, 75, 100, -157, 117, 90, 100, -125, 86, 66, 100, -88, 50, 39, 100, -79, 45, 35, 100, -82, 51, 43, 100, -81, 50, 45, 100, -87, 56, 51, 100, -98, 64, 60, 100, -107, 71, 69, 100, -110, 73, 72, 100, -106, 67, 67, 100, -110, 69, 64, 100, -121, 75, 64, 100, -129, 79, 70, 100, -133, 80, 71, 100, -132, 78, 65, 100, -139, 88, 69, 100, -141, 92, 67, 100, -142, 95, 61, 100, -189, 146, 97, 100, -196, 157, 104, 100, -196, 159, 108, 100, -198, 162, 114, 100, -199, 163, 120, 100, -197, 163, 124, 100, -201, 166, 129, 100, -205, 169, 134, 100, -205, 169, 136, 100, -207, 171, 138, 100, -209, 172, 140, 100, -209, 173, 140, 100, -210, 174, 142, 100, -209, 173, 141, 100, -207, 171, 137, 100, -203, 168, 131, 100, -201, 165, 127, 100, -201, 164, 124, 100, -199, 162, 120, 100, -196, 158, 117, 100, -195, 157, 114, 100, -194, 154, 112, 100, -192, 151, 109, 100, -188, 145, 102, 100, -182, 138, 94, 100, -175, 131, 83, 100, -172, 127, 77, 100, -174, 125, 81, 100, -174, 125, 82, 100, -174, 125, 82, 100, -175, 126, 83, 100, -175, 126, 83, 100, -176, 126, 84, 100, -176, 127, 84, 100, -178, 130, 83, 100, -176, 127, 82, 100, -173, 125, 81, 100, -170, 120, 78, 100, -163, 115, 75, 100, -157, 112, 71, 100, -152, 106, 68, 100, -144, 99, 64, 100, -137, 96, 62, 100, -118, 81, 54, 100, -106, 77, 59, 100, -122, 113, 119, 100, -134, 131, 147, 100, -150, 143, 152, 100, -169, 158, 160, 100, -181, 165, 157, 100, -184, 158, 140, 100, -188, 156, 130, 100, -198, 162, 131, 100, -200, 162, 130, 100, -201, 163, 132, 100, -207, 170, 141, 100, -208, 171, 142, 100, -206, 168, 140, 100, -205, 168, 139, 100, -207, 170, 141, 100, -208, 171, 142, 100, -209, 172, 143, 100, -206, 170, 139, 100, -205, 168, 139, 100, -209, 172, 143, 100, -210, 173, 143, 100, -209, 173, 143, 100, -207, 175, 142, 100, -208, 177, 144, 100, -208, 177, 146, 100, -208, 176, 143, 100, -211, 179, 146, 100, -210, 177, 144, 100, -207, 177, 143, 100, -206, 174, 142, 100, -208, 177, 145, 100, -204, 176, 144, 100, -199, 176, 143, 100, -185, 166, 138, 100, -158, 146, 124, 100, -141, 131, 119, 100, -135, 126, 115, 100, -134, 126, 116, 100, -137, 129, 119, 100, -137, 130, 123, 100, -137, 131, 123, 100, -141, 135, 127, 100, -147, 140, 132, 100, -148, 143, 134, 100, -145, 141, 130, 100, -136, 132, 121, 100, -129, 124, 115, 100, -129, 124, 117, 100, -135, 130, 124, 100, -146, 142, 132, 100, -146, 143, 132, 100, -135, 130, 118, 100, -113, 86, 63, 100, -130, 93, 60, 100, -126, 91, 59, 100, -167, 124, 95, 100, -188, 145, 117, 100, -182, 140, 112, 100, -159, 113, 91, 100, -113, 73, 57, 100, -72, 39, 30, 100, -75, 45, 36, 100, -79, 48, 41, 100, -89, 57, 53, 100, -97, 64, 61, 100, -98, 64, 62, 100, -109, 75, 76, 100, -113, 72, 77, 100, -125, 83, 79, 100, -135, 90, 77, 100, -133, 85, 72, 100, -137, 87, 73, 100, -147, 98, 80, 100, -146, 99, 76, 100, -140, 93, 66, 100, -157, 112, 73, 100, -196, 155, 103, 100, -197, 160, 109, 100, -198, 163, 115, 100, -195, 161, 117, 100, -201, 166, 128, 100, -206, 170, 135, 100, -206, 171, 138, 100, -204, 172, 140, 100, -209, 177, 146, 100, -210, 177, 144, 100, -209, 175, 143, 100, -209, 175, 142, 100, -211, 176, 143, 100, -211, 175, 142, 100, -207, 171, 136, 100, -205, 169, 133, 100, -203, 169, 130, 100, -202, 166, 126, 100, -199, 163, 121, 100, -196, 159, 117, 100, -194, 157, 116, 100, -194, 156, 115, 100, -192, 151, 108, 100, -189, 145, 102, 100, -183, 139, 91, 100, -176, 132, 82, 100, -173, 125, 79, 100, -170, 121, 76, 100, -168, 118, 75, 100, -167, 117, 75, 100, -168, 119, 76, 100, -169, 120, 77, 100, -172, 123, 79, 100, -173, 124, 79, 100, -174, 125, 81, 100, -173, 124, 81, 100, -173, 124, 82, 100, -168, 121, 79, 100, -162, 118, 75, 100, -156, 111, 71, 100, -146, 102, 66, 100, -133, 92, 58, 100, -111, 73, 47, 100, -113, 82, 62, 100, -142, 126, 116, 100, -159, 138, 124, 100, -182, 153, 129, 100, -187, 153, 124, 100, -191, 154, 120, 100, -195, 157, 122, 100, -199, 161, 129, 100, -198, 162, 131, 100, -198, 161, 133, 100, -198, 161, 132, 100, -206, 169, 141, 100, -204, 167, 138, 100, -200, 163, 133, 100, -202, 165, 136, 100, -205, 169, 140, 100, -208, 170, 142, 100, -205, 168, 139, 100, -205, 168, 139, 100, -201, 164, 135, 100, -202, 165, 135, 100, -202, 166, 134, 100, -204, 168, 136, 100, -209, 173, 142, 100, -207, 173, 143, 100, -210, 173, 144, 100, -212, 176, 145, 100, -211, 176, 143, 100, -210, 176, 143, 100, -209, 177, 144, 100, -209, 178, 145, 100, -207, 176, 144, 100, -203, 172, 140, 100, -203, 172, 140, 100, -205, 176, 143, 100, -200, 173, 139, 100, -182, 160, 129, 100, -151, 135, 112, 100, -133, 120, 106, 100, -120, 109, 98, 100, -113, 105, 96, 100, -108, 98, 93, 100, -103, 93, 87, 100, -105, 97, 89, 100, -111, 104, 98, 100, -122, 115, 107, 100, -133, 128, 117, 100, -131, 124, 116, 100, -115, 109, 102, 100, -97, 93, 88, 100, -87, 81, 79, 100, -103, 97, 95, 100, -112, 106, 96, 100, -108, 81, 57, 100, -118, 80, 50, 100, -119, 82, 53, 100, -177, 132, 107, 100, -182, 140, 115, 100, -175, 134, 109, 100, -178, 136, 108, 100, -186, 144, 115, 100, -133, 93, 73, 100, -73, 40, 30, 100, -75, 44, 36, 100, -78, 47, 42, 100, -87, 56, 52, 100, -92, 61, 58, 100, -106, 74, 77, 100, -119, 81, 88, 100, -121, 79, 81, 100, -130, 86, 78, 100, -141, 96, 80, 100, -151, 104, 87, 100, -148, 100, 82, 100, -128, 79, 60, 100, -120, 72, 50, 100, -126, 80, 52, 100, -161, 117, 76, 100, -198, 161, 110, 100, -197, 161, 114, 100, -196, 161, 117, 100, -196, 161, 122, 100, -195, 160, 125, 100, -193, 160, 126, 100, -199, 167, 136, 100, -200, 169, 137, 100, -198, 168, 134, 100, -199, 169, 135, 100, -199, 168, 134, 100, -198, 165, 133, 100, -203, 171, 137, 100, -204, 170, 136, 100, -206, 170, 136, 100, -205, 169, 134, 100, -204, 169, 132, 100, -205, 170, 133, 100, -204, 169, 130, 100, -202, 165, 125, 100, -199, 162, 122, 100, -199, 158, 118, 100, -195, 153, 111, 100, -190, 147, 103, 100, -186, 142, 97, 100, -180, 136, 91, 100, -174, 129, 82, 100, -170, 122, 78, 100, -165, 117, 73, 100, -164, 115, 71, 100, -161, 112, 69, 100, -161, 112, 70, 100, -159, 109, 70, 100, -163, 113, 73, 100, -166, 118, 78, 100, -164, 118, 79, 100, -164, 119, 80, 100, -161, 117, 76, 100, -156, 111, 73, 100, -156, 112, 77, 100, -156, 117, 86, 100, -165, 128, 99, 100, -184, 147, 118, 100, -191, 154, 123, 100, -202, 164, 132, 100, -201, 163, 132, 100, -198, 161, 132, 100, -200, 163, 136, 100, -196, 159, 131, 100, -193, 157, 127, 100, -192, 156, 126, 100, -202, 165, 136, 100, -202, 165, 136, 100, -204, 167, 141, 100, -202, 165, 139, 100, -205, 168, 139, 100, -204, 167, 138, 100, -201, 164, 135, 100, -200, 162, 133, 100, -202, 165, 136, 100, -205, 168, 139, 100, -206, 169, 139, 100, -209, 172, 143, 100, -207, 171, 142, 100, -209, 172, 143, 100, -209, 171, 143, 100, -203, 166, 137, 100, -205, 168, 139, 100, -208, 171, 142, 100, -203, 166, 136, 100, -207, 172, 140, 100, -210, 175, 145, 100, -208, 175, 143, 100, -205, 174, 140, 100, -208, 176, 142, 100, -205, 174, 142, 100, -206, 175, 145, 100, -204, 175, 142, 100, -202, 172, 138, 100, -206, 177, 142, 100, -202, 176, 142, 100, -182, 162, 131, 100, -153, 138, 115, 100, -140, 128, 113, 100, -137, 129, 117, 100, -123, 116, 106, 100, -106, 98, 92, 100, -93, 85, 82, 100, -92, 84, 79, 100, -112, 104, 98, 100, -129, 122, 114, 100, -128, 122, 113, 100, -88, 82, 81, 100, -43, 40, 49, 100, -67, 61, 63, 100, -97, 70, 48, 100, -96, 61, 36, 100, -118, 79, 56, 100, -178, 136, 113, 100, -185, 144, 125, 100, -173, 132, 111, 100, -175, 136, 111, 100, -179, 139, 113, 100, -189, 148, 117, 100, -138, 95, 72, 100, -76, 41, 31, 100, -77, 47, 38, 100, -80, 49, 44, 100, -89, 58, 55, 100, -103, 72, 73, 100, -121, 86, 93, 100, -123, 83, 85, 100, -119, 75, 74, 100, -126, 81, 70, 100, -138, 89, 73, 100, -119, 70, 55, 100, -115, 67, 47, 100, -121, 73, 53, 100, -117, 72, 49, 100, -123, 79, 51, 100, -163, 123, 82, 100, -187, 150, 101, 100, -183, 147, 103, 100, -188, 153, 112, 100, -188, 153, 114, 100, -189, 153, 119, 100, -186, 151, 118, 100, -185, 152, 119, 100, -187, 157, 123, 100, -190, 160, 126, 100, -184, 154, 120, 100, -183, 153, 121, 100, -189, 158, 125, 100, -197, 165, 134, 100, -200, 169, 137, 100, -199, 168, 135, 100, -199, 167, 135, 100, -203, 168, 134, 100, -203, 167, 132, 100, -203, 168, 132, 100, -202, 166, 129, 100, -199, 161, 123, 100, -197, 159, 119, 100, -196, 155, 115, 100, -193, 151, 110, 100, -190, 146, 104, 100, -187, 144, 99, 100, -183, 139, 94, 100, -177, 134, 86, 100, -173, 127, 82, 100, -168, 120, 76, 100, -157, 110, 68, 100, -145, 96, 58, 100, -140, 91, 54, 100, -145, 99, 62, 100, -153, 108, 71, 100, -166, 123, 85, 100, -174, 135, 98, 100, -181, 144, 108, 100, -193, 156, 123, 100, -193, 156, 126, 100, -197, 160, 131, 100, -198, 161, 132, 100, -189, 152, 124, 100, -187, 150, 122, 100, -184, 147, 119, 100, -196, 159, 132, 100, -196, 159, 133, 100, -196, 159, 133, 100, -197, 160, 132, 100, -197, 160, 131, 100, -194, 156, 127, 100, -194, 157, 127, 100, -201, 166, 140, 100, -201, 166, 140, 100, -202, 167, 140, 100, -204, 168, 140, 100, -198, 163, 135, 100, -196, 161, 133, 100, -202, 166, 139, 100, -204, 167, 140, 100, -207, 170, 143, 100, -209, 172, 145, 100, -210, 172, 146, 100, -208, 172, 145, 100, -207, 172, 142, 100, -207, 170, 141, 100, -205, 168, 139, 100, -204, 167, 138, 100, -204, 167, 138, 100, -210, 172, 143, 100, -211, 174, 145, 100, -209, 173, 143, 100, -207, 171, 141, 100, -205, 174, 141, 100, -204, 173, 140, 100, -206, 176, 143, 100, -203, 173, 139, 100, -199, 169, 135, 100, -199, 169, 135, 100, -202, 173, 139, 100, -204, 174, 139, 100, -199, 171, 138, 100, -191, 167, 136, 100, -181, 162, 134, 100, -164, 153, 132, 100, -148, 140, 124, 100, -130, 123, 112, 100, -102, 95, 88, 100, -76, 69, 65, 100, -72, 65, 61, 100, -104, 96, 89, 100, -130, 121, 112, 100, -114, 107, 101, 100, -102, 95, 87, 100, -83, 58, 42, 100, -79, 46, 26, 100, -124, 86, 67, 100, -190, 151, 130, 100, -190, 150, 134, 100, -173, 133, 114, 100, -175, 136, 114, 100, -177, 136, 116, 100, -177, 135, 109, 100, -175, 124, 95, 100, -120, 78, 67, 100, -77, 45, 39, 100, -81, 50, 44, 100, -87, 56, 52, 100, -96, 65, 63, 100, -114, 79, 86, 100, -119, 80, 85, 100, -119, 77, 76, 100, -119, 75, 67, 100, -119, 70, 58, 100, -119, 71, 56, 100, -122, 75, 57, 100, -117, 70, 51, 100, -113, 71, 49, 100, -120, 79, 56, 100, -124, 82, 54, 100, -168, 123, 87, 100, -188, 143, 106, 100, -171, 133, 92, 100, -174, 140, 98, 100, -189, 154, 115, 100, -180, 144, 109, 100, -171, 138, 104, 100, -158, 129, 94, 100, -150, 120, 86, 100, -165, 134, 101, 100, -185, 154, 123, 100, -186, 155, 124, 100, -197, 167, 136, 100, -200, 169, 138, 100, -201, 170, 139, 100, -197, 167, 136, 100, -200, 165, 133, 100, -198, 162, 128, 100, -200, 164, 130, 100, -199, 161, 127, 100, -197, 159, 122, 100, -196, 158, 120, 100, -197, 159, 120, 100, -197, 157, 118, 100, -196, 156, 116, 100, -195, 154, 113, 100, -192, 152, 109, 100, -190, 149, 107, 100, -187, 146, 102, 100, -184, 142, 98, 100, -174, 132, 90, 100, -164, 123, 83, 100, -163, 121, 86, 100, -178, 136, 102, 100, -188, 149, 115, 100, -197, 160, 128, 100, -193, 156, 126, 100, -188, 152, 122, 100, -188, 152, 121, 100, -192, 155, 127, 100, -196, 159, 132, 100, -196, 159, 132, 100, -174, 137, 108, 100, -176, 139, 109, 100, -192, 155, 128, 100, -196, 159, 133, 100, -194, 157, 130, 100, -197, 160, 134, 100, -195, 158, 132, 100, -192, 155, 129, 100, -190, 153, 126, 100, -184, 148, 120, 100, -200, 166, 141, 100, -198, 165, 140, 100, -195, 163, 137, 100, -195, 163, 138, 100, -195, 163, 136, 100, -193, 161, 134, 100, -204, 171, 145, 100, -202, 166, 141, 100, -203, 166, 141, 100, -205, 170, 144, 100, -204, 168, 142, 100, -203, 168, 141, 100, -203, 170, 142, 100, -201, 165, 137, 100, -203, 166, 139, 100, -205, 171, 142, 100, -209, 175, 144, 100, -210, 174, 146, 100, -207, 173, 144, 100, -209, 174, 144, 100, -210, 173, 144, 100, -208, 172, 142, 100, -205, 169, 139, 100, -203, 168, 137, 100, -202, 169, 138, 100, -205, 170, 139, 100, -200, 168, 134, 100, -202, 169, 137, 100, -206, 173, 140, 100, -203, 172, 139, 100, -203, 173, 139, 100, -205, 174, 139, 100, -199, 171, 136, 100, -190, 166, 134, 100, -173, 154, 127, 100, -150, 137, 114, 100, -127, 118, 100, 100, -78, 69, 62, 100, -36, 31, 32, 100, -54, 46, 47, 100, -86, 77, 71, 100, -91, 81, 72, 100, -74, 54, 40, 100, -66, 35, 16, 100, -132, 96, 75, 100, -196, 157, 139, 100, -191, 152, 135, 100, -171, 132, 117, 100, -162, 122, 113, 100, -154, 114, 106, 100, -147, 105, 92, 100, -139, 90, 76, 100, -137, 98, 93, 100, -93, 61, 58, 100, -75, 45, 40, 100, -83, 52, 47, 100, -85, 54, 50, 100, -101, 67, 69, 100, -114, 77, 82, 100, -116, 77, 77, 100, -118, 77, 72, 100, -118, 76, 64, 100, -115, 71, 57, 100, -118, 74, 59, 100, -119, 77, 59, 100, -115, 74, 55, 100, -114, 73, 52, 100, -113, 73, 47, 100, -133, 89, 63, 100, -178, 115, 95, 100, -180, 119, 90, 100, -163, 125, 83, 100, -149, 115, 75, 100, -142, 106, 72, 100, -147, 112, 77, 100, -149, 117, 83, 100, -162, 129, 96, 100, -177, 145, 113, 100, -183, 152, 121, 100, -185, 153, 122, 100, -189, 157, 125, 100, -197, 165, 133, 100, -200, 167, 137, 100, -198, 165, 134, 100, -197, 160, 129, 100, -194, 158, 125, 100, -193, 157, 123, 100, -193, 154, 120, 100, -197, 159, 122, 100, -197, 160, 122, 100, -198, 161, 122, 100, -200, 162, 123, 100, -198, 161, 120, 100, -193, 156, 115, 100, -193, 155, 115, 100, -190, 153, 114, 100, -189, 151, 112, 100, -190, 153, 116, 100, -192, 155, 118, 100, -198, 162, 128, 100, -198, 162, 129, 100, -197, 161, 132, 100, -194, 157, 129, 100, -187, 150, 121, 100, -193, 156, 127, 100, -190, 153, 126, 100, -192, 155, 129, 100, -195, 158, 132, 100, -197, 160, 134, 100, -186, 149, 124, 100, -182, 145, 118, 100, -178, 141, 115, 100, -184, 147, 119, 100, -185, 148, 121, 100, -185, 148, 121, 100, -187, 150, 124, 100, -187, 150, 124, 100, -184, 147, 119, 100, -178, 141, 114, 100, -183, 146, 119, 100, -193, 161, 136, 100, -192, 160, 136, 100, -194, 161, 140, 100, -197, 163, 142, 100, -197, 165, 140, 100, -193, 161, 137, 100, -197, 164, 139, 100, -199, 166, 140, 100, -198, 164, 139, 100, -195, 162, 136, 100, -201, 169, 142, 100, -207, 174, 147, 100, -198, 164, 138, 100, -200, 167, 140, 100, -201, 170, 141, 100, -205, 172, 145, 100, -208, 176, 148, 100, -208, 174, 147, 100, -211, 175, 149, 100, -210, 173, 147, 100, -204, 167, 139, 100, -201, 164, 136, 100, -206, 169, 140, 100, -204, 167, 138, 100, -200, 163, 134, 100, -203, 167, 137, 100, -204, 168, 137, 100, -207, 170, 140, 100, -209, 174, 142, 100, -208, 174, 142, 100, -205, 172, 140, 100, -204, 172, 140, 100, -206, 172, 140, 100, -206, 173, 139, 100, -204, 173, 138, 100, -202, 171, 137, 100, -195, 170, 135, 100, -181, 158, 126, 100, -141, 124, 101, 100, -84, 70, 61, 100, -73, 60, 52, 100, -70, 57, 50, 100, -49, 31, 24, 100, -68, 38, 19, 100, -157, 117, 98, 100, -195, 156, 138, 100, -187, 148, 133, 100, -155, 114, 108, 100, -144, 102, 103, 100, -141, 102, 102, 100, -126, 85, 83, 100, -111, 70, 70, 100, -122, 88, 89, 100, -107, 73, 77, 100, -83, 52, 52, 100, -74, 43, 37, 100, -79, 48, 44, 100, -86, 55, 52, 100, -100, 66, 69, 100, -111, 75, 76, 100, -112, 74, 72, 100, -114, 73, 64, 100, -120, 79, 66, 100, -118, 76, 60, 100, -121, 78, 63, 100, -121, 80, 63, 100, -121, 80, 58, 100, -124, 83, 57, 100, -131, 91, 62, 100, -139, 83, 61, 100, -165, 87, 70, 100, -153, 102, 65, 100, -136, 100, 61, 100, -152, 116, 78, 100, -144, 108, 73, 100, -155, 119, 88, 100, -174, 139, 107, 100, -183, 149, 117, 100, -187, 154, 123, 100, -193, 158, 127, 100, -194, 158, 127, 100, -194, 159, 128, 100, -194, 159, 125, 100, -194, 158, 125, 100, -193, 157, 123, 100, -192, 157, 122, 100, -191, 155, 120, 100, -190, 154, 120, 100, -192, 156, 120, 100, -197, 162, 124, 100, -198, 162, 123, 100, -199, 161, 124, 100, -189, 153, 115, 100, -187, 152, 114, 100, -189, 153, 118, 100, -192, 156, 124, 100, -190, 153, 124, 100, -191, 154, 126, 100, -197, 161, 129, 100, -194, 157, 127, 100, -192, 155, 127, 100, -188, 151, 123, 100, -185, 148, 120, 100, -181, 144, 118, 100, -183, 147, 121, 100, -184, 148, 122, 100, -192, 158, 131, 100, -189, 152, 126, 100, -185, 147, 123, 100, -185, 147, 122, 100, -178, 141, 114, 100, -170, 133, 107, 100, -178, 141, 115, 100, -178, 141, 115, 100, -186, 149, 123, 100, -194, 157, 130, 100, -186, 149, 124, 100, -179, 141, 115, 100, -182, 145, 120, 100, -185, 146, 123, 100, -190, 157, 137, 100, -195, 162, 143, 100, -203, 168, 150, 100, -203, 169, 149, 100, -194, 161, 142, 100, -192, 160, 138, 100, -197, 164, 140, 100, -199, 167, 144, 100, -194, 162, 139, 100, -195, 163, 138, 100, -206, 174, 149, 100, -206, 174, 148, 100, -198, 166, 141, 100, -196, 164, 138, 100, -196, 165, 139, 100, -205, 174, 147, 100, -206, 172, 145, 100, -211, 175, 149, 100, -208, 171, 145, 100, -204, 167, 141, 100, -200, 163, 136, 100, -202, 165, 138, 100, -203, 166, 137, 100, -200, 163, 134, 100, -193, 157, 127, 100, -203, 166, 137, 100, -208, 171, 143, 100, -209, 172, 143, 100, -206, 169, 140, 100, -208, 170, 142, 100, -208, 174, 144, 100, -210, 175, 145, 100, -211, 174, 144, 100, -209, 173, 142, 100, -207, 174, 141, 100, -203, 172, 137, 100, -204, 170, 136, 100, -206, 173, 136, 100, -205, 174, 136, 100, -207, 177, 141, 100, -193, 166, 131, 100, -176, 149, 119, 100, -162, 135, 108, 100, -153, 119, 90, 100, -165, 122, 101, 100, -195, 155, 138, 100, -174, 135, 123, 100, -143, 102, 100, 100, -140, 98, 100, 100, -137, 96, 98, 100, -115, 73, 75, 100, -105, 64, 69, 100, -118, 81, 87, 100, -111, 74, 84, 100, -103, 74, 91, 100, -78, 48, 52, 100, -80, 49, 45, 100, -80, 49, 46, 100, -83, 51, 50, 100, -91, 58, 58, 100, -100, 68, 65, 100, -108, 70, 66, 100, -108, 68, 59, 100, -116, 75, 60, 100, -127, 84, 69, 100, -135, 91, 71, 100, -138, 96, 71, 100, -138, 95, 69, 100, -136, 95, 67, 100, -134, 91, 62, 100, -133, 70, 46, 100, -158, 104, 68, 100, -166, 127, 86, 100, -167, 129, 91, 100, -164, 127, 93, 100, -171, 133, 101, 100, -176, 139, 106, 100, -186, 150, 120, 100, -190, 155, 123, 100, -192, 156, 124, 100, -195, 159, 126, 100, -195, 159, 125, 100, -192, 157, 119, 100, -192, 158, 119, 100, -193, 158, 120, 100, -192, 157, 119, 100, -192, 157, 119, 100, -194, 159, 121, 100, -191, 156, 118, 100, -190, 155, 117, 100, -189, 154, 116, 100, -182, 147, 110, 100, -182, 146, 111, 100, -191, 155, 123, 100, -189, 152, 122, 100, -192, 155, 126, 100, -186, 149, 120, 100, -188, 151, 122, 100, -189, 152, 124, 100, -192, 155, 127, 100, -196, 159, 132, 100, -192, 155, 129, 100, -184, 147, 121, 100, -189, 153, 129, 100, -189, 156, 131, 100, -188, 153, 129, 100, -190, 154, 130, 100, -189, 151, 127, 100, -188, 150, 127, 100, -181, 143, 118, 100, -179, 142, 117, 100, -181, 144, 118, 100, -178, 140, 114, 100, -182, 145, 118, 100, -193, 156, 131, 100, -193, 155, 133, 100, -192, 153, 133, 100, -188, 150, 129, 100, -183, 145, 122, 100, -193, 156, 135, 100, -196, 163, 145, 100, -197, 164, 145, 100, -197, 163, 144, 100, -194, 161, 142, 100, -193, 162, 142, 100, -193, 160, 140, 100, -197, 164, 145, 100, -203, 171, 151, 100, -200, 168, 148, 100, -198, 166, 145, 100, -200, 168, 145, 100, -203, 171, 149, 100, -206, 174, 151, 100, -194, 162, 139, 100, -192, 160, 135, 100, -206, 174, 149, 100, -200, 167, 142, 100, -205, 169, 143, 100, -202, 165, 139, 100, -202, 165, 139, 100, -201, 164, 138, 100, -202, 165, 138, 100, -203, 166, 139, 100, -197, 160, 133, 100, -205, 168, 140, 100, -208, 171, 142, 100, -207, 170, 141, 100, -202, 165, 136, 100, -206, 170, 141, 100, -206, 171, 141, 100, -208, 172, 143, 100, -211, 174, 145, 100, -210, 173, 144, 100, -208, 171, 142, 100, -206, 170, 138, 100, -204, 173, 140, 100, -200, 167, 134, 100, -200, 168, 134, 100, -193, 163, 129, 100, -196, 166, 132, 100, -202, 172, 138, 100, -199, 169, 134, 100, -196, 165, 130, 100, -182, 146, 113, 100, -167, 127, 104, 100, -191, 150, 135, 100, -163, 124, 115, 100, -139, 97, 95, 100, -137, 93, 95, 100, -129, 87, 93, 100, -109, 65, 71, 100, -106, 65, 71, 100, -120, 83, 93, 100, -114, 75, 86, 100, -116, 86, 108, 100, -90, 58, 76, 100, -76, 46, 44, 100, -80, 50, 45, 100, -78, 49, 45, 100, -83, 54, 50, 100, -97, 67, 63, 100, -108, 74, 71, 100, -112, 73, 65, 100, -126, 85, 73, 100, -131, 89, 72, 100, -139, 94, 74, 100, -141, 96, 73, 100, -129, 85, 63, 100, -129, 85, 63, 100, -131, 86, 60, 100, -130, 84, 54, 100, -153, 107, 73, 100, -158, 115, 81, 100, -162, 120, 86, 100, -171, 130, 98, 100, -175, 135, 102, 100, -179, 141, 108, 100, -183, 147, 113, 100, -187, 151, 117, 100, -192, 156, 123, 100, -192, 156, 122, 100, -192, 156, 122, 100, -193, 157, 120, 100, -192, 157, 119, 100, -191, 156, 118, 100, -189, 154, 116, 100, -188, 153, 114, 100, -185, 150, 112, 100, -185, 150, 111, 100, -186, 150, 114, 100, -183, 147, 112, 100, -180, 144, 111, 100, -186, 150, 118, 100, -188, 151, 120, 100, -184, 147, 118, 100, -183, 146, 117, 100, -186, 149, 121, 100, -181, 144, 116, 100, -180, 143, 117, 100, -193, 156, 130, 100, -188, 150, 125, 100, -183, 146, 122, 100, -191, 153, 130, 100, -189, 151, 128, 100, -189, 153, 129, 100, -193, 156, 132, 100, -193, 155, 132, 100, -188, 150, 127, 100, -184, 146, 123, 100, -185, 147, 123, 100, -189, 151, 128, 100, -182, 144, 121, 100, -182, 146, 121, 100, -185, 148, 125, 100, -185, 147, 127, 100, -188, 151, 133, 100, -188, 152, 134, 100, -187, 149, 131, 100, -187, 148, 129, 100, -186, 148, 131, 100, -194, 161, 144, 100, -196, 163, 146, 100, -196, 163, 145, 100, -193, 163, 144, 100, -195, 166, 147, 100, -196, 166, 147, 100, -199, 168, 148, 100, -201, 168, 149, 100, -205, 172, 152, 100, -205, 172, 151, 100, -205, 171, 151, 100, -207, 174, 154, 100, -207, 175, 155, 100, -196, 164, 141, 100, -202, 170, 146, 100, -205, 174, 149, 100, -201, 169, 144, 100, -200, 165, 141, 100, -198, 164, 138, 100, -201, 166, 141, 100, -207, 170, 145, 100, -200, 163, 137, 100, -200, 164, 138, 100, -205, 170, 143, 100, -206, 171, 144, 100, -208, 171, 142, 100, -204, 167, 139, 100, -204, 167, 139, 100, -205, 168, 139, 100, -200, 164, 135, 100, -206, 169, 140, 100, -207, 171, 142, 100, -207, 170, 141, 100, -205, 168, 139, 100, -205, 168, 139, 100, -204, 168, 137, 100, -192, 158, 126, 100, -200, 166, 134, 100, -198, 167, 134, 100, -195, 165, 131, 100, -198, 168, 134, 100, -192, 162, 129, 100, -188, 156, 123, 100, -178, 142, 112, 100, -163, 125, 104, 100, -172, 132, 121, 100, -153, 112, 106, 100, -139, 95, 95, 100, -138, 93, 99, 100, -137, 99, 113, 100, -120, 78, 88, 100, -105, 65, 72, 100, -127, 94, 107, 100, -121, 87, 100, 100, -128, 95, 113, 100, -113, 80, 101, 100, -76, 44, 53, 100, -77, 48, 45, 100, -75, 46, 42, 100, -77, 48, 44, 100, -87, 58, 55, 100, -100, 68, 64, 100, -111, 74, 66, 100, -124, 84, 75, 100, -128, 88, 72, 100, -116, 74, 58, 100, -117, 73, 57, 100, -113, 71, 53, 100, -118, 75, 59, 100, -120, 74, 55, 100, -122, 77, 50, 100, -130, 87, 58, 100, -144, 99, 71, 100, -154, 109, 80, 100, -162, 117, 88, 100, -167, 126, 94, 100, -177, 138, 105, 100, -182, 144, 110, 100, -188, 152, 118, 100, -191, 155, 121, 100, -193, 157, 123, 100, -197, 161, 127, 100, -198, 162, 127, 100, -196, 160, 124, 100, -191, 156, 120, 100, -186, 151, 114, 100, -186, 150, 112, 100, -185, 149, 114, 100, -186, 150, 115, 100, -185, 149, 115, 100, -184, 148, 116, 100, -186, 150, 118, 100, -186, 150, 119, 100, -182, 145, 116, 100, -176, 139, 112, 100, -179, 142, 115, 100, -176, 139, 113, 100, -176, 139, 114, 100, -177, 140, 114, 100, -183, 146, 120, 100, -185, 147, 123, 100, -191, 153, 131, 100, -192, 154, 132, 100, -184, 146, 123, 100, -191, 153, 130, 100, -194, 156, 134, 100, -184, 146, 123, 100, -184, 146, 123, 100, -190, 152, 131, 100, -192, 156, 136, 100, -185, 148, 128, 100, -186, 148, 128, 100, -187, 152, 132, 100, -186, 148, 130, 100, -193, 155, 137, 100, -191, 157, 138, 100, -190, 154, 136, 100, -191, 152, 136, 100, -185, 145, 129, 100, -181, 143, 125, 100, -193, 160, 142, 100, -192, 159, 142, 100, -196, 163, 146, 100, -197, 165, 148, 100, -192, 161, 144, 100, -197, 167, 148, 100, -198, 167, 147, 100, -197, 164, 145, 100, -198, 166, 147, 100, -204, 170, 151, 100, -207, 172, 153, 100, -208, 175, 156, 100, -205, 171, 152, 100, -201, 168, 149, 100, -205, 172, 152, 100, -202, 170, 149, 100, -201, 169, 148, 100, -197, 165, 143, 100, -197, 165, 141, 100, -202, 170, 145, 100, -201, 167, 142, 100, -196, 161, 136, 100, -196, 162, 137, 100, -200, 166, 140, 100, -202, 168, 141, 100, -200, 164, 138, 100, -202, 165, 139, 100, -205, 168, 142, 100, -201, 165, 138, 100, -203, 166, 138, 100, -203, 168, 142, 100, -203, 169, 142, 100, -202, 166, 137, 100, -204, 167, 138, 100, -203, 166, 137, 100, -200, 162, 133, 100, -196, 160, 130, 100, -197, 165, 134, 100, -195, 165, 132, 100, -190, 160, 126, 100, -193, 161, 128, 100, -191, 158, 126, 100, -189, 156, 125, 100, -167, 130, 105, 100, -150, 109, 97, 100, -161, 125, 125, 100, -146, 107, 109, 100, -140, 95, 97, 100, -136, 91, 101, 100, -139, 110, 132, 100, -140, 104, 122, 100, -114, 73, 84, 100, -120, 88, 100, 100, -133, 103, 114, 100, -133, 100, 116, 100, -130, 97, 118, 100, -84, 50, 65, 100, -72, 41, 44, 100, -76, 47, 43, 100, -75, 47, 43, 100, -79, 51, 47, 100, -88, 58, 55, 100, -110, 74, 68, 100, -118, 78, 69, 100, -108, 68, 58, 100, -100, 60, 51, 100, -101, 61, 51, 100, -109, 69, 55, 100, -97, 58, 44, 100, -100, 57, 42, 100, -109, 66, 43, 100, -112, 71, 44, 100, -127, 85, 59, 100, -145, 102, 75, 100, -152, 106, 80, 100, -159, 115, 88, 100, -163, 124, 93, 100, -172, 132, 100, 100, -183, 144, 111, 100, -187, 150, 118, 100, -194, 158, 125, 100, -196, 160, 126, 100, -198, 162, 128, 100, -192, 156, 122, 100, -186, 150, 116, 100, -184, 148, 114, 100, -181, 145, 111, 100, -183, 147, 113, 100, -180, 145, 111, 100, -181, 145, 113, 100, -184, 147, 118, 100, -185, 148, 119, 100, -185, 148, 121, 100, -181, 144, 118, 100, -179, 142, 117, 100, -178, 140, 115, 100, -171, 133, 108, 100, -176, 138, 114, 100, -183, 146, 121, 100, -186, 148, 125, 100, -192, 154, 131, 100, -191, 154, 130, 100, -189, 151, 129, 100, -184, 146, 124, 100, -191, 153, 131, 100, -189, 151, 130, 100, -185, 147, 125, 100, -192, 154, 134, 100, -190, 152, 133, 100, -185, 148, 128, 100, -184, 146, 128, 100, -183, 146, 128, 100, -183, 145, 127, 100, -188, 149, 132, 100, -191, 152, 136, 100, -190, 154, 138, 100, -191, 156, 140, 100, -192, 153, 138, 100, -184, 146, 129, 100, -184, 147, 129, 100, -187, 155, 137, 100, -193, 160, 143, 100, -195, 162, 145, 100, -192, 158, 140, 100, -195, 162, 145, 100, -191, 158, 141, 100, -193, 160, 143, 100, -194, 161, 144, 100, -197, 167, 149, 100, -199, 168, 150, 100, -199, 167, 150, 100, -203, 169, 151, 100, -205, 172, 154, 100, -204, 171, 153, 100, -207, 174, 155, 100, -203, 170, 152, 100, -199, 167, 147, 100, -195, 162, 142, 100, -192, 159, 139, 100, -198, 166, 142, 100, -195, 162, 139, 100, -197, 164, 141, 100, -195, 162, 138, 100, -196, 162, 137, 100, -198, 166, 140, 100, -199, 167, 142, 100, -201, 168, 142, 100, -198, 165, 139, 100, -198, 166, 140, 100, -199, 166, 140, 100, -195, 162, 135, 100, -197, 166, 138, 100, -194, 162, 134, 100, -199, 164, 136, 100, -195, 159, 131, 100, -195, 160, 132, 100, -194, 160, 131, 100, -194, 162, 131, 100, -190, 159, 128, 100, -187, 155, 123, 100, -188, 154, 123, 100, -190, 157, 125, 100, -188, 155, 123, 100, -154, 116, 96, 100, -137, 93, 91, 100, -155, 124, 136, 100, -151, 122, 139, 100, -134, 93, 99, 100, -137, 97, 105, 100, -140, 109, 128, 100, -146, 118, 140, 100, -129, 90, 100, 100, -116, 80, 90, 100, -134, 104, 112, 100, -135, 104, 115, 100, -140, 108, 127, 100, -105, 70, 84, 100, -72, 39, 43, 100, -80, 51, 47, 100, -78, 50, 46, 100, -82, 54, 52, 100, -92, 62, 60, 100, -108, 69, 63, 100, -98, 57, 50, 100, -108, 68, 62, 100, -106, 66, 58, 100, -101, 61, 53, 100, -107, 67, 58, 100, -98, 59, 45, 100, -102, 60, 46, 100, -107, 66, 47, 100, -106, 66, 44, 100, -122, 82, 59, 100, -135, 95, 69, 100, -145, 103, 77, 100, -151, 106, 81, 100, -156, 117, 88, 100, -169, 130, 100, 100, -176, 135, 104, 100, -183, 145, 114, 100, -192, 156, 125, 100, -191, 155, 122, 100, -192, 157, 123, 100, -188, 152, 119, 100, -185, 149, 115, 100, -182, 146, 112, 100, -179, 143, 109, 100, -180, 144, 111, 100, -178, 142, 111, 100, -177, 140, 110, 100, -180, 143, 115, 100, -182, 145, 118, 100, -181, 144, 118, 100, -181, 144, 118, 100, -184, 146, 122, 100, -182, 144, 121, 100, -179, 141, 118, 100, -177, 139, 116, 100, -183, 147, 123, 100, -185, 150, 125, 100, -187, 150, 126, 100, -188, 151, 127, 100, -183, 145, 122, 100, -188, 150, 127, 100, -189, 151, 129, 100, -183, 145, 124, 100, -189, 151, 129, 100, -188, 150, 130, 100, -178, 140, 122, 100, -186, 148, 126, 100, -190, 153, 134, 100, -182, 144, 126, 100, -182, 143, 126, 100, -188, 149, 133, 100, -185, 146, 132, 100, -188, 149, 134, 100, -188, 152, 136, 100, -182, 143, 128, 100, -184, 149, 131, 100, -184, 149, 131, 100, -181, 146, 124, 100, -183, 149, 127, 100, -186, 150, 129, 100, -192, 157, 138, 100, -192, 159, 141, 100, -187, 154, 137, 100, -186, 153, 136, 100, -192, 159, 142, 100, -189, 157, 140, 100, -194, 162, 145, 100, -199, 168, 150, 100, -203, 172, 155, 100, -202, 169, 152, 100, -202, 169, 152, 100, -204, 171, 152, 100, -199, 166, 149, 100, -195, 162, 144, 100, -196, 162, 143, 100, -190, 156, 137, 100, -197, 164, 144, 100, -196, 164, 144, 100, -201, 169, 148, 100, -195, 161, 138, 100, -198, 164, 139, 100, -198, 166, 143, 100, -201, 167, 144, 100, -201, 168, 146, 100, -197, 165, 140, 100, -200, 168, 143, 100, -200, 168, 143, 100, -196, 164, 138, 100, -192, 161, 134, 100, -195, 164, 138, 100, -198, 165, 139, 100, -197, 163, 136, 100, -196, 162, 135, 100, -193, 159, 132, 100, -191, 156, 129, 100, -193, 157, 128, 100, -192, 156, 126, 100, -190, 153, 124, 100, -189, 155, 124, 100, -188, 154, 125, 100, -149, 110, 93, 100, -129, 88, 85, 100, -139, 103, 109, 100, -148, 122, 145, 100, -135, 100, 111, 100, -136, 99, 105, 100, -138, 105, 117, 100, -149, 124, 147, 100, -140, 105, 118, 100, -112, 73, 80, 100, -134, 99, 106, 100, -136, 101, 109, 100, -145, 114, 131, 100, -129, 91, 106, 100, -81, 42, 49, 100, -70, 40, 39, 100, -87, 58, 55, 100, -89, 60, 60, 100, -81, 51, 49, 100, -101, 63, 57, 100, -92, 50, 47, 100, -108, 68, 64, 100, -106, 66, 57, 100, -101, 61, 53, 100, -106, 65, 58, 100, -109, 67, 54, 100, -132, 90, 71, 100, -134, 91, 68, 100, -113, 72, 49, 100, -124, 83, 60, 100, -134, 93, 69, 100, -141, 99, 75, 100, -148, 102, 79, 100, -160, 117, 90, 100, -166, 127, 98, 100, -171, 132, 103, 100, -179, 140, 112, 100, -185, 148, 119, 100, -185, 148, 119, 100, -181, 145, 115, 100, -181, 144, 114, 100, -180, 143, 114, 100, -179, 142, 112, 100, -175, 139, 107, 100, -177, 140, 110, 100, -177, 140, 111, 100, -177, 140, 111, 100, -177, 140, 112, 100, -177, 140, 114, 100, -179, 142, 116, 100, -181, 143, 119, 100, -181, 143, 120, 100, -178, 140, 117, 100, -177, 139, 116, 100, -176, 138, 115, 100, -181, 147, 122, 100, -184, 147, 123, 100, -184, 147, 125, 100, -183, 146, 125, 100, -186, 148, 125, 100, -188, 150, 127, 100, -184, 146, 124, 100, -187, 148, 129, 100, -187, 149, 131, 100, -179, 141, 122, 100, -183, 145, 126, 100, -191, 152, 135, 100, -189, 152, 134, 100, -184, 146, 128, 100, -182, 143, 127, 100, -181, 142, 127, 100, -183, 144, 129, 100, -178, 139, 123, 100, -182, 143, 128, 100, -179, 141, 125, 100, -187, 151, 134, 100, -177, 143, 125, 100, -173, 137, 104, 100, -178, 141, 111, 100, -177, 140, 114, 100, -184, 147, 124, 100, -188, 154, 134, 100, -188, 155, 137, 100, -183, 150, 133, 100, -187, 154, 137, 100, -184, 150, 133, 100, -188, 156, 139, 100, -198, 169, 151, 100, -198, 170, 152, 100, -195, 164, 150, 100, -197, 164, 149, 100, -197, 164, 147, 100, -194, 161, 144, 100, -193, 160, 143, 100, -186, 153, 136, 100, -189, 156, 138, 100, -192, 159, 140, 100, -196, 162, 143, 100, -196, 163, 144, 100, -197, 164, 144, 100, -197, 164, 144, 100, -196, 163, 144, 100, -197, 163, 144, 100, -197, 164, 144, 100, -197, 165, 143, 100, -197, 164, 140, 100, -196, 163, 138, 100, -193, 160, 136, 100, -196, 164, 141, 100, -198, 165, 140, 100, -192, 158, 133, 100, -190, 156, 130, 100, -191, 159, 133, 100, -191, 159, 131, 100, -189, 153, 127, 100, -188, 151, 125, 100, -191, 153, 126, 100, -190, 153, 124, 100, -186, 151, 122, 100, -186, 154, 126, 100, -141, 105, 90, 100, -117, 79, 73, 100, -130, 93, 95, 100, -139, 110, 124, 100, -139, 108, 125, 100, -134, 100, 104, 100, -136, 104, 110, 100, -147, 121, 139, 100, -153, 124, 141, 100, -122, 80, 87, 100, -127, 87, 93, 100, -140, 102, 107, 100, -146, 108, 126, 100, -139, 99, 116, 100, -104, 59, 69, 100, -54, 24, 26, 100, -80, 52, 48, 100, -101, 70, 69, 100, -87, 56, 57, 100, -104, 68, 66, 100, -107, 66, 64, 100, -110, 68, 64, 100, -109, 67, 57, 100, -103, 61, 55, 100, -107, 65, 58, 100, -113, 71, 61, 100, -123, 78, 64, 100, -127, 80, 62, 100, -118, 76, 53, 100, -131, 87, 64, 100, -136, 90, 67, 100, -140, 95, 72, 100, -143, 97, 74, 100, -155, 111, 88, 100, -163, 123, 98, 100, -171, 134, 107, 100, -173, 136, 109, 100, -175, 138, 109, 100, -178, 141, 112, 100, -175, 138, 109, 100, -169, 132, 103, 100, -173, 136, 107, 100, -176, 139, 110, 100, -173, 136, 107, 100, -174, 137, 108, 100, -173, 136, 107, 100, -173, 136, 106, 100, -175, 138, 111, 100, -177, 140, 114, 100, -176, 139, 114, 100, -176, 138, 114, 100, -173, 136, 112, 100, -176, 138, 115, 100, -175, 137, 114, 100, -178, 140, 117, 100, -181, 144, 121, 100, -183, 145, 122, 100, -182, 145, 126, 100, -183, 146, 127, 100, -179, 141, 121, 100, -179, 141, 119, 100, -184, 146, 123, 100, -184, 146, 126, 100, -182, 144, 125, 100, -181, 142, 124, 100, -187, 149, 130, 100, -188, 149, 132, 100, -186, 147, 130, 100, -183, 145, 128, 100, -187, 149, 132, 100, -177, 137, 122, 100, -176, 137, 121, 100, -174, 135, 119, 100, -171, 133, 117, 100, -174, 135, 120, 100, -180, 142, 127, 100, -179, 144, 129, 100, -162, 123, 80, 100, -164, 128, 88, 100, -164, 128, 95, 100, -173, 136, 108, 100, -180, 146, 122, 100, -180, 148, 127, 100, -175, 142, 124, 100, -177, 144, 127, 100, -179, 146, 129, 100, -174, 142, 126, 100, -187, 159, 143, 100, -190, 161, 147, 100, -189, 160, 146, 100, -190, 160, 146, 100, -187, 156, 140, 100, -186, 154, 136, 100, -190, 160, 142, 100, -179, 148, 131, 100, -190, 158, 141, 100, -193, 159, 142, 100, -195, 162, 144, 100, -200, 168, 150, 100, -200, 168, 150, 100, -196, 164, 145, 100, -194, 161, 142, 100, -197, 166, 146, 100, -192, 160, 141, 100, -190, 157, 138, 100, -191, 159, 138, 100, -191, 159, 139, 100, -190, 157, 138, 100, -191, 158, 139, 100, -184, 151, 132, 100, -172, 138, 118, 100, -169, 137, 115, 100, -174, 142, 118, 100, -180, 148, 123, 100, -183, 146, 124, 100, -181, 143, 121, 100, -179, 143, 119, 100, -180, 146, 119, 100, -181, 147, 120, 100, -177, 145, 121, 100, -141, 107, 97, 100, -110, 76, 73, 100, -116, 81, 82, 100, -135, 103, 110, 100, -142, 114, 131, 100, -137, 105, 113, 100, -136, 104, 107, 100, -141, 110, 118, 100, -153, 124, 142, 100, -137, 97, 107, 100, -117, 73, 80, 100, -139, 96, 103, 100, -145, 101, 114, 100, -145, 101, 117, 100, -126, 81, 92, 100, -54, 23, 27, 100, -60, 36, 33, 100, -112, 77, 75, 100, -110, 74, 74, 100, -103, 65, 65, 100, -112, 71, 69, 100, -112, 70, 68, 100, -108, 64, 54, 100, -97, 53, 50, 100, -110, 67, 60, 100, -99, 56, 48, 100, -93, 49, 43, 100, -106, 59, 47, 100, -119, 76, 54, 100, -131, 87, 63, 100, -135, 88, 64, 100, -136, 90, 67, 100, -142, 95, 74, 100, -152, 106, 85, 100, -158, 116, 93, 100, -166, 128, 104, 100, -172, 135, 110, 100, -176, 139, 113, 100, -170, 133, 105, 100, -170, 133, 103, 100, -166, 129, 100, 100, -168, 131, 102, 100, -166, 129, 101, 100, -169, 132, 103, 100, -171, 134, 105, 100, -171, 134, 104, 100, -167, 130, 102, 100, -171, 134, 108, 100, -170, 133, 107, 100, -171, 134, 110, 100, -172, 135, 110, 100, -175, 137, 113, 100, -177, 139, 116, 100, -177, 139, 116, 100, -178, 140, 117, 100, -180, 142, 118, 100, -181, 143, 122, 100, -182, 144, 125, 100, -179, 141, 122, 100, -178, 139, 121, 100, -182, 145, 126, 100, -179, 142, 121, 100, -177, 139, 119, 100, -183, 144, 126, 100, -184, 145, 128, 100, -186, 147, 130, 100, -184, 145, 128, 100, -178, 139, 123, 100, -184, 146, 129, 100, -182, 145, 129, 100, -179, 142, 126, 100, -177, 138, 123, 100, -176, 137, 122, 100, -159, 120, 104, 100, -167, 127, 115, 100, -176, 137, 127, 100, -177, 141, 130, 100, -156, 113, 67, 100, -157, 118, 73, 100, -155, 118, 75, 100, -162, 126, 92, 100, -166, 130, 103, 100, -171, 138, 112, 100, -166, 134, 114, 100, -171, 138, 119, 100, -171, 138, 121, 100, -167, 137, 122, 100, -176, 147, 133, 100, -182, 153, 140, 100, -185, 156, 143, 100, -186, 158, 144, 100, -182, 153, 141, 100, -180, 151, 135, 100, -180, 151, 135, 100, -175, 146, 130, 100, -184, 155, 142, 100, -190, 159, 144, 100, -185, 154, 138, 100, -188, 158, 141, 100, -193, 164, 146, 100, -193, 162, 144, 100, -190, 157, 139, 100, -191, 162, 144, 100, -185, 157, 138, 100, -187, 154, 136, 100, -191, 158, 139, 100, -186, 153, 135, 100, -181, 148, 132, 100, -177, 143, 128, 100, -169, 136, 119, 100, -163, 130, 112, 100, -160, 127, 109, 100, -161, 129, 111, 100, -165, 131, 112, 100, -166, 130, 111, 100, -167, 129, 111, 100, -163, 127, 109, 100, -163, 126, 107, 100, -159, 125, 105, 100, -155, 121, 105, 100, -138, 104, 96, 100, -119, 88, 84, 100, -103, 72, 72, 100, -121, 89, 90, 100, -140, 110, 119, 100, -136, 106, 114, 100, -132, 100, 102, 100, -135, 104, 107, 100, -145, 115, 128, 100, -146, 108, 120, 100, -114, 71, 77, 100, -125, 83, 87, 100, -138, 95, 101, 100, -144, 100, 112, 100, -128, 83, 93, 100, -84, 44, 52, 100, -48, 23, 22, 100, -107, 71, 69, 100, -116, 76, 75, 100, -103, 65, 63, 100, -97, 57, 57, 100, -112, 68, 69, 100, -114, 66, 58, 100, -93, 50, 48, 100, -107, 64, 58, 100, -86, 43, 36, 100, -98, 56, 50, 100, -114, 68, 55, 100, -124, 78, 56, 100, -131, 85, 62, 100, -136, 89, 65, 100, -131, 84, 61, 100, -134, 86, 68, 100, -145, 97, 80, 100, -157, 113, 92, 100, -164, 124, 102, 100, -169, 132, 108, 100, -167, 131, 104, 100, -163, 126, 98, 100, -164, 127, 100, 100, -164, 127, 99, 100, -160, 123, 96, 100, -164, 127, 101, 100, -168, 131, 103, 100, -168, 131, 103, 100, -166, 129, 101, 100, -165, 127, 101, 100, -167, 130, 104, 100, -169, 132, 106, 100, -174, 137, 113, 100, -172, 135, 111, 100, -172, 134, 111, 100, -175, 137, 114, 100, -176, 138, 115, 100, -175, 137, 115, 100, -177, 139, 118, 100, -181, 144, 125, 100, -183, 145, 126, 100, -178, 139, 121, 100, -173, 134, 116, 100, -177, 139, 122, 100, -179, 143, 124, 100, -179, 142, 124, 100, -178, 139, 122, 100, -180, 141, 124, 100, -183, 144, 127, 100, -180, 142, 125, 100, -171, 133, 118, 100, -172, 133, 118, 100, -169, 130, 115, 100, -175, 137, 121, 100, -180, 143, 127, 100, -174, 136, 122, 100, -159, 120, 104, 100, -174, 136, 124, 100, -179, 143, 132, 100, -177, 142, 132, 100, -152, 107, 64, 100, -147, 105, 61, 100, -151, 114, 69, 100, -151, 115, 76, 100, -157, 121, 86, 100, -167, 130, 103, 100, -164, 130, 106, 100, -161, 128, 107, 100, -171, 139, 123, 100, -175, 146, 131, 100, -172, 143, 130, 100, -173, 145, 133, 100, -175, 147, 135, 100, -176, 149, 137, 100, -175, 146, 135, 100, -171, 142, 129, 100, -173, 144, 130, 100, -180, 151, 138, 100, -184, 155, 142, 100, -182, 153, 140, 100, -183, 153, 142, 100, -183, 154, 139, 100, -186, 156, 140, 100, -188, 158, 141, 100, -190, 159, 141, 100, -192, 162, 145, 100, -190, 161, 146, 100, -181, 149, 135, 100, -176, 145, 132, 100, -172, 140, 127, 100, -169, 135, 123, 100, -167, 133, 122, 100, -168, 135, 121, 100, -166, 132, 118, 100, -158, 125, 108, 100, -158, 125, 108, 100, -158, 124, 107, 100, -159, 124, 107, 100, -157, 121, 104, 100, -153, 119, 102, 100, -154, 117, 104, 100, -151, 116, 103, 100, -145, 111, 99, 100, -136, 102, 94, 100, -127, 96, 91, 100, -112, 82, 81, 100, -102, 71, 73, 100, -123, 90, 94, 100, -130, 98, 102, 100, -128, 97, 99, 100, -135, 102, 106, 100, -138, 105, 109, 100, -149, 112, 118, 100, -129, 85, 91, 100, -108, 67, 68, 100, -127, 84, 83, 100, -134, 88, 92, 100, -131, 85, 95, 100, -109, 65, 74, 100, -56, 25, 29, 100, -93, 60, 57, 100, -108, 67, 65, 100, -92, 52, 51, 100, -75, 37, 36, 100, -106, 60, 61, 100, -120, 67, 60, 100, -86, 41, 37, 100, -102, 59, 52, 100, -101, 57, 49, 100, -118, 73, 64, 100, -124, 77, 62, 100, -125, 78, 59, 100, -129, 82, 61, 100, -132, 85, 60, 100, -130, 82, 58, 100, -127, 79, 64, 100, -138, 91, 77, 100, -154, 112, 93, 100, -161, 120, 99, 100, -165, 125, 104, 100, -161, 122, 98, 100, -159, 121, 96, 100, -161, 124, 98, 100, -159, 122, 96, 100, -159, 122, 96, 100, -163, 126, 100, 100, -166, 129, 103, 100, -166, 129, 102, 100, -164, 127, 100, 100, -163, 126, 100, 100, -166, 129, 103, 100, -171, 134, 108, 100, -172, 135, 109, 100, -169, 132, 106, 100, -171, 134, 109, 100, -176, 138, 115, 100, -174, 136, 113, 100, -173, 135, 115, 100, -175, 137, 119, 100, -175, 139, 120, 100, -175, 136, 118, 100, -172, 133, 116, 100, -173, 135, 119, 100, -171, 134, 117, 100, -176, 142, 123, 100, -177, 140, 122, 100, -176, 137, 120, 100, -177, 138, 122, 100, -178, 143, 127, 100, -177, 143, 126, 100, -175, 142, 125, 100, -174, 136, 120, 100, -174, 134, 122, 100, -170, 130, 118, 100, -180, 145, 132, 100, -169, 132, 120, 100, -163, 123, 111, 100, -169, 132, 121, 100, -175, 141, 129, 100, -176, 142, 133, 100, -146, 102, 61, 100, -140, 96, 56, 100, -139, 100, 56, 100, -148, 111, 67, 100, -156, 118, 82, 100, -165, 128, 98, 100, -158, 122, 95, 100, -154, 121, 99, 100, -167, 137, 120, 100, -168, 139, 123, 100, -162, 133, 120, 100, -169, 141, 127, 100, -175, 147, 135, 100, -172, 143, 131, 100, -165, 136, 125, 100, -171, 141, 128, 100, -175, 145, 133, 100, -175, 145, 133, 100, -182, 152, 141, 100, -177, 148, 135, 100, -183, 153, 143, 100, -185, 156, 145, 100, -186, 158, 146, 100, -187, 158, 144, 100, -185, 156, 142, 100, -185, 157, 142, 100, -182, 153, 141, 100, -173, 143, 133, 100, -170, 140, 130, 100, -165, 135, 125, 100, -164, 131, 122, 100, -164, 130, 121, 100, -163, 129, 119, 100, -162, 128, 118, 100, -157, 123, 111, 100, -156, 122, 109, 100, -156, 122, 109, 100, -156, 122, 109, 100, -153, 119, 106, 100, -152, 118, 105, 100, -153, 119, 107, 100, -150, 115, 103, 100, -144, 110, 99, 100, -137, 103, 94, 100, -130, 97, 91, 100, -121, 91, 87, 100, -107, 78, 79, 100, -102, 71, 74, 100, -116, 82, 86, 100, -121, 86, 88, 100, -129, 92, 95, 100, -134, 94, 98, 100, -145, 104, 109, 100, -141, 97, 100, 100, -101, 57, 58, 100, -116, 72, 73, 100, -132, 88, 90, 100, -134, 89, 95, 100, -124, 79, 90, 100, -77, 40, 47, 100, -86, 53, 51, 100, -104, 64, 62, 100, -84, 41, 42, 100, -67, 28, 29, 100, -89, 46, 48, 100, -130, 74, 66, 100, -83, 35, 28, 100, -99, 55, 49, 100, -118, 70, 60, 100, -130, 81, 68, 100, -128, 79, 65, 100, -123, 76, 61, 100, -127, 81, 62, 100, -136, 90, 64, 100, -130, 84, 57, 100, -115, 71, 54, 100, -131, 85, 70, 100, -151, 108, 91, 100, -156, 116, 97, 100, -156, 115, 96, 100, -150, 110, 86, 100, -155, 116, 90, 100, -157, 119, 94, 100, -156, 118, 94, 100, -158, 121, 96, 100, -161, 124, 98, 100, -161, 124, 98, 100, -164, 127, 100, 100, -163, 126, 100, 100, -162, 125, 99, 100, -164, 127, 101, 100, -169, 131, 106, 100, -167, 129, 105, 100, -165, 128, 104, 100, -172, 134, 110, 100, -173, 135, 112, 100, -169, 131, 108, 100, -169, 131, 111, 100, -172, 134, 116, 100, -173, 138, 119, 100, -172, 136, 118, 100, -170, 135, 118, 100, -175, 139, 123, 100, -169, 133, 116, 100, -172, 137, 118, 100, -167, 129, 112, 100, -171, 132, 115, 100, -177, 141, 123, 100, -168, 134, 120, 100, -173, 139, 126, 100, -176, 141, 128, 100, -177, 141, 128, 100, -175, 137, 126, 100, -172, 132, 122, 100, -170, 134, 122, 100, -159, 123, 112, 100, -161, 124, 113, 100, -169, 132, 123, 100, -170, 136, 126, 100, -173, 139, 129, 100, -146, 103, 62, 100, -143, 100, 57, 100, -146, 103, 58, 100, -148, 109, 66, 100, -154, 116, 81, 100, -157, 120, 87, 100, -157, 123, 94, 100, -162, 130, 108, 100, -160, 130, 110, 100, -160, 131, 112, 100, -162, 134, 120, 100, -158, 130, 115, 100, -170, 142, 130, 100, -173, 144, 133, 100, -166, 137, 126, 100, -170, 140, 130, 100, -175, 145, 135, 100, -170, 141, 130, 100, -170, 141, 130, 100, -173, 143, 133, 100, -178, 148, 138, 100, -182, 153, 143, 100, -185, 157, 147, 100, -184, 154, 144, 100, -180, 149, 139, 100, -179, 148, 139, 100, -175, 145, 136, 100, -167, 137, 128, 100, -165, 135, 126, 100, -162, 132, 122, 100, -162, 132, 121, 100, -164, 133, 123, 100, -162, 129, 119, 100, -159, 125, 116, 100, -157, 123, 114, 100, -157, 123, 114, 100, -159, 125, 115, 100, -156, 122, 112, 100, -156, 122, 112, 100, -150, 116, 105, 100, -149, 115, 104, 100, -145, 111, 100, 100, -140, 106, 97, 100, -139, 105, 95, 100, -132, 99, 91, 100, -128, 97, 93, 100, -120, 92, 88, 100, -109, 82, 83, 100, -101, 69, 72, 100, -106, 68, 71, 100, -114, 76, 75, 100, -124, 83, 83, 100, -129, 86, 87, 100, -133, 86, 88, 100, -117, 72, 73, 100, -93, 51, 53, 100, -115, 72, 73, 100, -124, 78, 81, 100, -123, 76, 85, 100, -98, 54, 64, 100, -89, 51, 53, 100, -116, 76, 74, 100, -105, 60, 60, 100, -83, 41, 44, 100, -81, 39, 45, 100, -135, 80, 70, 100, -112, 60, 44, 100, -114, 63, 52, 100, -128, 77, 65, 100, -136, 86, 73, 100, -133, 84, 69, 100, -124, 77, 61, 100, -127, 80, 62, 100, -138, 91, 65, 100, -130, 84, 57, 100, -109, 69, 50, 100, -119, 77, 65, 100, -141, 98, 83, 100, -152, 111, 94, 100, -151, 110, 90, 100, -144, 103, 80, 100, -151, 110, 88, 100, -152, 112, 90, 100, -153, 115, 94, 100, -154, 116, 93, 100, -158, 120, 97, 100, -161, 123, 100, 100, -160, 122, 98, 100, -160, 122, 98, 100, -161, 123, 100, 100, -162, 124, 99, 100, -163, 125, 102, 100, -164, 126, 104, 100, -168, 130, 107, 100, -170, 132, 109, 100, -170, 132, 110, 100, -168, 130, 111, 100, -172, 134, 115, 100, -167, 130, 112, 100, -169, 134, 116, 100, -169, 137, 119, 100, -167, 132, 116, 100, -167, 133, 116, 100, -165, 129, 112, 100, -174, 139, 123, 100, -169, 133, 117, 100, -169, 134, 119, 100, -176, 143, 130, 100, -173, 139, 127, 100, -172, 139, 127, 100, -174, 140, 129, 100, -173, 140, 129, 100, -172, 136, 124, 100, -161, 122, 112, 100, -163, 127, 116, 100, -163, 129, 119, 100, -159, 125, 114, 100, -173, 139, 129, 100, -174, 140, 131, 100, -173, 139, 129, 100, -139, 95, 54, 100, -137, 93, 51, 100, -138, 94, 53, 100, -139, 100, 58, 100, -145, 108, 70, 100, -146, 110, 76, 100, -156, 121, 91, 100, -153, 121, 95, 100, -151, 118, 94, 100, -158, 127, 107, 100, -160, 132, 116, 100, -152, 122, 108, 100, -152, 121, 108, 100, -166, 136, 125, 100, -163, 134, 124, 100, -166, 139, 127, 100, -169, 141, 130, 100, -171, 143, 132, 100, -171, 142, 132, 100, -173, 143, 133, 100, -176, 146, 136, 100, -177, 147, 137, 100, -177, 148, 138, 100, -185, 156, 147, 100, -178, 148, 138, 100, -168, 138, 132, 100, -166, 135, 131, 100, -164, 134, 129, 100, -161, 130, 126, 100, -157, 127, 120, 100, -161, 130, 122, 100, -160, 130, 121, 100, -159, 129, 120, 100, -157, 125, 116, 100, -158, 124, 114, 100, -157, 123, 114, 100, -157, 123, 114, 100, -155, 121, 112, 100, -153, 120, 111, 100, -148, 114, 104, 100, -144, 110, 100, 100, -139, 105, 95, 100, -139, 105, 96, 100, -136, 102, 93, 100, -134, 100, 92, 100, -133, 99, 94, 100, -127, 97, 93, 100, -121, 91, 90, 100, -108, 80, 82, 100, -92, 61, 61, 100, -97, 61, 59, 100, -111, 68, 66, 100, -117, 73, 74, 100, -120, 71, 73, 100, -127, 80, 83, 100, -109, 67, 71, 100, -86, 45, 47, 100, -108, 73, 78, 100, -115, 79, 91, 100, -105, 62, 74, 100, -88, 47, 51, 100, -115, 73, 67, 100, -128, 78, 72, 100, -96, 50, 51, 100, -88, 45, 51, 100, -141, 86, 78, 100, -140, 83, 63, 100, -133, 76, 60, 100, -138, 81, 70, 100, -138, 84, 72, 100, -125, 75, 61, 100, -121, 73, 58, 100, -130, 84, 64, 100, -139, 92, 68, 100, -132, 85, 60, 100, -106, 66, 48, 100, -114, 73, 65, 100, -136, 94, 80, 100, -145, 104, 87, 100, -146, 104, 85, 100, -141, 100, 77, 100, -148, 107, 85, 100, -149, 110, 88, 100, -151, 113, 91, 100, -151, 113, 90, 100, -155, 117, 94, 100, -161, 123, 100, 100, -158, 121, 96, 100, -159, 122, 98, 100, -161, 123, 100, 100, -162, 124, 101, 100, -163, 127, 104, 100, -163, 126, 106, 100, -166, 127, 105, 100, -165, 127, 108, 100, -170, 132, 113, 100, -166, 127, 110, 100, -166, 130, 111, 100, -167, 131, 114, 100, -167, 131, 115, 100, -166, 133, 116, 100, -168, 134, 119, 100, -166, 132, 117, 100, -162, 128, 113, 100, -169, 135, 122, 100, -162, 128, 115, 100, -170, 136, 124, 100, -169, 135, 124, 100, -167, 133, 122, 100, -170, 140, 130, 100, -173, 139, 128, 100, -172, 138, 126, 100, -166, 131, 119, 100, -161, 125, 115, 100, -164, 129, 120, 100, -162, 127, 118, 100, -165, 130, 121, 100, -169, 135, 127, 100, -170, 134, 126, 100, -173, 139, 130, 100, -132, 91, 52, 100, -127, 86, 46, 100, -122, 84, 43, 100, -129, 90, 49, 100, -143, 106, 64, 100, -144, 109, 73, 100, -140, 102, 73, 100, -144, 109, 82, 100, -148, 117, 91, 100, -152, 120, 100, 100, -153, 122, 103, 100, -146, 113, 98, 100, -147, 116, 103, 100, -156, 127, 114, 100, -157, 127, 116, 100, -158, 130, 119, 100, -165, 138, 127, 100, -171, 142, 132, 100, -171, 141, 131, 100, -169, 139, 129, 100, -178, 148, 138, 100, -175, 145, 135, 100, -175, 145, 135, 100, -184, 153, 148, 100, -172, 141, 136, 100, -162, 131, 128, 100, -160, 131, 127, 100, -161, 132, 128, 100, -161, 132, 128, 100, -161, 131, 127, 100, -160, 130, 126, 100, -159, 128, 123, 100, -159, 128, 122, 100, -156, 126, 121, 100, -157, 125, 118, 100, -154, 123, 113, 100, -155, 123, 114, 100, -154, 119, 113, 100, -148, 115, 109, 100, -145, 111, 102, 100, -142, 108, 99, 100, -138, 104, 95, 100, -137, 103, 93, 100, -134, 100, 91, 100, -130, 96, 88, 100, -126, 91, 86, 100, -125, 91, 88, 100, -124, 94, 91, 100, -118, 88, 89, 100, -106, 80, 80, 100, -85, 59, 63, 100, -85, 51, 55, 100, -105, 64, 64, 100, -120, 76, 77, 100, -124, 81, 85, 100, -123, 80, 86, 100, -95, 51, 59, 100, -90, 58, 65, 100, -124, 96, 110, 100, -112, 76, 93, 100, -86, 47, 50, 100, -113, 72, 67, 100, -122, 69, 63, 100, -104, 54, 53, 100, -89, 48, 55, 100, -139, 82, 76, 100, -137, 76, 59, 100, -127, 68, 53, 100, -135, 78, 67, 100, -131, 76, 64, 100, -116, 66, 54, 100, -123, 76, 62, 100, -132, 85, 67, 100, -138, 90, 69, 100, -129, 82, 60, 100, -99, 59, 42, 100, -103, 64, 58, 100, -131, 90, 77, 100, -140, 98, 82, 100, -139, 98, 80, 100, -135, 94, 75, 100, -144, 103, 82, 100, -147, 106, 84, 100, -148, 109, 88, 100, -149, 110, 88, 100, -152, 114, 91, 100, -157, 119, 96, 100, -155, 117, 94, 100, -158, 120, 97, 100, -160, 122, 99, 100, -163, 125, 102, 100, -163, 126, 102, 100, -161, 123, 104, 100, -162, 124, 103, 100, -165, 127, 106, 100, -167, 129, 110, 100, -159, 120, 102, 100, -162, 124, 107, 100, -166, 130, 114, 100, -165, 131, 115, 100, -162, 129, 112, 100, -164, 130, 117, 100, -167, 133, 122, 100, -157, 123, 111, 100, -160, 126, 114, 100, -168, 133, 122, 100, -162, 128, 116, 100, -157, 123, 110, 100, -166, 136, 123, 100, -162, 132, 122, 100, -164, 130, 120, 100, -166, 132, 119, 100, -165, 130, 118, 100, -164, 130, 120, 100, -167, 133, 124, 100, -163, 129, 120, 100, -160, 127, 119, 100, -166, 135, 129, 100, -159, 128, 119, 100, -162, 131, 121, 100, -119, 81, 42, 100, -118, 80, 42, 100, -119, 82, 45, 100, -132, 94, 55, 100, -136, 98, 62, 100, -138, 101, 70, 100, -137, 100, 73, 100, -143, 108, 82, 100, -147, 114, 90, 100, -145, 113, 93, 100, -147, 113, 95, 100, -150, 117, 99, 100, -145, 112, 97, 100, -148, 116, 104, 100, -156, 127, 115, 100, -151, 122, 111, 100, -161, 131, 121, 100, -168, 138, 128, 100, -166, 136, 126, 100, -167, 137, 127, 100, -175, 146, 135, 100, -168, 138, 128, 100, -174, 144, 134, 100, -166, 135, 127, 100, -162, 126, 125, 100, -157, 127, 124, 100, -157, 129, 125, 100, -160, 131, 127, 100, -162, 134, 130, 100, -161, 133, 129, 100, -160, 131, 127, 100, -158, 128, 124, 100, -155, 124, 121, 100, -153, 122, 118, 100, -152, 122, 117, 100, -149, 118, 112, 100, -148, 117, 111, 100, -148, 117, 112, 100, -143, 111, 106, 100, -144, 110, 102, 100, -146, 112, 104, 100, -145, 110, 106, 100, -140, 106, 101, 100, -137, 103, 94, 100, -133, 99, 91, 100, -127, 92, 89, 100, -123, 88, 86, 100, -123, 92, 89, 100, -119, 90, 88, 100, -114, 85, 86, 100, -103, 77, 84, 100, -84, 59, 71, 100, -78, 49, 57, 100, -104, 64, 66, 100, -111, 66, 68, 100, -110, 67, 78, 100, -109, 65, 78, 100, -94, 50, 62, 100, -99, 57, 66, 100, -108, 74, 83, 100, -90, 57, 58, 100, -122, 79, 72, 100, -118, 65, 59, 100, -109, 57, 56, 100, -92, 50, 57, 100, -126, 68, 63, 100, -146, 82, 65, 100, -125, 64, 49, 100, -132, 74, 62, 100, -130, 73, 61, 100, -128, 77, 64, 100, -131, 82, 69, 100, -131, 84, 69, 100, -128, 81, 61, 100, -125, 80, 58, 100, -91, 53, 38, 100, -98, 60, 55, 100, -125, 85, 75, 100, -135, 95, 80, 100, -135, 94, 77, 100, -132, 91, 71, 100, -137, 96, 77, 100, -141, 100, 81, 100, -145, 104, 83, 100, -150, 109, 87, 100, -150, 111, 89, 100, -153, 115, 95, 100, -154, 116, 96, 100, -155, 117, 97, 100, -156, 118, 98, 100, -158, 120, 100, 100, -160, 121, 101, 100, -159, 120, 100, 100, -161, 123, 104, 100, -164, 126, 106, 100, -160, 122, 102, 100, -160, 121, 104, 100, -162, 123, 107, 100, -165, 128, 112, 100, -164, 129, 113, 100, -158, 123, 106, 100, -162, 126, 111, 100, -161, 127, 115, 100, -162, 128, 118, 100, -165, 133, 123, 100, -163, 130, 118, 100, -156, 122, 111, 100, -162, 128, 117, 100, -165, 134, 121, 100, -162, 133, 119, 100, -158, 125, 114, 100, -162, 128, 118, 100, -165, 131, 121, 100, -166, 132, 123, 100, -163, 129, 120, 100, -164, 132, 122, 100, -157, 126, 120, 100, -162, 131, 126, 100, -163, 134, 124, 100, -152, 123, 113, 100, -108, 71, 35, 100, -113, 77, 37, 100, -118, 83, 45, 100, -128, 91, 53, 100, -130, 93, 57, 100, -134, 98, 67, 100, -138, 103, 76, 100, -137, 103, 78, 100, -140, 106, 85, 100, -142, 110, 90, 100, -142, 108, 89, 100, -138, 104, 86, 100, -143, 110, 94, 100, -141, 109, 97, 100, -145, 116, 104, 100, -142, 112, 101, 100, -150, 120, 109, 100, -159, 129, 119, 100, -164, 134, 124, 100, -164, 135, 124, 100, -165, 137, 127, 100, -163, 135, 125, 100, -164, 136, 127, 100, -159, 129, 123, 100, -153, 118, 116, 100, -151, 121, 119, 100, -155, 127, 126, 100, -154, 128, 126, 100, -151, 126, 123, 100, -156, 128, 124, 100, -155, 126, 122, 100, -150, 121, 117, 100, -151, 122, 118, 100, -152, 122, 117, 100, -152, 121, 116, 100, -147, 115, 111, 100, -145, 114, 109, 100, -145, 114, 109, 100, -146, 112, 107, 100, -146, 111, 106, 100, -148, 112, 108, 100, -144, 111, 106, 100, -140, 106, 99, 100, -137, 102, 93, 100, -133, 99, 92, 100, -132, 97, 94, 100, -127, 93, 89, 100, -125, 93, 90, 100, -125, 94, 91, 100, -120, 89, 88, 100, -109, 78, 82, 100, -99, 69, 77, 100, -82, 59, 70, 100, -73, 46, 56, 100, -92, 55, 64, 100, -119, 82, 101, 100, -120, 84, 106, 100, -104, 63, 79, 100, -78, 39, 46, 100, -73, 41, 44, 100, -77, 41, 38, 100, -133, 88, 78, 100, -125, 72, 62, 100, -113, 61, 57, 100, -99, 55, 60, 100, -115, 60, 56, 100, -157, 94, 77, 100, -134, 72, 51, 100, -134, 74, 58, 100, -132, 75, 63, 100, -132, 79, 68, 100, -128, 78, 67, 100, -134, 86, 71, 100, -130, 83, 63, 100, -124, 80, 61, 100, -87, 50, 36, 100, -95, 58, 52, 100, -123, 83, 73, 100, -125, 86, 75, 100, -130, 89, 75, 100, -130, 87, 71, 100, -130, 88, 71, 100, -134, 94, 76, 100, -141, 100, 82, 100, -144, 103, 85, 100, -146, 106, 87, 100, -149, 111, 92, 100, -150, 111, 93, 100, -154, 116, 97, 100, -155, 117, 98, 100, -155, 116, 98, 100, -155, 117, 99, 100, -156, 117, 100, 100, -161, 122, 105, 100, -156, 117, 100, 100, -156, 117, 100, 100, -161, 122, 106, 100, -162, 123, 108, 100, -165, 126, 111, 100, -163, 127, 113, 100, -158, 121, 108, 100, -158, 122, 105, 100, -158, 122, 107, 100, -159, 125, 113, 100, -165, 131, 120, 100, -161, 127, 114, 100, -158, 124, 114, 100, -163, 129, 120, 100, -162, 128, 118, 100, -159, 129, 118, 100, -156, 127, 116, 100, -153, 123, 112, 100, -160, 130, 119, 100, -162, 132, 122, 100, -160, 128, 118, 100, -159, 128, 120, 100, -157, 127, 122, 100, -160, 129, 124, 100, -157, 126, 120, 100, -153, 123, 115, 100, -101, 64, 32, 100, -106, 70, 33, 100, -114, 79, 41, 100, -119, 85, 46, 100, -119, 84, 48, 100, -125, 90, 58, 100, -129, 94, 66, 100, -131, 97, 71, 100, -137, 101, 82, 100, -137, 102, 83, 100, -140, 109, 88, 100, -134, 103, 85, 100, -132, 103, 87, 100, -135, 106, 92, 100, -131, 103, 90, 100, -134, 106, 93, 100, -139, 111, 98, 100, -143, 114, 103, 100, -150, 122, 111, 100, -156, 128, 118, 100, -163, 135, 127, 100, -160, 134, 127, 100, -157, 128, 121, 100, -156, 131, 124, 100, -148, 123, 118, 100, -144, 117, 114, 100, -147, 122, 119, 100, -149, 125, 123, 100, -148, 123, 121, 100, -149, 122, 118, 100, -148, 123, 117, 100, -147, 122, 116, 100, -152, 124, 120, 100, -152, 121, 118, 100, -152, 121, 116, 100, -149, 118, 113, 100, -146, 115, 110, 100, -143, 112, 107, 100, -145, 112, 108, 100, -146, 110, 106, 100, -145, 110, 106, 100, -141, 107, 101, 100, -137, 103, 94, 100, -133, 98, 89, 100, -131, 96, 89, 100, -131, 96, 93, 100, -130, 95, 91, 100, -129, 95, 93, 100, -126, 95, 92, 100, -119, 88, 86, 100, -113, 80, 82, 100, -106, 71, 75, 100, -97, 68, 75, 100, -93, 68, 80, 100, -86, 61, 73, 100, -103, 63, 74, 100, -122, 79, 95, 100, -100, 65, 80, 100, -78, 42, 44, 100, -77, 34, 33, 100, -85, 41, 37, 100, -137, 90, 78, 100, -127, 74, 62, 100, -119, 65, 57, 100, -111, 61, 62, 100, -101, 45, 40, 100, -155, 93, 76, 100, -150, 90, 67, 100, -136, 76, 56, 100, -129, 72, 57, 100, -134, 81, 72, 100, -121, 71, 63, 100, -135, 86, 69, 100, -132, 84, 64, 100, -122, 77, 59, 100, -90, 53, 39, 100, -97, 58, 52, 100, -118, 78, 69, 100, -118, 78, 70, 100, -121, 81, 70, 100, -122, 82, 67, 100, -125, 83, 68, 100, -128, 89, 71, 100, -139, 100, 82, 100, -141, 101, 83, 100, -141, 103, 85, 100, -146, 108, 90, 100, -149, 110, 92, 100, -149, 111, 92, 100, -152, 114, 95, 100, -153, 114, 96, 100, -153, 114, 97, 100, -154, 115, 98, 100, -159, 120, 104, 100, -156, 117, 101, 100, -156, 117, 102, 100, -159, 120, 104, 100, -159, 120, 103, 100, -161, 123, 108, 100, -162, 126, 115, 100, -158, 122, 110, 100, -154, 120, 106, 100, -148, 112, 97, 100, -153, 118, 102, 100, -155, 121, 108, 100, -157, 123, 111, 100, -162, 128, 118, 100, -164, 130, 121, 100, -163, 129, 119, 100, -159, 129, 119, 100, -156, 126, 116, 100, -154, 124, 116, 100, -160, 130, 123, 100, -159, 129, 119, 100, -158, 129, 118, 100, -153, 122, 115, 100, -152, 121, 116, 100, -156, 124, 120, 100, -143, 112, 104, 100, -141, 111, 102, 100, -93, 60, 27, 100, -97, 63, 29, 100, -107, 72, 36, 100, -113, 78, 43, 100, -111, 77, 45, 100, -118, 85, 53, 100, -118, 84, 55, 100, -120, 86, 61, 100, -128, 95, 74, 100, -123, 91, 72, 100, -125, 96, 77, 100, -130, 101, 83, 100, -126, 97, 84, 100, -130, 102, 88, 100, -131, 104, 89, 100, -138, 112, 99, 100, -138, 112, 100, 100, -131, 104, 92, 100, -140, 112, 101, 100, -148, 121, 109, 100, -149, 122, 111, 100, -151, 124, 114, 100, -155, 128, 119, 100, -152, 127, 120, 100, -141, 119, 113, 100, -141, 117, 111, 100, -145, 119, 115, 100, -144, 120, 116, 100, -142, 119, 115, 100, -146, 123, 121, 100, -146, 122, 118, 100, -146, 120, 117, 100, -150, 123, 120, 100, -149, 118, 115, 100, -148, 117, 114, 100, -148, 117, 113, 100, -147, 116, 112, 100, -142, 111, 108, 100, -141, 110, 108, 100, -140, 108, 104, 100, -141, 106, 102, 100, -139, 104, 100, 100, -136, 101, 94, 100, -133, 99, 89, 100, -131, 97, 89, 100, -132, 96, 93, 100, -130, 95, 91, 100, -128, 93, 91, 100, -128, 94, 92, 100, -123, 90, 87, 100, -117, 81, 83, 100, -112, 77, 81, 100, -106, 75, 80, 100, -104, 74, 84, 100, -95, 71, 81, 100, -74, 41, 45, 100, -79, 40, 44, 100, -81, 42, 43, 100, -100, 54, 48, 100, -107, 58, 52, 100, -93, 45, 39, 100, -145, 95, 82, 100, -130, 74, 60, 100, -129, 72, 57, 100, -132, 76, 60, 100, -106, 48, 38, 100, -143, 81, 70, 100, -158, 96, 75, 100, -147, 85, 62, 100, -144, 85, 63, 100, -145, 91, 75, 100, -131, 79, 67, 100, -139, 89, 72, 100, -135, 87, 67, 100, -123, 79, 61, 100, -94, 55, 39, 100, -95, 55, 50, 100, -113, 73, 68, 100, -119, 79, 71, 100, -120, 80, 70, 100, -115, 75, 60, 100, -117, 75, 61, 100, -121, 79, 65, 100, -132, 92, 75, 100, -137, 99, 82, 100, -138, 98, 82, 100, -140, 102, 84, 100, -143, 104, 87, 100, -146, 107, 89, 100, -146, 107, 90, 100, -150, 111, 94, 100, -151, 113, 97, 100, -153, 114, 99, 100, -156, 117, 102, 100, -155, 116, 100, 100, -154, 115, 100, 100, -156, 117, 101, 100, -156, 118, 102, 100, -157, 123, 109, 100, -158, 124, 113, 100, -157, 122, 111, 100, -153, 119, 107, 100, -152, 117, 105, 100, -146, 112, 98, 100, -150, 116, 103, 100, -154, 120, 110, 100, -158, 124, 114, 100, -159, 125, 115, 100, -159, 124, 115, 100, -162, 131, 121, 100, -161, 131, 121, 100, -163, 132, 129, 100, -159, 128, 125, 100, -153, 122, 115, 100, -154, 124, 117, 100, -152, 120, 116, 100, -145, 113, 106, 100, -143, 113, 104, 100, -146, 116, 106, 100, -147, 116, 110, 100, -84, 56, 24, 100, -90, 59, 27, 100, -95, 63, 31, 100, -93, 65, 32, 100, -102, 74, 42, 100, -109, 81, 50, 100, -109, 79, 51, 100, -114, 81, 56, 100, -121, 89, 68, 100, -122, 93, 73, 100, -121, 94, 74, 100, -120, 93, 74, 100, -118, 90, 75, 100, -123, 96, 82, 100, -123, 98, 84, 100, -125, 101, 88, 100, -127, 105, 92, 100, -126, 101, 90, 100, -128, 103, 91, 100, -140, 114, 103, 100, -137, 109, 98, 100, -141, 113, 101, 100, -147, 119, 108, 100, -147, 119, 112, 100, -141, 115, 110, 100, -140, 117, 111, 100, -146, 121, 119, 100, -147, 121, 118, 100, -145, 122, 117, 100, -147, 125, 123, 100, -147, 123, 121, 100, -149, 122, 120, 100, -148, 120, 116, 100, -145, 116, 112, 100, -144, 115, 111, 100, -141, 110, 108, 100, -141, 110, 107, 100, -138, 107, 104, 100, -136, 105, 102, 100, -137, 106, 103, 100, -137, 104, 100, 100, -139, 104, 100, 100, -136, 100, 93, 100, -133, 98, 89, 100, -131, 96, 89, 100, -129, 93, 90, 100, -128, 93, 89, 100, -125, 90, 88, 100, -125, 90, 88, 100, -122, 86, 86, 100, -116, 80, 82, 100, -115, 79, 81, 100, -109, 75, 79, 100, -103, 72, 79, 100, -97, 71, 80, 100, -76, 40, 42, 100, -66, 26, 23, 100, -103, 57, 47, 100, -126, 71, 60, 100, -130, 75, 65, 100, -107, 58, 46, 100, -148, 97, 80, 100, -140, 81, 63, 100, -136, 73, 54, 100, -141, 80, 58, 100, -126, 66, 49, 100, -133, 69, 55, 100, -163, 98, 77, 100, -152, 87, 65, 100, -152, 90, 67, 100, -149, 93, 71, 100, -139, 82, 69, 100, -137, 83, 70, 100, -135, 86, 68, 100, -120, 76, 58, 100, -94, 54, 38, 100, -93, 55, 49, 100, -109, 69, 65, 100, -114, 73, 66, 100, -115, 75, 67, 100, -112, 71, 59, 100, -112, 70, 56, 100, -115, 73, 59, 100, -126, 84, 69, 100, -130, 91, 74, 100, -134, 95, 78, 100, -136, 97, 79, 100, -136, 97, 80, 100, -142, 103, 86, 100, -142, 103, 86, 100, -149, 110, 94, 100, -150, 110, 96, 100, -149, 111, 95, 100, -152, 114, 98, 100, -153, 113, 98, 100, -153, 114, 99, 100, -155, 116, 100, 100, -154, 117, 104, 100, -152, 119, 109, 100, -152, 120, 110, 100, -154, 120, 111, 100, -150, 116, 106, 100, -143, 111, 101, 100, -148, 118, 106, 100, -152, 121, 109, 100, -151, 118, 108, 100, -151, 117, 107, 100, -154, 120, 111, 100, -158, 123, 115, 100, -156, 125, 116, 100, -157, 127, 118, 100, -155, 124, 119, 100, -155, 124, 119, 100, -150, 117, 112, 100, -152, 120, 116, 100, -151, 119, 114, 100, -145, 110, 103, 100, -148, 115, 106, 100, -147, 116, 110, 100, -146, 116, 112, 100, -76, 54, 22, 100, -76, 52, 18, 100, -76, 52, 19, 100, -83, 59, 26, 100, -93, 68, 38, 100, -96, 71, 43, 100, -100, 74, 47, 100, -106, 78, 52, 100, -111, 82, 58, 100, -114, 85, 64, 100, -121, 93, 74, 100, -115, 90, 72, 100, -113, 88, 73, 100, -114, 91, 78, 100, -110, 91, 78, 100, -108, 87, 74, 100, -118, 96, 83, 100, -120, 99, 85, 100, -122, 100, 87, 100, -125, 99, 87, 100, -133, 106, 94, 100, -140, 112, 101, 100, -142, 114, 103, 100, -142, 113, 106, 100, -141, 114, 110, 100, -138, 115, 109, 100, -141, 118, 112, 100, -145, 122, 117, 100, -142, 119, 113, 100, -141, 118, 112, 100, -139, 117, 111, 100, -141, 117, 112, 100, -143, 115, 111, 100, -144, 115, 111, 100, -143, 114, 110, 100, -137, 107, 104, 100, -137, 106, 103, 100, -134, 104, 100, 100, -136, 106, 102, 100, -136, 104, 101, 100, -132, 102, 98, 100, -131, 99, 96, 100, -133, 98, 95, 100, -131, 96, 91, 100, -126, 89, 86, 100, -127, 92, 88, 100, -122, 87, 84, 100, -120, 85, 83, 100, -121, 86, 84, 100, -117, 82, 82, 100, -115, 79, 81, 100, -108, 72, 74, 100, -104, 69, 72, 100, -99, 68, 75, 100, -88, 63, 67, 100, -76, 39, 36, 100, -103, 54, 46, 100, -122, 67, 52, 100, -130, 71, 58, 100, -134, 76, 64, 100, -118, 66, 50, 100, -145, 92, 72, 100, -135, 74, 54, 100, -136, 71, 50, 100, -146, 81, 58, 100, -146, 80, 59, 100, -146, 80, 61, 100, -163, 98, 78, 100, -153, 88, 62, 100, -153, 91, 68, 100, -153, 92, 68, 100, -145, 87, 68, 100, -134, 80, 67, 100, -132, 82, 69, 100, -121, 75, 60, 100, -92, 52, 37, 100, -92, 54, 47, 100, -106, 66, 64, 100, -109, 67, 66, 100, -107, 67, 61, 100, -108, 68, 59, 100, -110, 68, 56, 100, -110, 67, 53, 100, -116, 74, 60, 100, -122, 81, 66, 100, -128, 89, 72, 100, -130, 92, 74, 100, -130, 91, 74, 100, -137, 98, 82, 100, -141, 103, 88, 100, -143, 106, 92, 100, -143, 104, 92, 100, -140, 102, 87, 100, -146, 108, 93, 100, -147, 108, 97, 100, -149, 110, 99, 100, -149, 112, 100, 100, -152, 118, 108, 100, -151, 120, 110, 100, -147, 116, 106, 100, -146, 111, 100, 100, -139, 105, 93, 100, -142, 112, 99, 100, -146, 116, 106, 100, -148, 118, 108, 100, -151, 120, 110, 100, -150, 117, 107, 100, -148, 114, 104, 100, -145, 113, 103, 100, -148, 118, 111, 100, -149, 118, 113, 100, -146, 115, 110, 100, -151, 120, 112, 100, -151, 116, 110, 100, -152, 117, 112, 100, -146, 111, 107, 100, -141, 106, 102, 100, -136, 101, 97, 100, -144, 113, 108, 100, -137, 106, 101, 100, -146, 144, 111, 100, -117, 108, 75, 100, -100, 88, 53, 100, -88, 74, 41, 100, -79, 62, 31, 100, -83, 65, 36, 100, -86, 69, 42, 100, -87, 70, 45, 100, -90, 73, 48, 100, -98, 79, 57, 100, -92, 73, 56, 100, -88, 69, 54, 100, -89, 72, 57, 100, -86, 70, 56, 100, -87, 71, 59, 100, -93, 77, 66, 100, -103, 85, 73, 100, -108, 89, 77, 100, -118, 97, 85, 100, -120, 99, 87, 100, -122, 100, 89, 100, -126, 102, 91, 100, -130, 104, 92, 100, -133, 105, 95, 100, -138, 110, 106, 100, -137, 112, 107, 100, -135, 112, 106, 100, -138, 113, 109, 100, -136, 113, 107, 100, -137, 114, 108, 100, -137, 114, 108, 100, -138, 114, 110, 100, -137, 111, 108, 100, -141, 113, 109, 100, -143, 113, 109, 100, -141, 112, 108, 100, -140, 109, 106, 100, -136, 106, 102, 100, -136, 108, 104, 100, -136, 105, 102, 100, -131, 100, 97, 100, -128, 97, 94, 100, -125, 91, 89, 100, -124, 88, 85, 100, -121, 85, 81, 100, -117, 83, 79, 100, -115, 81, 78, 100, -114, 80, 78, 100, -113, 79, 77, 100, -110, 77, 75, 100, -109, 74, 73, 100, -103, 67, 69, 100, -98, 63, 66, 100, -92, 61, 68, 100, -83, 51, 51, 100, -103, 55, 47, 100, -127, 69, 55, 100, -133, 71, 56, 100, -142, 79, 64, 100, -141, 82, 66, 100, -125, 73, 55, 100, -140, 83, 66, 100, -142, 79, 59, 100, -152, 86, 66, 100, -164, 96, 76, 100, -166, 99, 80, 100, -160, 93, 74, 100, -171, 106, 86, 100, -159, 95, 71, 100, -153, 89, 66, 100, -152, 90, 66, 100, -150, 89, 67, 100, -139, 81, 65, 100, -128, 77, 64, 100, -120, 72, 58, 100, -94, 53, 39, 100, -91, 53, 46, 100, -98, 60, 60, 100, -98, 58, 59, 100, -104, 65, 62, 100, -104, 64, 57, 100, -107, 67, 58, 100, -109, 68, 54, 100, -113, 73, 56, 100, -120, 79, 63, 100, -123, 83, 67, 100, -124, 85, 67, 100, -126, 87, 71, 100, -134, 96, 81, 100, -136, 100, 87, 100, -139, 103, 91, 100, -141, 105, 93, 100, -139, 104, 92, 100, -141, 105, 93, 100, -143, 108, 96, 100, -147, 112, 100, 100, -148, 113, 102, 100, -151, 118, 109, 100, -149, 115, 105, 100, -142, 108, 98, 100, -146, 111, 101, 100, -141, 108, 95, 100, -134, 105, 91, 100, -140, 110, 99, 100, -145, 116, 105, 100, -146, 116, 107, 100, -144, 115, 107, 100, -144, 114, 105, 100, -142, 111, 102, 100, -151, 119, 115, 100, -154, 123, 119, 100, -145, 114, 109, 100, -143, 111, 104, 100, -145, 111, 104, 100, -150, 118, 108, 100, -146, 114, 105, 100, -142, 109, 104, 100, -139, 109, 104, 100, -142, 112, 106, 100, -131, 99, 94, 100, -143, 157, 123, 100, -153, 163, 130, 100, -162, 168, 135, 100, -159, 162, 130, 100, -143, 144, 113, 100, -135, 135, 106, 100, -137, 138, 110, 100, -143, 144, 117, 100, -145, 146, 120, 100, -141, 143, 119, 100, -122, 122, 100, 100, -96, 93, 72, 100, -77, 72, 53, 100, -75, 67, 50, 100, -89, 82, 68, 100, -83, 72, 60, 100, -81, 67, 57, 100, -87, 71, 61, 100, -93, 75, 67, 100, -101, 82, 73, 100, -110, 92, 82, 100, -116, 98, 87, 100, -119, 99, 88, 100, -120, 97, 89, 100, -123, 99, 93, 100, -126, 104, 98, 100, -129, 105, 99, 100, -128, 103, 98, 100, -131, 108, 102, 100, -134, 111, 105, 100, -135, 112, 106, 100, -135, 112, 105, 100, -130, 107, 101, 100, -132, 108, 102, 100, -133, 106, 101, 100, -138, 109, 105, 100, -137, 108, 104, 100, -134, 105, 101, 100, -135, 105, 102, 100, -134, 104, 100, 100, -132, 101, 98, 100, -131, 100, 96, 100, -125, 93, 90, 100, -122, 90, 85, 100, -116, 80, 76, 100, -109, 71, 68, 100, -110, 75, 71, 100, -111, 79, 77, 100, -112, 76, 74, 100, -109, 73, 71, 100, -102, 68, 65, 100, -100, 63, 63, 100, -90, 57, 60, 100, -79, 48, 52, 100, -104, 56, 49, 100, -131, 69, 55, 100, -137, 73, 56, 100, -142, 77, 61, 100, -141, 77, 61, 100, -127, 72, 55, 100, -124, 71, 53, 100, -138, 78, 60, 100, -149, 84, 66, 100, -155, 89, 71, 100, -172, 106, 87, 100, -176, 113, 92, 100, -171, 107, 88, 100, -175, 111, 91, 100, -166, 101, 81, 100, -157, 92, 69, 100, -152, 88, 63, 100, -148, 84, 61, 100, -143, 85, 63, 100, -139, 87, 68, 100, -125, 76, 60, 100, -100, 57, 44, 100, -87, 46, 40, 100, -95, 56, 56, 100, -93, 56, 54, 100, -98, 59, 58, 100, -96, 55, 52, 100, -105, 64, 57, 100, -106, 66, 55, 100, -109, 69, 56, 100, -113, 74, 58, 100, -118, 79, 64, 100, -121, 82, 67, 100, -124, 85, 69, 100, -131, 93, 76, 100, -133, 95, 81, 100, -136, 98, 87, 100, -138, 102, 90, 100, -137, 103, 92, 100, -137, 103, 92, 100, -138, 103, 93, 100, -145, 111, 101, 100, -146, 112, 102, 100, -146, 112, 101, 100, -146, 112, 102, 100, -138, 104, 94, 100, -144, 113, 103, 100, -143, 113, 101, 100, -137, 107, 96, 100, -139, 110, 102, 100, -146, 118, 111, 100, -145, 117, 111, 100, -140, 110, 105, 100, -140, 109, 103, 100, -135, 104, 95, 100, -141, 110, 104, 100, -148, 118, 113, 100, -143, 112, 107, 100, -137, 106, 101, 100, -139, 108, 103, 100, -143, 113, 106, 100, -141, 111, 104, 100, -139, 108, 102, 100, -151, 121, 117, 100, -150, 119, 114, 100, -139, 108, 103, 100, -154, 167, 140, 100, -154, 167, 141, 100, -156, 168, 142, 100, -159, 173, 146, 100, -162, 177, 151, 100, -163, 177, 152, 100, -163, 179, 154, 100, -162, 179, 153, 100, -160, 175, 151, 100, -161, 176, 155, 100, -159, 174, 152, 100, -164, 177, 156, 100, -153, 166, 144, 100, -153, 165, 144, 100, -154, 168, 149, 100, -143, 155, 136, 100, -130, 140, 123, 100, -128, 131, 116, 100, -112, 113, 99, 100, -104, 103, 90, 100, -90, 84, 74, 100, -93, 80, 70, 100, -106, 90, 81, 100, -108, 92, 83, 100, -109, 91, 83, 100, -113, 93, 87, 100, -118, 97, 91, 100, -119, 97, 90, 100, -123, 99, 93, 100, -123, 100, 94, 100, -125, 102, 96, 100, -127, 104, 98, 100, -126, 103, 97, 100, -119, 97, 90, 100, -125, 103, 97, 100, -129, 106, 100, 100, -132, 104, 100, 100, -132, 103, 99, 100, -130, 100, 95, 100, -128, 97, 94, 100, -129, 99, 94, 100, -128, 97, 92, 100, -124, 93, 88, 100, -122, 91, 87, 100, -118, 83, 79, 100, -116, 79, 76, 100, -112, 78, 74, 100, -109, 77, 74, 100, -110, 74, 73, 100, -106, 71, 69, 100, -101, 66, 64, 100, -97, 57, 58, 100, -89, 51, 51, 100, -112, 62, 55, 100, -140, 75, 60, 100, -150, 81, 65, 100, -154, 87, 69, 100, -155, 88, 72, 100, -145, 84, 66, 100, -122, 71, 56, 100, -119, 67, 50, 100, -138, 79, 62, 100, -151, 86, 71, 100, -158, 92, 76, 100, -170, 105, 88, 100, -178, 115, 98, 100, -181, 119, 101, 100, -179, 118, 100, 100, -168, 102, 84, 100, -159, 92, 71, 100, -159, 92, 69, 100, -151, 86, 61, 100, -140, 79, 57, 100, -139, 83, 63, 100, -133, 84, 65, 100, -108, 62, 49, 100, -84, 42, 36, 100, -94, 57, 56, 100, -98, 62, 61, 100, -98, 60, 59, 100, -93, 53, 48, 100, -101, 61, 54, 100, -106, 66, 58, 100, -106, 66, 55, 100, -109, 70, 55, 100, -114, 75, 60, 100, -119, 80, 65, 100, -120, 81, 66, 100, -127, 88, 72, 100, -130, 91, 75, 100, -134, 95, 81, 100, -135, 99, 87, 100, -134, 100, 88, 100, -136, 102, 92, 100, -135, 101, 91, 100, -138, 105, 95, 100, -143, 112, 102, 100, -141, 109, 100, 100, -145, 111, 102, 100, -139, 107, 97, 100, -141, 111, 101, 100, -144, 115, 107, 100, -143, 114, 108, 100, -144, 115, 109, 100, -141, 112, 108, 100, -138, 110, 105, 100, -134, 105, 98, 100, -136, 106, 98, 100, -137, 107, 100, 100, -131, 101, 92, 100, -140, 110, 104, 100, -141, 112, 106, 100, -140, 110, 104, 100, -140, 110, 104, 100, -142, 112, 107, 100, -140, 110, 107, 100, -138, 107, 103, 100, -145, 114, 111, 100, -145, 114, 110, 100, -133, 102, 97, 100, -156, 171, 146, 100, -149, 167, 141, 100, -146, 163, 138, 100, -150, 169, 144, 100, -141, 160, 135, 100, -141, 159, 136, 100, -134, 154, 128, 100, -136, 156, 133, 100, -140, 158, 137, 100, -143, 162, 141, 100, -143, 161, 142, 100, -147, 164, 145, 100, -143, 161, 142, 100, -148, 166, 148, 100, -141, 161, 142, 100, -136, 157, 137, 100, -138, 159, 139, 100, -140, 158, 139, 100, -141, 160, 141, 100, -140, 159, 142, 100, -122, 138, 124, 100, -85, 91, 82, 100, -71, 66, 58, 100, -88, 76, 70, 100, -100, 85, 76, 100, -103, 86, 80, 100, -107, 89, 83, 100, -109, 87, 81, 100, -113, 89, 83, 100, -111, 89, 83, 100, -110, 88, 82, 100, -118, 95, 89, 100, -111, 88, 82, 100, -115, 92, 86, 100, -118, 95, 89, 100, -118, 93, 88, 100, -125, 96, 93, 100, -122, 94, 90, 100, -123, 93, 89, 100, -125, 95, 91, 100, -123, 94, 90, 100, -122, 92, 87, 100, -121, 90, 85, 100, -117, 87, 82, 100, -113, 82, 77, 100, -112, 81, 77, 100, -111, 77, 73, 100, -107, 72, 70, 100, -102, 68, 66, 100, -102, 68, 65, 100, -96, 62, 60, 100, -94, 54, 52, 100, -119, 66, 52, 100, -143, 76, 60, 100, -151, 81, 66, 100, -156, 87, 72, 100, -158, 90, 72, 100, -159, 95, 78, 100, -153, 98, 81, 100, -124, 75, 60, 100, -117, 69, 52, 100, -139, 81, 65, 100, -149, 85, 72, 100, -158, 94, 81, 100, -168, 104, 93, 100, -170, 106, 96, 100, -174, 112, 100, 100, -173, 111, 96, 100, -168, 102, 85, 100, -161, 94, 74, 100, -159, 91, 72, 100, -155, 89, 67, 100, -143, 79, 58, 100, -140, 78, 57, 100, -139, 84, 65, 100, -119, 71, 56, 100, -82, 40, 30, 100, -90, 53, 51, 100, -94, 60, 59, 100, -96, 60, 57, 100, -93, 54, 48, 100, -95, 56, 50, 100, -102, 62, 53, 100, -104, 64, 52, 100, -109, 69, 56, 100, -111, 72, 57, 100, -114, 75, 60, 100, -120, 81, 66, 100, -123, 84, 69, 100, -129, 90, 74, 100, -131, 95, 82, 100, -132, 96, 86, 100, -133, 98, 88, 100, -133, 99, 89, 100, -136, 102, 90, 100, -133, 99, 89, 100, -136, 103, 93, 100, -139, 106, 96, 100, -141, 107, 98, 100, -132, 102, 93, 100, -134, 104, 94, 100, -142, 112, 106, 100, -143, 114, 107, 100, -136, 107, 100, 100, -130, 101, 94, 100, -135, 107, 100, 100, -133, 104, 96, 100, -130, 100, 90, 100, -130, 100, 91, 100, -123, 94, 84, 100, -131, 102, 94, 100, -133, 104, 98, 100, -136, 107, 102, 100, -135, 106, 102, 100, -137, 108, 103, 100, -142, 114, 110, 100, -133, 103, 98, 100, -137, 106, 101, 100, -131, 102, 96, 100, -124, 94, 85, 100, -140, 158, 136, 100, -139, 157, 132, 100, -137, 156, 132, 100, -143, 162, 141, 100, -135, 154, 132, 100, -130, 148, 127, 100, -136, 155, 134, 100, -136, 155, 134, 100, -129, 150, 129, 100, -138, 157, 137, 100, -138, 157, 137, 100, -135, 155, 135, 100, -136, 156, 139, 100, -144, 164, 146, 100, -144, 166, 148, 100, -133, 154, 135, 100, -126, 149, 127, 100, -113, 137, 116, 100, -112, 138, 120, 100, -123, 148, 132, 100, -111, 139, 122, 100, -108, 135, 123, 100, -80, 100, 94, 100, -56, 66, 63, 100, -60, 57, 56, 100, -75, 63, 59, 100, -90, 75, 70, 100, -96, 79, 72, 100, -105, 83, 78, 100, -105, 85, 79, 100, -106, 86, 79, 100, -103, 82, 75, 100, -103, 81, 75, 100, -113, 90, 84, 100, -113, 91, 85, 100, -113, 89, 83, 100, -118, 89, 85, 100, -119, 89, 86, 100, -118, 89, 84, 100, -119, 89, 85, 100, -119, 90, 86, 100, -115, 86, 82, 100, -112, 84, 79, 100, -114, 85, 80, 100, -110, 79, 75, 100, -105, 75, 72, 100, -103, 72, 68, 100, -101, 68, 65, 100, -97, 65, 63, 100, -92, 62, 58, 100, -89, 55, 53, 100, -115, 64, 56, 100, -138, 74, 58, 100, -143, 77, 62, 100, -150, 81, 68, 100, -156, 88, 75, 100, -157, 90, 76, 100, -159, 97, 84, 100, -154, 100, 87, 100, -118, 69, 58, 100, -109, 60, 49, 100, -138, 79, 68, 100, -150, 88, 77, 100, -159, 96, 89, 100, -164, 100, 98, 100, -167, 104, 101, 100, -168, 104, 101, 100, -165, 100, 94, 100, -160, 93, 80, 100, -156, 89, 70, 100, -158, 90, 71, 100, -155, 87, 68, 100, -144, 79, 58, 100, -139, 76, 55, 100, -142, 82, 62, 100, -124, 73, 55, 100, -86, 43, 31, 100, -86, 50, 43, 100, -86, 55, 52, 100, -96, 62, 60, 100, -94, 57, 54, 100, -92, 55, 48, 100, -95, 56, 47, 100, -100, 61, 51, 100, -105, 66, 55, 100, -110, 70, 56, 100, -114, 76, 60, 100, -119, 80, 65, 100, -123, 84, 71, 100, -128, 89, 75, 100, -128, 94, 81, 100, -128, 97, 84, 100, -131, 98, 86, 100, -132, 98, 88, 100, -134, 100, 89, 100, -133, 99, 88, 100, -133, 98, 90, 100, -138, 104, 97, 100, -140, 105, 99, 100, -133, 102, 96, 100, -132, 102, 92, 100, -141, 110, 103, 100, -133, 104, 94, 100, -129, 101, 90, 100, -133, 104, 93, 100, -130, 101, 90, 100, -132, 103, 92, 100, -129, 99, 89, 100, -125, 95, 85, 100, -128, 98, 88, 100, -127, 98, 90, 100, -130, 102, 96, 100, -130, 101, 96, 100, -132, 103, 99, 100, -139, 110, 106, 100, -140, 112, 108, 100, -125, 96, 89, 100, -123, 95, 84, 100, -126, 97, 90, 100, -124, 94, 88, 100, -141, 159, 135, 100, -137, 155, 133, 100, -143, 161, 139, 100, -136, 155, 134, 100, -135, 153, 132, 100, -137, 156, 134, 100, -145, 163, 143, 100, -139, 158, 138, 100, -133, 154, 134, 100, -142, 160, 141, 100, -143, 161, 141, 100, -133, 153, 133, 100, -124, 148, 127, 100, -132, 156, 137, 100, -128, 152, 134, 100, -123, 148, 129, 100, -129, 152, 131, 100, -129, 151, 129, 100, -114, 139, 117, 100, -104, 129, 110, 100, -94, 121, 105, 100, -104, 131, 118, 100, -97, 123, 113, 100, -79, 102, 100, 100, -56, 76, 77, 100, -38, 43, 45, 100, -36, 30, 31, 100, -59, 46, 42, 100, -79, 62, 59, 100, -87, 72, 66, 100, -89, 74, 66, 100, -91, 73, 65, 100, -98, 79, 72, 100, -100, 81, 74, 100, -99, 80, 73, 100, -100, 81, 74, 100, -103, 82, 75, 100, -105, 81, 75, 100, -105, 79, 74, 100, -106, 80, 75, 100, -108, 82, 77, 100, -106, 79, 75, 100, -106, 77, 73, 100, -103, 78, 73, 100, -100, 74, 69, 100, -100, 72, 68, 100, -99, 70, 65, 100, -94, 65, 61, 100, -91, 61, 57, 100, -83, 55, 52, 100, -95, 56, 50, 100, -122, 61, 52, 100, -133, 68, 57, 100, -141, 76, 61, 100, -146, 79, 65, 100, -155, 89, 75, 100, -152, 86, 76, 100, -144, 84, 77, 100, -147, 91, 86, 100, -115, 65, 59, 100, -99, 52, 44, 100, -127, 71, 61, 100, -139, 81, 74, 100, -150, 89, 84, 100, -159, 97, 98, 100, -162, 97, 99, 100, -164, 100, 99, 100, -165, 100, 98, 100, -160, 94, 83, 100, -158, 92, 73, 100, -157, 91, 71, 100, -151, 83, 64, 100, -144, 77, 58, 100, -138, 73, 53, 100, -141, 77, 56, 100, -128, 71, 54, 100, -90, 44, 31, 100, -82, 46, 38, 100, -83, 52, 49, 100, -92, 61, 58, 100, -91, 57, 53, 100, -91, 56, 48, 100, -94, 57, 49, 100, -97, 61, 52, 100, -101, 65, 53, 100, -106, 67, 53, 100, -110, 71, 56, 100, -115, 75, 63, 100, -121, 80, 71, 100, -126, 89, 76, 100, -124, 92, 80, 100, -123, 95, 83, 100, -128, 96, 84, 100, -132, 97, 88, 100, -132, 98, 89, 100, -133, 99, 90, 100, -133, 98, 91, 100, -136, 100, 94, 100, -139, 106, 101, 100, -133, 103, 94, 100, -130, 100, 89, 100, -133, 103, 93, 100, -137, 108, 97, 100, -134, 106, 95, 100, -128, 98, 88, 100, -128, 98, 88, 100, -130, 100, 90, 100, -130, 100, 89, 100, -125, 95, 85, 100, -116, 86, 77, 100, -120, 92, 83, 100, -128, 99, 92, 100, -128, 99, 94, 100, -135, 106, 102, 100, -131, 102, 97, 100, -130, 100, 93, 100, -124, 95, 86, 100, -125, 96, 86, 100, -126, 98, 87, 100, -126, 97, 92, 100, -139, 157, 131, 100, -143, 161, 136, 100, -138, 156, 133, 100, -137, 156, 133, 100, -140, 158, 136, 100, -142, 160, 138, 100, -136, 153, 131, 100, -133, 151, 130, 100, -145, 162, 142, 100, -138, 155, 136, 100, -137, 155, 135, 100, -137, 154, 135, 100, -140, 158, 138, 100, -134, 153, 133, 100, -134, 155, 135, 100, -130, 150, 130, 100, -131, 150, 130, 100, -136, 153, 133, 100, -137, 153, 132, 100, -128, 146, 124, 100, -131, 151, 132, 100, -133, 152, 134, 100, -125, 142, 125, 100, -113, 130, 116, 100, -101, 117, 106, 100, -66, 82, 76, 100, -52, 61, 61, 100, -52, 54, 48, 100, -56, 54, 49, 100, -56, 51, 46, 100, -54, 45, 38, 100, -63, 52, 43, 100, -67, 54, 45, 100, -68, 54, 45, 100, -72, 57, 49, 100, -79, 60, 53, 100, -83, 64, 57, 100, -86, 67, 60, 100, -88, 69, 62, 100, -91, 71, 64, 100, -91, 70, 63, 100, -90, 67, 61, 100, -93, 69, 63, 100, -93, 72, 65, 100, -94, 71, 65, 100, -91, 68, 62, 100, -89, 65, 59, 100, -86, 61, 56, 100, -85, 57, 53, 100, -76, 49, 44, 100, -100, 55, 44, 100, -122, 63, 50, 100, -130, 65, 54, 100, -136, 68, 58, 100, -142, 76, 65, 100, -146, 80, 71, 100, -143, 77, 74, 100, -137, 77, 75, 100, -131, 74, 69, 100, -115, 64, 60, 100, -91, 48, 42, 100, -111, 63, 57, 100, -131, 74, 71, 100, -140, 80, 77, 100, -150, 87, 88, 100, -154, 90, 91, 100, -156, 94, 94, 100, -156, 92, 89, 100, -150, 85, 73, 100, -153, 87, 72, 100, -151, 86, 67, 100, -149, 81, 62, 100, -145, 77, 58, 100, -141, 74, 55, 100, -143, 77, 57, 100, -134, 72, 53, 100, -92, 45, 31, 100, -76, 39, 32, 100, -80, 47, 45, 100, -89, 59, 56, 100, -88, 57, 53, 100, -88, 57, 51, 100, -90, 56, 48, 100, -93, 58, 49, 100, -99, 63, 52, 100, -103, 64, 53, 100, -107, 70, 57, 100, -110, 74, 63, 100, -115, 77, 67, 100, -119, 82, 74, 100, -118, 87, 78, 100, -120, 90, 82, 100, -129, 96, 89, 100, -126, 92, 83, 100, -129, 97, 87, 100, -130, 96, 87, 100, -129, 95, 86, 100, -131, 97, 88, 100, -134, 104, 95, 100, -130, 100, 90, 100, -126, 97, 86, 100, -127, 98, 88, 100, -131, 101, 91, 100, -130, 101, 91, 100, -125, 96, 86, 100, -128, 98, 91, 100, -127, 97, 86, 100, -126, 97, 86, 100, -124, 95, 85, 100, -113, 85, 75, 100, -116, 88, 74, 100, -119, 90, 80, 100, -120, 92, 86, 100, -128, 99, 94, 100, -120, 91, 85, 100, -120, 91, 85, 100, -118, 89, 83, 100, -115, 87, 78, 100, -120, 91, 84, 100, -114, 86, 78, 100, -158, 171, 146, 100, -157, 171, 145, 100, -155, 169, 144, 100, -153, 168, 143, 100, -157, 171, 146, 100, -161, 174, 149, 100, -160, 173, 148, 100, -157, 171, 149, 100, -164, 177, 157, 100, -162, 175, 155, 100, -163, 177, 156, 100, -164, 176, 156, 100, -168, 180, 160, 100, -164, 177, 158, 100, -167, 179, 161, 100, -165, 178, 160, 100, -163, 176, 158, 100, -162, 175, 155, 100, -166, 178, 158, 100, -168, 180, 161, 100, -165, 178, 160, 100, -166, 179, 160, 100, -165, 177, 159, 100, -164, 175, 157, 100, -157, 169, 150, 100, -156, 168, 151, 100, -165, 178, 163, 100, -161, 173, 159, 100, -151, 162, 150, 100, -126, 137, 123, 100, -124, 132, 119, 100, -132, 139, 125, 100, -126, 133, 117, 100, -114, 116, 102, 100, -102, 101, 87, 100, -80, 71, 59, 100, -72, 61, 50, 100, -64, 51, 42, 100, -69, 54, 45, 100, -72, 57, 48, 100, -78, 64, 55, 100, -80, 66, 57, 100, -78, 61, 53, 100, -71, 50, 44, 100, -75, 54, 47, 100, -82, 61, 55, 100, -81, 61, 54, 100, -79, 57, 51, 100, -74, 52, 46, 100, -72, 46, 41, 100, -108, 59, 48, 100, -121, 65, 50, 100, -128, 67, 52, 100, -131, 66, 55, 100, -133, 68, 60, 100, -139, 75, 70, 100, -138, 77, 76, 100, -131, 71, 69, 100, -124, 65, 61, 100, -113, 59, 57, 100, -92, 48, 46, 100, -95, 52, 46, 100, -120, 68, 62, 100, -134, 75, 72, 100, -142, 81, 80, 100, -144, 84, 84, 100, -144, 84, 83, 100, -145, 82, 78, 100, -143, 77, 70, 100, -144, 76, 69, 100, -141, 72, 61, 100, -140, 71, 55, 100, -140, 72, 54, 100, -140, 72, 53, 100, -140, 72, 54, 100, -135, 71, 54, 100, -95, 49, 33, 100, -76, 37, 28, 100, -78, 43, 40, 100, -82, 51, 50, 100, -86, 54, 54, 100, -89, 59, 53, 100, -88, 58, 49, 100, -87, 56, 46, 100, -94, 59, 49, 100, -99, 63, 52, 100, -101, 66, 55, 100, -106, 72, 62, 100, -107, 73, 64, 100, -110, 75, 69, 100, -116, 84, 78, 100, -117, 87, 80, 100, -122, 91, 85, 100, -123, 91, 82, 100, -126, 95, 85, 100, -126, 95, 85, 100, -123, 92, 82, 100, -126, 95, 86, 100, -126, 96, 86, 100, -123, 92, 82, 100, -116, 87, 76, 100, -116, 89, 77, 100, -124, 95, 85, 100, -130, 100, 92, 100, -120, 91, 79, 100, -115, 86, 75, 100, -121, 93, 83, 100, -124, 95, 85, 100, -122, 93, 83, 100, -118, 90, 79, 100, -115, 87, 75, 100, -115, 87, 76, 100, -107, 78, 69, 100, -115, 86, 79, 100, -115, 86, 80, 100, -104, 75, 67, 100, -107, 78, 68, 100, -104, 74, 65, 100, -112, 83, 75, 100, -116, 88, 77, 100, -170, 180, 156, 100, -169, 180, 157, 100, -169, 180, 158, 100, -171, 183, 160, 100, -169, 182, 159, 100, -172, 183, 160, 100, -172, 184, 161, 100, -171, 183, 163, 100, -175, 187, 167, 100, -173, 184, 164, 100, -173, 184, 165, 100, -171, 183, 163, 100, -170, 182, 162, 100, -169, 182, 162, 100, -171, 184, 165, 100, -172, 184, 167, 100, -173, 184, 166, 100, -172, 184, 164, 100, -171, 183, 163, 100, -172, 183, 165, 100, -170, 181, 164, 100, -171, 182, 166, 100, -171, 182, 165, 100, -168, 179, 163, 100, -169, 180, 163, 100, -169, 181, 163, 100, -168, 180, 164, 100, -168, 180, 165, 100, -164, 177, 161, 100, -166, 180, 163, 100, -162, 177, 157, 100, -163, 176, 158, 100, -160, 173, 155, 100, -165, 177, 160, 100, -162, 174, 157, 100, -160, 169, 151, 100, -156, 164, 147, 100, -144, 150, 135, 100, -144, 150, 135, 100, -142, 147, 132, 100, -147, 153, 137, 100, -146, 153, 137, 100, -142, 145, 130, 100, -114, 109, 97, 100, -84, 74, 63, 100, -60, 42, 34, 100, -57, 38, 31, 100, -66, 46, 39, 100, -69, 48, 41, 100, -72, 45, 39, 100, -107, 63, 49, 100, -118, 63, 46, 100, -122, 63, 51, 100, -128, 68, 57, 100, -126, 64, 53, 100, -128, 68, 59, 100, -139, 84, 79, 100, -141, 86, 81, 100, -137, 79, 75, 100, -115, 61, 57, 100, -90, 47, 47, 100, -83, 42, 37, 100, -100, 55, 46, 100, -113, 60, 57, 100, -124, 68, 65, 100, -133, 74, 73, 100, -138, 79, 76, 100, -138, 76, 73, 100, -139, 75, 70, 100, -139, 74, 66, 100, -138, 72, 63, 100, -137, 69, 56, 100, -142, 74, 57, 100, -141, 74, 56, 100, -135, 68, 52, 100, -130, 66, 49, 100, -93, 46, 30, 100, -73, 36, 25, 100, -77, 42, 39, 100, -81, 52, 49, 100, -83, 55, 54, 100, -90, 62, 58, 100, -95, 64, 59, 100, -89, 58, 50, 100, -92, 58, 49, 100, -93, 58, 48, 100, -97, 63, 51, 100, -100, 66, 56, 100, -101, 70, 60, 100, -104, 72, 63, 100, -111, 80, 70, 100, -114, 84, 74, 100, -117, 87, 77, 100, -123, 92, 82, 100, -122, 91, 81, 100, -124, 96, 85, 100, -116, 88, 76, 100, -116, 88, 76, 100, -124, 99, 88, 100, -137, 116, 105, 100, -129, 102, 94, 100, -125, 98, 90, 100, -108, 78, 69, 100, -111, 78, 70, 100, -136, 111, 102, 100, -136, 112, 104, 100, -109, 80, 73, 100, -118, 91, 83, 100, -114, 86, 77, 100, -122, 95, 86, 100, -121, 93, 87, 100, -101, 72, 60, 100, -118, 92, 82, 100, -109, 83, 74, 100, -92, 64, 54, 100, -116, 90, 81, 100, -108, 80, 74, 100, -112, 86, 80, 100, -107, 79, 69, 100, -112, 84, 74, 100, -173, 184, 159, 100, -172, 183, 161, 100, -173, 184, 165, 100, -173, 184, 165, 100, -171, 183, 164, 100, -170, 183, 162, 100, -172, 184, 164, 100, -171, 184, 164, 100, -172, 184, 164, 100, -169, 181, 161, 100, -173, 185, 165, 100, -174, 184, 165, 100, -172, 182, 163, 100, -170, 180, 161, 100, -172, 182, 164, 100, -173, 184, 167, 100, -171, 182, 163, 100, -172, 182, 163, 100, -171, 181, 161, 100, -172, 182, 164, 100, -170, 180, 162, 100, -171, 180, 162, 100, -171, 181, 163, 100, -172, 181, 165, 100, -168, 179, 162, 100, -167, 178, 161, 100, -167, 177, 160, 100, -167, 178, 162, 100, -166, 178, 160, 100, -164, 176, 158, 100, -163, 175, 158, 100, -162, 174, 156, 100, -165, 176, 159, 100, -167, 177, 161, 100, -162, 172, 156, 100, -164, 176, 159, 100, -164, 176, 159, 100, -163, 175, 157, 100, -165, 177, 158, 100, -166, 176, 159, 100, -161, 172, 155, 100, -155, 166, 149, 100, -154, 164, 146, 100, -153, 162, 143, 100, -149, 158, 138, 100, -117, 119, 104, 100, -85, 81, 69, 100, -87, 78, 66, 100, -64, 48, 39, 100, -59, 39, 29, 100, -85, 48, 35, 100, -107, 55, 41, 100, -115, 58, 45, 100, -115, 56, 45, 100, -111, 53, 43, 100, -104, 46, 40, 100, -101, 48, 43, 100, -111, 57, 52, 100, -122, 67, 62, 100, -128, 71, 65, 100, -109, 59, 55, 100, -77, 36, 31, 100, -88, 48, 41, 100, -102, 56, 50, 100, -110, 58, 54, 100, -119, 63, 61, 100, -127, 69, 66, 100, -129, 69, 65, 100, -135, 74, 68, 100, -137, 75, 66, 100, -136, 71, 61, 100, -132, 68, 56, 100, -132, 68, 53, 100, -132, 66, 52, 100, -128, 63, 46, 100, -116, 53, 38, 100, -84, 39, 26, 100, -71, 36, 25, 100, -73, 41, 37, 100, -77, 49, 46, 100, -81, 56, 55, 100, -87, 60, 56, 100, -93, 64, 60, 100, -91, 61, 56, 100, -89, 59, 50, 100, -88, 57, 47, 100, -90, 58, 47, 100, -92, 61, 49, 100, -93, 63, 54, 100, -99, 69, 58, 100, -104, 74, 63, 100, -109, 79, 67, 100, -113, 84, 73, 100, -114, 83, 73, 100, -115, 86, 75, 100, -110, 82, 70, 100, -143, 122, 113, 100, -137, 117, 108, 100, -156, 141, 133, 100, -184, 175, 168, 100, -171, 158, 152, 100, -144, 124, 117, 100, -146, 127, 120, 100, -156, 138, 133, 100, -165, 149, 142, 100, -142, 122, 117, 100, -94, 64, 60, 100, -134, 114, 108, 100, -130, 111, 103, 100, -121, 99, 91, 100, -174, 162, 156, 100, -163, 150, 145, 100, -169, 155, 150, 100, -156, 139, 134, 100, -144, 129, 121, 100, -155, 141, 135, 100, -152, 135, 128, 100, -138, 121, 114, 100, -101, 75, 66, 100, -105, 78, 67, 100, -177, 187, 163, 100, -174, 185, 161, 100, -176, 186, 165, 100, -177, 185, 166, 100, -176, 185, 166, 100, -174, 184, 165, 100, -173, 183, 163, 100, -175, 184, 165, 100, -174, 183, 164, 100, -172, 181, 162, 100, -174, 183, 164, 100, -176, 184, 165, 100, -174, 183, 164, 100, -174, 182, 164, 100, -174, 183, 165, 100, -173, 182, 164, 100, -172, 181, 162, 100, -173, 181, 162, 100, -173, 182, 163, 100, -174, 183, 164, 100, -174, 182, 163, 100, -172, 181, 162, 100, -173, 182, 164, 100, -173, 182, 165, 100, -173, 182, 165, 100, -174, 183, 164, 100, -173, 181, 164, 100, -173, 181, 165, 100, -169, 179, 162, 100, -172, 183, 166, 100, -171, 181, 164, 100, -171, 182, 165, 100, -170, 181, 164, 100, -169, 179, 162, 100, -170, 181, 164, 100, -170, 180, 163, 100, -169, 179, 162, 100, -171, 181, 163, 100, -171, 181, 163, 100, -171, 179, 161, 100, -171, 180, 163, 100, -171, 179, 162, 100, -167, 176, 157, 100, -166, 175, 156, 100, -165, 174, 155, 100, -170, 180, 162, 100, -170, 180, 163, 100, -162, 171, 151, 100, -148, 151, 134, 100, -129, 127, 109, 100, -104, 92, 72, 100, -101, 68, 53, 100, -104, 60, 45, 100, -121, 75, 59, 100, -125, 78, 66, 100, -121, 76, 66, 100, -113, 67, 56, 100, -116, 74, 64, 100, -116, 77, 68, 100, -116, 78, 71, 100, -112, 72, 64, 100, -87, 52, 43, 100, -75, 39, 31, 100, -84, 41, 34, 100, -101, 53, 48, 100, -109, 58, 54, 100, -112, 60, 56, 100, -116, 63, 58, 100, -119, 64, 56, 100, -123, 65, 57, 100, -126, 66, 56, 100, -129, 67, 56, 100, -128, 65, 53, 100, -125, 63, 49, 100, -115, 56, 42, 100, -100, 45, 33, 100, -77, 39, 26, 100, -73, 40, 29, 100, -68, 40, 34, 100, -72, 48, 43, 100, -76, 54, 50, 100, -85, 61, 57, 100, -90, 62, 58, 100, -90, 62, 56, 100, -87, 59, 50, 100, -86, 57, 46, 100, -85, 55, 45, 100, -85, 56, 45, 100, -87, 59, 48, 100, -90, 61, 49, 100, -95, 66, 54, 100, -99, 70, 57, 100, -103, 74, 63, 100, -103, 77, 64, 100, -98, 75, 61, 100, -88, 66, 54, 100, -152, 140, 133, 100, -158, 146, 138, 100, -167, 158, 148, 100, -183, 175, 167, 100, -174, 164, 157, 100, -176, 163, 158, 100, -165, 150, 144, 100, -175, 163, 157, 100, -152, 137, 130, 100, -120, 100, 91, 100, -85, 58, 47, 100, -129, 110, 102, 100, -144, 128, 125, 100, -136, 119, 114, 100, -171, 160, 155, 100, -157, 141, 137, 100, -155, 141, 135, 100, -186, 176, 173, 100, -190, 180, 178, 100, -138, 121, 115, 100, -185, 177, 171, 100, -92, 69, 62, 100, -93, 69, 62, 100, -94, 68, 60, 100, -177, 186, 167, 100, -178, 187, 166, 100, -177, 184, 164, 100, -176, 184, 166, 100, -175, 184, 165, 100, -176, 184, 165, 100, -178, 187, 168, 100, -177, 186, 167, 100, -176, 185, 166, 100, -178, 187, 168, 100, -177, 189, 169, 100, -176, 186, 167, 100, -178, 187, 168, 100, -177, 186, 168, 100, -176, 185, 167, 100, -176, 185, 166, 100, -176, 185, 166, 100, -176, 185, 166, 100, -178, 187, 168, 100, -177, 186, 167, 100, -177, 186, 167, 100, -178, 187, 168, 100, -177, 186, 169, 100, -178, 187, 170, 100, -176, 185, 167, 100, -176, 185, 168, 100, -175, 185, 168, 100, -180, 188, 171, 100, -178, 187, 170, 100, -180, 189, 173, 100, -177, 186, 169, 100, -177, 186, 169, 100, -176, 185, 169, 100, -177, 186, 168, 100, -178, 188, 170, 100, -177, 186, 169, 100, -176, 185, 168, 100, -177, 186, 169, 100, -177, 186, 169, 100, -175, 184, 167, 100, -175, 184, 168, 100, -175, 184, 167, 100, -172, 181, 164, 100, -174, 183, 166, 100, -171, 180, 163, 100, -170, 179, 162, 100, -168, 177, 160, 100, -169, 175, 159, 100, -174, 179, 162, 100, -175, 179, 162, 100, -176, 181, 164, 100, -171, 174, 155, 100, -167, 167, 150, 100, -174, 173, 156, 100, -179, 178, 160, 100, -178, 179, 162, 100, -175, 174, 156, 100, -180, 180, 164, 100, -177, 179, 162, 100, -172, 176, 158, 100, -166, 170, 152, 100, -162, 163, 146, 100, -148, 145, 127, 100, -104, 81, 68, 100, -76, 39, 31, 100, -84, 41, 35, 100, -94, 47, 43, 100, -105, 59, 52, 100, -110, 62, 55, 100, -107, 58, 50, 100, -109, 57, 48, 100, -111, 58, 46, 100, -111, 56, 46, 100, -102, 51, 38, 100, -95, 49, 35, 100, -79, 39, 27, 100, -55, 27, 14, 100, -65, 39, 27, 100, -69, 49, 40, 100, -63, 43, 36, 100, -69, 48, 42, 100, -78, 52, 47, 100, -85, 54, 47, 100, -88, 59, 48, 100, -86, 57, 47, 100, -84, 53, 44, 100, -83, 53, 41, 100, -80, 52, 38, 100, -79, 52, 41, 100, -80, 55, 43, 100, -85, 60, 47, 100, -87, 61, 48, 100, -82, 57, 45, 100, -85, 65, 50, 100, -110, 99, 84, 100, -146, 142, 129, 100, -166, 168, 154, 100, -192, 196, 183, 100, -175, 184, 168, 100, -183, 190, 176, 100, -182, 189, 175, 100, -168, 172, 156, 100, -192, 192, 181, 100, -171, 166, 158, 100, -122, 111, 101, 100, -129, 118, 109, 100, -123, 109, 98, 100, -111, 93, 84, 100, -116, 98, 92, 100, -107, 86, 79, 100, -104, 84, 76, 100, -106, 87, 78, 100, -110, 92, 84, 100, -100, 83, 76, 100, -113, 96, 91, 100, -87, 66, 59, 100, -105, 89, 82, 100, -79, 58, 50, 100, -80, 60, 53, 100, -81, 59, 53, 100, -181, 190, 171, 100, -179, 188, 169, 100, -176, 185, 166, 100, -178, 187, 168, 100, -181, 190, 171, 100, -182, 191, 172, 100, -183, 192, 173, 100, -182, 191, 172, 100, -182, 191, 172, 100, -183, 193, 173, 100, -179, 191, 171, 100, -177, 189, 169, 100, -181, 190, 172, 100, -181, 190, 172, 100, -180, 190, 171, 100, -177, 186, 167, 100, -178, 187, 168, 100, -175, 184, 165, 100, -172, 181, 162, 100, -174, 183, 164, 100, -176, 184, 166, 100, -176, 184, 165, 100, -175, 183, 165, 100, -173, 183, 166, 100, -177, 186, 168, 100, -177, 186, 168, 100, -174, 183, 165, 100, -176, 185, 168, 100, -178, 187, 170, 100, -178, 188, 171, 100, -179, 188, 171, 100, -177, 186, 168, 100, -176, 185, 168, 100, -178, 187, 170, 100, -178, 187, 168, 100, -175, 184, 167, 100, -175, 184, 167, 100, -175, 184, 167, 100, -175, 184, 167, 100, -177, 186, 169, 100, -175, 184, 167, 100, -174, 183, 166, 100, -174, 183, 166, 100, -176, 185, 168, 100, -176, 184, 168, 100, -174, 182, 166, 100, -175, 184, 167, 100, -175, 185, 168, 100, -177, 185, 169, 100, -181, 188, 172, 100, -180, 186, 171, 100, -180, 189, 172, 100, -180, 190, 174, 100, -182, 190, 174, 100, -178, 186, 170, 100, -178, 185, 169, 100, -177, 187, 171, 100, -178, 188, 171, 100, -174, 184, 166, 100, -172, 182, 163, 100, -174, 184, 166, 100, -173, 183, 166, 100, -175, 185, 166, 100, -175, 181, 161, 100, -145, 139, 121, 100, -103, 85, 71, 100, -80, 53, 42, 100, -71, 36, 27, 100, -82, 46, 37, 100, -82, 43, 35, 100, -81, 41, 33, 100, -80, 41, 33, 100, -73, 33, 25, 100, -72, 35, 23, 100, -67, 36, 24, 100, -52, 30, 17, 100, -99, 91, 77, 100, -141, 142, 126, 100, -148, 153, 138, 100, -139, 138, 124, 100, -135, 131, 119, 100, -127, 120, 108, 100, -96, 76, 64, 100, -77, 49, 37, 100, -74, 43, 32, 100, -80, 51, 39, 100, -81, 51, 39, 100, -76, 48, 35, 100, -73, 46, 35, 100, -69, 48, 35, 100, -64, 42, 30, 100, -71, 51, 41, 100, -90, 80, 69, 100, -140, 140, 125, 100, -163, 172, 157, 100, -162, 174, 158, 100, -168, 181, 166, 100, -166, 177, 164, 100, -167, 178, 161, 100, -168, 180, 161, 100, -170, 181, 164, 100, -176, 187, 169, 100, -181, 191, 174, 100, -175, 185, 169, 100, -156, 162, 145, 100, -151, 154, 138, 100, -136, 133, 116, 100, -107, 97, 83, 100, -66, 50, 41, 100, -51, 30, 22, 100, -52, 31, 24, 100, -54, 33, 25, 100, -55, 34, 27, 100, -58, 37, 29, 100, -63, 45, 36, 100, -65, 48, 41, 100, -65, 47, 42, 100, -73, 55, 49, 100, -72, 52, 45, 100, -68, 50, 42, 100, -177, 185, 166, 100, -180, 189, 170, 100, -180, 189, 170, 100, -182, 191, 172, 100, -178, 187, 168, 100, -180, 189, 170, 100, -181, 190, 171, 100, -179, 188, 169, 100, -184, 193, 174, 100, -183, 191, 172, 100, -181, 190, 171, 100, -181, 191, 172, 100, -181, 192, 172, 100, -181, 190, 171, 100, -179, 188, 169, 100, -178, 188, 169, 100, -176, 185, 166, 100, -176, 185, 166, 100, -174, 183, 164, 100, -176, 185, 166, 100, -177, 186, 167, 100, -176, 185, 166, 100, -176, 184, 166, 100, -175, 185, 167, 100, -179, 187, 169, 100, -180, 187, 169, 100, -179, 188, 169, 100, -176, 185, 168, 100, -176, 185, 169, 100, -181, 190, 173, 100, -179, 188, 171, 100, -173, 182, 163, 100, -175, 184, 165, 100, -177, 186, 168, 100, -177, 186, 167, 100, -179, 188, 171, 100, -179, 188, 171, 100, -178, 187, 170, 100, -177, 186, 169, 100, -179, 188, 171, 100, -179, 188, 171, 100, -178, 187, 170, 100, -178, 188, 171, 100, -183, 193, 176, 100, -182, 192, 175, 100, -181, 191, 174, 100, -180, 190, 173, 100, -178, 187, 170, 100, -179, 189, 171, 100, -181, 192, 174, 100, -181, 191, 174, 100, -178, 189, 172, 100, -174, 185, 168, 100, -177, 189, 171, 100, -175, 186, 169, 100, -177, 187, 169, 100, -179, 188, 170, 100, -179, 187, 170, 100, -177, 186, 169, 100, -178, 187, 170, 100, -178, 187, 170, 100, -172, 180, 163, 100, -174, 179, 162, 100, -173, 178, 161, 100, -181, 185, 167, 100, -180, 183, 164, 100, -161, 162, 144, 100, -138, 134, 117, 100, -146, 142, 124, 100, -149, 144, 128, 100, -148, 146, 127, 100, -141, 138, 119, 100, -128, 120, 105, 100, -130, 126, 109, 100, -130, 129, 110, 100, -136, 137, 120, 100, -169, 179, 162, 100, -173, 186, 169, 100, -171, 183, 166, 100, -175, 187, 171, 100, -171, 183, 167, 100, -174, 185, 170, 100, -171, 180, 163, 100, -132, 126, 111, 100, -93, 72, 57, 100, -65, 37, 23, 100, -64, 35, 22, 100, -63, 37, 23, 100, -60, 38, 24, 100, -49, 30, 15, 100, -84, 74, 59, 100, -135, 137, 123, 100, -162, 172, 155, 100, -162, 174, 158, 100, -152, 164, 150, 100, -156, 168, 154, 100, -159, 172, 158, 100, -161, 173, 159, 100, -168, 179, 164, 100, -174, 185, 170, 100, -178, 189, 175, 100, -174, 185, 170, 100, -174, 185, 170, 100, -173, 184, 170, 100, -175, 186, 169, 100, -168, 178, 161, 100, -169, 177, 160, 100, -172, 180, 163, 100, -161, 164, 148, 100, -125, 123, 109, 100, -105, 102, 88, 100, -96, 87, 75, 100, -92, 83, 71, 100, -78, 66, 56, 100, -46, 33, 24, 100, -58, 45, 36, 100, -49, 37, 31, 100, -52, 39, 35, 100, -57, 43, 37, 100, -53, 40, 32, 100, -174, 185, 165, 100, -172, 182, 162, 100, -169, 178, 159, 100, -174, 184, 165, 100, -174, 184, 165, 100, -173, 182, 163, 100, -173, 182, 163, 100, -173, 182, 163, 100, -174, 183, 164, 100, -178, 187, 169, 100, -176, 185, 167, 100, -176, 184, 165, 100, -177, 186, 167, 100, -175, 184, 165, 100, -177, 186, 167, 100, -177, 187, 167, 100, -175, 184, 165, 100, -175, 185, 166, 100, -176, 185, 166, 100, -181, 190, 171, 100, -182, 190, 171, 100, -180, 189, 170, 100, -176, 186, 164, 100, -180, 190, 167, 100, -183, 191, 172, 100, -181, 189, 171, 100, -182, 191, 172, 100, -183, 193, 174, 100, -182, 192, 174, 100, -186, 195, 178, 100, -184, 193, 176, 100, -183, 192, 174, 100, -179, 188, 170, 100, -179, 188, 169, 100, -179, 188, 170, 100, -181, 190, 173, 100, -183, 192, 175, 100, -183, 193, 176, 100, -180, 189, 173, 100, -180, 190, 173, 100, -180, 190, 173, 100, -179, 190, 173, 100, -182, 193, 178, 100, -182, 193, 177, 100, -184, 195, 178, 100, -181, 192, 175, 100, -183, 194, 177, 100, -183, 193, 176, 100, -180, 190, 173, 100, -178, 188, 171, 100, -180, 190, 173, 100, -179, 190, 173, 100, -176, 187, 170, 100, -177, 188, 171, 100, -180, 191, 174, 100, -180, 190, 174, 100, -181, 191, 174, 100, -179, 188, 171, 100, -177, 186, 169, 100, -175, 184, 167, 100, -175, 184, 166, 100, -174, 183, 164, 100, -174, 183, 164, 100, -176, 180, 163, 100, -175, 179, 162, 100, -175, 180, 164, 100, -175, 180, 163, 100, -180, 185, 168, 100, -180, 187, 170, 100, -180, 185, 170, 100, -179, 185, 166, 100, -180, 186, 168, 100, -177, 185, 167, 100, -176, 186, 168, 100, -178, 188, 170, 100, -182, 191, 174, 100, -169, 178, 161, 100, -175, 185, 168, 100, -172, 183, 167, 100, -169, 180, 164, 100, -173, 184, 168, 100, -173, 184, 168, 100, -174, 184, 167, 100, -182, 192, 175, 100, -179, 185, 167, 100, -141, 136, 119, 100, -97, 85, 67, 100, -100, 94, 72, 100, -131, 131, 109, 100, -120, 119, 98, 100, -151, 159, 140, 100, -163, 175, 157, 100, -161, 172, 154, 100, -155, 166, 151, 100, -158, 168, 155, 100, -154, 165, 150, 100, -163, 174, 160, 100, -164, 175, 162, 100, -170, 181, 167, 100, -166, 177, 162, 100, -170, 181, 167, 100, -175, 186, 172, 100, -176, 187, 173, 100, -173, 184, 170, 100, -180, 191, 177, 100, -175, 184, 168, 100, -178, 187, 170, 100, -169, 178, 161, 100, -176, 185, 168, 100, -168, 179, 161, 100, -166, 179, 158, 100, -166, 175, 156, 100, -155, 162, 143, 100, -149, 155, 139, 100, -120, 120, 107, 100, -138, 139, 124, 100, -96, 93, 81, 100, -48, 38, 29, 100, -35, 25, 17, 100, -34, 24, 20, 100, -173, 185, 165, 100, -169, 181, 161, 100, -169, 181, 161, 100, -175, 187, 167, 100, -174, 186, 166, 100, -167, 179, 159, 100, -175, 185, 166, 100, -179, 188, 169, 100, -177, 186, 167, 100, -176, 184, 166, 100, -176, 185, 166, 100, -175, 184, 165, 100, -177, 186, 167, 100, -176, 185, 166, 100, -178, 187, 168, 100, -177, 186, 167, 100, -177, 186, 167, 100, -178, 186, 167, 100, -176, 184, 165, 100, -178, 187, 168, 100, -181, 187, 170, 100, -178, 187, 166, 100, -178, 189, 164, 100, -178, 188, 165, 100, -179, 187, 168, 100, -178, 188, 166, 100, -178, 187, 166, 100, -179, 188, 169, 100, -180, 189, 170, 100, -180, 189, 170, 100, -180, 189, 171, 100, -183, 191, 175, 100, -182, 191, 174, 100, -179, 187, 169, 100, -178, 187, 171, 100, -179, 190, 173, 100, -177, 189, 172, 100, -180, 191, 174, 100, -180, 192, 175, 100, -180, 192, 176, 100, -182, 193, 176, 100, -182, 192, 176, 100, -181, 192, 175, 100, -183, 195, 178, 100, -182, 193, 176, 100, -179, 190, 173, 100, -183, 194, 177, 100, -184, 195, 178, 100, -182, 193, 176, 100, -185, 195, 178, 100, -187, 196, 179, 100, -184, 194, 177, 100, -182, 192, 175, 100, -179, 189, 172, 100, -179, 189, 172, 100, -180, 190, 173, 100, -181, 190, 173, 100, -180, 189, 172, 100, -180, 189, 172, 100, -180, 189, 172, 100, -182, 191, 174, 100, -183, 191, 175, 100, -180, 189, 171, 100, -177, 186, 167, 100, -175, 184, 166, 100, -176, 185, 168, 100, -179, 187, 170, 100, -178, 186, 170, 100, -176, 184, 168, 100, -174, 183, 166, 100, -172, 180, 162, 100, -173, 181, 164, 100, -175, 183, 166, 100, -174, 182, 165, 100, -172, 180, 163, 100, -174, 183, 166, 100, -174, 183, 166, 100, -172, 182, 165, 100, -172, 182, 165, 100, -172, 183, 166, 100, -176, 187, 170, 100, -180, 191, 174, 100, -177, 188, 171, 100, -179, 189, 172, 100, -181, 191, 174, 100, -186, 197, 180, 100, -183, 192, 174, 100, -172, 182, 159, 100, -168, 179, 156, 100, -166, 177, 153, 100, -161, 171, 151, 100, -165, 175, 159, 100, -159, 170, 153, 100, -158, 169, 153, 100, -161, 173, 157, 100, -157, 168, 151, 100, -164, 175, 160, 100, -162, 173, 159, 100, -167, 178, 164, 100, -167, 178, 164, 100, -174, 185, 171, 100, -178, 190, 175, 100, -183, 195, 182, 100, -175, 187, 173, 100, -177, 189, 175, 100, -178, 189, 174, 100, -177, 188, 171, 100, -176, 187, 170, 100, -177, 187, 170, 100, -169, 180, 163, 100, -162, 174, 155, 100, -167, 179, 160, 100, -169, 182, 162, 100, -165, 178, 159, 100, -169, 181, 163, 100, -169, 180, 161, 100, -171, 179, 161, 100, -151, 153, 135, 100, -92, 93, 75, 100, -60, 62, 49, 100, -168, 180, 160, 100, -168, 180, 161, 100, -171, 183, 162, 100, -172, 184, 164, 100, -174, 187, 166, 100, -173, 183, 164, 100, -179, 186, 168, 100, -180, 188, 169, 100, -177, 185, 166, 100, -176, 185, 166, 100, -176, 186, 167, 100, -178, 187, 168, 100, -179, 188, 169, 100, -178, 188, 169, 100, -184, 193, 174, 100, -179, 189, 170, 100, -175, 185, 166, 100, -177, 186, 167, 100, -175, 184, 165, 100, -172, 180, 161, 100, -172, 180, 162, 100, -174, 183, 163, 100, -174, 184, 161, 100, -176, 185, 162, 100, -174, 182, 161, 100, -176, 186, 162, 100, -174, 184, 162, 100, -177, 186, 167, 100, -177, 186, 168, 100, -173, 182, 163, 100, -177, 186, 167, 100, -180, 189, 170, 100, -180, 189, 170, 100, -177, 186, 167, 100, -178, 189, 172, 100, -174, 185, 168, 100, -179, 190, 173, 100, -182, 193, 176, 100, -180, 191, 174, 100, -182, 192, 175, 100, -180, 191, 174, 100, -177, 188, 170, 100, -174, 185, 168, 100, -180, 191, 174, 100, -183, 193, 176, 100, -180, 190, 173, 100, -183, 193, 176, 100, -184, 194, 177, 100, -182, 193, 176, 100, -186, 195, 178, 100, -184, 193, 176, 100, -183, 192, 175, 100, -185, 194, 177, 100, -183, 192, 175, 100, -181, 190, 173, 100, -183, 192, 175, 100, -182, 192, 175, 100, -181, 190, 173, 100, -182, 191, 174, 100, -179, 188, 171, 100, -183, 192, 175, 100, -182, 189, 173, 100, -181, 189, 171, 100, -180, 190, 171, 100, -175, 184, 165, 100, -178, 187, 169, 100, -180, 186, 171, 100, -175, 182, 165, 100, -174, 183, 165, 100, -177, 186, 168, 100, -179, 188, 171, 100, -175, 185, 167, 100, -174, 183, 166, 100, -175, 184, 166, 100, -176, 185, 166, 100, -178, 187, 170, 100, -180, 189, 172, 100, -176, 185, 168, 100, -178, 187, 170, 100, -176, 187, 170, 100, -176, 186, 169, 100, -179, 189, 172, 100, -179, 190, 173, 100, -177, 187, 170, 100, -180, 189, 172, 100, -177, 186, 169, 100, -175, 184, 167, 100, -177, 185, 167, 100, -174, 182, 163, 100, -172, 181, 160, 100, -170, 179, 160, 100, -172, 182, 165, 100, -168, 179, 161, 100, -167, 178, 160, 100, -170, 180, 163, 100, -170, 181, 165, 100, -168, 179, 164, 100, -161, 172, 158, 100, -165, 176, 163, 100, -164, 176, 163, 100, -171, 182, 169, 100, -173, 185, 172, 100, -173, 188, 175, 100, -167, 179, 166, 100, -165, 177, 163, 100, -166, 178, 164, 100, -169, 181, 164, 100, -177, 188, 171, 100, -179, 190, 173, 100, -175, 186, 169, 100, -176, 186, 169, 100, -175, 184, 167, 100, -169, 180, 162, 100, -167, 178, 158, 100, -162, 175, 154, 100, -167, 178, 158, 100, -164, 175, 153, 100, -173, 180, 158, 100, -168, 176, 153, 100, -151, 160, 137, 100, -163, 176, 157, 100, -165, 178, 158, 100, -168, 180, 160, 100, -167, 179, 159, 100, -171, 183, 163, 100, -169, 181, 161, 100, -171, 181, 162, 100, -170, 182, 163, 100, -168, 181, 162, 100, -168, 181, 162, 100, -167, 180, 160, 100, -176, 187, 168, 100, -179, 188, 169, 100, -178, 187, 168, 100, -179, 189, 168, 100, -180, 192, 170, 100, -173, 185, 165, 100, -176, 188, 169, 100, -171, 183, 164, 100, -170, 182, 161, 100, -177, 187, 168, 100, -177, 188, 169, 100, -172, 182, 160, 100, -176, 186, 162, 100, -172, 182, 158, 100, -178, 188, 164, 100, -182, 192, 167, 100, -177, 187, 166, 100, -174, 185, 167, 100, -176, 186, 168, 100, -179, 188, 169, 100, -180, 189, 170, 100, -182, 192, 174, 100, -181, 192, 175, 100, -184, 195, 178, 100, -180, 191, 174, 100, -177, 188, 171, 100, -178, 189, 172, 100, -179, 190, 173, 100, -179, 190, 173, 100, -180, 191, 176, 100, -183, 194, 178, 100, -178, 189, 172, 100, -177, 185, 168, 100, -178, 186, 168, 100, -181, 188, 170, 100, -182, 191, 173, 100, -181, 190, 173, 100, -181, 191, 174, 100, -183, 192, 175, 100, -182, 191, 174, 100, -181, 190, 173, 100, -182, 191, 174, 100, -182, 191, 174, 100, -180, 190, 173, 100, -181, 190, 173, 100, -186, 192, 176, 100, -184, 192, 176, 100, -180, 189, 172, 100, -182, 191, 174, 100, -183, 192, 175, 100, -181, 190, 173, 100, -181, 190, 173, 100, -182, 191, 174, 100, -180, 189, 171, 100, -180, 189, 171, 100, -179, 188, 171, 100, -180, 187, 169, 100, -179, 188, 170, 100, -174, 183, 165, 100, -177, 186, 169, 100, -176, 185, 167, 100, -175, 184, 167, 100, -176, 185, 166, 100, -179, 188, 168, 100, -179, 188, 170, 100, -181, 190, 173, 100, -177, 187, 170, 100, -183, 192, 175, 100, -179, 189, 172, 100, -177, 188, 171, 100, -180, 189, 172, 100, -179, 187, 170, 100, -173, 182, 165, 100, -174, 183, 166, 100, -174, 183, 166, 100, -173, 181, 164, 100, -174, 183, 165, 100, -173, 183, 165, 100, -176, 185, 166, 100, -177, 186, 167, 100, -175, 184, 165, 100, -171, 181, 161, 100, -176, 186, 168, 100, -173, 182, 166, 100, -175, 186, 169, 100, -166, 177, 160, 100, -151, 162, 146, 100, -162, 173, 158, 100, -165, 177, 165, 100, -163, 175, 163, 100, -164, 176, 162, 100, -179, 190, 177, 100, -180, 191, 179, 100, -177, 189, 175, 100, -174, 185, 171, 100, -168, 180, 163, 100, -173, 184, 168, 100, -185, 196, 179, 100, -181, 192, 175, 100, -182, 191, 174, 100, -182, 191, 174, 100, -176, 184, 167, 100, -172, 181, 164, 100, -169, 178, 159, 100, -164, 174, 151, 100, -165, 175, 149, 100, -158, 170, 144, 100, -158, 171, 146, 100, -161, 172, 148, 100, -170, 182, 163, 100, -171, 183, 163, 100, -173, 186, 165, 100, -173, 185, 166, 100, -174, 185, 168, 100, -165, 178, 159, 100, -160, 175, 154, 100, -161, 178, 156, 100, -159, 176, 155, 100, -158, 176, 156, 100, -161, 176, 155, 100, -169, 182, 162, 100, -175, 187, 167, 100, -182, 192, 172, 100, -182, 192, 172, 100, -178, 190, 166, 100, -175, 187, 167, 100, -174, 185, 167, 100, -176, 187, 169, 100, -173, 186, 165, 100, -176, 188, 171, 100, -173, 186, 166, 100, -174, 186, 165, 100, -173, 185, 161, 100, -173, 184, 160, 100, -176, 186, 162, 100, -178, 189, 165, 100, -177, 188, 168, 100, -179, 191, 173, 100, -182, 193, 177, 100, -174, 186, 168, 100, -176, 187, 170, 100, -178, 189, 173, 100, -181, 192, 175, 100, -182, 193, 176, 100, -180, 191, 174, 100, -180, 191, 174, 100, -180, 191, 174, 100, -181, 192, 175, 100, -178, 189, 172, 100, -182, 193, 177, 100, -182, 193, 177, 100, -183, 194, 177, 100, -183, 193, 176, 100, -181, 189, 171, 100, -176, 184, 165, 100, -177, 186, 167, 100, -178, 187, 169, 100, -182, 191, 174, 100, -185, 194, 177, 100, -184, 193, 176, 100, -184, 193, 176, 100, -183, 192, 175, 100, -182, 191, 174, 100, -181, 188, 172, 100, -181, 190, 173, 100, -184, 192, 176, 100, -185, 193, 176, 100, -184, 193, 176, 100, -184, 193, 176, 100, -185, 194, 177, 100, -185, 194, 177, 100, -183, 192, 175, 100, -182, 191, 174, 100, -185, 194, 177, 100, -184, 193, 176, 100, -185, 194, 177, 100, -186, 196, 178, 100, -184, 193, 177, 100, -180, 189, 172, 100, -182, 191, 174, 100, -182, 191, 175, 100, -182, 191, 173, 100, -181, 190, 170, 100, -183, 192, 174, 100, -180, 189, 170, 100, -181, 190, 173, 100, -179, 189, 172, 100, -178, 187, 170, 100, -178, 187, 170, 100, -179, 189, 172, 100, -176, 187, 170, 100, -174, 183, 166, 100, -176, 185, 168, 100, -171, 182, 165, 100, -173, 182, 165, 100, -173, 182, 165, 100, -170, 181, 162, 100, -169, 179, 160, 100, -168, 177, 158, 100, -172, 181, 162, 100, -174, 183, 164, 100, -176, 185, 166, 100, -180, 188, 170, 100, -176, 185, 168, 100, -176, 186, 169, 100, -163, 174, 157, 100, -152, 163, 145, 100, -171, 182, 165, 100, -165, 176, 162, 100, -159, 172, 159, 100, -167, 179, 165, 100, -178, 188, 175, 100, -179, 189, 177, 100, -178, 189, 175, 100, -176, 187, 173, 100, -180, 191, 177, 100, -178, 189, 175, 100, -182, 193, 176, 100, -178, 189, 172, 100, -177, 188, 171, 100, -180, 190, 173, 100, -176, 187, 170, 100, -177, 188, 171, 100, -175, 185, 167, 100, -169, 178, 157, 100, -158, 168, 143, 100, -160, 173, 146, 100, -154, 168, 142, 100, -154, 167, 142, 100 -}; diff --git a/game/client/interpolatedvar.h b/game/client/interpolatedvar.h index b5467ad4..542a98ec 100644 --- a/game/client/interpolatedvar.h +++ b/game/client/interpolatedvar.h @@ -733,7 +733,7 @@ inline void CInterpolatedVarArrayBase::AddToHead( float changeTi } CInterpolatedVarEntry *e = &m_VarHistory[ newslot ]; - e->NewEntry( values, m_nMaxCount, changeTime ); + e->NewEntry( (Type*)values, m_nMaxCount, changeTime ); } template< typename Type, bool IS_ARRAY > diff --git a/game/client/third/minizip/CMakeLists.txt b/game/client/third/minizip/CMakeLists.txt deleted file mode 100755 index f98a4e2f..00000000 --- a/game/client/third/minizip/CMakeLists.txt +++ /dev/null @@ -1,364 +0,0 @@ -#*************************************************************************** -# Copyright: Matthias Schmieder, -# E-Mail: schmieder.matthias@gmail.com -# Year: 2016 -#*************************************************************************** -cmake_minimum_required(VERSION 2.8) - -option(USE_ZLIB "Enables ZLIB compression" ON) -option(USE_BZIP2 "Enables BZIP2 compression" ON) -option(USE_LZMA "Enables LZMA compression" ON) -option(USE_PKCRYPT "Enables PKWARE traditional encryption" ON) -option(USE_AES "Enables AES encryption" ON) -option(BUILD_TEST "Builds minizip test executable" OFF) - -# Set a consistent MACOSX_RPATH default across all CMake versions. -# When CMake 2.8.12 is required, change this default to 1. -# When CMake 3.0.0 is required, remove this block (see CMP0042). -if(NOT DEFINED CMAKE_MACOSX_RPATH) - set(CMAKE_MACOSX_RPATH 0) -endif() - -project("minizip") - -include(GNUInstallDirs) - -set(INSTALL_BIN_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for executables") -set(INSTALL_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries") -set(INSTALL_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for headers") -set(INSTALL_MAN_DIR ${CMAKE_INSTALL_MANDIR} CACHE PATH "Installation directory for manual pages") -set(INSTALL_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE PATH "Installation directory for pkgconfig (.pc) files") -set(INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/minizip CACHE PATH "Installation directory for cmake files.") - -set(VERSION "2.3.3") - -# Set cmake debug postfix to d -set(CMAKE_DEBUG_POSTFIX "d") - -# Ensure correct version of zlib is referenced -if(USE_ZLIB) - set(ZLIB_ROOT ${DEF_ZLIB_ROOT} CACHE PATH "Parent directory of zlib installation") - find_package(ZLIB REQUIRED) - if(ZLIB_FOUND) - include_directories(${ZLIB_INCLUDE_DIRS}) - endif() - add_definitions(-DHAVE_ZLIB) -endif() - -set(MINIZIP_PC ${CMAKE_CURRENT_BINARY_DIR}/minizip.pc) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/minizip.pc.cmakein ${MINIZIP_PC} @ONLY) - -set(PROJECT_NAME libminizip) - -set(MINIZIP_SRC - mz_os.c - mz_compat.c - mz_strm.c - mz_strm_buf.c - mz_strm_mem.c - mz_strm_posix.c - mz_strm_split.c - mz_zip.c) - -set(MINIZIP_PUBLIC_HEADERS - mz.h - mz_os.h - mz_compat.h - mz_strm.h - mz_strm_buf.h - mz_strm_mem.h - mz_strm_posix.h - mz_strm_split.h - mz_zip.h) - -if(WIN32) - list(APPEND MINIZIP_SRC "mz_os_win32.c" "mz_strm_win32.c") - list(APPEND MINIZIP_PUBLIC_HEADERS "mz_os_win32.h" "mz_strm_win32.h") - - add_definitions(-D_CRT_SECURE_NO_DEPRECATE) -endif() - -if("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - add_definitions(-DMZ_USE_WINRT_API) -endif() - -if(UNIX) - add_compile_options(-O3) - - list(APPEND MINIZIP_SRC "mz_os_posix.c") - list(APPEND MINIZIP_PUBLIC_HEADERS "mz_os_posix.h") - - set(define_lfs_macros TRUE) - - if(ANDROID) - string(REGEX REPLACE "android-([0-9+])" "\\1" - android_api "${ANDROID_PLATFORM}") - if(${android_api} LESS 24) - set(define_lfs_macros FALSE) - endif() - endif() - - if(define_lfs_macros) - add_definitions(-D__USE_FILE_OFFSET64) - add_definitions(-D__USE_LARGEFILE64) - add_definitions(-D_LARGEFILE64_SOURCE) - add_definitions(-D_FILE_OFFSET_BITS=64) - endif() - - if(CMAKE_SYSTEM_NAME MATCHES "Linux") - find_package(PkgConfig REQUIRED) - - pkg_check_modules(LIBBSD libbsd REQUIRED) - - include_directories(${LIBBSD_INCLUDE_DIRS}) - link_directories(${LIBBSD_LIBRARY_DIRS}) - endif() -endif() - -if(USE_PKCRYPT) - add_definitions(-DHAVE_PKCRYPT) - - list(APPEND MINIZIP_SRC "mz_strm_pkcrypt.c") - list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_pkcrypt.h") -endif() - -if(USE_AES) - add_definitions(-DHAVE_AES) - - list(APPEND MINIZIP_SRC "mz_strm_aes.c") - list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_aes.h") - - set(AES_SRC - lib/aes/aescrypt.c - lib/aes/aeskey.c - lib/aes/aestab.c - lib/aes/hmac.c - lib/aes/pwd2key.c - lib/aes/sha1.c) - - set(AES_PUBLIC_HEADERS - lib/aes/aes.h - lib/aes/aesopt.h - lib/aes/aestab.h - lib/aes/brg_endian.h - lib/aes/brg_types.h - lib/aes/hmac.h - lib/aes/pwd2key.h - lib/aes/sha1.h) - - include_directories(lib/aes) - - source_group("AES" FILES ${AES_SRC} ${AES_PUBLIC_HEADERS}) -endif() - -if(USE_ZLIB) - add_definitions(-DHAVE_ZLIB) - - list(APPEND MINIZIP_SRC "mz_strm_zlib.c") - list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_zlib.h") - - include(CheckFunctionExists) - set(CMAKE_REQUIRED_LIBRARIES ZLIB::ZLIB) - CHECK_FUNCTION_EXISTS(z_get_crc_table - NEEDS_Z_PREFIX) - - if(NEEDS_Z_PREFIX) - add_definitions(-DZ_PREFIX) - endif() -endif() - -if(USE_BZIP2) - add_definitions(-DHAVE_BZIP2) - add_definitions(-DBZ_NO_STDIO) - - list(APPEND MINIZIP_SRC "mz_strm_bzip.c") - list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_bzip.h") - - set(BZIP2_SRC - lib/bzip2/blocksort.c - lib/bzip2/bzlib.c - lib/bzip2/compress.c - lib/bzip2/crctable.c - lib/bzip2/decompress.c - lib/bzip2/huffman.c - lib/bzip2/randtable.c) - - set(BZIP2_PUBLIC_HEADERS - lib/bzip2/bzlib.h - lib/bzip2/bzlib_private.h) - - include_directories(lib/bzip2) - - source_group("BZip2" FILES ${BZIP2_SRC} ${BZIP2_PUBLIC_HEADERS}) -endif() - -if(USE_LZMA) - add_definitions(-DHAVE_LZMA) - add_definitions(-DHAVE_CONFIG_H) - add_definitions(-DLZMA_API_STATIC) - - list(APPEND MINIZIP_SRC "mz_strm_lzma.c") - list(APPEND MINIZIP_PUBLIC_HEADERS "mz_strm_lzma.h") - - set(LZMA_CHECK_SRC - lib/liblzma/check/check.c - lib/liblzma/check/crc32_fast.c - lib/liblzma/check/crc32_table.c) - set(LZMA_COMMON_SRC - lib/liblzma/common/alone_decoder.c - lib/liblzma/common/alone_encoder.c - lib/liblzma/common/common.c - lib/liblzma/common/filter_encoder.c) - set(LZMA_LZ_SRC - lib/liblzma/lz/lz_decoder.c - lib/liblzma/lz/lz_encoder.c - lib/liblzma/lz/lz_encoder_mf.c) - set(LZMA_LZMA_SRC - lib/liblzma/lzma/fastpos.h - lib/liblzma/lzma/fastpos_table.c - lib/liblzma/lzma/lzma_decoder.c - lib/liblzma/lzma/lzma_encoder.c - lib/liblzma/lzma/lzma_encoder_optimum_fast.c - lib/liblzma/lzma/lzma_encoder_optimum_normal.c - lib/liblzma/lzma/lzma_encoder_presets.c) - set(LZMA_RANGECODER_SRC - lib/liblzma/rangecoder/price_table.c) - - set(LZMA_CONFIG_HEADERS - lib/liblzma/config.h) - set(LZMA_API_HEADERS - lib/liblzma/api/lzma.h - lib/liblzma/api/lzma/base.h - lib/liblzma/api/lzma/check.h - lib/liblzma/api/lzma/container.h - lib/liblzma/api/lzma/filter.h - lib/liblzma/api/lzma/lzma12.h - lib/liblzma/api/lzma/version.h - lib/liblzma/api/lzma/vli.h) - set(LZMA_CHECK_HEADERS - lib/liblzma/check/check.h - lib/liblzma/check/crc32_table_be.h - lib/liblzma/check/crc32_table_le.h - lib/liblzma/check/crc_macros.h) - set(LZMA_COMMON_HEADERS - lib/liblzma/common/alone_decoder.h - lib/liblzma/common/common.h - lib/liblzma/common/filter_encoder.h - lib/liblzma/common/index.h - lib/liblzma/common/memcmplen.h - lib/liblzma/common/sysdefs.h - lib/liblzma/common/tuklib_common.h - lib/liblzma/common/tuklib_config.h - lib/liblzma/common/tuklib_integer.h) - set(LZMA_LZ_HEADERS - lib/liblzma/lz/lz_decoder.h - lib/liblzma/lz/lz_encoder.h - lib/liblzma/lz/lz_encoder_hash.h - lib/liblzma/lz/lz_encoder_hash_table.h) - set(LZMA_LZMA_HEADERS - lib/liblzma/lzma/lzma2_encoder.h - lib/liblzma/lzma/lzma_common.h - lib/liblzma/lzma/lzma_decoder.h - lib/liblzma/lzma/lzma_encoder.h - lib/liblzma/lzma/lzma_encoder_private.h) - set(LZMA_RANGECODER_HEADERS - lib/liblzma/rangecoder/price.h - lib/liblzma/rangecoder/range_common.h - lib/liblzma/rangecoder/range_decoder.h - lib/liblzma/rangecoder/range_encoder.h) - - set(LZMA_PUBLIC_HEADERS - ${LZMA_CONFIG_HEADERS} - ${LZMA_API_HEADERS} - ${LZMA_CHECK_HEADERS} - ${LZMA_COMMON_HEADERS} - ${LZMA_LZ_HEADERS} - ${LZMA_LZMA_HEADERS} - ${LZMA_RANGECODER_HEADERS}) - - set(LZMA_SRC - ${LZMA_CHECK_SRC} - ${LZMA_COMMON_SRC} - ${LZMA_LZ_SRC} - ${LZMA_LZMA_SRC} - ${LZMA_RANGECODER_SRC}) - - include_directories(lib/liblzma - lib/liblzma/api - lib/liblzma/check - lib/liblzma/common - lib/liblzma/lz - lib/liblzma/lzma - lib/liblzma/rangecoder) - - source_group("LZMA" FILES ${LZMA_CONFIG_HEADERS}) - source_group("LZMA\\API" FILES ${LZMA_API_HEADERS}) - source_group("LZMA\\Check" FILES ${LZMA_CHECK_SRC} ${LZMA_CHECK_HEADERS}) - source_group("LZMA\\Common" FILES ${LZMA_COMMON_SRC} ${LZMA_COMMON_HEADERS}) - source_group("LZMA\\LZ" FILES ${LZMA_LZ_SRC} ${LZMA_LZ_HEADERS}) - source_group("LZMA\\LZMA" FILES ${LZMA_LZMA_SRC} ${LZMA_LZMA_HEADERS}) - source_group("LZMA\\RangeCoder" FILES ${LZMA_RANGECODER_SRC} ${LZMA_RANGECODER_HEADERS}) -endif() - -# Enable x86 optimizations if supported -if(CMAKE_C_COMPILER MATCHES ".*clang") - include(CheckCCompilerFlag) - macro(enable_option_if_supported option variable) - check_c_compiler_flag("-Werror=unused-command-line-argument ${option}" ${variable}) - if(${variable}) - add_compile_options(${option}) - endif() - endmacro() - - enable_option_if_supported(-msse3 check_opt_sse3) - enable_option_if_supported(-msse4.1 check_opt_sse41) - enable_option_if_supported(-maes check_opt_aes) -endif() - -# Create minizip library -source_group("Minizip" FILES ${MINIZIP_SRC} ${MINIZIP_PUBLIC_HEADERS}) - -add_library(${PROJECT_NAME} - ${MINIZIP_SRC} ${MINIZIP_PUBLIC_HEADERS} - ${AES_SRC} ${AES_PUBLIC_HEADERS} - ${BZIP2_SRC} ${BZIP2_PUBLIC_HEADERS} - ${LZMA_SRC} ${LZMA_PUBLIC_HEADERS}) - -if (MINGW AND BUILD_SHARED_LIBS) - set_target_properties(${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_NAME "minizip") -endif () - -set_target_properties(${PROJECT_NAME} PROPERTIES LINKER_LANGUAGE C PREFIX "" - POSITION_INDEPENDENT_CODE 1) -if(USE_ZLIB) - target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB) -endif() -if(USE_LZMA) - set_target_properties(${PROJECT_NAME} PROPERTIES C_STANDARD 99) -endif() -if(UNIX) - target_link_libraries(${PROJECT_NAME} ${LIBBSD_LIBRARIES}) -endif() - -target_include_directories(${PROJECT_NAME} PUBLIC $) - -install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME} - INCLUDES DESTINATION "${INSTALL_INC_DIR}" - RUNTIME DESTINATION "${INSTALL_BIN_DIR}" - ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" - LIBRARY DESTINATION "${INSTALL_LIB_DIR}") - -install(EXPORT ${PROJECT_NAME} - DESTINATION "${INSTALL_CMAKE_DIR}" - NAMESPACE "MINIZIP::") - -install(FILES ${MINIZIP_PUBLIC_HEADERS} DESTINATION "${INSTALL_INC_DIR}") -install(FILES ${MINIZIP_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}") - -if(BUILD_TEST) - add_executable(minizip "minizip.c") - target_link_libraries(minizip ${PROJECT_NAME}) - - install(TARGETS minizip - RUNTIME DESTINATION "bin") -endif() diff --git a/game/client/third/minizip/LICENSE b/game/client/third/minizip/LICENSE deleted file mode 100755 index 086295a2..00000000 --- a/game/client/third/minizip/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Condition of use and distribution are the same as zlib: - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any damages -arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it -freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgement in the product documentation would be - appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/game/client/third/minizip/Minizip.podspec b/game/client/third/minizip/Minizip.podspec deleted file mode 100755 index 065ef492..00000000 --- a/game/client/third/minizip/Minizip.podspec +++ /dev/null @@ -1,37 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'Minizip' - s.version = '2.3.3' - s.license = 'zlib' - s.summary = 'Minizip contrib in zlib with the latest bug fixes and advanced features' - s.description = <<-DESC -Minizip zlib contribution that includes: -* AES encryption -* I/O buffering -* PKWARE disk splitting -It also has the latest bug fixes that having been found all over the internet. -DESC - s.homepage = 'https://github.com/nmoinvaz/minizip' - s.authors = 'Nathan Moinvaziri', 'Gilles Vollant' - - s.source = { :git => 'https://github.com/nmoinvaz/minizip.git' } - s.libraries = 'z' - - s.subspec 'Core' do |sp| - sp.source_files = '{mz_os,mz_compat,mz_strm,mz_strm_mem,mz_strm_buf,mz_zip,mz_strm_crypt,mz_strm_posix,mz_strm_zlib}.{c,h}' - end - - s.subspec 'AES' do |sp| - sp.dependency 'Minizip/Core' - sp.source_files = 'lib/aes/*.{c,h}', 'mz_strm_aes.{c,h}' - end - - s.subspec 'BZIP2' do |sp| - sp.dependency 'Minizip/Core' - sp.source_files = 'lib/bzip2/*.{c,h}', 'mz_strm_bzip.{c,h}' - end - - s.subspec 'LZMA' do |sp| - sp.dependency 'Minizip/Core' - sp.source_files = 'lib/liblzma/*.{c,h}', 'mz_strm_lzma.{c,h}' - end -end diff --git a/game/client/third/minizip/README.md b/game/client/third/minizip/README.md deleted file mode 100755 index 7c040ab4..00000000 --- a/game/client/third/minizip/README.md +++ /dev/null @@ -1,177 +0,0 @@ -# Minizip 2.3.3 - -This library is a refactoring of the minizip contribution found in the zlib distribution and is supported on Windows, macOS, and Linux. The motivation for this work has been the inclusion of advanced features, improvements in code maintainability and readability, and the reduction of duplicate code. It is based on the original work of [Gilles Vollant](http://www.winimage.com/zLibDll/minizip.html) that has been contributed to by many people over the years. - -Dev: ![Dev Branch Status](https://travis-ci.org/nmoinvaz/minizip.svg?branch=dev) -Master: ![Master Branch Status](https://travis-ci.org/nmoinvaz/minizip.svg?branch=master) - -For my older fork of this library checkout the [1.2](https://github.com/nmoinvaz/minizip/tree/1.2) branch. -For the original work maintained by Mark Adler checkout the zlib minizip [contrib](https://github.com/madler/zlib/tree/master/contrib/minizip). - -## Build - -To generate the project files for your platform and IDE download and run cmake in the project directory. - -``` -cmake . -cmake . -DBUILD_TEST=ON -cmake --build . -``` - -## Build Options - -| Name | Description | Default Value | -|:- |:-|:-:| -| USE_ZLIB | Enables ZLIB compression | ON | -| USE_BZIP2 | Enables BZIP2 compression | ON | -| USE_LZMA | Enables LZMA compression | ON | -| USE_PKCRYPT | Enables PKWARE traditional encryption | ON | -| USE_AES | Enables AES encryption | ON | -| BUILD_TEST | Builds minizip test executable | OFF | - -## Contents - -| File(s) | Description | Required | -|:- |:-|:-:| -| minizip.c | Sample application | No | -| mz_compat.\* | Minizip 1.0 compatibility layer | No | -| mz.h | Error codes and flags | Yes | -| mz_os\* | OS specific helper functions | Encryption, Disk Splitting | -| mz_strm.\* | Stream interface | Yes | -| mz_strm_aes.\* | WinZIP AES stream | No | -| mz_strm_buf.\* | Buffered stream | No | -| mz_strm_bzip.\* | BZIP2 stream using libbzip2 | No | -| mz_strm_lzma.\* | LZMA stream using liblzma | zlib or liblzma | -| mz_strm_mem.\* | Memory stream | Yes | -| mz_strm_split.\* | Disk splitting stream | No | -| mz_strm_pkcrypt.\* | PKWARE traditional encryption stream | No | -| mz_strm_posix.\* | File stream using Posix functions | Non-windows systems | -| mz_strm_win32.\* | File stream using Win32 API functions | Windows systems | -| mz_strm_zlib.\* | Deflate stream using zlib | zlib or liblzma | -| mz_zip.\* | Zip functionality | Yes | - -## Features - -### Compression Methods - -#### BZIP2 - -+ Requires ``cmake . -DUSE_BZIP2=ON`` or ``#define HAVE_BZIP2`` -+ Requires [BZIP2](http://www.bzip.org/) library - -#### LZMA - -+ Requires ``cmake . -DUSE_LZMA=ON`` or ``#define HAVE_LZMA`` -+ Requires [liblzma](https://tukaani.org/xz/) library - -### Encryption - -#### [WinZIP AES Encryption](https://www.winzip.com/aes_info.htm) - -+ Requires ``cmake . -DUSE_AES=ON`` or ``#define HAVE_AES`` -+ Requires Brian Gladman's [AES](https://github.com/BrianGladman/aes) and [SHA](https://github.com/BrianGladman/sha) libraries - -When zipping with a password it will always use AES 256-bit encryption. -When unzipping it will use AES decryption only if necessary. - -#### Disabling All Encryption - -To disable encryption use the following cmake commands: - -``` -cmake . -DUSE_AES=OFF -cmake . -DUSE_PKCRYPT=OFF -``` - -### NTFS Timestamps - -Support has been added for UTC last modified, last accessed, and creation dates. - -### Streams - -This library has been refactored around streams. - -#### Memory Streaming - -To unzip from a zip file in memory pass the memory stream to the open function. -``` -uint8_t *zip_buffer = NULL; -int32_t zip_buffer_size = 0; -void *mem_stream = NULL; - -// fill zip_buffer with zip contents -mz_stream_mem_create(&mem_stream); -mz_stream_mem_set_buffer(mem_stream, zip_buffer, zip_buffer_size); -mz_stream_open(mem_stream, NULL, MZ_OPEN_MODE_READ); - -void *zip_handle = mz_zip_open(mem_stream, MZ_OPEN_MODE_READ); -// do unzip operations - -mz_stream_mem_delete(&mem_stream); -``` - -To create a zip file in memory first create a growable memory stream and pass it to the open function. - -``` -void *mem_stream = NULL; - -mz_stream_mem_create(&mem_stream); -mz_stream_mem_set_grow_size(mem_stream, (128 * 1024)); -mz_stream_open(mem_stream, NULL, MZ_OPEN_MODE_CREATE); - -void *zip_handle = mz_zip_open(mem_stream, MZ_OPEN_MODE_WRITE); -// do unzip operations - -mz_stream_mem_delete(&mem_stream); -``` - -For a complete example, see test_zip_mem() in [test.c](https://github.com/nmoinvaz/minizip/blob/master/test/test.c). - -#### Buffered Streaming - -By default the library will read bytes typically one at a time. The buffered stream allows for buffered read and write operations to improve I/O performance. - -``` -void *stream = NULL; -void *buf_stream = NULL; - -mz_stream_os_create(&stream) -// do open os stream - -mz_stream_buffered_create(&buf_stream); -mz_stream_buffered_open(buf_stream, NULL, MZ_OPEN_MODE_READ); -mz_stream_buffered_set_base(buf_stream, stream); - -void *zip_handle = mz_zip_open(buf_stream, MZ_OPEN_MODE_READ); -``` - -#### Disk Splitting Stream - -To create an archive with multiple disks use the disk splitting stream and supply a disk size value in bytes. - -``` -void *stream = NULL; -void *split_stream = NULL; - -mz_stream_os_create(&stream); - -mz_stream_split_create(&split_stream); -mz_stream_split_set_prop_int64(split_stream, MZ_STREAM_PROP_DISK_SIZE, 64 * 1024); - -mz_stream_set_base(split_stream, stream); - -mz_stream_open(split_stream, path.. - -void *zip_handle = mz_zip_open(split_stream, MZ_OPEN_MODE_WRITE); -``` - -### Windows RT - -+ Requires ``#define MZ_USE_WINRT_API`` - -## Limitations - -+ Archives are required to have a central directory. -+ Central directory header values should be correct and it is necessary for the compressed size to be accurate for AES encryption. -+ Central directory encryption is not supported due to licensing restrictions mentioned by PKWARE in their zip appnote. -+ Central directory is the only data stored on the last disk of a split-disk archive and doesn't follow disk size restrictions. diff --git a/game/client/third/minizip/lib/aes/aes.h b/game/client/third/minizip/lib/aes/aes.h deleted file mode 100755 index 92e23c2c..00000000 --- a/game/client/third/minizip/lib/aes/aes.h +++ /dev/null @@ -1,270 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - - This file contains the definitions required to use AES in C. See aesopt.h - for optimisation details. -*/ - -#ifndef _AES_H -#define _AES_H - -#include - -/* This include is used to find 8 & 32 bit unsigned integer types */ -#include "brg_types.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#define AES_128 /* if a fast 128 bit key scheduler is needed */ -#define AES_192 /* if a fast 192 bit key scheduler is needed */ -#define AES_256 /* if a fast 256 bit key scheduler is needed */ -#define AES_VAR /* if variable key size scheduler is needed */ -#define AES_MODES /* if support is needed for modes */ - -/* The following must also be set in assembler files if being used */ - -#define AES_ENCRYPT /* if support for encryption is needed */ -#define AES_DECRYPT /* if support for decryption is needed */ - -#define AES_BLOCK_SIZE 16 /* the AES block size in bytes */ -#define N_COLS 4 /* the number of columns in the state */ - -/* The key schedule length is 11, 13 or 15 16-byte blocks for 128, */ -/* 192 or 256-bit keys respectively. That is 176, 208 or 240 bytes */ -/* or 44, 52 or 60 32-bit words. */ - -#if defined( AES_VAR ) || defined( AES_256 ) -#define KS_LENGTH 60 -#elif defined( AES_192 ) -#define KS_LENGTH 52 -#else -#define KS_LENGTH 44 -#endif - -#define AES_RETURN INT_RETURN - -/* the character array 'inf' in the following structures is used */ -/* to hold AES context information. This AES code uses cx->inf.b[0] */ -/* to hold the number of rounds multiplied by 16. The other three */ -/* elements can be used by code that implements additional modes */ - -typedef union -{ uint32_t l; - uint8_t b[4]; -} aes_inf; - -#ifdef _MSC_VER -# pragma warning( disable : 4324 ) -#endif - -#if defined(_MSC_VER) && defined(_WIN64) -#define ALIGNED_(x) __declspec(align(x)) -#elif defined(__GNUC__) && defined(__x86_64__) -#define ALIGNED_(x) __attribute__ ((aligned(x))) -#else -#define ALIGNED_(x) -#endif - -typedef struct ALIGNED_(16) -{ uint32_t ks[KS_LENGTH]; - aes_inf inf; -} aes_encrypt_ctx; - -typedef struct ALIGNED_(16) -{ uint32_t ks[KS_LENGTH]; - aes_inf inf; -} aes_decrypt_ctx; - -#ifdef _MSC_VER -# pragma warning( default : 4324 ) -#endif - -/* This routine must be called before first use if non-static */ -/* tables are being used */ - -AES_RETURN aes_init(void); - -/* Key lengths in the range 16 <= key_len <= 32 are given in bytes, */ -/* those in the range 128 <= key_len <= 256 are given in bits */ - -#if defined( AES_ENCRYPT ) - -#if defined( AES_128 ) || defined( AES_VAR) -AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]); -#endif - -#if defined( AES_192 ) || defined( AES_VAR) -AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]); -#endif - -#if defined( AES_256 ) || defined( AES_VAR) -AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]); -#endif - -#if defined( AES_VAR ) -AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]); -#endif - -AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]); - -#endif - -#if defined( AES_DECRYPT ) - -#if defined( AES_128 ) || defined( AES_VAR) -AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]); -#endif - -#if defined( AES_192 ) || defined( AES_VAR) -AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]); -#endif - -#if defined( AES_256 ) || defined( AES_VAR) -AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]); -#endif - -#if defined( AES_VAR ) -AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]); -#endif - -AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]); - -#endif - -#if defined( AES_MODES ) - -/* Multiple calls to the following subroutines for multiple block */ -/* ECB, CBC, CFB, OFB and CTR mode encryption can be used to handle */ -/* long messages incrementally provided that the context AND the iv */ -/* are preserved between all such calls. For the ECB and CBC modes */ -/* each individual call within a series of incremental calls must */ -/* process only full blocks (i.e. len must be a multiple of 16) but */ -/* the CFB, OFB and CTR mode calls can handle multiple incremental */ -/* calls of any length. Each mode is reset when a new AES key is */ -/* set but ECB needs no reset and CBC can be reset without setting */ -/* a new key by setting a new IV value. To reset CFB, OFB and CTR */ -/* without setting the key, aes_mode_reset() must be called and the */ -/* IV must be set. NOTE: All these calls update the IV on exit so */ -/* this has to be reset if a new operation with the same IV as the */ -/* previous one is required (or decryption follows encryption with */ -/* the same IV array). */ - -AES_RETURN aes_test_alignment_detection(unsigned int n); - -AES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf, - int len, const aes_encrypt_ctx cx[1]); - -AES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf, - int len, const aes_decrypt_ctx cx[1]); - -AES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf, - int len, unsigned char *iv, const aes_encrypt_ctx cx[1]); - -AES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf, - int len, unsigned char *iv, const aes_decrypt_ctx cx[1]); - -AES_RETURN aes_mode_reset(aes_encrypt_ctx cx[1]); - -AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, - int len, unsigned char *iv, aes_encrypt_ctx cx[1]); - -AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, - int len, unsigned char *iv, aes_encrypt_ctx cx[1]); - -#define aes_ofb_encrypt aes_ofb_crypt -#define aes_ofb_decrypt aes_ofb_crypt - -AES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf, - int len, unsigned char *iv, aes_encrypt_ctx cx[1]); - -typedef void cbuf_inc(unsigned char *cbuf); - -#define aes_ctr_encrypt aes_ctr_crypt -#define aes_ctr_decrypt aes_ctr_crypt - -AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf, - int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx cx[1]); - -#endif - -#if 0 -# define ADD_AESNI_MODE_CALLS -#endif - -#if 0 && defined( ADD_AESNI_MODE_CALLS ) -# define USE_AES_CONTEXT -#endif - -#ifdef ADD_AESNI_MODE_CALLS -# ifdef USE_AES_CONTEXT - -AES_RETURN aes_CBC_encrypt(const unsigned char *in, - unsigned char *out, - unsigned char ivec[16], - unsigned long length, - const aes_encrypt_ctx cx[1]); - -AES_RETURN aes_CBC_decrypt(const unsigned char *in, - unsigned char *out, - unsigned char ivec[16], - unsigned long length, - const aes_decrypt_ctx cx[1]); - -AES_RETURN AES_CTR_encrypt(const unsigned char *in, - unsigned char *out, - const unsigned char ivec[8], - const unsigned char nonce[4], - unsigned long length, - const aes_encrypt_ctx cx[1]); - -# else - -void aes_CBC_encrypt(const unsigned char *in, - unsigned char *out, - unsigned char ivec[16], - unsigned long length, - unsigned char *key, - int number_of_rounds); - -void aes_CBC_decrypt(const unsigned char *in, - unsigned char *out, - unsigned char ivec[16], - unsigned long length, - unsigned char *key, - int number_of_rounds); - -void AES_CTR_encrypt(const unsigned char *in, - unsigned char *out, - const unsigned char ivec[8], - const unsigned char nonce[4], - unsigned long length, - const unsigned char *key, - int number_of_rounds); - -# endif -#endif - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/aescrypt.c b/game/client/third/minizip/lib/aes/aescrypt.c deleted file mode 100755 index bd647e4e..00000000 --- a/game/client/third/minizip/lib/aes/aescrypt.c +++ /dev/null @@ -1,301 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 -*/ - -#include "aesopt.h" -#include "aestab.h" - -#if defined( USE_INTEL_AES_IF_PRESENT ) -# include "aes_ni.h" -#else -/* map names here to provide the external API ('name' -> 'aes_name') */ -# define aes_xi(x) aes_ ## x -#endif - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#define si(y,x,k,c) (s(y,c) = word_in(x, c) ^ (k)[c]) -#define so(y,x,c) word_out(y, c, s(x,c)) - -#if defined(ARRAYS) -#define locals(y,x) x[4],y[4] -#else -#define locals(y,x) x##0,x##1,x##2,x##3,y##0,y##1,y##2,y##3 -#endif - -#define l_copy(y, x) s(y,0) = s(x,0); s(y,1) = s(x,1); \ - s(y,2) = s(x,2); s(y,3) = s(x,3); -#define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3) -#define state_out(y,x) so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3) -#define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3) - -#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) - -/* Visual C++ .Net v7.1 provides the fastest encryption code when using - Pentium optimiation with small code but this is poor for decryption - so we need to control this with the following VC++ pragmas -*/ - -#if defined( _MSC_VER ) && !defined( _WIN64 ) -#pragma optimize( "s", on ) -#endif - -/* Given the column (c) of the output state variable, the following - macros give the input state variables which are needed in its - computation for each row (r) of the state. All the alternative - macros give the same end values but expand into different ways - of calculating these values. In particular the complex macro - used for dynamically variable block sizes is designed to expand - to a compile time constant whenever possible but will expand to - conditional clauses on some branches (I am grateful to Frank - Yellin for this construction) -*/ - -#define fwd_var(x,r,c)\ - ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\ - : r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\ - : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\ - : ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))) - -#if defined(FT4_SET) -#undef dec_fmvars -#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c)) -#elif defined(FT1_SET) -#undef dec_fmvars -#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(f,n),fwd_var,rf1,c)) -#else -#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ fwd_mcol(no_table(x,t_use(s,box),fwd_var,rf1,c))) -#endif - -#if defined(FL4_SET) -#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c)) -#elif defined(FL1_SET) -#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(f,l),fwd_var,rf1,c)) -#else -#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(s,box),fwd_var,rf1,c)) -#endif - -AES_RETURN aes_xi(encrypt)(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]) -{ uint32_t locals(b0, b1); - const uint32_t *kp; -#if defined( dec_fmvars ) - dec_fmvars; /* declare variables for fwd_mcol() if needed */ -#endif - - if(cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16) - return EXIT_FAILURE; - - kp = cx->ks; - state_in(b0, in, kp); - -#if (ENC_UNROLL == FULL) - - switch(cx->inf.b[0]) - { - case 14 * 16: - round(fwd_rnd, b1, b0, kp + 1 * N_COLS); - round(fwd_rnd, b0, b1, kp + 2 * N_COLS); - kp += 2 * N_COLS; - case 12 * 16: - round(fwd_rnd, b1, b0, kp + 1 * N_COLS); - round(fwd_rnd, b0, b1, kp + 2 * N_COLS); - kp += 2 * N_COLS; - case 10 * 16: - round(fwd_rnd, b1, b0, kp + 1 * N_COLS); - round(fwd_rnd, b0, b1, kp + 2 * N_COLS); - round(fwd_rnd, b1, b0, kp + 3 * N_COLS); - round(fwd_rnd, b0, b1, kp + 4 * N_COLS); - round(fwd_rnd, b1, b0, kp + 5 * N_COLS); - round(fwd_rnd, b0, b1, kp + 6 * N_COLS); - round(fwd_rnd, b1, b0, kp + 7 * N_COLS); - round(fwd_rnd, b0, b1, kp + 8 * N_COLS); - round(fwd_rnd, b1, b0, kp + 9 * N_COLS); - round(fwd_lrnd, b0, b1, kp +10 * N_COLS); - } - -#else - -#if (ENC_UNROLL == PARTIAL) - { uint32_t rnd; - for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd) - { - kp += N_COLS; - round(fwd_rnd, b1, b0, kp); - kp += N_COLS; - round(fwd_rnd, b0, b1, kp); - } - kp += N_COLS; - round(fwd_rnd, b1, b0, kp); -#else - { uint32_t rnd; - for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd) - { - kp += N_COLS; - round(fwd_rnd, b1, b0, kp); - l_copy(b0, b1); - } -#endif - kp += N_COLS; - round(fwd_lrnd, b0, b1, kp); - } -#endif - - state_out(out, b0); - return EXIT_SUCCESS; -} - -#endif - -#if ( FUNCS_IN_C & DECRYPTION_IN_C) - -/* Visual C++ .Net v7.1 provides the fastest encryption code when using - Pentium optimiation with small code but this is poor for decryption - so we need to control this with the following VC++ pragmas -*/ - -#if defined( _MSC_VER ) && !defined( _WIN64 ) -#pragma optimize( "t", on ) -#endif - -/* Given the column (c) of the output state variable, the following - macros give the input state variables which are needed in its - computation for each row (r) of the state. All the alternative - macros give the same end values but expand into different ways - of calculating these values. In particular the complex macro - used for dynamically variable block sizes is designed to expand - to a compile time constant whenever possible but will expand to - conditional clauses on some branches (I am grateful to Frank - Yellin for this construction) -*/ - -#define inv_var(x,r,c)\ - ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\ - : r == 1 ? ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))\ - : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\ - : ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))) - -#if defined(IT4_SET) -#undef dec_imvars -#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c)) -#elif defined(IT1_SET) -#undef dec_imvars -#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(i,n),inv_var,rf1,c)) -#else -#define inv_rnd(y,x,k,c) (s(y,c) = inv_mcol((k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c))) -#endif - -#if defined(IL4_SET) -#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c)) -#elif defined(IL1_SET) -#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(i,l),inv_var,rf1,c)) -#else -#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c)) -#endif - -/* This code can work with the decryption key schedule in the */ -/* order that is used for encrytpion (where the 1st decryption */ -/* round key is at the high end ot the schedule) or with a key */ -/* schedule that has been reversed to put the 1st decryption */ -/* round key at the low end of the schedule in memory (when */ -/* AES_REV_DKS is defined) */ - -#ifdef AES_REV_DKS -#define key_ofs 0 -#define rnd_key(n) (kp + n * N_COLS) -#else -#define key_ofs 1 -#define rnd_key(n) (kp - n * N_COLS) -#endif - -AES_RETURN aes_xi(decrypt)(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]) -{ uint32_t locals(b0, b1); -#if defined( dec_imvars ) - dec_imvars; /* declare variables for inv_mcol() if needed */ -#endif - const uint32_t *kp; - - if(cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16) - return EXIT_FAILURE; - - kp = cx->ks + (key_ofs ? (cx->inf.b[0] >> 2) : 0); - state_in(b0, in, kp); - -#if (DEC_UNROLL == FULL) - - kp = cx->ks + (key_ofs ? 0 : (cx->inf.b[0] >> 2)); - switch(cx->inf.b[0]) - { - case 14 * 16: - round(inv_rnd, b1, b0, rnd_key(-13)); - round(inv_rnd, b0, b1, rnd_key(-12)); - case 12 * 16: - round(inv_rnd, b1, b0, rnd_key(-11)); - round(inv_rnd, b0, b1, rnd_key(-10)); - case 10 * 16: - round(inv_rnd, b1, b0, rnd_key(-9)); - round(inv_rnd, b0, b1, rnd_key(-8)); - round(inv_rnd, b1, b0, rnd_key(-7)); - round(inv_rnd, b0, b1, rnd_key(-6)); - round(inv_rnd, b1, b0, rnd_key(-5)); - round(inv_rnd, b0, b1, rnd_key(-4)); - round(inv_rnd, b1, b0, rnd_key(-3)); - round(inv_rnd, b0, b1, rnd_key(-2)); - round(inv_rnd, b1, b0, rnd_key(-1)); - round(inv_lrnd, b0, b1, rnd_key( 0)); - } - -#else - -#if (DEC_UNROLL == PARTIAL) - { uint32_t rnd; - for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd) - { - kp = rnd_key(1); - round(inv_rnd, b1, b0, kp); - kp = rnd_key(1); - round(inv_rnd, b0, b1, kp); - } - kp = rnd_key(1); - round(inv_rnd, b1, b0, kp); -#else - { uint32_t rnd; - for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd) - { - kp = rnd_key(1); - round(inv_rnd, b1, b0, kp); - l_copy(b0, b1); - } -#endif - kp = rnd_key(1); - round(inv_lrnd, b0, b1, kp); - } -#endif - - state_out(out, b0); - return EXIT_SUCCESS; -} - -#endif - -#if defined(__cplusplus) -} -#endif diff --git a/game/client/third/minizip/lib/aes/aeskey.c b/game/client/third/minizip/lib/aes/aeskey.c deleted file mode 100755 index 16e9607f..00000000 --- a/game/client/third/minizip/lib/aes/aeskey.c +++ /dev/null @@ -1,554 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 -*/ - -#include "aesopt.h" -#include "aestab.h" - -#if defined( USE_INTEL_AES_IF_PRESENT ) -# include "aes_ni.h" -#else -/* map names here to provide the external API ('name' -> 'aes_name') */ -# define aes_xi(x) aes_ ## x -#endif - -#ifdef USE_VIA_ACE_IF_PRESENT -# include "aes_via_ace.h" -#endif - -#if defined(__cplusplus) -extern "C" -{ -#endif - -/* Initialise the key schedule from the user supplied key. The key - length can be specified in bytes, with legal values of 16, 24 - and 32, or in bits, with legal values of 128, 192 and 256. These - values correspond with Nk values of 4, 6 and 8 respectively. - - The following macros implement a single cycle in the key - schedule generation process. The number of cycles needed - for each cx->n_col and nk value is: - - nk = 4 5 6 7 8 - ------------------------------ - cx->n_col = 4 10 9 8 7 7 - cx->n_col = 5 14 11 10 9 9 - cx->n_col = 6 19 15 12 11 11 - cx->n_col = 7 21 19 16 13 14 - cx->n_col = 8 29 23 19 17 14 -*/ - -#if defined( REDUCE_CODE_SIZE ) -# define ls_box ls_sub - uint32_t ls_sub(const uint32_t t, const uint32_t n); -# define inv_mcol im_sub - uint32_t im_sub(const uint32_t x); -# ifdef ENC_KS_UNROLL -# undef ENC_KS_UNROLL -# endif -# ifdef DEC_KS_UNROLL -# undef DEC_KS_UNROLL -# endif -#endif - -#if (FUNCS_IN_C & ENC_KEYING_IN_C) - -#if defined(AES_128) || defined( AES_VAR ) - -#define ke4(k,i) \ -{ k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \ - k[4*(i)+5] = ss[1] ^= ss[0]; \ - k[4*(i)+6] = ss[2] ^= ss[1]; \ - k[4*(i)+7] = ss[3] ^= ss[2]; \ -} - -AES_RETURN aes_xi(encrypt_key128)(const unsigned char *key, aes_encrypt_ctx cx[1]) -{ uint32_t ss[4]; - - cx->ks[0] = ss[0] = word_in(key, 0); - cx->ks[1] = ss[1] = word_in(key, 1); - cx->ks[2] = ss[2] = word_in(key, 2); - cx->ks[3] = ss[3] = word_in(key, 3); - -#ifdef ENC_KS_UNROLL - ke4(cx->ks, 0); ke4(cx->ks, 1); - ke4(cx->ks, 2); ke4(cx->ks, 3); - ke4(cx->ks, 4); ke4(cx->ks, 5); - ke4(cx->ks, 6); ke4(cx->ks, 7); - ke4(cx->ks, 8); -#else - { uint32_t i; - for(i = 0; i < 9; ++i) - ke4(cx->ks, i); - } -#endif - ke4(cx->ks, 9); - cx->inf.l = 0; - cx->inf.b[0] = 10 * 16; - -#ifdef USE_VIA_ACE_IF_PRESENT - if(VIA_ACE_AVAILABLE) - cx->inf.b[1] = 0xff; -#endif - return EXIT_SUCCESS; -} - -#endif - -#if defined(AES_192) || defined( AES_VAR ) - -#define kef6(k,i) \ -{ k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \ - k[6*(i)+ 7] = ss[1] ^= ss[0]; \ - k[6*(i)+ 8] = ss[2] ^= ss[1]; \ - k[6*(i)+ 9] = ss[3] ^= ss[2]; \ -} - -#define ke6(k,i) \ -{ kef6(k,i); \ - k[6*(i)+10] = ss[4] ^= ss[3]; \ - k[6*(i)+11] = ss[5] ^= ss[4]; \ -} - -AES_RETURN aes_xi(encrypt_key192)(const unsigned char *key, aes_encrypt_ctx cx[1]) -{ uint32_t ss[6]; - - cx->ks[0] = ss[0] = word_in(key, 0); - cx->ks[1] = ss[1] = word_in(key, 1); - cx->ks[2] = ss[2] = word_in(key, 2); - cx->ks[3] = ss[3] = word_in(key, 3); - cx->ks[4] = ss[4] = word_in(key, 4); - cx->ks[5] = ss[5] = word_in(key, 5); - -#ifdef ENC_KS_UNROLL - ke6(cx->ks, 0); ke6(cx->ks, 1); - ke6(cx->ks, 2); ke6(cx->ks, 3); - ke6(cx->ks, 4); ke6(cx->ks, 5); - ke6(cx->ks, 6); -#else - { uint32_t i; - for(i = 0; i < 7; ++i) - ke6(cx->ks, i); - } -#endif - kef6(cx->ks, 7); - cx->inf.l = 0; - cx->inf.b[0] = 12 * 16; - -#ifdef USE_VIA_ACE_IF_PRESENT - if(VIA_ACE_AVAILABLE) - cx->inf.b[1] = 0xff; -#endif - return EXIT_SUCCESS; -} - -#endif - -#if defined(AES_256) || defined( AES_VAR ) - -#define kef8(k,i) \ -{ k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \ - k[8*(i)+ 9] = ss[1] ^= ss[0]; \ - k[8*(i)+10] = ss[2] ^= ss[1]; \ - k[8*(i)+11] = ss[3] ^= ss[2]; \ -} - -#define ke8(k,i) \ -{ kef8(k,i); \ - k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \ - k[8*(i)+13] = ss[5] ^= ss[4]; \ - k[8*(i)+14] = ss[6] ^= ss[5]; \ - k[8*(i)+15] = ss[7] ^= ss[6]; \ -} - -AES_RETURN aes_xi(encrypt_key256)(const unsigned char *key, aes_encrypt_ctx cx[1]) -{ uint32_t ss[8]; - - cx->ks[0] = ss[0] = word_in(key, 0); - cx->ks[1] = ss[1] = word_in(key, 1); - cx->ks[2] = ss[2] = word_in(key, 2); - cx->ks[3] = ss[3] = word_in(key, 3); - cx->ks[4] = ss[4] = word_in(key, 4); - cx->ks[5] = ss[5] = word_in(key, 5); - cx->ks[6] = ss[6] = word_in(key, 6); - cx->ks[7] = ss[7] = word_in(key, 7); - -#ifdef ENC_KS_UNROLL - ke8(cx->ks, 0); ke8(cx->ks, 1); - ke8(cx->ks, 2); ke8(cx->ks, 3); - ke8(cx->ks, 4); ke8(cx->ks, 5); -#else - { uint32_t i; - for(i = 0; i < 6; ++i) - ke8(cx->ks, i); - } -#endif - kef8(cx->ks, 6); - cx->inf.l = 0; - cx->inf.b[0] = 14 * 16; - -#ifdef USE_VIA_ACE_IF_PRESENT - if(VIA_ACE_AVAILABLE) - cx->inf.b[1] = 0xff; -#endif - return EXIT_SUCCESS; -} - -#endif - -#endif - -#if (FUNCS_IN_C & DEC_KEYING_IN_C) - -/* this is used to store the decryption round keys */ -/* in forward or reverse order */ - -#ifdef AES_REV_DKS -#define v(n,i) ((n) - (i) + 2 * ((i) & 3)) -#else -#define v(n,i) (i) -#endif - -#if DEC_ROUND == NO_TABLES -#define ff(x) (x) -#else -#define ff(x) inv_mcol(x) -#if defined( dec_imvars ) -#define d_vars dec_imvars -#endif -#endif - -#if defined(AES_128) || defined( AES_VAR ) - -#define k4e(k,i) \ -{ k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \ - k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \ - k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \ - k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \ -} - -#if 1 - -#define kdf4(k,i) \ -{ ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \ - ss[1] = ss[1] ^ ss[3]; \ - ss[2] = ss[2] ^ ss[3]; \ - ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \ - ss[i % 4] ^= ss[4]; \ - ss[4] ^= k[v(40,(4*(i)))]; k[v(40,(4*(i))+4)] = ff(ss[4]); \ - ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \ - ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \ - ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \ -} - -#define kd4(k,i) \ -{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \ - ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \ - k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \ - k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \ - k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \ - k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \ -} - -#define kdl4(k,i) \ -{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \ - k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \ - k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \ - k[v(40,(4*(i))+6)] = ss[0]; \ - k[v(40,(4*(i))+7)] = ss[1]; \ -} - -#else - -#define kdf4(k,i) \ -{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \ - ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \ - ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \ - ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \ -} - -#define kd4(k,i) \ -{ ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \ - ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \ - ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \ - ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \ - ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \ -} - -#define kdl4(k,i) \ -{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \ - ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \ - ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \ - ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \ -} - -#endif - -AES_RETURN aes_xi(decrypt_key128)(const unsigned char *key, aes_decrypt_ctx cx[1]) -{ uint32_t ss[5]; -#if defined( d_vars ) - d_vars; -#endif - - cx->ks[v(40,(0))] = ss[0] = word_in(key, 0); - cx->ks[v(40,(1))] = ss[1] = word_in(key, 1); - cx->ks[v(40,(2))] = ss[2] = word_in(key, 2); - cx->ks[v(40,(3))] = ss[3] = word_in(key, 3); - -#ifdef DEC_KS_UNROLL - kdf4(cx->ks, 0); kd4(cx->ks, 1); - kd4(cx->ks, 2); kd4(cx->ks, 3); - kd4(cx->ks, 4); kd4(cx->ks, 5); - kd4(cx->ks, 6); kd4(cx->ks, 7); - kd4(cx->ks, 8); kdl4(cx->ks, 9); -#else - { uint32_t i; - for(i = 0; i < 10; ++i) - k4e(cx->ks, i); -#if !(DEC_ROUND == NO_TABLES) - for(i = N_COLS; i < 10 * N_COLS; ++i) - cx->ks[i] = inv_mcol(cx->ks[i]); -#endif - } -#endif - cx->inf.l = 0; - cx->inf.b[0] = 10 * 16; - -#ifdef USE_VIA_ACE_IF_PRESENT - if(VIA_ACE_AVAILABLE) - cx->inf.b[1] = 0xff; -#endif - return EXIT_SUCCESS; -} - -#endif - -#if defined(AES_192) || defined( AES_VAR ) - -#define k6ef(k,i) \ -{ k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \ - k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \ - k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \ - k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \ -} - -#define k6e(k,i) \ -{ k6ef(k,i); \ - k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \ - k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \ -} - -#define kdf6(k,i) \ -{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \ - ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \ - ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \ - ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \ - ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \ - ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \ -} - -#define kd6(k,i) \ -{ ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \ - ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \ - ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \ - ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \ - ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \ - ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \ - ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \ -} - -#define kdl6(k,i) \ -{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \ - ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \ - ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \ - ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \ -} - -AES_RETURN aes_xi(decrypt_key192)(const unsigned char *key, aes_decrypt_ctx cx[1]) -{ uint32_t ss[7]; -#if defined( d_vars ) - d_vars; -#endif - - cx->ks[v(48,(0))] = ss[0] = word_in(key, 0); - cx->ks[v(48,(1))] = ss[1] = word_in(key, 1); - cx->ks[v(48,(2))] = ss[2] = word_in(key, 2); - cx->ks[v(48,(3))] = ss[3] = word_in(key, 3); - -#ifdef DEC_KS_UNROLL - cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4)); - cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5)); - kdf6(cx->ks, 0); kd6(cx->ks, 1); - kd6(cx->ks, 2); kd6(cx->ks, 3); - kd6(cx->ks, 4); kd6(cx->ks, 5); - kd6(cx->ks, 6); kdl6(cx->ks, 7); -#else - cx->ks[v(48,(4))] = ss[4] = word_in(key, 4); - cx->ks[v(48,(5))] = ss[5] = word_in(key, 5); - { uint32_t i; - - for(i = 0; i < 7; ++i) - k6e(cx->ks, i); - k6ef(cx->ks, 7); -#if !(DEC_ROUND == NO_TABLES) - for(i = N_COLS; i < 12 * N_COLS; ++i) - cx->ks[i] = inv_mcol(cx->ks[i]); -#endif - } -#endif - cx->inf.l = 0; - cx->inf.b[0] = 12 * 16; - -#ifdef USE_VIA_ACE_IF_PRESENT - if(VIA_ACE_AVAILABLE) - cx->inf.b[1] = 0xff; -#endif - return EXIT_SUCCESS; -} - -#endif - -#if defined(AES_256) || defined( AES_VAR ) - -#define k8ef(k,i) \ -{ k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \ - k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \ - k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \ - k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \ -} - -#define k8e(k,i) \ -{ k8ef(k,i); \ - k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \ - k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \ - k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \ - k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \ -} - -#define kdf8(k,i) \ -{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \ - ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \ - ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \ - ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \ - ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \ - ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \ - ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \ - ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \ -} - -#define kd8(k,i) \ -{ ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \ - ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \ - ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \ - ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \ - ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \ - ss[8] = ls_box(ss[3],0); \ - ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \ - ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \ - ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \ - ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \ -} - -#define kdl8(k,i) \ -{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \ - ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \ - ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \ - ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \ -} - -AES_RETURN aes_xi(decrypt_key256)(const unsigned char *key, aes_decrypt_ctx cx[1]) -{ uint32_t ss[9]; -#if defined( d_vars ) - d_vars; -#endif - - cx->ks[v(56,(0))] = ss[0] = word_in(key, 0); - cx->ks[v(56,(1))] = ss[1] = word_in(key, 1); - cx->ks[v(56,(2))] = ss[2] = word_in(key, 2); - cx->ks[v(56,(3))] = ss[3] = word_in(key, 3); - -#ifdef DEC_KS_UNROLL - cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4)); - cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5)); - cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6)); - cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7)); - kdf8(cx->ks, 0); kd8(cx->ks, 1); - kd8(cx->ks, 2); kd8(cx->ks, 3); - kd8(cx->ks, 4); kd8(cx->ks, 5); - kdl8(cx->ks, 6); -#else - cx->ks[v(56,(4))] = ss[4] = word_in(key, 4); - cx->ks[v(56,(5))] = ss[5] = word_in(key, 5); - cx->ks[v(56,(6))] = ss[6] = word_in(key, 6); - cx->ks[v(56,(7))] = ss[7] = word_in(key, 7); - { uint32_t i; - - for(i = 0; i < 6; ++i) - k8e(cx->ks, i); - k8ef(cx->ks, 6); -#if !(DEC_ROUND == NO_TABLES) - for(i = N_COLS; i < 14 * N_COLS; ++i) - cx->ks[i] = inv_mcol(cx->ks[i]); -#endif - } -#endif - cx->inf.l = 0; - cx->inf.b[0] = 14 * 16; - -#ifdef USE_VIA_ACE_IF_PRESENT - if(VIA_ACE_AVAILABLE) - cx->inf.b[1] = 0xff; -#endif - return EXIT_SUCCESS; -} - -#endif - -#endif - -#if defined( AES_VAR ) - -AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]) -{ - switch(key_len) - { - case 16: case 128: return aes_encrypt_key128(key, cx); - case 24: case 192: return aes_encrypt_key192(key, cx); - case 32: case 256: return aes_encrypt_key256(key, cx); - default: return EXIT_FAILURE; - } -} - -AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]) -{ - switch(key_len) - { - case 16: case 128: return aes_decrypt_key128(key, cx); - case 24: case 192: return aes_decrypt_key192(key, cx); - case 32: case 256: return aes_decrypt_key256(key, cx); - default: return EXIT_FAILURE; - } -} - -#endif - -#if defined(__cplusplus) -} -#endif diff --git a/game/client/third/minizip/lib/aes/aesopt.h b/game/client/third/minizip/lib/aes/aesopt.h deleted file mode 100755 index 2c058dea..00000000 --- a/game/client/third/minizip/lib/aes/aesopt.h +++ /dev/null @@ -1,776 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - - This file contains the compilation options for AES (Rijndael) and code - that is common across encryption, key scheduling and table generation. - - OPERATION - - These source code files implement the AES algorithm Rijndael designed by - Joan Daemen and Vincent Rijmen. This version is designed for the standard - block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24 - and 32 bytes). - - This version is designed for flexibility and speed using operations on - 32-bit words rather than operations on bytes. It can be compiled with - either big or little endian internal byte order but is faster when the - native byte order for the processor is used. - - THE CIPHER INTERFACE - - The cipher interface is implemented as an array of bytes in which lower - AES bit sequence indexes map to higher numeric significance within bytes. - - uint8_t (an unsigned 8-bit type) - uint32_t (an unsigned 32-bit type) - struct aes_encrypt_ctx (structure for the cipher encryption context) - struct aes_decrypt_ctx (structure for the cipher decryption context) - AES_RETURN the function return type - - C subroutine calls: - - AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]); - AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]); - AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]); - AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, - const aes_encrypt_ctx cx[1]); - - AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]); - AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]); - AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]); - AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, - const aes_decrypt_ctx cx[1]); - - IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that - you call aes_init() before AES is used so that the tables are initialised. - - C++ aes class subroutines: - - Class AESencrypt for encryption - - Construtors: - AESencrypt(void) - AESencrypt(const unsigned char *key) - 128 bit key - Members: - AES_RETURN key128(const unsigned char *key) - AES_RETURN key192(const unsigned char *key) - AES_RETURN key256(const unsigned char *key) - AES_RETURN encrypt(const unsigned char *in, unsigned char *out) const - - Class AESdecrypt for encryption - Construtors: - AESdecrypt(void) - AESdecrypt(const unsigned char *key) - 128 bit key - Members: - AES_RETURN key128(const unsigned char *key) - AES_RETURN key192(const unsigned char *key) - AES_RETURN key256(const unsigned char *key) - AES_RETURN decrypt(const unsigned char *in, unsigned char *out) const -*/ - -#if !defined( _AESOPT_H ) -#define _AESOPT_H - -#if defined( __cplusplus ) -#include "aescpp.h" -#else -#include "aes.h" -#endif - -/* PLATFORM SPECIFIC INCLUDES */ - -#include "brg_endian.h" - -/* CONFIGURATION - THE USE OF DEFINES - - Later in this section there are a number of defines that control the - operation of the code. In each section, the purpose of each define is - explained so that the relevant form can be included or excluded by - setting either 1's or 0's respectively on the branches of the related - #if clauses. The following local defines should not be changed. -*/ - -#define ENCRYPTION_IN_C 1 -#define DECRYPTION_IN_C 2 -#define ENC_KEYING_IN_C 4 -#define DEC_KEYING_IN_C 8 - -#define NO_TABLES 0 -#define ONE_TABLE 1 -#define FOUR_TABLES 4 -#define NONE 0 -#define PARTIAL 1 -#define FULL 2 - -/* --- START OF USER CONFIGURED OPTIONS --- */ - -/* 1. BYTE ORDER WITHIN 32 BIT WORDS - - The fundamental data processing units in Rijndael are 8-bit bytes. The - input, output and key input are all enumerated arrays of bytes in which - bytes are numbered starting at zero and increasing to one less than the - number of bytes in the array in question. This enumeration is only used - for naming bytes and does not imply any adjacency or order relationship - from one byte to another. When these inputs and outputs are considered - as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to - byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte. - In this implementation bits are numbered from 0 to 7 starting at the - numerically least significant end of each byte (bit n represents 2^n). - - However, Rijndael can be implemented more efficiently using 32-bit - words by packing bytes into words so that bytes 4*n to 4*n+3 are placed - into word[n]. While in principle these bytes can be assembled into words - in any positions, this implementation only supports the two formats in - which bytes in adjacent positions within words also have adjacent byte - numbers. This order is called big-endian if the lowest numbered bytes - in words have the highest numeric significance and little-endian if the - opposite applies. - - This code can work in either order irrespective of the order used by the - machine on which it runs. Normally the internal byte order will be set - to the order of the processor on which the code is to be run but this - define can be used to reverse this in special situations - - WARNING: Assembler code versions rely on PLATFORM_BYTE_ORDER being set. - This define will hence be redefined later (in section 4) if necessary -*/ - -#if 1 -# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER -#elif 0 -# define ALGORITHM_BYTE_ORDER IS_LITTLE_ENDIAN -#elif 0 -# define ALGORITHM_BYTE_ORDER IS_BIG_ENDIAN -#else -# error The algorithm byte order is not defined -#endif - -/* 2. Intel AES AND VIA ACE SUPPORT */ - -#if defined( __GNUC__ ) && defined( __i386__ ) \ - || defined( _WIN32 ) && defined( _M_IX86 ) && !(defined( _WIN64 ) \ - || defined( _WIN32_WCE ) || defined( _MSC_VER ) && ( _MSC_VER <= 800 )) -# define VIA_ACE_POSSIBLE -#endif - -#if (defined( _WIN64 ) && defined( _MSC_VER )) \ - || (defined( __GNUC__ ) && defined( __x86_64__ )) && !(defined( __APPLE__ ))\ - && !(defined( INTEL_AES_POSSIBLE )) -# define INTEL_AES_POSSIBLE -#endif - -/* Define this option if support for the Intel AESNI is required - If USE_INTEL_AES_IF_PRESENT is defined then AESNI will be used - if it is detected (both present and enabled). - - AESNI uses a decryption key schedule with the first decryption - round key at the high end of the key scedule with the following - round keys at lower positions in memory. So AES_REV_DKS must NOT - be defined when AESNI will be used. ALthough it is unlikely that - assembler code will be used with an AESNI build, if it is then - AES_REV_DKS must NOT be defined when the assembler files are - built -*/ - -#if 0 && defined( INTEL_AES_POSSIBLE ) && !defined( USE_INTEL_AES_IF_PRESENT ) -# define USE_INTEL_AES_IF_PRESENT -#endif - -/* Define this option if support for the VIA ACE is required. This uses - inline assembler instructions and is only implemented for the Microsoft, - Intel and GCC compilers. If VIA ACE is known to be present, then defining - ASSUME_VIA_ACE_PRESENT will remove the ordinary encryption/decryption - code. If USE_VIA_ACE_IF_PRESENT is defined then VIA ACE will be used if - it is detected (both present and enabled) but the normal AES code will - also be present. - - When VIA ACE is to be used, all AES encryption contexts MUST be 16 byte - aligned; other input/output buffers do not need to be 16 byte aligned - but there are very large performance gains if this can be arranged. - VIA ACE also requires the decryption key schedule to be in reverse - order (which later checks below ensure). - - AES_REV_DKS must be set for assembler code used with a VIA ACE build -*/ - -#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( USE_VIA_ACE_IF_PRESENT ) -# define USE_VIA_ACE_IF_PRESENT -#endif - -#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( ASSUME_VIA_ACE_PRESENT ) -# define ASSUME_VIA_ACE_PRESENT -# endif - -/* 3. ASSEMBLER SUPPORT - - This define (which can be on the command line) enables the use of the - assembler code routines for encryption, decryption and key scheduling - as follows: - - ASM_X86_V1C uses the assembler (aes_x86_v1.asm) with large tables for - encryption and decryption and but with key scheduling in C - ASM_X86_V2 uses assembler (aes_x86_v2.asm) with compressed tables for - encryption, decryption and key scheduling - ASM_X86_V2C uses assembler (aes_x86_v2.asm) with compressed tables for - encryption and decryption and but with key scheduling in C - ASM_AMD64_C uses assembler (aes_amd64.asm) with compressed tables for - encryption and decryption and but with key scheduling in C - - Change one 'if 0' below to 'if 1' to select the version or define - as a compilation option. -*/ - -#if 0 && !defined( ASM_X86_V1C ) -# define ASM_X86_V1C -#elif 0 && !defined( ASM_X86_V2 ) -# define ASM_X86_V2 -#elif 0 && !defined( ASM_X86_V2C ) -# define ASM_X86_V2C -#elif 0 && !defined( ASM_AMD64_C ) -# define ASM_AMD64_C -#endif - -#if defined( __i386 ) || defined( _M_IX86 ) -# define A32_ -#elif defined( __x86_64__ ) || defined( _M_X64 ) -# define A64_ -#endif - -#if (defined ( ASM_X86_V1C ) || defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) \ - && !defined( A32_ ) || defined( ASM_AMD64_C ) && !defined( A64_ ) -# error Assembler code is only available for x86 and AMD64 systems -#endif - -/* 4. FAST INPUT/OUTPUT OPERATIONS. - - On some machines it is possible to improve speed by transferring the - bytes in the input and output arrays to and from the internal 32-bit - variables by addressing these arrays as if they are arrays of 32-bit - words. On some machines this will always be possible but there may - be a large performance penalty if the byte arrays are not aligned on - the normal word boundaries. On other machines this technique will - lead to memory access errors when such 32-bit word accesses are not - properly aligned. The option SAFE_IO avoids such problems but will - often be slower on those machines that support misaligned access - (especially so if care is taken to align the input and output byte - arrays on 32-bit word boundaries). If SAFE_IO is not defined it is - assumed that access to byte arrays as if they are arrays of 32-bit - words will not cause problems when such accesses are misaligned. -*/ -#if 1 && !defined( _MSC_VER ) -# define SAFE_IO -#endif - -/* 5. LOOP UNROLLING - - The code for encryption and decrytpion cycles through a number of rounds - that can be implemented either in a loop or by expanding the code into a - long sequence of instructions, the latter producing a larger program but - one that will often be much faster. The latter is called loop unrolling. - There are also potential speed advantages in expanding two iterations in - a loop with half the number of iterations, which is called partial loop - unrolling. The following options allow partial or full loop unrolling - to be set independently for encryption and decryption -*/ -#if 1 -# define ENC_UNROLL FULL -#elif 0 -# define ENC_UNROLL PARTIAL -#else -# define ENC_UNROLL NONE -#endif - -#if 1 -# define DEC_UNROLL FULL -#elif 0 -# define DEC_UNROLL PARTIAL -#else -# define DEC_UNROLL NONE -#endif - -#if 1 -# define ENC_KS_UNROLL -#endif - -#if 1 -# define DEC_KS_UNROLL -#endif - -/* 6. FAST FINITE FIELD OPERATIONS - - If this section is included, tables are used to provide faster finite - field arithmetic (this has no effect if STATIC_TABLES is defined). -*/ -#if 1 -# define FF_TABLES -#endif - -/* 7. INTERNAL STATE VARIABLE FORMAT - - The internal state of Rijndael is stored in a number of local 32-bit - word varaibles which can be defined either as an array or as individual - names variables. Include this section if you want to store these local - varaibles in arrays. Otherwise individual local variables will be used. -*/ -#if 1 -# define ARRAYS -#endif - -/* 8. FIXED OR DYNAMIC TABLES - - When this section is included the tables used by the code are compiled - statically into the binary file. Otherwise the subroutine aes_init() - must be called to compute them before the code is first used. -*/ -#if 1 && !(defined( _MSC_VER ) && ( _MSC_VER <= 800 )) -# define STATIC_TABLES -#endif - -/* 9. MASKING OR CASTING FROM LONGER VALUES TO BYTES - - In some systems it is better to mask longer values to extract bytes - rather than using a cast. This option allows this choice. -*/ -#if 0 -# define to_byte(x) ((uint8_t)(x)) -#else -# define to_byte(x) ((x) & 0xff) -#endif - -/* 10. TABLE ALIGNMENT - - On some sytsems speed will be improved by aligning the AES large lookup - tables on particular boundaries. This define should be set to a power of - two giving the desired alignment. It can be left undefined if alignment - is not needed. This option is specific to the Microsft VC++ compiler - - it seems to sometimes cause trouble for the VC++ version 6 compiler. -*/ - -#if 1 && defined( _MSC_VER ) && ( _MSC_VER >= 1300 ) -# define TABLE_ALIGN 32 -#endif - -/* 11. REDUCE CODE AND TABLE SIZE - - This replaces some expanded macros with function calls if AES_ASM_V2 or - AES_ASM_V2C are defined -*/ - -#if 1 && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) -# define REDUCE_CODE_SIZE -#endif - -/* 12. TABLE OPTIONS - - This cipher proceeds by repeating in a number of cycles known as 'rounds' - which are implemented by a round function which can optionally be speeded - up using tables. The basic tables are each 256 32-bit words, with either - one or four tables being required for each round function depending on - how much speed is required. The encryption and decryption round functions - are different and the last encryption and decrytpion round functions are - different again making four different round functions in all. - - This means that: - 1. Normal encryption and decryption rounds can each use either 0, 1 - or 4 tables and table spaces of 0, 1024 or 4096 bytes each. - 2. The last encryption and decryption rounds can also use either 0, 1 - or 4 tables and table spaces of 0, 1024 or 4096 bytes each. - - Include or exclude the appropriate definitions below to set the number - of tables used by this implementation. -*/ - -#if 1 /* set tables for the normal encryption round */ -# define ENC_ROUND FOUR_TABLES -#elif 0 -# define ENC_ROUND ONE_TABLE -#else -# define ENC_ROUND NO_TABLES -#endif - -#if 1 /* set tables for the last encryption round */ -# define LAST_ENC_ROUND FOUR_TABLES -#elif 0 -# define LAST_ENC_ROUND ONE_TABLE -#else -# define LAST_ENC_ROUND NO_TABLES -#endif - -#if 1 /* set tables for the normal decryption round */ -# define DEC_ROUND FOUR_TABLES -#elif 0 -# define DEC_ROUND ONE_TABLE -#else -# define DEC_ROUND NO_TABLES -#endif - -#if 1 /* set tables for the last decryption round */ -# define LAST_DEC_ROUND FOUR_TABLES -#elif 0 -# define LAST_DEC_ROUND ONE_TABLE -#else -# define LAST_DEC_ROUND NO_TABLES -#endif - -/* The decryption key schedule can be speeded up with tables in the same - way that the round functions can. Include or exclude the following - defines to set this requirement. -*/ -#if 1 -# define KEY_SCHED FOUR_TABLES -#elif 0 -# define KEY_SCHED ONE_TABLE -#else -# define KEY_SCHED NO_TABLES -#endif - -/* ---- END OF USER CONFIGURED OPTIONS ---- */ - -/* VIA ACE support is only available for VC++ and GCC */ - -#if !defined( _MSC_VER ) && !defined( __GNUC__ ) -# if defined( ASSUME_VIA_ACE_PRESENT ) -# undef ASSUME_VIA_ACE_PRESENT -# endif -# if defined( USE_VIA_ACE_IF_PRESENT ) -# undef USE_VIA_ACE_IF_PRESENT -# endif -#endif - -#if defined( ASSUME_VIA_ACE_PRESENT ) && !defined( USE_VIA_ACE_IF_PRESENT ) -# define USE_VIA_ACE_IF_PRESENT -#endif - -/* define to reverse decryption key schedule */ -#if 1 || defined( USE_VIA_ACE_IF_PRESENT ) && !defined ( AES_REV_DKS ) -# define AES_REV_DKS -#endif - -/* Intel AESNI uses a decryption key schedule in the encryption order */ -#if defined( USE_INTEL_AES_IF_PRESENT ) && defined ( AES_REV_DKS ) -# undef AES_REV_DKS -#endif - -/* Assembler support requires the use of platform byte order */ - -#if ( defined( ASM_X86_V1C ) || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) ) \ - && (ALGORITHM_BYTE_ORDER != PLATFORM_BYTE_ORDER) -# undef ALGORITHM_BYTE_ORDER -# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER -#endif - -/* In this implementation the columns of the state array are each held in - 32-bit words. The state array can be held in various ways: in an array - of words, in a number of individual word variables or in a number of - processor registers. The following define maps a variable name x and - a column number c to the way the state array variable is to be held. - The first define below maps the state into an array x[c] whereas the - second form maps the state into a number of individual variables x0, - x1, etc. Another form could map individual state colums to machine - register names. -*/ - -#if defined( ARRAYS ) -# define s(x,c) x[c] -#else -# define s(x,c) x##c -#endif - -/* This implementation provides subroutines for encryption, decryption - and for setting the three key lengths (separately) for encryption - and decryption. Since not all functions are needed, masks are set - up here to determine which will be implemented in C -*/ - -#if !defined( AES_ENCRYPT ) -# define EFUNCS_IN_C 0 -#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \ - || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) -# define EFUNCS_IN_C ENC_KEYING_IN_C -#elif !defined( ASM_X86_V2 ) -# define EFUNCS_IN_C ( ENCRYPTION_IN_C | ENC_KEYING_IN_C ) -#else -# define EFUNCS_IN_C 0 -#endif - -#if !defined( AES_DECRYPT ) -# define DFUNCS_IN_C 0 -#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \ - || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) -# define DFUNCS_IN_C DEC_KEYING_IN_C -#elif !defined( ASM_X86_V2 ) -# define DFUNCS_IN_C ( DECRYPTION_IN_C | DEC_KEYING_IN_C ) -#else -# define DFUNCS_IN_C 0 -#endif - -#define FUNCS_IN_C ( EFUNCS_IN_C | DFUNCS_IN_C ) - -/* END OF CONFIGURATION OPTIONS */ - -#define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2)) - -/* Disable or report errors on some combinations of options */ - -#if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES -# undef LAST_ENC_ROUND -# define LAST_ENC_ROUND NO_TABLES -#elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES -# undef LAST_ENC_ROUND -# define LAST_ENC_ROUND ONE_TABLE -#endif - -#if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE -# undef ENC_UNROLL -# define ENC_UNROLL NONE -#endif - -#if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES -# undef LAST_DEC_ROUND -# define LAST_DEC_ROUND NO_TABLES -#elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES -# undef LAST_DEC_ROUND -# define LAST_DEC_ROUND ONE_TABLE -#endif - -#if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE -# undef DEC_UNROLL -# define DEC_UNROLL NONE -#endif - -#if defined( bswap32 ) -# define aes_sw32 bswap32 -#elif defined( bswap_32 ) -# define aes_sw32 bswap_32 -#else -# define brot(x,n) (((uint32_t)(x) << n) | ((uint32_t)(x) >> (32 - n))) -# define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00)) -#endif - -/* upr(x,n): rotates bytes within words by n positions, moving bytes to - higher index positions with wrap around into low positions - ups(x,n): moves bytes by n positions to higher index positions in - words but without wrap around - bval(x,n): extracts a byte from a word - - WARNING: The definitions given here are intended only for use with - unsigned variables and with shift counts that are compile - time constants -*/ - -#if ( ALGORITHM_BYTE_ORDER == IS_LITTLE_ENDIAN ) -# define upr(x,n) (((uint32_t)(x) << (8 * (n))) | ((uint32_t)(x) >> (32 - 8 * (n)))) -# define ups(x,n) ((uint32_t) (x) << (8 * (n))) -# define bval(x,n) to_byte((x) >> (8 * (n))) -# define bytes2word(b0, b1, b2, b3) \ - (((uint32_t)(b3) << 24) | ((uint32_t)(b2) << 16) | ((uint32_t)(b1) << 8) | (b0)) -#endif - -#if ( ALGORITHM_BYTE_ORDER == IS_BIG_ENDIAN ) -# define upr(x,n) (((uint32_t)(x) >> (8 * (n))) | ((uint32_t)(x) << (32 - 8 * (n)))) -# define ups(x,n) ((uint32_t) (x) >> (8 * (n))) -# define bval(x,n) to_byte((x) >> (24 - 8 * (n))) -# define bytes2word(b0, b1, b2, b3) \ - (((uint32_t)(b0) << 24) | ((uint32_t)(b1) << 16) | ((uint32_t)(b2) << 8) | (b3)) -#endif - -#if defined( SAFE_IO ) -# define word_in(x,c) bytes2word(((const uint8_t*)(x)+4*c)[0], ((const uint8_t*)(x)+4*c)[1], \ - ((const uint8_t*)(x)+4*c)[2], ((const uint8_t*)(x)+4*c)[3]) -# define word_out(x,c,v) { ((uint8_t*)(x)+4*c)[0] = bval(v,0); ((uint8_t*)(x)+4*c)[1] = bval(v,1); \ - ((uint8_t*)(x)+4*c)[2] = bval(v,2); ((uint8_t*)(x)+4*c)[3] = bval(v,3); } -#elif ( ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER ) -# define word_in(x,c) (*((uint32_t*)(x)+(c))) -# define word_out(x,c,v) (*((uint32_t*)(x)+(c)) = (v)) -#else -# define word_in(x,c) aes_sw32(*((uint32_t*)(x)+(c))) -# define word_out(x,c,v) (*((uint32_t*)(x)+(c)) = aes_sw32(v)) -#endif - -/* the finite field modular polynomial and elements */ - -#define WPOLY 0x011b -#define BPOLY 0x1b - -/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ - -#define gf_c1 0x80808080 -#define gf_c2 0x7f7f7f7f -#define gf_mulx(x) ((((x) & gf_c2) << 1) ^ ((((x) & gf_c1) >> 7) * BPOLY)) - -/* The following defines provide alternative definitions of gf_mulx that might - give improved performance if a fast 32-bit multiply is not available. Note - that a temporary variable u needs to be defined where gf_mulx is used. - -#define gf_mulx(x) (u = (x) & gf_c1, u |= (u >> 1), ((x) & gf_c2) << 1) ^ ((u >> 3) | (u >> 6)) -#define gf_c4 (0x01010101 * BPOLY) -#define gf_mulx(x) (u = (x) & gf_c1, ((x) & gf_c2) << 1) ^ ((u - (u >> 7)) & gf_c4) -*/ - -/* Work out which tables are needed for the different options */ - -#if defined( ASM_X86_V1C ) -# if defined( ENC_ROUND ) -# undef ENC_ROUND -# endif -# define ENC_ROUND FOUR_TABLES -# if defined( LAST_ENC_ROUND ) -# undef LAST_ENC_ROUND -# endif -# define LAST_ENC_ROUND FOUR_TABLES -# if defined( DEC_ROUND ) -# undef DEC_ROUND -# endif -# define DEC_ROUND FOUR_TABLES -# if defined( LAST_DEC_ROUND ) -# undef LAST_DEC_ROUND -# endif -# define LAST_DEC_ROUND FOUR_TABLES -# if defined( KEY_SCHED ) -# undef KEY_SCHED -# define KEY_SCHED FOUR_TABLES -# endif -#endif - -#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) || defined( ASM_X86_V1C ) -# if ENC_ROUND == ONE_TABLE -# define FT1_SET -# elif ENC_ROUND == FOUR_TABLES -# define FT4_SET -# else -# define SBX_SET -# endif -# if LAST_ENC_ROUND == ONE_TABLE -# define FL1_SET -# elif LAST_ENC_ROUND == FOUR_TABLES -# define FL4_SET -# elif !defined( SBX_SET ) -# define SBX_SET -# endif -#endif - -#if ( FUNCS_IN_C & DECRYPTION_IN_C ) || defined( ASM_X86_V1C ) -# if DEC_ROUND == ONE_TABLE -# define IT1_SET -# elif DEC_ROUND == FOUR_TABLES -# define IT4_SET -# else -# define ISB_SET -# endif -# if LAST_DEC_ROUND == ONE_TABLE -# define IL1_SET -# elif LAST_DEC_ROUND == FOUR_TABLES -# define IL4_SET -# elif !defined(ISB_SET) -# define ISB_SET -# endif -#endif - -#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) -# if ((FUNCS_IN_C & ENC_KEYING_IN_C) || (FUNCS_IN_C & DEC_KEYING_IN_C)) -# if KEY_SCHED == ONE_TABLE -# if !defined( FL1_SET ) && !defined( FL4_SET ) -# define LS1_SET -# endif -# elif KEY_SCHED == FOUR_TABLES -# if !defined( FL4_SET ) -# define LS4_SET -# endif -# elif !defined( SBX_SET ) -# define SBX_SET -# endif -# endif -# if (FUNCS_IN_C & DEC_KEYING_IN_C) -# if KEY_SCHED == ONE_TABLE -# define IM1_SET -# elif KEY_SCHED == FOUR_TABLES -# define IM4_SET -# elif !defined( SBX_SET ) -# define SBX_SET -# endif -# endif -#endif - -/* generic definitions of Rijndael macros that use tables */ - -#define no_table(x,box,vf,rf,c) bytes2word( \ - box[bval(vf(x,0,c),rf(0,c))], \ - box[bval(vf(x,1,c),rf(1,c))], \ - box[bval(vf(x,2,c),rf(2,c))], \ - box[bval(vf(x,3,c),rf(3,c))]) - -#define one_table(x,op,tab,vf,rf,c) \ - ( tab[bval(vf(x,0,c),rf(0,c))] \ - ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \ - ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \ - ^ op(tab[bval(vf(x,3,c),rf(3,c))],3)) - -#define four_tables(x,tab,vf,rf,c) \ - ( tab[0][bval(vf(x,0,c),rf(0,c))] \ - ^ tab[1][bval(vf(x,1,c),rf(1,c))] \ - ^ tab[2][bval(vf(x,2,c),rf(2,c))] \ - ^ tab[3][bval(vf(x,3,c),rf(3,c))]) - -#define vf1(x,r,c) (x) -#define rf1(r,c) (r) -#define rf2(r,c) ((8+r-c)&3) - -/* perform forward and inverse column mix operation on four bytes in long word x in */ -/* parallel. NOTE: x must be a simple variable, NOT an expression in these macros. */ - -#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) - -#if defined( FM4_SET ) /* not currently used */ -# define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0) -#elif defined( FM1_SET ) /* not currently used */ -# define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0) -#else -# define dec_fmvars uint32_t g2 -# define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1)) -#endif - -#if defined( IM4_SET ) -# define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0) -#elif defined( IM1_SET ) -# define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0) -#else -# define dec_imvars uint32_t g2, g4, g9 -# define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \ - (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1)) -#endif - -#if defined( FL4_SET ) -# define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c) -#elif defined( LS4_SET ) -# define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c) -#elif defined( FL1_SET ) -# define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c) -#elif defined( LS1_SET ) -# define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c) -#else -# define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c) -#endif - -#endif - -#if defined( ASM_X86_V1C ) && defined( AES_DECRYPT ) && !defined( ISB_SET ) -# define ISB_SET -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/aestab.c b/game/client/third/minizip/lib/aes/aestab.c deleted file mode 100755 index 3d48edf3..00000000 --- a/game/client/third/minizip/lib/aes/aestab.c +++ /dev/null @@ -1,418 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 -*/ - -#define DO_TABLES - -#include "aes.h" -#include "aesopt.h" - -#if defined(STATIC_TABLES) - -#define sb_data(w) {\ - w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\ - w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\ - w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\ - w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\ - w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\ - w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\ - w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\ - w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\ - w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\ - w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\ - w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\ - w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\ - w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\ - w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\ - w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\ - w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\ - w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\ - w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\ - w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\ - w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\ - w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\ - w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\ - w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\ - w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\ - w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\ - w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\ - w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\ - w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\ - w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\ - w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\ - w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\ - w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) } - -#define isb_data(w) {\ - w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\ - w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\ - w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\ - w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\ - w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\ - w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\ - w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\ - w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\ - w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\ - w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\ - w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\ - w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\ - w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\ - w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\ - w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\ - w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\ - w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\ - w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\ - w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\ - w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\ - w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\ - w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\ - w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\ - w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\ - w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\ - w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\ - w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\ - w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\ - w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\ - w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\ - w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\ - w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) } - -#define mm_data(w) {\ - w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\ - w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\ - w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\ - w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\ - w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\ - w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\ - w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\ - w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\ - w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\ - w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\ - w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\ - w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\ - w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\ - w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\ - w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\ - w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\ - w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\ - w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\ - w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\ - w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\ - w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\ - w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\ - w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\ - w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\ - w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\ - w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\ - w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\ - w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\ - w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\ - w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\ - w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\ - w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) } - -#define rc_data(w) {\ - w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\ - w(0x1b), w(0x36) } - -#define h0(x) (x) - -#define w0(p) bytes2word(p, 0, 0, 0) -#define w1(p) bytes2word(0, p, 0, 0) -#define w2(p) bytes2word(0, 0, p, 0) -#define w3(p) bytes2word(0, 0, 0, p) - -#define u0(p) bytes2word(f2(p), p, p, f3(p)) -#define u1(p) bytes2word(f3(p), f2(p), p, p) -#define u2(p) bytes2word(p, f3(p), f2(p), p) -#define u3(p) bytes2word(p, p, f3(p), f2(p)) - -#define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p)) -#define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p)) -#define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p)) -#define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p)) - -#endif - -#if defined(STATIC_TABLES) || !defined(FF_TABLES) - -#define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY)) -#define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY)) -#define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \ - ^ (((x>>5) & 4) * WPOLY)) -#define f3(x) (f2(x) ^ x) -#define f9(x) (f8(x) ^ x) -#define fb(x) (f8(x) ^ f2(x) ^ x) -#define fd(x) (f8(x) ^ f4(x) ^ x) -#define fe(x) (f8(x) ^ f4(x) ^ f2(x)) - -#else - -#define f2(x) ((x) ? pow[log[x] + 0x19] : 0) -#define f3(x) ((x) ? pow[log[x] + 0x01] : 0) -#define f9(x) ((x) ? pow[log[x] + 0xc7] : 0) -#define fb(x) ((x) ? pow[log[x] + 0x68] : 0) -#define fd(x) ((x) ? pow[log[x] + 0xee] : 0) -#define fe(x) ((x) ? pow[log[x] + 0xdf] : 0) - -#endif - -#include "aestab.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#if defined(STATIC_TABLES) - -/* implemented in case of wrong call for fixed tables */ - -AES_RETURN aes_init(void) -{ - return EXIT_SUCCESS; -} - -#else /* Generate the tables for the dynamic table option */ - -#if defined(FF_TABLES) - -#define gf_inv(x) ((x) ? pow[ 255 - log[x]] : 0) - -#else - -/* It will generally be sensible to use tables to compute finite - field multiplies and inverses but where memory is scarse this - code might sometimes be better. But it only has effect during - initialisation so its pretty unimportant in overall terms. -*/ - -/* return 2 ^ (n - 1) where n is the bit number of the highest bit - set in x with x in the range 1 < x < 0x00000200. This form is - used so that locals within fi can be bytes rather than words -*/ - -static uint8_t hibit(const uint32_t x) -{ uint8_t r = (uint8_t)((x >> 1) | (x >> 2)); - - r |= (r >> 2); - r |= (r >> 4); - return (r + 1) >> 1; -} - -/* return the inverse of the finite field element x */ - -static uint8_t gf_inv(const uint8_t x) -{ uint8_t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; - - if(x < 2) - return x; - - for( ; ; ) - { - if(n1) - while(n2 >= n1) /* divide polynomial p2 by p1 */ - { - n2 /= n1; /* shift smaller polynomial left */ - p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */ - v2 ^= v1 * n2; /* shift accumulated value and */ - n2 = hibit(p2); /* add into result */ - } - else - return v1; - - if(n2) /* repeat with values swapped */ - while(n1 >= n2) - { - n1 /= n2; - p1 ^= p2 * n1; - v1 ^= v2 * n1; - n1 = hibit(p1); - } - else - return v2; - } -} - -#endif - -/* The forward and inverse affine transformations used in the S-box */ -uint8_t fwd_affine(const uint8_t x) -{ uint32_t w = x; - w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4); - return 0x63 ^ ((w ^ (w >> 8)) & 0xff); -} - -uint8_t inv_affine(const uint8_t x) -{ uint32_t w = x; - w = (w << 1) ^ (w << 3) ^ (w << 6); - return 0x05 ^ ((w ^ (w >> 8)) & 0xff); -} - -static int init = 0; - -AES_RETURN aes_init(void) -{ uint32_t i, w; - -#if defined(FF_TABLES) - - uint8_t pow[512], log[256]; - - if(init) - return EXIT_SUCCESS; - /* log and power tables for GF(2^8) finite field with - WPOLY as modular polynomial - the simplest primitive - root is 0x03, used here to generate the tables - */ - - i = 0; w = 1; - do - { - pow[i] = (uint8_t)w; - pow[i + 255] = (uint8_t)w; - log[w] = (uint8_t)i++; - w ^= (w << 1) ^ (w & 0x80 ? WPOLY : 0); - } - while (w != 1); - -#else - if(init) - return EXIT_SUCCESS; -#endif - - for(i = 0, w = 1; i < RC_LENGTH; ++i) - { - t_set(r,c)[i] = bytes2word(w, 0, 0, 0); - w = f2(w); - } - - for(i = 0; i < 256; ++i) - { uint8_t b; - - b = fwd_affine(gf_inv((uint8_t)i)); - w = bytes2word(f2(b), b, b, f3(b)); - -#if defined( SBX_SET ) - t_set(s,box)[i] = b; -#endif - -#if defined( FT1_SET ) /* tables for a normal encryption round */ - t_set(f,n)[i] = w; -#endif -#if defined( FT4_SET ) - t_set(f,n)[0][i] = w; - t_set(f,n)[1][i] = upr(w,1); - t_set(f,n)[2][i] = upr(w,2); - t_set(f,n)[3][i] = upr(w,3); -#endif - w = bytes2word(b, 0, 0, 0); - -#if defined( FL1_SET ) /* tables for last encryption round (may also */ - t_set(f,l)[i] = w; /* be used in the key schedule) */ -#endif -#if defined( FL4_SET ) - t_set(f,l)[0][i] = w; - t_set(f,l)[1][i] = upr(w,1); - t_set(f,l)[2][i] = upr(w,2); - t_set(f,l)[3][i] = upr(w,3); -#endif - -#if defined( LS1_SET ) /* table for key schedule if t_set(f,l) above is*/ - t_set(l,s)[i] = w; /* not of the required form */ -#endif -#if defined( LS4_SET ) - t_set(l,s)[0][i] = w; - t_set(l,s)[1][i] = upr(w,1); - t_set(l,s)[2][i] = upr(w,2); - t_set(l,s)[3][i] = upr(w,3); -#endif - - b = gf_inv(inv_affine((uint8_t)i)); - w = bytes2word(fe(b), f9(b), fd(b), fb(b)); - -#if defined( IM1_SET ) /* tables for the inverse mix column operation */ - t_set(i,m)[b] = w; -#endif -#if defined( IM4_SET ) - t_set(i,m)[0][b] = w; - t_set(i,m)[1][b] = upr(w,1); - t_set(i,m)[2][b] = upr(w,2); - t_set(i,m)[3][b] = upr(w,3); -#endif - -#if defined( ISB_SET ) - t_set(i,box)[i] = b; -#endif -#if defined( IT1_SET ) /* tables for a normal decryption round */ - t_set(i,n)[i] = w; -#endif -#if defined( IT4_SET ) - t_set(i,n)[0][i] = w; - t_set(i,n)[1][i] = upr(w,1); - t_set(i,n)[2][i] = upr(w,2); - t_set(i,n)[3][i] = upr(w,3); -#endif - w = bytes2word(b, 0, 0, 0); -#if defined( IL1_SET ) /* tables for last decryption round */ - t_set(i,l)[i] = w; -#endif -#if defined( IL4_SET ) - t_set(i,l)[0][i] = w; - t_set(i,l)[1][i] = upr(w,1); - t_set(i,l)[2][i] = upr(w,2); - t_set(i,l)[3][i] = upr(w,3); -#endif - } - init = 1; - return EXIT_SUCCESS; -} - -/* - Automatic code initialisation (suggested by by Henrik S. Gaßmann) - based on code provided by Joe Lowe and placed in the public domain at: - http://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc -*/ - -#ifdef _MSC_VER - -#pragma section(".CRT$XCU", read) - -__declspec(allocate(".CRT$XCU")) void (__cdecl *aes_startup)(void) = aes_init; - -#elif defined(__GNUC__) - -static void aes_startup(void) __attribute__((constructor)); - -static void aes_startup(void) -{ - aes_init(); -} - -#else - -#pragma message( "dynamic tables must be initialised manually on your system" ) - -#endif - -#endif - -#if defined(__cplusplus) -} -#endif - diff --git a/game/client/third/minizip/lib/aes/aestab.h b/game/client/third/minizip/lib/aes/aestab.h deleted file mode 100755 index 8fe32d18..00000000 --- a/game/client/third/minizip/lib/aes/aestab.h +++ /dev/null @@ -1,173 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - - This file contains the code for declaring the tables needed to implement - AES. The file aesopt.h is assumed to be included before this header file. - If there are no global variables, the definitions here can be used to put - the AES tables in a structure so that a pointer can then be added to the - AES context to pass them to the AES routines that need them. If this - facility is used, the calling program has to ensure that this pointer is - managed appropriately. In particular, the value of the t_dec(in,it) item - in the table structure must be set to zero in order to ensure that the - tables are initialised. In practice the three code sequences in aeskey.c - that control the calls to aes_init() and the aes_init() routine itself will - have to be changed for a specific implementation. If global variables are - available it will generally be preferable to use them with the precomputed - STATIC_TABLES option that uses static global tables. - - The following defines can be used to control the way the tables - are defined, initialised and used in embedded environments that - require special features for these purposes - - the 't_dec' construction is used to declare fixed table arrays - the 't_set' construction is used to set fixed table values - the 't_use' construction is used to access fixed table values - - 256 byte tables: - - t_xxx(s,box) => forward S box - t_xxx(i,box) => inverse S box - - 256 32-bit word OR 4 x 256 32-bit word tables: - - t_xxx(f,n) => forward normal round - t_xxx(f,l) => forward last round - t_xxx(i,n) => inverse normal round - t_xxx(i,l) => inverse last round - t_xxx(l,s) => key schedule table - t_xxx(i,m) => key schedule table - - Other variables and tables: - - t_xxx(r,c) => the rcon table -*/ - -#if !defined( _AESTAB_H ) -#define _AESTAB_H - -#if defined(__cplusplus) -extern "C" { -#endif - -#define t_dec(m,n) t_##m##n -#define t_set(m,n) t_##m##n -#define t_use(m,n) t_##m##n - -#if defined(STATIC_TABLES) -# if !defined( __GNUC__ ) && (defined( __MSDOS__ ) || defined( __WIN16__ )) -/* make tables far data to avoid using too much DGROUP space (PG) */ -# define CONST const far -# else -# define CONST const -# endif -#else -# define CONST -#endif - -#if defined(DO_TABLES) -# define EXTERN -#else -# define EXTERN extern -#endif - -#if defined(_MSC_VER) && defined(TABLE_ALIGN) -#define ALIGN __declspec(align(TABLE_ALIGN)) -#else -#define ALIGN -#endif - -#if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 ) -# define XP_DIR __cdecl -#else -# define XP_DIR -#endif - -#if defined(DO_TABLES) && defined(STATIC_TABLES) -#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] = b(e) -#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] = { b(e), b(f), b(g), b(h) } -EXTERN ALIGN CONST uint32_t t_dec(r,c)[RC_LENGTH] = rc_data(w0); -#else -#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] -#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] -EXTERN ALIGN CONST uint32_t t_dec(r,c)[RC_LENGTH]; -#endif - -#if defined( SBX_SET ) - d_1(uint8_t, t_dec(s,box), sb_data, h0); -#endif -#if defined( ISB_SET ) - d_1(uint8_t, t_dec(i,box), isb_data, h0); -#endif - -#if defined( FT1_SET ) - d_1(uint32_t, t_dec(f,n), sb_data, u0); -#endif -#if defined( FT4_SET ) - d_4(uint32_t, t_dec(f,n), sb_data, u0, u1, u2, u3); -#endif - -#if defined( FL1_SET ) - d_1(uint32_t, t_dec(f,l), sb_data, w0); -#endif -#if defined( FL4_SET ) - d_4(uint32_t, t_dec(f,l), sb_data, w0, w1, w2, w3); -#endif - -#if defined( IT1_SET ) - d_1(uint32_t, t_dec(i,n), isb_data, v0); -#endif -#if defined( IT4_SET ) - d_4(uint32_t, t_dec(i,n), isb_data, v0, v1, v2, v3); -#endif - -#if defined( IL1_SET ) - d_1(uint32_t, t_dec(i,l), isb_data, w0); -#endif -#if defined( IL4_SET ) - d_4(uint32_t, t_dec(i,l), isb_data, w0, w1, w2, w3); -#endif - -#if defined( LS1_SET ) -#if defined( FL1_SET ) -#undef LS1_SET -#else - d_1(uint32_t, t_dec(l,s), sb_data, w0); -#endif -#endif - -#if defined( LS4_SET ) -#if defined( FL4_SET ) -#undef LS4_SET -#else - d_4(uint32_t, t_dec(l,s), sb_data, w0, w1, w2, w3); -#endif -#endif - -#if defined( IM1_SET ) - d_1(uint32_t, t_dec(i,m), mm_data, v0); -#endif -#if defined( IM4_SET ) - d_4(uint32_t, t_dec(i,m), mm_data, v0, v1, v2, v3); -#endif - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/brg_endian.h b/game/client/third/minizip/lib/aes/brg_endian.h deleted file mode 100755 index 9ef4af58..00000000 --- a/game/client/third/minizip/lib/aes/brg_endian.h +++ /dev/null @@ -1,127 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 -*/ - -#ifndef _BRG_ENDIAN_H -#define _BRG_ENDIAN_H - -#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */ -#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */ - -/* Include files where endian defines and byteswap functions may reside */ -#if defined( __sun ) -# include -#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ ) -# include -#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \ - defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ ) || \ - defined(__pnacl__) -# include -#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ ) -# if !defined( __MINGW32__ ) && !defined( _AIX ) -# include -# if !defined( __BEOS__ ) -# include -# endif -# endif -#endif - -/* Now attempt to set the define for platform byte order using any */ -/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */ -/* seem to encompass most endian symbol definitions */ - -#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN ) -# if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -# elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -# endif -#elif defined( BIG_ENDIAN ) -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -#elif defined( LITTLE_ENDIAN ) -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -#endif - -#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN ) -# if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -# elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -# endif -#elif defined( _BIG_ENDIAN ) -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -#elif defined( _LITTLE_ENDIAN ) -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -#endif - -#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN ) -# if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -# elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -# endif -#elif defined( __BIG_ENDIAN ) -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -#elif defined( __LITTLE_ENDIAN ) -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -#endif - -#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ ) -# if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__ -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -# elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__ -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -# endif -#elif defined( __BIG_ENDIAN__ ) -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -#elif defined( __LITTLE_ENDIAN__ ) -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -#endif - -/* if the platform byte order could not be determined, then try to */ -/* set this define using common machine defines */ -#if !defined(PLATFORM_BYTE_ORDER) - -#if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \ - defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \ - defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \ - defined( vax ) || defined( vms ) || defined( VMS ) || \ - defined( __VMS ) || defined( _M_X64 ) -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN - -#elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \ - defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \ - defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \ - defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \ - defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \ - defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \ - defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX ) -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN - -#elif 0 /* **** EDIT HERE IF NECESSARY **** */ -# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN -#elif 0 /* **** EDIT HERE IF NECESSARY **** */ -# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN -#else -# error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order -#endif - -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/brg_types.h b/game/client/third/minizip/lib/aes/brg_types.h deleted file mode 100755 index 307319bf..00000000 --- a/game/client/third/minizip/lib/aes/brg_types.h +++ /dev/null @@ -1,191 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - - The unsigned integer types defined here are of the form uint_t where - is the length of the type; for example, the unsigned 32-bit type is - 'uint32_t'. These are NOT the same as the 'C99 integer types' that are - defined in the inttypes.h and stdint.h headers since attempts to use these - types have shown that support for them is still highly variable. However, - since the latter are of the form uint_t, a regular expression search - and replace (in VC++ search on 'uint_{:z}t' and replace with 'uint\1_t') - can be used to convert the types used here to the C99 standard types. -*/ - -#ifndef _BRG_TYPES_H -#define _BRG_TYPES_H - -#if defined(__cplusplus) -extern "C" { -#endif - -#include -#include - -#if defined( _MSC_VER ) && ( _MSC_VER >= 1300 ) -# include -# define ptrint_t intptr_t -#elif defined( __ECOS__ ) -# define intptr_t unsigned int -# define ptrint_t intptr_t -#elif defined( __GNUC__ ) && ( __GNUC__ >= 3 ) -# define ptrint_t intptr_t -#else -# define ptrint_t int -#endif - -#ifndef BRG_UI32 -# define BRG_UI32 -# if UINT_MAX == 4294967295u -# define li_32(h) 0x##h##u -# elif ULONG_MAX == 4294967295u -# define li_32(h) 0x##h##ul -# elif defined( _CRAY ) -# error This code needs 32-bit data types, which Cray machines do not provide -# else -# error Please define uint32_t as a 32-bit unsigned integer type in brg_types.h -# endif -#endif - -#ifndef BRG_UI64 -# if defined( __BORLANDC__ ) && !defined( __MSDOS__ ) -# define BRG_UI64 -# define li_64(h) 0x##h##ui64 -# elif defined( _MSC_VER ) && ( _MSC_VER < 1300 ) /* 1300 == VC++ 7.0 */ -# define BRG_UI64 -# define li_64(h) 0x##h##ui64 -# elif defined( __sun ) && defined( ULONG_MAX ) && ULONG_MAX == 0xfffffffful -# define BRG_UI64 -# define li_64(h) 0x##h##ull -# elif defined( __MVS__ ) -# define BRG_UI64 -# define li_64(h) 0x##h##ull -# elif defined( UINT_MAX ) && UINT_MAX > 4294967295u -# if UINT_MAX == 18446744073709551615u -# define BRG_UI64 -# define li_64(h) 0x##h##u -# endif -# elif defined( ULONG_MAX ) && ULONG_MAX > 4294967295u -# if ULONG_MAX == 18446744073709551615ul -# define BRG_UI64 -# define li_64(h) 0x##h##ul -# endif -# elif defined( ULLONG_MAX ) && ULLONG_MAX > 4294967295u -# if ULLONG_MAX == 18446744073709551615ull -# define BRG_UI64 -# define li_64(h) 0x##h##ull -# endif -# elif defined( ULONG_LONG_MAX ) && ULONG_LONG_MAX > 4294967295u -# if ULONG_LONG_MAX == 18446744073709551615ull -# define BRG_UI64 -# define li_64(h) 0x##h##ull -# endif -# endif -#endif - -#if !defined( BRG_UI64 ) -# if defined( NEED_UINT_64T ) -# error Please define uint64_t as an unsigned 64 bit type in brg_types.h -# endif -#endif - -#ifndef RETURN_VALUES -# define RETURN_VALUES -# if defined( DLL_EXPORT ) -# if defined( _MSC_VER ) || defined ( __INTEL_COMPILER ) -# define VOID_RETURN __declspec( dllexport ) void __stdcall -# define INT_RETURN __declspec( dllexport ) int __stdcall -# elif defined( __GNUC__ ) -# define VOID_RETURN __declspec( __dllexport__ ) void -# define INT_RETURN __declspec( __dllexport__ ) int -# else -# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers -# endif -# elif defined( DLL_IMPORT ) -# if defined( _MSC_VER ) || defined ( __INTEL_COMPILER ) -# define VOID_RETURN __declspec( dllimport ) void __stdcall -# define INT_RETURN __declspec( dllimport ) int __stdcall -# elif defined( __GNUC__ ) -# define VOID_RETURN __declspec( __dllimport__ ) void -# define INT_RETURN __declspec( __dllimport__ ) int -# else -# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers -# endif -# elif defined( __WATCOMC__ ) -# define VOID_RETURN void __cdecl -# define INT_RETURN int __cdecl -# else -# define VOID_RETURN void -# define INT_RETURN int -# endif -#endif - -/* These defines are used to detect and set the memory alignment of pointers. - Note that offsets are in bytes. - - ALIGN_OFFSET(x,n) return the positive or zero offset of - the memory addressed by the pointer 'x' - from an address that is aligned on an - 'n' byte boundary ('n' is a power of 2) - - ALIGN_FLOOR(x,n) return a pointer that points to memory - that is aligned on an 'n' byte boundary - and is not higher than the memory address - pointed to by 'x' ('n' is a power of 2) - - ALIGN_CEIL(x,n) return a pointer that points to memory - that is aligned on an 'n' byte boundary - and is not lower than the memory address - pointed to by 'x' ('n' is a power of 2) -*/ - -#define ALIGN_OFFSET(x,n) (((ptrint_t)(x)) & ((n) - 1)) -#define ALIGN_FLOOR(x,n) ((uint8_t*)(x) - ( ((ptrint_t)(x)) & ((n) - 1))) -#define ALIGN_CEIL(x,n) ((uint8_t*)(x) + (-((ptrint_t)(x)) & ((n) - 1))) - -/* These defines are used to declare buffers in a way that allows - faster operations on longer variables to be used. In all these - defines 'size' must be a power of 2 and >= 8. NOTE that the - buffer size is in bytes but the type length is in bits - - UNIT_TYPEDEF(x,size) declares a variable 'x' of length - 'size' bits - - BUFR_TYPEDEF(x,size,bsize) declares a buffer 'x' of length 'bsize' - bytes defined as an array of variables - each of 'size' bits (bsize must be a - multiple of size / 8) - - UNIT_CAST(x,size) casts a variable to a type of - length 'size' bits - - UPTR_CAST(x,size) casts a pointer to a pointer to a - varaiable of length 'size' bits -*/ - -#define UI_TYPE(size) uint##size##_t -#define UNIT_TYPEDEF(x,size) typedef UI_TYPE(size) x -#define BUFR_TYPEDEF(x,size,bsize) typedef UI_TYPE(size) x[bsize / (size >> 3)] -#define UNIT_CAST(x,size) ((UI_TYPE(size) )(x)) -#define UPTR_CAST(x,size) ((UI_TYPE(size)*)(x)) - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/hmac.c b/game/client/third/minizip/lib/aes/hmac.c deleted file mode 100755 index face1fbf..00000000 --- a/game/client/third/minizip/lib/aes/hmac.c +++ /dev/null @@ -1,209 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - -This is an implementation of HMAC, the FIPS standard keyed hash function -*/ - -#include "hmac.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -/* initialise the HMAC context to zero */ -int hmac_sha_begin(enum hmac_hash hash, hmac_ctx cx[1]) -{ - memset(cx, 0, sizeof(hmac_ctx)); - switch(hash) - { -#ifdef SHA_1 - case HMAC_SHA1: - cx->f_begin = (hf_begin *)sha1_begin; - cx->f_hash = (hf_hash *)sha1_hash; - cx->f_end = (hf_end *)sha1_end; - cx->input_len = SHA1_BLOCK_SIZE; - cx->output_len = SHA1_DIGEST_SIZE; - break; -#endif -#ifdef SHA_224 - case HMAC_SHA224: - cx->f_begin = (hf_begin *)sha224_begin; - cx->f_hash = (hf_hash *)sha224_hash; - cx->f_end = (hf_end *)sha224_end; - cx->input_len = SHA224_BLOCK_SIZE; - cx->output_len = SHA224_DIGEST_SIZE; - break; -#endif -#ifdef SHA_256 - case HMAC_SHA256: - cx->f_begin = (hf_begin *)sha256_begin; - cx->f_hash = (hf_hash *)sha256_hash; - cx->f_end = (hf_end *)sha256_end; - cx->input_len = SHA256_BLOCK_SIZE; - cx->output_len = SHA256_DIGEST_SIZE; - break; -#endif -#ifdef SHA_384 - case HMAC_SHA384: - cx->f_begin = (hf_begin *)sha384_begin; - cx->f_hash = (hf_hash *)sha384_hash; - cx->f_end = (hf_end *)sha384_end; - cx->input_len = SHA384_BLOCK_SIZE; - cx->output_len = SHA384_DIGEST_SIZE; - break; -#endif -#ifdef SHA_512 - case HMAC_SHA512: - cx->f_begin = (hf_begin *)sha512_begin; - cx->f_hash = (hf_hash *)sha512_hash; - cx->f_end = (hf_end *)sha512_end; - cx->input_len = SHA512_BLOCK_SIZE; - cx->output_len = SHA512_DIGEST_SIZE; - break; - case HMAC_SHA512_256: - cx->f_begin = (hf_begin *)sha512_256_begin; - cx->f_hash = (hf_hash *)sha512_256_hash; - cx->f_end = (hf_end *)sha512_256_end; - cx->input_len = SHA512_256_BLOCK_SIZE; - cx->output_len = SHA512_256_DIGEST_SIZE; - break; - case HMAC_SHA512_224: - cx->f_begin = (hf_begin *)sha512_224_begin; - cx->f_hash = (hf_hash *)sha512_224_hash; - cx->f_end = (hf_end *)sha512_224_end; - cx->input_len = SHA512_224_BLOCK_SIZE; - cx->output_len = SHA512_224_DIGEST_SIZE; - break; - case HMAC_SHA512_192: - cx->f_begin = (hf_begin *)sha512_192_begin; - cx->f_hash = (hf_hash *)sha512_192_hash; - cx->f_end = (hf_end *)sha512_192_end; - cx->input_len = SHA512_192_BLOCK_SIZE; - cx->output_len = SHA512_192_DIGEST_SIZE; - break; - case HMAC_SHA512_128: - cx->f_begin = (hf_begin *)sha512_128_begin; - cx->f_hash = (hf_hash *)sha512_128_hash; - cx->f_end = (hf_begin *)sha512_128_end; - cx->input_len = SHA512_128_BLOCK_SIZE; - cx->output_len = SHA512_128_DIGEST_SIZE; - break; -#endif - } - return (int)cx->output_len; -} - -/* input the HMAC key (can be called multiple times) */ -int hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1]) -{ - if(cx->klen == HMAC_IN_DATA) /* error if further key input */ - return EXIT_FAILURE; /* is attempted in data mode */ - - if(cx->klen + key_len > cx->input_len) /* if the key has to be hashed */ - { - if(cx->klen <= cx->input_len) /* if the hash has not yet been */ - { /* started, initialise it and */ - cx->f_begin(cx->sha_ctx); /* hash stored key characters */ - cx->f_hash(cx->key, cx->klen, cx->sha_ctx); - } - - cx->f_hash(key, key_len, cx->sha_ctx); /* hash long key data into hash */ - } - else /* otherwise store key data */ - memcpy(cx->key + cx->klen, key, key_len); - - cx->klen += key_len; /* update the key length count */ - return EXIT_SUCCESS; -} - -/* input the HMAC data (can be called multiple times) - */ -/* note that this call terminates the key input phase */ -void hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1]) -{ unsigned int i; - - if(cx->klen != HMAC_IN_DATA) /* if not yet in data phase */ - { - if(cx->klen > cx->input_len) /* if key is being hashed */ - { /* complete the hash and */ - cx->f_end(cx->key, cx->sha_ctx); /* store the result as the */ - cx->klen = cx->output_len; /* key and set new length */ - } - - /* pad the key if necessary */ - memset(cx->key + cx->klen, 0, cx->input_len - cx->klen); - - /* xor ipad into key value */ - for(i = 0; i < (cx->input_len >> 2); ++i) - ((uint32_t*)cx->key)[i] ^= 0x36363636; - - /* and start hash operation */ - cx->f_begin(cx->sha_ctx); - cx->f_hash(cx->key, cx->input_len, cx->sha_ctx); - - /* mark as now in data mode */ - cx->klen = HMAC_IN_DATA; - } - - /* hash the data (if any) */ - if(data_len) - cx->f_hash(data, data_len, cx->sha_ctx); -} - -/* compute and output the MAC value */ -void hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1]) -{ unsigned char dig[HMAC_MAX_OUTPUT_SIZE]; - unsigned int i; - - /* if no data has been entered perform a null data phase */ - if(cx->klen != HMAC_IN_DATA) - hmac_sha_data((const unsigned char*)0, 0, cx); - - cx->f_end(dig, cx->sha_ctx); /* complete the inner hash */ - - /* set outer key value using opad and removing ipad */ - for(i = 0; i < (cx->input_len >> 2); ++i) - ((uint32_t*)cx->key)[i] ^= 0x36363636 ^ 0x5c5c5c5c; - - /* perform the outer hash operation */ - cx->f_begin(cx->sha_ctx); - cx->f_hash(cx->key, cx->input_len, cx->sha_ctx); - cx->f_hash(dig, cx->output_len, cx->sha_ctx); - cx->f_end(dig, cx->sha_ctx); - - /* output the hash value */ - for(i = 0; i < mac_len; ++i) - mac[i] = dig[i]; -} - -/* 'do it all in one go' subroutine */ -void hmac_sha(enum hmac_hash hash, const unsigned char key[], unsigned long key_len, - const unsigned char data[], unsigned long data_len, - unsigned char mac[], unsigned long mac_len) -{ hmac_ctx cx[1]; - - hmac_sha_begin(hash, cx); - hmac_sha_key(key, key_len, cx); - hmac_sha_data(data, data_len, cx); - hmac_sha_end(mac, mac_len, cx); -} - -#if defined(__cplusplus) -} -#endif diff --git a/game/client/third/minizip/lib/aes/hmac.h b/game/client/third/minizip/lib/aes/hmac.h deleted file mode 100755 index 46956c45..00000000 --- a/game/client/third/minizip/lib/aes/hmac.h +++ /dev/null @@ -1,119 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - -This is an implementation of HMAC, the FIPS standard keyed hash function -*/ - -#ifndef _HMAC2_H -#define _HMAC2_H - -#include -#include - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#include "sha1.h" - -#if defined(SHA_224) || defined(SHA_256) || defined(SHA_384) || defined(SHA_512) -#define HMAC_MAX_OUTPUT_SIZE SHA2_MAX_DIGEST_SIZE -#define HMAC_MAX_BLOCK_SIZE SHA2_MAX_BLOCK_SIZE -#else -#define HMAC_MAX_OUTPUT_SIZE SHA1_DIGEST_SIZE -#define HMAC_MAX_BLOCK_SIZE SHA1_BLOCK_SIZE -#endif - -#define HMAC_IN_DATA 0xffffffff - -enum hmac_hash -{ -#ifdef SHA_1 - HMAC_SHA1, -#endif -#ifdef SHA_224 - HMAC_SHA224, -#endif -#ifdef SHA_256 - HMAC_SHA256, -#endif -#ifdef SHA_384 - HMAC_SHA384, -#endif -#ifdef SHA_512 - HMAC_SHA512, - HMAC_SHA512_256, - HMAC_SHA512_224, - HMAC_SHA512_192, - HMAC_SHA512_128 -#endif -}; - -typedef VOID_RETURN hf_begin(void*); -typedef VOID_RETURN hf_hash(const void*, unsigned long len, void*); -typedef VOID_RETURN hf_end(void*, void*); - -typedef struct -{ hf_begin *f_begin; - hf_hash *f_hash; - hf_end *f_end; - unsigned char key[HMAC_MAX_BLOCK_SIZE]; - union - { -#ifdef SHA_1 - sha1_ctx u_sha1; -#endif -#ifdef SHA_224 - sha224_ctx u_sha224; -#endif -#ifdef SHA_256 - sha256_ctx u_sha256; -#endif -#ifdef SHA_384 - sha384_ctx u_sha384; -#endif -#ifdef SHA_512 - sha512_ctx u_sha512; -#endif - } sha_ctx[1]; - unsigned long input_len; - unsigned long output_len; - unsigned long klen; -} hmac_ctx; - -/* returns the length of hash digest for the hash used */ -/* mac_len must not be greater than this */ -int hmac_sha_begin(enum hmac_hash hash, hmac_ctx cx[1]); - -int hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1]); - -void hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1]); - -void hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1]); - -void hmac_sha(enum hmac_hash hash, const unsigned char key[], unsigned long key_len, - const unsigned char data[], unsigned long data_len, - unsigned char mac[], unsigned long mac_len); - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/pwd2key.c b/game/client/third/minizip/lib/aes/pwd2key.c deleted file mode 100755 index e964759b..00000000 --- a/game/client/third/minizip/lib/aes/pwd2key.c +++ /dev/null @@ -1,182 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - -This is an implementation of RFC2898, which specifies key derivation from -a password and a salt value. -*/ - -#include -#include "hmac.h" -#include "pwd2key.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -void derive_key(const unsigned char pwd[], /* the PASSWORD */ - unsigned int pwd_len, /* and its length */ - const unsigned char salt[], /* the SALT and its */ - unsigned int salt_len, /* length */ - unsigned int iter, /* the number of iterations */ - unsigned char key[], /* space for the output key */ - unsigned int key_len)/* and its required length */ -{ - unsigned int i, j, k, n_blk, h_size; - unsigned char uu[HMAC_MAX_OUTPUT_SIZE], ux[HMAC_MAX_OUTPUT_SIZE]; - hmac_ctx c1[1], c2[1], c3[1]; - - /* set HMAC context (c1) for password */ - h_size = hmac_sha_begin(HMAC_SHA1, c1); - hmac_sha_key(pwd, pwd_len, c1); - - /* set HMAC context (c2) for password and salt */ - memcpy(c2, c1, sizeof(hmac_ctx)); - hmac_sha_data(salt, salt_len, c2); - - /* find the number of SHA blocks in the key */ - n_blk = 1 + (key_len - 1) / h_size; - - for(i = 0; i < n_blk; ++i) /* for each block in key */ - { - /* ux[] holds the running xor value */ - memset(ux, 0, h_size); - - /* set HMAC context (c3) for password and salt */ - memcpy(c3, c2, sizeof(hmac_ctx)); - - /* enter additional data for 1st block into uu */ - uu[0] = (unsigned char)((i + 1) >> 24); - uu[1] = (unsigned char)((i + 1) >> 16); - uu[2] = (unsigned char)((i + 1) >> 8); - uu[3] = (unsigned char)(i + 1); - - /* this is the key mixing iteration */ - for(j = 0, k = 4; j < iter; ++j) - { - /* add previous round data to HMAC */ - hmac_sha_data(uu, k, c3); - - /* obtain HMAC for uu[] */ - hmac_sha_end(uu, h_size, c3); - - /* xor into the running xor block */ - for(k = 0; k < h_size; ++k) - ux[k] ^= uu[k]; - - /* set HMAC context (c3) for password */ - memcpy(c3, c1, sizeof(hmac_ctx)); - } - - /* compile key blocks into the key output */ - j = 0; k = i * h_size; - while(j < h_size && k < key_len) - key[k++] = ux[j++]; - } -} - -#ifdef TEST - -#include - -struct -{ unsigned int pwd_len; - unsigned int salt_len; - unsigned int it_count; - unsigned char *pwd; - unsigned char salt[32]; - unsigned char key[32]; -} tests[] = -{ - { 8, 4, 5, (unsigned char*)"password", - { - 0x12, 0x34, 0x56, 0x78 - }, - { - 0x5c, 0x75, 0xce, 0xf0, 0x1a, 0x96, 0x0d, 0xf7, - 0x4c, 0xb6, 0xb4, 0x9b, 0x9e, 0x38, 0xe6, 0xb5 - } - }, - { 8, 8, 5, (unsigned char*)"password", - { - 0x12, 0x34, 0x56, 0x78, 0x78, 0x56, 0x34, 0x12 - }, - { - 0xd1, 0xda, 0xa7, 0x86, 0x15, 0xf2, 0x87, 0xe6, - 0xa1, 0xc8, 0xb1, 0x20, 0xd7, 0x06, 0x2a, 0x49 - } - }, - { 8, 21, 1, (unsigned char*)"password", - { - "ATHENA.MIT.EDUraeburn" - }, - { - 0xcd, 0xed, 0xb5, 0x28, 0x1b, 0xb2, 0xf8, 0x01, - 0x56, 0x5a, 0x11, 0x22, 0xb2, 0x56, 0x35, 0x15 - } - }, - { 8, 21, 2, (unsigned char*)"password", - { - "ATHENA.MIT.EDUraeburn" - }, - { - 0x01, 0xdb, 0xee, 0x7f, 0x4a, 0x9e, 0x24, 0x3e, - 0x98, 0x8b, 0x62, 0xc7, 0x3c, 0xda, 0x93, 0x5d - } - }, - { 8, 21, 1200, (unsigned char*)"password", - { - "ATHENA.MIT.EDUraeburn" - }, - { - 0x5c, 0x08, 0xeb, 0x61, 0xfd, 0xf7, 0x1e, 0x4e, - 0x4e, 0xc3, 0xcf, 0x6b, 0xa1, 0xf5, 0x51, 0x2b - } - } -}; - -int main() -{ unsigned int i, j, key_len = 256; - unsigned char key[256]; - - printf("\nTest of RFC2898 Password Based Key Derivation"); - for(i = 0; i < 5; ++i) - { - derive_key(tests[i].pwd, tests[i].pwd_len, tests[i].salt, - tests[i].salt_len, tests[i].it_count, key, key_len); - - printf("\ntest %i: ", i + 1); - printf("key %s", memcmp(tests[i].key, key, 16) ? "is bad" : "is good"); - for(j = 0; j < key_len && j < 64; j += 4) - { - if(j % 16 == 0) - printf("\n"); - printf("0x%02x%02x%02x%02x ", key[j], key[j + 1], key[j + 2], key[j + 3]); - } - printf(j < key_len ? " ... \n" : "\n"); - } - printf("\n"); - return 0; -} - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/pwd2key.h b/game/client/third/minizip/lib/aes/pwd2key.h deleted file mode 100755 index b9ba4211..00000000 --- a/game/client/third/minizip/lib/aes/pwd2key.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 - -This is an implementation of RFC2898, which specifies key derivation from -a password and a salt value. -*/ - -#ifndef PWD2KEY_H -#define PWD2KEY_H - -#if defined(__cplusplus) -extern "C" -{ -#endif - -void derive_key( - const unsigned char pwd[], /* the PASSWORD, and */ - unsigned int pwd_len, /* its length */ - const unsigned char salt[], /* the SALT and its */ - unsigned int salt_len, /* length */ - unsigned int iter, /* the number of iterations */ - unsigned char key[], /* space for the output key */ - unsigned int key_len); /* and its required length */ - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/game/client/third/minizip/lib/aes/sha1.c b/game/client/third/minizip/lib/aes/sha1.c deleted file mode 100755 index 33003632..00000000 --- a/game/client/third/minizip/lib/aes/sha1.c +++ /dev/null @@ -1,283 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 -*/ - -#include /* for memcpy() etc. */ - -#include "sha1.h" -#include "brg_endian.h" - -#if defined(__cplusplus) -extern "C" -{ -#endif - -#if defined( _MSC_VER ) && ( _MSC_VER > 800 ) -#pragma intrinsic(memcpy) -#pragma intrinsic(memset) -#endif - -#if 0 && defined(_MSC_VER) -#define rotl32 _lrotl -#define rotr32 _lrotr -#else -#define rotl32(x,n) (((x) << n) | ((x) >> (32 - n))) -#define rotr32(x,n) (((x) >> n) | ((x) << (32 - n))) -#endif - -#if !defined(bswap_32) -#define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00)) -#endif - -#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN) -#define SWAP_BYTES -#else -#undef SWAP_BYTES -#endif - -#if defined(SWAP_BYTES) -#define bsw_32(p,n) \ - { int _i = (n); while(_i--) ((uint32_t*)p)[_i] = bswap_32(((uint32_t*)p)[_i]); } -#else -#define bsw_32(p,n) -#endif - -#define SHA1_MASK (SHA1_BLOCK_SIZE - 1) - -#if 0 - -#define ch(x,y,z) (((x) & (y)) ^ (~(x) & (z))) -#define parity(x,y,z) ((x) ^ (y) ^ (z)) -#define maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) - -#else /* Discovered by Rich Schroeppel and Colin Plumb */ - -#define ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) -#define parity(x,y,z) ((x) ^ (y) ^ (z)) -#define maj(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y)))) - -#endif - -/* Compile 64 bytes of hash data into SHA1 context. Note */ -/* that this routine assumes that the byte order in the */ -/* ctx->wbuf[] at this point is in such an order that low */ -/* address bytes in the ORIGINAL byte stream will go in */ -/* this buffer to the high end of 32-bit words on BOTH big */ -/* and little endian systems */ - -#ifdef ARRAY -#define q(v,n) v[n] -#else -#define q(v,n) v##n -#endif - -#ifdef SHA_1 - -#define one_cycle(v,a,b,c,d,e,f,k,h) \ - q(v,e) += rotr32(q(v,a),27) + \ - f(q(v,b),q(v,c),q(v,d)) + k + h; \ - q(v,b) = rotr32(q(v,b), 2) - -#define five_cycle(v,f,k,i) \ - one_cycle(v, 0,1,2,3,4, f,k,hf(i )); \ - one_cycle(v, 4,0,1,2,3, f,k,hf(i+1)); \ - one_cycle(v, 3,4,0,1,2, f,k,hf(i+2)); \ - one_cycle(v, 2,3,4,0,1, f,k,hf(i+3)); \ - one_cycle(v, 1,2,3,4,0, f,k,hf(i+4)) - -VOID_RETURN sha1_compile(sha1_ctx ctx[1]) -{ uint32_t *w = ctx->wbuf; - -#ifdef ARRAY - uint32_t v[5]; - memcpy(v, ctx->hash, sizeof(ctx->hash)); -#else - uint32_t v0, v1, v2, v3, v4; - v0 = ctx->hash[0]; v1 = ctx->hash[1]; - v2 = ctx->hash[2]; v3 = ctx->hash[3]; - v4 = ctx->hash[4]; -#endif - -#define hf(i) w[i] - - five_cycle(v, ch, 0x5a827999, 0); - five_cycle(v, ch, 0x5a827999, 5); - five_cycle(v, ch, 0x5a827999, 10); - one_cycle(v,0,1,2,3,4, ch, 0x5a827999, hf(15)); \ - -#undef hf -#define hf(i) (w[(i) & 15] = rotl32( \ - w[((i) + 13) & 15] ^ w[((i) + 8) & 15] \ - ^ w[((i) + 2) & 15] ^ w[(i) & 15], 1)) - - one_cycle(v,4,0,1,2,3, ch, 0x5a827999, hf(16)); - one_cycle(v,3,4,0,1,2, ch, 0x5a827999, hf(17)); - one_cycle(v,2,3,4,0,1, ch, 0x5a827999, hf(18)); - one_cycle(v,1,2,3,4,0, ch, 0x5a827999, hf(19)); - - five_cycle(v, parity, 0x6ed9eba1, 20); - five_cycle(v, parity, 0x6ed9eba1, 25); - five_cycle(v, parity, 0x6ed9eba1, 30); - five_cycle(v, parity, 0x6ed9eba1, 35); - - five_cycle(v, maj, 0x8f1bbcdc, 40); - five_cycle(v, maj, 0x8f1bbcdc, 45); - five_cycle(v, maj, 0x8f1bbcdc, 50); - five_cycle(v, maj, 0x8f1bbcdc, 55); - - five_cycle(v, parity, 0xca62c1d6, 60); - five_cycle(v, parity, 0xca62c1d6, 65); - five_cycle(v, parity, 0xca62c1d6, 70); - five_cycle(v, parity, 0xca62c1d6, 75); - -#ifdef ARRAY - ctx->hash[0] += v[0]; ctx->hash[1] += v[1]; - ctx->hash[2] += v[2]; ctx->hash[3] += v[3]; - ctx->hash[4] += v[4]; -#else - ctx->hash[0] += v0; ctx->hash[1] += v1; - ctx->hash[2] += v2; ctx->hash[3] += v3; - ctx->hash[4] += v4; -#endif -} - -VOID_RETURN sha1_begin(sha1_ctx ctx[1]) -{ - memset(ctx, 0, sizeof(sha1_ctx)); - ctx->hash[0] = 0x67452301; - ctx->hash[1] = 0xefcdab89; - ctx->hash[2] = 0x98badcfe; - ctx->hash[3] = 0x10325476; - ctx->hash[4] = 0xc3d2e1f0; -} - -/* SHA1 hash data in an array of bytes into hash buffer and */ -/* call the hash_compile function as required. For both the */ -/* bit and byte orientated versions, the block length 'len' */ -/* must not be greater than 2^32 - 1 bits (2^29 - 1 bytes) */ - -VOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1]) -{ uint32_t pos = (uint32_t)((ctx->count[0] >> 3) & SHA1_MASK); - const unsigned char *sp = data; - unsigned char *w = (unsigned char*)ctx->wbuf; -#if SHA1_BITS == 1 - uint32_t ofs = (ctx->count[0] & 7); -#else - len <<= 3; -#endif - if((ctx->count[0] += len) < len) - ++(ctx->count[1]); -#if SHA1_BITS == 1 - if(ofs) /* if not on a byte boundary */ - { - if(ofs + len < 8) /* if no added bytes are needed */ - { - w[pos] |= (*sp >> ofs); - } - else /* otherwise and add bytes */ - { unsigned char part = w[pos]; - - while((int)(ofs + (len -= 8)) >= 0) - { - w[pos++] = part | (*sp >> ofs); - part = *sp++ << (8 - ofs); - if(pos == SHA1_BLOCK_SIZE) - { - bsw_32(w, SHA1_BLOCK_SIZE >> 2); - sha1_compile(ctx); pos = 0; - } - } - - w[pos] = part; - } - } - else /* data is byte aligned */ -#endif - { uint32_t space = SHA1_BLOCK_SIZE - pos; - - while(len >= (space << 3)) - { - memcpy(w + pos, sp, space); - bsw_32(w, SHA1_BLOCK_SIZE >> 2); - sha1_compile(ctx); - sp += space; len -= (space << 3); - space = SHA1_BLOCK_SIZE; pos = 0; - } - memcpy(w + pos, sp, (len + 7 * SHA1_BITS) >> 3); - } -} - -/* SHA1 final padding and digest calculation */ - -VOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1]) -{ uint32_t i = (uint32_t)((ctx->count[0] >> 3) & SHA1_MASK), m1; - - /* put bytes in the buffer in an order in which references to */ - /* 32-bit words will put bytes with lower addresses into the */ - /* top of 32 bit words on BOTH big and little endian machines */ - bsw_32(ctx->wbuf, (i + 3 + SHA1_BITS) >> 2); - - /* we now need to mask valid bytes and add the padding which is */ - /* a single 1 bit and as many zero bits as necessary. Note that */ - /* we can always add the first padding byte here because the */ - /* buffer always has at least one empty slot */ - m1 = (unsigned char)0x80 >> (ctx->count[0] & 7); - ctx->wbuf[i >> 2] &= ((0xffffff00 | (~m1 + 1)) << 8 * (~i & 3)); - ctx->wbuf[i >> 2] |= (m1 << 8 * (~i & 3)); - - /* we need 9 or more empty positions, one for the padding byte */ - /* (above) and eight for the length count. If there is not */ - /* enough space, pad and empty the buffer */ - if(i > SHA1_BLOCK_SIZE - 9) - { - if(i < 60) ctx->wbuf[15] = 0; - sha1_compile(ctx); - i = 0; - } - else /* compute a word index for the empty buffer positions */ - i = (i >> 2) + 1; - - while(i < 14) /* and zero pad all but last two positions */ - ctx->wbuf[i++] = 0; - - /* the following 32-bit length fields are assembled in the */ - /* wrong byte order on little endian machines but this is */ - /* corrected later since they are only ever used as 32-bit */ - /* word values. */ - ctx->wbuf[14] = ctx->count[1]; - ctx->wbuf[15] = ctx->count[0]; - sha1_compile(ctx); - - /* extract the hash value as bytes in case the hash buffer is */ - /* misaligned for 32-bit words */ - for(i = 0; i < SHA1_DIGEST_SIZE; ++i) - hval[i] = ((ctx->hash[i >> 2] >> (8 * (~i & 3))) & 0xff); -} - -VOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len) -{ sha1_ctx cx[1]; - - sha1_begin(cx); sha1_hash(data, len, cx); sha1_end(hval, cx); -} - -#endif - -#if defined(__cplusplus) -} -#endif diff --git a/game/client/third/minizip/lib/aes/sha1.h b/game/client/third/minizip/lib/aes/sha1.h deleted file mode 100755 index e805ad92..00000000 --- a/game/client/third/minizip/lib/aes/sha1.h +++ /dev/null @@ -1,72 +0,0 @@ -/* ---------------------------------------------------------------------------- -Copyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved. - -The redistribution and use of this software (with or without changes) -is allowed without the payment of fees or royalties provided that: - - source code distributions include the above copyright notice, this - list of conditions and the following disclaimer; - - binary distributions include the above copyright notice, this list - of conditions and the following disclaimer in their documentation. - -This software is provided 'as is' with no explicit or implied warranties -in respect of its operation, including, but not limited to, correctness -and fitness for purpose. ---------------------------------------------------------------------------- -Issue Date: 20/12/2007 -*/ - -#ifndef _SHA1_H -#define _SHA1_H - -#define SHA_1 - -/* define for bit or byte oriented SHA */ -#if 1 -# define SHA1_BITS 0 /* byte oriented */ -#else -# define SHA1_BITS 1 /* bit oriented */ -#endif - -#include -#include "brg_types.h" - -#define SHA1_BLOCK_SIZE 64 -#define SHA1_DIGEST_SIZE 20 - -#if defined(__cplusplus) -extern "C" -{ -#endif - -/* type to hold the SHA256 context */ - -typedef struct -{ uint32_t count[2]; - uint32_t hash[SHA1_DIGEST_SIZE >> 2]; - uint32_t wbuf[SHA1_BLOCK_SIZE >> 2]; -} sha1_ctx; - -/* Note that these prototypes are the same for both bit and */ -/* byte oriented implementations. However the length fields */ -/* are in bytes or bits as appropriate for the version used */ -/* and bit sequences are input as arrays of bytes in which */ -/* bit sequences run from the most to the least significant */ -/* end of each byte. The value 'len' in sha1_hash for the */ -/* byte oriented version of SHA1 is limited to 2^29 bytes, */ -/* but multiple calls will handle longer data blocks. */ - -VOID_RETURN sha1_compile(sha1_ctx ctx[1]); - -VOID_RETURN sha1_begin(sha1_ctx ctx[1]); -VOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1]); -VOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1]); -VOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len); - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/game/client/third/minizip/lib/bzip2/LICENSE b/game/client/third/minizip/lib/bzip2/LICENSE deleted file mode 100755 index cc614178..00000000 --- a/game/client/third/minizip/lib/bzip2/LICENSE +++ /dev/null @@ -1,42 +0,0 @@ - --------------------------------------------------------------------------- - -This program, "bzip2", the associated library "libbzip2", and all -documentation, are copyright (C) 1996-2010 Julian R Seward. All -rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Julian Seward, jseward@bzip.org -bzip2/libbzip2 version 1.0.6 of 6 September 2010 - --------------------------------------------------------------------------- diff --git a/game/client/third/minizip/lib/bzip2/blocksort.c b/game/client/third/minizip/lib/bzip2/blocksort.c deleted file mode 100755 index d0d662cd..00000000 --- a/game/client/third/minizip/lib/bzip2/blocksort.c +++ /dev/null @@ -1,1094 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Block sorting machinery ---*/ -/*--- blocksort.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - -/*---------------------------------------------*/ -/*--- Fallback O(N log(N)^2) sorting ---*/ -/*--- algorithm, for repetitive blocks ---*/ -/*---------------------------------------------*/ - -/*---------------------------------------------*/ -static -__inline__ -void fallbackSimpleSort ( UInt32* fmap, - UInt32* eclass, - Int32 lo, - Int32 hi ) -{ - Int32 i, j, tmp; - UInt32 ec_tmp; - - if (lo == hi) return; - - if (hi - lo > 3) { - for ( i = hi-4; i >= lo; i-- ) { - tmp = fmap[i]; - ec_tmp = eclass[tmp]; - for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) - fmap[j-4] = fmap[j]; - fmap[j-4] = tmp; - } - } - - for ( i = hi-1; i >= lo; i-- ) { - tmp = fmap[i]; - ec_tmp = eclass[tmp]; - for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) - fmap[j-1] = fmap[j]; - fmap[j-1] = tmp; - } -} - - -/*---------------------------------------------*/ -#define fswap(zz1, zz2) \ - { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } - -#define fvswap(zzp1, zzp2, zzn) \ -{ \ - Int32 yyp1 = (zzp1); \ - Int32 yyp2 = (zzp2); \ - Int32 yyn = (zzn); \ - while (yyn > 0) { \ - fswap(fmap[yyp1], fmap[yyp2]); \ - yyp1++; yyp2++; yyn--; \ - } \ -} - - -#define fmin(a,b) ((a) < (b)) ? (a) : (b) - -#define fpush(lz,hz) { stackLo[sp] = lz; \ - stackHi[sp] = hz; \ - sp++; } - -#define fpop(lz,hz) { sp--; \ - lz = stackLo[sp]; \ - hz = stackHi[sp]; } - -#define FALLBACK_QSORT_SMALL_THRESH 10 -#define FALLBACK_QSORT_STACK_SIZE 100 - - -static -void fallbackQSort3 ( UInt32* fmap, - UInt32* eclass, - Int32 loSt, - Int32 hiSt ) -{ - Int32 unLo, unHi, ltLo, gtHi, n, m; - Int32 sp, lo, hi; - UInt32 med, r, r3; - Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; - Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; - - r = 0; - - sp = 0; - fpush ( loSt, hiSt ); - - while (sp > 0) { - - AssertH ( sp < FALLBACK_QSORT_STACK_SIZE - 1, 1004 ); - - fpop ( lo, hi ); - if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { - fallbackSimpleSort ( fmap, eclass, lo, hi ); - continue; - } - - /* Random partitioning. Median of 3 sometimes fails to - avoid bad cases. Median of 9 seems to help but - looks rather expensive. This too seems to work but - is cheaper. Guidance for the magic constants - 7621 and 32768 is taken from Sedgewick's algorithms - book, chapter 35. - */ - r = ((r * 7621) + 1) % 32768; - r3 = r % 3; - if (r3 == 0) med = eclass[fmap[lo]]; else - if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else - med = eclass[fmap[hi]]; - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while (1) { - while (1) { - if (unLo > unHi) break; - n = (Int32)eclass[fmap[unLo]] - (Int32)med; - if (n == 0) { - fswap(fmap[unLo], fmap[ltLo]); - ltLo++; unLo++; - continue; - }; - if (n > 0) break; - unLo++; - } - while (1) { - if (unLo > unHi) break; - n = (Int32)eclass[fmap[unHi]] - (Int32)med; - if (n == 0) { - fswap(fmap[unHi], fmap[gtHi]); - gtHi--; unHi--; - continue; - }; - if (n < 0) break; - unHi--; - } - if (unLo > unHi) break; - fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; - } - - AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); - - if (gtHi < ltLo) continue; - - n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); - m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); - - n = lo + unLo - ltLo - 1; - m = hi - (gtHi - unHi) + 1; - - if (n - lo > hi - m) { - fpush ( lo, n ); - fpush ( m, hi ); - } else { - fpush ( m, hi ); - fpush ( lo, n ); - } - } -} - -#undef fmin -#undef fpush -#undef fpop -#undef fswap -#undef fvswap -#undef FALLBACK_QSORT_SMALL_THRESH -#undef FALLBACK_QSORT_STACK_SIZE - - -/*---------------------------------------------*/ -/* Pre: - nblock > 0 - eclass exists for [0 .. nblock-1] - ((UChar*)eclass) [0 .. nblock-1] holds block - ptr exists for [0 .. nblock-1] - - Post: - ((UChar*)eclass) [0 .. nblock-1] holds block - All other areas of eclass destroyed - fmap [0 .. nblock-1] holds sorted order - bhtab [ 0 .. 2+(nblock/32) ] destroyed -*/ - -#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) -#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) -#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) -#define WORD_BH(zz) bhtab[(zz) >> 5] -#define UNALIGNED_BH(zz) ((zz) & 0x01f) - -static -void fallbackSort ( UInt32* fmap, - UInt32* eclass, - UInt32* bhtab, - Int32 nblock, - Int32 verb ) -{ - Int32 ftab[257]; - Int32 ftabCopy[256]; - Int32 H, i, j, k, l, r, cc, cc1; - Int32 nNotDone; - Int32 nBhtab; - UChar* eclass8 = (UChar*)eclass; - - /*-- - Initial 1-char radix sort to generate - initial fmap and initial BH bits. - --*/ - if (verb >= 4) - VPrintf0 ( " bucket sorting ...\n" ); - for (i = 0; i < 257; i++) ftab[i] = 0; - for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; - for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; - for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; - - for (i = 0; i < nblock; i++) { - j = eclass8[i]; - k = ftab[j] - 1; - ftab[j] = k; - fmap[k] = i; - } - - nBhtab = 2 + (nblock / 32); - for (i = 0; i < nBhtab; i++) bhtab[i] = 0; - for (i = 0; i < 256; i++) SET_BH(ftab[i]); - - /*-- - Inductively refine the buckets. Kind-of an - "exponential radix sort" (!), inspired by the - Manber-Myers suffix array construction algorithm. - --*/ - - /*-- set sentinel bits for block-end detection --*/ - for (i = 0; i < 32; i++) { - SET_BH(nblock + 2*i); - CLEAR_BH(nblock + 2*i + 1); - } - - /*-- the log(N) loop --*/ - H = 1; - while (1) { - - if (verb >= 4) - VPrintf1 ( " depth %6d has ", H ); - - j = 0; - for (i = 0; i < nblock; i++) { - if (ISSET_BH(i)) j = i; - k = fmap[i] - H; if (k < 0) k += nblock; - eclass[k] = j; - } - - nNotDone = 0; - r = -1; - while (1) { - - /*-- find the next non-singleton bucket --*/ - k = r + 1; - while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; - if (ISSET_BH(k)) { - while (WORD_BH(k) == 0xffffffff) k += 32; - while (ISSET_BH(k)) k++; - } - l = k - 1; - if (l >= nblock) break; - while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; - if (!ISSET_BH(k)) { - while (WORD_BH(k) == 0x00000000) k += 32; - while (!ISSET_BH(k)) k++; - } - r = k - 1; - if (r >= nblock) break; - - /*-- now [l, r] bracket current bucket --*/ - if (r > l) { - nNotDone += (r - l + 1); - fallbackQSort3 ( fmap, eclass, l, r ); - - /*-- scan bucket and generate header bits-- */ - cc = -1; - for (i = l; i <= r; i++) { - cc1 = eclass[fmap[i]]; - if (cc != cc1) { SET_BH(i); cc = cc1; }; - } - } - } - - if (verb >= 4) - VPrintf1 ( "%6d unresolved strings\n", nNotDone ); - - H *= 2; - if (H > nblock || nNotDone == 0) break; - } - - /*-- - Reconstruct the original block in - eclass8 [0 .. nblock-1], since the - previous phase destroyed it. - --*/ - if (verb >= 4) - VPrintf0 ( " reconstructing block ...\n" ); - j = 0; - for (i = 0; i < nblock; i++) { - while (ftabCopy[j] == 0) j++; - ftabCopy[j]--; - eclass8[fmap[i]] = (UChar)j; - } - AssertH ( j < 256, 1005 ); -} - -#undef SET_BH -#undef CLEAR_BH -#undef ISSET_BH -#undef WORD_BH -#undef UNALIGNED_BH - - -/*---------------------------------------------*/ -/*--- The main, O(N^2 log(N)) sorting ---*/ -/*--- algorithm. Faster for "normal" ---*/ -/*--- non-repetitive blocks. ---*/ -/*---------------------------------------------*/ - -/*---------------------------------------------*/ -static -__inline__ -Bool mainGtU ( UInt32 i1, - UInt32 i2, - UChar* block, - UInt16* quadrant, - UInt32 nblock, - Int32* budget ) -{ - Int32 k; - UChar c1, c2; - UInt16 s1, s2; - - AssertD ( i1 != i2, "mainGtU" ); - /* 1 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 2 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 3 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 4 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 5 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 6 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 7 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 8 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 9 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 10 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 11 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 12 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - - k = nblock + 8; - - do { - /* 1 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 2 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 3 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 4 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 5 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 6 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 7 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 8 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - - if (i1 >= nblock) i1 -= nblock; - if (i2 >= nblock) i2 -= nblock; - - k -= 8; - (*budget)--; - } - while (k >= 0); - - return False; -} - - -/*---------------------------------------------*/ -/*-- - Knuth's increments seem to work better - than Incerpi-Sedgewick here. Possibly - because the number of elems to sort is - usually small, typically <= 20. ---*/ -static -Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, - 9841, 29524, 88573, 265720, - 797161, 2391484 }; - -static -void mainSimpleSort ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - Int32 nblock, - Int32 lo, - Int32 hi, - Int32 d, - Int32* budget ) -{ - Int32 i, j, h, bigN, hp; - UInt32 v; - - bigN = hi - lo + 1; - if (bigN < 2) return; - - hp = 0; - while (incs[hp] < bigN) hp++; - hp--; - - for (; hp >= 0; hp--) { - h = incs[hp]; - - i = lo + h; - while (True) { - - /*-- copy 1 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - /*-- copy 2 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - /*-- copy 3 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - if (*budget < 0) return; - } - } -} - - -/*---------------------------------------------*/ -/*-- - The following is an implementation of - an elegant 3-way quicksort for strings, - described in a paper "Fast Algorithms for - Sorting and Searching Strings", by Robert - Sedgewick and Jon L. Bentley. ---*/ - -#define mswap(zz1, zz2) \ - { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } - -#define mvswap(zzp1, zzp2, zzn) \ -{ \ - Int32 yyp1 = (zzp1); \ - Int32 yyp2 = (zzp2); \ - Int32 yyn = (zzn); \ - while (yyn > 0) { \ - mswap(ptr[yyp1], ptr[yyp2]); \ - yyp1++; yyp2++; yyn--; \ - } \ -} - -static -__inline__ -UChar mmed3 ( UChar a, UChar b, UChar c ) -{ - UChar t; - if (a > b) { t = a; a = b; b = t; }; - if (b > c) { - b = c; - if (a > b) b = a; - } - return b; -} - -#define mmin(a,b) ((a) < (b)) ? (a) : (b) - -#define mpush(lz,hz,dz) { stackLo[sp] = lz; \ - stackHi[sp] = hz; \ - stackD [sp] = dz; \ - sp++; } - -#define mpop(lz,hz,dz) { sp--; \ - lz = stackLo[sp]; \ - hz = stackHi[sp]; \ - dz = stackD [sp]; } - - -#define mnextsize(az) (nextHi[az]-nextLo[az]) - -#define mnextswap(az,bz) \ - { Int32 tz; \ - tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ - tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ - tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } - - -#define MAIN_QSORT_SMALL_THRESH 20 -#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) -#define MAIN_QSORT_STACK_SIZE 100 - -static -void mainQSort3 ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - Int32 nblock, - Int32 loSt, - Int32 hiSt, - Int32 dSt, - Int32* budget ) -{ - Int32 unLo, unHi, ltLo, gtHi, n, m, med; - Int32 sp, lo, hi, d; - - Int32 stackLo[MAIN_QSORT_STACK_SIZE]; - Int32 stackHi[MAIN_QSORT_STACK_SIZE]; - Int32 stackD [MAIN_QSORT_STACK_SIZE]; - - Int32 nextLo[3]; - Int32 nextHi[3]; - Int32 nextD [3]; - - sp = 0; - mpush ( loSt, hiSt, dSt ); - - while (sp > 0) { - - AssertH ( sp < MAIN_QSORT_STACK_SIZE - 2, 1001 ); - - mpop ( lo, hi, d ); - if (hi - lo < MAIN_QSORT_SMALL_THRESH || - d > MAIN_QSORT_DEPTH_THRESH) { - mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); - if (*budget < 0) return; - continue; - } - - med = (Int32) - mmed3 ( block[ptr[ lo ]+d], - block[ptr[ hi ]+d], - block[ptr[ (lo+hi)>>1 ]+d] ); - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while (True) { - while (True) { - if (unLo > unHi) break; - n = ((Int32)block[ptr[unLo]+d]) - med; - if (n == 0) { - mswap(ptr[unLo], ptr[ltLo]); - ltLo++; unLo++; continue; - }; - if (n > 0) break; - unLo++; - } - while (True) { - if (unLo > unHi) break; - n = ((Int32)block[ptr[unHi]+d]) - med; - if (n == 0) { - mswap(ptr[unHi], ptr[gtHi]); - gtHi--; unHi--; continue; - }; - if (n < 0) break; - unHi--; - } - if (unLo > unHi) break; - mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; - } - - AssertD ( unHi == unLo-1, "mainQSort3(2)" ); - - if (gtHi < ltLo) { - mpush(lo, hi, d+1 ); - continue; - } - - n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); - m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); - - n = lo + unLo - ltLo - 1; - m = hi - (gtHi - unHi) + 1; - - nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; - nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; - nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; - - if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); - if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); - if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); - - AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); - AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); - - mpush (nextLo[0], nextHi[0], nextD[0]); - mpush (nextLo[1], nextHi[1], nextD[1]); - mpush (nextLo[2], nextHi[2], nextD[2]); - } -} - -#undef mswap -#undef mvswap -#undef mpush -#undef mpop -#undef mmin -#undef mnextsize -#undef mnextswap -#undef MAIN_QSORT_SMALL_THRESH -#undef MAIN_QSORT_DEPTH_THRESH -#undef MAIN_QSORT_STACK_SIZE - - -/*---------------------------------------------*/ -/* Pre: - nblock > N_OVERSHOOT - block32 exists for [0 .. nblock-1 +N_OVERSHOOT] - ((UChar*)block32) [0 .. nblock-1] holds block - ptr exists for [0 .. nblock-1] - - Post: - ((UChar*)block32) [0 .. nblock-1] holds block - All other areas of block32 destroyed - ftab [0 .. 65536 ] destroyed - ptr [0 .. nblock-1] holds sorted order - if (*budget < 0), sorting was abandoned -*/ - -#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) -#define SETMASK (1 << 21) -#define CLEARMASK (~(SETMASK)) - -static -void mainSort ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - UInt32* ftab, - Int32 nblock, - Int32 verb, - Int32* budget ) -{ - Int32 i, j, k, ss, sb; - Int32 runningOrder[256]; - Bool bigDone[256]; - Int32 copyStart[256]; - Int32 copyEnd [256]; - UChar c1; - Int32 numQSorted; - UInt16 s; - if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); - - /*-- set up the 2-byte frequency table --*/ - for (i = 65536; i >= 0; i--) ftab[i] = 0; - - j = block[0] << 8; - i = nblock-1; - for (; i >= 3; i -= 4) { - quadrant[i] = 0; - j = (j >> 8) | ( ((UInt16)block[i]) << 8); - ftab[j]++; - quadrant[i-1] = 0; - j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); - ftab[j]++; - quadrant[i-2] = 0; - j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); - ftab[j]++; - quadrant[i-3] = 0; - j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); - ftab[j]++; - } - for (; i >= 0; i--) { - quadrant[i] = 0; - j = (j >> 8) | ( ((UInt16)block[i]) << 8); - ftab[j]++; - } - - /*-- (emphasises close relationship of block & quadrant) --*/ - for (i = 0; i < BZ_N_OVERSHOOT; i++) { - block [nblock+i] = block[i]; - quadrant[nblock+i] = 0; - } - - if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); - - /*-- Complete the initial radix sort --*/ - for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; - - s = block[0] << 8; - i = nblock-1; - for (; i >= 3; i -= 4) { - s = (s >> 8) | (block[i] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i; - s = (s >> 8) | (block[i-1] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-1; - s = (s >> 8) | (block[i-2] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-2; - s = (s >> 8) | (block[i-3] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-3; - } - for (; i >= 0; i--) { - s = (s >> 8) | (block[i] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i; - } - - /*-- - Now ftab contains the first loc of every small bucket. - Calculate the running order, from smallest to largest - big bucket. - --*/ - for (i = 0; i <= 255; i++) { - bigDone [i] = False; - runningOrder[i] = i; - } - - { - Int32 vv; - Int32 h = 1; - do h = 3 * h + 1; while (h <= 256); - do { - h = h / 3; - for (i = h; i <= 255; i++) { - vv = runningOrder[i]; - j = i; - while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { - runningOrder[j] = runningOrder[j-h]; - j = j - h; - if (j <= (h - 1)) goto zero; - } - zero: - runningOrder[j] = vv; - } - } while (h != 1); - } - - /*-- - The main sorting loop. - --*/ - - numQSorted = 0; - - for (i = 0; i <= 255; i++) { - - /*-- - Process big buckets, starting with the least full. - Basically this is a 3-step process in which we call - mainQSort3 to sort the small buckets [ss, j], but - also make a big effort to avoid the calls if we can. - --*/ - ss = runningOrder[i]; - - /*-- - Step 1: - Complete the big bucket [ss] by quicksorting - any unsorted small buckets [ss, j], for j != ss. - Hopefully previous pointer-scanning phases have already - completed many of the small buckets [ss, j], so - we don't have to sort them at all. - --*/ - for (j = 0; j <= 255; j++) { - if (j != ss) { - sb = (ss << 8) + j; - if ( ! (ftab[sb] & SETMASK) ) { - Int32 lo = ftab[sb] & CLEARMASK; - Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; - if (hi > lo) { - if (verb >= 4) - VPrintf4 ( " qsort [0x%x, 0x%x] " - "done %d this %d\n", - ss, j, numQSorted, hi - lo + 1 ); - mainQSort3 ( - ptr, block, quadrant, nblock, - lo, hi, BZ_N_RADIX, budget - ); - numQSorted += (hi - lo + 1); - if (*budget < 0) return; - } - } - ftab[sb] |= SETMASK; - } - } - - AssertH ( !bigDone[ss], 1006 ); - - /*-- - Step 2: - Now scan this big bucket [ss] so as to synthesise the - sorted order for small buckets [t, ss] for all t, - including, magically, the bucket [ss,ss] too. - This will avoid doing Real Work in subsequent Step 1's. - --*/ - { - for (j = 0; j <= 255; j++) { - copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; - copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; - } - for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { - k = ptr[j]-1; if (k < 0) k += nblock; - c1 = block[k]; - if (!bigDone[c1]) - ptr[ copyStart[c1]++ ] = k; - } - for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { - k = ptr[j]-1; if (k < 0) k += nblock; - c1 = block[k]; - if (!bigDone[c1]) - ptr[ copyEnd[c1]-- ] = k; - } - } - - AssertH ( (copyStart[ss]-1 == copyEnd[ss]) - || - /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1. - Necessity for this case is demonstrated by compressing - a sequence of approximately 48.5 million of character - 251; 1.0.0/1.0.1 will then die here. */ - (copyStart[ss] == 0 && copyEnd[ss] == nblock-1), - 1007 ) - - for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; - - /*-- - Step 3: - The [ss] big bucket is now done. Record this fact, - and update the quadrant descriptors. Remember to - update quadrants in the overshoot area too, if - necessary. The "if (i < 255)" test merely skips - this updating for the last bucket processed, since - updating for the last bucket is pointless. - - The quadrant array provides a way to incrementally - cache sort orderings, as they appear, so as to - make subsequent comparisons in fullGtU() complete - faster. For repetitive blocks this makes a big - difference (but not big enough to be able to avoid - the fallback sorting mechanism, exponential radix sort). - - The precise meaning is: at all times: - - for 0 <= i < nblock and 0 <= j <= nblock - - if block[i] != block[j], - - then the relative values of quadrant[i] and - quadrant[j] are meaningless. - - else { - if quadrant[i] < quadrant[j] - then the string starting at i lexicographically - precedes the string starting at j - - else if quadrant[i] > quadrant[j] - then the string starting at j lexicographically - precedes the string starting at i - - else - the relative ordering of the strings starting - at i and j has not yet been determined. - } - --*/ - bigDone[ss] = True; - - if (i < 255) { - Int32 bbStart = ftab[ss << 8] & CLEARMASK; - Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; - Int32 shifts = 0; - - while ((bbSize >> shifts) > 65534) shifts++; - - for (j = bbSize-1; j >= 0; j--) { - Int32 a2update = ptr[bbStart + j]; - UInt16 qVal = (UInt16)(j >> shifts); - quadrant[a2update] = qVal; - if (a2update < BZ_N_OVERSHOOT) - quadrant[a2update + nblock] = qVal; - } - AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); - } - - } - - if (verb >= 4) - VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", - nblock, numQSorted, nblock - numQSorted ); -} - -#undef BIGFREQ -#undef SETMASK -#undef CLEARMASK - - -/*---------------------------------------------*/ -/* Pre: - nblock > 0 - arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] - ((UChar*)arr2) [0 .. nblock-1] holds block - arr1 exists for [0 .. nblock-1] - - Post: - ((UChar*)arr2) [0 .. nblock-1] holds block - All other areas of block destroyed - ftab [ 0 .. 65536 ] destroyed - arr1 [0 .. nblock-1] holds sorted order -*/ -void BZ2_blockSort ( EState* s ) -{ - UInt32* ptr = s->ptr; - UChar* block = s->block; - UInt32* ftab = s->ftab; - Int32 nblock = s->nblock; - Int32 verb = s->verbosity; - Int32 wfact = s->workFactor; - UInt16* quadrant; - Int32 budget; - Int32 budgetInit; - Int32 i; - - if (nblock < 10000) { - fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); - } else { - /* Calculate the location for quadrant, remembering to get - the alignment right. Assumes that &(block[0]) is at least - 2-byte aligned -- this should be ok since block is really - the first section of arr2. - */ - i = nblock+BZ_N_OVERSHOOT; - if (i & 1) i++; - quadrant = (UInt16*)(&(block[i])); - - /* (wfact-1) / 3 puts the default-factor-30 - transition point at very roughly the same place as - with v0.1 and v0.9.0. - Not that it particularly matters any more, since the - resulting compressed stream is now the same regardless - of whether or not we use the main sort or fallback sort. - */ - if (wfact < 1 ) wfact = 1; - if (wfact > 100) wfact = 100; - budgetInit = nblock * ((wfact-1) / 3); - budget = budgetInit; - - mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); - if (verb >= 3) - VPrintf3 ( " %d work, %d block, ratio %5.2f\n", - budgetInit - budget, - nblock, - (float)(budgetInit - budget) / - (float)(nblock==0 ? 1 : nblock) ); - if (budget < 0) { - if (verb >= 2) - VPrintf0 ( " too repetitive; using fallback" - " sorting algorithm\n" ); - fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); - } - } - - s->origPtr = -1; - for (i = 0; i < s->nblock; i++) - if (ptr[i] == 0) - { s->origPtr = i; break; }; - - AssertH( s->origPtr != -1, 1003 ); -} - - -/*-------------------------------------------------------------*/ -/*--- end blocksort.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/bzlib.c b/game/client/third/minizip/lib/bzip2/bzlib.c deleted file mode 100755 index bd358a79..00000000 --- a/game/client/third/minizip/lib/bzip2/bzlib.c +++ /dev/null @@ -1,1572 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Library top-level functions. ---*/ -/*--- bzlib.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - -/* CHANGES - 0.9.0 -- original version. - 0.9.0a/b -- no changes in this file. - 0.9.0c -- made zero-length BZ_FLUSH work correctly in bzCompress(). - fixed bzWrite/bzRead to ignore zero-length requests. - fixed bzread to correctly handle read requests after EOF. - wrong parameter order in call to bzDecompressInit in - bzBuffToBuffDecompress. Fixed. -*/ - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -/*--- Compression stuff ---*/ -/*---------------------------------------------------*/ - - -/*---------------------------------------------------*/ -#ifndef BZ_NO_STDIO -void BZ2_bz__AssertH__fail ( int errcode ) -{ - fprintf(stderr, - "\n\nbzip2/libbzip2: internal error number %d.\n" - "This is a bug in bzip2/libbzip2, %s.\n" - "Please report it to me at: jseward@bzip.org. If this happened\n" - "when you were using some program which uses libbzip2 as a\n" - "component, you should also report this bug to the author(s)\n" - "of that program. Please make an effort to report this bug;\n" - "timely and accurate bug reports eventually lead to higher\n" - "quality software. Thanks. Julian Seward, 10 December 2007.\n\n", - errcode, - BZ2_bzlibVersion() - ); - - if (errcode == 1007) { - fprintf(stderr, - "\n*** A special note about internal error number 1007 ***\n" - "\n" - "Experience suggests that a common cause of i.e. 1007\n" - "is unreliable memory or other hardware. The 1007 assertion\n" - "just happens to cross-check the results of huge numbers of\n" - "memory reads/writes, and so acts (unintendedly) as a stress\n" - "test of your memory system.\n" - "\n" - "I suggest the following: try compressing the file again,\n" - "possibly monitoring progress in detail with the -vv flag.\n" - "\n" - "* If the error cannot be reproduced, and/or happens at different\n" - " points in compression, you may have a flaky memory system.\n" - " Try a memory-test program. I have used Memtest86\n" - " (www.memtest86.com). At the time of writing it is free (GPLd).\n" - " Memtest86 tests memory much more thorougly than your BIOSs\n" - " power-on test, and may find failures that the BIOS doesn't.\n" - "\n" - "* If the error can be repeatably reproduced, this is a bug in\n" - " bzip2, and I would very much like to hear about it. Please\n" - " let me know, and, ideally, save a copy of the file causing the\n" - " problem -- without which I will be unable to investigate it.\n" - "\n" - ); - } - - exit(3); -} -#endif - - -/*---------------------------------------------------*/ -static -int bz_config_ok ( void ) -{ - if (sizeof(int) != 4) return 0; - if (sizeof(short) != 2) return 0; - if (sizeof(char) != 1) return 0; - return 1; -} - - -/*---------------------------------------------------*/ -static -void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) -{ - void* v = malloc ( items * size ); - return v; -} - -static -void default_bzfree ( void* opaque, void* addr ) -{ - if (addr != NULL) free ( addr ); -} - - -/*---------------------------------------------------*/ -static -void prepare_new_block ( EState* s ) -{ - Int32 i; - s->nblock = 0; - s->numZ = 0; - s->state_out_pos = 0; - BZ_INITIALISE_CRC ( s->blockCRC ); - for (i = 0; i < 256; i++) s->inUse[i] = False; - s->blockNo++; -} - - -/*---------------------------------------------------*/ -static -void init_RL ( EState* s ) -{ - s->state_in_ch = 256; - s->state_in_len = 0; -} - - -static -Bool isempty_RL ( EState* s ) -{ - if (s->state_in_ch < 256 && s->state_in_len > 0) - return False; else - return True; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompressInit) - ( bz_stream* strm, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 n; - EState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL || - blockSize100k < 1 || blockSize100k > 9 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(EState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - - s->arr1 = NULL; - s->arr2 = NULL; - s->ftab = NULL; - - n = 100000 * blockSize100k; - s->arr1 = BZALLOC( n * sizeof(UInt32) ); - s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); - s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); - - if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - if (s != NULL) BZFREE(s); - return BZ_MEM_ERROR; - } - - s->blockNo = 0; - s->state = BZ_S_INPUT; - s->mode = BZ_M_RUNNING; - s->combinedCRC = 0; - s->blockSize100k = blockSize100k; - s->nblockMAX = 100000 * blockSize100k - 19; - s->verbosity = verbosity; - s->workFactor = workFactor; - - s->block = (UChar*)s->arr2; - s->mtfv = (UInt16*)s->arr1; - s->zbits = NULL; - s->ptr = (UInt32*)s->arr1; - - strm->state = s; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - init_RL ( s ); - prepare_new_block ( s ); - return BZ_OK; -} - - -/*---------------------------------------------------*/ -static -void add_pair_to_block ( EState* s ) -{ - Int32 i; - UChar ch = (UChar)(s->state_in_ch); - for (i = 0; i < s->state_in_len; i++) { - BZ_UPDATE_CRC( s->blockCRC, ch ); - } - s->inUse[s->state_in_ch] = True; - switch (s->state_in_len) { - case 1: - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 2: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 3: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - default: - s->inUse[s->state_in_len-4] = True; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = ((UChar)(s->state_in_len-4)); - s->nblock++; - break; - } -} - - -/*---------------------------------------------------*/ -static -void flush_RL ( EState* s ) -{ - if (s->state_in_ch < 256) add_pair_to_block ( s ); - init_RL ( s ); -} - - -/*---------------------------------------------------*/ -#define ADD_CHAR_TO_BLOCK(zs,zchh0) \ -{ \ - UInt32 zchh = (UInt32)(zchh0); \ - /*-- fast track the common case --*/ \ - if (zchh != zs->state_in_ch && \ - zs->state_in_len == 1) { \ - UChar ch = (UChar)(zs->state_in_ch); \ - BZ_UPDATE_CRC( zs->blockCRC, ch ); \ - zs->inUse[zs->state_in_ch] = True; \ - zs->block[zs->nblock] = (UChar)ch; \ - zs->nblock++; \ - zs->state_in_ch = zchh; \ - } \ - else \ - /*-- general, uncommon cases --*/ \ - if (zchh != zs->state_in_ch || \ - zs->state_in_len == 255) { \ - if (zs->state_in_ch < 256) \ - add_pair_to_block ( zs ); \ - zs->state_in_ch = zchh; \ - zs->state_in_len = 1; \ - } else { \ - zs->state_in_len++; \ - } \ -} - - -/*---------------------------------------------------*/ -static -Bool copy_input_until_stop ( EState* s ) -{ - Bool progress_in = False; - - if (s->mode == BZ_M_RUNNING) { - - /*-- fast track the common case --*/ - while (True) { - /*-- block full? --*/ - if (s->nblock >= s->nblockMAX) break; - /*-- no input? --*/ - if (s->strm->avail_in == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - } - - } else { - - /*-- general, uncommon case --*/ - while (True) { - /*-- block full? --*/ - if (s->nblock >= s->nblockMAX) break; - /*-- no input? --*/ - if (s->strm->avail_in == 0) break; - /*-- flush/finish end? --*/ - if (s->avail_in_expect == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - s->avail_in_expect--; - } - } - return progress_in; -} - - -/*---------------------------------------------------*/ -static -Bool copy_output_until_stop ( EState* s ) -{ - Bool progress_out = False; - - while (True) { - - /*-- no output space? --*/ - if (s->strm->avail_out == 0) break; - - /*-- block done? --*/ - if (s->state_out_pos >= s->numZ) break; - - progress_out = True; - *(s->strm->next_out) = s->zbits[s->state_out_pos]; - s->state_out_pos++; - s->strm->avail_out--; - s->strm->next_out++; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - return progress_out; -} - - -/*---------------------------------------------------*/ -static -Bool handle_compress ( bz_stream* strm ) -{ - Bool progress_in = False; - Bool progress_out = False; - EState* s = strm->state; - - while (True) { - - if (s->state == BZ_S_OUTPUT) { - progress_out |= copy_output_until_stop ( s ); - if (s->state_out_pos < s->numZ) break; - if (s->mode == BZ_M_FINISHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - prepare_new_block ( s ); - s->state = BZ_S_INPUT; - if (s->mode == BZ_M_FLUSHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - } - - if (s->state == BZ_S_INPUT) { - progress_in |= copy_input_until_stop ( s ); - if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { - flush_RL ( s ); - BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); - s->state = BZ_S_OUTPUT; - } - else - if (s->nblock >= s->nblockMAX) { - BZ2_compressBlock ( s, False ); - s->state = BZ_S_OUTPUT; - } - else - if (s->strm->avail_in == 0) { - break; - } - } - - } - - return progress_in || progress_out; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) -{ - Bool progress; - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - preswitch: - switch (s->mode) { - - case BZ_M_IDLE: - return BZ_SEQUENCE_ERROR; - - case BZ_M_RUNNING: - if (action == BZ_RUN) { - progress = handle_compress ( strm ); - return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; - } - else - if (action == BZ_FLUSH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FLUSHING; - goto preswitch; - } - else - if (action == BZ_FINISH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FINISHING; - goto preswitch; - } - else - return BZ_PARAM_ERROR; - - case BZ_M_FLUSHING: - if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FLUSH_OK; - s->mode = BZ_M_RUNNING; - return BZ_RUN_OK; - - case BZ_M_FINISHING: - if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (!progress) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FINISH_OK; - s->mode = BZ_M_IDLE; - return BZ_STREAM_END; - } - return BZ_OK; /*--not reached--*/ -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) -{ - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - BZFREE(strm->state); - - strm->state = NULL; - - return BZ_OK; -} - - -/*---------------------------------------------------*/ -/*--- Decompression stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressInit) - ( bz_stream* strm, - int verbosity, - int small ) -{ - DState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL) return BZ_PARAM_ERROR; - if (small != 0 && small != 1) return BZ_PARAM_ERROR; - if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; - - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(DState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - strm->state = s; - s->state = BZ_X_MAGIC_1; - s->bsLive = 0; - s->bsBuff = 0; - s->calculatedCombinedCRC = 0; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - s->smallDecompress = (Bool)small; - s->ll4 = NULL; - s->ll16 = NULL; - s->tt = NULL; - s->currBlockNo = 0; - s->verbosity = verbosity; - - return BZ_OK; -} - - -/*---------------------------------------------------*/ -/* Return True iff data corruption is discovered. - Returns False if there is no problem. -*/ -static -Bool unRLE_obuf_to_output_FAST ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return False; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return False; - - /* Only caused by corrupt data stream? */ - if (s->nblock_used > s->save_nblock+1) - return True; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - /* restore */ - UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; - UChar c_state_out_ch = s->state_out_ch; - Int32 c_state_out_len = s->state_out_len; - Int32 c_nblock_used = s->nblock_used; - Int32 c_k0 = s->k0; - UInt32* c_tt = s->tt; - UInt32 c_tPos = s->tPos; - char* cs_next_out = s->strm->next_out; - unsigned int cs_avail_out = s->strm->avail_out; - Int32 ro_blockSize100k = s->blockSize100k; - /* end restore */ - - UInt32 avail_out_INIT = cs_avail_out; - Int32 s_save_nblockPP = s->save_nblock+1; - unsigned int total_out_lo32_old; - - while (True) { - - /* try to finish existing run */ - if (c_state_out_len > 0) { - while (True) { - if (cs_avail_out == 0) goto return_notr; - if (c_state_out_len == 1) break; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - c_state_out_len--; - cs_next_out++; - cs_avail_out--; - } - s_state_out_len_eq_one: - { - if (cs_avail_out == 0) { - c_state_out_len = 1; goto return_notr; - }; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - cs_next_out++; - cs_avail_out--; - } - } - /* Only caused by corrupt data stream? */ - if (c_nblock_used > s_save_nblockPP) - return True; - - /* can a new run be started? */ - if (c_nblock_used == s_save_nblockPP) { - c_state_out_len = 0; goto return_notr; - }; - c_state_out_ch = c_k0; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (k1 != c_k0) { - c_k0 = k1; goto s_state_out_len_eq_one; - }; - if (c_nblock_used == s_save_nblockPP) - goto s_state_out_len_eq_one; - - c_state_out_len = 2; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - c_state_out_len = 3; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - BZ_GET_FAST_C(k1); c_nblock_used++; - c_state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST_C(c_k0); c_nblock_used++; - } - - return_notr: - total_out_lo32_old = s->strm->total_out_lo32; - s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); - if (s->strm->total_out_lo32 < total_out_lo32_old) - s->strm->total_out_hi32++; - - /* save */ - s->calculatedBlockCRC = c_calculatedBlockCRC; - s->state_out_ch = c_state_out_ch; - s->state_out_len = c_state_out_len; - s->nblock_used = c_nblock_used; - s->k0 = c_k0; - s->tt = c_tt; - s->tPos = c_tPos; - s->strm->next_out = cs_next_out; - s->strm->avail_out = cs_avail_out; - /* end save */ - } - return False; -} - - - -/*---------------------------------------------------*/ -__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) -{ - Int32 nb, na, mid; - nb = 0; - na = 256; - do { - mid = (nb + na) >> 1; - if (indx >= cftab[mid]) nb = mid; else na = mid; - } - while (na - nb != 1); - return nb; -} - - -/*---------------------------------------------------*/ -/* Return True iff data corruption is discovered. - Returns False if there is no problem. -*/ -static -Bool unRLE_obuf_to_output_SMALL ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return False; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return False; - - /* Only caused by corrupt data stream? */ - if (s->nblock_used > s->save_nblock+1) - return True; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return False; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return False; - - /* Only caused by corrupt data stream? */ - if (s->nblock_used > s->save_nblock+1) - return True; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) -{ - Bool corrupt; - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - while (True) { - if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; - if (s->state == BZ_X_OUTPUT) { - if (s->smallDecompress) - corrupt = unRLE_obuf_to_output_SMALL ( s ); else - corrupt = unRLE_obuf_to_output_FAST ( s ); - if (corrupt) return BZ_DATA_ERROR; - if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { - BZ_FINALISE_CRC ( s->calculatedBlockCRC ); - if (s->verbosity >= 3) - VPrintf2 ( " {0x%08x, 0x%08x}", s->storedBlockCRC, - s->calculatedBlockCRC ); - if (s->verbosity >= 2) VPrintf0 ( "]" ); - if (s->calculatedBlockCRC != s->storedBlockCRC) - return BZ_DATA_ERROR; - s->calculatedCombinedCRC - = (s->calculatedCombinedCRC << 1) | - (s->calculatedCombinedCRC >> 31); - s->calculatedCombinedCRC ^= s->calculatedBlockCRC; - s->state = BZ_X_BLKHDR_1; - } else { - return BZ_OK; - } - } - if (s->state >= BZ_X_MAGIC_1) { - Int32 r = BZ2_decompress ( s ); - if (r == BZ_STREAM_END) { - if (s->verbosity >= 3) - VPrintf2 ( "\n combined CRCs: stored = 0x%08x, computed = 0x%08x", - s->storedCombinedCRC, s->calculatedCombinedCRC ); - if (s->calculatedCombinedCRC != s->storedCombinedCRC) - return BZ_DATA_ERROR; - return r; - } - if (s->state != BZ_X_OUTPUT) return r; - } - } - - AssertH ( 0, 6001 ); - - return 0; /*NOTREACHED*/ -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) -{ - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->tt != NULL) BZFREE(s->tt); - if (s->ll16 != NULL) BZFREE(s->ll16); - if (s->ll4 != NULL) BZFREE(s->ll4); - - BZFREE(strm->state); - strm->state = NULL; - - return BZ_OK; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ -/*--- File I/O stuff ---*/ -/*---------------------------------------------------*/ - -#define BZ_SETERR(eee) \ -{ \ - if (bzerror != NULL) *bzerror = eee; \ - if (bzf != NULL) bzf->lastErr = eee; \ -} - -typedef - struct { - FILE* handle; - Char buf[BZ_MAX_UNUSED]; - Int32 bufN; - Bool writing; - bz_stream strm; - Int32 lastErr; - Bool initialisedOk; - } - bzFile; - - -/*---------------------------------------------*/ -static Bool myfeof ( FILE* f ) -{ - Int32 c = fgetc ( f ); - if (c == EOF) return True; - ungetc ( c, f ); - return False; -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzWriteOpen) - ( int* bzerror, - FILE* f, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 ret; - bzFile* bzf = NULL; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (blockSize100k < 1 || blockSize100k > 9) || - (workFactor < 0 || workFactor > 250) || - (verbosity < 0 || verbosity > 4)) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - bzf->initialisedOk = False; - bzf->bufN = 0; - bzf->handle = f; - bzf->writing = True; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - if (workFactor == 0) workFactor = 30; - ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = 0; - bzf->initialisedOk = True; - return bzf; -} - - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWrite) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return; }; - - bzf->strm.avail_in = len; - bzf->strm.next_in = buf; - - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); - if (ret != BZ_RUN_OK) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (bzf->strm.avail_in == 0) - { BZ_SETERR(BZ_OK); return; }; - } -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWriteClose) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in, - unsigned int* nbytes_out ) -{ - BZ2_bzWriteClose64 ( bzerror, b, abandon, - nbytes_in, NULL, nbytes_out, NULL ); -} - - -void BZ_API(BZ2_bzWriteClose64) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in_lo32, - unsigned int* nbytes_in_hi32, - unsigned int* nbytes_out_lo32, - unsigned int* nbytes_out_hi32 ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; - if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; - if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; - if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; - - if ((!abandon) && bzf->lastErr == BZ_OK) { - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); - if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (ret == BZ_STREAM_END) break; - } - } - - if ( !abandon && !ferror ( bzf->handle ) ) { - fflush ( bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (nbytes_in_lo32 != NULL) - *nbytes_in_lo32 = bzf->strm.total_in_lo32; - if (nbytes_in_hi32 != NULL) - *nbytes_in_hi32 = bzf->strm.total_in_hi32; - if (nbytes_out_lo32 != NULL) - *nbytes_out_lo32 = bzf->strm.total_out_lo32; - if (nbytes_out_hi32 != NULL) - *nbytes_out_hi32 = bzf->strm.total_out_hi32; - - BZ_SETERR(BZ_OK); - BZ2_bzCompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzReadOpen) - ( int* bzerror, - FILE* f, - int verbosity, - int small, - void* unused, - int nUnused ) -{ - bzFile* bzf = NULL; - int ret; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (small != 0 && small != 1) || - (verbosity < 0 || verbosity > 4) || - (unused == NULL && nUnused != 0) || - (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - - bzf->initialisedOk = False; - bzf->handle = f; - bzf->bufN = 0; - bzf->writing = False; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - while (nUnused > 0) { - bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; - unused = ((void*)( 1 + ((UChar*)(unused)) )); - nUnused--; - } - - ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - - bzf->initialisedOk = True; - return bzf; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) -{ - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - - if (bzf->initialisedOk) - (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzRead) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return 0; }; - - bzf->strm.avail_out = len; - bzf->strm.next_out = buf; - - while (True) { - - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - - if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { - n = fread ( bzf->buf, sizeof(UChar), - BZ_MAX_UNUSED, bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - bzf->bufN = n; - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - } - - ret = BZ2_bzDecompress ( &(bzf->strm) ); - - if (ret != BZ_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return 0; }; - - if (ret == BZ_OK && myfeof(bzf->handle) && - bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) - { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; - - if (ret == BZ_STREAM_END) - { BZ_SETERR(BZ_STREAM_END); - return len - bzf->strm.avail_out; }; - if (bzf->strm.avail_out == 0) - { BZ_SETERR(BZ_OK); return len; }; - - } - - return 0; /*not reached*/ -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadGetUnused) - ( int* bzerror, - BZFILE* b, - void** unused, - int* nUnused ) -{ - bzFile* bzf = (bzFile*)b; - if (bzf == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (bzf->lastErr != BZ_STREAM_END) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (unused == NULL || nUnused == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - - BZ_SETERR(BZ_OK); - *nUnused = bzf->strm.avail_in; - *unused = bzf->strm.next_in; -} -#endif - - -/*---------------------------------------------------*/ -/*--- Misc convenience stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzBuffToBuffCompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int blockSize100k, - int verbosity, - int workFactor ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - blockSize100k < 1 || blockSize100k > 9 || - verbosity < 0 || verbosity > 4 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzCompressInit ( &strm, blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzCompress ( &strm, BZ_FINISH ); - if (ret == BZ_FINISH_OK) goto output_overflow; - if (ret != BZ_STREAM_END) goto errhandler; - - /* normal termination */ - *destLen -= strm.avail_out; - BZ2_bzCompressEnd ( &strm ); - return BZ_OK; - - output_overflow: - BZ2_bzCompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - - errhandler: - BZ2_bzCompressEnd ( &strm ); - return ret; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzBuffToBuffDecompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int small, - int verbosity ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - (small != 0 && small != 1) || - verbosity < 0 || verbosity > 4) - return BZ_PARAM_ERROR; - - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzDecompress ( &strm ); - if (ret == BZ_OK) goto output_overflow_or_eof; - if (ret != BZ_STREAM_END) goto errhandler; - - /* normal termination */ - *destLen -= strm.avail_out; - BZ2_bzDecompressEnd ( &strm ); - return BZ_OK; - - output_overflow_or_eof: - if (strm.avail_out > 0) { - BZ2_bzDecompressEnd ( &strm ); - return BZ_UNEXPECTED_EOF; - } else { - BZ2_bzDecompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - }; - - errhandler: - BZ2_bzDecompressEnd ( &strm ); - return ret; -} - - -/*---------------------------------------------------*/ -/*-- - Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) - to support better zlib compatibility. - This code is not _officially_ part of libbzip2 (yet); - I haven't tested it, documented it, or considered the - threading-safeness of it. - If this code breaks, please contact both Yoshioka and me. ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -/*-- - return version like "0.9.5d, 4-Sept-1999". ---*/ -const char * BZ_API(BZ2_bzlibVersion)(void) -{ - return BZ_VERSION; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ - -#if defined(_WIN32) || defined(OS2) || defined(MSDOS) -# include -# include -# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) -#else -# define SET_BINARY_MODE(file) -#endif -static -BZFILE * bzopen_or_bzdopen - ( const char *path, /* no use when bzdopen */ - int fd, /* no use when bzdopen */ - const char *mode, - int open_mode) /* bzopen: 0, bzdopen:1 */ -{ - int bzerr; - char unused[BZ_MAX_UNUSED]; - int blockSize100k = 9; - int writing = 0; - char mode2[10] = ""; - FILE *fp = NULL; - BZFILE *bzfp = NULL; - int verbosity = 0; - int workFactor = 30; - int smallMode = 0; - int nUnused = 0; - - if (mode == NULL) return NULL; - while (*mode) { - switch (*mode) { - case 'r': - writing = 0; break; - case 'w': - writing = 1; break; - case 's': - smallMode = 1; break; - default: - if (isdigit((int)(*mode))) { - blockSize100k = *mode-BZ_HDR_0; - } - } - mode++; - } - strcat(mode2, writing ? "w" : "r" ); - strcat(mode2,"b"); /* binary mode */ - - if (open_mode==0) { - if (path==NULL || strcmp(path,"")==0) { - fp = (writing ? stdout : stdin); - SET_BINARY_MODE(fp); - } else { - fp = fopen(path,mode2); - } - } else { -#ifdef BZ_STRICT_ANSI - fp = NULL; -#else - fp = fdopen(fd,mode2); -#endif - } - if (fp == NULL) return NULL; - - if (writing) { - /* Guard against total chaos and anarchy -- JRS */ - if (blockSize100k < 1) blockSize100k = 1; - if (blockSize100k > 9) blockSize100k = 9; - bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, - verbosity,workFactor); - } else { - bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, - unused,nUnused); - } - if (bzfp == NULL) { - if (fp != stdin && fp != stdout) fclose(fp); - return NULL; - } - return bzfp; -} - - -/*---------------------------------------------------*/ -/*-- - open file for read or write. - ex) bzopen("file","w9") - case path="" or NULL => use stdin or stdout. ---*/ -BZFILE * BZ_API(BZ2_bzopen) - ( const char *path, - const char *mode ) -{ - return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); -} - - -/*---------------------------------------------------*/ -BZFILE * BZ_API(BZ2_bzdopen) - ( int fd, - const char *mode ) -{ - return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) -{ - int bzerr, nread; - if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; - nread = BZ2_bzRead(&bzerr,b,buf,len); - if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { - return nread; - } else { - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) -{ - int bzerr; - - BZ2_bzWrite(&bzerr,b,buf,len); - if(bzerr == BZ_OK){ - return len; - }else{ - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzflush) (BZFILE *b) -{ - /* do nothing now... */ - return 0; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzclose) (BZFILE* b) -{ - int bzerr; - FILE *fp; - - if (b==NULL) {return;} - fp = ((bzFile *)b)->handle; - if(((bzFile*)b)->writing){ - BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); - if(bzerr != BZ_OK){ - BZ2_bzWriteClose(NULL,b,1,NULL,NULL); - } - }else{ - BZ2_bzReadClose(&bzerr,b); - } - if(fp!=stdin && fp!=stdout){ - fclose(fp); - } -} - - -/*---------------------------------------------------*/ -/*-- - return last error code ---*/ -static const char *bzerrorstrings[] = { - "OK" - ,"SEQUENCE_ERROR" - ,"PARAM_ERROR" - ,"MEM_ERROR" - ,"DATA_ERROR" - ,"DATA_ERROR_MAGIC" - ,"IO_ERROR" - ,"UNEXPECTED_EOF" - ,"OUTBUFF_FULL" - ,"CONFIG_ERROR" - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ -}; - - -const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) -{ - int err = ((bzFile *)b)->lastErr; - - if(err>0) err = 0; - *errnum = err; - return bzerrorstrings[err*-1]; -} -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/bzlib.h b/game/client/third/minizip/lib/bzip2/bzlib.h deleted file mode 100755 index 8277123d..00000000 --- a/game/client/third/minizip/lib/bzip2/bzlib.h +++ /dev/null @@ -1,282 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Public header file for the library. ---*/ -/*--- bzlib.h ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#ifndef _BZLIB_H -#define _BZLIB_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define BZ_RUN 0 -#define BZ_FLUSH 1 -#define BZ_FINISH 2 - -#define BZ_OK 0 -#define BZ_RUN_OK 1 -#define BZ_FLUSH_OK 2 -#define BZ_FINISH_OK 3 -#define BZ_STREAM_END 4 -#define BZ_SEQUENCE_ERROR (-1) -#define BZ_PARAM_ERROR (-2) -#define BZ_MEM_ERROR (-3) -#define BZ_DATA_ERROR (-4) -#define BZ_DATA_ERROR_MAGIC (-5) -#define BZ_IO_ERROR (-6) -#define BZ_UNEXPECTED_EOF (-7) -#define BZ_OUTBUFF_FULL (-8) -#define BZ_CONFIG_ERROR (-9) - -typedef - struct { - char *next_in; - unsigned int avail_in; - unsigned int total_in_lo32; - unsigned int total_in_hi32; - - char *next_out; - unsigned int avail_out; - unsigned int total_out_lo32; - unsigned int total_out_hi32; - - void *state; - - void *(*bzalloc)(void *,int,int); - void (*bzfree)(void *,void *); - void *opaque; - } - bz_stream; - - -#ifndef BZ_IMPORT -#define BZ_EXPORT -#endif - -#ifndef BZ_NO_STDIO -/* Need a definitition for FILE */ -#include -#endif - -#ifdef _WIN32 -# include -# ifdef small - /* windows.h define small to char */ -# undef small -# endif -# ifdef BZ_EXPORT -# define BZ_API(func) WINAPI func -# define BZ_EXTERN extern -# else - /* import windows dll dynamically */ -# define BZ_API(func) (WINAPI * func) -# define BZ_EXTERN -# endif -#else -# define BZ_API(func) func -# define BZ_EXTERN extern -#endif - - -/*-- Core (low-level) library functions --*/ - -BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( - bz_stream* strm, - int blockSize100k, - int verbosity, - int workFactor - ); - -BZ_EXTERN int BZ_API(BZ2_bzCompress) ( - bz_stream* strm, - int action - ); - -BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( - bz_stream* strm - ); - -BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( - bz_stream *strm, - int verbosity, - int small - ); - -BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( - bz_stream* strm - ); - -BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( - bz_stream *strm - ); - - - -/*-- High(er) level library functions --*/ - -#ifndef BZ_NO_STDIO -#define BZ_MAX_UNUSED 5000 - -typedef void BZFILE; - -BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( - int* bzerror, - FILE* f, - int verbosity, - int small, - void* unused, - int nUnused - ); - -BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( - int* bzerror, - BZFILE* b - ); - -BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( - int* bzerror, - BZFILE* b, - void** unused, - int* nUnused - ); - -BZ_EXTERN int BZ_API(BZ2_bzRead) ( - int* bzerror, - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( - int* bzerror, - FILE* f, - int blockSize100k, - int verbosity, - int workFactor - ); - -BZ_EXTERN void BZ_API(BZ2_bzWrite) ( - int* bzerror, - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( - int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in, - unsigned int* nbytes_out - ); - -BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( - int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in_lo32, - unsigned int* nbytes_in_hi32, - unsigned int* nbytes_out_lo32, - unsigned int* nbytes_out_hi32 - ); -#endif - - -/*-- Utility functions --*/ - -BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( - char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int blockSize100k, - int verbosity, - int workFactor - ); - -BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( - char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int small, - int verbosity - ); - - -/*-- - Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) - to support better zlib compatibility. - This code is not _officially_ part of libbzip2 (yet); - I haven't tested it, documented it, or considered the - threading-safeness of it. - If this code breaks, please contact both Yoshioka and me. ---*/ - -BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( - void - ); - -#ifndef BZ_NO_STDIO -BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( - const char *path, - const char *mode - ); - -BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( - int fd, - const char *mode - ); - -BZ_EXTERN int BZ_API(BZ2_bzread) ( - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN int BZ_API(BZ2_bzwrite) ( - BZFILE* b, - void* buf, - int len - ); - -BZ_EXTERN int BZ_API(BZ2_bzflush) ( - BZFILE* b - ); - -BZ_EXTERN void BZ_API(BZ2_bzclose) ( - BZFILE* b - ); - -BZ_EXTERN const char * BZ_API(BZ2_bzerror) ( - BZFILE *b, - int *errnum - ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif - -/*-------------------------------------------------------------*/ -/*--- end bzlib.h ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/bzlib_private.h b/game/client/third/minizip/lib/bzip2/bzlib_private.h deleted file mode 100755 index 5d0217f4..00000000 --- a/game/client/third/minizip/lib/bzip2/bzlib_private.h +++ /dev/null @@ -1,509 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Private header file for the library. ---*/ -/*--- bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#ifndef _BZLIB_PRIVATE_H -#define _BZLIB_PRIVATE_H - -#include - -#ifndef BZ_NO_STDIO -#include -#include -#include -#endif - -#include "bzlib.h" - - - -/*-- General stuff. --*/ - -#define BZ_VERSION "1.0.6, 6-Sept-2010" - -typedef char Char; -typedef unsigned char Bool; -typedef unsigned char UChar; -typedef int Int32; -typedef unsigned int UInt32; -typedef short Int16; -typedef unsigned short UInt16; - -#define True ((Bool)1) -#define False ((Bool)0) - -#ifndef __GNUC__ -#define __inline__ /* */ -#endif - -#ifndef BZ_NO_STDIO - -extern void BZ2_bz__AssertH__fail ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } - -#if BZ_DEBUG -#define AssertD(cond,msg) \ - { if (!(cond)) { \ - fprintf ( stderr, \ - "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ - exit(1); \ - }} -#else -#define AssertD(cond,msg) /* */ -#endif - -#define VPrintf0(zf) \ - fprintf(stderr,zf) -#define VPrintf1(zf,za1) \ - fprintf(stderr,zf,za1) -#define VPrintf2(zf,za1,za2) \ - fprintf(stderr,zf,za1,za2) -#define VPrintf3(zf,za1,za2,za3) \ - fprintf(stderr,zf,za1,za2,za3) -#define VPrintf4(zf,za1,za2,za3,za4) \ - fprintf(stderr,zf,za1,za2,za3,za4) -#define VPrintf5(zf,za1,za2,za3,za4,za5) \ - fprintf(stderr,zf,za1,za2,za3,za4,za5) - -#else - -extern void bz_internal_error ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) bz_internal_error ( errcode ); } -#define AssertD(cond,msg) do { } while (0) -#define VPrintf0(zf) do { } while (0) -#define VPrintf1(zf,za1) do { } while (0) -#define VPrintf2(zf,za1,za2) do { } while (0) -#define VPrintf3(zf,za1,za2,za3) do { } while (0) -#define VPrintf4(zf,za1,za2,za3,za4) do { } while (0) -#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0) - -#endif - - -#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) -#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) - - -/*-- Header bytes. --*/ - -#define BZ_HDR_B 0x42 /* 'B' */ -#define BZ_HDR_Z 0x5a /* 'Z' */ -#define BZ_HDR_h 0x68 /* 'h' */ -#define BZ_HDR_0 0x30 /* '0' */ - -/*-- Constants for the back end. --*/ - -#define BZ_MAX_ALPHA_SIZE 258 -#define BZ_MAX_CODE_LEN 23 - -#define BZ_RUNA 0 -#define BZ_RUNB 1 - -#define BZ_N_GROUPS 6 -#define BZ_G_SIZE 50 -#define BZ_N_ITERS 4 - -#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) - - - -/*-- Stuff for randomising repetitive blocks. --*/ - -extern Int32 BZ2_rNums[512]; - -#define BZ_RAND_DECLS \ - Int32 rNToGo; \ - Int32 rTPos \ - -#define BZ_RAND_INIT_MASK \ - s->rNToGo = 0; \ - s->rTPos = 0 \ - -#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) - -#define BZ_RAND_UPD_MASK \ - if (s->rNToGo == 0) { \ - s->rNToGo = BZ2_rNums[s->rTPos]; \ - s->rTPos++; \ - if (s->rTPos == 512) s->rTPos = 0; \ - } \ - s->rNToGo--; - - - -/*-- Stuff for doing CRCs. --*/ - -extern UInt32 BZ2_crc32Table[256]; - -#define BZ_INITIALISE_CRC(crcVar) \ -{ \ - crcVar = 0xffffffffL; \ -} - -#define BZ_FINALISE_CRC(crcVar) \ -{ \ - crcVar = ~(crcVar); \ -} - -#define BZ_UPDATE_CRC(crcVar,cha) \ -{ \ - crcVar = (crcVar << 8) ^ \ - BZ2_crc32Table[(crcVar >> 24) ^ \ - ((UChar)cha)]; \ -} - - - -/*-- States and modes for compression. --*/ - -#define BZ_M_IDLE 1 -#define BZ_M_RUNNING 2 -#define BZ_M_FLUSHING 3 -#define BZ_M_FINISHING 4 - -#define BZ_S_OUTPUT 1 -#define BZ_S_INPUT 2 - -#define BZ_N_RADIX 2 -#define BZ_N_QSORT 12 -#define BZ_N_SHELL 18 -#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) - - - - -/*-- Structure holding all the compression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* mode this stream is in, and whether inputting */ - /* or outputting data */ - Int32 mode; - Int32 state; - - /* remembers avail_in when flush/finish requested */ - UInt32 avail_in_expect; - - /* for doing the block sorting */ - UInt32* arr1; - UInt32* arr2; - UInt32* ftab; - Int32 origPtr; - - /* aliases for arr1 and arr2 */ - UInt32* ptr; - UChar* block; - UInt16* mtfv; - UChar* zbits; - - /* for deciding when to use the fallback sorting algorithm */ - Int32 workFactor; - - /* run-length-encoding of the input */ - UInt32 state_in_ch; - Int32 state_in_len; - BZ_RAND_DECLS; - - /* input and output limits and current posns */ - Int32 nblock; - Int32 nblockMAX; - Int32 numZ; - Int32 state_out_pos; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - UChar unseqToSeq[256]; - - /* the buffer for bit stream creation */ - UInt32 bsBuff; - Int32 bsLive; - - /* block and combined CRCs */ - UInt32 blockCRC; - UInt32 combinedCRC; - - /* misc administratium */ - Int32 verbosity; - Int32 blockNo; - Int32 blockSize100k; - - /* stuff for coding the MTF values */ - Int32 nMTF; - Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - /* second dimension: only 3 needed; 4 makes index calculations faster */ - UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; - - } - EState; - - - -/*-- externs for compression. --*/ - -extern void -BZ2_blockSort ( EState* ); - -extern void -BZ2_compressBlock ( EState*, Bool ); - -extern void -BZ2_bsInitWrite ( EState* ); - -extern void -BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); - -extern void -BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); - - - -/*-- states for decompression. --*/ - -#define BZ_X_IDLE 1 -#define BZ_X_OUTPUT 2 - -#define BZ_X_MAGIC_1 10 -#define BZ_X_MAGIC_2 11 -#define BZ_X_MAGIC_3 12 -#define BZ_X_MAGIC_4 13 -#define BZ_X_BLKHDR_1 14 -#define BZ_X_BLKHDR_2 15 -#define BZ_X_BLKHDR_3 16 -#define BZ_X_BLKHDR_4 17 -#define BZ_X_BLKHDR_5 18 -#define BZ_X_BLKHDR_6 19 -#define BZ_X_BCRC_1 20 -#define BZ_X_BCRC_2 21 -#define BZ_X_BCRC_3 22 -#define BZ_X_BCRC_4 23 -#define BZ_X_RANDBIT 24 -#define BZ_X_ORIGPTR_1 25 -#define BZ_X_ORIGPTR_2 26 -#define BZ_X_ORIGPTR_3 27 -#define BZ_X_MAPPING_1 28 -#define BZ_X_MAPPING_2 29 -#define BZ_X_SELECTOR_1 30 -#define BZ_X_SELECTOR_2 31 -#define BZ_X_SELECTOR_3 32 -#define BZ_X_CODING_1 33 -#define BZ_X_CODING_2 34 -#define BZ_X_CODING_3 35 -#define BZ_X_MTF_1 36 -#define BZ_X_MTF_2 37 -#define BZ_X_MTF_3 38 -#define BZ_X_MTF_4 39 -#define BZ_X_MTF_5 40 -#define BZ_X_MTF_6 41 -#define BZ_X_ENDHDR_2 42 -#define BZ_X_ENDHDR_3 43 -#define BZ_X_ENDHDR_4 44 -#define BZ_X_ENDHDR_5 45 -#define BZ_X_ENDHDR_6 46 -#define BZ_X_CCRC_1 47 -#define BZ_X_CCRC_2 48 -#define BZ_X_CCRC_3 49 -#define BZ_X_CCRC_4 50 - - - -/*-- Constants for the fast MTF decoder. --*/ - -#define MTFA_SIZE 4096 -#define MTFL_SIZE 16 - - - -/*-- Structure holding all the decompression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* state indicator for this stream */ - Int32 state; - - /* for doing the final run-length decoding */ - UChar state_out_ch; - Int32 state_out_len; - Bool blockRandomised; - BZ_RAND_DECLS; - - /* the buffer for bit stream reading */ - UInt32 bsBuff; - Int32 bsLive; - - /* misc administratium */ - Int32 blockSize100k; - Bool smallDecompress; - Int32 currBlockNo; - Int32 verbosity; - - /* for undoing the Burrows-Wheeler transform */ - Int32 origPtr; - UInt32 tPos; - Int32 k0; - Int32 unzftab[256]; - Int32 nblock_used; - Int32 cftab[257]; - Int32 cftabCopy[257]; - - /* for undoing the Burrows-Wheeler transform (FAST) */ - UInt32 *tt; - - /* for undoing the Burrows-Wheeler transform (SMALL) */ - UInt16 *ll16; - UChar *ll4; - - /* stored and calculated CRCs */ - UInt32 storedBlockCRC; - UInt32 storedCombinedCRC; - UInt32 calculatedBlockCRC; - UInt32 calculatedCombinedCRC; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - Bool inUse16[16]; - UChar seqToUnseq[256]; - - /* for decoding the MTF values */ - UChar mtfa [MTFA_SIZE]; - Int32 mtfbase[256 / MTFL_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - - Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 minLens[BZ_N_GROUPS]; - - /* save area for scalars in the main decompress code */ - Int32 save_i; - Int32 save_j; - Int32 save_t; - Int32 save_alphaSize; - Int32 save_nGroups; - Int32 save_nSelectors; - Int32 save_EOB; - Int32 save_groupNo; - Int32 save_groupPos; - Int32 save_nextSym; - Int32 save_nblockMAX; - Int32 save_nblock; - Int32 save_es; - Int32 save_N; - Int32 save_curr; - Int32 save_zt; - Int32 save_zn; - Int32 save_zvec; - Int32 save_zj; - Int32 save_gSel; - Int32 save_gMinlen; - Int32* save_gLimit; - Int32* save_gBase; - Int32* save_gPerm; - - } - DState; - - - -/*-- Macros for decompression. --*/ - -#define BZ_GET_FAST(cccc) \ - /* c_tPos is unsigned, hence test < 0 is pointless. */ \ - if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ - s->tPos = s->tt[s->tPos]; \ - cccc = (UChar)(s->tPos & 0xff); \ - s->tPos >>= 8; - -#define BZ_GET_FAST_C(cccc) \ - /* c_tPos is unsigned, hence test < 0 is pointless. */ \ - if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \ - c_tPos = c_tt[c_tPos]; \ - cccc = (UChar)(c_tPos & 0xff); \ - c_tPos >>= 8; - -#define SET_LL4(i,n) \ - { if (((i) & 0x1) == 0) \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ - } - -#define GET_LL4(i) \ - ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) - -#define SET_LL(i,n) \ - { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ - SET_LL4(i, n >> 16); \ - } - -#define GET_LL(i) \ - (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) - -#define BZ_GET_SMALL(cccc) \ - /* c_tPos is unsigned, hence test < 0 is pointless. */ \ - if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \ - cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ - s->tPos = GET_LL(s->tPos); - - -/*-- externs for decompression. --*/ - -extern Int32 -BZ2_indexIntoF ( Int32, Int32* ); - -extern Int32 -BZ2_decompress ( DState* ); - -extern void -BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, - Int32, Int32, Int32 ); - - -#endif - - -/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ - -#ifdef BZ_NO_STDIO -#ifndef NULL -#define NULL 0 -#endif -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/compress.c b/game/client/third/minizip/lib/bzip2/compress.c deleted file mode 100755 index 62f377b5..00000000 --- a/game/client/third/minizip/lib/bzip2/compress.c +++ /dev/null @@ -1,672 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Compression machinery (not incl block sorting) ---*/ -/*--- compress.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -/* CHANGES - 0.9.0 -- original version. - 0.9.0a/b -- no changes in this file. - 0.9.0c -- changed setting of nGroups in sendMTFValues() - so as to do a bit better on small files -*/ - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -/*--- Bit stream I/O ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -void BZ2_bsInitWrite ( EState* s ) -{ - s->bsLive = 0; - s->bsBuff = 0; -} - - -/*---------------------------------------------------*/ -static -void bsFinishWrite ( EState* s ) -{ - while (s->bsLive > 0) { - s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); - s->numZ++; - s->bsBuff <<= 8; - s->bsLive -= 8; - } -} - - -/*---------------------------------------------------*/ -#define bsNEEDW(nz) \ -{ \ - while (s->bsLive >= 8) { \ - s->zbits[s->numZ] \ - = (UChar)(s->bsBuff >> 24); \ - s->numZ++; \ - s->bsBuff <<= 8; \ - s->bsLive -= 8; \ - } \ -} - - -/*---------------------------------------------------*/ -static -__inline__ -void bsW ( EState* s, Int32 n, UInt32 v ) -{ - bsNEEDW ( n ); - s->bsBuff |= (v << (32 - s->bsLive - n)); - s->bsLive += n; -} - - -/*---------------------------------------------------*/ -static -void bsPutUInt32 ( EState* s, UInt32 u ) -{ - bsW ( s, 8, (u >> 24) & 0xffL ); - bsW ( s, 8, (u >> 16) & 0xffL ); - bsW ( s, 8, (u >> 8) & 0xffL ); - bsW ( s, 8, u & 0xffL ); -} - - -/*---------------------------------------------------*/ -static -void bsPutUChar ( EState* s, UChar c ) -{ - bsW( s, 8, (UInt32)c ); -} - - -/*---------------------------------------------------*/ -/*--- The back end proper ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -static -void makeMaps_e ( EState* s ) -{ - Int32 i; - s->nInUse = 0; - for (i = 0; i < 256; i++) - if (s->inUse[i]) { - s->unseqToSeq[i] = s->nInUse; - s->nInUse++; - } -} - - -/*---------------------------------------------------*/ -static -void generateMTFValues ( EState* s ) -{ - UChar yy[256]; - Int32 i, j; - Int32 zPend; - Int32 wr; - Int32 EOB; - - /* - After sorting (eg, here), - s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, - and - ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] - holds the original block data. - - The first thing to do is generate the MTF values, - and put them in - ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. - Because there are strictly fewer or equal MTF values - than block values, ptr values in this area are overwritten - with MTF values only when they are no longer needed. - - The final compressed bitstream is generated into the - area starting at - (UChar*) (&((UChar*)s->arr2)[s->nblock]) - - These storage aliases are set up in bzCompressInit(), - except for the last one, which is arranged in - compressBlock(). - */ - UInt32* ptr = s->ptr; - UChar* block = s->block; - UInt16* mtfv = s->mtfv; - - makeMaps_e ( s ); - EOB = s->nInUse+1; - - for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; - - wr = 0; - zPend = 0; - for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; - - for (i = 0; i < s->nblock; i++) { - UChar ll_i; - AssertD ( wr <= i, "generateMTFValues(1)" ); - j = ptr[i]-1; if (j < 0) j += s->nblock; - ll_i = s->unseqToSeq[block[j]]; - AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); - - if (yy[0] == ll_i) { - zPend++; - } else { - - if (zPend > 0) { - zPend--; - while (True) { - if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; - } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; - } - if (zPend < 2) break; - zPend = (zPend - 2) / 2; - }; - zPend = 0; - } - { - register UChar rtmp; - register UChar* ryy_j; - register UChar rll_i; - rtmp = yy[1]; - yy[1] = yy[0]; - ryy_j = &(yy[1]); - rll_i = ll_i; - while ( rll_i != rtmp ) { - register UChar rtmp2; - ryy_j++; - rtmp2 = rtmp; - rtmp = *ryy_j; - *ryy_j = rtmp2; - }; - yy[0] = rtmp; - j = ryy_j - &(yy[0]); - mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; - } - - } - } - - if (zPend > 0) { - zPend--; - while (True) { - if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; - } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; - } - if (zPend < 2) break; - zPend = (zPend - 2) / 2; - }; - zPend = 0; - } - - mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; - - s->nMTF = wr; -} - - -/*---------------------------------------------------*/ -#define BZ_LESSER_ICOST 0 -#define BZ_GREATER_ICOST 15 - -static -void sendMTFValues ( EState* s ) -{ - Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; - Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; - Int32 nGroups, nBytes; - - /*-- - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - is a global since the decoder also needs it. - - Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - are also globals only used in this proc. - Made global to keep stack frame size small. - --*/ - - - UInt16 cost[BZ_N_GROUPS]; - Int32 fave[BZ_N_GROUPS]; - - UInt16* mtfv = s->mtfv; - - if (s->verbosity >= 3) - VPrintf3( " %d in block, %d after MTF & 1-2 coding, " - "%d+2 syms in use\n", - s->nblock, s->nMTF, s->nInUse ); - - alphaSize = s->nInUse+2; - for (t = 0; t < BZ_N_GROUPS; t++) - for (v = 0; v < alphaSize; v++) - s->len[t][v] = BZ_GREATER_ICOST; - - /*--- Decide how many coding tables to use ---*/ - AssertH ( s->nMTF > 0, 3001 ); - if (s->nMTF < 200) nGroups = 2; else - if (s->nMTF < 600) nGroups = 3; else - if (s->nMTF < 1200) nGroups = 4; else - if (s->nMTF < 2400) nGroups = 5; else - nGroups = 6; - - /*--- Generate an initial set of coding tables ---*/ - { - Int32 nPart, remF, tFreq, aFreq; - - nPart = nGroups; - remF = s->nMTF; - gs = 0; - while (nPart > 0) { - tFreq = remF / nPart; - ge = gs-1; - aFreq = 0; - while (aFreq < tFreq && ge < alphaSize-1) { - ge++; - aFreq += s->mtfFreq[ge]; - } - - if (ge > gs - && nPart != nGroups && nPart != 1 - && ((nGroups-nPart) % 2 == 1)) { - aFreq -= s->mtfFreq[ge]; - ge--; - } - - if (s->verbosity >= 3) - VPrintf5( " initial group %d, [%d .. %d], " - "has %d syms (%4.1f%%)\n", - nPart, gs, ge, aFreq, - (100.0 * (float)aFreq) / (float)(s->nMTF) ); - - for (v = 0; v < alphaSize; v++) - if (v >= gs && v <= ge) - s->len[nPart-1][v] = BZ_LESSER_ICOST; else - s->len[nPart-1][v] = BZ_GREATER_ICOST; - - nPart--; - gs = ge+1; - remF -= aFreq; - } - } - - /*--- - Iterate up to BZ_N_ITERS times to improve the tables. - ---*/ - for (iter = 0; iter < BZ_N_ITERS; iter++) { - - for (t = 0; t < nGroups; t++) fave[t] = 0; - - for (t = 0; t < nGroups; t++) - for (v = 0; v < alphaSize; v++) - s->rfreq[t][v] = 0; - - /*--- - Set up an auxiliary length table which is used to fast-track - the common case (nGroups == 6). - ---*/ - if (nGroups == 6) { - for (v = 0; v < alphaSize; v++) { - s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; - s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; - s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; - } - } - - nSelectors = 0; - totc = 0; - gs = 0; - while (True) { - - /*--- Set group start & end marks. --*/ - if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; - if (ge >= s->nMTF) ge = s->nMTF-1; - - /*-- - Calculate the cost of this group as coded - by each of the coding tables. - --*/ - for (t = 0; t < nGroups; t++) cost[t] = 0; - - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - register UInt32 cost01, cost23, cost45; - register UInt16 icv; - cost01 = cost23 = cost45 = 0; - -# define BZ_ITER(nn) \ - icv = mtfv[gs+(nn)]; \ - cost01 += s->len_pack[icv][0]; \ - cost23 += s->len_pack[icv][1]; \ - cost45 += s->len_pack[icv][2]; \ - - BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); - BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); - BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); - BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); - BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); - BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); - BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); - BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); - BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); - BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); - -# undef BZ_ITER - - cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; - cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; - cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) { - UInt16 icv = mtfv[i]; - for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; - } - } - - /*-- - Find the coding table which is best for this group, - and record its identity in the selector table. - --*/ - bc = 999999999; bt = -1; - for (t = 0; t < nGroups; t++) - if (cost[t] < bc) { bc = cost[t]; bt = t; }; - totc += bc; - fave[bt]++; - s->selector[nSelectors] = bt; - nSelectors++; - - /*-- - Increment the symbol frequencies for the selected table. - --*/ - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - -# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ - - BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); - BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); - BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); - BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); - BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); - BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); - BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); - BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); - BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); - BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); - -# undef BZ_ITUR - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) - s->rfreq[bt][ mtfv[i] ]++; - } - - gs = ge+1; - } - if (s->verbosity >= 3) { - VPrintf2 ( " pass %d: size is %d, grp uses are ", - iter+1, totc/8 ); - for (t = 0; t < nGroups; t++) - VPrintf1 ( "%d ", fave[t] ); - VPrintf0 ( "\n" ); - } - - /*-- - Recompute the tables based on the accumulated frequencies. - --*/ - /* maxLen was changed from 20 to 17 in bzip2-1.0.3. See - comment in huffman.c for details. */ - for (t = 0; t < nGroups; t++) - BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), - alphaSize, 17 /*20*/ ); - } - - - AssertH( nGroups < 8, 3002 ); - AssertH( nSelectors < 32768 && - nSelectors <= (2 + (900000 / BZ_G_SIZE)), - 3003 ); - - - /*--- Compute MTF values for the selectors. ---*/ - { - UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; - for (i = 0; i < nGroups; i++) pos[i] = i; - for (i = 0; i < nSelectors; i++) { - ll_i = s->selector[i]; - j = 0; - tmp = pos[j]; - while ( ll_i != tmp ) { - j++; - tmp2 = tmp; - tmp = pos[j]; - pos[j] = tmp2; - }; - pos[0] = tmp; - s->selectorMtf[i] = j; - } - }; - - /*--- Assign actual codes for the tables. --*/ - for (t = 0; t < nGroups; t++) { - minLen = 32; - maxLen = 0; - for (i = 0; i < alphaSize; i++) { - if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; - if (s->len[t][i] < minLen) minLen = s->len[t][i]; - } - AssertH ( !(maxLen > 17 /*20*/ ), 3004 ); - AssertH ( !(minLen < 1), 3005 ); - BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), - minLen, maxLen, alphaSize ); - } - - /*--- Transmit the mapping table. ---*/ - { - Bool inUse16[16]; - for (i = 0; i < 16; i++) { - inUse16[i] = False; - for (j = 0; j < 16; j++) - if (s->inUse[i * 16 + j]) inUse16[i] = True; - } - - nBytes = s->numZ; - for (i = 0; i < 16; i++) - if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); - - for (i = 0; i < 16; i++) - if (inUse16[i]) - for (j = 0; j < 16; j++) { - if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); - } - - if (s->verbosity >= 3) - VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); - } - - /*--- Now the selectors. ---*/ - nBytes = s->numZ; - bsW ( s, 3, nGroups ); - bsW ( s, 15, nSelectors ); - for (i = 0; i < nSelectors; i++) { - for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); - bsW(s,1,0); - } - if (s->verbosity >= 3) - VPrintf1( "selectors %d, ", s->numZ-nBytes ); - - /*--- Now the coding tables. ---*/ - nBytes = s->numZ; - - for (t = 0; t < nGroups; t++) { - Int32 curr = s->len[t][0]; - bsW ( s, 5, curr ); - for (i = 0; i < alphaSize; i++) { - while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; - while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; - bsW ( s, 1, 0 ); - } - } - - if (s->verbosity >= 3) - VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); - - /*--- And finally, the block data proper ---*/ - nBytes = s->numZ; - selCtr = 0; - gs = 0; - while (True) { - if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; - if (ge >= s->nMTF) ge = s->nMTF-1; - AssertH ( s->selector[selCtr] < nGroups, 3006 ); - - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - UInt16 mtfv_i; - UChar* s_len_sel_selCtr - = &(s->len[s->selector[selCtr]][0]); - Int32* s_code_sel_selCtr - = &(s->code[s->selector[selCtr]][0]); - -# define BZ_ITAH(nn) \ - mtfv_i = mtfv[gs+(nn)]; \ - bsW ( s, \ - s_len_sel_selCtr[mtfv_i], \ - s_code_sel_selCtr[mtfv_i] ) - - BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); - BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); - BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); - BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); - BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); - BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); - BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); - BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); - BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); - BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); - -# undef BZ_ITAH - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) { - bsW ( s, - s->len [s->selector[selCtr]] [mtfv[i]], - s->code [s->selector[selCtr]] [mtfv[i]] ); - } - } - - - gs = ge+1; - selCtr++; - } - AssertH( selCtr == nSelectors, 3007 ); - - if (s->verbosity >= 3) - VPrintf1( "codes %d\n", s->numZ-nBytes ); -} - - -/*---------------------------------------------------*/ -extern void BZ2_compressBlock ( EState* s, Bool is_last_block ) -{ - if (s->nblock > 0) { - - BZ_FINALISE_CRC ( s->blockCRC ); - s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); - s->combinedCRC ^= s->blockCRC; - if (s->blockNo > 1) s->numZ = 0; - - if (s->verbosity >= 2) - VPrintf4( " block %d: crc = 0x%08x, " - "combined CRC = 0x%08x, size = %d\n", - s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); - - BZ2_blockSort ( s ); - } - - s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); - - /*-- If this is the first block, create the stream header. --*/ - if (s->blockNo == 1) { - BZ2_bsInitWrite ( s ); - bsPutUChar ( s, BZ_HDR_B ); - bsPutUChar ( s, BZ_HDR_Z ); - bsPutUChar ( s, BZ_HDR_h ); - bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) ); - } - - if (s->nblock > 0) { - - bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); - bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); - bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); - - /*-- Now the block's CRC, so it is in a known place. --*/ - bsPutUInt32 ( s, s->blockCRC ); - - /*-- - Now a single bit indicating (non-)randomisation. - As of version 0.9.5, we use a better sorting algorithm - which makes randomisation unnecessary. So always set - the randomised bit to 'no'. Of course, the decoder - still needs to be able to handle randomised blocks - so as to maintain backwards compatibility with - older versions of bzip2. - --*/ - bsW(s,1,0); - - bsW ( s, 24, s->origPtr ); - generateMTFValues ( s ); - sendMTFValues ( s ); - } - - - /*-- If this is the last block, add the stream trailer. --*/ - if (is_last_block) { - - bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); - bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); - bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); - bsPutUInt32 ( s, s->combinedCRC ); - if (s->verbosity >= 2) - VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC ); - bsFinishWrite ( s ); - } -} - - -/*-------------------------------------------------------------*/ -/*--- end compress.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/crctable.c b/game/client/third/minizip/lib/bzip2/crctable.c deleted file mode 100755 index 1fea7e94..00000000 --- a/game/client/third/minizip/lib/bzip2/crctable.c +++ /dev/null @@ -1,104 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for doing CRCs ---*/ -/*--- crctable.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - -/*-- - I think this is an implementation of the AUTODIN-II, - Ethernet & FDDI 32-bit CRC standard. Vaguely derived - from code by Rob Warnock, in Section 51 of the - comp.compression FAQ. ---*/ - -UInt32 BZ2_crc32Table[256] = { - - /*-- Ugly, innit? --*/ - - 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, - 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, - 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, - 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, - 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, - 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, - 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, - 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, - 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, - 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, - 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, - 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, - 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, - 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, - 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, - 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, - 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, - 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, - 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, - 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, - 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, - 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, - 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, - 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, - 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, - 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, - 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, - 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, - 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, - 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, - 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, - 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, - 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, - 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, - 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, - 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, - 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, - 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, - 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, - 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, - 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, - 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, - 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, - 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, - 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, - 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, - 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, - 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, - 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, - 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, - 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, - 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, - 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, - 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, - 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, - 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, - 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, - 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, - 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, - 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, - 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, - 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, - 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, - 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L -}; - - -/*-------------------------------------------------------------*/ -/*--- end crctable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/decompress.c b/game/client/third/minizip/lib/bzip2/decompress.c deleted file mode 100755 index 311f5668..00000000 --- a/game/client/third/minizip/lib/bzip2/decompress.c +++ /dev/null @@ -1,646 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Decompression machinery ---*/ -/*--- decompress.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -static -void makeMaps_d ( DState* s ) -{ - Int32 i; - s->nInUse = 0; - for (i = 0; i < 256; i++) - if (s->inUse[i]) { - s->seqToUnseq[s->nInUse] = i; - s->nInUse++; - } -} - - -/*---------------------------------------------------*/ -#define RETURN(rrr) \ - { retVal = rrr; goto save_state_and_return; }; - -#define GET_BITS(lll,vvv,nnn) \ - case lll: s->state = lll; \ - while (True) { \ - if (s->bsLive >= nnn) { \ - UInt32 v; \ - v = (s->bsBuff >> \ - (s->bsLive-nnn)) & ((1 << nnn)-1); \ - s->bsLive -= nnn; \ - vvv = v; \ - break; \ - } \ - if (s->strm->avail_in == 0) RETURN(BZ_OK); \ - s->bsBuff \ - = (s->bsBuff << 8) | \ - ((UInt32) \ - (*((UChar*)(s->strm->next_in)))); \ - s->bsLive += 8; \ - s->strm->next_in++; \ - s->strm->avail_in--; \ - s->strm->total_in_lo32++; \ - if (s->strm->total_in_lo32 == 0) \ - s->strm->total_in_hi32++; \ - } - -#define GET_UCHAR(lll,uuu) \ - GET_BITS(lll,uuu,8) - -#define GET_BIT(lll,uuu) \ - GET_BITS(lll,uuu,1) - -/*---------------------------------------------------*/ -#define GET_MTF_VAL(label1,label2,lval) \ -{ \ - if (groupPos == 0) { \ - groupNo++; \ - if (groupNo >= nSelectors) \ - RETURN(BZ_DATA_ERROR); \ - groupPos = BZ_G_SIZE; \ - gSel = s->selector[groupNo]; \ - gMinlen = s->minLens[gSel]; \ - gLimit = &(s->limit[gSel][0]); \ - gPerm = &(s->perm[gSel][0]); \ - gBase = &(s->base[gSel][0]); \ - } \ - groupPos--; \ - zn = gMinlen; \ - GET_BITS(label1, zvec, zn); \ - while (1) { \ - if (zn > 20 /* the longest code */) \ - RETURN(BZ_DATA_ERROR); \ - if (zvec <= gLimit[zn]) break; \ - zn++; \ - GET_BIT(label2, zj); \ - zvec = (zvec << 1) | zj; \ - }; \ - if (zvec - gBase[zn] < 0 \ - || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ - RETURN(BZ_DATA_ERROR); \ - lval = gPerm[zvec - gBase[zn]]; \ -} - - -/*---------------------------------------------------*/ -Int32 BZ2_decompress ( DState* s ) -{ - UChar uc; - Int32 retVal; - Int32 minLen, maxLen; - bz_stream* strm = s->strm; - - /* stuff that needs to be saved/restored */ - Int32 i; - Int32 j; - Int32 t; - Int32 alphaSize; - Int32 nGroups; - Int32 nSelectors; - Int32 EOB; - Int32 groupNo; - Int32 groupPos; - Int32 nextSym; - Int32 nblockMAX; - Int32 nblock; - Int32 es; - Int32 N; - Int32 curr; - Int32 zt; - Int32 zn; - Int32 zvec; - Int32 zj; - Int32 gSel; - Int32 gMinlen; - Int32* gLimit; - Int32* gBase; - Int32* gPerm; - - if (s->state == BZ_X_MAGIC_1) { - /*initialise the save area*/ - s->save_i = 0; - s->save_j = 0; - s->save_t = 0; - s->save_alphaSize = 0; - s->save_nGroups = 0; - s->save_nSelectors = 0; - s->save_EOB = 0; - s->save_groupNo = 0; - s->save_groupPos = 0; - s->save_nextSym = 0; - s->save_nblockMAX = 0; - s->save_nblock = 0; - s->save_es = 0; - s->save_N = 0; - s->save_curr = 0; - s->save_zt = 0; - s->save_zn = 0; - s->save_zvec = 0; - s->save_zj = 0; - s->save_gSel = 0; - s->save_gMinlen = 0; - s->save_gLimit = NULL; - s->save_gBase = NULL; - s->save_gPerm = NULL; - } - - /*restore from the save area*/ - i = s->save_i; - j = s->save_j; - t = s->save_t; - alphaSize = s->save_alphaSize; - nGroups = s->save_nGroups; - nSelectors = s->save_nSelectors; - EOB = s->save_EOB; - groupNo = s->save_groupNo; - groupPos = s->save_groupPos; - nextSym = s->save_nextSym; - nblockMAX = s->save_nblockMAX; - nblock = s->save_nblock; - es = s->save_es; - N = s->save_N; - curr = s->save_curr; - zt = s->save_zt; - zn = s->save_zn; - zvec = s->save_zvec; - zj = s->save_zj; - gSel = s->save_gSel; - gMinlen = s->save_gMinlen; - gLimit = s->save_gLimit; - gBase = s->save_gBase; - gPerm = s->save_gPerm; - - retVal = BZ_OK; - - switch (s->state) { - - GET_UCHAR(BZ_X_MAGIC_1, uc); - if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_2, uc); - if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_3, uc) - if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); - - GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) - if (s->blockSize100k < (BZ_HDR_0 + 1) || - s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); - s->blockSize100k -= BZ_HDR_0; - - if (s->smallDecompress) { - s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); - s->ll4 = BZALLOC( - ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) - ); - if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); - } else { - s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); - if (s->tt == NULL) RETURN(BZ_MEM_ERROR); - } - - GET_UCHAR(BZ_X_BLKHDR_1, uc); - - if (uc == 0x17) goto endhdr_2; - if (uc != 0x31) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_2, uc); - if (uc != 0x41) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_3, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_4, uc); - if (uc != 0x26) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_5, uc); - if (uc != 0x53) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_6, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - - s->currBlockNo++; - if (s->verbosity >= 2) - VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); - - s->storedBlockCRC = 0; - GET_UCHAR(BZ_X_BCRC_1, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_2, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_3, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_4, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - - GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); - - s->origPtr = 0; - GET_UCHAR(BZ_X_ORIGPTR_1, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_2, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_3, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - - if (s->origPtr < 0) - RETURN(BZ_DATA_ERROR); - if (s->origPtr > 10 + 100000*s->blockSize100k) - RETURN(BZ_DATA_ERROR); - - /*--- Receive the mapping table ---*/ - for (i = 0; i < 16; i++) { - GET_BIT(BZ_X_MAPPING_1, uc); - if (uc == 1) - s->inUse16[i] = True; else - s->inUse16[i] = False; - } - - for (i = 0; i < 256; i++) s->inUse[i] = False; - - for (i = 0; i < 16; i++) - if (s->inUse16[i]) - for (j = 0; j < 16; j++) { - GET_BIT(BZ_X_MAPPING_2, uc); - if (uc == 1) s->inUse[i * 16 + j] = True; - } - makeMaps_d ( s ); - if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); - alphaSize = s->nInUse+2; - - /*--- Now the selectors ---*/ - GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); - if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); - GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); - if (nSelectors < 1) RETURN(BZ_DATA_ERROR); - for (i = 0; i < nSelectors; i++) { - j = 0; - while (True) { - GET_BIT(BZ_X_SELECTOR_3, uc); - if (uc == 0) break; - j++; - if (j >= nGroups) RETURN(BZ_DATA_ERROR); - } - s->selectorMtf[i] = j; - } - - /*--- Undo the MTF values for the selectors. ---*/ - { - UChar pos[BZ_N_GROUPS], tmp, v; - for (v = 0; v < nGroups; v++) pos[v] = v; - - for (i = 0; i < nSelectors; i++) { - v = s->selectorMtf[i]; - tmp = pos[v]; - while (v > 0) { pos[v] = pos[v-1]; v--; } - pos[0] = tmp; - s->selector[i] = tmp; - } - } - - /*--- Now the coding tables ---*/ - for (t = 0; t < nGroups; t++) { - GET_BITS(BZ_X_CODING_1, curr, 5); - for (i = 0; i < alphaSize; i++) { - while (True) { - if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); - GET_BIT(BZ_X_CODING_2, uc); - if (uc == 0) break; - GET_BIT(BZ_X_CODING_3, uc); - if (uc == 0) curr++; else curr--; - } - s->len[t][i] = curr; - } - } - - /*--- Create the Huffman decoding tables ---*/ - for (t = 0; t < nGroups; t++) { - minLen = 32; - maxLen = 0; - for (i = 0; i < alphaSize; i++) { - if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; - if (s->len[t][i] < minLen) minLen = s->len[t][i]; - } - BZ2_hbCreateDecodeTables ( - &(s->limit[t][0]), - &(s->base[t][0]), - &(s->perm[t][0]), - &(s->len[t][0]), - minLen, maxLen, alphaSize - ); - s->minLens[t] = minLen; - } - - /*--- Now the MTF values ---*/ - - EOB = s->nInUse+1; - nblockMAX = 100000 * s->blockSize100k; - groupNo = -1; - groupPos = 0; - - for (i = 0; i <= 255; i++) s->unzftab[i] = 0; - - /*-- MTF init --*/ - { - Int32 ii, jj, kk; - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - /*-- end MTF init --*/ - - nblock = 0; - GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); - - while (True) { - - if (nextSym == EOB) break; - - if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { - - es = -1; - N = 1; - do { - /* Check that N doesn't get too big, so that es doesn't - go negative. The maximum value that can be - RUNA/RUNB encoded is equal to the block size (post - the initial RLE), viz, 900k, so bounding N at 2 - million should guard against overflow without - rejecting any legitimate inputs. */ - if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR); - if (nextSym == BZ_RUNA) es = es + (0+1) * N; else - if (nextSym == BZ_RUNB) es = es + (1+1) * N; - N = N * 2; - GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); - } - while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); - - es++; - uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; - s->unzftab[uc] += es; - - if (s->smallDecompress) - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->ll16[nblock] = (UInt16)uc; - nblock++; - es--; - } - else - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->tt[nblock] = (UInt32)uc; - nblock++; - es--; - }; - - continue; - - } else { - - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - - /*-- uc = MTF ( nextSym-1 ) --*/ - { - Int32 ii, jj, kk, pp, lno, off; - UInt32 nn; - nn = (UInt32)(nextSym - 1); - - if (nn < MTFL_SIZE) { - /* avoid general-case expense */ - pp = s->mtfbase[0]; - uc = s->mtfa[pp+nn]; - while (nn > 3) { - Int32 z = pp+nn; - s->mtfa[(z) ] = s->mtfa[(z)-1]; - s->mtfa[(z)-1] = s->mtfa[(z)-2]; - s->mtfa[(z)-2] = s->mtfa[(z)-3]; - s->mtfa[(z)-3] = s->mtfa[(z)-4]; - nn -= 4; - } - while (nn > 0) { - s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; - }; - s->mtfa[pp] = uc; - } else { - /* general case */ - lno = nn / MTFL_SIZE; - off = nn % MTFL_SIZE; - pp = s->mtfbase[lno] + off; - uc = s->mtfa[pp]; - while (pp > s->mtfbase[lno]) { - s->mtfa[pp] = s->mtfa[pp-1]; pp--; - }; - s->mtfbase[lno]++; - while (lno > 0) { - s->mtfbase[lno]--; - s->mtfa[s->mtfbase[lno]] - = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; - lno--; - } - s->mtfbase[0]--; - s->mtfa[s->mtfbase[0]] = uc; - if (s->mtfbase[0] == 0) { - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - } - } - /*-- end uc = MTF ( nextSym-1 ) --*/ - - s->unzftab[s->seqToUnseq[uc]]++; - if (s->smallDecompress) - s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else - s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); - nblock++; - - GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); - continue; - } - } - - /* Now we know what nblock is, we can do a better sanity - check on s->origPtr. - */ - if (s->origPtr < 0 || s->origPtr >= nblock) - RETURN(BZ_DATA_ERROR); - - /*-- Set up cftab to facilitate generation of T^(-1) --*/ - /* Check: unzftab entries in range. */ - for (i = 0; i <= 255; i++) { - if (s->unzftab[i] < 0 || s->unzftab[i] > nblock) - RETURN(BZ_DATA_ERROR); - } - /* Actually generate cftab. */ - s->cftab[0] = 0; - for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; - for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; - /* Check: cftab entries in range. */ - for (i = 0; i <= 256; i++) { - if (s->cftab[i] < 0 || s->cftab[i] > nblock) { - /* s->cftab[i] can legitimately be == nblock */ - RETURN(BZ_DATA_ERROR); - } - } - /* Check: cftab entries non-descending. */ - for (i = 1; i <= 256; i++) { - if (s->cftab[i-1] > s->cftab[i]) { - RETURN(BZ_DATA_ERROR); - } - } - - s->state_out_len = 0; - s->state_out_ch = 0; - BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); - s->state = BZ_X_OUTPUT; - if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); - - if (s->smallDecompress) { - - /*-- Make a copy of cftab, used in generation of T --*/ - for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; - - /*-- compute the T vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->ll16[i]); - SET_LL(i, s->cftabCopy[uc]); - s->cftabCopy[uc]++; - } - - /*-- Compute T^(-1) by pointer reversal on T --*/ - i = s->origPtr; - j = GET_LL(i); - do { - Int32 tmp = GET_LL(j); - SET_LL(j, i); - i = j; - j = tmp; - } - while (i != s->origPtr); - - s->tPos = s->origPtr; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_SMALL(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } else { - - /*-- compute the T^(-1) vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->tt[i] & 0xff); - s->tt[s->cftab[uc]] |= (i << 8); - s->cftab[uc]++; - } - - s->tPos = s->tt[s->origPtr] >> 8; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_FAST(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_FAST(s->k0); s->nblock_used++; - } - - } - - RETURN(BZ_OK); - - - - endhdr_2: - - GET_UCHAR(BZ_X_ENDHDR_2, uc); - if (uc != 0x72) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_3, uc); - if (uc != 0x45) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_4, uc); - if (uc != 0x38) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_5, uc); - if (uc != 0x50) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_6, uc); - if (uc != 0x90) RETURN(BZ_DATA_ERROR); - - s->storedCombinedCRC = 0; - GET_UCHAR(BZ_X_CCRC_1, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_2, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_3, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_4, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - - s->state = BZ_X_IDLE; - RETURN(BZ_STREAM_END); - - default: AssertH ( False, 4001 ); - } - - AssertH ( False, 4002 ); - - save_state_and_return: - - s->save_i = i; - s->save_j = j; - s->save_t = t; - s->save_alphaSize = alphaSize; - s->save_nGroups = nGroups; - s->save_nSelectors = nSelectors; - s->save_EOB = EOB; - s->save_groupNo = groupNo; - s->save_groupPos = groupPos; - s->save_nextSym = nextSym; - s->save_nblockMAX = nblockMAX; - s->save_nblock = nblock; - s->save_es = es; - s->save_N = N; - s->save_curr = curr; - s->save_zt = zt; - s->save_zn = zn; - s->save_zvec = zvec; - s->save_zj = zj; - s->save_gSel = gSel; - s->save_gMinlen = gMinlen; - s->save_gLimit = gLimit; - s->save_gBase = gBase; - s->save_gPerm = gPerm; - - return retVal; -} - - -/*-------------------------------------------------------------*/ -/*--- end decompress.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/huffman.c b/game/client/third/minizip/lib/bzip2/huffman.c deleted file mode 100755 index 2283fdbc..00000000 --- a/game/client/third/minizip/lib/bzip2/huffman.c +++ /dev/null @@ -1,205 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Huffman coding low-level stuff ---*/ -/*--- huffman.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - -/*---------------------------------------------------*/ -#define WEIGHTOF(zz0) ((zz0) & 0xffffff00) -#define DEPTHOF(zz1) ((zz1) & 0x000000ff) -#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) - -#define ADDWEIGHTS(zw1,zw2) \ - (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ - (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) - -#define UPHEAP(z) \ -{ \ - Int32 zz, tmp; \ - zz = z; tmp = heap[zz]; \ - while (weight[tmp] < weight[heap[zz >> 1]]) { \ - heap[zz] = heap[zz >> 1]; \ - zz >>= 1; \ - } \ - heap[zz] = tmp; \ -} - -#define DOWNHEAP(z) \ -{ \ - Int32 zz, yy, tmp; \ - zz = z; tmp = heap[zz]; \ - while (True) { \ - yy = zz << 1; \ - if (yy > nHeap) break; \ - if (yy < nHeap && \ - weight[heap[yy+1]] < weight[heap[yy]]) \ - yy++; \ - if (weight[tmp] < weight[heap[yy]]) break; \ - heap[zz] = heap[yy]; \ - zz = yy; \ - } \ - heap[zz] = tmp; \ -} - - -/*---------------------------------------------------*/ -void BZ2_hbMakeCodeLengths ( UChar *len, - Int32 *freq, - Int32 alphaSize, - Int32 maxLen ) -{ - /*-- - Nodes and heap entries run from 1. Entry 0 - for both the heap and nodes is a sentinel. - --*/ - Int32 nNodes, nHeap, n1, n2, i, j, k; - Bool tooLong; - - Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; - Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; - Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; - - for (i = 0; i < alphaSize; i++) - weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; - - while (True) { - - nNodes = alphaSize; - nHeap = 0; - - heap[0] = 0; - weight[0] = 0; - parent[0] = -2; - - for (i = 1; i <= alphaSize; i++) { - parent[i] = -1; - nHeap++; - heap[nHeap] = i; - UPHEAP(nHeap); - } - - AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); - - while (nHeap > 1) { - n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - nNodes++; - parent[n1] = parent[n2] = nNodes; - weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); - parent[nNodes] = -1; - nHeap++; - heap[nHeap] = nNodes; - UPHEAP(nHeap); - } - - AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); - - tooLong = False; - for (i = 1; i <= alphaSize; i++) { - j = 0; - k = i; - while (parent[k] >= 0) { k = parent[k]; j++; } - len[i-1] = j; - if (j > maxLen) tooLong = True; - } - - if (! tooLong) break; - - /* 17 Oct 04: keep-going condition for the following loop used - to be 'i < alphaSize', which missed the last element, - theoretically leading to the possibility of the compressor - looping. However, this count-scaling step is only needed if - one of the generated Huffman code words is longer than - maxLen, which up to and including version 1.0.2 was 20 bits, - which is extremely unlikely. In version 1.0.3 maxLen was - changed to 17 bits, which has minimal effect on compression - ratio, but does mean this scaling step is used from time to - time, enough to verify that it works. - - This means that bzip2-1.0.3 and later will only produce - Huffman codes with a maximum length of 17 bits. However, in - order to preserve backwards compatibility with bitstreams - produced by versions pre-1.0.3, the decompressor must still - handle lengths of up to 20. */ - - for (i = 1; i <= alphaSize; i++) { - j = weight[i] >> 8; - j = 1 + (j / 2); - weight[i] = j << 8; - } - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbAssignCodes ( Int32 *code, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 n, vec, i; - - vec = 0; - for (n = minLen; n <= maxLen; n++) { - for (i = 0; i < alphaSize; i++) - if (length[i] == n) { code[i] = vec; vec++; }; - vec <<= 1; - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbCreateDecodeTables ( Int32 *limit, - Int32 *base, - Int32 *perm, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 pp, i, j, vec; - - pp = 0; - for (i = minLen; i <= maxLen; i++) - for (j = 0; j < alphaSize; j++) - if (length[j] == i) { perm[pp] = j; pp++; }; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; - for (i = 0; i < alphaSize; i++) base[length[i]+1]++; - - for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; - vec = 0; - - for (i = minLen; i <= maxLen; i++) { - vec += (base[i+1] - base[i]); - limit[i] = vec-1; - vec <<= 1; - } - for (i = minLen + 1; i <= maxLen; i++) - base[i] = ((limit[i-1] + 1) << 1) - base[i]; -} - - -/*-------------------------------------------------------------*/ -/*--- end huffman.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/bzip2/randtable.c b/game/client/third/minizip/lib/bzip2/randtable.c deleted file mode 100755 index 6d624599..00000000 --- a/game/client/third/minizip/lib/bzip2/randtable.c +++ /dev/null @@ -1,84 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for randomising repetitive blocks ---*/ -/*--- randtable.c ---*/ -/*-------------------------------------------------------------*/ - -/* ------------------------------------------------------------------ - This file is part of bzip2/libbzip2, a program and library for - lossless, block-sorting data compression. - - bzip2/libbzip2 version 1.0.6 of 6 September 2010 - Copyright (C) 1996-2010 Julian Seward - - Please read the WARNING, DISCLAIMER and PATENTS sections in the - README file. - - This program is released under the terms of the license contained - in the file LICENSE. - ------------------------------------------------------------------ */ - - -#include "bzlib_private.h" - - -/*---------------------------------------------*/ -Int32 BZ2_rNums[512] = { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, - 936, 638 -}; - - -/*-------------------------------------------------------------*/ -/*--- end randtable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/game/client/third/minizip/lib/liblzma/api/lzma.h b/game/client/third/minizip/lib/liblzma/api/lzma.h deleted file mode 100755 index e4fed3d0..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma.h +++ /dev/null @@ -1,321 +0,0 @@ -/** - * \file api/lzma.h - * \brief The public API of liblzma data compression library - * - * liblzma is a public domain general-purpose data compression library with - * a zlib-like API. The native file format is .xz, but also the old .lzma - * format and raw (no headers) streams are supported. Multiple compression - * algorithms (filters) are supported. Currently LZMA2 is the primary filter. - * - * liblzma is part of XZ Utils . XZ Utils includes - * a gzip-like command line tool named xz and some other tools. XZ Utils - * is developed and maintained by Lasse Collin. - * - * Major parts of liblzma are based on Igor Pavlov's public domain LZMA SDK - * . - * - * The SHA-256 implementation is based on the public domain code found from - * 7-Zip , which has a modified version of the public - * domain SHA-256 code found from Crypto++ . - * The SHA-256 code in Crypto++ was written by Kevin Springle and Wei Dai. - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -#ifndef LZMA_H -#define LZMA_H - -/***************************** - * Required standard headers * - *****************************/ - -/* - * liblzma API headers need some standard types and macros. To allow - * including lzma.h without requiring the application to include other - * headers first, lzma.h includes the required standard headers unless - * they already seem to be included already or if LZMA_MANUAL_HEADERS - * has been defined. - * - * Here's what types and macros are needed and from which headers: - * - stddef.h: size_t, NULL - * - stdint.h: uint8_t, uint32_t, uint64_t, UINT32_C(n), uint64_C(n), - * UINT32_MAX, UINT64_MAX - * - * However, inttypes.h is a little more portable than stdint.h, although - * inttypes.h declares some unneeded things compared to plain stdint.h. - * - * The hacks below aren't perfect, specifically they assume that inttypes.h - * exists and that it typedefs at least uint8_t, uint32_t, and uint64_t, - * and that, in case of incomplete inttypes.h, unsigned int is 32-bit. - * If the application already takes care of setting up all the types and - * macros properly (for example by using gnulib's stdint.h or inttypes.h), - * we try to detect that the macros are already defined and don't include - * inttypes.h here again. However, you may define LZMA_MANUAL_HEADERS to - * force this file to never include any system headers. - * - * Some could argue that liblzma API should provide all the required types, - * for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was - * seen as an unnecessary mess, since most systems already provide all the - * necessary types and macros in the standard headers. - * - * Note that liblzma API still has lzma_bool, because using stdbool.h would - * break C89 and C++ programs on many systems. sizeof(bool) in C99 isn't - * necessarily the same as sizeof(bool) in C++. - */ - -#ifndef LZMA_MANUAL_HEADERS - /* - * I suppose this works portably also in C++. Note that in C++, - * we need to get size_t into the global namespace. - */ -# include - - /* - * Skip inttypes.h if we already have all the required macros. If we - * have the macros, we assume that we have the matching typedefs too. - */ -# if !defined(UINT32_C) || !defined(UINT64_C) \ - || !defined(UINT32_MAX) || !defined(UINT64_MAX) - /* - * MSVC versions older than 2013 have no C99 support, and - * thus they cannot be used to compile liblzma. Using an - * existing liblzma.dll with old MSVC can work though(*), - * but we need to define the required standard integer - * types here in a MSVC-specific way. - * - * (*) If you do this, the existing liblzma.dll probably uses - * a different runtime library than your MSVC-built - * application. Mixing runtimes is generally bad, but - * in this case it should work as long as you avoid - * the few rarely-needed liblzma functions that allocate - * memory and expect the caller to free it using free(). - */ -# if defined(_WIN32) && defined(_MSC_VER) && _MSC_VER < 1800 - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; -# else - /* Use the standard inttypes.h. */ -# ifdef __cplusplus - /* - * C99 sections 7.18.2 and 7.18.4 specify - * that C++ implementations define the limit - * and constant macros only if specifically - * requested. Note that if you want the - * format macros (PRIu64 etc.) too, you need - * to define __STDC_FORMAT_MACROS before - * including lzma.h, since re-including - * inttypes.h with __STDC_FORMAT_MACROS - * defined doesn't necessarily work. - */ -# ifndef __STDC_LIMIT_MACROS -# define __STDC_LIMIT_MACROS 1 -# endif -# ifndef __STDC_CONSTANT_MACROS -# define __STDC_CONSTANT_MACROS 1 -# endif -# endif - -# include -# endif - - /* - * Some old systems have only the typedefs in inttypes.h, and - * lack all the macros. For those systems, we need a few more - * hacks. We assume that unsigned int is 32-bit and unsigned - * long is either 32-bit or 64-bit. If these hacks aren't - * enough, the application has to setup the types manually - * before including lzma.h. - */ -# ifndef UINT32_C -# if defined(_WIN32) && defined(_MSC_VER) -# define UINT32_C(n) n ## UI32 -# else -# define UINT32_C(n) n ## U -# endif -# endif - -# ifndef UINT64_C -# if defined(_WIN32) && defined(_MSC_VER) -# define UINT64_C(n) n ## UI64 -# else - /* Get ULONG_MAX. */ -# include -# if ULONG_MAX == 4294967295UL -# define UINT64_C(n) n ## ULL -# else -# define UINT64_C(n) n ## UL -# endif -# endif -# endif - -# ifndef UINT32_MAX -# define UINT32_MAX (UINT32_C(4294967295)) -# endif - -# ifndef UINT64_MAX -# define UINT64_MAX (UINT64_C(18446744073709551615)) -# endif -# endif -#endif /* ifdef LZMA_MANUAL_HEADERS */ - - -/****************** - * LZMA_API macro * - ******************/ - -/* - * Some systems require that the functions and function pointers are - * declared specially in the headers. LZMA_API_IMPORT is for importing - * symbols and LZMA_API_CALL is to specify the calling convention. - * - * By default it is assumed that the application will link dynamically - * against liblzma. #define LZMA_API_STATIC in your application if you - * want to link against static liblzma. If you don't care about portability - * to operating systems like Windows, or at least don't care about linking - * against static liblzma on them, don't worry about LZMA_API_STATIC. That - * is, most developers will never need to use LZMA_API_STATIC. - * - * The GCC variants are a special case on Windows (Cygwin and MinGW). - * We rely on GCC doing the right thing with its auto-import feature, - * and thus don't use __declspec(dllimport). This way developers don't - * need to worry about LZMA_API_STATIC. Also the calling convention is - * omitted on Cygwin but not on MinGW. - */ -#ifndef LZMA_API_IMPORT -# if !defined(LZMA_API_STATIC) && defined(_WIN32) && !defined(__GNUC__) -# define LZMA_API_IMPORT __declspec(dllimport) -# else -# define LZMA_API_IMPORT -# endif -#endif - -#ifndef LZMA_API_CALL -# if defined(_WIN32) && !defined(__CYGWIN__) -# define LZMA_API_CALL __cdecl -# else -# define LZMA_API_CALL -# endif -#endif - -#ifndef LZMA_API -# define LZMA_API(type) LZMA_API_IMPORT type LZMA_API_CALL -#endif - - -/*********** - * nothrow * - ***********/ - -/* - * None of the functions in liblzma may throw an exception. Even - * the functions that use callback functions won't throw exceptions, - * because liblzma would break if a callback function threw an exception. - */ -#ifndef lzma_nothrow -# if defined(__cplusplus) -# define lzma_nothrow throw() -# elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) -# define lzma_nothrow __attribute__((__nothrow__)) -# else -# define lzma_nothrow -# endif -#endif - - -/******************** - * GNU C extensions * - ********************/ - -/* - * GNU C extensions are used conditionally in the public API. It doesn't - * break anything if these are sometimes enabled and sometimes not, only - * affects warnings and optimizations. - */ -#if __GNUC__ >= 3 -# ifndef lzma_attribute -# define lzma_attribute(attr) __attribute__(attr) -# endif - - /* warn_unused_result was added in GCC 3.4. */ -# ifndef lzma_attr_warn_unused_result -# if __GNUC__ == 3 && __GNUC_MINOR__ < 4 -# define lzma_attr_warn_unused_result -# endif -# endif - -#else -# ifndef lzma_attribute -# define lzma_attribute(attr) -# endif -#endif - - -#ifndef lzma_attr_pure -# define lzma_attr_pure lzma_attribute((__pure__)) -#endif - -#ifndef lzma_attr_const -# define lzma_attr_const lzma_attribute((__const__)) -#endif - -#ifndef lzma_attr_warn_unused_result -# define lzma_attr_warn_unused_result \ - lzma_attribute((__warn_unused_result__)) -#endif - - -/************** - * Subheaders * - **************/ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Subheaders check that this is defined. It is to prevent including - * them directly from applications. - */ -#define LZMA_H_INTERNAL 1 - -/* Basic features */ -#include "lzma/version.h" -#include "lzma/base.h" -#include "lzma/vli.h" -#include "lzma/check.h" - -/* Filters */ -#include "lzma/filter.h" -//#include "lzma/bcj.h" -//#include "lzma/delta.h" -#include "lzma/lzma12.h" - -/* Container formats */ -#include "lzma/container.h" - -/* Advanced features */ -//#include "lzma/stream_flags.h" -//#include "lzma/block.h" -//#include "lzma/index.h" -//#include "lzma/index_hash.h" - -/* Hardware information */ -//#include "lzma/hardware.h" - -/* - * All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications - * re-including the subheaders. - */ -#undef LZMA_H_INTERNAL - -#ifdef __cplusplus -} -#endif - -#endif /* ifndef LZMA_H */ diff --git a/game/client/third/minizip/lib/liblzma/api/lzma/base.h b/game/client/third/minizip/lib/liblzma/api/lzma/base.h deleted file mode 100755 index 7a31a420..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma/base.h +++ /dev/null @@ -1,654 +0,0 @@ -/** - * \file lzma/base.h - * \brief Data types and functions used in many places in liblzma API - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - * - * See ../lzma.h for information about liblzma as a whole. - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Boolean - * - * This is here because C89 doesn't have stdbool.h. To set a value for - * variables having type lzma_bool, you can use - * - C99's `true' and `false' from stdbool.h; - * - C++'s internal `true' and `false'; or - * - integers one (true) and zero (false). - */ -typedef unsigned char lzma_bool; - - -/** - * \brief Type of reserved enumeration variable in structures - * - * To avoid breaking library ABI when new features are added, several - * structures contain extra variables that may be used in future. Since - * sizeof(enum) can be different than sizeof(int), and sizeof(enum) may - * even vary depending on the range of enumeration constants, we specify - * a separate type to be used for reserved enumeration variables. All - * enumeration constants in liblzma API will be non-negative and less - * than 128, which should guarantee that the ABI won't break even when - * new constants are added to existing enumerations. - */ -typedef enum { - LZMA_RESERVED_ENUM = 0 -} lzma_reserved_enum; - - -/** - * \brief Return values used by several functions in liblzma - * - * Check the descriptions of specific functions to find out which return - * values they can return. With some functions the return values may have - * more specific meanings than described here; those differences are - * described per-function basis. - */ -typedef enum { - LZMA_OK = 0, - /**< - * \brief Operation completed successfully - */ - - LZMA_STREAM_END = 1, - /**< - * \brief End of stream was reached - * - * In encoder, LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, or - * LZMA_FINISH was finished. In decoder, this indicates - * that all the data was successfully decoded. - * - * In all cases, when LZMA_STREAM_END is returned, the last - * output bytes should be picked from strm->next_out. - */ - - LZMA_NO_CHECK = 2, - /**< - * \brief Input stream has no integrity check - * - * This return value can be returned only if the - * LZMA_TELL_NO_CHECK flag was used when initializing - * the decoder. LZMA_NO_CHECK is just a warning, and - * the decoding can be continued normally. - * - * It is possible to call lzma_get_check() immediately after - * lzma_code has returned LZMA_NO_CHECK. The result will - * naturally be LZMA_CHECK_NONE, but the possibility to call - * lzma_get_check() may be convenient in some applications. - */ - - LZMA_UNSUPPORTED_CHECK = 3, - /**< - * \brief Cannot calculate the integrity check - * - * The usage of this return value is different in encoders - * and decoders. - * - * Encoders can return this value only from the initialization - * function. If initialization fails with this value, the - * encoding cannot be done, because there's no way to produce - * output with the correct integrity check. - * - * Decoders can return this value only from lzma_code() and - * only if the LZMA_TELL_UNSUPPORTED_CHECK flag was used when - * initializing the decoder. The decoding can still be - * continued normally even if the check type is unsupported, - * but naturally the check will not be validated, and possible - * errors may go undetected. - * - * With decoder, it is possible to call lzma_get_check() - * immediately after lzma_code() has returned - * LZMA_UNSUPPORTED_CHECK. This way it is possible to find - * out what the unsupported Check ID was. - */ - - LZMA_GET_CHECK = 4, - /**< - * \brief Integrity check type is now available - * - * This value can be returned only by the lzma_code() function - * and only if the decoder was initialized with the - * LZMA_TELL_ANY_CHECK flag. LZMA_GET_CHECK tells the - * application that it may now call lzma_get_check() to find - * out the Check ID. This can be used, for example, to - * implement a decoder that accepts only files that have - * strong enough integrity check. - */ - - LZMA_MEM_ERROR = 5, - /**< - * \brief Cannot allocate memory - * - * Memory allocation failed, or the size of the allocation - * would be greater than SIZE_MAX. - * - * Due to internal implementation reasons, the coding cannot - * be continued even if more memory were made available after - * LZMA_MEM_ERROR. - */ - - LZMA_MEMLIMIT_ERROR = 6, - /** - * \brief Memory usage limit was reached - * - * Decoder would need more memory than allowed by the - * specified memory usage limit. To continue decoding, - * the memory usage limit has to be increased with - * lzma_memlimit_set(). - */ - - LZMA_FORMAT_ERROR = 7, - /**< - * \brief File format not recognized - * - * The decoder did not recognize the input as supported file - * format. This error can occur, for example, when trying to - * decode .lzma format file with lzma_stream_decoder, - * because lzma_stream_decoder accepts only the .xz format. - */ - - LZMA_OPTIONS_ERROR = 8, - /**< - * \brief Invalid or unsupported options - * - * Invalid or unsupported options, for example - * - unsupported filter(s) or filter options; or - * - reserved bits set in headers (decoder only). - * - * Rebuilding liblzma with more features enabled, or - * upgrading to a newer version of liblzma may help. - */ - - LZMA_DATA_ERROR = 9, - /**< - * \brief Data is corrupt - * - * The usage of this return value is different in encoders - * and decoders. In both encoder and decoder, the coding - * cannot continue after this error. - * - * Encoders return this if size limits of the target file - * format would be exceeded. These limits are huge, thus - * getting this error from an encoder is mostly theoretical. - * For example, the maximum compressed and uncompressed - * size of a .xz Stream is roughly 8 EiB (2^63 bytes). - * - * Decoders return this error if the input data is corrupt. - * This can mean, for example, invalid CRC32 in headers - * or invalid check of uncompressed data. - */ - - LZMA_BUF_ERROR = 10, - /**< - * \brief No progress is possible - * - * This error code is returned when the coder cannot consume - * any new input and produce any new output. The most common - * reason for this error is that the input stream being - * decoded is truncated or corrupt. - * - * This error is not fatal. Coding can be continued normally - * by providing more input and/or more output space, if - * possible. - * - * Typically the first call to lzma_code() that can do no - * progress returns LZMA_OK instead of LZMA_BUF_ERROR. Only - * the second consecutive call doing no progress will return - * LZMA_BUF_ERROR. This is intentional. - * - * With zlib, Z_BUF_ERROR may be returned even if the - * application is doing nothing wrong, so apps will need - * to handle Z_BUF_ERROR specially. The above hack - * guarantees that liblzma never returns LZMA_BUF_ERROR - * to properly written applications unless the input file - * is truncated or corrupt. This should simplify the - * applications a little. - */ - - LZMA_PROG_ERROR = 11, - /**< - * \brief Programming error - * - * This indicates that the arguments given to the function are - * invalid or the internal state of the decoder is corrupt. - * - Function arguments are invalid or the structures - * pointed by the argument pointers are invalid - * e.g. if strm->next_out has been set to NULL and - * strm->avail_out > 0 when calling lzma_code(). - * - lzma_* functions have been called in wrong order - * e.g. lzma_code() was called right after lzma_end(). - * - If errors occur randomly, the reason might be flaky - * hardware. - * - * If you think that your code is correct, this error code - * can be a sign of a bug in liblzma. See the documentation - * how to report bugs. - */ -} lzma_ret; - - -/** - * \brief The `action' argument for lzma_code() - * - * After the first use of LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, LZMA_FULL_BARRIER, - * or LZMA_FINISH, the same `action' must is used until lzma_code() returns - * LZMA_STREAM_END. Also, the amount of input (that is, strm->avail_in) must - * not be modified by the application until lzma_code() returns - * LZMA_STREAM_END. Changing the `action' or modifying the amount of input - * will make lzma_code() return LZMA_PROG_ERROR. - */ -typedef enum { - LZMA_RUN = 0, - /**< - * \brief Continue coding - * - * Encoder: Encode as much input as possible. Some internal - * buffering will probably be done (depends on the filter - * chain in use), which causes latency: the input used won't - * usually be decodeable from the output of the same - * lzma_code() call. - * - * Decoder: Decode as much input as possible and produce as - * much output as possible. - */ - - LZMA_SYNC_FLUSH = 1, - /**< - * \brief Make all the input available at output - * - * Normally the encoder introduces some latency. - * LZMA_SYNC_FLUSH forces all the buffered data to be - * available at output without resetting the internal - * state of the encoder. This way it is possible to use - * compressed stream for example for communication over - * network. - * - * Only some filters support LZMA_SYNC_FLUSH. Trying to use - * LZMA_SYNC_FLUSH with filters that don't support it will - * make lzma_code() return LZMA_OPTIONS_ERROR. For example, - * LZMA1 doesn't support LZMA_SYNC_FLUSH but LZMA2 does. - * - * Using LZMA_SYNC_FLUSH very often can dramatically reduce - * the compression ratio. With some filters (for example, - * LZMA2), fine-tuning the compression options may help - * mitigate this problem significantly (for example, - * match finder with LZMA2). - * - * Decoders don't support LZMA_SYNC_FLUSH. - */ - - LZMA_FULL_FLUSH = 2, - /**< - * \brief Finish encoding of the current Block - * - * All the input data going to the current Block must have - * been given to the encoder (the last bytes can still be - * pending in *next_in). Call lzma_code() with LZMA_FULL_FLUSH - * until it returns LZMA_STREAM_END. Then continue normally - * with LZMA_RUN or finish the Stream with LZMA_FINISH. - * - * This action is currently supported only by Stream encoder - * and easy encoder (which uses Stream encoder). If there is - * no unfinished Block, no empty Block is created. - */ - - LZMA_FULL_BARRIER = 4, - /**< - * \brief Finish encoding of the current Block - * - * This is like LZMA_FULL_FLUSH except that this doesn't - * necessarily wait until all the input has been made - * available via the output buffer. That is, lzma_code() - * might return LZMA_STREAM_END as soon as all the input - * has been consumed (avail_in == 0). - * - * LZMA_FULL_BARRIER is useful with a threaded encoder if - * one wants to split the .xz Stream into Blocks at specific - * offsets but doesn't care if the output isn't flushed - * immediately. Using LZMA_FULL_BARRIER allows keeping - * the threads busy while LZMA_FULL_FLUSH would make - * lzma_code() wait until all the threads have finished - * until more data could be passed to the encoder. - * - * With a lzma_stream initialized with the single-threaded - * lzma_stream_encoder() or lzma_easy_encoder(), - * LZMA_FULL_BARRIER is an alias for LZMA_FULL_FLUSH. - */ - - LZMA_FINISH = 3 - /**< - * \brief Finish the coding operation - * - * All the input data must have been given to the encoder - * (the last bytes can still be pending in next_in). - * Call lzma_code() with LZMA_FINISH until it returns - * LZMA_STREAM_END. Once LZMA_FINISH has been used, - * the amount of input must no longer be changed by - * the application. - * - * When decoding, using LZMA_FINISH is optional unless the - * LZMA_CONCATENATED flag was used when the decoder was - * initialized. When LZMA_CONCATENATED was not used, the only - * effect of LZMA_FINISH is that the amount of input must not - * be changed just like in the encoder. - */ -} lzma_action; - - -/** - * \brief Custom functions for memory handling - * - * A pointer to lzma_allocator may be passed via lzma_stream structure - * to liblzma, and some advanced functions take a pointer to lzma_allocator - * as a separate function argument. The library will use the functions - * specified in lzma_allocator for memory handling instead of the default - * malloc() and free(). C++ users should note that the custom memory - * handling functions must not throw exceptions. - * - * Single-threaded mode only: liblzma doesn't make an internal copy of - * lzma_allocator. Thus, it is OK to change these function pointers in - * the middle of the coding process, but obviously it must be done - * carefully to make sure that the replacement `free' can deallocate - * memory allocated by the earlier `alloc' function(s). - * - * Multithreaded mode: liblzma might internally store pointers to the - * lzma_allocator given via the lzma_stream structure. The application - * must not change the allocator pointer in lzma_stream or the contents - * of the pointed lzma_allocator structure until lzma_end() has been used - * to free the memory associated with that lzma_stream. The allocation - * functions might be called simultaneously from multiple threads, and - * thus they must be thread safe. - */ -typedef struct { - /** - * \brief Pointer to a custom memory allocation function - * - * If you don't want a custom allocator, but still want - * custom free(), set this to NULL and liblzma will use - * the standard malloc(). - * - * \param opaque lzma_allocator.opaque (see below) - * \param nmemb Number of elements like in calloc(). liblzma - * will always set nmemb to 1, so it is safe to - * ignore nmemb in a custom allocator if you like. - * The nmemb argument exists only for - * compatibility with zlib and libbzip2. - * \param size Size of an element in bytes. - * liblzma never sets this to zero. - * - * \return Pointer to the beginning of a memory block of - * `size' bytes, or NULL if allocation fails - * for some reason. When allocation fails, functions - * of liblzma return LZMA_MEM_ERROR. - * - * The allocator should not waste time zeroing the allocated buffers. - * This is not only about speed, but also memory usage, since the - * operating system kernel doesn't necessarily allocate the requested - * memory in physical memory until it is actually used. With small - * input files, liblzma may actually need only a fraction of the - * memory that it requested for allocation. - * - * \note LZMA_MEM_ERROR is also used when the size of the - * allocation would be greater than SIZE_MAX. Thus, - * don't assume that the custom allocator must have - * returned NULL if some function from liblzma - * returns LZMA_MEM_ERROR. - */ - void *(LZMA_API_CALL *alloc)(void *opaque, size_t nmemb, size_t size); - - /** - * \brief Pointer to a custom memory freeing function - * - * If you don't want a custom freeing function, but still - * want a custom allocator, set this to NULL and liblzma - * will use the standard free(). - * - * \param opaque lzma_allocator.opaque (see below) - * \param ptr Pointer returned by lzma_allocator.alloc(), - * or when it is set to NULL, a pointer returned - * by the standard malloc(). - */ - void (LZMA_API_CALL *free)(void *opaque, void *ptr); - - /** - * \brief Pointer passed to .alloc() and .free() - * - * opaque is passed as the first argument to lzma_allocator.alloc() - * and lzma_allocator.free(). This intended to ease implementing - * custom memory allocation functions for use with liblzma. - * - * If you don't need this, you should set this to NULL. - */ - void *opaque; - -} lzma_allocator; - - -/** - * \brief Internal data structure - * - * The contents of this structure is not visible outside the library. - */ -typedef struct lzma_internal_s lzma_internal; - - -/** - * \brief Passing data to and from liblzma - * - * The lzma_stream structure is used for - * - passing pointers to input and output buffers to liblzma; - * - defining custom memory hander functions; and - * - holding a pointer to coder-specific internal data structures. - * - * Typical usage: - * - * - After allocating lzma_stream (on stack or with malloc()), it must be - * initialized to LZMA_STREAM_INIT (see LZMA_STREAM_INIT for details). - * - * - Initialize a coder to the lzma_stream, for example by using - * lzma_easy_encoder() or lzma_auto_decoder(). Some notes: - * - In contrast to zlib, strm->next_in and strm->next_out are - * ignored by all initialization functions, thus it is safe - * to not initialize them yet. - * - The initialization functions always set strm->total_in and - * strm->total_out to zero. - * - If the initialization function fails, no memory is left allocated - * that would require freeing with lzma_end() even if some memory was - * associated with the lzma_stream structure when the initialization - * function was called. - * - * - Use lzma_code() to do the actual work. - * - * - Once the coding has been finished, the existing lzma_stream can be - * reused. It is OK to reuse lzma_stream with different initialization - * function without calling lzma_end() first. Old allocations are - * automatically freed. - * - * - Finally, use lzma_end() to free the allocated memory. lzma_end() never - * frees the lzma_stream structure itself. - * - * Application may modify the values of total_in and total_out as it wants. - * They are updated by liblzma to match the amount of data read and - * written but aren't used for anything else except as a possible return - * values from lzma_get_progress(). - */ -typedef struct { - const uint8_t *next_in; /**< Pointer to the next input byte. */ - size_t avail_in; /**< Number of available input bytes in next_in. */ - uint64_t total_in; /**< Total number of bytes read by liblzma. */ - - uint8_t *next_out; /**< Pointer to the next output position. */ - size_t avail_out; /**< Amount of free space in next_out. */ - uint64_t total_out; /**< Total number of bytes written by liblzma. */ - - /** - * \brief Custom memory allocation functions - * - * In most cases this is NULL which makes liblzma use - * the standard malloc() and free(). - * - * \note In 5.0.x this is not a const pointer. - */ - const lzma_allocator *allocator; - - /** Internal state is not visible to applications. */ - lzma_internal *internal; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. Excluding the initialization of this structure, - * you should not touch these, because the names of these variables - * may change. - */ - void *reserved_ptr1; - void *reserved_ptr2; - void *reserved_ptr3; - void *reserved_ptr4; - uint64_t reserved_int1; - uint64_t reserved_int2; - size_t reserved_int3; - size_t reserved_int4; - lzma_reserved_enum reserved_enum1; - lzma_reserved_enum reserved_enum2; - -} lzma_stream; - - -/** - * \brief Initialization for lzma_stream - * - * When you declare an instance of lzma_stream, you can immediately - * initialize it so that initialization functions know that no memory - * has been allocated yet: - * - * lzma_stream strm = LZMA_STREAM_INIT; - * - * If you need to initialize a dynamically allocated lzma_stream, you can use - * memset(strm_pointer, 0, sizeof(lzma_stream)). Strictly speaking, this - * violates the C standard since NULL may have different internal - * representation than zero, but it should be portable enough in practice. - * Anyway, for maximum portability, you can use something like this: - * - * lzma_stream tmp = LZMA_STREAM_INIT; - * *strm = tmp; - */ -#define LZMA_STREAM_INIT \ - { NULL, 0, 0, NULL, 0, 0, NULL, NULL, \ - NULL, NULL, NULL, NULL, 0, 0, 0, 0, \ - LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM } - - -/** - * \brief Encode or decode data - * - * Once the lzma_stream has been successfully initialized (e.g. with - * lzma_stream_encoder()), the actual encoding or decoding is done - * using this function. The application has to update strm->next_in, - * strm->avail_in, strm->next_out, and strm->avail_out to pass input - * to and get output from liblzma. - * - * See the description of the coder-specific initialization function to find - * out what `action' values are supported by the coder. - */ -extern LZMA_API(lzma_ret) lzma_code(lzma_stream *strm, lzma_action action) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Free memory allocated for the coder data structures - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * - * After lzma_end(strm), strm->internal is guaranteed to be NULL. No other - * members of the lzma_stream structure are touched. - * - * \note zlib indicates an error if application end()s unfinished - * stream structure. liblzma doesn't do this, and assumes that - * application knows what it is doing. - */ -extern LZMA_API(void) lzma_end(lzma_stream *strm) lzma_nothrow; - - -/** - * \brief Get progress information - * - * In single-threaded mode, applications can get progress information from - * strm->total_in and strm->total_out. In multi-threaded mode this is less - * useful because a significant amount of both input and output data gets - * buffered internally by liblzma. This makes total_in and total_out give - * misleading information and also makes the progress indicator updates - * non-smooth. - * - * This function gives realistic progress information also in multi-threaded - * mode by taking into account the progress made by each thread. In - * single-threaded mode *progress_in and *progress_out are set to - * strm->total_in and strm->total_out, respectively. - */ -extern LZMA_API(void) lzma_get_progress(lzma_stream *strm, - uint64_t *progress_in, uint64_t *progress_out) lzma_nothrow; - - -/** - * \brief Get the memory usage of decoder filter chain - * - * This function is currently supported only when *strm has been initialized - * with a function that takes a memlimit argument. With other functions, you - * should use e.g. lzma_raw_encoder_memusage() or lzma_raw_decoder_memusage() - * to estimate the memory requirements. - * - * This function is useful e.g. after LZMA_MEMLIMIT_ERROR to find out how big - * the memory usage limit should have been to decode the input. Note that - * this may give misleading information if decoding .xz Streams that have - * multiple Blocks, because each Block can have different memory requirements. - * - * \return How much memory is currently allocated for the filter - * decoders. If no filter chain is currently allocated, - * some non-zero value is still returned, which is less than - * or equal to what any filter chain would indicate as its - * memory requirement. - * - * If this function isn't supported by *strm or some other error - * occurs, zero is returned. - */ -extern LZMA_API(uint64_t) lzma_memusage(const lzma_stream *strm) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Get the current memory usage limit - * - * This function is supported only when *strm has been initialized with - * a function that takes a memlimit argument. - * - * \return On success, the current memory usage limit is returned - * (always non-zero). On error, zero is returned. - */ -extern LZMA_API(uint64_t) lzma_memlimit_get(const lzma_stream *strm) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Set the memory usage limit - * - * This function is supported only when *strm has been initialized with - * a function that takes a memlimit argument. - * - * \return - LZMA_OK: New memory usage limit successfully set. - * - LZMA_MEMLIMIT_ERROR: The new limit is too small. - * The limit was not changed. - * - LZMA_PROG_ERROR: Invalid arguments, e.g. *strm doesn't - * support memory usage limit or memlimit was zero. - */ -extern LZMA_API(lzma_ret) lzma_memlimit_set( - lzma_stream *strm, uint64_t memlimit) lzma_nothrow; diff --git a/game/client/third/minizip/lib/liblzma/api/lzma/check.h b/game/client/third/minizip/lib/liblzma/api/lzma/check.h deleted file mode 100755 index 6a243db0..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma/check.h +++ /dev/null @@ -1,150 +0,0 @@ -/** - * \file lzma/check.h - * \brief Integrity checks - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - * - * See ../lzma.h for information about liblzma as a whole. - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Type of the integrity check (Check ID) - * - * The .xz format supports multiple types of checks that are calculated - * from the uncompressed data. They vary in both speed and ability to - * detect errors. - */ -typedef enum { - LZMA_CHECK_NONE = 0, - /**< - * No Check is calculated. - * - * Size of the Check field: 0 bytes - */ - - LZMA_CHECK_CRC32 = 1, - /**< - * CRC32 using the polynomial from the IEEE 802.3 standard - * - * Size of the Check field: 4 bytes - */ - - LZMA_CHECK_CRC64 = 4, - /**< - * CRC64 using the polynomial from the ECMA-182 standard - * - * Size of the Check field: 8 bytes - */ - - LZMA_CHECK_SHA256 = 10 - /**< - * SHA-256 - * - * Size of the Check field: 32 bytes - */ -} lzma_check; - - -/** - * \brief Maximum valid Check ID - * - * The .xz file format specification specifies 16 Check IDs (0-15). Some - * of them are only reserved, that is, no actual Check algorithm has been - * assigned. When decoding, liblzma still accepts unknown Check IDs for - * future compatibility. If a valid but unsupported Check ID is detected, - * liblzma can indicate a warning; see the flags LZMA_TELL_NO_CHECK, - * LZMA_TELL_UNSUPPORTED_CHECK, and LZMA_TELL_ANY_CHECK in container.h. - */ -#define LZMA_CHECK_ID_MAX 15 - - -/** - * \brief Test if the given Check ID is supported - * - * Return true if the given Check ID is supported by this liblzma build. - * Otherwise false is returned. It is safe to call this with a value that - * is not in the range [0, 15]; in that case the return value is always false. - * - * You can assume that LZMA_CHECK_NONE and LZMA_CHECK_CRC32 are always - * supported (even if liblzma is built with limited features). - */ -extern LZMA_API(lzma_bool) lzma_check_is_supported(lzma_check check) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Get the size of the Check field with the given Check ID - * - * Although not all Check IDs have a check algorithm associated, the size of - * every Check is already frozen. This function returns the size (in bytes) of - * the Check field with the specified Check ID. The values are: - * { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 } - * - * If the argument is not in the range [0, 15], UINT32_MAX is returned. - */ -extern LZMA_API(uint32_t) lzma_check_size(lzma_check check) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Maximum size of a Check field - */ -#define LZMA_CHECK_SIZE_MAX 64 - - -/** - * \brief Calculate CRC32 - * - * Calculate CRC32 using the polynomial from the IEEE 802.3 standard. - * - * \param buf Pointer to the input buffer - * \param size Size of the input buffer - * \param crc Previously returned CRC value. This is used to - * calculate the CRC of a big buffer in smaller chunks. - * Set to zero when starting a new calculation. - * - * \return Updated CRC value, which can be passed to this function - * again to continue CRC calculation. - */ -extern LZMA_API(uint32_t) lzma_crc32( - const uint8_t *buf, size_t size, uint32_t crc) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Calculate CRC64 - * - * Calculate CRC64 using the polynomial from the ECMA-182 standard. - * - * This function is used similarly to lzma_crc32(). See its documentation. - */ -extern LZMA_API(uint64_t) lzma_crc64( - const uint8_t *buf, size_t size, uint64_t crc) - lzma_nothrow lzma_attr_pure; - - -/* - * SHA-256 functions are currently not exported to public API. - * Contact Lasse Collin if you think it should be. - */ - - -/** - * \brief Get the type of the integrity check - * - * This function can be called only immediately after lzma_code() has - * returned LZMA_NO_CHECK, LZMA_UNSUPPORTED_CHECK, or LZMA_GET_CHECK. - * Calling this function in any other situation has undefined behavior. - */ -extern LZMA_API(lzma_check) lzma_get_check(const lzma_stream *strm) - lzma_nothrow; diff --git a/game/client/third/minizip/lib/liblzma/api/lzma/container.h b/game/client/third/minizip/lib/liblzma/api/lzma/container.h deleted file mode 100755 index 86991add..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma/container.h +++ /dev/null @@ -1,619 +0,0 @@ -/** - * \file lzma/container.h - * \brief File formats - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - * - * See ../lzma.h for information about liblzma as a whole. - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/************ - * Encoding * - ************/ - -/** - * \brief Default compression preset - * - * It's not straightforward to recommend a default preset, because in some - * cases keeping the resource usage relatively low is more important that - * getting the maximum compression ratio. - */ -#define LZMA_PRESET_DEFAULT UINT32_C(6) - - -/** - * \brief Mask for preset level - * - * This is useful only if you need to extract the level from the preset - * variable. That should be rare. - */ -#define LZMA_PRESET_LEVEL_MASK UINT32_C(0x1F) - - -/* - * Preset flags - * - * Currently only one flag is defined. - */ - -/** - * \brief Extreme compression preset - * - * This flag modifies the preset to make the encoding significantly slower - * while improving the compression ratio only marginally. This is useful - * when you don't mind wasting time to get as small result as possible. - * - * This flag doesn't affect the memory usage requirements of the decoder (at - * least not significantly). The memory usage of the encoder may be increased - * a little but only at the lowest preset levels (0-3). - */ -#define LZMA_PRESET_EXTREME (UINT32_C(1) << 31) - - -/** - * \brief Multithreading options - */ -typedef struct { - /** - * \brief Flags - * - * Set this to zero if no flags are wanted. - * - * No flags are currently supported. - */ - uint32_t flags; - - /** - * \brief Number of worker threads to use - */ - uint32_t threads; - - /** - * \brief Maximum uncompressed size of a Block - * - * The encoder will start a new .xz Block every block_size bytes. - * Using LZMA_FULL_FLUSH or LZMA_FULL_BARRIER with lzma_code() - * the caller may tell liblzma to start a new Block earlier. - * - * With LZMA2, a recommended block size is 2-4 times the LZMA2 - * dictionary size. With very small dictionaries, it is recommended - * to use at least 1 MiB block size for good compression ratio, even - * if this is more than four times the dictionary size. Note that - * these are only recommendations for typical use cases; feel free - * to use other values. Just keep in mind that using a block size - * less than the LZMA2 dictionary size is waste of RAM. - * - * Set this to 0 to let liblzma choose the block size depending - * on the compression options. For LZMA2 it will be 3*dict_size - * or 1 MiB, whichever is more. - * - * For each thread, about 3 * block_size bytes of memory will be - * allocated. This may change in later liblzma versions. If so, - * the memory usage will probably be reduced, not increased. - */ - uint64_t block_size; - - /** - * \brief Timeout to allow lzma_code() to return early - * - * Multithreading can make liblzma to consume input and produce - * output in a very bursty way: it may first read a lot of input - * to fill internal buffers, then no input or output occurs for - * a while. - * - * In single-threaded mode, lzma_code() won't return until it has - * either consumed all the input or filled the output buffer. If - * this is done in multithreaded mode, it may cause a call - * lzma_code() to take even tens of seconds, which isn't acceptable - * in all applications. - * - * To avoid very long blocking times in lzma_code(), a timeout - * (in milliseconds) may be set here. If lzma_code() would block - * longer than this number of milliseconds, it will return with - * LZMA_OK. Reasonable values are 100 ms or more. The xz command - * line tool uses 300 ms. - * - * If long blocking times are fine for you, set timeout to a special - * value of 0, which will disable the timeout mechanism and will make - * lzma_code() block until all the input is consumed or the output - * buffer has been filled. - * - * \note Even with a timeout, lzma_code() might sometimes take - * somewhat long time to return. No timing guarantees - * are made. - */ - uint32_t timeout; - - /** - * \brief Compression preset (level and possible flags) - * - * The preset is set just like with lzma_easy_encoder(). - * The preset is ignored if filters below is non-NULL. - */ - uint32_t preset; - - /** - * \brief Filter chain (alternative to a preset) - * - * If this is NULL, the preset above is used. Otherwise the preset - * is ignored and the filter chain specified here is used. - */ - const lzma_filter *filters; - - /** - * \brief Integrity check type - * - * See check.h for available checks. The xz command line tool - * defaults to LZMA_CHECK_CRC64, which is a good choice if you - * are unsure. - */ - lzma_check check; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. You should not touch these, because the names - * of these variables may change. These are and will never be used - * with the currently supported options, so it is safe to leave these - * uninitialized. - */ - lzma_reserved_enum reserved_enum1; - lzma_reserved_enum reserved_enum2; - lzma_reserved_enum reserved_enum3; - uint32_t reserved_int1; - uint32_t reserved_int2; - uint32_t reserved_int3; - uint32_t reserved_int4; - uint64_t reserved_int5; - uint64_t reserved_int6; - uint64_t reserved_int7; - uint64_t reserved_int8; - void *reserved_ptr1; - void *reserved_ptr2; - void *reserved_ptr3; - void *reserved_ptr4; - -} lzma_mt; - - -/** - * \brief Calculate approximate memory usage of easy encoder - * - * This function is a wrapper for lzma_raw_encoder_memusage(). - * - * \param preset Compression preset (level and possible flags) - * - * \return Number of bytes of memory required for the given - * preset when encoding. If an error occurs, for example - * due to unsupported preset, UINT64_MAX is returned. - */ -extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Calculate approximate decoder memory usage of a preset - * - * This function is a wrapper for lzma_raw_decoder_memusage(). - * - * \param preset Compression preset (level and possible flags) - * - * \return Number of bytes of memory required to decompress a file - * that was compressed using the given preset. If an error - * occurs, for example due to unsupported preset, UINT64_MAX - * is returned. - */ -extern LZMA_API(uint64_t) lzma_easy_decoder_memusage(uint32_t preset) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize .xz Stream encoder using a preset number - * - * This function is intended for those who just want to use the basic features - * if liblzma (that is, most developers out there). - * - * \param strm Pointer to lzma_stream that is at least initialized - * with LZMA_STREAM_INIT. - * \param preset Compression preset to use. A preset consist of level - * number and zero or more flags. Usually flags aren't - * used, so preset is simply a number [0, 9] which match - * the options -0 ... -9 of the xz command line tool. - * Additional flags can be be set using bitwise-or with - * the preset level number, e.g. 6 | LZMA_PRESET_EXTREME. - * \param check Integrity check type to use. See check.h for available - * checks. The xz command line tool defaults to - * LZMA_CHECK_CRC64, which is a good choice if you are - * unsure. LZMA_CHECK_CRC32 is good too as long as the - * uncompressed file is not many gigabytes. - * - * \return - LZMA_OK: Initialization succeeded. Use lzma_code() to - * encode your data. - * - LZMA_MEM_ERROR: Memory allocation failed. - * - LZMA_OPTIONS_ERROR: The given compression preset is not - * supported by this build of liblzma. - * - LZMA_UNSUPPORTED_CHECK: The given check type is not - * supported by this liblzma build. - * - LZMA_PROG_ERROR: One or more of the parameters have values - * that will never be valid. For example, strm == NULL. - * - * If initialization fails (return value is not LZMA_OK), all the memory - * allocated for *strm by liblzma is always freed. Thus, there is no need - * to call lzma_end() after failed initialization. - * - * If initialization succeeds, use lzma_code() to do the actual encoding. - * Valid values for `action' (the second argument of lzma_code()) are - * LZMA_RUN, LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, and LZMA_FINISH. In future, - * there may be compression levels or flags that don't support LZMA_SYNC_FLUSH. - */ -extern LZMA_API(lzma_ret) lzma_easy_encoder( - lzma_stream *strm, uint32_t preset, lzma_check check) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Single-call .xz Stream encoding using a preset number - * - * The maximum required output buffer size can be calculated with - * lzma_stream_buffer_bound(). - * - * \param preset Compression preset to use. See the description - * in lzma_easy_encoder(). - * \param check Type of the integrity check to calculate from - * uncompressed data. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param out Beginning of the output buffer - * \param out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_easy_buffer_encode( - uint32_t preset, lzma_check check, - const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Initialize .xz Stream encoder using a custom filter chain - * - * \param strm Pointer to properly prepared lzma_stream - * \param filters Array of filters. This must be terminated with - * filters[n].id = LZMA_VLI_UNKNOWN. See filter.h for - * more information. - * \param check Type of the integrity check to calculate from - * uncompressed data. - * - * \return - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_encoder(lzma_stream *strm, - const lzma_filter *filters, lzma_check check) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Calculate approximate memory usage of multithreaded .xz encoder - * - * Since doing the encoding in threaded mode doesn't affect the memory - * requirements of single-threaded decompressor, you can use - * lzma_easy_decoder_memusage(options->preset) or - * lzma_raw_decoder_memusage(options->filters) to calculate - * the decompressor memory requirements. - * - * \param options Compression options - * - * \return Number of bytes of memory required for encoding with the - * given options. If an error occurs, for example due to - * unsupported preset or filter chain, UINT64_MAX is returned. - */ -extern LZMA_API(uint64_t) lzma_stream_encoder_mt_memusage( - const lzma_mt *options) lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize multithreaded .xz Stream encoder - * - * This provides the functionality of lzma_easy_encoder() and - * lzma_stream_encoder() as a single function for multithreaded use. - * - * The supported actions for lzma_code() are LZMA_RUN, LZMA_FULL_FLUSH, - * LZMA_FULL_BARRIER, and LZMA_FINISH. Support for LZMA_SYNC_FLUSH might be - * added in the future. - * - * \param strm Pointer to properly prepared lzma_stream - * \param options Pointer to multithreaded compression options - * - * \return - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_encoder_mt( - lzma_stream *strm, const lzma_mt *options) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize .lzma encoder (legacy file format) - * - * The .lzma format is sometimes called the LZMA_Alone format, which is the - * reason for the name of this function. The .lzma format supports only the - * LZMA1 filter. There is no support for integrity checks like CRC32. - * - * Use this function if and only if you need to create files readable by - * legacy LZMA tools such as LZMA Utils 4.32.x. Moving to the .xz format - * is strongly recommended. - * - * The valid action values for lzma_code() are LZMA_RUN and LZMA_FINISH. - * No kind of flushing is supported, because the file format doesn't make - * it possible. - * - * \return - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_alone_encoder( - lzma_stream *strm, const lzma_options_lzma *options) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Calculate output buffer size for single-call Stream encoder - * - * When trying to compress uncompressible data, the encoded size will be - * slightly bigger than the input data. This function calculates how much - * output buffer space is required to be sure that lzma_stream_buffer_encode() - * doesn't return LZMA_BUF_ERROR. - * - * The calculated value is not exact, but it is guaranteed to be big enough. - * The actual maximum output space required may be slightly smaller (up to - * about 100 bytes). This should not be a problem in practice. - * - * If the calculated maximum size doesn't fit into size_t or would make the - * Stream grow past LZMA_VLI_MAX (which should never happen in practice), - * zero is returned to indicate the error. - * - * \note The limit calculated by this function applies only to - * single-call encoding. Multi-call encoding may (and probably - * will) have larger maximum expansion when encoding - * uncompressible data. Currently there is no function to - * calculate the maximum expansion of multi-call encoding. - */ -extern LZMA_API(size_t) lzma_stream_buffer_bound(size_t uncompressed_size) - lzma_nothrow; - - -/** - * \brief Single-call .xz Stream encoder - * - * \param filters Array of filters. This must be terminated with - * filters[n].id = LZMA_VLI_UNKNOWN. See filter.h - * for more information. - * \param check Type of the integrity check to calculate from - * uncompressed data. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param out Beginning of the output buffer - * \param out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_UNSUPPORTED_CHECK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_buffer_encode( - lzma_filter *filters, lzma_check check, - const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/************ - * Decoding * - ************/ - -/** - * This flag makes lzma_code() return LZMA_NO_CHECK if the input stream - * being decoded has no integrity check. Note that when used with - * lzma_auto_decoder(), all .lzma files will trigger LZMA_NO_CHECK - * if LZMA_TELL_NO_CHECK is used. - */ -#define LZMA_TELL_NO_CHECK UINT32_C(0x01) - - -/** - * This flag makes lzma_code() return LZMA_UNSUPPORTED_CHECK if the input - * stream has an integrity check, but the type of the integrity check is not - * supported by this liblzma version or build. Such files can still be - * decoded, but the integrity check cannot be verified. - */ -#define LZMA_TELL_UNSUPPORTED_CHECK UINT32_C(0x02) - - -/** - * This flag makes lzma_code() return LZMA_GET_CHECK as soon as the type - * of the integrity check is known. The type can then be got with - * lzma_get_check(). - */ -#define LZMA_TELL_ANY_CHECK UINT32_C(0x04) - - -/** - * This flag makes lzma_code() not calculate and verify the integrity check - * of the compressed data in .xz files. This means that invalid integrity - * check values won't be detected and LZMA_DATA_ERROR won't be returned in - * such cases. - * - * This flag only affects the checks of the compressed data itself; the CRC32 - * values in the .xz headers will still be verified normally. - * - * Don't use this flag unless you know what you are doing. Possible reasons - * to use this flag: - * - * - Trying to recover data from a corrupt .xz file. - * - * - Speeding up decompression, which matters mostly with SHA-256 - * or with files that have compressed extremely well. It's recommended - * to not use this flag for this purpose unless the file integrity is - * verified externally in some other way. - * - * Support for this flag was added in liblzma 5.1.4beta. - */ -#define LZMA_IGNORE_CHECK UINT32_C(0x10) - - -/** - * This flag enables decoding of concatenated files with file formats that - * allow concatenating compressed files as is. From the formats currently - * supported by liblzma, only the .xz format allows concatenated files. - * Concatenated files are not allowed with the legacy .lzma format. - * - * This flag also affects the usage of the `action' argument for lzma_code(). - * When LZMA_CONCATENATED is used, lzma_code() won't return LZMA_STREAM_END - * unless LZMA_FINISH is used as `action'. Thus, the application has to set - * LZMA_FINISH in the same way as it does when encoding. - * - * If LZMA_CONCATENATED is not used, the decoders still accept LZMA_FINISH - * as `action' for lzma_code(), but the usage of LZMA_FINISH isn't required. - */ -#define LZMA_CONCATENATED UINT32_C(0x08) - - -/** - * \brief Initialize .xz Stream decoder - * - * \param strm Pointer to properly prepared lzma_stream - * \param memlimit Memory usage limit as bytes. Use UINT64_MAX - * to effectively disable the limiter. - * \param flags Bitwise-or of zero or more of the decoder flags: - * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, - * LZMA_TELL_ANY_CHECK, LZMA_CONCATENATED - * - * \return - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR: Cannot allocate memory. - * - LZMA_OPTIONS_ERROR: Unsupported flags - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_decoder( - lzma_stream *strm, uint64_t memlimit, uint32_t flags) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode .xz Streams and .lzma files with autodetection - * - * This decoder autodetects between the .xz and .lzma file formats, and - * calls lzma_stream_decoder() or lzma_alone_decoder() once the type - * of the input file has been detected. - * - * \param strm Pointer to properly prepared lzma_stream - * \param memlimit Memory usage limit as bytes. Use UINT64_MAX - * to effectively disable the limiter. - * \param flags Bitwise-or of flags, or zero for no flags. - * - * \return - LZMA_OK: Initialization was successful. - * - LZMA_MEM_ERROR: Cannot allocate memory. - * - LZMA_OPTIONS_ERROR: Unsupported flags - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_auto_decoder( - lzma_stream *strm, uint64_t memlimit, uint32_t flags) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize .lzma decoder (legacy file format) - * - * Valid `action' arguments to lzma_code() are LZMA_RUN and LZMA_FINISH. - * There is no need to use LZMA_FINISH, but allowing it may simplify - * certain types of applications. - * - * \return - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_alone_decoder( - lzma_stream *strm, uint64_t memlimit) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Single-call .xz Stream decoder - * - * \param memlimit Pointer to how much memory the decoder is allowed - * to allocate. The value pointed by this pointer is - * modified if and only if LZMA_MEMLIMIT_ERROR is - * returned. - * \param flags Bitwise-or of zero or more of the decoder flags: - * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, - * LZMA_CONCATENATED. Note that LZMA_TELL_ANY_CHECK - * is not allowed and will return LZMA_PROG_ERROR. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_pos The next byte will be read from in[*in_pos]. - * *in_pos is updated only if decoding succeeds. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * \param out Beginning of the output buffer - * \param out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if decoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return - LZMA_OK: Decoding was successful. - * - LZMA_FORMAT_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_DATA_ERROR - * - LZMA_NO_CHECK: This can be returned only if using - * the LZMA_TELL_NO_CHECK flag. - * - LZMA_UNSUPPORTED_CHECK: This can be returned only if using - * the LZMA_TELL_UNSUPPORTED_CHECK flag. - * - LZMA_MEM_ERROR - * - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached. - * The minimum required memlimit value was stored to *memlimit. - * - LZMA_BUF_ERROR: Output buffer was too small. - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_stream_buffer_decode( - uint64_t *memlimit, uint32_t flags, - const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; diff --git a/game/client/third/minizip/lib/liblzma/api/lzma/filter.h b/game/client/third/minizip/lib/liblzma/api/lzma/filter.h deleted file mode 100755 index 4e78752b..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma/filter.h +++ /dev/null @@ -1,425 +0,0 @@ -/** - * \file lzma/filter.h - * \brief Common filter related types and functions - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - * - * See ../lzma.h for information about liblzma as a whole. - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Maximum number of filters in a chain - * - * A filter chain can have 1-4 filters, of which three are allowed to change - * the size of the data. Usually only one or two filters are needed. - */ -#define LZMA_FILTERS_MAX 4 - - -/** - * \brief Filter options - * - * This structure is used to pass Filter ID and a pointer filter's - * options to liblzma. A few functions work with a single lzma_filter - * structure, while most functions expect a filter chain. - * - * A filter chain is indicated with an array of lzma_filter structures. - * The array is terminated with .id = LZMA_VLI_UNKNOWN. Thus, the filter - * array must have LZMA_FILTERS_MAX + 1 elements (that is, five) to - * be able to hold any arbitrary filter chain. This is important when - * using lzma_block_header_decode() from block.h, because too small - * array would make liblzma write past the end of the filters array. - */ -typedef struct { - /** - * \brief Filter ID - * - * Use constants whose name begin with `LZMA_FILTER_' to specify - * different filters. In an array of lzma_filter structures, use - * LZMA_VLI_UNKNOWN to indicate end of filters. - * - * \note This is not an enum, because on some systems enums - * cannot be 64-bit. - */ - lzma_vli id; - - /** - * \brief Pointer to filter-specific options structure - * - * If the filter doesn't need options, set this to NULL. If id is - * set to LZMA_VLI_UNKNOWN, options is ignored, and thus - * doesn't need be initialized. - */ - void *options; - -} lzma_filter; - - -/** - * \brief Test if the given Filter ID is supported for encoding - * - * Return true if the give Filter ID is supported for encoding by this - * liblzma build. Otherwise false is returned. - * - * There is no way to list which filters are available in this particular - * liblzma version and build. It would be useless, because the application - * couldn't know what kind of options the filter would need. - */ -extern LZMA_API(lzma_bool) lzma_filter_encoder_is_supported(lzma_vli id) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Test if the given Filter ID is supported for decoding - * - * Return true if the give Filter ID is supported for decoding by this - * liblzma build. Otherwise false is returned. - */ -extern LZMA_API(lzma_bool) lzma_filter_decoder_is_supported(lzma_vli id) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Copy the filters array - * - * Copy the Filter IDs and filter-specific options from src to dest. - * Up to LZMA_FILTERS_MAX filters are copied, plus the terminating - * .id == LZMA_VLI_UNKNOWN. Thus, dest should have at least - * LZMA_FILTERS_MAX + 1 elements space unless the caller knows that - * src is smaller than that. - * - * Unless the filter-specific options is NULL, the Filter ID has to be - * supported by liblzma, because liblzma needs to know the size of every - * filter-specific options structure. The filter-specific options are not - * validated. If options is NULL, any unsupported Filter IDs are copied - * without returning an error. - * - * Old filter-specific options in dest are not freed, so dest doesn't - * need to be initialized by the caller in any way. - * - * If an error occurs, memory possibly already allocated by this function - * is always freed. - * - * \return - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR: Unsupported Filter ID and its options - * is not NULL. - * - LZMA_PROG_ERROR: src or dest is NULL. - */ -extern LZMA_API(lzma_ret) lzma_filters_copy( - const lzma_filter *src, lzma_filter *dest, - const lzma_allocator *allocator) lzma_nothrow; - - -/** - * \brief Calculate approximate memory requirements for raw encoder - * - * This function can be used to calculate the memory requirements for - * Block and Stream encoders too because Block and Stream encoders don't - * need significantly more memory than raw encoder. - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Number of bytes of memory required for the given - * filter chain when encoding. If an error occurs, - * for example due to unsupported filter chain, - * UINT64_MAX is returned. - */ -extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Calculate approximate memory requirements for raw decoder - * - * This function can be used to calculate the memory requirements for - * Block and Stream decoders too because Block and Stream decoders don't - * need significantly more memory than raw decoder. - * - * \param filters Array of filters terminated with - * .id == LZMA_VLI_UNKNOWN. - * - * \return Number of bytes of memory required for the given - * filter chain when decoding. If an error occurs, - * for example due to unsupported filter chain, - * UINT64_MAX is returned. - */ -extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters) - lzma_nothrow lzma_attr_pure; - - -/** - * \brief Initialize raw encoder - * - * This function may be useful when implementing custom file formats. - * - * \param strm Pointer to properly prepared lzma_stream - * \param filters Array of lzma_filter structures. The end of the - * array must be marked with .id = LZMA_VLI_UNKNOWN. - * - * The `action' with lzma_code() can be LZMA_RUN, LZMA_SYNC_FLUSH (if the - * filter chain supports it), or LZMA_FINISH. - * - * \return - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_raw_encoder( - lzma_stream *strm, const lzma_filter *filters) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Initialize raw decoder - * - * The initialization of raw decoder goes similarly to raw encoder. - * - * The `action' with lzma_code() can be LZMA_RUN or LZMA_FINISH. Using - * LZMA_FINISH is not required, it is supported just for convenience. - * - * \return - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_raw_decoder( - lzma_stream *strm, const lzma_filter *filters) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Update the filter chain in the encoder - * - * This function is for advanced users only. This function has two slightly - * different purposes: - * - * - After LZMA_FULL_FLUSH when using Stream encoder: Set a new filter - * chain, which will be used starting from the next Block. - * - * - After LZMA_SYNC_FLUSH using Raw, Block, or Stream encoder: Change - * the filter-specific options in the middle of encoding. The actual - * filters in the chain (Filter IDs) cannot be changed. In the future, - * it might become possible to change the filter options without - * using LZMA_SYNC_FLUSH. - * - * While rarely useful, this function may be called also when no data has - * been compressed yet. In that case, this function will behave as if - * LZMA_FULL_FLUSH (Stream encoder) or LZMA_SYNC_FLUSH (Raw or Block - * encoder) had been used right before calling this function. - * - * \return - LZMA_OK - * - LZMA_MEM_ERROR - * - LZMA_MEMLIMIT_ERROR - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_filters_update( - lzma_stream *strm, const lzma_filter *filters) lzma_nothrow; - - -/** - * \brief Single-call raw encoder - * - * \param filters Array of lzma_filter structures. The end of the - * array must be marked with .id = LZMA_VLI_UNKNOWN. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_size Size of the input buffer - * \param out Beginning of the output buffer - * \param out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return - LZMA_OK: Encoding was successful. - * - LZMA_BUF_ERROR: Not enough output buffer space. - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_DATA_ERROR - * - LZMA_PROG_ERROR - * - * \note There is no function to calculate how big output buffer - * would surely be big enough. (lzma_stream_buffer_bound() - * works only for lzma_stream_buffer_encode(); raw encoder - * won't necessarily meet that bound.) - */ -extern LZMA_API(lzma_ret) lzma_raw_buffer_encode( - const lzma_filter *filters, const lzma_allocator *allocator, - const uint8_t *in, size_t in_size, uint8_t *out, - size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Single-call raw decoder - * - * \param filters Array of lzma_filter structures. The end of the - * array must be marked with .id = LZMA_VLI_UNKNOWN. - * \param allocator lzma_allocator for custom allocator functions. - * Set to NULL to use malloc() and free(). - * \param in Beginning of the input buffer - * \param in_pos The next byte will be read from in[*in_pos]. - * *in_pos is updated only if decoding succeeds. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * \param out Beginning of the output buffer - * \param out_pos The next byte will be written to out[*out_pos]. - * *out_pos is updated only if encoding succeeds. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - */ -extern LZMA_API(lzma_ret) lzma_raw_buffer_decode( - const lzma_filter *filters, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Get the size of the Filter Properties field - * - * This function may be useful when implementing custom file formats - * using the raw encoder and decoder. - * - * \param size Pointer to uint32_t to hold the size of the properties - * \param filter Filter ID and options (the size of the properties may - * vary depending on the options) - * - * \return - LZMA_OK - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - * - * \note This function validates the Filter ID, but does not - * necessarily validate the options. Thus, it is possible - * that this returns LZMA_OK while the following call to - * lzma_properties_encode() returns LZMA_OPTIONS_ERROR. - */ -extern LZMA_API(lzma_ret) lzma_properties_size( - uint32_t *size, const lzma_filter *filter) lzma_nothrow; - - -/** - * \brief Encode the Filter Properties field - * - * \param filter Filter ID and options - * \param props Buffer to hold the encoded options. The size of - * buffer must have been already determined with - * lzma_properties_size(). - * - * \return - LZMA_OK - * - LZMA_OPTIONS_ERROR - * - LZMA_PROG_ERROR - * - * \note Even this function won't validate more options than actually - * necessary. Thus, it is possible that encoding the properties - * succeeds but using the same options to initialize the encoder - * will fail. - * - * \note If lzma_properties_size() indicated that the size - * of the Filter Properties field is zero, calling - * lzma_properties_encode() is not required, but it - * won't do any harm either. - */ -extern LZMA_API(lzma_ret) lzma_properties_encode( - const lzma_filter *filter, uint8_t *props) lzma_nothrow; - - -/** - * \brief Decode the Filter Properties field - * - * \param filter filter->id must have been set to the correct - * Filter ID. filter->options doesn't need to be - * initialized (it's not freed by this function). The - * decoded options will be stored to filter->options. - * filter->options is set to NULL if there are no - * properties or if an error occurs. - * \param allocator Custom memory allocator used to allocate the - * options. Set to NULL to use the default malloc(), - * and in case of an error, also free(). - * \param props Input buffer containing the properties. - * \param props_size Size of the properties. This must be the exact - * size; giving too much or too little input will - * return LZMA_OPTIONS_ERROR. - * - * \return - LZMA_OK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - */ -extern LZMA_API(lzma_ret) lzma_properties_decode( - lzma_filter *filter, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) lzma_nothrow; - - -/** - * \brief Calculate encoded size of a Filter Flags field - * - * Knowing the size of Filter Flags is useful to know when allocating - * memory to hold the encoded Filter Flags. - * - * \param size Pointer to integer to hold the calculated size - * \param filter Filter ID and associated options whose encoded - * size is to be calculated - * - * \return - LZMA_OK: *size set successfully. Note that this doesn't - * guarantee that filter->options is valid, thus - * lzma_filter_flags_encode() may still fail. - * - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options. - * - LZMA_PROG_ERROR: Invalid options - * - * \note If you need to calculate size of List of Filter Flags, - * you need to loop over every lzma_filter entry. - */ -extern LZMA_API(lzma_ret) lzma_filter_flags_size( - uint32_t *size, const lzma_filter *filter) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Encode Filter Flags into given buffer - * - * In contrast to some functions, this doesn't allocate the needed buffer. - * This is due to how this function is used internally by liblzma. - * - * \param filter Filter ID and options to be encoded - * \param out Beginning of the output buffer - * \param out_pos out[*out_pos] is the next write position. This - * is updated by the encoder. - * \param out_size out[out_size] is the first byte to not write. - * - * \return - LZMA_OK: Encoding was successful. - * - LZMA_OPTIONS_ERROR: Invalid or unsupported options. - * - LZMA_PROG_ERROR: Invalid options or not enough output - * buffer space (you should have checked it with - * lzma_filter_flags_size()). - */ -extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filter, - uint8_t *out, size_t *out_pos, size_t out_size) - lzma_nothrow lzma_attr_warn_unused_result; - - -/** - * \brief Decode Filter Flags from given buffer - * - * The decoded result is stored into *filter. The old value of - * filter->options is not free()d. - * - * \return - LZMA_OK - * - LZMA_OPTIONS_ERROR - * - LZMA_MEM_ERROR - * - LZMA_PROG_ERROR - */ -extern LZMA_API(lzma_ret) lzma_filter_flags_decode( - lzma_filter *filter, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size) - lzma_nothrow lzma_attr_warn_unused_result; diff --git a/game/client/third/minizip/lib/liblzma/api/lzma/lzma12.h b/game/client/third/minizip/lib/liblzma/api/lzma/lzma12.h deleted file mode 100755 index 4e32fa3a..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma/lzma12.h +++ /dev/null @@ -1,420 +0,0 @@ -/** - * \file lzma/lzma12.h - * \brief LZMA1 and LZMA2 filters - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - * - * See ../lzma.h for information about liblzma as a whole. - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief LZMA1 Filter ID - * - * LZMA1 is the very same thing as what was called just LZMA in LZMA Utils, - * 7-Zip, and LZMA SDK. It's called LZMA1 here to prevent developers from - * accidentally using LZMA when they actually want LZMA2. - * - * LZMA1 shouldn't be used for new applications unless you _really_ know - * what you are doing. LZMA2 is almost always a better choice. - */ -#define LZMA_FILTER_LZMA1 LZMA_VLI_C(0x4000000000000001) - -/** - * \brief LZMA2 Filter ID - * - * Usually you want this instead of LZMA1. Compared to LZMA1, LZMA2 adds - * support for LZMA_SYNC_FLUSH, uncompressed chunks (smaller expansion - * when trying to compress uncompressible data), possibility to change - * lc/lp/pb in the middle of encoding, and some other internal improvements. - */ -#define LZMA_FILTER_LZMA2 LZMA_VLI_C(0x21) - - -/** - * \brief Match finders - * - * Match finder has major effect on both speed and compression ratio. - * Usually hash chains are faster than binary trees. - * - * If you will use LZMA_SYNC_FLUSH often, the hash chains may be a better - * choice, because binary trees get much higher compression ratio penalty - * with LZMA_SYNC_FLUSH. - * - * The memory usage formulas are only rough estimates, which are closest to - * reality when dict_size is a power of two. The formulas are more complex - * in reality, and can also change a little between liblzma versions. Use - * lzma_raw_encoder_memusage() to get more accurate estimate of memory usage. - */ -typedef enum { - LZMA_MF_HC3 = 0x03, - /**< - * \brief Hash Chain with 2- and 3-byte hashing - * - * Minimum nice_len: 3 - * - * Memory usage: - * - dict_size <= 16 MiB: dict_size * 7.5 - * - dict_size > 16 MiB: dict_size * 5.5 + 64 MiB - */ - - LZMA_MF_HC4 = 0x04, - /**< - * \brief Hash Chain with 2-, 3-, and 4-byte hashing - * - * Minimum nice_len: 4 - * - * Memory usage: - * - dict_size <= 32 MiB: dict_size * 7.5 - * - dict_size > 32 MiB: dict_size * 6.5 - */ - - LZMA_MF_BT2 = 0x12, - /**< - * \brief Binary Tree with 2-byte hashing - * - * Minimum nice_len: 2 - * - * Memory usage: dict_size * 9.5 - */ - - LZMA_MF_BT3 = 0x13, - /**< - * \brief Binary Tree with 2- and 3-byte hashing - * - * Minimum nice_len: 3 - * - * Memory usage: - * - dict_size <= 16 MiB: dict_size * 11.5 - * - dict_size > 16 MiB: dict_size * 9.5 + 64 MiB - */ - - LZMA_MF_BT4 = 0x14 - /**< - * \brief Binary Tree with 2-, 3-, and 4-byte hashing - * - * Minimum nice_len: 4 - * - * Memory usage: - * - dict_size <= 32 MiB: dict_size * 11.5 - * - dict_size > 32 MiB: dict_size * 10.5 - */ -} lzma_match_finder; - - -/** - * \brief Test if given match finder is supported - * - * Return true if the given match finder is supported by this liblzma build. - * Otherwise false is returned. It is safe to call this with a value that - * isn't listed in lzma_match_finder enumeration; the return value will be - * false. - * - * There is no way to list which match finders are available in this - * particular liblzma version and build. It would be useless, because - * a new match finder, which the application developer wasn't aware, - * could require giving additional options to the encoder that the older - * match finders don't need. - */ -extern LZMA_API(lzma_bool) lzma_mf_is_supported(lzma_match_finder match_finder) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Compression modes - * - * This selects the function used to analyze the data produced by the match - * finder. - */ -typedef enum { - LZMA_MODE_FAST = 1, - /**< - * \brief Fast compression - * - * Fast mode is usually at its best when combined with - * a hash chain match finder. - */ - - LZMA_MODE_NORMAL = 2 - /**< - * \brief Normal compression - * - * This is usually notably slower than fast mode. Use this - * together with binary tree match finders to expose the - * full potential of the LZMA1 or LZMA2 encoder. - */ -} lzma_mode; - - -/** - * \brief Test if given compression mode is supported - * - * Return true if the given compression mode is supported by this liblzma - * build. Otherwise false is returned. It is safe to call this with a value - * that isn't listed in lzma_mode enumeration; the return value will be false. - * - * There is no way to list which modes are available in this particular - * liblzma version and build. It would be useless, because a new compression - * mode, which the application developer wasn't aware, could require giving - * additional options to the encoder that the older modes don't need. - */ -extern LZMA_API(lzma_bool) lzma_mode_is_supported(lzma_mode mode) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Options specific to the LZMA1 and LZMA2 filters - * - * Since LZMA1 and LZMA2 share most of the code, it's simplest to share - * the options structure too. For encoding, all but the reserved variables - * need to be initialized unless specifically mentioned otherwise. - * lzma_lzma_preset() can be used to get a good starting point. - * - * For raw decoding, both LZMA1 and LZMA2 need dict_size, preset_dict, and - * preset_dict_size (if preset_dict != NULL). LZMA1 needs also lc, lp, and pb. - */ -typedef struct { - /** - * \brief Dictionary size in bytes - * - * Dictionary size indicates how many bytes of the recently processed - * uncompressed data is kept in memory. One method to reduce size of - * the uncompressed data is to store distance-length pairs, which - * indicate what data to repeat from the dictionary buffer. Thus, - * the bigger the dictionary, the better the compression ratio - * usually is. - * - * Maximum size of the dictionary depends on multiple things: - * - Memory usage limit - * - Available address space (not a problem on 64-bit systems) - * - Selected match finder (encoder only) - * - * Currently the maximum dictionary size for encoding is 1.5 GiB - * (i.e. (UINT32_C(1) << 30) + (UINT32_C(1) << 29)) even on 64-bit - * systems for certain match finder implementation reasons. In the - * future, there may be match finders that support bigger - * dictionaries. - * - * Decoder already supports dictionaries up to 4 GiB - 1 B (i.e. - * UINT32_MAX), so increasing the maximum dictionary size of the - * encoder won't cause problems for old decoders. - * - * Because extremely small dictionaries sizes would have unneeded - * overhead in the decoder, the minimum dictionary size is 4096 bytes. - * - * \note When decoding, too big dictionary does no other harm - * than wasting memory. - */ - uint32_t dict_size; -# define LZMA_DICT_SIZE_MIN UINT32_C(4096) -# define LZMA_DICT_SIZE_DEFAULT (UINT32_C(1) << 23) - - /** - * \brief Pointer to an initial dictionary - * - * It is possible to initialize the LZ77 history window using - * a preset dictionary. It is useful when compressing many - * similar, relatively small chunks of data independently from - * each other. The preset dictionary should contain typical - * strings that occur in the files being compressed. The most - * probable strings should be near the end of the preset dictionary. - * - * This feature should be used only in special situations. For - * now, it works correctly only with raw encoding and decoding. - * Currently none of the container formats supported by - * liblzma allow preset dictionary when decoding, thus if - * you create a .xz or .lzma file with preset dictionary, it - * cannot be decoded with the regular decoder functions. In the - * future, the .xz format will likely get support for preset - * dictionary though. - */ - const uint8_t *preset_dict; - - /** - * \brief Size of the preset dictionary - * - * Specifies the size of the preset dictionary. If the size is - * bigger than dict_size, only the last dict_size bytes are - * processed. - * - * This variable is read only when preset_dict is not NULL. - * If preset_dict is not NULL but preset_dict_size is zero, - * no preset dictionary is used (identical to only setting - * preset_dict to NULL). - */ - uint32_t preset_dict_size; - - /** - * \brief Number of literal context bits - * - * How many of the highest bits of the previous uncompressed - * eight-bit byte (also known as `literal') are taken into - * account when predicting the bits of the next literal. - * - * E.g. in typical English text, an upper-case letter is - * often followed by a lower-case letter, and a lower-case - * letter is usually followed by another lower-case letter. - * In the US-ASCII character set, the highest three bits are 010 - * for upper-case letters and 011 for lower-case letters. - * When lc is at least 3, the literal coding can take advantage of - * this property in the uncompressed data. - * - * There is a limit that applies to literal context bits and literal - * position bits together: lc + lp <= 4. Without this limit the - * decoding could become very slow, which could have security related - * results in some cases like email servers doing virus scanning. - * This limit also simplifies the internal implementation in liblzma. - * - * There may be LZMA1 streams that have lc + lp > 4 (maximum possible - * lc would be 8). It is not possible to decode such streams with - * liblzma. - */ - uint32_t lc; -# define LZMA_LCLP_MIN 0 -# define LZMA_LCLP_MAX 4 -# define LZMA_LC_DEFAULT 3 - - /** - * \brief Number of literal position bits - * - * lp affects what kind of alignment in the uncompressed data is - * assumed when encoding literals. A literal is a single 8-bit byte. - * See pb below for more information about alignment. - */ - uint32_t lp; -# define LZMA_LP_DEFAULT 0 - - /** - * \brief Number of position bits - * - * pb affects what kind of alignment in the uncompressed data is - * assumed in general. The default means four-byte alignment - * (2^ pb =2^2=4), which is often a good choice when there's - * no better guess. - * - * When the aligment is known, setting pb accordingly may reduce - * the file size a little. E.g. with text files having one-byte - * alignment (US-ASCII, ISO-8859-*, UTF-8), setting pb=0 can - * improve compression slightly. For UTF-16 text, pb=1 is a good - * choice. If the alignment is an odd number like 3 bytes, pb=0 - * might be the best choice. - * - * Even though the assumed alignment can be adjusted with pb and - * lp, LZMA1 and LZMA2 still slightly favor 16-byte alignment. - * It might be worth taking into account when designing file formats - * that are likely to be often compressed with LZMA1 or LZMA2. - */ - uint32_t pb; -# define LZMA_PB_MIN 0 -# define LZMA_PB_MAX 4 -# define LZMA_PB_DEFAULT 2 - - /** Compression mode */ - lzma_mode mode; - - /** - * \brief Nice length of a match - * - * This determines how many bytes the encoder compares from the match - * candidates when looking for the best match. Once a match of at - * least nice_len bytes long is found, the encoder stops looking for - * better candidates and encodes the match. (Naturally, if the found - * match is actually longer than nice_len, the actual length is - * encoded; it's not truncated to nice_len.) - * - * Bigger values usually increase the compression ratio and - * compression time. For most files, 32 to 128 is a good value, - * which gives very good compression ratio at good speed. - * - * The exact minimum value depends on the match finder. The maximum - * is 273, which is the maximum length of a match that LZMA1 and - * LZMA2 can encode. - */ - uint32_t nice_len; - - /** Match finder ID */ - lzma_match_finder mf; - - /** - * \brief Maximum search depth in the match finder - * - * For every input byte, match finder searches through the hash chain - * or binary tree in a loop, each iteration going one step deeper in - * the chain or tree. The searching stops if - * - a match of at least nice_len bytes long is found; - * - all match candidates from the hash chain or binary tree have - * been checked; or - * - maximum search depth is reached. - * - * Maximum search depth is needed to prevent the match finder from - * wasting too much time in case there are lots of short match - * candidates. On the other hand, stopping the search before all - * candidates have been checked can reduce compression ratio. - * - * Setting depth to zero tells liblzma to use an automatic default - * value, that depends on the selected match finder and nice_len. - * The default is in the range [4, 200] or so (it may vary between - * liblzma versions). - * - * Using a bigger depth value than the default can increase - * compression ratio in some cases. There is no strict maximum value, - * but high values (thousands or millions) should be used with care: - * the encoder could remain fast enough with typical input, but - * malicious input could cause the match finder to slow down - * dramatically, possibly creating a denial of service attack. - */ - uint32_t depth; - - /* - * Reserved space to allow possible future extensions without - * breaking the ABI. You should not touch these, because the names - * of these variables may change. These are and will never be used - * with the currently supported options, so it is safe to leave these - * uninitialized. - */ - uint32_t reserved_int1; - uint32_t reserved_int2; - uint32_t reserved_int3; - uint32_t reserved_int4; - uint32_t reserved_int5; - uint32_t reserved_int6; - uint32_t reserved_int7; - uint32_t reserved_int8; - lzma_reserved_enum reserved_enum1; - lzma_reserved_enum reserved_enum2; - lzma_reserved_enum reserved_enum3; - lzma_reserved_enum reserved_enum4; - void *reserved_ptr1; - void *reserved_ptr2; - -} lzma_options_lzma; - - -/** - * \brief Set a compression preset to lzma_options_lzma structure - * - * 0 is the fastest and 9 is the slowest. These match the switches -0 .. -9 - * of the xz command line tool. In addition, it is possible to bitwise-or - * flags to the preset. Currently only LZMA_PRESET_EXTREME is supported. - * The flags are defined in container.h, because the flags are used also - * with lzma_easy_encoder(). - * - * The preset values are subject to changes between liblzma versions. - * - * This function is available only if LZMA1 or LZMA2 encoder has been enabled - * when building liblzma. - * - * \return On success, false is returned. If the preset is not - * supported, true is returned. - */ -extern LZMA_API(lzma_bool) lzma_lzma_preset( - lzma_options_lzma *options, uint32_t preset) lzma_nothrow; diff --git a/game/client/third/minizip/lib/liblzma/api/lzma/version.h b/game/client/third/minizip/lib/liblzma/api/lzma/version.h deleted file mode 100755 index b5e061c2..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma/version.h +++ /dev/null @@ -1,121 +0,0 @@ -/** - * \file lzma/version.h - * \brief Version number - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - * - * See ../lzma.h for information about liblzma as a whole. - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/* - * Version number split into components - */ -#define LZMA_VERSION_MAJOR 5 -#define LZMA_VERSION_MINOR 2 -#define LZMA_VERSION_PATCH 3 -#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE - -#ifndef LZMA_VERSION_COMMIT -# define LZMA_VERSION_COMMIT "" -#endif - - -/* - * Map symbolic stability levels to integers. - */ -#define LZMA_VERSION_STABILITY_ALPHA 0 -#define LZMA_VERSION_STABILITY_BETA 1 -#define LZMA_VERSION_STABILITY_STABLE 2 - - -/** - * \brief Compile-time version number - * - * The version number is of format xyyyzzzs where - * - x = major - * - yyy = minor - * - zzz = revision - * - s indicates stability: 0 = alpha, 1 = beta, 2 = stable - * - * The same xyyyzzz triplet is never reused with different stability levels. - * For example, if 5.1.0alpha has been released, there will never be 5.1.0beta - * or 5.1.0 stable. - * - * \note The version number of liblzma has nothing to with - * the version number of Igor Pavlov's LZMA SDK. - */ -#define LZMA_VERSION (LZMA_VERSION_MAJOR * UINT32_C(10000000) \ - + LZMA_VERSION_MINOR * UINT32_C(10000) \ - + LZMA_VERSION_PATCH * UINT32_C(10) \ - + LZMA_VERSION_STABILITY) - - -/* - * Macros to construct the compile-time version string - */ -#if LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_ALPHA -# define LZMA_VERSION_STABILITY_STRING "alpha" -#elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_BETA -# define LZMA_VERSION_STABILITY_STRING "beta" -#elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_STABLE -# define LZMA_VERSION_STABILITY_STRING "" -#else -# error Incorrect LZMA_VERSION_STABILITY -#endif - -#define LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) \ - #major "." #minor "." #patch stability commit - -#define LZMA_VERSION_STRING_C(major, minor, patch, stability, commit) \ - LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) - - -/** - * \brief Compile-time version as a string - * - * This can be for example "4.999.5alpha", "4.999.8beta", or "5.0.0" (stable - * versions don't have any "stable" suffix). In future, a snapshot built - * from source code repository may include an additional suffix, for example - * "4.999.8beta-21-g1d92". The commit ID won't be available in numeric form - * in LZMA_VERSION macro. - */ -#define LZMA_VERSION_STRING LZMA_VERSION_STRING_C( \ - LZMA_VERSION_MAJOR, LZMA_VERSION_MINOR, \ - LZMA_VERSION_PATCH, LZMA_VERSION_STABILITY_STRING, \ - LZMA_VERSION_COMMIT) - - -/* #ifndef is needed for use with windres (MinGW or Cygwin). */ -#ifndef LZMA_H_INTERNAL_RC - -/** - * \brief Run-time version number as an integer - * - * Return the value of LZMA_VERSION macro at the compile time of liblzma. - * This allows the application to compare if it was built against the same, - * older, or newer version of liblzma that is currently running. - */ -extern LZMA_API(uint32_t) lzma_version_number(void) - lzma_nothrow lzma_attr_const; - - -/** - * \brief Run-time version as a string - * - * This function may be useful if you want to display which version of - * liblzma your application is currently using. - */ -extern LZMA_API(const char *) lzma_version_string(void) - lzma_nothrow lzma_attr_const; - -#endif diff --git a/game/client/third/minizip/lib/liblzma/api/lzma/vli.h b/game/client/third/minizip/lib/liblzma/api/lzma/vli.h deleted file mode 100755 index 9ad13f2e..00000000 --- a/game/client/third/minizip/lib/liblzma/api/lzma/vli.h +++ /dev/null @@ -1,166 +0,0 @@ -/** - * \file lzma/vli.h - * \brief Variable-length integer handling - * - * In the .xz format, most integers are encoded in a variable-length - * representation, which is sometimes called little endian base-128 encoding. - * This saves space when smaller values are more likely than bigger values. - * - * The encoding scheme encodes seven bits to every byte, using minimum - * number of bytes required to represent the given value. Encodings that use - * non-minimum number of bytes are invalid, thus every integer has exactly - * one encoded representation. The maximum number of bits in a VLI is 63, - * thus the vli argument must be less than or equal to UINT64_MAX / 2. You - * should use LZMA_VLI_MAX for clarity. - */ - -/* - * Author: Lasse Collin - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - * - * See ../lzma.h for information about liblzma as a whole. - */ - -#ifndef LZMA_H_INTERNAL -# error Never include this file directly. Use instead. -#endif - - -/** - * \brief Maximum supported value of a variable-length integer - */ -#define LZMA_VLI_MAX (UINT64_MAX / 2) - -/** - * \brief VLI value to denote that the value is unknown - */ -#define LZMA_VLI_UNKNOWN UINT64_MAX - -/** - * \brief Maximum supported encoded length of variable length integers - */ -#define LZMA_VLI_BYTES_MAX 9 - -/** - * \brief VLI constant suffix - */ -#define LZMA_VLI_C(n) UINT64_C(n) - - -/** - * \brief Variable-length integer type - * - * Valid VLI values are in the range [0, LZMA_VLI_MAX]. Unknown value is - * indicated with LZMA_VLI_UNKNOWN, which is the maximum value of the - * underlaying integer type. - * - * lzma_vli will be uint64_t for the foreseeable future. If a bigger size - * is needed in the future, it is guaranteed that 2 * LZMA_VLI_MAX will - * not overflow lzma_vli. This simplifies integer overflow detection. - */ -typedef uint64_t lzma_vli; - - -/** - * \brief Validate a variable-length integer - * - * This is useful to test that application has given acceptable values - * for example in the uncompressed_size and compressed_size variables. - * - * \return True if the integer is representable as VLI or if it - * indicates unknown value. - */ -#define lzma_vli_is_valid(vli) \ - ((vli) <= LZMA_VLI_MAX || (vli) == LZMA_VLI_UNKNOWN) - - -/** - * \brief Encode a variable-length integer - * - * This function has two modes: single-call and multi-call. Single-call mode - * encodes the whole integer at once; it is an error if the output buffer is - * too small. Multi-call mode saves the position in *vli_pos, and thus it is - * possible to continue encoding if the buffer becomes full before the whole - * integer has been encoded. - * - * \param vli Integer to be encoded - * \param vli_pos How many VLI-encoded bytes have already been written - * out. When starting to encode a new integer in - * multi-call mode, *vli_pos must be set to zero. - * To use single-call encoding, set vli_pos to NULL. - * \param out Beginning of the output buffer - * \param out_pos The next byte will be written to out[*out_pos]. - * \param out_size Size of the out buffer; the first byte into - * which no data is written to is out[out_size]. - * - * \return Slightly different return values are used in multi-call and - * single-call modes. - * - * Single-call (vli_pos == NULL): - * - LZMA_OK: Integer successfully encoded. - * - LZMA_PROG_ERROR: Arguments are not sane. This can be due - * to too little output space; single-call mode doesn't use - * LZMA_BUF_ERROR, since the application should have checked - * the encoded size with lzma_vli_size(). - * - * Multi-call (vli_pos != NULL): - * - LZMA_OK: So far all OK, but the integer is not - * completely written out yet. - * - LZMA_STREAM_END: Integer successfully encoded. - * - LZMA_BUF_ERROR: No output space was provided. - * - LZMA_PROG_ERROR: Arguments are not sane. - */ -extern LZMA_API(lzma_ret) lzma_vli_encode(lzma_vli vli, size_t *vli_pos, - uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; - - -/** - * \brief Decode a variable-length integer - * - * Like lzma_vli_encode(), this function has single-call and multi-call modes. - * - * \param vli Pointer to decoded integer. The decoder will - * initialize it to zero when *vli_pos == 0, so - * application isn't required to initialize *vli. - * \param vli_pos How many bytes have already been decoded. When - * starting to decode a new integer in multi-call - * mode, *vli_pos must be initialized to zero. To - * use single-call decoding, set vli_pos to NULL. - * \param in Beginning of the input buffer - * \param in_pos The next byte will be read from in[*in_pos]. - * \param in_size Size of the input buffer; the first byte that - * won't be read is in[in_size]. - * - * \return Slightly different return values are used in multi-call and - * single-call modes. - * - * Single-call (vli_pos == NULL): - * - LZMA_OK: Integer successfully decoded. - * - LZMA_DATA_ERROR: Integer is corrupt. This includes hitting - * the end of the input buffer before the whole integer was - * decoded; providing no input at all will use LZMA_DATA_ERROR. - * - LZMA_PROG_ERROR: Arguments are not sane. - * - * Multi-call (vli_pos != NULL): - * - LZMA_OK: So far all OK, but the integer is not - * completely decoded yet. - * - LZMA_STREAM_END: Integer successfully decoded. - * - LZMA_DATA_ERROR: Integer is corrupt. - * - LZMA_BUF_ERROR: No input was provided. - * - LZMA_PROG_ERROR: Arguments are not sane. - */ -extern LZMA_API(lzma_ret) lzma_vli_decode(lzma_vli *vli, size_t *vli_pos, - const uint8_t *in, size_t *in_pos, size_t in_size) - lzma_nothrow; - - -/** - * \brief Get the number of bytes required to encode a VLI - * - * \return Number of bytes on success (1-9). If vli isn't valid, - * zero is returned. - */ -extern LZMA_API(uint32_t) lzma_vli_size(lzma_vli vli) - lzma_nothrow lzma_attr_pure; diff --git a/game/client/third/minizip/lib/liblzma/check/check.c b/game/client/third/minizip/lib/liblzma/check/check.c deleted file mode 100755 index 428ddaeb..00000000 --- a/game/client/third/minizip/lib/liblzma/check/check.c +++ /dev/null @@ -1,174 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file check.c -/// \brief Single API to access different integrity checks -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" - - -extern LZMA_API(lzma_bool) -lzma_check_is_supported(lzma_check type) -{ - if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) - return false; - - static const lzma_bool available_checks[LZMA_CHECK_ID_MAX + 1] = { - true, // LZMA_CHECK_NONE - -#ifdef HAVE_CHECK_CRC32 - true, -#else - false, -#endif - - false, // Reserved - false, // Reserved - -#ifdef HAVE_CHECK_CRC64 - true, -#else - false, -#endif - - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - -#ifdef HAVE_CHECK_SHA256 - true, -#else - false, -#endif - - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - false, // Reserved - }; - - return available_checks[(unsigned int)(type)]; -} - - -extern LZMA_API(uint32_t) -lzma_check_size(lzma_check type) -{ - if ((unsigned int)(type) > LZMA_CHECK_ID_MAX) - return UINT32_MAX; - - // See file-format.txt section 2.1.1.2. - static const uint8_t check_sizes[LZMA_CHECK_ID_MAX + 1] = { - 0, - 4, 4, 4, - 8, 8, 8, - 16, 16, 16, - 32, 32, 32, - 64, 64, 64 - }; - - return check_sizes[(unsigned int)(type)]; -} - - -extern void -lzma_check_init(lzma_check_state *check, lzma_check type) -{ - switch (type) { - case LZMA_CHECK_NONE: - break; - -#ifdef HAVE_CHECK_CRC32 - case LZMA_CHECK_CRC32: - check->state.crc32 = 0; - break; -#endif - -#ifdef HAVE_CHECK_CRC64 - case LZMA_CHECK_CRC64: - check->state.crc64 = 0; - break; -#endif - -#ifdef HAVE_CHECK_SHA256 - case LZMA_CHECK_SHA256: - lzma_sha256_init(check); - break; -#endif - - default: - break; - } - - return; -} - - -extern void -lzma_check_update(lzma_check_state *check, lzma_check type, - const uint8_t *buf, size_t size) -{ - switch (type) { -#ifdef HAVE_CHECK_CRC32 - case LZMA_CHECK_CRC32: - check->state.crc32 = lzma_crc32(buf, size, check->state.crc32); - break; -#endif - -#ifdef HAVE_CHECK_CRC64 - case LZMA_CHECK_CRC64: - check->state.crc64 = lzma_crc64(buf, size, check->state.crc64); - break; -#endif - -#ifdef HAVE_CHECK_SHA256 - case LZMA_CHECK_SHA256: - lzma_sha256_update(buf, size, check); - break; -#endif - - default: - break; - } - - return; -} - - -extern void -lzma_check_finish(lzma_check_state *check, lzma_check type) -{ - switch (type) { -#ifdef HAVE_CHECK_CRC32 - case LZMA_CHECK_CRC32: - check->buffer.u32[0] = conv32le(check->state.crc32); - break; -#endif - -#ifdef HAVE_CHECK_CRC64 - case LZMA_CHECK_CRC64: - check->buffer.u64[0] = conv64le(check->state.crc64); - break; -#endif - -#ifdef HAVE_CHECK_SHA256 - case LZMA_CHECK_SHA256: - lzma_sha256_finish(check); - break; -#endif - - default: - break; - } - - return; -} diff --git a/game/client/third/minizip/lib/liblzma/check/check.h b/game/client/third/minizip/lib/liblzma/check/check.h deleted file mode 100755 index 554a7417..00000000 --- a/game/client/third/minizip/lib/liblzma/check/check.h +++ /dev/null @@ -1,172 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file check.h -/// \brief Internal API to different integrity check functions -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_CHECK_H -#define LZMA_CHECK_H - -#include "common.h" - -// If the function for external SHA-256 is missing, use the internal SHA-256 -// code. Due to how configure works, these defines can only get defined when -// both a usable header and a type have already been found. -#if !(defined(HAVE_CC_SHA256_INIT) \ - || defined(HAVE_SHA256_INIT) \ - || defined(HAVE_SHA256INIT)) -# define HAVE_INTERNAL_SHA256 1 -#endif - -#if defined(HAVE_INTERNAL_SHA256) -// Nothing -#elif defined(HAVE_COMMONCRYPTO_COMMONDIGEST_H) -# include -#elif defined(HAVE_SHA256_H) -# include -# include -#elif defined(HAVE_SHA2_H) -# include -# include -#endif - -#if defined(HAVE_INTERNAL_SHA256) -/// State for the internal SHA-256 implementation -typedef struct { - /// Internal state - uint32_t state[8]; - - /// Size of the message excluding padding - uint64_t size; -} lzma_sha256_state; -#elif defined(HAVE_CC_SHA256_CTX) -typedef CC_SHA256_CTX lzma_sha256_state; -#elif defined(HAVE_SHA256_CTX) -typedef SHA256_CTX lzma_sha256_state; -#elif defined(HAVE_SHA2_CTX) -typedef SHA2_CTX lzma_sha256_state; -#endif - -#if defined(HAVE_INTERNAL_SHA256) -// Nothing -#elif defined(HAVE_CC_SHA256_INIT) -# define LZMA_SHA256FUNC(x) CC_SHA256_ ## x -#elif defined(HAVE_SHA256_INIT) -# define LZMA_SHA256FUNC(x) SHA256_ ## x -#elif defined(HAVE_SHA256INIT) -# define LZMA_SHA256FUNC(x) SHA256 ## x -#endif - -// Index hashing needs the best possible hash function (preferably -// a cryptographic hash) for maximum reliability. -#if defined(HAVE_CHECK_SHA256) -# define LZMA_CHECK_BEST LZMA_CHECK_SHA256 -#elif defined(HAVE_CHECK_CRC64) -# define LZMA_CHECK_BEST LZMA_CHECK_CRC64 -#else -# define LZMA_CHECK_BEST LZMA_CHECK_CRC32 -#endif - - -/// \brief Structure to hold internal state of the check being calculated -/// -/// \note This is not in the public API because this structure may -/// change in future if new integrity check algorithms are added. -typedef struct { - /// Buffer to hold the final result and a temporary buffer for SHA256. - union { - uint8_t u8[64]; - uint32_t u32[16]; - uint64_t u64[8]; - } buffer; - - /// Check-specific data - union { - uint32_t crc32; - uint64_t crc64; - lzma_sha256_state sha256; - } state; - -} lzma_check_state; - - -/// lzma_crc32_table[0] is needed by LZ encoder so we need to keep -/// the array two-dimensional. -#ifdef HAVE_SMALL -extern uint32_t lzma_crc32_table[1][256]; -extern void lzma_crc32_init(void); -#else -extern const uint32_t lzma_crc32_table[8][256]; -extern const uint64_t lzma_crc64_table[4][256]; -#endif - - -/// \brief Initialize *check depending on type -/// -/// \param check LZMA_OK on success. LZMA_UNSUPPORTED_CHECK if the type -/// is not supported by the current version or build of -/// liblzma. LZMA_PROG_ERROR if type > LZMA_CHECK_ID_MAX. -extern void lzma_check_init(lzma_check_state *check, lzma_check type); - -/// Update the check state -extern void lzma_check_update(lzma_check_state *check, lzma_check type, - const uint8_t *buf, size_t size); - -/// Finish the check calculation and store the result to check->buffer.u8. -extern void lzma_check_finish(lzma_check_state *check, lzma_check type); - - -#ifndef LZMA_SHA256FUNC - -/// Prepare SHA-256 state for new input. -extern void lzma_sha256_init(lzma_check_state *check); - -/// Update the SHA-256 hash state -extern void lzma_sha256_update( - const uint8_t *buf, size_t size, lzma_check_state *check); - -/// Finish the SHA-256 calculation and store the result to check->buffer.u8. -extern void lzma_sha256_finish(lzma_check_state *check); - - -#else - -static inline void -lzma_sha256_init(lzma_check_state *check) -{ - LZMA_SHA256FUNC(Init)(&check->state.sha256); -} - - -static inline void -lzma_sha256_update(const uint8_t *buf, size_t size, lzma_check_state *check) -{ -#if defined(HAVE_CC_SHA256_INIT) && SIZE_MAX > UINT32_MAX - // Darwin's CC_SHA256_Update takes uint32_t as the buffer size, - // so use a loop to support size_t. - while (size > UINT32_MAX) { - LZMA_SHA256FUNC(Update)(&check->state.sha256, buf, UINT32_MAX); - buf += UINT32_MAX; - size -= UINT32_MAX; - } -#endif - - LZMA_SHA256FUNC(Update)(&check->state.sha256, buf, size); -} - - -static inline void -lzma_sha256_finish(lzma_check_state *check) -{ - LZMA_SHA256FUNC(Final)(check->buffer.u8, &check->state.sha256); -} - -#endif - -#endif diff --git a/game/client/third/minizip/lib/liblzma/check/crc32_fast.c b/game/client/third/minizip/lib/liblzma/check/crc32_fast.c deleted file mode 100755 index 94da8559..00000000 --- a/game/client/third/minizip/lib/liblzma/check/crc32_fast.c +++ /dev/null @@ -1,82 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc32.c -/// \brief CRC32 calculation -/// -/// Calculate the CRC32 using the slice-by-eight algorithm. -/// It is explained in this document: -/// http://www.intel.com/technology/comms/perfnet/download/CRC_generators.pdf -/// The code in this file is not the same as in Intel's paper, but -/// the basic principle is identical. -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "check.h" -#include "crc_macros.h" - - -// If you make any changes, do some bench marking! Seemingly unrelated -// changes can very easily ruin the performance (and very probably is -// very compiler dependent). -extern LZMA_API(uint32_t) -lzma_crc32(const uint8_t *buf, size_t size, uint32_t crc) -{ - crc = ~crc; - -#ifdef WORDS_BIGENDIAN - crc = bswap32(crc); -#endif - - if (size > 8) { - // Fix the alignment, if needed. The if statement above - // ensures that this won't read past the end of buf[]. - while ((uintptr_t)(buf) & 7) { - crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc); - --size; - } - - // Calculate the position where to stop. - const uint8_t *const limit = buf + (size & ~(size_t)(7)); - - // Calculate how many bytes must be calculated separately - // before returning the result. - size &= (size_t)(7); - - // Calculate the CRC32 using the slice-by-eight algorithm. - while (buf < limit) { - crc ^= *(const uint32_t *)(buf); - buf += 4; - - crc = lzma_crc32_table[7][A(crc)] - ^ lzma_crc32_table[6][B(crc)] - ^ lzma_crc32_table[5][C(crc)] - ^ lzma_crc32_table[4][D(crc)]; - - const uint32_t tmp = *(const uint32_t *)(buf); - buf += 4; - - // At least with some compilers, it is critical for - // performance, that the crc variable is XORed - // between the two table-lookup pairs. - crc = lzma_crc32_table[3][A(tmp)] - ^ lzma_crc32_table[2][B(tmp)] - ^ crc - ^ lzma_crc32_table[1][C(tmp)] - ^ lzma_crc32_table[0][D(tmp)]; - } - } - - while (size-- != 0) - crc = lzma_crc32_table[0][*buf++ ^ A(crc)] ^ S8(crc); - -#ifdef WORDS_BIGENDIAN - crc = bswap32(crc); -#endif - - return ~crc; -} diff --git a/game/client/third/minizip/lib/liblzma/check/crc32_table.c b/game/client/third/minizip/lib/liblzma/check/crc32_table.c deleted file mode 100755 index 368874eb..00000000 --- a/game/client/third/minizip/lib/liblzma/check/crc32_table.c +++ /dev/null @@ -1,19 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc32_table.c -/// \brief Precalculated CRC32 table with correct endianness -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - -#ifdef WORDS_BIGENDIAN -# include "crc32_table_be.h" -#else -# include "crc32_table_le.h" -#endif diff --git a/game/client/third/minizip/lib/liblzma/check/crc32_table_be.h b/game/client/third/minizip/lib/liblzma/check/crc32_table_be.h deleted file mode 100755 index c483cb67..00000000 --- a/game/client/third/minizip/lib/liblzma/check/crc32_table_be.h +++ /dev/null @@ -1,525 +0,0 @@ -/* This file has been automatically generated by crc32_tablegen.c. */ - -const uint32_t lzma_crc32_table[8][256] = { - { - 0x00000000, 0x96300777, 0x2C610EEE, 0xBA510999, - 0x19C46D07, 0x8FF46A70, 0x35A563E9, 0xA395649E, - 0x3288DB0E, 0xA4B8DC79, 0x1EE9D5E0, 0x88D9D297, - 0x2B4CB609, 0xBD7CB17E, 0x072DB8E7, 0x911DBF90, - 0x6410B71D, 0xF220B06A, 0x4871B9F3, 0xDE41BE84, - 0x7DD4DA1A, 0xEBE4DD6D, 0x51B5D4F4, 0xC785D383, - 0x56986C13, 0xC0A86B64, 0x7AF962FD, 0xECC9658A, - 0x4F5C0114, 0xD96C0663, 0x633D0FFA, 0xF50D088D, - 0xC8206E3B, 0x5E10694C, 0xE44160D5, 0x727167A2, - 0xD1E4033C, 0x47D4044B, 0xFD850DD2, 0x6BB50AA5, - 0xFAA8B535, 0x6C98B242, 0xD6C9BBDB, 0x40F9BCAC, - 0xE36CD832, 0x755CDF45, 0xCF0DD6DC, 0x593DD1AB, - 0xAC30D926, 0x3A00DE51, 0x8051D7C8, 0x1661D0BF, - 0xB5F4B421, 0x23C4B356, 0x9995BACF, 0x0FA5BDB8, - 0x9EB80228, 0x0888055F, 0xB2D90CC6, 0x24E90BB1, - 0x877C6F2F, 0x114C6858, 0xAB1D61C1, 0x3D2D66B6, - 0x9041DC76, 0x0671DB01, 0xBC20D298, 0x2A10D5EF, - 0x8985B171, 0x1FB5B606, 0xA5E4BF9F, 0x33D4B8E8, - 0xA2C90778, 0x34F9000F, 0x8EA80996, 0x18980EE1, - 0xBB0D6A7F, 0x2D3D6D08, 0x976C6491, 0x015C63E6, - 0xF4516B6B, 0x62616C1C, 0xD8306585, 0x4E0062F2, - 0xED95066C, 0x7BA5011B, 0xC1F40882, 0x57C40FF5, - 0xC6D9B065, 0x50E9B712, 0xEAB8BE8B, 0x7C88B9FC, - 0xDF1DDD62, 0x492DDA15, 0xF37CD38C, 0x654CD4FB, - 0x5861B24D, 0xCE51B53A, 0x7400BCA3, 0xE230BBD4, - 0x41A5DF4A, 0xD795D83D, 0x6DC4D1A4, 0xFBF4D6D3, - 0x6AE96943, 0xFCD96E34, 0x468867AD, 0xD0B860DA, - 0x732D0444, 0xE51D0333, 0x5F4C0AAA, 0xC97C0DDD, - 0x3C710550, 0xAA410227, 0x10100BBE, 0x86200CC9, - 0x25B56857, 0xB3856F20, 0x09D466B9, 0x9FE461CE, - 0x0EF9DE5E, 0x98C9D929, 0x2298D0B0, 0xB4A8D7C7, - 0x173DB359, 0x810DB42E, 0x3B5CBDB7, 0xAD6CBAC0, - 0x2083B8ED, 0xB6B3BF9A, 0x0CE2B603, 0x9AD2B174, - 0x3947D5EA, 0xAF77D29D, 0x1526DB04, 0x8316DC73, - 0x120B63E3, 0x843B6494, 0x3E6A6D0D, 0xA85A6A7A, - 0x0BCF0EE4, 0x9DFF0993, 0x27AE000A, 0xB19E077D, - 0x44930FF0, 0xD2A30887, 0x68F2011E, 0xFEC20669, - 0x5D5762F7, 0xCB676580, 0x71366C19, 0xE7066B6E, - 0x761BD4FE, 0xE02BD389, 0x5A7ADA10, 0xCC4ADD67, - 0x6FDFB9F9, 0xF9EFBE8E, 0x43BEB717, 0xD58EB060, - 0xE8A3D6D6, 0x7E93D1A1, 0xC4C2D838, 0x52F2DF4F, - 0xF167BBD1, 0x6757BCA6, 0xDD06B53F, 0x4B36B248, - 0xDA2B0DD8, 0x4C1B0AAF, 0xF64A0336, 0x607A0441, - 0xC3EF60DF, 0x55DF67A8, 0xEF8E6E31, 0x79BE6946, - 0x8CB361CB, 0x1A8366BC, 0xA0D26F25, 0x36E26852, - 0x95770CCC, 0x03470BBB, 0xB9160222, 0x2F260555, - 0xBE3BBAC5, 0x280BBDB2, 0x925AB42B, 0x046AB35C, - 0xA7FFD7C2, 0x31CFD0B5, 0x8B9ED92C, 0x1DAEDE5B, - 0xB0C2649B, 0x26F263EC, 0x9CA36A75, 0x0A936D02, - 0xA906099C, 0x3F360EEB, 0x85670772, 0x13570005, - 0x824ABF95, 0x147AB8E2, 0xAE2BB17B, 0x381BB60C, - 0x9B8ED292, 0x0DBED5E5, 0xB7EFDC7C, 0x21DFDB0B, - 0xD4D2D386, 0x42E2D4F1, 0xF8B3DD68, 0x6E83DA1F, - 0xCD16BE81, 0x5B26B9F6, 0xE177B06F, 0x7747B718, - 0xE65A0888, 0x706A0FFF, 0xCA3B0666, 0x5C0B0111, - 0xFF9E658F, 0x69AE62F8, 0xD3FF6B61, 0x45CF6C16, - 0x78E20AA0, 0xEED20DD7, 0x5483044E, 0xC2B30339, - 0x612667A7, 0xF71660D0, 0x4D476949, 0xDB776E3E, - 0x4A6AD1AE, 0xDC5AD6D9, 0x660BDF40, 0xF03BD837, - 0x53AEBCA9, 0xC59EBBDE, 0x7FCFB247, 0xE9FFB530, - 0x1CF2BDBD, 0x8AC2BACA, 0x3093B353, 0xA6A3B424, - 0x0536D0BA, 0x9306D7CD, 0x2957DE54, 0xBF67D923, - 0x2E7A66B3, 0xB84A61C4, 0x021B685D, 0x942B6F2A, - 0x37BE0BB4, 0xA18E0CC3, 0x1BDF055A, 0x8DEF022D - }, { - 0x00000000, 0x41311B19, 0x82623632, 0xC3532D2B, - 0x04C56C64, 0x45F4777D, 0x86A75A56, 0xC796414F, - 0x088AD9C8, 0x49BBC2D1, 0x8AE8EFFA, 0xCBD9F4E3, - 0x0C4FB5AC, 0x4D7EAEB5, 0x8E2D839E, 0xCF1C9887, - 0x5112C24A, 0x1023D953, 0xD370F478, 0x9241EF61, - 0x55D7AE2E, 0x14E6B537, 0xD7B5981C, 0x96848305, - 0x59981B82, 0x18A9009B, 0xDBFA2DB0, 0x9ACB36A9, - 0x5D5D77E6, 0x1C6C6CFF, 0xDF3F41D4, 0x9E0E5ACD, - 0xA2248495, 0xE3159F8C, 0x2046B2A7, 0x6177A9BE, - 0xA6E1E8F1, 0xE7D0F3E8, 0x2483DEC3, 0x65B2C5DA, - 0xAAAE5D5D, 0xEB9F4644, 0x28CC6B6F, 0x69FD7076, - 0xAE6B3139, 0xEF5A2A20, 0x2C09070B, 0x6D381C12, - 0xF33646DF, 0xB2075DC6, 0x715470ED, 0x30656BF4, - 0xF7F32ABB, 0xB6C231A2, 0x75911C89, 0x34A00790, - 0xFBBC9F17, 0xBA8D840E, 0x79DEA925, 0x38EFB23C, - 0xFF79F373, 0xBE48E86A, 0x7D1BC541, 0x3C2ADE58, - 0x054F79F0, 0x447E62E9, 0x872D4FC2, 0xC61C54DB, - 0x018A1594, 0x40BB0E8D, 0x83E823A6, 0xC2D938BF, - 0x0DC5A038, 0x4CF4BB21, 0x8FA7960A, 0xCE968D13, - 0x0900CC5C, 0x4831D745, 0x8B62FA6E, 0xCA53E177, - 0x545DBBBA, 0x156CA0A3, 0xD63F8D88, 0x970E9691, - 0x5098D7DE, 0x11A9CCC7, 0xD2FAE1EC, 0x93CBFAF5, - 0x5CD76272, 0x1DE6796B, 0xDEB55440, 0x9F844F59, - 0x58120E16, 0x1923150F, 0xDA703824, 0x9B41233D, - 0xA76BFD65, 0xE65AE67C, 0x2509CB57, 0x6438D04E, - 0xA3AE9101, 0xE29F8A18, 0x21CCA733, 0x60FDBC2A, - 0xAFE124AD, 0xEED03FB4, 0x2D83129F, 0x6CB20986, - 0xAB2448C9, 0xEA1553D0, 0x29467EFB, 0x687765E2, - 0xF6793F2F, 0xB7482436, 0x741B091D, 0x352A1204, - 0xF2BC534B, 0xB38D4852, 0x70DE6579, 0x31EF7E60, - 0xFEF3E6E7, 0xBFC2FDFE, 0x7C91D0D5, 0x3DA0CBCC, - 0xFA368A83, 0xBB07919A, 0x7854BCB1, 0x3965A7A8, - 0x4B98833B, 0x0AA99822, 0xC9FAB509, 0x88CBAE10, - 0x4F5DEF5F, 0x0E6CF446, 0xCD3FD96D, 0x8C0EC274, - 0x43125AF3, 0x022341EA, 0xC1706CC1, 0x804177D8, - 0x47D73697, 0x06E62D8E, 0xC5B500A5, 0x84841BBC, - 0x1A8A4171, 0x5BBB5A68, 0x98E87743, 0xD9D96C5A, - 0x1E4F2D15, 0x5F7E360C, 0x9C2D1B27, 0xDD1C003E, - 0x120098B9, 0x533183A0, 0x9062AE8B, 0xD153B592, - 0x16C5F4DD, 0x57F4EFC4, 0x94A7C2EF, 0xD596D9F6, - 0xE9BC07AE, 0xA88D1CB7, 0x6BDE319C, 0x2AEF2A85, - 0xED796BCA, 0xAC4870D3, 0x6F1B5DF8, 0x2E2A46E1, - 0xE136DE66, 0xA007C57F, 0x6354E854, 0x2265F34D, - 0xE5F3B202, 0xA4C2A91B, 0x67918430, 0x26A09F29, - 0xB8AEC5E4, 0xF99FDEFD, 0x3ACCF3D6, 0x7BFDE8CF, - 0xBC6BA980, 0xFD5AB299, 0x3E099FB2, 0x7F3884AB, - 0xB0241C2C, 0xF1150735, 0x32462A1E, 0x73773107, - 0xB4E17048, 0xF5D06B51, 0x3683467A, 0x77B25D63, - 0x4ED7FACB, 0x0FE6E1D2, 0xCCB5CCF9, 0x8D84D7E0, - 0x4A1296AF, 0x0B238DB6, 0xC870A09D, 0x8941BB84, - 0x465D2303, 0x076C381A, 0xC43F1531, 0x850E0E28, - 0x42984F67, 0x03A9547E, 0xC0FA7955, 0x81CB624C, - 0x1FC53881, 0x5EF42398, 0x9DA70EB3, 0xDC9615AA, - 0x1B0054E5, 0x5A314FFC, 0x996262D7, 0xD85379CE, - 0x174FE149, 0x567EFA50, 0x952DD77B, 0xD41CCC62, - 0x138A8D2D, 0x52BB9634, 0x91E8BB1F, 0xD0D9A006, - 0xECF37E5E, 0xADC26547, 0x6E91486C, 0x2FA05375, - 0xE836123A, 0xA9070923, 0x6A542408, 0x2B653F11, - 0xE479A796, 0xA548BC8F, 0x661B91A4, 0x272A8ABD, - 0xE0BCCBF2, 0xA18DD0EB, 0x62DEFDC0, 0x23EFE6D9, - 0xBDE1BC14, 0xFCD0A70D, 0x3F838A26, 0x7EB2913F, - 0xB924D070, 0xF815CB69, 0x3B46E642, 0x7A77FD5B, - 0xB56B65DC, 0xF45A7EC5, 0x370953EE, 0x763848F7, - 0xB1AE09B8, 0xF09F12A1, 0x33CC3F8A, 0x72FD2493 - }, { - 0x00000000, 0x376AC201, 0x6ED48403, 0x59BE4602, - 0xDCA80907, 0xEBC2CB06, 0xB27C8D04, 0x85164F05, - 0xB851130E, 0x8F3BD10F, 0xD685970D, 0xE1EF550C, - 0x64F91A09, 0x5393D808, 0x0A2D9E0A, 0x3D475C0B, - 0x70A3261C, 0x47C9E41D, 0x1E77A21F, 0x291D601E, - 0xAC0B2F1B, 0x9B61ED1A, 0xC2DFAB18, 0xF5B56919, - 0xC8F23512, 0xFF98F713, 0xA626B111, 0x914C7310, - 0x145A3C15, 0x2330FE14, 0x7A8EB816, 0x4DE47A17, - 0xE0464D38, 0xD72C8F39, 0x8E92C93B, 0xB9F80B3A, - 0x3CEE443F, 0x0B84863E, 0x523AC03C, 0x6550023D, - 0x58175E36, 0x6F7D9C37, 0x36C3DA35, 0x01A91834, - 0x84BF5731, 0xB3D59530, 0xEA6BD332, 0xDD011133, - 0x90E56B24, 0xA78FA925, 0xFE31EF27, 0xC95B2D26, - 0x4C4D6223, 0x7B27A022, 0x2299E620, 0x15F32421, - 0x28B4782A, 0x1FDEBA2B, 0x4660FC29, 0x710A3E28, - 0xF41C712D, 0xC376B32C, 0x9AC8F52E, 0xADA2372F, - 0xC08D9A70, 0xF7E75871, 0xAE591E73, 0x9933DC72, - 0x1C259377, 0x2B4F5176, 0x72F11774, 0x459BD575, - 0x78DC897E, 0x4FB64B7F, 0x16080D7D, 0x2162CF7C, - 0xA4748079, 0x931E4278, 0xCAA0047A, 0xFDCAC67B, - 0xB02EBC6C, 0x87447E6D, 0xDEFA386F, 0xE990FA6E, - 0x6C86B56B, 0x5BEC776A, 0x02523168, 0x3538F369, - 0x087FAF62, 0x3F156D63, 0x66AB2B61, 0x51C1E960, - 0xD4D7A665, 0xE3BD6464, 0xBA032266, 0x8D69E067, - 0x20CBD748, 0x17A11549, 0x4E1F534B, 0x7975914A, - 0xFC63DE4F, 0xCB091C4E, 0x92B75A4C, 0xA5DD984D, - 0x989AC446, 0xAFF00647, 0xF64E4045, 0xC1248244, - 0x4432CD41, 0x73580F40, 0x2AE64942, 0x1D8C8B43, - 0x5068F154, 0x67023355, 0x3EBC7557, 0x09D6B756, - 0x8CC0F853, 0xBBAA3A52, 0xE2147C50, 0xD57EBE51, - 0xE839E25A, 0xDF53205B, 0x86ED6659, 0xB187A458, - 0x3491EB5D, 0x03FB295C, 0x5A456F5E, 0x6D2FAD5F, - 0x801B35E1, 0xB771F7E0, 0xEECFB1E2, 0xD9A573E3, - 0x5CB33CE6, 0x6BD9FEE7, 0x3267B8E5, 0x050D7AE4, - 0x384A26EF, 0x0F20E4EE, 0x569EA2EC, 0x61F460ED, - 0xE4E22FE8, 0xD388EDE9, 0x8A36ABEB, 0xBD5C69EA, - 0xF0B813FD, 0xC7D2D1FC, 0x9E6C97FE, 0xA90655FF, - 0x2C101AFA, 0x1B7AD8FB, 0x42C49EF9, 0x75AE5CF8, - 0x48E900F3, 0x7F83C2F2, 0x263D84F0, 0x115746F1, - 0x944109F4, 0xA32BCBF5, 0xFA958DF7, 0xCDFF4FF6, - 0x605D78D9, 0x5737BAD8, 0x0E89FCDA, 0x39E33EDB, - 0xBCF571DE, 0x8B9FB3DF, 0xD221F5DD, 0xE54B37DC, - 0xD80C6BD7, 0xEF66A9D6, 0xB6D8EFD4, 0x81B22DD5, - 0x04A462D0, 0x33CEA0D1, 0x6A70E6D3, 0x5D1A24D2, - 0x10FE5EC5, 0x27949CC4, 0x7E2ADAC6, 0x494018C7, - 0xCC5657C2, 0xFB3C95C3, 0xA282D3C1, 0x95E811C0, - 0xA8AF4DCB, 0x9FC58FCA, 0xC67BC9C8, 0xF1110BC9, - 0x740744CC, 0x436D86CD, 0x1AD3C0CF, 0x2DB902CE, - 0x4096AF91, 0x77FC6D90, 0x2E422B92, 0x1928E993, - 0x9C3EA696, 0xAB546497, 0xF2EA2295, 0xC580E094, - 0xF8C7BC9F, 0xCFAD7E9E, 0x9613389C, 0xA179FA9D, - 0x246FB598, 0x13057799, 0x4ABB319B, 0x7DD1F39A, - 0x3035898D, 0x075F4B8C, 0x5EE10D8E, 0x698BCF8F, - 0xEC9D808A, 0xDBF7428B, 0x82490489, 0xB523C688, - 0x88649A83, 0xBF0E5882, 0xE6B01E80, 0xD1DADC81, - 0x54CC9384, 0x63A65185, 0x3A181787, 0x0D72D586, - 0xA0D0E2A9, 0x97BA20A8, 0xCE0466AA, 0xF96EA4AB, - 0x7C78EBAE, 0x4B1229AF, 0x12AC6FAD, 0x25C6ADAC, - 0x1881F1A7, 0x2FEB33A6, 0x765575A4, 0x413FB7A5, - 0xC429F8A0, 0xF3433AA1, 0xAAFD7CA3, 0x9D97BEA2, - 0xD073C4B5, 0xE71906B4, 0xBEA740B6, 0x89CD82B7, - 0x0CDBCDB2, 0x3BB10FB3, 0x620F49B1, 0x55658BB0, - 0x6822D7BB, 0x5F4815BA, 0x06F653B8, 0x319C91B9, - 0xB48ADEBC, 0x83E01CBD, 0xDA5E5ABF, 0xED3498BE - }, { - 0x00000000, 0x6567BCB8, 0x8BC809AA, 0xEEAFB512, - 0x5797628F, 0x32F0DE37, 0xDC5F6B25, 0xB938D79D, - 0xEF28B4C5, 0x8A4F087D, 0x64E0BD6F, 0x018701D7, - 0xB8BFD64A, 0xDDD86AF2, 0x3377DFE0, 0x56106358, - 0x9F571950, 0xFA30A5E8, 0x149F10FA, 0x71F8AC42, - 0xC8C07BDF, 0xADA7C767, 0x43087275, 0x266FCECD, - 0x707FAD95, 0x1518112D, 0xFBB7A43F, 0x9ED01887, - 0x27E8CF1A, 0x428F73A2, 0xAC20C6B0, 0xC9477A08, - 0x3EAF32A0, 0x5BC88E18, 0xB5673B0A, 0xD00087B2, - 0x6938502F, 0x0C5FEC97, 0xE2F05985, 0x8797E53D, - 0xD1878665, 0xB4E03ADD, 0x5A4F8FCF, 0x3F283377, - 0x8610E4EA, 0xE3775852, 0x0DD8ED40, 0x68BF51F8, - 0xA1F82BF0, 0xC49F9748, 0x2A30225A, 0x4F579EE2, - 0xF66F497F, 0x9308F5C7, 0x7DA740D5, 0x18C0FC6D, - 0x4ED09F35, 0x2BB7238D, 0xC518969F, 0xA07F2A27, - 0x1947FDBA, 0x7C204102, 0x928FF410, 0xF7E848A8, - 0x3D58149B, 0x583FA823, 0xB6901D31, 0xD3F7A189, - 0x6ACF7614, 0x0FA8CAAC, 0xE1077FBE, 0x8460C306, - 0xD270A05E, 0xB7171CE6, 0x59B8A9F4, 0x3CDF154C, - 0x85E7C2D1, 0xE0807E69, 0x0E2FCB7B, 0x6B4877C3, - 0xA20F0DCB, 0xC768B173, 0x29C70461, 0x4CA0B8D9, - 0xF5986F44, 0x90FFD3FC, 0x7E5066EE, 0x1B37DA56, - 0x4D27B90E, 0x284005B6, 0xC6EFB0A4, 0xA3880C1C, - 0x1AB0DB81, 0x7FD76739, 0x9178D22B, 0xF41F6E93, - 0x03F7263B, 0x66909A83, 0x883F2F91, 0xED589329, - 0x546044B4, 0x3107F80C, 0xDFA84D1E, 0xBACFF1A6, - 0xECDF92FE, 0x89B82E46, 0x67179B54, 0x027027EC, - 0xBB48F071, 0xDE2F4CC9, 0x3080F9DB, 0x55E74563, - 0x9CA03F6B, 0xF9C783D3, 0x176836C1, 0x720F8A79, - 0xCB375DE4, 0xAE50E15C, 0x40FF544E, 0x2598E8F6, - 0x73888BAE, 0x16EF3716, 0xF8408204, 0x9D273EBC, - 0x241FE921, 0x41785599, 0xAFD7E08B, 0xCAB05C33, - 0x3BB659ED, 0x5ED1E555, 0xB07E5047, 0xD519ECFF, - 0x6C213B62, 0x094687DA, 0xE7E932C8, 0x828E8E70, - 0xD49EED28, 0xB1F95190, 0x5F56E482, 0x3A31583A, - 0x83098FA7, 0xE66E331F, 0x08C1860D, 0x6DA63AB5, - 0xA4E140BD, 0xC186FC05, 0x2F294917, 0x4A4EF5AF, - 0xF3762232, 0x96119E8A, 0x78BE2B98, 0x1DD99720, - 0x4BC9F478, 0x2EAE48C0, 0xC001FDD2, 0xA566416A, - 0x1C5E96F7, 0x79392A4F, 0x97969F5D, 0xF2F123E5, - 0x05196B4D, 0x607ED7F5, 0x8ED162E7, 0xEBB6DE5F, - 0x528E09C2, 0x37E9B57A, 0xD9460068, 0xBC21BCD0, - 0xEA31DF88, 0x8F566330, 0x61F9D622, 0x049E6A9A, - 0xBDA6BD07, 0xD8C101BF, 0x366EB4AD, 0x53090815, - 0x9A4E721D, 0xFF29CEA5, 0x11867BB7, 0x74E1C70F, - 0xCDD91092, 0xA8BEAC2A, 0x46111938, 0x2376A580, - 0x7566C6D8, 0x10017A60, 0xFEAECF72, 0x9BC973CA, - 0x22F1A457, 0x479618EF, 0xA939ADFD, 0xCC5E1145, - 0x06EE4D76, 0x6389F1CE, 0x8D2644DC, 0xE841F864, - 0x51792FF9, 0x341E9341, 0xDAB12653, 0xBFD69AEB, - 0xE9C6F9B3, 0x8CA1450B, 0x620EF019, 0x07694CA1, - 0xBE519B3C, 0xDB362784, 0x35999296, 0x50FE2E2E, - 0x99B95426, 0xFCDEE89E, 0x12715D8C, 0x7716E134, - 0xCE2E36A9, 0xAB498A11, 0x45E63F03, 0x208183BB, - 0x7691E0E3, 0x13F65C5B, 0xFD59E949, 0x983E55F1, - 0x2106826C, 0x44613ED4, 0xAACE8BC6, 0xCFA9377E, - 0x38417FD6, 0x5D26C36E, 0xB389767C, 0xD6EECAC4, - 0x6FD61D59, 0x0AB1A1E1, 0xE41E14F3, 0x8179A84B, - 0xD769CB13, 0xB20E77AB, 0x5CA1C2B9, 0x39C67E01, - 0x80FEA99C, 0xE5991524, 0x0B36A036, 0x6E511C8E, - 0xA7166686, 0xC271DA3E, 0x2CDE6F2C, 0x49B9D394, - 0xF0810409, 0x95E6B8B1, 0x7B490DA3, 0x1E2EB11B, - 0x483ED243, 0x2D596EFB, 0xC3F6DBE9, 0xA6916751, - 0x1FA9B0CC, 0x7ACE0C74, 0x9461B966, 0xF10605DE - }, { - 0x00000000, 0xB029603D, 0x6053C07A, 0xD07AA047, - 0xC0A680F5, 0x708FE0C8, 0xA0F5408F, 0x10DC20B2, - 0xC14B7030, 0x7162100D, 0xA118B04A, 0x1131D077, - 0x01EDF0C5, 0xB1C490F8, 0x61BE30BF, 0xD1975082, - 0x8297E060, 0x32BE805D, 0xE2C4201A, 0x52ED4027, - 0x42316095, 0xF21800A8, 0x2262A0EF, 0x924BC0D2, - 0x43DC9050, 0xF3F5F06D, 0x238F502A, 0x93A63017, - 0x837A10A5, 0x33537098, 0xE329D0DF, 0x5300B0E2, - 0x042FC1C1, 0xB406A1FC, 0x647C01BB, 0xD4556186, - 0xC4894134, 0x74A02109, 0xA4DA814E, 0x14F3E173, - 0xC564B1F1, 0x754DD1CC, 0xA537718B, 0x151E11B6, - 0x05C23104, 0xB5EB5139, 0x6591F17E, 0xD5B89143, - 0x86B821A1, 0x3691419C, 0xE6EBE1DB, 0x56C281E6, - 0x461EA154, 0xF637C169, 0x264D612E, 0x96640113, - 0x47F35191, 0xF7DA31AC, 0x27A091EB, 0x9789F1D6, - 0x8755D164, 0x377CB159, 0xE706111E, 0x572F7123, - 0x4958F358, 0xF9719365, 0x290B3322, 0x9922531F, - 0x89FE73AD, 0x39D71390, 0xE9ADB3D7, 0x5984D3EA, - 0x88138368, 0x383AE355, 0xE8404312, 0x5869232F, - 0x48B5039D, 0xF89C63A0, 0x28E6C3E7, 0x98CFA3DA, - 0xCBCF1338, 0x7BE67305, 0xAB9CD342, 0x1BB5B37F, - 0x0B6993CD, 0xBB40F3F0, 0x6B3A53B7, 0xDB13338A, - 0x0A846308, 0xBAAD0335, 0x6AD7A372, 0xDAFEC34F, - 0xCA22E3FD, 0x7A0B83C0, 0xAA712387, 0x1A5843BA, - 0x4D773299, 0xFD5E52A4, 0x2D24F2E3, 0x9D0D92DE, - 0x8DD1B26C, 0x3DF8D251, 0xED827216, 0x5DAB122B, - 0x8C3C42A9, 0x3C152294, 0xEC6F82D3, 0x5C46E2EE, - 0x4C9AC25C, 0xFCB3A261, 0x2CC90226, 0x9CE0621B, - 0xCFE0D2F9, 0x7FC9B2C4, 0xAFB31283, 0x1F9A72BE, - 0x0F46520C, 0xBF6F3231, 0x6F159276, 0xDF3CF24B, - 0x0EABA2C9, 0xBE82C2F4, 0x6EF862B3, 0xDED1028E, - 0xCE0D223C, 0x7E244201, 0xAE5EE246, 0x1E77827B, - 0x92B0E6B1, 0x2299868C, 0xF2E326CB, 0x42CA46F6, - 0x52166644, 0xE23F0679, 0x3245A63E, 0x826CC603, - 0x53FB9681, 0xE3D2F6BC, 0x33A856FB, 0x838136C6, - 0x935D1674, 0x23747649, 0xF30ED60E, 0x4327B633, - 0x102706D1, 0xA00E66EC, 0x7074C6AB, 0xC05DA696, - 0xD0818624, 0x60A8E619, 0xB0D2465E, 0x00FB2663, - 0xD16C76E1, 0x614516DC, 0xB13FB69B, 0x0116D6A6, - 0x11CAF614, 0xA1E39629, 0x7199366E, 0xC1B05653, - 0x969F2770, 0x26B6474D, 0xF6CCE70A, 0x46E58737, - 0x5639A785, 0xE610C7B8, 0x366A67FF, 0x864307C2, - 0x57D45740, 0xE7FD377D, 0x3787973A, 0x87AEF707, - 0x9772D7B5, 0x275BB788, 0xF72117CF, 0x470877F2, - 0x1408C710, 0xA421A72D, 0x745B076A, 0xC4726757, - 0xD4AE47E5, 0x648727D8, 0xB4FD879F, 0x04D4E7A2, - 0xD543B720, 0x656AD71D, 0xB510775A, 0x05391767, - 0x15E537D5, 0xA5CC57E8, 0x75B6F7AF, 0xC59F9792, - 0xDBE815E9, 0x6BC175D4, 0xBBBBD593, 0x0B92B5AE, - 0x1B4E951C, 0xAB67F521, 0x7B1D5566, 0xCB34355B, - 0x1AA365D9, 0xAA8A05E4, 0x7AF0A5A3, 0xCAD9C59E, - 0xDA05E52C, 0x6A2C8511, 0xBA562556, 0x0A7F456B, - 0x597FF589, 0xE95695B4, 0x392C35F3, 0x890555CE, - 0x99D9757C, 0x29F01541, 0xF98AB506, 0x49A3D53B, - 0x983485B9, 0x281DE584, 0xF86745C3, 0x484E25FE, - 0x5892054C, 0xE8BB6571, 0x38C1C536, 0x88E8A50B, - 0xDFC7D428, 0x6FEEB415, 0xBF941452, 0x0FBD746F, - 0x1F6154DD, 0xAF4834E0, 0x7F3294A7, 0xCF1BF49A, - 0x1E8CA418, 0xAEA5C425, 0x7EDF6462, 0xCEF6045F, - 0xDE2A24ED, 0x6E0344D0, 0xBE79E497, 0x0E5084AA, - 0x5D503448, 0xED795475, 0x3D03F432, 0x8D2A940F, - 0x9DF6B4BD, 0x2DDFD480, 0xFDA574C7, 0x4D8C14FA, - 0x9C1B4478, 0x2C322445, 0xFC488402, 0x4C61E43F, - 0x5CBDC48D, 0xEC94A4B0, 0x3CEE04F7, 0x8CC764CA - }, { - 0x00000000, 0xA5D35CCB, 0x0BA1C84D, 0xAE729486, - 0x1642919B, 0xB391CD50, 0x1DE359D6, 0xB830051D, - 0x6D8253EC, 0xC8510F27, 0x66239BA1, 0xC3F0C76A, - 0x7BC0C277, 0xDE139EBC, 0x70610A3A, 0xD5B256F1, - 0x9B02D603, 0x3ED18AC8, 0x90A31E4E, 0x35704285, - 0x8D404798, 0x28931B53, 0x86E18FD5, 0x2332D31E, - 0xF68085EF, 0x5353D924, 0xFD214DA2, 0x58F21169, - 0xE0C21474, 0x451148BF, 0xEB63DC39, 0x4EB080F2, - 0x3605AC07, 0x93D6F0CC, 0x3DA4644A, 0x98773881, - 0x20473D9C, 0x85946157, 0x2BE6F5D1, 0x8E35A91A, - 0x5B87FFEB, 0xFE54A320, 0x502637A6, 0xF5F56B6D, - 0x4DC56E70, 0xE81632BB, 0x4664A63D, 0xE3B7FAF6, - 0xAD077A04, 0x08D426CF, 0xA6A6B249, 0x0375EE82, - 0xBB45EB9F, 0x1E96B754, 0xB0E423D2, 0x15377F19, - 0xC08529E8, 0x65567523, 0xCB24E1A5, 0x6EF7BD6E, - 0xD6C7B873, 0x7314E4B8, 0xDD66703E, 0x78B52CF5, - 0x6C0A580F, 0xC9D904C4, 0x67AB9042, 0xC278CC89, - 0x7A48C994, 0xDF9B955F, 0x71E901D9, 0xD43A5D12, - 0x01880BE3, 0xA45B5728, 0x0A29C3AE, 0xAFFA9F65, - 0x17CA9A78, 0xB219C6B3, 0x1C6B5235, 0xB9B80EFE, - 0xF7088E0C, 0x52DBD2C7, 0xFCA94641, 0x597A1A8A, - 0xE14A1F97, 0x4499435C, 0xEAEBD7DA, 0x4F388B11, - 0x9A8ADDE0, 0x3F59812B, 0x912B15AD, 0x34F84966, - 0x8CC84C7B, 0x291B10B0, 0x87698436, 0x22BAD8FD, - 0x5A0FF408, 0xFFDCA8C3, 0x51AE3C45, 0xF47D608E, - 0x4C4D6593, 0xE99E3958, 0x47ECADDE, 0xE23FF115, - 0x378DA7E4, 0x925EFB2F, 0x3C2C6FA9, 0x99FF3362, - 0x21CF367F, 0x841C6AB4, 0x2A6EFE32, 0x8FBDA2F9, - 0xC10D220B, 0x64DE7EC0, 0xCAACEA46, 0x6F7FB68D, - 0xD74FB390, 0x729CEF5B, 0xDCEE7BDD, 0x793D2716, - 0xAC8F71E7, 0x095C2D2C, 0xA72EB9AA, 0x02FDE561, - 0xBACDE07C, 0x1F1EBCB7, 0xB16C2831, 0x14BF74FA, - 0xD814B01E, 0x7DC7ECD5, 0xD3B57853, 0x76662498, - 0xCE562185, 0x6B857D4E, 0xC5F7E9C8, 0x6024B503, - 0xB596E3F2, 0x1045BF39, 0xBE372BBF, 0x1BE47774, - 0xA3D47269, 0x06072EA2, 0xA875BA24, 0x0DA6E6EF, - 0x4316661D, 0xE6C53AD6, 0x48B7AE50, 0xED64F29B, - 0x5554F786, 0xF087AB4D, 0x5EF53FCB, 0xFB266300, - 0x2E9435F1, 0x8B47693A, 0x2535FDBC, 0x80E6A177, - 0x38D6A46A, 0x9D05F8A1, 0x33776C27, 0x96A430EC, - 0xEE111C19, 0x4BC240D2, 0xE5B0D454, 0x4063889F, - 0xF8538D82, 0x5D80D149, 0xF3F245CF, 0x56211904, - 0x83934FF5, 0x2640133E, 0x883287B8, 0x2DE1DB73, - 0x95D1DE6E, 0x300282A5, 0x9E701623, 0x3BA34AE8, - 0x7513CA1A, 0xD0C096D1, 0x7EB20257, 0xDB615E9C, - 0x63515B81, 0xC682074A, 0x68F093CC, 0xCD23CF07, - 0x189199F6, 0xBD42C53D, 0x133051BB, 0xB6E30D70, - 0x0ED3086D, 0xAB0054A6, 0x0572C020, 0xA0A19CEB, - 0xB41EE811, 0x11CDB4DA, 0xBFBF205C, 0x1A6C7C97, - 0xA25C798A, 0x078F2541, 0xA9FDB1C7, 0x0C2EED0C, - 0xD99CBBFD, 0x7C4FE736, 0xD23D73B0, 0x77EE2F7B, - 0xCFDE2A66, 0x6A0D76AD, 0xC47FE22B, 0x61ACBEE0, - 0x2F1C3E12, 0x8ACF62D9, 0x24BDF65F, 0x816EAA94, - 0x395EAF89, 0x9C8DF342, 0x32FF67C4, 0x972C3B0F, - 0x429E6DFE, 0xE74D3135, 0x493FA5B3, 0xECECF978, - 0x54DCFC65, 0xF10FA0AE, 0x5F7D3428, 0xFAAE68E3, - 0x821B4416, 0x27C818DD, 0x89BA8C5B, 0x2C69D090, - 0x9459D58D, 0x318A8946, 0x9FF81DC0, 0x3A2B410B, - 0xEF9917FA, 0x4A4A4B31, 0xE438DFB7, 0x41EB837C, - 0xF9DB8661, 0x5C08DAAA, 0xF27A4E2C, 0x57A912E7, - 0x19199215, 0xBCCACEDE, 0x12B85A58, 0xB76B0693, - 0x0F5B038E, 0xAA885F45, 0x04FACBC3, 0xA1299708, - 0x749BC1F9, 0xD1489D32, 0x7F3A09B4, 0xDAE9557F, - 0x62D95062, 0xC70A0CA9, 0x6978982F, 0xCCABC4E4 - }, { - 0x00000000, 0xB40B77A6, 0x29119F97, 0x9D1AE831, - 0x13244FF4, 0xA72F3852, 0x3A35D063, 0x8E3EA7C5, - 0x674EEF33, 0xD3459895, 0x4E5F70A4, 0xFA540702, - 0x746AA0C7, 0xC061D761, 0x5D7B3F50, 0xE97048F6, - 0xCE9CDE67, 0x7A97A9C1, 0xE78D41F0, 0x53863656, - 0xDDB89193, 0x69B3E635, 0xF4A90E04, 0x40A279A2, - 0xA9D23154, 0x1DD946F2, 0x80C3AEC3, 0x34C8D965, - 0xBAF67EA0, 0x0EFD0906, 0x93E7E137, 0x27EC9691, - 0x9C39BDCF, 0x2832CA69, 0xB5282258, 0x012355FE, - 0x8F1DF23B, 0x3B16859D, 0xA60C6DAC, 0x12071A0A, - 0xFB7752FC, 0x4F7C255A, 0xD266CD6B, 0x666DBACD, - 0xE8531D08, 0x5C586AAE, 0xC142829F, 0x7549F539, - 0x52A563A8, 0xE6AE140E, 0x7BB4FC3F, 0xCFBF8B99, - 0x41812C5C, 0xF58A5BFA, 0x6890B3CB, 0xDC9BC46D, - 0x35EB8C9B, 0x81E0FB3D, 0x1CFA130C, 0xA8F164AA, - 0x26CFC36F, 0x92C4B4C9, 0x0FDE5CF8, 0xBBD52B5E, - 0x79750B44, 0xCD7E7CE2, 0x506494D3, 0xE46FE375, - 0x6A5144B0, 0xDE5A3316, 0x4340DB27, 0xF74BAC81, - 0x1E3BE477, 0xAA3093D1, 0x372A7BE0, 0x83210C46, - 0x0D1FAB83, 0xB914DC25, 0x240E3414, 0x900543B2, - 0xB7E9D523, 0x03E2A285, 0x9EF84AB4, 0x2AF33D12, - 0xA4CD9AD7, 0x10C6ED71, 0x8DDC0540, 0x39D772E6, - 0xD0A73A10, 0x64AC4DB6, 0xF9B6A587, 0x4DBDD221, - 0xC38375E4, 0x77880242, 0xEA92EA73, 0x5E999DD5, - 0xE54CB68B, 0x5147C12D, 0xCC5D291C, 0x78565EBA, - 0xF668F97F, 0x42638ED9, 0xDF7966E8, 0x6B72114E, - 0x820259B8, 0x36092E1E, 0xAB13C62F, 0x1F18B189, - 0x9126164C, 0x252D61EA, 0xB83789DB, 0x0C3CFE7D, - 0x2BD068EC, 0x9FDB1F4A, 0x02C1F77B, 0xB6CA80DD, - 0x38F42718, 0x8CFF50BE, 0x11E5B88F, 0xA5EECF29, - 0x4C9E87DF, 0xF895F079, 0x658F1848, 0xD1846FEE, - 0x5FBAC82B, 0xEBB1BF8D, 0x76AB57BC, 0xC2A0201A, - 0xF2EA1688, 0x46E1612E, 0xDBFB891F, 0x6FF0FEB9, - 0xE1CE597C, 0x55C52EDA, 0xC8DFC6EB, 0x7CD4B14D, - 0x95A4F9BB, 0x21AF8E1D, 0xBCB5662C, 0x08BE118A, - 0x8680B64F, 0x328BC1E9, 0xAF9129D8, 0x1B9A5E7E, - 0x3C76C8EF, 0x887DBF49, 0x15675778, 0xA16C20DE, - 0x2F52871B, 0x9B59F0BD, 0x0643188C, 0xB2486F2A, - 0x5B3827DC, 0xEF33507A, 0x7229B84B, 0xC622CFED, - 0x481C6828, 0xFC171F8E, 0x610DF7BF, 0xD5068019, - 0x6ED3AB47, 0xDAD8DCE1, 0x47C234D0, 0xF3C94376, - 0x7DF7E4B3, 0xC9FC9315, 0x54E67B24, 0xE0ED0C82, - 0x099D4474, 0xBD9633D2, 0x208CDBE3, 0x9487AC45, - 0x1AB90B80, 0xAEB27C26, 0x33A89417, 0x87A3E3B1, - 0xA04F7520, 0x14440286, 0x895EEAB7, 0x3D559D11, - 0xB36B3AD4, 0x07604D72, 0x9A7AA543, 0x2E71D2E5, - 0xC7019A13, 0x730AEDB5, 0xEE100584, 0x5A1B7222, - 0xD425D5E7, 0x602EA241, 0xFD344A70, 0x493F3DD6, - 0x8B9F1DCC, 0x3F946A6A, 0xA28E825B, 0x1685F5FD, - 0x98BB5238, 0x2CB0259E, 0xB1AACDAF, 0x05A1BA09, - 0xECD1F2FF, 0x58DA8559, 0xC5C06D68, 0x71CB1ACE, - 0xFFF5BD0B, 0x4BFECAAD, 0xD6E4229C, 0x62EF553A, - 0x4503C3AB, 0xF108B40D, 0x6C125C3C, 0xD8192B9A, - 0x56278C5F, 0xE22CFBF9, 0x7F3613C8, 0xCB3D646E, - 0x224D2C98, 0x96465B3E, 0x0B5CB30F, 0xBF57C4A9, - 0x3169636C, 0x856214CA, 0x1878FCFB, 0xAC738B5D, - 0x17A6A003, 0xA3ADD7A5, 0x3EB73F94, 0x8ABC4832, - 0x0482EFF7, 0xB0899851, 0x2D937060, 0x999807C6, - 0x70E84F30, 0xC4E33896, 0x59F9D0A7, 0xEDF2A701, - 0x63CC00C4, 0xD7C77762, 0x4ADD9F53, 0xFED6E8F5, - 0xD93A7E64, 0x6D3109C2, 0xF02BE1F3, 0x44209655, - 0xCA1E3190, 0x7E154636, 0xE30FAE07, 0x5704D9A1, - 0xBE749157, 0x0A7FE6F1, 0x97650EC0, 0x236E7966, - 0xAD50DEA3, 0x195BA905, 0x84414134, 0x304A3692 - }, { - 0x00000000, 0x9E00AACC, 0x7D072542, 0xE3078F8E, - 0xFA0E4A84, 0x640EE048, 0x87096FC6, 0x1909C50A, - 0xB51BE5D3, 0x2B1B4F1F, 0xC81CC091, 0x561C6A5D, - 0x4F15AF57, 0xD115059B, 0x32128A15, 0xAC1220D9, - 0x2B31BB7C, 0xB53111B0, 0x56369E3E, 0xC83634F2, - 0xD13FF1F8, 0x4F3F5B34, 0xAC38D4BA, 0x32387E76, - 0x9E2A5EAF, 0x002AF463, 0xE32D7BED, 0x7D2DD121, - 0x6424142B, 0xFA24BEE7, 0x19233169, 0x87239BA5, - 0x566276F9, 0xC862DC35, 0x2B6553BB, 0xB565F977, - 0xAC6C3C7D, 0x326C96B1, 0xD16B193F, 0x4F6BB3F3, - 0xE379932A, 0x7D7939E6, 0x9E7EB668, 0x007E1CA4, - 0x1977D9AE, 0x87777362, 0x6470FCEC, 0xFA705620, - 0x7D53CD85, 0xE3536749, 0x0054E8C7, 0x9E54420B, - 0x875D8701, 0x195D2DCD, 0xFA5AA243, 0x645A088F, - 0xC8482856, 0x5648829A, 0xB54F0D14, 0x2B4FA7D8, - 0x324662D2, 0xAC46C81E, 0x4F414790, 0xD141ED5C, - 0xEDC29D29, 0x73C237E5, 0x90C5B86B, 0x0EC512A7, - 0x17CCD7AD, 0x89CC7D61, 0x6ACBF2EF, 0xF4CB5823, - 0x58D978FA, 0xC6D9D236, 0x25DE5DB8, 0xBBDEF774, - 0xA2D7327E, 0x3CD798B2, 0xDFD0173C, 0x41D0BDF0, - 0xC6F32655, 0x58F38C99, 0xBBF40317, 0x25F4A9DB, - 0x3CFD6CD1, 0xA2FDC61D, 0x41FA4993, 0xDFFAE35F, - 0x73E8C386, 0xEDE8694A, 0x0EEFE6C4, 0x90EF4C08, - 0x89E68902, 0x17E623CE, 0xF4E1AC40, 0x6AE1068C, - 0xBBA0EBD0, 0x25A0411C, 0xC6A7CE92, 0x58A7645E, - 0x41AEA154, 0xDFAE0B98, 0x3CA98416, 0xA2A92EDA, - 0x0EBB0E03, 0x90BBA4CF, 0x73BC2B41, 0xEDBC818D, - 0xF4B54487, 0x6AB5EE4B, 0x89B261C5, 0x17B2CB09, - 0x909150AC, 0x0E91FA60, 0xED9675EE, 0x7396DF22, - 0x6A9F1A28, 0xF49FB0E4, 0x17983F6A, 0x899895A6, - 0x258AB57F, 0xBB8A1FB3, 0x588D903D, 0xC68D3AF1, - 0xDF84FFFB, 0x41845537, 0xA283DAB9, 0x3C837075, - 0xDA853B53, 0x4485919F, 0xA7821E11, 0x3982B4DD, - 0x208B71D7, 0xBE8BDB1B, 0x5D8C5495, 0xC38CFE59, - 0x6F9EDE80, 0xF19E744C, 0x1299FBC2, 0x8C99510E, - 0x95909404, 0x0B903EC8, 0xE897B146, 0x76971B8A, - 0xF1B4802F, 0x6FB42AE3, 0x8CB3A56D, 0x12B30FA1, - 0x0BBACAAB, 0x95BA6067, 0x76BDEFE9, 0xE8BD4525, - 0x44AF65FC, 0xDAAFCF30, 0x39A840BE, 0xA7A8EA72, - 0xBEA12F78, 0x20A185B4, 0xC3A60A3A, 0x5DA6A0F6, - 0x8CE74DAA, 0x12E7E766, 0xF1E068E8, 0x6FE0C224, - 0x76E9072E, 0xE8E9ADE2, 0x0BEE226C, 0x95EE88A0, - 0x39FCA879, 0xA7FC02B5, 0x44FB8D3B, 0xDAFB27F7, - 0xC3F2E2FD, 0x5DF24831, 0xBEF5C7BF, 0x20F56D73, - 0xA7D6F6D6, 0x39D65C1A, 0xDAD1D394, 0x44D17958, - 0x5DD8BC52, 0xC3D8169E, 0x20DF9910, 0xBEDF33DC, - 0x12CD1305, 0x8CCDB9C9, 0x6FCA3647, 0xF1CA9C8B, - 0xE8C35981, 0x76C3F34D, 0x95C47CC3, 0x0BC4D60F, - 0x3747A67A, 0xA9470CB6, 0x4A408338, 0xD44029F4, - 0xCD49ECFE, 0x53494632, 0xB04EC9BC, 0x2E4E6370, - 0x825C43A9, 0x1C5CE965, 0xFF5B66EB, 0x615BCC27, - 0x7852092D, 0xE652A3E1, 0x05552C6F, 0x9B5586A3, - 0x1C761D06, 0x8276B7CA, 0x61713844, 0xFF719288, - 0xE6785782, 0x7878FD4E, 0x9B7F72C0, 0x057FD80C, - 0xA96DF8D5, 0x376D5219, 0xD46ADD97, 0x4A6A775B, - 0x5363B251, 0xCD63189D, 0x2E649713, 0xB0643DDF, - 0x6125D083, 0xFF257A4F, 0x1C22F5C1, 0x82225F0D, - 0x9B2B9A07, 0x052B30CB, 0xE62CBF45, 0x782C1589, - 0xD43E3550, 0x4A3E9F9C, 0xA9391012, 0x3739BADE, - 0x2E307FD4, 0xB030D518, 0x53375A96, 0xCD37F05A, - 0x4A146BFF, 0xD414C133, 0x37134EBD, 0xA913E471, - 0xB01A217B, 0x2E1A8BB7, 0xCD1D0439, 0x531DAEF5, - 0xFF0F8E2C, 0x610F24E0, 0x8208AB6E, 0x1C0801A2, - 0x0501C4A8, 0x9B016E64, 0x7806E1EA, 0xE6064B26 - } -}; diff --git a/game/client/third/minizip/lib/liblzma/check/crc32_table_le.h b/game/client/third/minizip/lib/liblzma/check/crc32_table_le.h deleted file mode 100755 index 25f4fc44..00000000 --- a/game/client/third/minizip/lib/liblzma/check/crc32_table_le.h +++ /dev/null @@ -1,525 +0,0 @@ -/* This file has been automatically generated by crc32_tablegen.c. */ - -const uint32_t lzma_crc32_table[8][256] = { - { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - }, { - 0x00000000, 0x191B3141, 0x32366282, 0x2B2D53C3, - 0x646CC504, 0x7D77F445, 0x565AA786, 0x4F4196C7, - 0xC8D98A08, 0xD1C2BB49, 0xFAEFE88A, 0xE3F4D9CB, - 0xACB54F0C, 0xB5AE7E4D, 0x9E832D8E, 0x87981CCF, - 0x4AC21251, 0x53D92310, 0x78F470D3, 0x61EF4192, - 0x2EAED755, 0x37B5E614, 0x1C98B5D7, 0x05838496, - 0x821B9859, 0x9B00A918, 0xB02DFADB, 0xA936CB9A, - 0xE6775D5D, 0xFF6C6C1C, 0xD4413FDF, 0xCD5A0E9E, - 0x958424A2, 0x8C9F15E3, 0xA7B24620, 0xBEA97761, - 0xF1E8E1A6, 0xE8F3D0E7, 0xC3DE8324, 0xDAC5B265, - 0x5D5DAEAA, 0x44469FEB, 0x6F6BCC28, 0x7670FD69, - 0x39316BAE, 0x202A5AEF, 0x0B07092C, 0x121C386D, - 0xDF4636F3, 0xC65D07B2, 0xED705471, 0xF46B6530, - 0xBB2AF3F7, 0xA231C2B6, 0x891C9175, 0x9007A034, - 0x179FBCFB, 0x0E848DBA, 0x25A9DE79, 0x3CB2EF38, - 0x73F379FF, 0x6AE848BE, 0x41C51B7D, 0x58DE2A3C, - 0xF0794F05, 0xE9627E44, 0xC24F2D87, 0xDB541CC6, - 0x94158A01, 0x8D0EBB40, 0xA623E883, 0xBF38D9C2, - 0x38A0C50D, 0x21BBF44C, 0x0A96A78F, 0x138D96CE, - 0x5CCC0009, 0x45D73148, 0x6EFA628B, 0x77E153CA, - 0xBABB5D54, 0xA3A06C15, 0x888D3FD6, 0x91960E97, - 0xDED79850, 0xC7CCA911, 0xECE1FAD2, 0xF5FACB93, - 0x7262D75C, 0x6B79E61D, 0x4054B5DE, 0x594F849F, - 0x160E1258, 0x0F152319, 0x243870DA, 0x3D23419B, - 0x65FD6BA7, 0x7CE65AE6, 0x57CB0925, 0x4ED03864, - 0x0191AEA3, 0x188A9FE2, 0x33A7CC21, 0x2ABCFD60, - 0xAD24E1AF, 0xB43FD0EE, 0x9F12832D, 0x8609B26C, - 0xC94824AB, 0xD05315EA, 0xFB7E4629, 0xE2657768, - 0x2F3F79F6, 0x362448B7, 0x1D091B74, 0x04122A35, - 0x4B53BCF2, 0x52488DB3, 0x7965DE70, 0x607EEF31, - 0xE7E6F3FE, 0xFEFDC2BF, 0xD5D0917C, 0xCCCBA03D, - 0x838A36FA, 0x9A9107BB, 0xB1BC5478, 0xA8A76539, - 0x3B83984B, 0x2298A90A, 0x09B5FAC9, 0x10AECB88, - 0x5FEF5D4F, 0x46F46C0E, 0x6DD93FCD, 0x74C20E8C, - 0xF35A1243, 0xEA412302, 0xC16C70C1, 0xD8774180, - 0x9736D747, 0x8E2DE606, 0xA500B5C5, 0xBC1B8484, - 0x71418A1A, 0x685ABB5B, 0x4377E898, 0x5A6CD9D9, - 0x152D4F1E, 0x0C367E5F, 0x271B2D9C, 0x3E001CDD, - 0xB9980012, 0xA0833153, 0x8BAE6290, 0x92B553D1, - 0xDDF4C516, 0xC4EFF457, 0xEFC2A794, 0xF6D996D5, - 0xAE07BCE9, 0xB71C8DA8, 0x9C31DE6B, 0x852AEF2A, - 0xCA6B79ED, 0xD37048AC, 0xF85D1B6F, 0xE1462A2E, - 0x66DE36E1, 0x7FC507A0, 0x54E85463, 0x4DF36522, - 0x02B2F3E5, 0x1BA9C2A4, 0x30849167, 0x299FA026, - 0xE4C5AEB8, 0xFDDE9FF9, 0xD6F3CC3A, 0xCFE8FD7B, - 0x80A96BBC, 0x99B25AFD, 0xB29F093E, 0xAB84387F, - 0x2C1C24B0, 0x350715F1, 0x1E2A4632, 0x07317773, - 0x4870E1B4, 0x516BD0F5, 0x7A468336, 0x635DB277, - 0xCBFAD74E, 0xD2E1E60F, 0xF9CCB5CC, 0xE0D7848D, - 0xAF96124A, 0xB68D230B, 0x9DA070C8, 0x84BB4189, - 0x03235D46, 0x1A386C07, 0x31153FC4, 0x280E0E85, - 0x674F9842, 0x7E54A903, 0x5579FAC0, 0x4C62CB81, - 0x8138C51F, 0x9823F45E, 0xB30EA79D, 0xAA1596DC, - 0xE554001B, 0xFC4F315A, 0xD7626299, 0xCE7953D8, - 0x49E14F17, 0x50FA7E56, 0x7BD72D95, 0x62CC1CD4, - 0x2D8D8A13, 0x3496BB52, 0x1FBBE891, 0x06A0D9D0, - 0x5E7EF3EC, 0x4765C2AD, 0x6C48916E, 0x7553A02F, - 0x3A1236E8, 0x230907A9, 0x0824546A, 0x113F652B, - 0x96A779E4, 0x8FBC48A5, 0xA4911B66, 0xBD8A2A27, - 0xF2CBBCE0, 0xEBD08DA1, 0xC0FDDE62, 0xD9E6EF23, - 0x14BCE1BD, 0x0DA7D0FC, 0x268A833F, 0x3F91B27E, - 0x70D024B9, 0x69CB15F8, 0x42E6463B, 0x5BFD777A, - 0xDC656BB5, 0xC57E5AF4, 0xEE530937, 0xF7483876, - 0xB809AEB1, 0xA1129FF0, 0x8A3FCC33, 0x9324FD72 - }, { - 0x00000000, 0x01C26A37, 0x0384D46E, 0x0246BE59, - 0x0709A8DC, 0x06CBC2EB, 0x048D7CB2, 0x054F1685, - 0x0E1351B8, 0x0FD13B8F, 0x0D9785D6, 0x0C55EFE1, - 0x091AF964, 0x08D89353, 0x0A9E2D0A, 0x0B5C473D, - 0x1C26A370, 0x1DE4C947, 0x1FA2771E, 0x1E601D29, - 0x1B2F0BAC, 0x1AED619B, 0x18ABDFC2, 0x1969B5F5, - 0x1235F2C8, 0x13F798FF, 0x11B126A6, 0x10734C91, - 0x153C5A14, 0x14FE3023, 0x16B88E7A, 0x177AE44D, - 0x384D46E0, 0x398F2CD7, 0x3BC9928E, 0x3A0BF8B9, - 0x3F44EE3C, 0x3E86840B, 0x3CC03A52, 0x3D025065, - 0x365E1758, 0x379C7D6F, 0x35DAC336, 0x3418A901, - 0x3157BF84, 0x3095D5B3, 0x32D36BEA, 0x331101DD, - 0x246BE590, 0x25A98FA7, 0x27EF31FE, 0x262D5BC9, - 0x23624D4C, 0x22A0277B, 0x20E69922, 0x2124F315, - 0x2A78B428, 0x2BBADE1F, 0x29FC6046, 0x283E0A71, - 0x2D711CF4, 0x2CB376C3, 0x2EF5C89A, 0x2F37A2AD, - 0x709A8DC0, 0x7158E7F7, 0x731E59AE, 0x72DC3399, - 0x7793251C, 0x76514F2B, 0x7417F172, 0x75D59B45, - 0x7E89DC78, 0x7F4BB64F, 0x7D0D0816, 0x7CCF6221, - 0x798074A4, 0x78421E93, 0x7A04A0CA, 0x7BC6CAFD, - 0x6CBC2EB0, 0x6D7E4487, 0x6F38FADE, 0x6EFA90E9, - 0x6BB5866C, 0x6A77EC5B, 0x68315202, 0x69F33835, - 0x62AF7F08, 0x636D153F, 0x612BAB66, 0x60E9C151, - 0x65A6D7D4, 0x6464BDE3, 0x662203BA, 0x67E0698D, - 0x48D7CB20, 0x4915A117, 0x4B531F4E, 0x4A917579, - 0x4FDE63FC, 0x4E1C09CB, 0x4C5AB792, 0x4D98DDA5, - 0x46C49A98, 0x4706F0AF, 0x45404EF6, 0x448224C1, - 0x41CD3244, 0x400F5873, 0x4249E62A, 0x438B8C1D, - 0x54F16850, 0x55330267, 0x5775BC3E, 0x56B7D609, - 0x53F8C08C, 0x523AAABB, 0x507C14E2, 0x51BE7ED5, - 0x5AE239E8, 0x5B2053DF, 0x5966ED86, 0x58A487B1, - 0x5DEB9134, 0x5C29FB03, 0x5E6F455A, 0x5FAD2F6D, - 0xE1351B80, 0xE0F771B7, 0xE2B1CFEE, 0xE373A5D9, - 0xE63CB35C, 0xE7FED96B, 0xE5B86732, 0xE47A0D05, - 0xEF264A38, 0xEEE4200F, 0xECA29E56, 0xED60F461, - 0xE82FE2E4, 0xE9ED88D3, 0xEBAB368A, 0xEA695CBD, - 0xFD13B8F0, 0xFCD1D2C7, 0xFE976C9E, 0xFF5506A9, - 0xFA1A102C, 0xFBD87A1B, 0xF99EC442, 0xF85CAE75, - 0xF300E948, 0xF2C2837F, 0xF0843D26, 0xF1465711, - 0xF4094194, 0xF5CB2BA3, 0xF78D95FA, 0xF64FFFCD, - 0xD9785D60, 0xD8BA3757, 0xDAFC890E, 0xDB3EE339, - 0xDE71F5BC, 0xDFB39F8B, 0xDDF521D2, 0xDC374BE5, - 0xD76B0CD8, 0xD6A966EF, 0xD4EFD8B6, 0xD52DB281, - 0xD062A404, 0xD1A0CE33, 0xD3E6706A, 0xD2241A5D, - 0xC55EFE10, 0xC49C9427, 0xC6DA2A7E, 0xC7184049, - 0xC25756CC, 0xC3953CFB, 0xC1D382A2, 0xC011E895, - 0xCB4DAFA8, 0xCA8FC59F, 0xC8C97BC6, 0xC90B11F1, - 0xCC440774, 0xCD866D43, 0xCFC0D31A, 0xCE02B92D, - 0x91AF9640, 0x906DFC77, 0x922B422E, 0x93E92819, - 0x96A63E9C, 0x976454AB, 0x9522EAF2, 0x94E080C5, - 0x9FBCC7F8, 0x9E7EADCF, 0x9C381396, 0x9DFA79A1, - 0x98B56F24, 0x99770513, 0x9B31BB4A, 0x9AF3D17D, - 0x8D893530, 0x8C4B5F07, 0x8E0DE15E, 0x8FCF8B69, - 0x8A809DEC, 0x8B42F7DB, 0x89044982, 0x88C623B5, - 0x839A6488, 0x82580EBF, 0x801EB0E6, 0x81DCDAD1, - 0x8493CC54, 0x8551A663, 0x8717183A, 0x86D5720D, - 0xA9E2D0A0, 0xA820BA97, 0xAA6604CE, 0xABA46EF9, - 0xAEEB787C, 0xAF29124B, 0xAD6FAC12, 0xACADC625, - 0xA7F18118, 0xA633EB2F, 0xA4755576, 0xA5B73F41, - 0xA0F829C4, 0xA13A43F3, 0xA37CFDAA, 0xA2BE979D, - 0xB5C473D0, 0xB40619E7, 0xB640A7BE, 0xB782CD89, - 0xB2CDDB0C, 0xB30FB13B, 0xB1490F62, 0xB08B6555, - 0xBBD72268, 0xBA15485F, 0xB853F606, 0xB9919C31, - 0xBCDE8AB4, 0xBD1CE083, 0xBF5A5EDA, 0xBE9834ED - }, { - 0x00000000, 0xB8BC6765, 0xAA09C88B, 0x12B5AFEE, - 0x8F629757, 0x37DEF032, 0x256B5FDC, 0x9DD738B9, - 0xC5B428EF, 0x7D084F8A, 0x6FBDE064, 0xD7018701, - 0x4AD6BFB8, 0xF26AD8DD, 0xE0DF7733, 0x58631056, - 0x5019579F, 0xE8A530FA, 0xFA109F14, 0x42ACF871, - 0xDF7BC0C8, 0x67C7A7AD, 0x75720843, 0xCDCE6F26, - 0x95AD7F70, 0x2D111815, 0x3FA4B7FB, 0x8718D09E, - 0x1ACFE827, 0xA2738F42, 0xB0C620AC, 0x087A47C9, - 0xA032AF3E, 0x188EC85B, 0x0A3B67B5, 0xB28700D0, - 0x2F503869, 0x97EC5F0C, 0x8559F0E2, 0x3DE59787, - 0x658687D1, 0xDD3AE0B4, 0xCF8F4F5A, 0x7733283F, - 0xEAE41086, 0x525877E3, 0x40EDD80D, 0xF851BF68, - 0xF02BF8A1, 0x48979FC4, 0x5A22302A, 0xE29E574F, - 0x7F496FF6, 0xC7F50893, 0xD540A77D, 0x6DFCC018, - 0x359FD04E, 0x8D23B72B, 0x9F9618C5, 0x272A7FA0, - 0xBAFD4719, 0x0241207C, 0x10F48F92, 0xA848E8F7, - 0x9B14583D, 0x23A83F58, 0x311D90B6, 0x89A1F7D3, - 0x1476CF6A, 0xACCAA80F, 0xBE7F07E1, 0x06C36084, - 0x5EA070D2, 0xE61C17B7, 0xF4A9B859, 0x4C15DF3C, - 0xD1C2E785, 0x697E80E0, 0x7BCB2F0E, 0xC377486B, - 0xCB0D0FA2, 0x73B168C7, 0x6104C729, 0xD9B8A04C, - 0x446F98F5, 0xFCD3FF90, 0xEE66507E, 0x56DA371B, - 0x0EB9274D, 0xB6054028, 0xA4B0EFC6, 0x1C0C88A3, - 0x81DBB01A, 0x3967D77F, 0x2BD27891, 0x936E1FF4, - 0x3B26F703, 0x839A9066, 0x912F3F88, 0x299358ED, - 0xB4446054, 0x0CF80731, 0x1E4DA8DF, 0xA6F1CFBA, - 0xFE92DFEC, 0x462EB889, 0x549B1767, 0xEC277002, - 0x71F048BB, 0xC94C2FDE, 0xDBF98030, 0x6345E755, - 0x6B3FA09C, 0xD383C7F9, 0xC1366817, 0x798A0F72, - 0xE45D37CB, 0x5CE150AE, 0x4E54FF40, 0xF6E89825, - 0xAE8B8873, 0x1637EF16, 0x048240F8, 0xBC3E279D, - 0x21E91F24, 0x99557841, 0x8BE0D7AF, 0x335CB0CA, - 0xED59B63B, 0x55E5D15E, 0x47507EB0, 0xFFEC19D5, - 0x623B216C, 0xDA874609, 0xC832E9E7, 0x708E8E82, - 0x28ED9ED4, 0x9051F9B1, 0x82E4565F, 0x3A58313A, - 0xA78F0983, 0x1F336EE6, 0x0D86C108, 0xB53AA66D, - 0xBD40E1A4, 0x05FC86C1, 0x1749292F, 0xAFF54E4A, - 0x322276F3, 0x8A9E1196, 0x982BBE78, 0x2097D91D, - 0x78F4C94B, 0xC048AE2E, 0xD2FD01C0, 0x6A4166A5, - 0xF7965E1C, 0x4F2A3979, 0x5D9F9697, 0xE523F1F2, - 0x4D6B1905, 0xF5D77E60, 0xE762D18E, 0x5FDEB6EB, - 0xC2098E52, 0x7AB5E937, 0x680046D9, 0xD0BC21BC, - 0x88DF31EA, 0x3063568F, 0x22D6F961, 0x9A6A9E04, - 0x07BDA6BD, 0xBF01C1D8, 0xADB46E36, 0x15080953, - 0x1D724E9A, 0xA5CE29FF, 0xB77B8611, 0x0FC7E174, - 0x9210D9CD, 0x2AACBEA8, 0x38191146, 0x80A57623, - 0xD8C66675, 0x607A0110, 0x72CFAEFE, 0xCA73C99B, - 0x57A4F122, 0xEF189647, 0xFDAD39A9, 0x45115ECC, - 0x764DEE06, 0xCEF18963, 0xDC44268D, 0x64F841E8, - 0xF92F7951, 0x41931E34, 0x5326B1DA, 0xEB9AD6BF, - 0xB3F9C6E9, 0x0B45A18C, 0x19F00E62, 0xA14C6907, - 0x3C9B51BE, 0x842736DB, 0x96929935, 0x2E2EFE50, - 0x2654B999, 0x9EE8DEFC, 0x8C5D7112, 0x34E11677, - 0xA9362ECE, 0x118A49AB, 0x033FE645, 0xBB838120, - 0xE3E09176, 0x5B5CF613, 0x49E959FD, 0xF1553E98, - 0x6C820621, 0xD43E6144, 0xC68BCEAA, 0x7E37A9CF, - 0xD67F4138, 0x6EC3265D, 0x7C7689B3, 0xC4CAEED6, - 0x591DD66F, 0xE1A1B10A, 0xF3141EE4, 0x4BA87981, - 0x13CB69D7, 0xAB770EB2, 0xB9C2A15C, 0x017EC639, - 0x9CA9FE80, 0x241599E5, 0x36A0360B, 0x8E1C516E, - 0x866616A7, 0x3EDA71C2, 0x2C6FDE2C, 0x94D3B949, - 0x090481F0, 0xB1B8E695, 0xA30D497B, 0x1BB12E1E, - 0x43D23E48, 0xFB6E592D, 0xE9DBF6C3, 0x516791A6, - 0xCCB0A91F, 0x740CCE7A, 0x66B96194, 0xDE0506F1 - }, { - 0x00000000, 0x3D6029B0, 0x7AC05360, 0x47A07AD0, - 0xF580A6C0, 0xC8E08F70, 0x8F40F5A0, 0xB220DC10, - 0x30704BC1, 0x0D106271, 0x4AB018A1, 0x77D03111, - 0xC5F0ED01, 0xF890C4B1, 0xBF30BE61, 0x825097D1, - 0x60E09782, 0x5D80BE32, 0x1A20C4E2, 0x2740ED52, - 0x95603142, 0xA80018F2, 0xEFA06222, 0xD2C04B92, - 0x5090DC43, 0x6DF0F5F3, 0x2A508F23, 0x1730A693, - 0xA5107A83, 0x98705333, 0xDFD029E3, 0xE2B00053, - 0xC1C12F04, 0xFCA106B4, 0xBB017C64, 0x866155D4, - 0x344189C4, 0x0921A074, 0x4E81DAA4, 0x73E1F314, - 0xF1B164C5, 0xCCD14D75, 0x8B7137A5, 0xB6111E15, - 0x0431C205, 0x3951EBB5, 0x7EF19165, 0x4391B8D5, - 0xA121B886, 0x9C419136, 0xDBE1EBE6, 0xE681C256, - 0x54A11E46, 0x69C137F6, 0x2E614D26, 0x13016496, - 0x9151F347, 0xAC31DAF7, 0xEB91A027, 0xD6F18997, - 0x64D15587, 0x59B17C37, 0x1E1106E7, 0x23712F57, - 0x58F35849, 0x659371F9, 0x22330B29, 0x1F532299, - 0xAD73FE89, 0x9013D739, 0xD7B3ADE9, 0xEAD38459, - 0x68831388, 0x55E33A38, 0x124340E8, 0x2F236958, - 0x9D03B548, 0xA0639CF8, 0xE7C3E628, 0xDAA3CF98, - 0x3813CFCB, 0x0573E67B, 0x42D39CAB, 0x7FB3B51B, - 0xCD93690B, 0xF0F340BB, 0xB7533A6B, 0x8A3313DB, - 0x0863840A, 0x3503ADBA, 0x72A3D76A, 0x4FC3FEDA, - 0xFDE322CA, 0xC0830B7A, 0x872371AA, 0xBA43581A, - 0x9932774D, 0xA4525EFD, 0xE3F2242D, 0xDE920D9D, - 0x6CB2D18D, 0x51D2F83D, 0x167282ED, 0x2B12AB5D, - 0xA9423C8C, 0x9422153C, 0xD3826FEC, 0xEEE2465C, - 0x5CC29A4C, 0x61A2B3FC, 0x2602C92C, 0x1B62E09C, - 0xF9D2E0CF, 0xC4B2C97F, 0x8312B3AF, 0xBE729A1F, - 0x0C52460F, 0x31326FBF, 0x7692156F, 0x4BF23CDF, - 0xC9A2AB0E, 0xF4C282BE, 0xB362F86E, 0x8E02D1DE, - 0x3C220DCE, 0x0142247E, 0x46E25EAE, 0x7B82771E, - 0xB1E6B092, 0x8C869922, 0xCB26E3F2, 0xF646CA42, - 0x44661652, 0x79063FE2, 0x3EA64532, 0x03C66C82, - 0x8196FB53, 0xBCF6D2E3, 0xFB56A833, 0xC6368183, - 0x74165D93, 0x49767423, 0x0ED60EF3, 0x33B62743, - 0xD1062710, 0xEC660EA0, 0xABC67470, 0x96A65DC0, - 0x248681D0, 0x19E6A860, 0x5E46D2B0, 0x6326FB00, - 0xE1766CD1, 0xDC164561, 0x9BB63FB1, 0xA6D61601, - 0x14F6CA11, 0x2996E3A1, 0x6E369971, 0x5356B0C1, - 0x70279F96, 0x4D47B626, 0x0AE7CCF6, 0x3787E546, - 0x85A73956, 0xB8C710E6, 0xFF676A36, 0xC2074386, - 0x4057D457, 0x7D37FDE7, 0x3A978737, 0x07F7AE87, - 0xB5D77297, 0x88B75B27, 0xCF1721F7, 0xF2770847, - 0x10C70814, 0x2DA721A4, 0x6A075B74, 0x576772C4, - 0xE547AED4, 0xD8278764, 0x9F87FDB4, 0xA2E7D404, - 0x20B743D5, 0x1DD76A65, 0x5A7710B5, 0x67173905, - 0xD537E515, 0xE857CCA5, 0xAFF7B675, 0x92979FC5, - 0xE915E8DB, 0xD475C16B, 0x93D5BBBB, 0xAEB5920B, - 0x1C954E1B, 0x21F567AB, 0x66551D7B, 0x5B3534CB, - 0xD965A31A, 0xE4058AAA, 0xA3A5F07A, 0x9EC5D9CA, - 0x2CE505DA, 0x11852C6A, 0x562556BA, 0x6B457F0A, - 0x89F57F59, 0xB49556E9, 0xF3352C39, 0xCE550589, - 0x7C75D999, 0x4115F029, 0x06B58AF9, 0x3BD5A349, - 0xB9853498, 0x84E51D28, 0xC34567F8, 0xFE254E48, - 0x4C059258, 0x7165BBE8, 0x36C5C138, 0x0BA5E888, - 0x28D4C7DF, 0x15B4EE6F, 0x521494BF, 0x6F74BD0F, - 0xDD54611F, 0xE03448AF, 0xA794327F, 0x9AF41BCF, - 0x18A48C1E, 0x25C4A5AE, 0x6264DF7E, 0x5F04F6CE, - 0xED242ADE, 0xD044036E, 0x97E479BE, 0xAA84500E, - 0x4834505D, 0x755479ED, 0x32F4033D, 0x0F942A8D, - 0xBDB4F69D, 0x80D4DF2D, 0xC774A5FD, 0xFA148C4D, - 0x78441B9C, 0x4524322C, 0x028448FC, 0x3FE4614C, - 0x8DC4BD5C, 0xB0A494EC, 0xF704EE3C, 0xCA64C78C - }, { - 0x00000000, 0xCB5CD3A5, 0x4DC8A10B, 0x869472AE, - 0x9B914216, 0x50CD91B3, 0xD659E31D, 0x1D0530B8, - 0xEC53826D, 0x270F51C8, 0xA19B2366, 0x6AC7F0C3, - 0x77C2C07B, 0xBC9E13DE, 0x3A0A6170, 0xF156B2D5, - 0x03D6029B, 0xC88AD13E, 0x4E1EA390, 0x85427035, - 0x9847408D, 0x531B9328, 0xD58FE186, 0x1ED33223, - 0xEF8580F6, 0x24D95353, 0xA24D21FD, 0x6911F258, - 0x7414C2E0, 0xBF481145, 0x39DC63EB, 0xF280B04E, - 0x07AC0536, 0xCCF0D693, 0x4A64A43D, 0x81387798, - 0x9C3D4720, 0x57619485, 0xD1F5E62B, 0x1AA9358E, - 0xEBFF875B, 0x20A354FE, 0xA6372650, 0x6D6BF5F5, - 0x706EC54D, 0xBB3216E8, 0x3DA66446, 0xF6FAB7E3, - 0x047A07AD, 0xCF26D408, 0x49B2A6A6, 0x82EE7503, - 0x9FEB45BB, 0x54B7961E, 0xD223E4B0, 0x197F3715, - 0xE82985C0, 0x23755665, 0xA5E124CB, 0x6EBDF76E, - 0x73B8C7D6, 0xB8E41473, 0x3E7066DD, 0xF52CB578, - 0x0F580A6C, 0xC404D9C9, 0x4290AB67, 0x89CC78C2, - 0x94C9487A, 0x5F959BDF, 0xD901E971, 0x125D3AD4, - 0xE30B8801, 0x28575BA4, 0xAEC3290A, 0x659FFAAF, - 0x789ACA17, 0xB3C619B2, 0x35526B1C, 0xFE0EB8B9, - 0x0C8E08F7, 0xC7D2DB52, 0x4146A9FC, 0x8A1A7A59, - 0x971F4AE1, 0x5C439944, 0xDAD7EBEA, 0x118B384F, - 0xE0DD8A9A, 0x2B81593F, 0xAD152B91, 0x6649F834, - 0x7B4CC88C, 0xB0101B29, 0x36846987, 0xFDD8BA22, - 0x08F40F5A, 0xC3A8DCFF, 0x453CAE51, 0x8E607DF4, - 0x93654D4C, 0x58399EE9, 0xDEADEC47, 0x15F13FE2, - 0xE4A78D37, 0x2FFB5E92, 0xA96F2C3C, 0x6233FF99, - 0x7F36CF21, 0xB46A1C84, 0x32FE6E2A, 0xF9A2BD8F, - 0x0B220DC1, 0xC07EDE64, 0x46EAACCA, 0x8DB67F6F, - 0x90B34FD7, 0x5BEF9C72, 0xDD7BEEDC, 0x16273D79, - 0xE7718FAC, 0x2C2D5C09, 0xAAB92EA7, 0x61E5FD02, - 0x7CE0CDBA, 0xB7BC1E1F, 0x31286CB1, 0xFA74BF14, - 0x1EB014D8, 0xD5ECC77D, 0x5378B5D3, 0x98246676, - 0x852156CE, 0x4E7D856B, 0xC8E9F7C5, 0x03B52460, - 0xF2E396B5, 0x39BF4510, 0xBF2B37BE, 0x7477E41B, - 0x6972D4A3, 0xA22E0706, 0x24BA75A8, 0xEFE6A60D, - 0x1D661643, 0xD63AC5E6, 0x50AEB748, 0x9BF264ED, - 0x86F75455, 0x4DAB87F0, 0xCB3FF55E, 0x006326FB, - 0xF135942E, 0x3A69478B, 0xBCFD3525, 0x77A1E680, - 0x6AA4D638, 0xA1F8059D, 0x276C7733, 0xEC30A496, - 0x191C11EE, 0xD240C24B, 0x54D4B0E5, 0x9F886340, - 0x828D53F8, 0x49D1805D, 0xCF45F2F3, 0x04192156, - 0xF54F9383, 0x3E134026, 0xB8873288, 0x73DBE12D, - 0x6EDED195, 0xA5820230, 0x2316709E, 0xE84AA33B, - 0x1ACA1375, 0xD196C0D0, 0x5702B27E, 0x9C5E61DB, - 0x815B5163, 0x4A0782C6, 0xCC93F068, 0x07CF23CD, - 0xF6999118, 0x3DC542BD, 0xBB513013, 0x700DE3B6, - 0x6D08D30E, 0xA65400AB, 0x20C07205, 0xEB9CA1A0, - 0x11E81EB4, 0xDAB4CD11, 0x5C20BFBF, 0x977C6C1A, - 0x8A795CA2, 0x41258F07, 0xC7B1FDA9, 0x0CED2E0C, - 0xFDBB9CD9, 0x36E74F7C, 0xB0733DD2, 0x7B2FEE77, - 0x662ADECF, 0xAD760D6A, 0x2BE27FC4, 0xE0BEAC61, - 0x123E1C2F, 0xD962CF8A, 0x5FF6BD24, 0x94AA6E81, - 0x89AF5E39, 0x42F38D9C, 0xC467FF32, 0x0F3B2C97, - 0xFE6D9E42, 0x35314DE7, 0xB3A53F49, 0x78F9ECEC, - 0x65FCDC54, 0xAEA00FF1, 0x28347D5F, 0xE368AEFA, - 0x16441B82, 0xDD18C827, 0x5B8CBA89, 0x90D0692C, - 0x8DD55994, 0x46898A31, 0xC01DF89F, 0x0B412B3A, - 0xFA1799EF, 0x314B4A4A, 0xB7DF38E4, 0x7C83EB41, - 0x6186DBF9, 0xAADA085C, 0x2C4E7AF2, 0xE712A957, - 0x15921919, 0xDECECABC, 0x585AB812, 0x93066BB7, - 0x8E035B0F, 0x455F88AA, 0xC3CBFA04, 0x089729A1, - 0xF9C19B74, 0x329D48D1, 0xB4093A7F, 0x7F55E9DA, - 0x6250D962, 0xA90C0AC7, 0x2F987869, 0xE4C4ABCC - }, { - 0x00000000, 0xA6770BB4, 0x979F1129, 0x31E81A9D, - 0xF44F2413, 0x52382FA7, 0x63D0353A, 0xC5A73E8E, - 0x33EF4E67, 0x959845D3, 0xA4705F4E, 0x020754FA, - 0xC7A06A74, 0x61D761C0, 0x503F7B5D, 0xF64870E9, - 0x67DE9CCE, 0xC1A9977A, 0xF0418DE7, 0x56368653, - 0x9391B8DD, 0x35E6B369, 0x040EA9F4, 0xA279A240, - 0x5431D2A9, 0xF246D91D, 0xC3AEC380, 0x65D9C834, - 0xA07EF6BA, 0x0609FD0E, 0x37E1E793, 0x9196EC27, - 0xCFBD399C, 0x69CA3228, 0x582228B5, 0xFE552301, - 0x3BF21D8F, 0x9D85163B, 0xAC6D0CA6, 0x0A1A0712, - 0xFC5277FB, 0x5A257C4F, 0x6BCD66D2, 0xCDBA6D66, - 0x081D53E8, 0xAE6A585C, 0x9F8242C1, 0x39F54975, - 0xA863A552, 0x0E14AEE6, 0x3FFCB47B, 0x998BBFCF, - 0x5C2C8141, 0xFA5B8AF5, 0xCBB39068, 0x6DC49BDC, - 0x9B8CEB35, 0x3DFBE081, 0x0C13FA1C, 0xAA64F1A8, - 0x6FC3CF26, 0xC9B4C492, 0xF85CDE0F, 0x5E2BD5BB, - 0x440B7579, 0xE27C7ECD, 0xD3946450, 0x75E36FE4, - 0xB044516A, 0x16335ADE, 0x27DB4043, 0x81AC4BF7, - 0x77E43B1E, 0xD19330AA, 0xE07B2A37, 0x460C2183, - 0x83AB1F0D, 0x25DC14B9, 0x14340E24, 0xB2430590, - 0x23D5E9B7, 0x85A2E203, 0xB44AF89E, 0x123DF32A, - 0xD79ACDA4, 0x71EDC610, 0x4005DC8D, 0xE672D739, - 0x103AA7D0, 0xB64DAC64, 0x87A5B6F9, 0x21D2BD4D, - 0xE47583C3, 0x42028877, 0x73EA92EA, 0xD59D995E, - 0x8BB64CE5, 0x2DC14751, 0x1C295DCC, 0xBA5E5678, - 0x7FF968F6, 0xD98E6342, 0xE86679DF, 0x4E11726B, - 0xB8590282, 0x1E2E0936, 0x2FC613AB, 0x89B1181F, - 0x4C162691, 0xEA612D25, 0xDB8937B8, 0x7DFE3C0C, - 0xEC68D02B, 0x4A1FDB9F, 0x7BF7C102, 0xDD80CAB6, - 0x1827F438, 0xBE50FF8C, 0x8FB8E511, 0x29CFEEA5, - 0xDF879E4C, 0x79F095F8, 0x48188F65, 0xEE6F84D1, - 0x2BC8BA5F, 0x8DBFB1EB, 0xBC57AB76, 0x1A20A0C2, - 0x8816EAF2, 0x2E61E146, 0x1F89FBDB, 0xB9FEF06F, - 0x7C59CEE1, 0xDA2EC555, 0xEBC6DFC8, 0x4DB1D47C, - 0xBBF9A495, 0x1D8EAF21, 0x2C66B5BC, 0x8A11BE08, - 0x4FB68086, 0xE9C18B32, 0xD82991AF, 0x7E5E9A1B, - 0xEFC8763C, 0x49BF7D88, 0x78576715, 0xDE206CA1, - 0x1B87522F, 0xBDF0599B, 0x8C184306, 0x2A6F48B2, - 0xDC27385B, 0x7A5033EF, 0x4BB82972, 0xEDCF22C6, - 0x28681C48, 0x8E1F17FC, 0xBFF70D61, 0x198006D5, - 0x47ABD36E, 0xE1DCD8DA, 0xD034C247, 0x7643C9F3, - 0xB3E4F77D, 0x1593FCC9, 0x247BE654, 0x820CEDE0, - 0x74449D09, 0xD23396BD, 0xE3DB8C20, 0x45AC8794, - 0x800BB91A, 0x267CB2AE, 0x1794A833, 0xB1E3A387, - 0x20754FA0, 0x86024414, 0xB7EA5E89, 0x119D553D, - 0xD43A6BB3, 0x724D6007, 0x43A57A9A, 0xE5D2712E, - 0x139A01C7, 0xB5ED0A73, 0x840510EE, 0x22721B5A, - 0xE7D525D4, 0x41A22E60, 0x704A34FD, 0xD63D3F49, - 0xCC1D9F8B, 0x6A6A943F, 0x5B828EA2, 0xFDF58516, - 0x3852BB98, 0x9E25B02C, 0xAFCDAAB1, 0x09BAA105, - 0xFFF2D1EC, 0x5985DA58, 0x686DC0C5, 0xCE1ACB71, - 0x0BBDF5FF, 0xADCAFE4B, 0x9C22E4D6, 0x3A55EF62, - 0xABC30345, 0x0DB408F1, 0x3C5C126C, 0x9A2B19D8, - 0x5F8C2756, 0xF9FB2CE2, 0xC813367F, 0x6E643DCB, - 0x982C4D22, 0x3E5B4696, 0x0FB35C0B, 0xA9C457BF, - 0x6C636931, 0xCA146285, 0xFBFC7818, 0x5D8B73AC, - 0x03A0A617, 0xA5D7ADA3, 0x943FB73E, 0x3248BC8A, - 0xF7EF8204, 0x519889B0, 0x6070932D, 0xC6079899, - 0x304FE870, 0x9638E3C4, 0xA7D0F959, 0x01A7F2ED, - 0xC400CC63, 0x6277C7D7, 0x539FDD4A, 0xF5E8D6FE, - 0x647E3AD9, 0xC209316D, 0xF3E12BF0, 0x55962044, - 0x90311ECA, 0x3646157E, 0x07AE0FE3, 0xA1D90457, - 0x579174BE, 0xF1E67F0A, 0xC00E6597, 0x66796E23, - 0xA3DE50AD, 0x05A95B19, 0x34414184, 0x92364A30 - }, { - 0x00000000, 0xCCAA009E, 0x4225077D, 0x8E8F07E3, - 0x844A0EFA, 0x48E00E64, 0xC66F0987, 0x0AC50919, - 0xD3E51BB5, 0x1F4F1B2B, 0x91C01CC8, 0x5D6A1C56, - 0x57AF154F, 0x9B0515D1, 0x158A1232, 0xD92012AC, - 0x7CBB312B, 0xB01131B5, 0x3E9E3656, 0xF23436C8, - 0xF8F13FD1, 0x345B3F4F, 0xBAD438AC, 0x767E3832, - 0xAF5E2A9E, 0x63F42A00, 0xED7B2DE3, 0x21D12D7D, - 0x2B142464, 0xE7BE24FA, 0x69312319, 0xA59B2387, - 0xF9766256, 0x35DC62C8, 0xBB53652B, 0x77F965B5, - 0x7D3C6CAC, 0xB1966C32, 0x3F196BD1, 0xF3B36B4F, - 0x2A9379E3, 0xE639797D, 0x68B67E9E, 0xA41C7E00, - 0xAED97719, 0x62737787, 0xECFC7064, 0x205670FA, - 0x85CD537D, 0x496753E3, 0xC7E85400, 0x0B42549E, - 0x01875D87, 0xCD2D5D19, 0x43A25AFA, 0x8F085A64, - 0x562848C8, 0x9A824856, 0x140D4FB5, 0xD8A74F2B, - 0xD2624632, 0x1EC846AC, 0x9047414F, 0x5CED41D1, - 0x299DC2ED, 0xE537C273, 0x6BB8C590, 0xA712C50E, - 0xADD7CC17, 0x617DCC89, 0xEFF2CB6A, 0x2358CBF4, - 0xFA78D958, 0x36D2D9C6, 0xB85DDE25, 0x74F7DEBB, - 0x7E32D7A2, 0xB298D73C, 0x3C17D0DF, 0xF0BDD041, - 0x5526F3C6, 0x998CF358, 0x1703F4BB, 0xDBA9F425, - 0xD16CFD3C, 0x1DC6FDA2, 0x9349FA41, 0x5FE3FADF, - 0x86C3E873, 0x4A69E8ED, 0xC4E6EF0E, 0x084CEF90, - 0x0289E689, 0xCE23E617, 0x40ACE1F4, 0x8C06E16A, - 0xD0EBA0BB, 0x1C41A025, 0x92CEA7C6, 0x5E64A758, - 0x54A1AE41, 0x980BAEDF, 0x1684A93C, 0xDA2EA9A2, - 0x030EBB0E, 0xCFA4BB90, 0x412BBC73, 0x8D81BCED, - 0x8744B5F4, 0x4BEEB56A, 0xC561B289, 0x09CBB217, - 0xAC509190, 0x60FA910E, 0xEE7596ED, 0x22DF9673, - 0x281A9F6A, 0xE4B09FF4, 0x6A3F9817, 0xA6959889, - 0x7FB58A25, 0xB31F8ABB, 0x3D908D58, 0xF13A8DC6, - 0xFBFF84DF, 0x37558441, 0xB9DA83A2, 0x7570833C, - 0x533B85DA, 0x9F918544, 0x111E82A7, 0xDDB48239, - 0xD7718B20, 0x1BDB8BBE, 0x95548C5D, 0x59FE8CC3, - 0x80DE9E6F, 0x4C749EF1, 0xC2FB9912, 0x0E51998C, - 0x04949095, 0xC83E900B, 0x46B197E8, 0x8A1B9776, - 0x2F80B4F1, 0xE32AB46F, 0x6DA5B38C, 0xA10FB312, - 0xABCABA0B, 0x6760BA95, 0xE9EFBD76, 0x2545BDE8, - 0xFC65AF44, 0x30CFAFDA, 0xBE40A839, 0x72EAA8A7, - 0x782FA1BE, 0xB485A120, 0x3A0AA6C3, 0xF6A0A65D, - 0xAA4DE78C, 0x66E7E712, 0xE868E0F1, 0x24C2E06F, - 0x2E07E976, 0xE2ADE9E8, 0x6C22EE0B, 0xA088EE95, - 0x79A8FC39, 0xB502FCA7, 0x3B8DFB44, 0xF727FBDA, - 0xFDE2F2C3, 0x3148F25D, 0xBFC7F5BE, 0x736DF520, - 0xD6F6D6A7, 0x1A5CD639, 0x94D3D1DA, 0x5879D144, - 0x52BCD85D, 0x9E16D8C3, 0x1099DF20, 0xDC33DFBE, - 0x0513CD12, 0xC9B9CD8C, 0x4736CA6F, 0x8B9CCAF1, - 0x8159C3E8, 0x4DF3C376, 0xC37CC495, 0x0FD6C40B, - 0x7AA64737, 0xB60C47A9, 0x3883404A, 0xF42940D4, - 0xFEEC49CD, 0x32464953, 0xBCC94EB0, 0x70634E2E, - 0xA9435C82, 0x65E95C1C, 0xEB665BFF, 0x27CC5B61, - 0x2D095278, 0xE1A352E6, 0x6F2C5505, 0xA386559B, - 0x061D761C, 0xCAB77682, 0x44387161, 0x889271FF, - 0x825778E6, 0x4EFD7878, 0xC0727F9B, 0x0CD87F05, - 0xD5F86DA9, 0x19526D37, 0x97DD6AD4, 0x5B776A4A, - 0x51B26353, 0x9D1863CD, 0x1397642E, 0xDF3D64B0, - 0x83D02561, 0x4F7A25FF, 0xC1F5221C, 0x0D5F2282, - 0x079A2B9B, 0xCB302B05, 0x45BF2CE6, 0x89152C78, - 0x50353ED4, 0x9C9F3E4A, 0x121039A9, 0xDEBA3937, - 0xD47F302E, 0x18D530B0, 0x965A3753, 0x5AF037CD, - 0xFF6B144A, 0x33C114D4, 0xBD4E1337, 0x71E413A9, - 0x7B211AB0, 0xB78B1A2E, 0x39041DCD, 0xF5AE1D53, - 0x2C8E0FFF, 0xE0240F61, 0x6EAB0882, 0xA201081C, - 0xA8C40105, 0x646E019B, 0xEAE10678, 0x264B06E6 - } -}; diff --git a/game/client/third/minizip/lib/liblzma/check/crc_macros.h b/game/client/third/minizip/lib/liblzma/check/crc_macros.h deleted file mode 100755 index a7c21b76..00000000 --- a/game/client/third/minizip/lib/liblzma/check/crc_macros.h +++ /dev/null @@ -1,30 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file crc_macros.h -/// \brief Some endian-dependent macros for CRC32 and CRC64 -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifdef WORDS_BIGENDIAN -# define A(x) ((x) >> 24) -# define B(x) (((x) >> 16) & 0xFF) -# define C(x) (((x) >> 8) & 0xFF) -# define D(x) ((x) & 0xFF) - -# define S8(x) ((x) << 8) -# define S32(x) ((x) << 32) - -#else -# define A(x) ((x) & 0xFF) -# define B(x) (((x) >> 8) & 0xFF) -# define C(x) (((x) >> 16) & 0xFF) -# define D(x) ((x) >> 24) - -# define S8(x) ((x) >> 8) -# define S32(x) ((x) >> 32) -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/alone_decoder.c b/game/client/third/minizip/lib/liblzma/common/alone_decoder.c deleted file mode 100755 index 1345d300..00000000 --- a/game/client/third/minizip/lib/liblzma/common/alone_decoder.c +++ /dev/null @@ -1,227 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file alone_decoder.c -/// \brief Decoder for LZMA_Alone files -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "alone_decoder.h" -#include "lzma_decoder.h" -#include "lz_decoder.h" - - -typedef struct { - lzma_next_coder next; - - enum { - SEQ_PROPERTIES, - SEQ_DICTIONARY_SIZE, - SEQ_UNCOMPRESSED_SIZE, - SEQ_CODER_INIT, - SEQ_CODE, - } sequence; - - /// If true, reject files that are unlikely to be .lzma files. - /// If false, more non-.lzma files get accepted and will give - /// LZMA_DATA_ERROR either immediately or after a few output bytes. - bool picky; - - /// Position in the header fields - size_t pos; - - /// Uncompressed size decoded from the header - lzma_vli uncompressed_size; - - /// Memory usage limit - uint64_t memlimit; - - /// Amount of memory actually needed (only an estimate) - uint64_t memusage; - - /// Options decoded from the header needed to initialize - /// the LZMA decoder - lzma_options_lzma options; -} lzma_alone_coder; - - -static lzma_ret -alone_decode(void *coder_ptr, - const lzma_allocator *allocator lzma_attribute((__unused__)), - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action) -{ - lzma_alone_coder *coder = coder_ptr; - - while (*out_pos < out_size - && (coder->sequence == SEQ_CODE || *in_pos < in_size)) - switch (coder->sequence) { - case SEQ_PROPERTIES: - if (lzma_lzma_lclppb_decode(&coder->options, in[*in_pos])) - return LZMA_FORMAT_ERROR; - - coder->sequence = SEQ_DICTIONARY_SIZE; - ++*in_pos; - break; - - case SEQ_DICTIONARY_SIZE: - coder->options.dict_size - |= (size_t)(in[*in_pos]) << (coder->pos * 8); - ++*in_pos; - if (++coder->pos < 4) - break; - - if (coder->picky && coder->options.dict_size - != UINT32_MAX) { - // A hack to ditch tons of false positives: - // We allow only dictionary sizes that are - // 2^n or 2^n + 2^(n-1). LZMA_Alone created - // only files with 2^n, but accepts any - // dictionary size. - uint32_t d = coder->options.dict_size - 1; - d |= d >> 2; - d |= d >> 3; - d |= d >> 4; - d |= d >> 8; - d |= d >> 16; - ++d; - - if (d != coder->options.dict_size) - return LZMA_FORMAT_ERROR; - } - - coder->uncompressed_size = LZMA_VLI_UNKNOWN; - - // Calculate the memory usage so that it is ready - // for SEQ_CODER_INIT. - coder->memusage = lzma_lzma_decoder_memusage(&coder->options) - + LZMA_MEMUSAGE_BASE; - - coder->pos = 0; - coder->sequence = SEQ_CODER_INIT; - - // Fall through - - case SEQ_CODER_INIT: { - if (coder->memusage > coder->memlimit) - return LZMA_MEMLIMIT_ERROR; - - lzma_filter_info filters[2] = { - { - .init = &lzma_lzma_decoder_init, - .options = &coder->options, - }, { - .init = NULL, - } - }; - - const lzma_ret ret = lzma_next_filter_init(&coder->next, - allocator, filters); - if (ret != LZMA_OK) - return ret; - - // Use a hack to set the uncompressed size. - lzma_lz_decoder_uncompressed(coder->next.coder, - coder->uncompressed_size); - - coder->sequence = SEQ_CODE; - break; - } - - case SEQ_CODE: { - return coder->next.code(coder->next.coder, - allocator, in, in_pos, in_size, - out, out_pos, out_size, action); - } - - default: - return LZMA_PROG_ERROR; - } - - return LZMA_OK; -} - - -static void -alone_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_alone_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -alone_decoder_memconfig(void *coder_ptr, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit) -{ - lzma_alone_coder *coder = coder_ptr; - - *memusage = coder->memusage; - *old_memlimit = coder->memlimit; - - if (new_memlimit != 0) { - if (new_memlimit < coder->memusage) - return LZMA_MEMLIMIT_ERROR; - - coder->memlimit = new_memlimit; - } - - return LZMA_OK; -} - - -extern lzma_ret -lzma_alone_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, bool picky) -{ - lzma_next_coder_init(&lzma_alone_decoder_init, next, allocator); - - if (memlimit == 0) - return LZMA_PROG_ERROR; - - lzma_alone_coder *coder = next->coder; - - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_alone_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &alone_decode; - next->end = &alone_decoder_end; - next->memconfig = &alone_decoder_memconfig; - coder->next = LZMA_NEXT_CODER_INIT; - } - - coder->sequence = SEQ_PROPERTIES; - coder->picky = picky; - coder->pos = 0; - coder->options.dict_size = 0; - coder->options.preset_dict = NULL; - coder->options.preset_dict_size = 0; - coder->uncompressed_size = 0; - coder->memlimit = memlimit; - coder->memusage = LZMA_MEMUSAGE_BASE; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_alone_decoder(lzma_stream *strm, uint64_t memlimit) -{ - lzma_next_strm_init(lzma_alone_decoder_init, strm, memlimit, false); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/game/client/third/minizip/lib/liblzma/common/alone_decoder.h b/game/client/third/minizip/lib/liblzma/common/alone_decoder.h deleted file mode 100755 index dfa031aa..00000000 --- a/game/client/third/minizip/lib/liblzma/common/alone_decoder.h +++ /dev/null @@ -1,23 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file alone_decoder.h -/// \brief Decoder for LZMA_Alone files -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_ALONE_DECODER_H -#define LZMA_ALONE_DECODER_H - -#include "common.h" - - -extern lzma_ret lzma_alone_decoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - uint64_t memlimit, bool picky); - -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/alone_encoder.c b/game/client/third/minizip/lib/liblzma/common/alone_encoder.c deleted file mode 100755 index d2f413fe..00000000 --- a/game/client/third/minizip/lib/liblzma/common/alone_encoder.c +++ /dev/null @@ -1,160 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file alone_decoder.c -/// \brief Decoder for LZMA_Alone files -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" -#include "lzma_encoder.h" - - -#define ALONE_HEADER_SIZE (1 + 4) - - -typedef struct { - lzma_next_coder next; - - enum { - SEQ_HEADER, - SEQ_CODE, - } sequence; - - size_t header_pos; - uint8_t header[ALONE_HEADER_SIZE]; -} lzma_alone_coder; - - -static lzma_ret -alone_encode(void *coder_ptr, - const lzma_allocator *allocator lzma_attribute((__unused__)), - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action) -{ - lzma_alone_coder *coder = coder_ptr; - - while (*out_pos < out_size) - switch (coder->sequence) { - case SEQ_HEADER: - lzma_bufcpy(coder->header, &coder->header_pos, - ALONE_HEADER_SIZE, - out, out_pos, out_size); - if (coder->header_pos < ALONE_HEADER_SIZE) - return LZMA_OK; - - coder->sequence = SEQ_CODE; - break; - - case SEQ_CODE: - return coder->next.code(coder->next.coder, - allocator, in, in_pos, in_size, - out, out_pos, out_size, action); - - default: - assert(0); - return LZMA_PROG_ERROR; - } - - return LZMA_OK; -} - - -static void -alone_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_alone_coder *coder = coder_ptr; - lzma_next_end(&coder->next, allocator); - lzma_free(coder, allocator); - return; -} - - -// At least for now, this is not used by any internal function. -static lzma_ret -alone_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_options_lzma *options) -{ - lzma_next_coder_init(&alone_encoder_init, next, allocator); - - lzma_alone_coder *coder = next->coder; - - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_alone_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &alone_encode; - next->end = &alone_encoder_end; - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Basic initializations - coder->sequence = SEQ_HEADER; - coder->header_pos = 0; - - // Encode the header: - // - Properties (1 byte) - if (lzma_lzma_lclppb_encode(options, coder->header)) - return LZMA_OPTIONS_ERROR; - - // - Dictionary size (4 bytes) - if (options->dict_size < LZMA_DICT_SIZE_MIN) - return LZMA_OPTIONS_ERROR; - - // Round up to the next 2^n or 2^n + 2^(n - 1) depending on which - // one is the next unless it is UINT32_MAX. While the header would - // allow any 32-bit integer, we do this to keep the decoder of liblzma - // accepting the resulting files. - uint32_t d = options->dict_size - 1; - d |= d >> 2; - d |= d >> 3; - d |= d >> 4; - d |= d >> 8; - d |= d >> 16; - if (d != UINT32_MAX) - ++d; - - unaligned_write32le(coder->header + 1, d); - - // Initialize the LZMA encoder. - const lzma_filter_info filters[2] = { - { - .init = &lzma_lzma_encoder_init, - .options = (void *)(options), - }, { - .init = NULL, - } - }; - - return lzma_next_filter_init(&coder->next, allocator, filters); -} - - -/* -extern lzma_ret -lzma_alone_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_options_alone *options) -{ - lzma_next_coder_init(&alone_encoder_init, next, allocator, options); -} -*/ - - -extern LZMA_API(lzma_ret) -lzma_alone_encoder(lzma_stream *strm, const lzma_options_lzma *options) -{ - lzma_next_strm_init(alone_encoder_init, strm, options); - - strm->internal->supported_actions[LZMA_RUN] = true; - strm->internal->supported_actions[LZMA_FINISH] = true; - - return LZMA_OK; -} diff --git a/game/client/third/minizip/lib/liblzma/common/common.c b/game/client/third/minizip/lib/liblzma/common/common.c deleted file mode 100755 index 28aa2b71..00000000 --- a/game/client/third/minizip/lib/liblzma/common/common.c +++ /dev/null @@ -1,443 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file common.h -/// \brief Common functions needed in many places in liblzma -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - - -///////////// -// Version // -///////////// - -extern LZMA_API(uint32_t) -lzma_version_number(void) -{ - return LZMA_VERSION; -} - - -extern LZMA_API(const char *) -lzma_version_string(void) -{ - return LZMA_VERSION_STRING; -} - - -/////////////////////// -// Memory allocation // -/////////////////////// - -extern void * lzma_attribute((__malloc__)) lzma_attr_alloc_size(1) -lzma_alloc(size_t size, const lzma_allocator *allocator) -{ - // Some malloc() variants return NULL if called with size == 0. - if (size == 0) - size = 1; - - void *ptr; - - if (allocator != NULL && allocator->alloc != NULL) - ptr = allocator->alloc(allocator->opaque, 1, size); - else - ptr = malloc(size); - - return ptr; -} - - -extern void * lzma_attribute((__malloc__)) lzma_attr_alloc_size(1) -lzma_alloc_zero(size_t size, const lzma_allocator *allocator) -{ - // Some calloc() variants return NULL if called with size == 0. - if (size == 0) - size = 1; - - void *ptr; - - if (allocator != NULL && allocator->alloc != NULL) { - ptr = allocator->alloc(allocator->opaque, 1, size); - if (ptr != NULL) - memzero(ptr, size); - } else { - ptr = calloc(1, size); - } - - return ptr; -} - - -extern void -lzma_free(void *ptr, const lzma_allocator *allocator) -{ - if (allocator != NULL && allocator->free != NULL) - allocator->free(allocator->opaque, ptr); - else - free(ptr); - - return; -} - - -////////// -// Misc // -////////// - -extern size_t -lzma_bufcpy(const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size) -{ - const size_t in_avail = in_size - *in_pos; - const size_t out_avail = out_size - *out_pos; - const size_t copy_size = my_min(in_avail, out_avail); - - memcpy(out + *out_pos, in + *in_pos, copy_size); - - *in_pos += copy_size; - *out_pos += copy_size; - - return copy_size; -} - - -extern lzma_ret -lzma_next_filter_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - lzma_next_coder_init(filters[0].init, next, allocator); - next->id = filters[0].id; - return filters[0].init == NULL - ? LZMA_OK : filters[0].init(next, allocator, filters); -} - - -extern lzma_ret -lzma_next_filter_update(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *reversed_filters) -{ - // Check that the application isn't trying to change the Filter ID. - // End of filters is indicated with LZMA_VLI_UNKNOWN in both - // reversed_filters[0].id and next->id. - if (reversed_filters[0].id != next->id) - return LZMA_PROG_ERROR; - - if (reversed_filters[0].id == LZMA_VLI_UNKNOWN) - return LZMA_OK; - - assert(next->update != NULL); - return next->update(next->coder, allocator, NULL, reversed_filters); -} - - -extern void -lzma_next_end(lzma_next_coder *next, const lzma_allocator *allocator) -{ - if (next->init != (uintptr_t)(NULL)) { - // To avoid tiny end functions that simply call - // lzma_free(coder, allocator), we allow leaving next->end - // NULL and call lzma_free() here. - if (next->end != NULL) - next->end(next->coder, allocator); - else - lzma_free(next->coder, allocator); - - // Reset the variables so the we don't accidentally think - // that it is an already initialized coder. - *next = LZMA_NEXT_CODER_INIT; - } - - return; -} - - -////////////////////////////////////// -// External to internal API wrapper // -////////////////////////////////////// - -extern lzma_ret -lzma_strm_init(lzma_stream *strm) -{ - if (strm == NULL) - return LZMA_PROG_ERROR; - - if (strm->internal == NULL) { - strm->internal = lzma_alloc(sizeof(lzma_internal), - strm->allocator); - if (strm->internal == NULL) - return LZMA_MEM_ERROR; - - strm->internal->next = LZMA_NEXT_CODER_INIT; - } - - memzero(strm->internal->supported_actions, - sizeof(strm->internal->supported_actions)); - strm->internal->sequence = ISEQ_RUN; - strm->internal->allow_buf_error = false; - - strm->total_in = 0; - strm->total_out = 0; - - return LZMA_OK; -} - - -extern LZMA_API(lzma_ret) -lzma_code(lzma_stream *strm, lzma_action action) -{ - // Sanity checks - if ((strm->next_in == NULL && strm->avail_in != 0) - || (strm->next_out == NULL && strm->avail_out != 0) - || strm->internal == NULL - || strm->internal->next.code == NULL - || (unsigned int)(action) > LZMA_ACTION_MAX - || !strm->internal->supported_actions[action]) - return LZMA_PROG_ERROR; - - // Check if unsupported members have been set to non-zero or non-NULL, - // which would indicate that some new feature is wanted. - if (strm->reserved_ptr1 != NULL - || strm->reserved_ptr2 != NULL - || strm->reserved_ptr3 != NULL - || strm->reserved_ptr4 != NULL - || strm->reserved_int1 != 0 - || strm->reserved_int2 != 0 - || strm->reserved_int3 != 0 - || strm->reserved_int4 != 0 - || strm->reserved_enum1 != LZMA_RESERVED_ENUM - || strm->reserved_enum2 != LZMA_RESERVED_ENUM) - return LZMA_OPTIONS_ERROR; - - switch (strm->internal->sequence) { - case ISEQ_RUN: - switch (action) { - case LZMA_RUN: - break; - - case LZMA_SYNC_FLUSH: - strm->internal->sequence = ISEQ_SYNC_FLUSH; - break; - - case LZMA_FULL_FLUSH: - strm->internal->sequence = ISEQ_FULL_FLUSH; - break; - - case LZMA_FINISH: - strm->internal->sequence = ISEQ_FINISH; - break; - - case LZMA_FULL_BARRIER: - strm->internal->sequence = ISEQ_FULL_BARRIER; - break; - } - - break; - - case ISEQ_SYNC_FLUSH: - // The same action must be used until we return - // LZMA_STREAM_END, and the amount of input must not change. - if (action != LZMA_SYNC_FLUSH - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_FULL_FLUSH: - if (action != LZMA_FULL_FLUSH - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_FINISH: - if (action != LZMA_FINISH - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_FULL_BARRIER: - if (action != LZMA_FULL_BARRIER - || strm->internal->avail_in != strm->avail_in) - return LZMA_PROG_ERROR; - - break; - - case ISEQ_END: - return LZMA_STREAM_END; - - case ISEQ_ERROR: - default: - return LZMA_PROG_ERROR; - } - - size_t in_pos = 0; - size_t out_pos = 0; - lzma_ret ret = strm->internal->next.code( - strm->internal->next.coder, strm->allocator, - strm->next_in, &in_pos, strm->avail_in, - strm->next_out, &out_pos, strm->avail_out, action); - - strm->next_in += in_pos; - strm->avail_in -= in_pos; - strm->total_in += in_pos; - - strm->next_out += out_pos; - strm->avail_out -= out_pos; - strm->total_out += out_pos; - - strm->internal->avail_in = strm->avail_in; - - // Cast is needed to silence a warning about LZMA_TIMED_OUT, which - // isn't part of lzma_ret enumeration. - switch ((unsigned int)(ret)) { - case LZMA_OK: - // Don't return LZMA_BUF_ERROR when it happens the first time. - // This is to avoid returning LZMA_BUF_ERROR when avail_out - // was zero but still there was no more data left to written - // to next_out. - if (out_pos == 0 && in_pos == 0) { - if (strm->internal->allow_buf_error) - ret = LZMA_BUF_ERROR; - else - strm->internal->allow_buf_error = true; - } else { - strm->internal->allow_buf_error = false; - } - break; - - case LZMA_TIMED_OUT: - strm->internal->allow_buf_error = false; - ret = LZMA_OK; - break; - - case LZMA_STREAM_END: - if (strm->internal->sequence == ISEQ_SYNC_FLUSH - || strm->internal->sequence == ISEQ_FULL_FLUSH - || strm->internal->sequence - == ISEQ_FULL_BARRIER) - strm->internal->sequence = ISEQ_RUN; - else - strm->internal->sequence = ISEQ_END; - - // Fall through - - case LZMA_NO_CHECK: - case LZMA_UNSUPPORTED_CHECK: - case LZMA_GET_CHECK: - case LZMA_MEMLIMIT_ERROR: - // Something else than LZMA_OK, but not a fatal error, - // that is, coding may be continued (except if ISEQ_END). - strm->internal->allow_buf_error = false; - break; - - default: - // All the other errors are fatal; coding cannot be continued. - assert(ret != LZMA_BUF_ERROR); - strm->internal->sequence = ISEQ_ERROR; - break; - } - - return ret; -} - - -extern LZMA_API(void) -lzma_end(lzma_stream *strm) -{ - if (strm != NULL && strm->internal != NULL) { - lzma_next_end(&strm->internal->next, strm->allocator); - lzma_free(strm->internal, strm->allocator); - strm->internal = NULL; - } - - return; -} - - -extern LZMA_API(void) -lzma_get_progress(lzma_stream *strm, - uint64_t *progress_in, uint64_t *progress_out) -{ - if (strm->internal->next.get_progress != NULL) { - strm->internal->next.get_progress(strm->internal->next.coder, - progress_in, progress_out); - } else { - *progress_in = strm->total_in; - *progress_out = strm->total_out; - } - - return; -} - - -extern LZMA_API(lzma_check) -lzma_get_check(const lzma_stream *strm) -{ - // Return LZMA_CHECK_NONE if we cannot know the check type. - // It's a bug in the application if this happens. - if (strm->internal->next.get_check == NULL) - return LZMA_CHECK_NONE; - - return strm->internal->next.get_check(strm->internal->next.coder); -} - - -extern LZMA_API(uint64_t) -lzma_memusage(const lzma_stream *strm) -{ - uint64_t memusage; - uint64_t old_memlimit; - - if (strm == NULL || strm->internal == NULL - || strm->internal->next.memconfig == NULL - || strm->internal->next.memconfig( - strm->internal->next.coder, - &memusage, &old_memlimit, 0) != LZMA_OK) - return 0; - - return memusage; -} - - -extern LZMA_API(uint64_t) -lzma_memlimit_get(const lzma_stream *strm) -{ - uint64_t old_memlimit; - uint64_t memusage; - - if (strm == NULL || strm->internal == NULL - || strm->internal->next.memconfig == NULL - || strm->internal->next.memconfig( - strm->internal->next.coder, - &memusage, &old_memlimit, 0) != LZMA_OK) - return 0; - - return old_memlimit; -} - - -extern LZMA_API(lzma_ret) -lzma_memlimit_set(lzma_stream *strm, uint64_t new_memlimit) -{ - // Dummy variables to simplify memconfig functions - uint64_t old_memlimit; - uint64_t memusage; - - if (strm == NULL || strm->internal == NULL - || strm->internal->next.memconfig == NULL) - return LZMA_PROG_ERROR; - - if (new_memlimit != 0 && new_memlimit < LZMA_MEMUSAGE_BASE) - return LZMA_MEMLIMIT_ERROR; - - return strm->internal->next.memconfig(strm->internal->next.coder, - &memusage, &old_memlimit, new_memlimit); -} diff --git a/game/client/third/minizip/lib/liblzma/common/common.h b/game/client/third/minizip/lib/liblzma/common/common.h deleted file mode 100755 index dde3ae0e..00000000 --- a/game/client/third/minizip/lib/liblzma/common/common.h +++ /dev/null @@ -1,313 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file common.h -/// \brief Definitions common to the whole liblzma library -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_COMMON_H -#define LZMA_COMMON_H - -#include "sysdefs.h" -#include "tuklib_integer.h" - -#if defined(_WIN32) || defined(__CYGWIN__) -# ifdef DLL_EXPORT -# define LZMA_API_EXPORT __declspec(dllexport) -# else -# define LZMA_API_EXPORT -# endif -// Don't use ifdef or defined() below. -#elif HAVE_VISIBILITY -# define LZMA_API_EXPORT __attribute__((__visibility__("default"))) -#else -# define LZMA_API_EXPORT -#endif - -#define LZMA_API(type) LZMA_API_EXPORT type LZMA_API_CALL - -#include "lzma.h" - -// These allow helping the compiler in some often-executed branches, whose -// result is almost always the same. -#ifdef __GNUC__ -# define likely(expr) __builtin_expect(expr, true) -# define unlikely(expr) __builtin_expect(expr, false) -#else -# define likely(expr) (expr) -# define unlikely(expr) (expr) -#endif - - -/// Size of temporary buffers needed in some filters -#define LZMA_BUFFER_SIZE 4096 - - -/// Maximum number of worker threads within one multithreaded component. -/// The limit exists solely to make it simpler to prevent integer overflows -/// when allocating structures etc. This should be big enough for now... -/// the code won't scale anywhere close to this number anyway. -#define LZMA_THREADS_MAX 16384 - - -/// Starting value for memory usage estimates. Instead of calculating size -/// of _every_ structure and taking into account malloc() overhead etc., we -/// add a base size to all memory usage estimates. It's not very accurate -/// but should be easily good enough. -#define LZMA_MEMUSAGE_BASE (UINT64_C(1) << 15) - -/// Start of internal Filter ID space. These IDs must never be used -/// in Streams. -#define LZMA_FILTER_RESERVED_START (LZMA_VLI_C(1) << 62) - - -/// Supported flags that can be passed to lzma_stream_decoder() -/// or lzma_auto_decoder(). -#define LZMA_SUPPORTED_FLAGS \ - ( LZMA_TELL_NO_CHECK \ - | LZMA_TELL_UNSUPPORTED_CHECK \ - | LZMA_TELL_ANY_CHECK \ - | LZMA_IGNORE_CHECK \ - | LZMA_CONCATENATED ) - - -/// Largest valid lzma_action value as unsigned integer. -#define LZMA_ACTION_MAX ((unsigned int)(LZMA_FULL_BARRIER)) - - -/// Special return value (lzma_ret) to indicate that a timeout was reached -/// and lzma_code() must not return LZMA_BUF_ERROR. This is converted to -/// LZMA_OK in lzma_code(). This is not in the lzma_ret enumeration because -/// there's no need to have it in the public API. -#define LZMA_TIMED_OUT 32 - - -typedef struct lzma_next_coder_s lzma_next_coder; - -typedef struct lzma_filter_info_s lzma_filter_info; - - -/// Type of a function used to initialize a filter encoder or decoder -typedef lzma_ret (*lzma_init_function)( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters); - -/// Type of a function to do some kind of coding work (filters, Stream, -/// Block encoders/decoders etc.). Some special coders use don't use both -/// input and output buffers, but for simplicity they still use this same -/// function prototype. -typedef lzma_ret (*lzma_code_function)( - void *coder, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action); - -/// Type of a function to free the memory allocated for the coder -typedef void (*lzma_end_function)( - void *coder, const lzma_allocator *allocator); - - -/// Raw coder validates and converts an array of lzma_filter structures to -/// an array of lzma_filter_info structures. This array is used with -/// lzma_next_filter_init to initialize the filter chain. -struct lzma_filter_info_s { - /// Filter ID. This is used only by the encoder - /// with lzma_filters_update(). - lzma_vli id; - - /// Pointer to function used to initialize the filter. - /// This is NULL to indicate end of array. - lzma_init_function init; - - /// Pointer to filter's options structure - void *options; -}; - - -/// Hold data and function pointers of the next filter in the chain. -struct lzma_next_coder_s { - /// Pointer to coder-specific data - void *coder; - - /// Filter ID. This is LZMA_VLI_UNKNOWN when this structure doesn't - /// point to a filter coder. - lzma_vli id; - - /// "Pointer" to init function. This is never called here. - /// We need only to detect if we are initializing a coder - /// that was allocated earlier. See lzma_next_coder_init and - /// lzma_next_strm_init macros in this file. - uintptr_t init; - - /// Pointer to function to do the actual coding - lzma_code_function code; - - /// Pointer to function to free lzma_next_coder.coder. This can - /// be NULL; in that case, lzma_free is called to free - /// lzma_next_coder.coder. - lzma_end_function end; - - /// Pointer to a function to get progress information. If this is NULL, - /// lzma_stream.total_in and .total_out are used instead. - void (*get_progress)(void *coder, - uint64_t *progress_in, uint64_t *progress_out); - - /// Pointer to function to return the type of the integrity check. - /// Most coders won't support this. - lzma_check (*get_check)(const void *coder); - - /// Pointer to function to get and/or change the memory usage limit. - /// If new_memlimit == 0, the limit is not changed. - lzma_ret (*memconfig)(void *coder, uint64_t *memusage, - uint64_t *old_memlimit, uint64_t new_memlimit); - - /// Update the filter-specific options or the whole filter chain - /// in the encoder. - lzma_ret (*update)(void *coder, const lzma_allocator *allocator, - const lzma_filter *filters, - const lzma_filter *reversed_filters); -}; - - -/// Macro to initialize lzma_next_coder structure -#define LZMA_NEXT_CODER_INIT \ - (lzma_next_coder){ \ - .coder = NULL, \ - .init = (uintptr_t)(NULL), \ - .id = LZMA_VLI_UNKNOWN, \ - .code = NULL, \ - .end = NULL, \ - .get_progress = NULL, \ - .get_check = NULL, \ - .memconfig = NULL, \ - .update = NULL, \ - } - - -/// Internal data for lzma_strm_init, lzma_code, and lzma_end. A pointer to -/// this is stored in lzma_stream. -struct lzma_internal_s { - /// The actual coder that should do something useful - lzma_next_coder next; - - /// Track the state of the coder. This is used to validate arguments - /// so that the actual coders can rely on e.g. that LZMA_SYNC_FLUSH - /// is used on every call to lzma_code until next.code has returned - /// LZMA_STREAM_END. - enum { - ISEQ_RUN, - ISEQ_SYNC_FLUSH, - ISEQ_FULL_FLUSH, - ISEQ_FINISH, - ISEQ_FULL_BARRIER, - ISEQ_END, - ISEQ_ERROR, - } sequence; - - /// A copy of lzma_stream avail_in. This is used to verify that the - /// amount of input doesn't change once e.g. LZMA_FINISH has been - /// used. - size_t avail_in; - - /// Indicates which lzma_action values are allowed by next.code. - bool supported_actions[LZMA_ACTION_MAX + 1]; - - /// If true, lzma_code will return LZMA_BUF_ERROR if no progress was - /// made (no input consumed and no output produced by next.code). - bool allow_buf_error; -}; - - -/// Allocates memory -extern void *lzma_alloc(size_t size, const lzma_allocator *allocator) - lzma_attribute((__malloc__)) lzma_attr_alloc_size(1); - -/// Allocates memory and zeroes it (like calloc()). This can be faster -/// than lzma_alloc() + memzero() while being backward compatible with -/// custom allocators. -extern void * lzma_attribute((__malloc__)) lzma_attr_alloc_size(1) - lzma_alloc_zero(size_t size, const lzma_allocator *allocator); - -/// Frees memory -extern void lzma_free(void *ptr, const lzma_allocator *allocator); - - -/// Allocates strm->internal if it is NULL, and initializes *strm and -/// strm->internal. This function is only called via lzma_next_strm_init macro. -extern lzma_ret lzma_strm_init(lzma_stream *strm); - -/// Initializes the next filter in the chain, if any. This takes care of -/// freeing the memory of previously initialized filter if it is different -/// than the filter being initialized now. This way the actual filter -/// initialization functions don't need to use lzma_next_coder_init macro. -extern lzma_ret lzma_next_filter_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -/// Update the next filter in the chain, if any. This checks that -/// the application is not trying to change the Filter IDs. -extern lzma_ret lzma_next_filter_update( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *reversed_filters); - -/// Frees the memory allocated for next->coder either using next->end or, -/// if next->end is NULL, using lzma_free. -extern void lzma_next_end(lzma_next_coder *next, - const lzma_allocator *allocator); - - -/// Copy as much data as possible from in[] to out[] and update *in_pos -/// and *out_pos accordingly. Returns the number of bytes copied. -extern size_t lzma_bufcpy(const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size); - - -/// \brief Return if expression doesn't evaluate to LZMA_OK -/// -/// There are several situations where we want to return immediately -/// with the value of expr if it isn't LZMA_OK. This macro shortens -/// the code a little. -#define return_if_error(expr) \ -do { \ - const lzma_ret ret_ = (expr); \ - if (ret_ != LZMA_OK) \ - return ret_; \ -} while (0) - - -/// If next isn't already initialized, free the previous coder. Then mark -/// that next is _possibly_ initialized for the coder using this macro. -/// "Possibly" means that if e.g. allocation of next->coder fails, the -/// structure isn't actually initialized for this coder, but leaving -/// next->init to func is still OK. -#define lzma_next_coder_init(func, next, allocator) \ -do { \ - if ((uintptr_t)(func) != (next)->init) \ - lzma_next_end(next, allocator); \ - (next)->init = (uintptr_t)(func); \ -} while (0) - - -/// Initializes lzma_strm and calls func() to initialize strm->internal->next. -/// (The function being called will use lzma_next_coder_init()). If -/// initialization fails, memory that wasn't freed by func() is freed -/// along strm->internal. -#define lzma_next_strm_init(func, strm, ...) \ -do { \ - return_if_error(lzma_strm_init(strm)); \ - const lzma_ret ret_ = func(&(strm)->internal->next, \ - (strm)->allocator, __VA_ARGS__); \ - if (ret_ != LZMA_OK) { \ - lzma_end(strm); \ - return ret_; \ - } \ -} while (0) - -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/filter_encoder.c b/game/client/third/minizip/lib/liblzma/common/filter_encoder.c deleted file mode 100755 index 438e17e9..00000000 --- a/game/client/third/minizip/lib/liblzma/common/filter_encoder.c +++ /dev/null @@ -1,238 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_decoder.c -/// \brief Filter ID mapping to filter-specific functions -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "filter_encoder.h" -#include "lzma_encoder.h" -#ifdef HAVE_DECODER_LZMA2 -#include "lzma2_encoder.h" -#endif -#if defined(HAVE_DECODER_X86) || \ - defined(HAVE_DECODER_POWERPC) || \ - defined(HAVE_DECODER_IA64) || \ - defined(HAVE_DECODER_ARM) || \ - defined(HAVE_DECODER_ARMTHUMB) || \ - defined(HAVE_DECODER_SPARC) -#include "simple_encoder.h" -#endif -#ifdef HAVE_DECODER_DELTA -#include "delta_encoder.h" -#endif - - -typedef struct { - /// Filter ID - lzma_vli id; - - /// Initializes the filter encoder and calls lzma_next_filter_init() - /// for filters + 1. - lzma_init_function init; - - /// Calculates memory usage of the encoder. If the options are - /// invalid, UINT64_MAX is returned. - uint64_t (*memusage)(const void *options); - - /// Calculates the recommended Uncompressed Size for .xz Blocks to - /// which the input data can be split to make multithreaded - /// encoding possible. If this is NULL, it is assumed that - /// the encoder is fast enough with single thread. - uint64_t (*block_size)(const void *options); - - /// Tells the size of the Filter Properties field. If options are - /// invalid, UINT32_MAX is returned. If this is NULL, props_size_fixed - /// is used. - lzma_ret (*props_size_get)(uint32_t *size, const void *options); - uint32_t props_size_fixed; - - /// Encodes Filter Properties. - /// - /// \return - LZMA_OK: Properties encoded successfully. - /// - LZMA_OPTIONS_ERROR: Unsupported options - /// - LZMA_PROG_ERROR: Invalid options or not enough - /// output space - lzma_ret (*props_encode)(const void *options, uint8_t *out); - -} lzma_filter_encoder; - - -static const lzma_filter_encoder encoders[] = { -#ifdef HAVE_ENCODER_LZMA1 - { - .id = LZMA_FILTER_LZMA1, - .init = &lzma_lzma_encoder_init, - .memusage = &lzma_lzma_encoder_memusage, - .block_size = NULL, // FIXME - .props_size_get = NULL, - .props_size_fixed = 5, - .props_encode = &lzma_lzma_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_LZMA2 - { - .id = LZMA_FILTER_LZMA2, - .init = &lzma_lzma2_encoder_init, - .memusage = &lzma_lzma2_encoder_memusage, - .block_size = &lzma_lzma2_block_size, // FIXME - .props_size_get = NULL, - .props_size_fixed = 1, - .props_encode = &lzma_lzma2_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_X86 - { - .id = LZMA_FILTER_X86, - .init = &lzma_simple_x86_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_POWERPC - { - .id = LZMA_FILTER_POWERPC, - .init = &lzma_simple_powerpc_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_IA64 - { - .id = LZMA_FILTER_IA64, - .init = &lzma_simple_ia64_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_ARM - { - .id = LZMA_FILTER_ARM, - .init = &lzma_simple_arm_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_ARMTHUMB - { - .id = LZMA_FILTER_ARMTHUMB, - .init = &lzma_simple_armthumb_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_SPARC - { - .id = LZMA_FILTER_SPARC, - .init = &lzma_simple_sparc_encoder_init, - .memusage = NULL, - .block_size = NULL, - .props_size_get = &lzma_simple_props_size, - .props_encode = &lzma_simple_props_encode, - }, -#endif -#ifdef HAVE_ENCODER_DELTA - { - .id = LZMA_FILTER_DELTA, - .init = &lzma_delta_encoder_init, - .memusage = &lzma_delta_coder_memusage, - .block_size = NULL, - .props_size_get = NULL, - .props_size_fixed = 1, - .props_encode = &lzma_delta_props_encode, - }, -#endif -}; - - -static const lzma_filter_encoder * -encoder_find(lzma_vli id) -{ - for (size_t i = 0; i < ARRAY_SIZE(encoders); ++i) - if (encoders[i].id == id) - return encoders + i; - - return NULL; -} - - -extern LZMA_API(lzma_bool) -lzma_filter_encoder_is_supported(lzma_vli id) -{ - return encoder_find(id) != NULL; -} - - -extern uint64_t -lzma_mt_block_size(const lzma_filter *filters) -{ - uint64_t max = 0; - - for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i) { - const lzma_filter_encoder *const fe - = encoder_find(filters[i].id); - if (fe->block_size != NULL) { - const uint64_t size - = fe->block_size(filters[i].options); - if (size == 0) - return 0; - - if (size > max) - max = size; - } - } - - return max; -} - - -extern LZMA_API(lzma_ret) -lzma_properties_size(uint32_t *size, const lzma_filter *filter) -{ - const lzma_filter_encoder *const fe = encoder_find(filter->id); - if (fe == NULL) { - // Unknown filter - if the Filter ID is a proper VLI, - // return LZMA_OPTIONS_ERROR instead of LZMA_PROG_ERROR, - // because it's possible that we just don't have support - // compiled in for the requested filter. - return filter->id <= LZMA_VLI_MAX - ? LZMA_OPTIONS_ERROR : LZMA_PROG_ERROR; - } - - if (fe->props_size_get == NULL) { - // No props_size_get() function, use props_size_fixed. - *size = fe->props_size_fixed; - return LZMA_OK; - } - - return fe->props_size_get(size, filter->options); -} - - -extern LZMA_API(lzma_ret) -lzma_properties_encode(const lzma_filter *filter, uint8_t *props) -{ - const lzma_filter_encoder *const fe = encoder_find(filter->id); - if (fe == NULL) - return LZMA_PROG_ERROR; - - if (fe->props_encode == NULL) - return LZMA_OK; - - return fe->props_encode(filter->options, props); -} diff --git a/game/client/third/minizip/lib/liblzma/common/filter_encoder.h b/game/client/third/minizip/lib/liblzma/common/filter_encoder.h deleted file mode 100755 index f1d5683f..00000000 --- a/game/client/third/minizip/lib/liblzma/common/filter_encoder.h +++ /dev/null @@ -1,27 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file filter_encoder.c -/// \brief Filter ID mapping to filter-specific functions -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_FILTER_ENCODER_H -#define LZMA_FILTER_ENCODER_H - -#include "common.h" - - -// FIXME: Might become a part of the public API. -extern uint64_t lzma_mt_block_size(const lzma_filter *filters); - - -extern lzma_ret lzma_raw_encoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter *filters); - -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/index.h b/game/client/third/minizip/lib/liblzma/common/index.h deleted file mode 100755 index 64e97247..00000000 --- a/game/client/third/minizip/lib/liblzma/common/index.h +++ /dev/null @@ -1,73 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file index.h -/// \brief Handling of Index -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_INDEX_H -#define LZMA_INDEX_H - -#include "common.h" - - -/// Minimum Unpadded Size -#define UNPADDED_SIZE_MIN LZMA_VLI_C(5) - -/// Maximum Unpadded Size -#define UNPADDED_SIZE_MAX (LZMA_VLI_MAX & ~LZMA_VLI_C(3)) - - -/// Get the size of the Index Padding field. This is needed by Index encoder -/// and decoder, but applications should have no use for this. -extern uint32_t lzma_index_padding_size(const lzma_index *i); - - -/// Set for how many Records to allocate memory the next time -/// lzma_index_append() needs to allocate space for a new Record. -/// This is used only by the Index decoder. -extern void lzma_index_prealloc(lzma_index *i, lzma_vli records); - - -/// Round the variable-length integer to the next multiple of four. -static inline lzma_vli -vli_ceil4(lzma_vli vli) -{ - assert(vli <= LZMA_VLI_MAX); - return (vli + 3) & ~LZMA_VLI_C(3); -} - - -/// Calculate the size of the Index field excluding Index Padding -static inline lzma_vli -index_size_unpadded(lzma_vli count, lzma_vli index_list_size) -{ - // Index Indicator + Number of Records + List of Records + CRC32 - return 1 + lzma_vli_size(count) + index_list_size + 4; -} - - -/// Calculate the size of the Index field including Index Padding -static inline lzma_vli -index_size(lzma_vli count, lzma_vli index_list_size) -{ - return vli_ceil4(index_size_unpadded(count, index_list_size)); -} - - -/// Calculate the total size of the Stream -static inline lzma_vli -index_stream_size(lzma_vli blocks_size, - lzma_vli count, lzma_vli index_list_size) -{ - return LZMA_STREAM_HEADER_SIZE + blocks_size - + index_size(count, index_list_size) - + LZMA_STREAM_HEADER_SIZE; -} - -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/memcmplen.h b/game/client/third/minizip/lib/liblzma/common/memcmplen.h deleted file mode 100755 index c1efc9e2..00000000 --- a/game/client/third/minizip/lib/liblzma/common/memcmplen.h +++ /dev/null @@ -1,175 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file memcmplen.h -/// \brief Optimized comparison of two buffers -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_MEMCMPLEN_H -#define LZMA_MEMCMPLEN_H - -#include "common.h" - -#ifdef HAVE_IMMINTRIN_H -# include -#endif - - -/// Find out how many equal bytes the two buffers have. -/// -/// \param buf1 First buffer -/// \param buf2 Second buffer -/// \param len How many bytes have already been compared and will -/// be assumed to match -/// \param limit How many bytes to compare at most, including the -/// already-compared bytes. This must be significantly -/// smaller than UINT32_MAX to avoid integer overflows. -/// Up to LZMA_MEMCMPLEN_EXTRA bytes may be read past -/// the specified limit from both buf1 and buf2. -/// -/// \return Number of equal bytes in the buffers is returned. -/// This is always at least len and at most limit. -/// -/// \note LZMA_MEMCMPLEN_EXTRA defines how many extra bytes may be read. -/// It's rounded up to 2^n. This extra amount needs to be -/// allocated in the buffers being used. It needs to be -/// initialized too to keep Valgrind quiet. -static inline uint32_t lzma_attribute((__always_inline__)) -lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2, - uint32_t len, uint32_t limit) -{ - assert(len <= limit); - assert(limit <= UINT32_MAX / 2); - -#if defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ - && ((TUKLIB_GNUC_REQ(3, 4) && defined(__x86_64__)) \ - || (defined(__INTEL_COMPILER) && defined(__x86_64__)) \ - || (defined(__INTEL_COMPILER) && defined(_M_X64)) \ - || (defined(_MSC_VER) && defined(_M_X64))) - // NOTE: This will use 64-bit unaligned access which - // TUKLIB_FAST_UNALIGNED_ACCESS wasn't meant to permit, but - // it's convenient here at least as long as it's x86-64 only. - // - // I keep this x86-64 only for now since that's where I know this - // to be a good method. This may be fine on other 64-bit CPUs too. - // On big endian one should use xor instead of subtraction and switch - // to __builtin_clzll(). -#define LZMA_MEMCMPLEN_EXTRA 8 - while (len < limit) { - const uint64_t x = *(const uint64_t *)(buf1 + len) - - *(const uint64_t *)(buf2 + len); - if (x != 0) { -# if defined(_M_X64) // MSVC or Intel C compiler on Windows - unsigned long tmp; - _BitScanForward64(&tmp, x); - len += (uint32_t)tmp >> 3; -# else // GCC, clang, or Intel C compiler - len += (uint32_t)__builtin_ctzll(x) >> 3; -# endif - return my_min(len, limit); - } - - len += 8; - } - - return limit; - -#elif defined(TUKLIB_FAST_UNALIGNED_ACCESS) \ - && defined(HAVE__MM_MOVEMASK_EPI8) \ - && ((defined(__GNUC__) && defined(__SSE2_MATH__)) \ - || (defined(__INTEL_COMPILER) && defined(__SSE2__)) \ - || (defined(_MSC_VER) && defined(_M_IX86_FP) \ - && _M_IX86_FP >= 2)) - // NOTE: Like above, this will use 128-bit unaligned access which - // TUKLIB_FAST_UNALIGNED_ACCESS wasn't meant to permit. - // - // SSE2 version for 32-bit and 64-bit x86. On x86-64 the above - // version is sometimes significantly faster and sometimes - // slightly slower than this SSE2 version, so this SSE2 - // version isn't used on x86-64. -# define LZMA_MEMCMPLEN_EXTRA 16 - while (len < limit) { - const uint32_t x = 0xFFFF ^ _mm_movemask_epi8(_mm_cmpeq_epi8( - _mm_loadu_si128((const __m128i *)(buf1 + len)), - _mm_loadu_si128((const __m128i *)(buf2 + len)))); - - if (x != 0) { -# if defined(__INTEL_COMPILER) - len += _bit_scan_forward(x); -# elif defined(_MSC_VER) - unsigned long tmp; - _BitScanForward(&tmp, x); - len += tmp; -# else - len += __builtin_ctz(x); -# endif - return my_min(len, limit); - } - - len += 16; - } - - return limit; - -#elif defined(TUKLIB_FAST_UNALIGNED_ACCESS) && !defined(WORDS_BIGENDIAN) - // Generic 32-bit little endian method -# define LZMA_MEMCMPLEN_EXTRA 4 - while (len < limit) { - uint32_t x = *(const uint32_t *)(buf1 + len) - - *(const uint32_t *)(buf2 + len); - if (x != 0) { - if ((x & 0xFFFF) == 0) { - len += 2; - x >>= 16; - } - - if ((x & 0xFF) == 0) - ++len; - - return my_min(len, limit); - } - - len += 4; - } - - return limit; - -#elif defined(TUKLIB_FAST_UNALIGNED_ACCESS) && defined(WORDS_BIGENDIAN) - // Generic 32-bit big endian method -# define LZMA_MEMCMPLEN_EXTRA 4 - while (len < limit) { - uint32_t x = *(const uint32_t *)(buf1 + len) - ^ *(const uint32_t *)(buf2 + len); - if (x != 0) { - if ((x & 0xFFFF0000) == 0) { - len += 2; - x <<= 16; - } - - if ((x & 0xFF000000) == 0) - ++len; - - return my_min(len, limit); - } - - len += 4; - } - - return limit; - -#else - // Simple portable version that doesn't use unaligned access. -# define LZMA_MEMCMPLEN_EXTRA 0 - while (len < limit && buf1[len] == buf2[len]) - ++len; - - return len; -#endif -} - -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/sysdefs.h b/game/client/third/minizip/lib/liblzma/common/sysdefs.h deleted file mode 100755 index 4fe47ee2..00000000 --- a/game/client/third/minizip/lib/liblzma/common/sysdefs.h +++ /dev/null @@ -1,204 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file sysdefs.h -/// \brief Common includes, definitions, system-specific things etc. -/// -/// This file is used also by the lzma command line tool, that's why this -/// file is separate from common.h. -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_SYSDEFS_H -#define LZMA_SYSDEFS_H - -////////////// -// Includes // -////////////// - -#ifdef HAVE_CONFIG_H -# include -#endif - -// Get standard-compliant stdio functions under MinGW and MinGW-w64. -#ifdef __MINGW32__ -# define __USE_MINGW_ANSI_STDIO 1 -#endif - -// size_t and NULL -#include - -#ifdef HAVE_INTTYPES_H -# include -#endif - -// C99 says that inttypes.h always includes stdint.h, but some systems -// don't do that, and require including stdint.h separately. -#ifdef HAVE_STDINT_H -# include -#endif - -// Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The -// limits are also used to figure out some macros missing from pre-C99 systems. -#ifdef HAVE_LIMITS_H -# include -#endif - -// Be more compatible with systems that have non-conforming inttypes.h. -// We assume that int is 32-bit and that long is either 32-bit or 64-bit. -// Full Autoconf test could be more correct, but this should work well enough. -// Note that this duplicates some code from lzma.h, but this is better since -// we can work without inttypes.h thanks to Autoconf tests. -#ifndef UINT32_C -# if UINT_MAX != 4294967295U -# error UINT32_C is not defined and unsigned int is not 32-bit. -# endif -# define UINT32_C(n) n ## U -#endif -#ifndef UINT32_MAX -# define UINT32_MAX UINT32_C(4294967295) -#endif -#ifndef PRIu32 -# define PRIu32 "u" -#endif -#ifndef PRIx32 -# define PRIx32 "x" -#endif -#ifndef PRIX32 -# define PRIX32 "X" -#endif - -#if ULONG_MAX == 4294967295UL -# ifndef UINT64_C -# define UINT64_C(n) n ## ULL -# endif -# ifndef PRIu64 -# define PRIu64 "llu" -# endif -# ifndef PRIx64 -# define PRIx64 "llx" -# endif -# ifndef PRIX64 -# define PRIX64 "llX" -# endif -#else -# ifndef UINT64_C -# define UINT64_C(n) n ## UL -# endif -# ifndef PRIu64 -# define PRIu64 "lu" -# endif -# ifndef PRIx64 -# define PRIx64 "lx" -# endif -# ifndef PRIX64 -# define PRIX64 "lX" -# endif -#endif -#ifndef UINT64_MAX -# define UINT64_MAX UINT64_C(18446744073709551615) -#endif - -// Incorrect(?) SIZE_MAX: -// - Interix headers typedef size_t to unsigned long, -// but a few lines later define SIZE_MAX to INT32_MAX. -// - SCO OpenServer (x86) headers typedef size_t to unsigned int -// but define SIZE_MAX to INT32_MAX. -#if defined(__INTERIX) || defined(_SCO_DS) -# undef SIZE_MAX -#endif - -// The code currently assumes that size_t is either 32-bit or 64-bit. -#ifndef SIZE_MAX -# if SIZEOF_SIZE_T == 4 -# define SIZE_MAX UINT32_MAX -# elif SIZEOF_SIZE_T == 8 -# define SIZE_MAX UINT64_MAX -# else -# error size_t is not 32-bit or 64-bit -# endif -#endif -#if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX -# error size_t is not 32-bit or 64-bit -#endif - -#include -#include - -// Pre-C99 systems lack stdbool.h. All the code in LZMA Utils must be written -// so that it works with fake bool type, for example: -// -// bool foo = (flags & 0x100) != 0; -// bool bar = !!(flags & 0x100); -// -// This works with the real C99 bool but breaks with fake bool: -// -// bool baz = (flags & 0x100); -// -#ifdef HAVE_STDBOOL_H -# include -#else -# if ! HAVE__BOOL -typedef unsigned char _Bool; -# endif -# define bool _Bool -# define false 0 -# define true 1 -# define __bool_true_false_are_defined 1 -#endif - -// string.h should be enough but let's include strings.h and memory.h too if -// they exists, since that shouldn't do any harm, but may improve portability. -#ifdef HAVE_STRING_H -# include -#endif - -#ifdef HAVE_STRINGS_H -# include -#endif - -#ifdef HAVE_MEMORY_H -# include -#endif - -// As of MSVC 2013, inline and restrict are supported with -// non-standard keywords. -#if defined(_WIN32) && defined(_MSC_VER) -# ifndef inline -# define inline __inline -# endif -# ifndef restrict -# define restrict __restrict -# endif -#elif __STDC_VERSION__ < 199901L -# define restrict // nothing -#endif - -//////////// -// Macros // -//////////// - -#undef memzero -#define memzero(s, n) memset(s, 0, n) - -// NOTE: Avoid using MIN() and MAX(), because even conditionally defining -// those macros can cause some portability trouble, since on some systems -// the system headers insist defining their own versions. -#define my_min(x, y) ((x) < (y) ? (x) : (y)) -#define my_max(x, y) ((x) > (y) ? (x) : (y)) - -#ifndef ARRAY_SIZE -# define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) -#endif - -#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 -# define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x))) -#else -# define lzma_attr_alloc_size(x) -#endif - -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/tuklib_common.h b/game/client/third/minizip/lib/liblzma/common/tuklib_common.h deleted file mode 100755 index 31fbab58..00000000 --- a/game/client/third/minizip/lib/liblzma/common/tuklib_common.h +++ /dev/null @@ -1,71 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_common.h -/// \brief Common definitions for tuklib modules -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_COMMON_H -#define TUKLIB_COMMON_H - -// The config file may be replaced by a package-specific file. -// It should include at least stddef.h, inttypes.h, and limits.h. -#include "tuklib_config.h" - -// TUKLIB_SYMBOL_PREFIX is prefixed to all symbols exported by -// the tuklib modules. If you use a tuklib module in a library, -// you should use TUKLIB_SYMBOL_PREFIX to make sure that there -// are no symbol conflicts in case someone links your library -// into application that also uses the same tuklib module. -#ifndef TUKLIB_SYMBOL_PREFIX -# define TUKLIB_SYMBOL_PREFIX -#endif - -#define TUKLIB_CAT_X(a, b) a ## b -#define TUKLIB_CAT(a, b) TUKLIB_CAT_X(a, b) - -#ifndef TUKLIB_SYMBOL -# define TUKLIB_SYMBOL(sym) TUKLIB_CAT(TUKLIB_SYMBOL_PREFIX, sym) -#endif - -#ifndef TUKLIB_DECLS_BEGIN -# ifdef __cplusplus -# define TUKLIB_DECLS_BEGIN extern "C" { -# else -# define TUKLIB_DECLS_BEGIN -# endif -#endif - -#ifndef TUKLIB_DECLS_END -# ifdef __cplusplus -# define TUKLIB_DECLS_END } -# else -# define TUKLIB_DECLS_END -# endif -#endif - -#if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define TUKLIB_GNUC_REQ(major, minor) \ - ((__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)) \ - || __GNUC__ > (major)) -#else -# define TUKLIB_GNUC_REQ(major, minor) 0 -#endif - -#if TUKLIB_GNUC_REQ(2, 5) -# define tuklib_attr_noreturn __attribute__((__noreturn__)) -#else -# define tuklib_attr_noreturn -#endif - -#if (defined(_WIN32) && !defined(__CYGWIN__)) \ - || defined(__OS2__) || defined(__MSDOS__) -# define TUKLIB_DOSLIKE 1 -#endif - -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/tuklib_config.h b/game/client/third/minizip/lib/liblzma/common/tuklib_config.h deleted file mode 100755 index 549cb24d..00000000 --- a/game/client/third/minizip/lib/liblzma/common/tuklib_config.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include "sysdefs.h" -#else -# include -# include -# include -#endif diff --git a/game/client/third/minizip/lib/liblzma/common/tuklib_integer.h b/game/client/third/minizip/lib/liblzma/common/tuklib_integer.h deleted file mode 100755 index 738690d6..00000000 --- a/game/client/third/minizip/lib/liblzma/common/tuklib_integer.h +++ /dev/null @@ -1,523 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file tuklib_integer.h -/// \brief Various integer and bit operations -/// -/// This file provides macros or functions to do some basic integer and bit -/// operations. -/// -/// Endianness related integer operations (XX = 16, 32, or 64; Y = b or l): -/// - Byte swapping: bswapXX(num) -/// - Byte order conversions to/from native: convXXYe(num) -/// - Aligned reads: readXXYe(ptr) -/// - Aligned writes: writeXXYe(ptr, num) -/// - Unaligned reads (16/32-bit only): unaligned_readXXYe(ptr) -/// - Unaligned writes (16/32-bit only): unaligned_writeXXYe(ptr, num) -/// -/// Since they can macros, the arguments should have no side effects since -/// they may be evaluated more than once. -/// -/// \todo PowerPC and possibly some other architectures support -/// byte swapping load and store instructions. This file -/// doesn't take advantage of those instructions. -/// -/// Bit scan operations for non-zero 32-bit integers: -/// - Bit scan reverse (find highest non-zero bit): bsr32(num) -/// - Count leading zeros: clz32(num) -/// - Count trailing zeros: ctz32(num) -/// - Bit scan forward (simply an alias for ctz32()): bsf32(num) -/// -/// The above bit scan operations return 0-31. If num is zero, -/// the result is undefined. -// -// Authors: Lasse Collin -// Joachim Henke -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef TUKLIB_INTEGER_H -#define TUKLIB_INTEGER_H - -#include "tuklib_common.h" - - -//////////////////////////////////////// -// Operating system specific features // -//////////////////////////////////////// - -#if defined(HAVE_BYTESWAP_H) - // glibc, uClibc, dietlibc -# include -# ifdef HAVE_BSWAP_16 -# define bswap16(num) bswap_16(num) -# endif -# ifdef HAVE_BSWAP_32 -# define bswap32(num) bswap_32(num) -# endif -# ifdef HAVE_BSWAP_64 -# define bswap64(num) bswap_64(num) -# endif - -#elif defined(HAVE_SYS_ENDIAN_H) - // *BSDs and Darwin -# include - -#elif defined(HAVE_SYS_BYTEORDER_H) - // Solaris -# include -# ifdef BSWAP_16 -# define bswap16(num) BSWAP_16(num) -# endif -# ifdef BSWAP_32 -# define bswap32(num) BSWAP_32(num) -# endif -# ifdef BSWAP_64 -# define bswap64(num) BSWAP_64(num) -# endif -# ifdef BE_16 -# define conv16be(num) BE_16(num) -# endif -# ifdef BE_32 -# define conv32be(num) BE_32(num) -# endif -# ifdef BE_64 -# define conv64be(num) BE_64(num) -# endif -# ifdef LE_16 -# define conv16le(num) LE_16(num) -# endif -# ifdef LE_32 -# define conv32le(num) LE_32(num) -# endif -# ifdef LE_64 -# define conv64le(num) LE_64(num) -# endif -#endif - - -/////////////////// -// Byte swapping // -/////////////////// - -#ifndef bswap16 -# define bswap16(num) \ - (((uint16_t)(num) << 8) | ((uint16_t)(num) >> 8)) -#endif - -#ifndef bswap32 -# define bswap32(num) \ - ( (((uint32_t)(num) << 24) ) \ - | (((uint32_t)(num) << 8) & UINT32_C(0x00FF0000)) \ - | (((uint32_t)(num) >> 8) & UINT32_C(0x0000FF00)) \ - | (((uint32_t)(num) >> 24) ) ) -#endif - -#ifndef bswap64 -# define bswap64(num) \ - ( (((uint64_t)(num) << 56) ) \ - | (((uint64_t)(num) << 40) & UINT64_C(0x00FF000000000000)) \ - | (((uint64_t)(num) << 24) & UINT64_C(0x0000FF0000000000)) \ - | (((uint64_t)(num) << 8) & UINT64_C(0x000000FF00000000)) \ - | (((uint64_t)(num) >> 8) & UINT64_C(0x00000000FF000000)) \ - | (((uint64_t)(num) >> 24) & UINT64_C(0x0000000000FF0000)) \ - | (((uint64_t)(num) >> 40) & UINT64_C(0x000000000000FF00)) \ - | (((uint64_t)(num) >> 56) ) ) -#endif - -// Define conversion macros using the basic byte swapping macros. -#ifdef WORDS_BIGENDIAN -# ifndef conv16be -# define conv16be(num) ((uint16_t)(num)) -# endif -# ifndef conv32be -# define conv32be(num) ((uint32_t)(num)) -# endif -# ifndef conv64be -# define conv64be(num) ((uint64_t)(num)) -# endif -# ifndef conv16le -# define conv16le(num) bswap16(num) -# endif -# ifndef conv32le -# define conv32le(num) bswap32(num) -# endif -# ifndef conv64le -# define conv64le(num) bswap64(num) -# endif -#else -# ifndef conv16be -# define conv16be(num) bswap16(num) -# endif -# ifndef conv32be -# define conv32be(num) bswap32(num) -# endif -# ifndef conv64be -# define conv64be(num) bswap64(num) -# endif -# ifndef conv16le -# define conv16le(num) ((uint16_t)(num)) -# endif -# ifndef conv32le -# define conv32le(num) ((uint32_t)(num)) -# endif -# ifndef conv64le -# define conv64le(num) ((uint64_t)(num)) -# endif -#endif - - -////////////////////////////// -// Aligned reads and writes // -////////////////////////////// - -static inline uint16_t -read16be(const uint8_t *buf) -{ - uint16_t num = *(const uint16_t *)buf; - return conv16be(num); -} - - -static inline uint16_t -read16le(const uint8_t *buf) -{ - uint16_t num = *(const uint16_t *)buf; - return conv16le(num); -} - - -static inline uint32_t -read32be(const uint8_t *buf) -{ - uint32_t num = *(const uint32_t *)buf; - return conv32be(num); -} - - -static inline uint32_t -read32le(const uint8_t *buf) -{ - uint32_t num = *(const uint32_t *)buf; - return conv32le(num); -} - - -static inline uint64_t -read64be(const uint8_t *buf) -{ - uint64_t num = *(const uint64_t *)buf; - return conv64be(num); -} - - -static inline uint64_t -read64le(const uint8_t *buf) -{ - uint64_t num = *(const uint64_t *)buf; - return conv64le(num); -} - - -// NOTE: Possible byte swapping must be done in a macro to allow GCC -// to optimize byte swapping of constants when using glibc's or *BSD's -// byte swapping macros. The actual write is done in an inline function -// to make type checking of the buf pointer possible similarly to readXXYe() -// functions. - -#define write16be(buf, num) write16ne((buf), conv16be(num)) -#define write16le(buf, num) write16ne((buf), conv16le(num)) -#define write32be(buf, num) write32ne((buf), conv32be(num)) -#define write32le(buf, num) write32ne((buf), conv32le(num)) -#define write64be(buf, num) write64ne((buf), conv64be(num)) -#define write64le(buf, num) write64ne((buf), conv64le(num)) - - -static inline void -write16ne(uint8_t *buf, uint16_t num) -{ - *(uint16_t *)buf = num; - return; -} - - -static inline void -write32ne(uint8_t *buf, uint32_t num) -{ - *(uint32_t *)buf = num; - return; -} - - -static inline void -write64ne(uint8_t *buf, uint64_t num) -{ - *(uint64_t *)buf = num; - return; -} - - -//////////////////////////////// -// Unaligned reads and writes // -//////////////////////////////// - -// NOTE: TUKLIB_FAST_UNALIGNED_ACCESS indicates only support for 16-bit and -// 32-bit unaligned integer loads and stores. It's possible that 64-bit -// unaligned access doesn't work or is slower than byte-by-byte access. -// Since unaligned 64-bit is probably not needed as often as 16-bit or -// 32-bit, we simply don't support 64-bit unaligned access for now. -#ifdef TUKLIB_FAST_UNALIGNED_ACCESS -# define unaligned_read16be read16be -# define unaligned_read16le read16le -# define unaligned_read32be read32be -# define unaligned_read32le read32le -# define unaligned_write16be write16be -# define unaligned_write16le write16le -# define unaligned_write32be write32be -# define unaligned_write32le write32le - -#else - -static inline uint16_t -unaligned_read16be(const uint8_t *buf) -{ - uint16_t num = ((uint16_t)buf[0] << 8) | (uint16_t)buf[1]; - return num; -} - - -static inline uint16_t -unaligned_read16le(const uint8_t *buf) -{ - uint16_t num = ((uint16_t)buf[0]) | ((uint16_t)buf[1] << 8); - return num; -} - - -static inline uint32_t -unaligned_read32be(const uint8_t *buf) -{ - uint32_t num = (uint32_t)buf[0] << 24; - num |= (uint32_t)buf[1] << 16; - num |= (uint32_t)buf[2] << 8; - num |= (uint32_t)buf[3]; - return num; -} - - -static inline uint32_t -unaligned_read32le(const uint8_t *buf) -{ - uint32_t num = (uint32_t)buf[0]; - num |= (uint32_t)buf[1] << 8; - num |= (uint32_t)buf[2] << 16; - num |= (uint32_t)buf[3] << 24; - return num; -} - - -static inline void -unaligned_write16be(uint8_t *buf, uint16_t num) -{ - buf[0] = (uint8_t)(num >> 8); - buf[1] = (uint8_t)num; - return; -} - - -static inline void -unaligned_write16le(uint8_t *buf, uint16_t num) -{ - buf[0] = (uint8_t)num; - buf[1] = (uint8_t)(num >> 8); - return; -} - - -static inline void -unaligned_write32be(uint8_t *buf, uint32_t num) -{ - buf[0] = (uint8_t)(num >> 24); - buf[1] = (uint8_t)(num >> 16); - buf[2] = (uint8_t)(num >> 8); - buf[3] = (uint8_t)num; - return; -} - - -static inline void -unaligned_write32le(uint8_t *buf, uint32_t num) -{ - buf[0] = (uint8_t)num; - buf[1] = (uint8_t)(num >> 8); - buf[2] = (uint8_t)(num >> 16); - buf[3] = (uint8_t)(num >> 24); - return; -} - -#endif - - -static inline uint32_t -bsr32(uint32_t n) -{ - // Check for ICC first, since it tends to define __GNUC__ too. -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(n); - -#elif TUKLIB_GNUC_REQ(3, 4) && UINT_MAX == UINT32_MAX - // GCC >= 3.4 has __builtin_clz(), which gives good results on - // multiple architectures. On x86, __builtin_clz() ^ 31U becomes - // either plain BSR (so the XOR gets optimized away) or LZCNT and - // XOR (if -march indicates that SSE4a instructions are supported). - return __builtin_clz(n) ^ 31U; - -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - uint32_t i; - __asm__("bsrl %1, %0" : "=r" (i) : "rm" (n)); - return i; - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - // MSVC isn't supported by tuklib, but since this code exists, - // it doesn't hurt to have it here anyway. - uint32_t i; - _BitScanReverse(&i, n); - return i; - -#else - uint32_t i = 31; - - if ((n & UINT32_C(0xFFFF0000)) == 0) { - n <<= 16; - i = 15; - } - - if ((n & UINT32_C(0xFF000000)) == 0) { - n <<= 8; - i -= 8; - } - - if ((n & UINT32_C(0xF0000000)) == 0) { - n <<= 4; - i -= 4; - } - - if ((n & UINT32_C(0xC0000000)) == 0) { - n <<= 2; - i -= 2; - } - - if ((n & UINT32_C(0x80000000)) == 0) - --i; - - return i; -#endif -} - - -static inline uint32_t -clz32(uint32_t n) -{ -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(n) ^ 31U; - -#elif TUKLIB_GNUC_REQ(3, 4) && UINT_MAX == UINT32_MAX - return __builtin_clz(n); - -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - uint32_t i; - __asm__("bsrl %1, %0\n\t" - "xorl $31, %0" - : "=r" (i) : "rm" (n)); - return i; - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - uint32_t i; - _BitScanReverse(&i, n); - return i ^ 31U; - -#else - uint32_t i = 0; - - if ((n & UINT32_C(0xFFFF0000)) == 0) { - n <<= 16; - i = 16; - } - - if ((n & UINT32_C(0xFF000000)) == 0) { - n <<= 8; - i += 8; - } - - if ((n & UINT32_C(0xF0000000)) == 0) { - n <<= 4; - i += 4; - } - - if ((n & UINT32_C(0xC0000000)) == 0) { - n <<= 2; - i += 2; - } - - if ((n & UINT32_C(0x80000000)) == 0) - ++i; - - return i; -#endif -} - - -static inline uint32_t -ctz32(uint32_t n) -{ -#if defined(__INTEL_COMPILER) - return _bit_scan_forward(n); - -#elif TUKLIB_GNUC_REQ(3, 4) && UINT_MAX >= UINT32_MAX - return __builtin_ctz(n); - -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - uint32_t i; - __asm__("bsfl %1, %0" : "=r" (i) : "rm" (n)); - return i; - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - uint32_t i; - _BitScanForward(&i, n); - return i; - -#else - uint32_t i = 0; - - if ((n & UINT32_C(0x0000FFFF)) == 0) { - n >>= 16; - i = 16; - } - - if ((n & UINT32_C(0x000000FF)) == 0) { - n >>= 8; - i += 8; - } - - if ((n & UINT32_C(0x0000000F)) == 0) { - n >>= 4; - i += 4; - } - - if ((n & UINT32_C(0x00000003)) == 0) { - n >>= 2; - i += 2; - } - - if ((n & UINT32_C(0x00000001)) == 0) - ++i; - - return i; -#endif -} - -#define bsf32 ctz32 - -#endif diff --git a/game/client/third/minizip/lib/liblzma/config.h b/game/client/third/minizip/lib/liblzma/config.h deleted file mode 100755 index d7a294b1..00000000 --- a/game/client/third/minizip/lib/liblzma/config.h +++ /dev/null @@ -1,497 +0,0 @@ -/* config.h. Generated from config.h.in by configure. */ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* Define if building universal (internal helper macro) */ -/* #undef AC_APPLE_UNIVERSAL_BUILD */ - -/* How many MiB of RAM to assume if the real amount cannot be determined. */ -#define ASSUME_RAM 128 - -/* Define to 1 if translation of program messages to the user's native - language is requested. */ -/* #undef ENABLE_NLS */ - -/* Define to 1 if bswap_16 is available. */ -/* #undef HAVE_BSWAP_16 */ - -/* Define to 1 if bswap_32 is available. */ -/* #undef HAVE_BSWAP_32 */ - -/* Define to 1 if bswap_64 is available. */ -/* #undef HAVE_BSWAP_64 */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_BYTESWAP_H */ - -/* Define to 1 if the system has the type `CC_SHA256_CTX'. */ -/* #undef HAVE_CC_SHA256_CTX */ - -/* Define to 1 if you have the `CC_SHA256_Init' function. */ -/* #undef HAVE_CC_SHA256_INIT */ - -/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the - CoreFoundation framework. */ -/* #undef HAVE_CFLOCALECOPYCURRENT */ - -/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in - the CoreFoundation framework. */ -/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ - -/* Define to 1 if crc32 integrity check is enabled. */ -/* #undef HAVE_CHECK_CRC32 */ - -/* Define to 1 if crc64 integrity check is enabled. */ -/* #undef HAVE_CHECK_CRC64 */ - -/* Define to 1 if sha256 integrity check is enabled. */ -/* #undef HAVE_CHECK_SHA256 */ - -/* Define to 1 if you have the `clock_gettime' function. */ -#define HAVE_CLOCK_GETTIME 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_COMMONCRYPTO_COMMONDIGEST_H */ - -/* Define if the GNU dcgettext() function is already present or preinstalled. - */ -/* #undef HAVE_DCGETTEXT */ - -/* Define to 1 if you have the declaration of `CLOCK_MONOTONIC', and to 0 if - you don't. */ -#define HAVE_DECL_CLOCK_MONOTONIC 1 - -/* Define to 1 if you have the declaration of `program_invocation_name', and - to 0 if you don't. */ -#define HAVE_DECL_PROGRAM_INVOCATION_NAME 0 - -/* Define to 1 if arm decoder is enabled. */ -/* #undef HAVE_DECODER_ARM */ - -/* Define to 1 if armthumb decoder is enabled. */ -/* #undef HAVE_DECODER_ARMTHUMB */ - -/* Define to 1 if delta decoder is enabled. */ -/* #undef HAVE_DECODER_DELTA */ - -/* Define to 1 if ia64 decoder is enabled. */ -/* #undef HAVE_DECODER_IA64 */ - -/* Define to 1 if lzma1 decoder is enabled. */ -#define HAVE_DECODER_LZMA1 1 - -/* Define to 1 if lzma2 decoder is enabled. */ -/* #undef HAVE_DECODER_LZMA2 */ - -/* Define to 1 if powerpc decoder is enabled. */ -/* #undef HAVE_DECODER_POWERPC */ - -/* Define to 1 if sparc decoder is enabled. */ -/* #undef HAVE_DECODER_SPARC */ - -/* Define to 1 if x86 decoder is enabled. */ -/* #undef HAVE_DECODER_X86 */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_DLFCN_H */ - -/* Define to 1 if arm encoder is enabled. */ -/* #undef HAVE_ENCODER_ARM */ - -/* Define to 1 if armthumb encoder is enabled. */ -/* #undef HAVE_ENCODER_ARMTHUMB */ - -/* Define to 1 if delta encoder is enabled. */ -/* #undef HAVE_ENCODER_DELTA */ - -/* Define to 1 if ia64 encoder is enabled. */ -/* #undef HAVE_ENCODER_IA64 */ - -/* Define to 1 if lzma1 encoder is enabled. */ -#define HAVE_ENCODER_LZMA1 1 - -/* Define to 1 if lzma2 encoder is enabled. */ -/* #undef HAVE_ENCODER_LZMA2 */ - -/* Define to 1 if powerpc encoder is enabled. */ -/* #undef HAVE_ENCODER_POWERPC */ - -/* Define to 1 if sparc encoder is enabled. */ -/* #undef HAVE_ENCODER_SPARC */ - -/* Define to 1 if x86 encoder is enabled. */ -/* #undef HAVE_ENCODER_X86 */ - -/* Define to 1 if you have the header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if you have the `futimens' function. */ -/* #undef HAVE_FUTIMENS */ - -/* Define to 1 if you have the `futimes' function. */ -/* #undef HAVE_FUTIMES */ - -/* Define to 1 if you have the `futimesat' function. */ -/* #undef HAVE_FUTIMESAT */ - -/* Define to 1 if you have the header file. */ -#define HAVE_GETOPT_H 1 - -/* Define to 1 if you have the `getopt_long' function. */ -#define HAVE_GETOPT_LONG 1 - -/* Define if the GNU gettext() function is already present or preinstalled. */ -/* #undef HAVE_GETTEXT */ - -/* Define if you have the iconv() function and it works. */ -/* #undef HAVE_ICONV */ - -/* Define to 1 if you have the header file. */ -#define HAVE_IMMINTRIN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_LIMITS_H 1 - -/* Define to 1 if mbrtowc and mbstate_t are properly declared. */ -#define HAVE_MBRTOWC 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 to enable bt2 match finder. */ -#define HAVE_MF_BT2 1 - -/* Define to 1 to enable bt3 match finder. */ -#define HAVE_MF_BT3 1 - -/* Define to 1 to enable bt4 match finder. */ -#define HAVE_MF_BT4 1 - -/* Define to 1 to enable hc3 match finder. */ -#define HAVE_MF_HC3 1 - -/* Define to 1 to enable hc4 match finder. */ -#define HAVE_MF_HC4 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MINIX_SHA2_H */ - -/* Define to 1 if getopt.h declares extern int optreset. */ -/* #undef HAVE_OPTRESET */ - -/* Define to 1 if you have the `pipe2' function. */ -/* #undef HAVE_PIPE2 */ - -/* Define to 1 if you have the `posix_fadvise' function. */ -/* #undef HAVE_POSIX_FADVISE */ - -/* Define to 1 if you have the `pthread_condattr_setclock' function. */ -/* #undef HAVE_PTHREAD_CONDATTR_SETCLOCK */ - -/* Have PTHREAD_PRIO_INHERIT. */ -/* #undef HAVE_PTHREAD_PRIO_INHERIT */ - -/* Define to 1 if you have the `SHA256Init' function. */ -/* #undef HAVE_SHA256INIT */ - -/* Define to 1 if the system has the type `SHA256_CTX'. */ -/* #undef HAVE_SHA256_CTX */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SHA256_H */ - -/* Define to 1 if you have the `SHA256_Init' function. */ -/* #undef HAVE_SHA256_INIT */ - -/* Define to 1 if the system has the type `SHA2_CTX'. */ -/* #undef HAVE_SHA2_CTX */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SHA2_H */ - -/* Define to 1 if optimizing for size. */ -/* #undef HAVE_SMALL */ - -/* Define to 1 if stdbool.h conforms to C99. */ -#define HAVE_STDBOOL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_STRINGS_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if `st_atimensec' is a member of `struct stat'. */ -/* #undef HAVE_STRUCT_STAT_ST_ATIMENSEC */ - -/* Define to 1 if `st_atimespec.tv_nsec' is a member of `struct stat'. */ -/* #undef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC */ - -/* Define to 1 if `st_atim.st__tim.tv_nsec' is a member of `struct stat'. */ -/* #undef HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC */ - -/* Define to 1 if `st_atim.tv_nsec' is a member of `struct stat'. */ -/* #undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC */ - -/* Define to 1 if `st_uatime' is a member of `struct stat'. */ -/* #undef HAVE_STRUCT_STAT_ST_UATIME */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_BYTEORDER_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_ENDIAN_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_PARAM_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if the system has the type `uintptr_t'. */ -#define HAVE_UINTPTR_T 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to 1 if you have the `utime' function. */ -#define HAVE_UTIME 1 - -/* Define to 1 if you have the `utimes' function. */ -/* #undef HAVE_UTIMES */ - -/* Define to 1 or 0, depending whether the compiler supports simple visibility - declarations. */ -#define HAVE_VISIBILITY 1 - -/* Define to 1 if you have the `wcwidth' function. */ -/* #undef HAVE_WCWIDTH */ - -/* Define to 1 if the system has the type `_Bool'. */ -#define HAVE__BOOL 1 - -/* Define to 1 if _mm_movemask_epi8 is available. */ -#define HAVE__MM_MOVEMASK_EPI8 1 - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ -#define LT_OBJDIR ".libs/" - -/* Define to 1 when using POSIX threads (pthreads). */ -/* #undef MYTHREAD_POSIX */ - -#ifdef _WIN64 -/* Define to 1 when using Windows Vista compatible threads. This uses features - that are not available on Windows XP. */ -# define MYTHREAD_VISTA 1 -#else -/* Define to 1 when using Windows 95 (and thus XP) compatible threads. This - avoids use of features that were added in Windows Vista. - This is used for 32-bit x86 builds for compatibility reasons since it - makes no measurable difference in performance compared to Vista threads. */ -# define MYTHREAD_WIN95 1 -#endif - -/* Define to 1 to disable debugging code. */ -#define NDEBUG 1 - -/* Name of package */ -#define PACKAGE "xz" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "XZ Utils" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "XZ Utils 5.2.3" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "xz" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "http://tukaani.org/xz/" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "5.2.3" - -/* Define to necessary symbol if this constant uses a non-standard name on - your system. */ -/* #undef PTHREAD_CREATE_JOINABLE */ - -/* The size of `size_t', as computed by sizeof. */ -#ifdef _WIN64 -# define SIZEOF_SIZE_T 8 -#else -# define SIZEOF_SIZE_T 4 -#endif - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to 1 if the number of available CPU cores can be detected with - cpuset(2). */ -/* #undef TUKLIB_CPUCORES_CPUSET */ - -/* Define to 1 if the number of available CPU cores can be detected with - pstat_getdynamic(). */ -/* #undef TUKLIB_CPUCORES_PSTAT_GETDYNAMIC */ - -/* Define to 1 if the number of available CPU cores can be detected with - sysconf(_SC_NPROCESSORS_ONLN) or sysconf(_SC_NPROC_ONLN). */ -/* #undef TUKLIB_CPUCORES_SYSCONF */ - -/* Define to 1 if the number of available CPU cores can be detected with - sysctl(). */ -/* #undef TUKLIB_CPUCORES_SYSCTL */ - -/* Define to 1 if the system supports fast unaligned access to 16-bit and - 32-bit integers. */ -#define TUKLIB_FAST_UNALIGNED_ACCESS 1 - -/* Define to 1 if the amount of physical memory can be detected with - _system_configuration.physmem. */ -/* #undef TUKLIB_PHYSMEM_AIX */ - -/* Define to 1 if the amount of physical memory can be detected with - getinvent_r(). */ -/* #undef TUKLIB_PHYSMEM_GETINVENT_R */ - -/* Define to 1 if the amount of physical memory can be detected with - getsysinfo(). */ -/* #undef TUKLIB_PHYSMEM_GETSYSINFO */ - -/* Define to 1 if the amount of physical memory can be detected with - pstat_getstatic(). */ -/* #undef TUKLIB_PHYSMEM_PSTAT_GETSTATIC */ - -/* Define to 1 if the amount of physical memory can be detected with - sysconf(_SC_PAGESIZE) and sysconf(_SC_PHYS_PAGES). */ -/* #undef TUKLIB_PHYSMEM_SYSCONF */ - -/* Define to 1 if the amount of physical memory can be detected with sysctl(). - */ -/* #undef TUKLIB_PHYSMEM_SYSCTL */ - -/* Define to 1 if the amount of physical memory can be detected with Linux - sysinfo(). */ -/* #undef TUKLIB_PHYSMEM_SYSINFO */ - -/* Enable extensions on AIX 3, Interix. */ -#ifndef _ALL_SOURCE -# define _ALL_SOURCE 1 -#endif -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -#endif -/* Enable threading extensions on Solaris. */ -#ifndef _POSIX_PTHREAD_SEMANTICS -# define _POSIX_PTHREAD_SEMANTICS 1 -#endif -/* Enable extensions on HP NonStop. */ -#ifndef _TANDEM_SOURCE -# define _TANDEM_SOURCE 1 -#endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -# define __EXTENSIONS__ 1 -#endif - - -/* Version number of package */ -#define VERSION "5.2.3" - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -/* # undef WORDS_BIGENDIAN */ -# endif -#endif - -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif - -/* Number of bits in a file offset, on hosts where this is settable. */ -#define _FILE_OFFSET_BITS 64 - -/* Define for large files, on AIX-style hosts. */ -/* #undef _LARGE_FILES */ - -/* Define to 1 if on MINIX. */ -/* #undef _MINIX */ - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -/* #undef _POSIX_1_SOURCE */ - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -/* #undef _POSIX_SOURCE */ - -/* Define for Solaris 2.5.1 so the uint32_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT32_T */ - -/* Define for Solaris 2.5.1 so the uint64_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT64_T */ - -/* Define for Solaris 2.5.1 so the uint8_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT8_T */ - -/* Define to rpl_ if the getopt replacement functions and variables should be - used. */ -/* #undef __GETOPT_PREFIX */ - -/* Define to the type of a signed integer type of width exactly 32 bits if - such a type exists and the standard includes do not define it. */ -/* #undef int32_t */ - -/* Define to the type of a signed integer type of width exactly 64 bits if - such a type exists and the standard includes do not define it. */ -/* #undef int64_t */ - -/* Define to the type of an unsigned integer type of width exactly 16 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint16_t */ - -/* Define to the type of an unsigned integer type of width exactly 32 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint32_t */ - -/* Define to the type of an unsigned integer type of width exactly 64 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint64_t */ - -/* Define to the type of an unsigned integer type of width exactly 8 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint8_t */ - -/* Define to the type of an unsigned integer type wide enough to hold a - pointer, if such a type exists, and if the system does not define it. */ -/* #undef uintptr_t */ diff --git a/game/client/third/minizip/lib/liblzma/lz/lz_decoder.c b/game/client/third/minizip/lib/liblzma/lz/lz_decoder.c deleted file mode 100755 index c7086440..00000000 --- a/game/client/third/minizip/lib/liblzma/lz/lz_decoder.c +++ /dev/null @@ -1,306 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_decoder.c -/// \brief LZ out window -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -// liblzma supports multiple LZ77-based filters. The LZ part is shared -// between these filters. The LZ code takes care of dictionary handling -// and passing the data between filters in the chain. The filter-specific -// part decodes from the input buffer to the dictionary. - - -#include "lz_decoder.h" - - -typedef struct { - /// Dictionary (history buffer) - lzma_dict dict; - - /// The actual LZ-based decoder e.g. LZMA - lzma_lz_decoder lz; - - /// Next filter in the chain, if any. Note that LZMA and LZMA2 are - /// only allowed as the last filter, but the long-range filter in - /// future can be in the middle of the chain. - lzma_next_coder next; - - /// True if the next filter in the chain has returned LZMA_STREAM_END. - bool next_finished; - - /// True if the LZ decoder (e.g. LZMA) has detected end of payload - /// marker. This may become true before next_finished becomes true. - bool this_finished; - - /// Temporary buffer needed when the LZ-based filter is not the last - /// filter in the chain. The output of the next filter is first - /// decoded into buffer[], which is then used as input for the actual - /// LZ-based decoder. - struct { - size_t pos; - size_t size; - uint8_t buffer[LZMA_BUFFER_SIZE]; - } temp; -} lzma_coder; - - -static void -lz_decoder_reset(lzma_coder *coder) -{ - coder->dict.pos = 0; - coder->dict.full = 0; - coder->dict.buf[coder->dict.size - 1] = '\0'; - coder->dict.need_reset = false; - return; -} - - -static lzma_ret -decode_buffer(lzma_coder *coder, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size) -{ - while (true) { - // Wrap the dictionary if needed. - if (coder->dict.pos == coder->dict.size) - coder->dict.pos = 0; - - // Store the current dictionary position. It is needed to know - // where to start copying to the out[] buffer. - const size_t dict_start = coder->dict.pos; - - // Calculate how much we allow coder->lz.code() to decode. - // It must not decode past the end of the dictionary - // buffer, and we don't want it to decode more than is - // actually needed to fill the out[] buffer. - coder->dict.limit = coder->dict.pos - + my_min(out_size - *out_pos, - coder->dict.size - coder->dict.pos); - - // Call the coder->lz.code() to do the actual decoding. - const lzma_ret ret = coder->lz.code( - coder->lz.coder, &coder->dict, - in, in_pos, in_size); - - // Copy the decoded data from the dictionary to the out[] - // buffer. - const size_t copy_size = coder->dict.pos - dict_start; - assert(copy_size <= out_size - *out_pos); - memcpy(out + *out_pos, coder->dict.buf + dict_start, - copy_size); - *out_pos += copy_size; - - // Reset the dictionary if so requested by coder->lz.code(). - if (coder->dict.need_reset) { - lz_decoder_reset(coder); - - // Since we reset dictionary, we don't check if - // dictionary became full. - if (ret != LZMA_OK || *out_pos == out_size) - return ret; - } else { - // Return if everything got decoded or an error - // occurred, or if there's no more data to decode. - // - // Note that detecting if there's something to decode - // is done by looking if dictionary become full - // instead of looking if *in_pos == in_size. This - // is because it is possible that all the input was - // consumed already but some data is pending to be - // written to the dictionary. - if (ret != LZMA_OK || *out_pos == out_size - || coder->dict.pos < coder->dict.size) - return ret; - } - } -} - - -static lzma_ret -lz_decode(void *coder_ptr, - const lzma_allocator *allocator lzma_attribute((__unused__)), - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - lzma_action action) -{ - lzma_coder *coder = coder_ptr; - - if (coder->next.code == NULL) - return decode_buffer(coder, in, in_pos, in_size, - out, out_pos, out_size); - - // We aren't the last coder in the chain, we need to decode - // our input to a temporary buffer. - while (*out_pos < out_size) { - // Fill the temporary buffer if it is empty. - if (!coder->next_finished - && coder->temp.pos == coder->temp.size) { - coder->temp.pos = 0; - coder->temp.size = 0; - - const lzma_ret ret = coder->next.code( - coder->next.coder, - allocator, in, in_pos, in_size, - coder->temp.buffer, &coder->temp.size, - LZMA_BUFFER_SIZE, action); - - if (ret == LZMA_STREAM_END) - coder->next_finished = true; - else if (ret != LZMA_OK || coder->temp.size == 0) - return ret; - } - - if (coder->this_finished) { - if (coder->temp.size != 0) - return LZMA_DATA_ERROR; - - if (coder->next_finished) - return LZMA_STREAM_END; - - return LZMA_OK; - } - - const lzma_ret ret = decode_buffer(coder, coder->temp.buffer, - &coder->temp.pos, coder->temp.size, - out, out_pos, out_size); - - if (ret == LZMA_STREAM_END) - coder->this_finished = true; - else if (ret != LZMA_OK) - return ret; - else if (coder->next_finished && *out_pos < out_size) - return LZMA_DATA_ERROR; - } - - return LZMA_OK; -} - - -static void -lz_decoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_coder *coder = coder_ptr; - - lzma_next_end(&coder->next, allocator); - lzma_free(coder->dict.buf, allocator); - - if (coder->lz.end != NULL) - coder->lz.end(coder->lz.coder, allocator); - else - lzma_free(coder->lz.coder, allocator); - - lzma_free(coder, allocator); - return; -} - - -extern lzma_ret -lzma_lz_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_decoder *lz, - const lzma_allocator *allocator, const void *options, - lzma_lz_options *lz_options)) -{ - // Allocate the base structure if it isn't already allocated. - lzma_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &lz_decode; - next->end = &lz_decoder_end; - - coder->dict.buf = NULL; - coder->dict.size = 0; - coder->lz = LZMA_LZ_DECODER_INIT; - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Allocate and initialize the LZ-based decoder. It will also give - // us the dictionary size. - lzma_lz_options lz_options; - return_if_error(lz_init(&coder->lz, allocator, - filters[0].options, &lz_options)); - - // If the dictionary size is very small, increase it to 4096 bytes. - // This is to prevent constant wrapping of the dictionary, which - // would slow things down. The downside is that since we don't check - // separately for the real dictionary size, we may happily accept - // corrupt files. - if (lz_options.dict_size < 4096) - lz_options.dict_size = 4096; - - // Make dictionary size a multipe of 16. Some LZ-based decoders like - // LZMA use the lowest bits lzma_dict.pos to know the alignment of the - // data. Aligned buffer is also good when memcpying from the - // dictionary to the output buffer, since applications are - // recommended to give aligned buffers to liblzma. - // - // Avoid integer overflow. - if (lz_options.dict_size > SIZE_MAX - 15) - return LZMA_MEM_ERROR; - - lz_options.dict_size = (lz_options.dict_size + 15) & ~((size_t)(15)); - - // Allocate and initialize the dictionary. - if (coder->dict.size != lz_options.dict_size) { - lzma_free(coder->dict.buf, allocator); - coder->dict.buf - = lzma_alloc(lz_options.dict_size, allocator); - if (coder->dict.buf == NULL) - return LZMA_MEM_ERROR; - - coder->dict.size = lz_options.dict_size; - } - - lz_decoder_reset(next->coder); - - // Use the preset dictionary if it was given to us. - if (lz_options.preset_dict != NULL - && lz_options.preset_dict_size > 0) { - // If the preset dictionary is bigger than the actual - // dictionary, copy only the tail. - const size_t copy_size = my_min(lz_options.preset_dict_size, - lz_options.dict_size); - const size_t offset = lz_options.preset_dict_size - copy_size; - memcpy(coder->dict.buf, lz_options.preset_dict + offset, - copy_size); - coder->dict.pos = copy_size; - coder->dict.full = copy_size; - } - - // Miscellaneous initializations - coder->next_finished = false; - coder->this_finished = false; - coder->temp.pos = 0; - coder->temp.size = 0; - - // Initialize the next filter in the chain, if any. - return lzma_next_filter_init(&coder->next, allocator, filters + 1); -} - - -extern uint64_t -lzma_lz_decoder_memusage(size_t dictionary_size) -{ - return sizeof(lzma_coder) + (uint64_t)(dictionary_size); -} - - -extern void -lzma_lz_decoder_uncompressed(void *coder_ptr, lzma_vli uncompressed_size) -{ - lzma_coder *coder = coder_ptr; - coder->lz.set_uncompressed(coder->lz.coder, uncompressed_size); -} diff --git a/game/client/third/minizip/lib/liblzma/lz/lz_decoder.h b/game/client/third/minizip/lib/liblzma/lz/lz_decoder.h deleted file mode 100755 index 754ccf37..00000000 --- a/game/client/third/minizip/lib/liblzma/lz/lz_decoder.h +++ /dev/null @@ -1,234 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_decoder.h -/// \brief LZ out window -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZ_DECODER_H -#define LZMA_LZ_DECODER_H - -#include "common.h" - - -typedef struct { - /// Pointer to the dictionary buffer. It can be an allocated buffer - /// internal to liblzma, or it can a be a buffer given by the - /// application when in single-call mode (not implemented yet). - uint8_t *buf; - - /// Write position in dictionary. The next byte will be written to - /// buf[pos]. - size_t pos; - - /// Indicates how full the dictionary is. This is used by - /// dict_is_distance_valid() to detect corrupt files that would - /// read beyond the beginning of the dictionary. - size_t full; - - /// Write limit - size_t limit; - - /// Size of the dictionary - size_t size; - - /// True when dictionary should be reset before decoding more data. - bool need_reset; - -} lzma_dict; - - -typedef struct { - size_t dict_size; - const uint8_t *preset_dict; - size_t preset_dict_size; -} lzma_lz_options; - - -typedef struct { - /// Data specific to the LZ-based decoder - void *coder; - - /// Function to decode from in[] to *dict - lzma_ret (*code)(void *coder, - lzma_dict *restrict dict, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size); - - void (*reset)(void *coder, const void *options); - - /// Set the uncompressed size - void (*set_uncompressed)(void *coder, lzma_vli uncompressed_size); - - /// Free allocated resources - void (*end)(void *coder, const lzma_allocator *allocator); - -} lzma_lz_decoder; - - -#define LZMA_LZ_DECODER_INIT \ - (lzma_lz_decoder){ \ - .coder = NULL, \ - .code = NULL, \ - .reset = NULL, \ - .set_uncompressed = NULL, \ - .end = NULL, \ - } - - -extern lzma_ret lzma_lz_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_decoder *lz, - const lzma_allocator *allocator, const void *options, - lzma_lz_options *lz_options)); - -extern uint64_t lzma_lz_decoder_memusage(size_t dictionary_size); - -extern void lzma_lz_decoder_uncompressed( - void *coder, lzma_vli uncompressed_size); - - -////////////////////// -// Inline functions // -////////////////////// - -/// Get a byte from the history buffer. -static inline uint8_t -dict_get(const lzma_dict *const dict, const uint32_t distance) -{ - return dict->buf[dict->pos - distance - 1 - + (distance < dict->pos ? 0 : dict->size)]; -} - - -/// Test if dictionary is empty. -static inline bool -dict_is_empty(const lzma_dict *const dict) -{ - return dict->full == 0; -} - - -/// Validate the match distance -static inline bool -dict_is_distance_valid(const lzma_dict *const dict, const size_t distance) -{ - return dict->full > distance; -} - - -/// Repeat *len bytes at distance. -static inline bool -dict_repeat(lzma_dict *dict, uint32_t distance, uint32_t *len) -{ - // Don't write past the end of the dictionary. - const size_t dict_avail = dict->limit - dict->pos; - uint32_t left = my_min(dict_avail, *len); - *len -= left; - - // Repeat a block of data from the history. Because memcpy() is faster - // than copying byte by byte in a loop, the copying process gets split - // into three cases. - if (distance < left) { - // Source and target areas overlap, thus we can't use - // memcpy() nor even memmove() safely. - do { - dict->buf[dict->pos] = dict_get(dict, distance); - ++dict->pos; - } while (--left > 0); - - } else if (distance < dict->pos) { - // The easiest and fastest case - memcpy(dict->buf + dict->pos, - dict->buf + dict->pos - distance - 1, - left); - dict->pos += left; - - } else { - // The bigger the dictionary, the more rare this - // case occurs. We need to "wrap" the dict, thus - // we might need two memcpy() to copy all the data. - assert(dict->full == dict->size); - const uint32_t copy_pos - = dict->pos - distance - 1 + dict->size; - uint32_t copy_size = dict->size - copy_pos; - - if (copy_size < left) { - memmove(dict->buf + dict->pos, dict->buf + copy_pos, - copy_size); - dict->pos += copy_size; - copy_size = left - copy_size; - memcpy(dict->buf + dict->pos, dict->buf, copy_size); - dict->pos += copy_size; - } else { - memmove(dict->buf + dict->pos, dict->buf + copy_pos, - left); - dict->pos += left; - } - } - - // Update how full the dictionary is. - if (dict->full < dict->pos) - dict->full = dict->pos; - - return unlikely(*len != 0); -} - - -/// Puts one byte into the dictionary. Returns true if the dictionary was -/// already full and the byte couldn't be added. -static inline bool -dict_put(lzma_dict *dict, uint8_t byte) -{ - if (unlikely(dict->pos == dict->limit)) - return true; - - dict->buf[dict->pos++] = byte; - - if (dict->pos > dict->full) - dict->full = dict->pos; - - return false; -} - - -/// Copies arbitrary amount of data into the dictionary. -static inline void -dict_write(lzma_dict *restrict dict, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size, - size_t *restrict left) -{ - // NOTE: If we are being given more data than the size of the - // dictionary, it could be possible to optimize the LZ decoder - // so that not everything needs to go through the dictionary. - // This shouldn't be very common thing in practice though, and - // the slowdown of one extra memcpy() isn't bad compared to how - // much time it would have taken if the data were compressed. - - if (in_size - *in_pos > *left) - in_size = *in_pos + *left; - - *left -= lzma_bufcpy(in, in_pos, in_size, - dict->buf, &dict->pos, dict->limit); - - if (dict->pos > dict->full) - dict->full = dict->pos; - - return; -} - - -static inline void -dict_reset(lzma_dict *dict) -{ - dict->need_reset = true; - return; -} - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lz/lz_encoder.c b/game/client/third/minizip/lib/liblzma/lz/lz_encoder.c deleted file mode 100755 index 9a74b7c4..00000000 --- a/game/client/third/minizip/lib/liblzma/lz/lz_encoder.c +++ /dev/null @@ -1,616 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder.c -/// \brief LZ in window -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lz_encoder.h" -#include "lz_encoder_hash.h" - -// See lz_encoder_hash.h. This is a bit hackish but avoids making -// endianness a conditional in makefiles. -#if defined(WORDS_BIGENDIAN) && !defined(HAVE_SMALL) -# include "lz_encoder_hash_table.h" -#endif - -#include "memcmplen.h" - - -typedef struct { - /// LZ-based encoder e.g. LZMA - lzma_lz_encoder lz; - - /// History buffer and match finder - lzma_mf mf; - - /// Next coder in the chain - lzma_next_coder next; -} lzma_coder; - - -/// \brief Moves the data in the input window to free space for new data -/// -/// mf->buffer is a sliding input window, which keeps mf->keep_size_before -/// bytes of input history available all the time. Now and then we need to -/// "slide" the buffer to make space for the new data to the end of the -/// buffer. At the same time, data older than keep_size_before is dropped. -/// -static void -move_window(lzma_mf *mf) -{ - // Align the move to a multiple of 16 bytes. Some LZ-based encoders - // like LZMA use the lowest bits of mf->read_pos to know the - // alignment of the uncompressed data. We also get better speed - // for memmove() with aligned buffers. - assert(mf->read_pos > mf->keep_size_before); - const uint32_t move_offset - = (mf->read_pos - mf->keep_size_before) & ~UINT32_C(15); - - assert(mf->write_pos > move_offset); - const size_t move_size = mf->write_pos - move_offset; - - assert(move_offset + move_size <= mf->size); - - memmove(mf->buffer, mf->buffer + move_offset, move_size); - - mf->offset += move_offset; - mf->read_pos -= move_offset; - mf->read_limit -= move_offset; - mf->write_pos -= move_offset; - - return; -} - - -/// \brief Tries to fill the input window (mf->buffer) -/// -/// If we are the last encoder in the chain, our input data is in in[]. -/// Otherwise we call the next filter in the chain to process in[] and -/// write its output to mf->buffer. -/// -/// This function must not be called once it has returned LZMA_STREAM_END. -/// -static lzma_ret -fill_window(lzma_coder *coder, const lzma_allocator *allocator, - const uint8_t *in, size_t *in_pos, size_t in_size, - lzma_action action) -{ - assert(coder->mf.read_pos <= coder->mf.write_pos); - - // Move the sliding window if needed. - if (coder->mf.read_pos >= coder->mf.size - coder->mf.keep_size_after) - move_window(&coder->mf); - - // Maybe this is ugly, but lzma_mf uses uint32_t for most things - // (which I find cleanest), but we need size_t here when filling - // the history window. - size_t write_pos = coder->mf.write_pos; - lzma_ret ret; - if (coder->next.code == NULL) { - // Not using a filter, simply memcpy() as much as possible. - lzma_bufcpy(in, in_pos, in_size, coder->mf.buffer, - &write_pos, coder->mf.size); - - ret = action != LZMA_RUN && *in_pos == in_size - ? LZMA_STREAM_END : LZMA_OK; - - } else { - ret = coder->next.code(coder->next.coder, allocator, - in, in_pos, in_size, - coder->mf.buffer, &write_pos, - coder->mf.size, action); - } - - coder->mf.write_pos = write_pos; - - // Silence Valgrind. lzma_memcmplen() can read extra bytes - // and Valgrind will give warnings if those bytes are uninitialized - // because Valgrind cannot see that the values of the uninitialized - // bytes are eventually ignored. - memzero(coder->mf.buffer + write_pos, LZMA_MEMCMPLEN_EXTRA); - - // If end of stream has been reached or flushing completed, we allow - // the encoder to process all the input (that is, read_pos is allowed - // to reach write_pos). Otherwise we keep keep_size_after bytes - // available as prebuffer. - if (ret == LZMA_STREAM_END) { - assert(*in_pos == in_size); - ret = LZMA_OK; - coder->mf.action = action; - coder->mf.read_limit = coder->mf.write_pos; - - } else if (coder->mf.write_pos > coder->mf.keep_size_after) { - // This needs to be done conditionally, because if we got - // only little new input, there may be too little input - // to do any encoding yet. - coder->mf.read_limit = coder->mf.write_pos - - coder->mf.keep_size_after; - } - - // Restart the match finder after finished LZMA_SYNC_FLUSH. - if (coder->mf.pending > 0 - && coder->mf.read_pos < coder->mf.read_limit) { - // Match finder may update coder->pending and expects it to - // start from zero, so use a temporary variable. - const uint32_t pending = coder->mf.pending; - coder->mf.pending = 0; - - // Rewind read_pos so that the match finder can hash - // the pending bytes. - assert(coder->mf.read_pos >= pending); - coder->mf.read_pos -= pending; - - // Call the skip function directly instead of using - // mf_skip(), since we don't want to touch mf->read_ahead. - coder->mf.skip(&coder->mf, pending); - } - - return ret; -} - - -static lzma_ret -lz_encode(void *coder_ptr, const lzma_allocator *allocator, - const uint8_t *restrict in, size_t *restrict in_pos, - size_t in_size, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, lzma_action action) -{ - lzma_coder *coder = coder_ptr; - - while (*out_pos < out_size - && (*in_pos < in_size || action != LZMA_RUN)) { - // Read more data to coder->mf.buffer if needed. - if (coder->mf.action == LZMA_RUN && coder->mf.read_pos - >= coder->mf.read_limit) - return_if_error(fill_window(coder, allocator, - in, in_pos, in_size, action)); - - // Encode - const lzma_ret ret = coder->lz.code(coder->lz.coder, - &coder->mf, out, out_pos, out_size); - if (ret != LZMA_OK) { - // Setting this to LZMA_RUN for cases when we are - // flushing. It doesn't matter when finishing or if - // an error occurred. - coder->mf.action = LZMA_RUN; - return ret; - } - } - - return LZMA_OK; -} - - -static bool -lz_encoder_prepare(lzma_mf *mf, const lzma_allocator *allocator, - const lzma_lz_options *lz_options) -{ - // For now, the dictionary size is limited to 1.5 GiB. This may grow - // in the future if needed, but it needs a little more work than just - // changing this check. - if (lz_options->dict_size < LZMA_DICT_SIZE_MIN - || lz_options->dict_size - > (UINT32_C(1) << 30) + (UINT32_C(1) << 29) - || lz_options->nice_len > lz_options->match_len_max) - return true; - - mf->keep_size_before = lz_options->before_size + lz_options->dict_size; - - mf->keep_size_after = lz_options->after_size - + lz_options->match_len_max; - - // To avoid constant memmove()s, allocate some extra space. Since - // memmove()s become more expensive when the size of the buffer - // increases, we reserve more space when a large dictionary is - // used to make the memmove() calls rarer. - // - // This works with dictionaries up to about 3 GiB. If bigger - // dictionary is wanted, some extra work is needed: - // - Several variables in lzma_mf have to be changed from uint32_t - // to size_t. - // - Memory usage calculation needs something too, e.g. use uint64_t - // for mf->size. - uint32_t reserve = lz_options->dict_size / 2; - if (reserve > (UINT32_C(1) << 30)) - reserve /= 2; - - reserve += (lz_options->before_size + lz_options->match_len_max - + lz_options->after_size) / 2 + (UINT32_C(1) << 19); - - const uint32_t old_size = mf->size; - mf->size = mf->keep_size_before + reserve + mf->keep_size_after; - - // Deallocate the old history buffer if it exists but has different - // size than what is needed now. - if (mf->buffer != NULL && old_size != mf->size) { - lzma_free(mf->buffer, allocator); - mf->buffer = NULL; - } - - // Match finder options - mf->match_len_max = lz_options->match_len_max; - mf->nice_len = lz_options->nice_len; - - // cyclic_size has to stay smaller than 2 Gi. Note that this doesn't - // mean limiting dictionary size to less than 2 GiB. With a match - // finder that uses multibyte resolution (hashes start at e.g. every - // fourth byte), cyclic_size would stay below 2 Gi even when - // dictionary size is greater than 2 GiB. - // - // It would be possible to allow cyclic_size >= 2 Gi, but then we - // would need to be careful to use 64-bit types in various places - // (size_t could do since we would need bigger than 32-bit address - // space anyway). It would also require either zeroing a multigigabyte - // buffer at initialization (waste of time and RAM) or allow - // normalization in lz_encoder_mf.c to access uninitialized - // memory to keep the code simpler. The current way is simple and - // still allows pretty big dictionaries, so I don't expect these - // limits to change. - mf->cyclic_size = lz_options->dict_size + 1; - - // Validate the match finder ID and setup the function pointers. - switch (lz_options->match_finder) { -#ifdef HAVE_MF_HC3 - case LZMA_MF_HC3: - mf->find = &lzma_mf_hc3_find; - mf->skip = &lzma_mf_hc3_skip; - break; -#endif -#ifdef HAVE_MF_HC4 - case LZMA_MF_HC4: - mf->find = &lzma_mf_hc4_find; - mf->skip = &lzma_mf_hc4_skip; - break; -#endif -#ifdef HAVE_MF_BT2 - case LZMA_MF_BT2: - mf->find = &lzma_mf_bt2_find; - mf->skip = &lzma_mf_bt2_skip; - break; -#endif -#ifdef HAVE_MF_BT3 - case LZMA_MF_BT3: - mf->find = &lzma_mf_bt3_find; - mf->skip = &lzma_mf_bt3_skip; - break; -#endif -#ifdef HAVE_MF_BT4 - case LZMA_MF_BT4: - mf->find = &lzma_mf_bt4_find; - mf->skip = &lzma_mf_bt4_skip; - break; -#endif - - default: - return true; - } - - // Calculate the sizes of mf->hash and mf->son and check that - // nice_len is big enough for the selected match finder. - const uint32_t hash_bytes = lz_options->match_finder & 0x0F; - if (hash_bytes > mf->nice_len) - return true; - - const bool is_bt = (lz_options->match_finder & 0x10) != 0; - uint32_t hs; - - if (hash_bytes == 2) { - hs = 0xFFFF; - } else { - // Round dictionary size up to the next 2^n - 1 so it can - // be used as a hash mask. - hs = lz_options->dict_size - 1; - hs |= hs >> 1; - hs |= hs >> 2; - hs |= hs >> 4; - hs |= hs >> 8; - hs >>= 1; - hs |= 0xFFFF; - - if (hs > (UINT32_C(1) << 24)) { - if (hash_bytes == 3) - hs = (UINT32_C(1) << 24) - 1; - else - hs >>= 1; - } - } - - mf->hash_mask = hs; - - ++hs; - if (hash_bytes > 2) - hs += HASH_2_SIZE; - if (hash_bytes > 3) - hs += HASH_3_SIZE; -/* - No match finder uses this at the moment. - if (mf->hash_bytes > 4) - hs += HASH_4_SIZE; -*/ - - const uint32_t old_hash_count = mf->hash_count; - const uint32_t old_sons_count = mf->sons_count; - mf->hash_count = hs; - mf->sons_count = mf->cyclic_size; - if (is_bt) - mf->sons_count *= 2; - - // Deallocate the old hash array if it exists and has different size - // than what is needed now. - if (old_hash_count != mf->hash_count - || old_sons_count != mf->sons_count) { - lzma_free(mf->hash, allocator); - mf->hash = NULL; - - lzma_free(mf->son, allocator); - mf->son = NULL; - } - - // Maximum number of match finder cycles - mf->depth = lz_options->depth; - if (mf->depth == 0) { - if (is_bt) - mf->depth = 16 + mf->nice_len / 2; - else - mf->depth = 4 + mf->nice_len / 4; - } - - return false; -} - - -static bool -lz_encoder_init(lzma_mf *mf, const lzma_allocator *allocator, - const lzma_lz_options *lz_options) -{ - // Allocate the history buffer. - if (mf->buffer == NULL) { - // lzma_memcmplen() is used for the dictionary buffer - // so we need to allocate a few extra bytes to prevent - // it from reading past the end of the buffer. - mf->buffer = lzma_alloc(mf->size + LZMA_MEMCMPLEN_EXTRA, - allocator); - if (mf->buffer == NULL) - return true; - - // Keep Valgrind happy with lzma_memcmplen() and initialize - // the extra bytes whose value may get read but which will - // effectively get ignored. - memzero(mf->buffer + mf->size, LZMA_MEMCMPLEN_EXTRA); - } - - // Use cyclic_size as initial mf->offset. This allows - // avoiding a few branches in the match finders. The downside is - // that match finder needs to be normalized more often, which may - // hurt performance with huge dictionaries. - mf->offset = mf->cyclic_size; - mf->read_pos = 0; - mf->read_ahead = 0; - mf->read_limit = 0; - mf->write_pos = 0; - mf->pending = 0; - -#if UINT32_MAX >= SIZE_MAX / 4 - // Check for integer overflow. (Huge dictionaries are not - // possible on 32-bit CPU.) - if (mf->hash_count > SIZE_MAX / sizeof(uint32_t) - || mf->sons_count > SIZE_MAX / sizeof(uint32_t)) - return true; -#endif - - // Allocate and initialize the hash table. Since EMPTY_HASH_VALUE - // is zero, we can use lzma_alloc_zero() or memzero() for mf->hash. - // - // We don't need to initialize mf->son, but not doing that may - // make Valgrind complain in normalization (see normalize() in - // lz_encoder_mf.c). Skipping the initialization is *very* good - // when big dictionary is used but only small amount of data gets - // actually compressed: most of the mf->son won't get actually - // allocated by the kernel, so we avoid wasting RAM and improve - // initialization speed a lot. - if (mf->hash == NULL) { - mf->hash = lzma_alloc_zero(mf->hash_count * sizeof(uint32_t), - allocator); - mf->son = lzma_alloc(mf->sons_count * sizeof(uint32_t), - allocator); - - if (mf->hash == NULL || mf->son == NULL) { - lzma_free(mf->hash, allocator); - mf->hash = NULL; - - lzma_free(mf->son, allocator); - mf->son = NULL; - - return true; - } - } else { -/* - for (uint32_t i = 0; i < mf->hash_count; ++i) - mf->hash[i] = EMPTY_HASH_VALUE; -*/ - memzero(mf->hash, mf->hash_count * sizeof(uint32_t)); - } - - mf->cyclic_pos = 0; - - // Handle preset dictionary. - if (lz_options->preset_dict != NULL - && lz_options->preset_dict_size > 0) { - // If the preset dictionary is bigger than the actual - // dictionary, use only the tail. - mf->write_pos = my_min(lz_options->preset_dict_size, mf->size); - memcpy(mf->buffer, lz_options->preset_dict - + lz_options->preset_dict_size - mf->write_pos, - mf->write_pos); - mf->action = LZMA_SYNC_FLUSH; - mf->skip(mf, mf->write_pos); - } - - mf->action = LZMA_RUN; - - return false; -} - - -extern uint64_t -lzma_lz_encoder_memusage(const lzma_lz_options *lz_options) -{ - // Old buffers must not exist when calling lz_encoder_prepare(). - lzma_mf mf = { - .buffer = NULL, - .hash = NULL, - .son = NULL, - .hash_count = 0, - .sons_count = 0, - }; - - // Setup the size information into mf. - if (lz_encoder_prepare(&mf, NULL, lz_options)) - return UINT64_MAX; - - // Calculate the memory usage. - return ((uint64_t)(mf.hash_count) + mf.sons_count) * sizeof(uint32_t) - + mf.size + sizeof(lzma_coder); -} - - -static void -lz_encoder_end(void *coder_ptr, const lzma_allocator *allocator) -{ - lzma_coder *coder = coder_ptr; - - lzma_next_end(&coder->next, allocator); - - lzma_free(coder->mf.son, allocator); - lzma_free(coder->mf.hash, allocator); - lzma_free(coder->mf.buffer, allocator); - - if (coder->lz.end != NULL) - coder->lz.end(coder->lz.coder, allocator); - else - lzma_free(coder->lz.coder, allocator); - - lzma_free(coder, allocator); - return; -} - - -static lzma_ret -lz_encoder_update(void *coder_ptr, const lzma_allocator *allocator, - const lzma_filter *filters_null lzma_attribute((__unused__)), - const lzma_filter *reversed_filters) -{ - lzma_coder *coder = coder_ptr; - - if (coder->lz.options_update == NULL) - return LZMA_PROG_ERROR; - - return_if_error(coder->lz.options_update( - coder->lz.coder, reversed_filters)); - - return lzma_next_filter_update( - &coder->next, allocator, reversed_filters + 1); -} - - -extern lzma_ret -lzma_lz_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_encoder *lz, - const lzma_allocator *allocator, const void *options, - lzma_lz_options *lz_options)) -{ -#ifdef HAVE_SMALL - // We need that the CRC32 table has been initialized. - lzma_crc32_init(); -#endif - - // Allocate and initialize the base data structure. - lzma_coder *coder = next->coder; - if (coder == NULL) { - coder = lzma_alloc(sizeof(lzma_coder), allocator); - if (coder == NULL) - return LZMA_MEM_ERROR; - - next->coder = coder; - next->code = &lz_encode; - next->end = &lz_encoder_end; - next->update = &lz_encoder_update; - - coder->lz.coder = NULL; - coder->lz.code = NULL; - coder->lz.end = NULL; - - // mf.size is initialized to silence Valgrind - // when used on optimized binaries (GCC may reorder - // code in a way that Valgrind gets unhappy). - coder->mf.buffer = NULL; - coder->mf.size = 0; - coder->mf.hash = NULL; - coder->mf.son = NULL; - coder->mf.hash_count = 0; - coder->mf.sons_count = 0; - - coder->next = LZMA_NEXT_CODER_INIT; - } - - // Initialize the LZ-based encoder. - lzma_lz_options lz_options; - return_if_error(lz_init(&coder->lz, allocator, - filters[0].options, &lz_options)); - - // Setup the size information into coder->mf and deallocate - // old buffers if they have wrong size. - if (lz_encoder_prepare(&coder->mf, allocator, &lz_options)) - return LZMA_OPTIONS_ERROR; - - // Allocate new buffers if needed, and do the rest of - // the initialization. - if (lz_encoder_init(&coder->mf, allocator, &lz_options)) - return LZMA_MEM_ERROR; - - // Initialize the next filter in the chain, if any. - return lzma_next_filter_init(&coder->next, allocator, filters + 1); -} - - -extern LZMA_API(lzma_bool) -lzma_mf_is_supported(lzma_match_finder mf) -{ - bool ret = false; - -#ifdef HAVE_MF_HC3 - if (mf == LZMA_MF_HC3) - ret = true; -#endif - -#ifdef HAVE_MF_HC4 - if (mf == LZMA_MF_HC4) - ret = true; -#endif - -#ifdef HAVE_MF_BT2 - if (mf == LZMA_MF_BT2) - ret = true; -#endif - -#ifdef HAVE_MF_BT3 - if (mf == LZMA_MF_BT3) - ret = true; -#endif - -#ifdef HAVE_MF_BT4 - if (mf == LZMA_MF_BT4) - ret = true; -#endif - - return ret; -} diff --git a/game/client/third/minizip/lib/liblzma/lz/lz_encoder.h b/game/client/third/minizip/lib/liblzma/lz/lz_encoder.h deleted file mode 100755 index 426dcd8a..00000000 --- a/game/client/third/minizip/lib/liblzma/lz/lz_encoder.h +++ /dev/null @@ -1,327 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder.h -/// \brief LZ in window and match finder API -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZ_ENCODER_H -#define LZMA_LZ_ENCODER_H - -#include "common.h" - - -/// A table of these is used by the LZ-based encoder to hold -/// the length-distance pairs found by the match finder. -typedef struct { - uint32_t len; - uint32_t dist; -} lzma_match; - - -typedef struct lzma_mf_s lzma_mf; -struct lzma_mf_s { - /////////////// - // In Window // - /////////////// - - /// Pointer to buffer with data to be compressed - uint8_t *buffer; - - /// Total size of the allocated buffer (that is, including all - /// the extra space) - uint32_t size; - - /// Number of bytes that must be kept available in our input history. - /// That is, once keep_size_before bytes have been processed, - /// buffer[read_pos - keep_size_before] is the oldest byte that - /// must be available for reading. - uint32_t keep_size_before; - - /// Number of bytes that must be kept in buffer after read_pos. - /// That is, read_pos <= write_pos - keep_size_after as long as - /// action is LZMA_RUN; when action != LZMA_RUN, read_pos is allowed - /// to reach write_pos so that the last bytes get encoded too. - uint32_t keep_size_after; - - /// Match finders store locations of matches using 32-bit integers. - /// To avoid adjusting several megabytes of integers every time the - /// input window is moved with move_window, we only adjust the - /// offset of the buffer. Thus, buffer[value_in_hash_table - offset] - /// is the byte pointed by value_in_hash_table. - uint32_t offset; - - /// buffer[read_pos] is the next byte to run through the match - /// finder. This is incremented in the match finder once the byte - /// has been processed. - uint32_t read_pos; - - /// Number of bytes that have been ran through the match finder, but - /// which haven't been encoded by the LZ-based encoder yet. - uint32_t read_ahead; - - /// As long as read_pos is less than read_limit, there is enough - /// input available in buffer for at least one encoding loop. - /// - /// Because of the stateful API, read_limit may and will get greater - /// than read_pos quite often. This is taken into account when - /// calculating the value for keep_size_after. - uint32_t read_limit; - - /// buffer[write_pos] is the first byte that doesn't contain valid - /// uncompressed data; that is, the next input byte will be copied - /// to buffer[write_pos]. - uint32_t write_pos; - - /// Number of bytes not hashed before read_pos. This is needed to - /// restart the match finder after LZMA_SYNC_FLUSH. - uint32_t pending; - - ////////////////// - // Match Finder // - ////////////////// - - /// Find matches. Returns the number of distance-length pairs written - /// to the matches array. This is called only via lzma_mf_find(). - uint32_t (*find)(lzma_mf *mf, lzma_match *matches); - - /// Skips num bytes. This is like find() but doesn't make the - /// distance-length pairs available, thus being a little faster. - /// This is called only via mf_skip(). - void (*skip)(lzma_mf *mf, uint32_t num); - - uint32_t *hash; - uint32_t *son; - uint32_t cyclic_pos; - uint32_t cyclic_size; // Must be dictionary size + 1. - uint32_t hash_mask; - - /// Maximum number of loops in the match finder - uint32_t depth; - - /// Maximum length of a match that the match finder will try to find. - uint32_t nice_len; - - /// Maximum length of a match supported by the LZ-based encoder. - /// If the longest match found by the match finder is nice_len, - /// mf_find() tries to expand it up to match_len_max bytes. - uint32_t match_len_max; - - /// When running out of input, binary tree match finders need to know - /// if it is due to flushing or finishing. The action is used also - /// by the LZ-based encoders themselves. - lzma_action action; - - /// Number of elements in hash[] - uint32_t hash_count; - - /// Number of elements in son[] - uint32_t sons_count; -}; - - -typedef struct { - /// Extra amount of data to keep available before the "actual" - /// dictionary. - size_t before_size; - - /// Size of the history buffer - size_t dict_size; - - /// Extra amount of data to keep available after the "actual" - /// dictionary. - size_t after_size; - - /// Maximum length of a match that the LZ-based encoder can accept. - /// This is used to extend matches of length nice_len to the - /// maximum possible length. - size_t match_len_max; - - /// Match finder will search matches up to this length. - /// This must be less than or equal to match_len_max. - size_t nice_len; - - /// Type of the match finder to use - lzma_match_finder match_finder; - - /// Maximum search depth - uint32_t depth; - - /// TODO: Comment - const uint8_t *preset_dict; - - uint32_t preset_dict_size; - -} lzma_lz_options; - - -// The total usable buffer space at any moment outside the match finder: -// before_size + dict_size + after_size + match_len_max -// -// In reality, there's some extra space allocated to prevent the number of -// memmove() calls reasonable. The bigger the dict_size is, the bigger -// this extra buffer will be since with bigger dictionaries memmove() would -// also take longer. -// -// A single encoder loop in the LZ-based encoder may call the match finder -// (mf_find() or mf_skip()) at most after_size times. In other words, -// a single encoder loop may increment lzma_mf.read_pos at most after_size -// times. Since matches are looked up to -// lzma_mf.buffer[lzma_mf.read_pos + match_len_max - 1], the total -// amount of extra buffer needed after dict_size becomes -// after_size + match_len_max. -// -// before_size has two uses. The first one is to keep literals available -// in cases when the LZ-based encoder has made some read ahead. -// TODO: Maybe this could be changed by making the LZ-based encoders to -// store the actual literals as they do with length-distance pairs. -// -// Algorithms such as LZMA2 first try to compress a chunk, and then check -// if the encoded result is smaller than the uncompressed one. If the chunk -// was uncompressible, it is better to store it in uncompressed form in -// the output stream. To do this, the whole uncompressed chunk has to be -// still available in the history buffer. before_size achieves that. - - -typedef struct { - /// Data specific to the LZ-based encoder - void *coder; - - /// Function to encode from *dict to out[] - lzma_ret (*code)(void *coder, - lzma_mf *restrict mf, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size); - - /// Free allocated resources - void (*end)(void *coder, const lzma_allocator *allocator); - - /// Update the options in the middle of the encoding. - lzma_ret (*options_update)(void *coder, const lzma_filter *filter); - -} lzma_lz_encoder; - - -// Basic steps: -// 1. Input gets copied into the dictionary. -// 2. Data in dictionary gets run through the match finder byte by byte. -// 3. The literals and matches are encoded using e.g. LZMA. -// -// The bytes that have been ran through the match finder, but not encoded yet, -// are called `read ahead'. - - -/// Get pointer to the first byte not ran through the match finder -static inline const uint8_t * -mf_ptr(const lzma_mf *mf) -{ - return mf->buffer + mf->read_pos; -} - - -/// Get the number of bytes that haven't been ran through the match finder yet. -static inline uint32_t -mf_avail(const lzma_mf *mf) -{ - return mf->write_pos - mf->read_pos; -} - - -/// Get the number of bytes that haven't been encoded yet (some of these -/// bytes may have been ran through the match finder though). -static inline uint32_t -mf_unencoded(const lzma_mf *mf) -{ - return mf->write_pos - mf->read_pos + mf->read_ahead; -} - - -/// Calculate the absolute offset from the beginning of the most recent -/// dictionary reset. Only the lowest four bits are important, so there's no -/// problem that we don't know the 64-bit size of the data encoded so far. -/// -/// NOTE: When moving the input window, we need to do it so that the lowest -/// bits of dict->read_pos are not modified to keep this macro working -/// as intended. -static inline uint32_t -mf_position(const lzma_mf *mf) -{ - return mf->read_pos - mf->read_ahead; -} - - -/// Since everything else begins with mf_, use it also for lzma_mf_find(). -#define mf_find lzma_mf_find - - -/// Skip the given number of bytes. This is used when a good match was found. -/// For example, if mf_find() finds a match of 200 bytes long, the first byte -/// of that match was already consumed by mf_find(), and the rest 199 bytes -/// have to be skipped with mf_skip(mf, 199). -static inline void -mf_skip(lzma_mf *mf, uint32_t amount) -{ - if (amount != 0) { - mf->skip(mf, amount); - mf->read_ahead += amount; - } -} - - -/// Copies at most *left number of bytes from the history buffer -/// to out[]. This is needed by LZMA2 to encode uncompressed chunks. -static inline void -mf_read(lzma_mf *mf, uint8_t *out, size_t *out_pos, size_t out_size, - size_t *left) -{ - const size_t out_avail = out_size - *out_pos; - const size_t copy_size = my_min(out_avail, *left); - - assert(mf->read_ahead == 0); - assert(mf->read_pos >= *left); - - memcpy(out + *out_pos, mf->buffer + mf->read_pos - *left, - copy_size); - - *out_pos += copy_size; - *left -= copy_size; - return; -} - - -extern lzma_ret lzma_lz_encoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters, - lzma_ret (*lz_init)(lzma_lz_encoder *lz, - const lzma_allocator *allocator, const void *options, - lzma_lz_options *lz_options)); - - -extern uint64_t lzma_lz_encoder_memusage(const lzma_lz_options *lz_options); - - -// These are only for LZ encoder's internal use. -extern uint32_t lzma_mf_find( - lzma_mf *mf, uint32_t *count, lzma_match *matches); - -extern uint32_t lzma_mf_hc3_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_hc3_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_hc4_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_hc4_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_bt2_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_bt2_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_bt3_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_bt3_skip(lzma_mf *dict, uint32_t amount); - -extern uint32_t lzma_mf_bt4_find(lzma_mf *dict, lzma_match *matches); -extern void lzma_mf_bt4_skip(lzma_mf *dict, uint32_t amount); - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash.h b/game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash.h deleted file mode 100755 index 342a333d..00000000 --- a/game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash.h +++ /dev/null @@ -1,108 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder_hash.h -/// \brief Hash macros for match finders -// -// Author: Igor Pavlov -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZ_ENCODER_HASH_H -#define LZMA_LZ_ENCODER_HASH_H - -#if defined(WORDS_BIGENDIAN) && !defined(HAVE_SMALL) - // This is to make liblzma produce the same output on big endian - // systems that it does on little endian systems. lz_encoder.c - // takes care of including the actual table. - extern const uint32_t lzma_lz_hash_table[256]; -# define hash_table lzma_lz_hash_table -#else -# include "check.h" -# define hash_table lzma_crc32_table[0] -#endif - -#define HASH_2_SIZE (UINT32_C(1) << 10) -#define HASH_3_SIZE (UINT32_C(1) << 16) -#define HASH_4_SIZE (UINT32_C(1) << 20) - -#define HASH_2_MASK (HASH_2_SIZE - 1) -#define HASH_3_MASK (HASH_3_SIZE - 1) -#define HASH_4_MASK (HASH_4_SIZE - 1) - -#define FIX_3_HASH_SIZE (HASH_2_SIZE) -#define FIX_4_HASH_SIZE (HASH_2_SIZE + HASH_3_SIZE) -#define FIX_5_HASH_SIZE (HASH_2_SIZE + HASH_3_SIZE + HASH_4_SIZE) - -// Endianness doesn't matter in hash_2_calc() (no effect on the output). -#ifdef TUKLIB_FAST_UNALIGNED_ACCESS -# define hash_2_calc() \ - const uint32_t hash_value = *(const uint16_t *)(cur) -#else -# define hash_2_calc() \ - const uint32_t hash_value \ - = (uint32_t)(cur[0]) | ((uint32_t)(cur[1]) << 8) -#endif - -#define hash_3_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & mf->hash_mask - -#define hash_4_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ - const uint32_t hash_value = (temp ^ ((uint32_t)(cur[2]) << 8) \ - ^ (hash_table[cur[3]] << 5)) & mf->hash_mask - - -// The following are not currently used. - -#define hash_5_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ - uint32_t hash_4_value = (temp ^ ((uint32_t)(cur[2]) << 8) ^ \ - ^ hash_table[cur[3]] << 5); \ - const uint32_t hash_value \ - = (hash_4_value ^ (hash_table[cur[4]] << 3)) \ - & mf->hash_mask; \ - hash_4_value &= HASH_4_MASK - -/* -#define hash_zip_calc() \ - const uint32_t hash_value \ - = (((uint32_t)(cur[0]) | ((uint32_t)(cur[1]) << 8)) \ - ^ hash_table[cur[2]]) & 0xFFFF -*/ - -#define hash_zip_calc() \ - const uint32_t hash_value \ - = (((uint32_t)(cur[2]) | ((uint32_t)(cur[0]) << 8)) \ - ^ hash_table[cur[1]]) & 0xFFFF - -#define mt_hash_2_calc() \ - const uint32_t hash_2_value \ - = (hash_table[cur[0]] ^ cur[1]) & HASH_2_MASK - -#define mt_hash_3_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK - -#define mt_hash_4_calc() \ - const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ - const uint32_t hash_2_value = temp & HASH_2_MASK; \ - const uint32_t hash_3_value \ - = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ - const uint32_t hash_4_value = (temp ^ ((uint32_t)(cur[2]) << 8) ^ \ - (hash_table[cur[3]] << 5)) & HASH_4_MASK - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash_table.h b/game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash_table.h deleted file mode 100755 index 8c51717d..00000000 --- a/game/client/third/minizip/lib/liblzma/lz/lz_encoder_hash_table.h +++ /dev/null @@ -1,68 +0,0 @@ -/* This file has been automatically generated by crc32_tablegen.c. */ - -const uint32_t lzma_lz_hash_table[256] = { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D -}; diff --git a/game/client/third/minizip/lib/liblzma/lz/lz_encoder_mf.c b/game/client/third/minizip/lib/liblzma/lz/lz_encoder_mf.c deleted file mode 100755 index 78520779..00000000 --- a/game/client/third/minizip/lib/liblzma/lz/lz_encoder_mf.c +++ /dev/null @@ -1,744 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lz_encoder_mf.c -/// \brief Match finders -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lz_encoder.h" -#include "lz_encoder_hash.h" -#include "memcmplen.h" - - -/// \brief Find matches starting from the current byte -/// -/// \return The length of the longest match found -extern uint32_t -lzma_mf_find(lzma_mf *mf, uint32_t *count_ptr, lzma_match *matches) -{ - // Call the match finder. It returns the number of length-distance - // pairs found. - // FIXME: Minimum count is zero, what _exactly_ is the maximum? - const uint32_t count = mf->find(mf, matches); - - // Length of the longest match; assume that no matches were found - // and thus the maximum length is zero. - uint32_t len_best = 0; - - if (count > 0) { -#ifndef NDEBUG - // Validate the matches. - for (uint32_t i = 0; i < count; ++i) { - assert(matches[i].len <= mf->nice_len); - assert(matches[i].dist < mf->read_pos); - assert(memcmp(mf_ptr(mf) - 1, - mf_ptr(mf) - matches[i].dist - 2, - matches[i].len) == 0); - } -#endif - - // The last used element in the array contains - // the longest match. - len_best = matches[count - 1].len; - - // If a match of maximum search length was found, try to - // extend the match to maximum possible length. - if (len_best == mf->nice_len) { - // The limit for the match length is either the - // maximum match length supported by the LZ-based - // encoder or the number of bytes left in the - // dictionary, whichever is smaller. - uint32_t limit = mf_avail(mf) + 1; - if (limit > mf->match_len_max) - limit = mf->match_len_max; - - // Pointer to the byte we just ran through - // the match finder. - const uint8_t *p1 = mf_ptr(mf) - 1; - - // Pointer to the beginning of the match. We need -1 - // here because the match distances are zero based. - const uint8_t *p2 = p1 - matches[count - 1].dist - 1; - - len_best = lzma_memcmplen(p1, p2, len_best, limit); - } - } - - *count_ptr = count; - - // Finally update the read position to indicate that match finder was - // run for this dictionary offset. - ++mf->read_ahead; - - return len_best; -} - - -/// Hash value to indicate unused element in the hash. Since we start the -/// positions from dict_size + 1, zero is always too far to qualify -/// as usable match position. -#define EMPTY_HASH_VALUE 0 - - -/// Normalization must be done when lzma_mf.offset + lzma_mf.read_pos -/// reaches MUST_NORMALIZE_POS. -#define MUST_NORMALIZE_POS UINT32_MAX - - -/// \brief Normalizes hash values -/// -/// The hash arrays store positions of match candidates. The positions are -/// relative to an arbitrary offset that is not the same as the absolute -/// offset in the input stream. The relative position of the current byte -/// is lzma_mf.offset + lzma_mf.read_pos. The distances of the matches are -/// the differences of the current read position and the position found from -/// the hash. -/// -/// To prevent integer overflows of the offsets stored in the hash arrays, -/// we need to "normalize" the stored values now and then. During the -/// normalization, we drop values that indicate distance greater than the -/// dictionary size, thus making space for new values. -static void -normalize(lzma_mf *mf) -{ - assert(mf->read_pos + mf->offset == MUST_NORMALIZE_POS); - - // In future we may not want to touch the lowest bits, because there - // may be match finders that use larger resolution than one byte. - const uint32_t subvalue - = (MUST_NORMALIZE_POS - mf->cyclic_size); - // & (~(UINT32_C(1) << 10) - 1); - - for (uint32_t i = 0; i < mf->hash_count; ++i) { - // If the distance is greater than the dictionary size, - // we can simply mark the hash element as empty. - if (mf->hash[i] <= subvalue) - mf->hash[i] = EMPTY_HASH_VALUE; - else - mf->hash[i] -= subvalue; - } - - for (uint32_t i = 0; i < mf->sons_count; ++i) { - // Do the same for mf->son. - // - // NOTE: There may be uninitialized elements in mf->son. - // Valgrind may complain that the "if" below depends on - // an uninitialized value. In this case it is safe to ignore - // the warning. See also the comments in lz_encoder_init() - // in lz_encoder.c. - if (mf->son[i] <= subvalue) - mf->son[i] = EMPTY_HASH_VALUE; - else - mf->son[i] -= subvalue; - } - - // Update offset to match the new locations. - mf->offset -= subvalue; - - return; -} - - -/// Mark the current byte as processed from point of view of the match finder. -static void -move_pos(lzma_mf *mf) -{ - if (++mf->cyclic_pos == mf->cyclic_size) - mf->cyclic_pos = 0; - - ++mf->read_pos; - assert(mf->read_pos <= mf->write_pos); - - if (unlikely(mf->read_pos + mf->offset == UINT32_MAX)) - normalize(mf); -} - - -/// When flushing, we cannot run the match finder unless there is nice_len -/// bytes available in the dictionary. Instead, we skip running the match -/// finder (indicating that no match was found), and count how many bytes we -/// have ignored this way. -/// -/// When new data is given after the flushing was completed, the match finder -/// is restarted by rewinding mf->read_pos backwards by mf->pending. Then -/// the missed bytes are added to the hash using the match finder's skip -/// function (with small amount of input, it may start using mf->pending -/// again if flushing). -/// -/// Due to this rewinding, we don't touch cyclic_pos or test for -/// normalization. It will be done when the match finder's skip function -/// catches up after a flush. -static void -move_pending(lzma_mf *mf) -{ - ++mf->read_pos; - assert(mf->read_pos <= mf->write_pos); - ++mf->pending; -} - - -/// Calculate len_limit and determine if there is enough input to run -/// the actual match finder code. Sets up "cur" and "pos". This macro -/// is used by all find functions and binary tree skip functions. Hash -/// chain skip function doesn't need len_limit so a simpler code is used -/// in them. -#define header(is_bt, len_min, ret_op) \ - uint32_t len_limit = mf_avail(mf); \ - if (mf->nice_len <= len_limit) { \ - len_limit = mf->nice_len; \ - } else if (len_limit < (len_min) \ - || (is_bt && mf->action == LZMA_SYNC_FLUSH)) { \ - assert(mf->action != LZMA_RUN); \ - move_pending(mf); \ - ret_op; \ - } \ - const uint8_t *cur = mf_ptr(mf); \ - const uint32_t pos = mf->read_pos + mf->offset - - -/// Header for find functions. "return 0" indicates that zero matches -/// were found. -#define header_find(is_bt, len_min) \ - header(is_bt, len_min, return 0); \ - uint32_t matches_count = 0 - - -/// Header for a loop in a skip function. "continue" tells to skip the rest -/// of the code in the loop. -#define header_skip(is_bt, len_min) \ - header(is_bt, len_min, continue) - - -/// Calls hc_find_func() or bt_find_func() and calculates the total number -/// of matches found. Updates the dictionary position and returns the number -/// of matches found. -#define call_find(func, len_best) \ -do { \ - matches_count = func(len_limit, pos, cur, cur_match, mf->depth, \ - mf->son, mf->cyclic_pos, mf->cyclic_size, \ - matches + matches_count, len_best) \ - - matches; \ - move_pos(mf); \ - return matches_count; \ -} while (0) - - -//////////////// -// Hash Chain // -//////////////// - -#if defined(HAVE_MF_HC3) || defined(HAVE_MF_HC4) -/// -/// -/// \param len_limit Don't look for matches longer than len_limit. -/// \param pos lzma_mf.read_pos + lzma_mf.offset -/// \param cur Pointer to current byte (mf_ptr(mf)) -/// \param cur_match Start position of the current match candidate -/// \param depth Maximum length of the hash chain -/// \param son lzma_mf.son (contains the hash chain) -/// \param cyclic_pos -/// \param cyclic_size -/// \param matches Array to hold the matches. -/// \param len_best The length of the longest match found so far. -static lzma_match * -hc_find_func( - const uint32_t len_limit, - const uint32_t pos, - const uint8_t *const cur, - uint32_t cur_match, - uint32_t depth, - uint32_t *const son, - const uint32_t cyclic_pos, - const uint32_t cyclic_size, - lzma_match *matches, - uint32_t len_best) -{ - son[cyclic_pos] = cur_match; - - while (true) { - const uint32_t delta = pos - cur_match; - if (depth-- == 0 || delta >= cyclic_size) - return matches; - - const uint8_t *const pb = cur - delta; - cur_match = son[cyclic_pos - delta - + (delta > cyclic_pos ? cyclic_size : 0)]; - - if (pb[len_best] == cur[len_best] && pb[0] == cur[0]) { - uint32_t len = lzma_memcmplen(pb, cur, 1, len_limit); - - if (len_best < len) { - len_best = len; - matches->len = len; - matches->dist = delta - 1; - ++matches; - - if (len == len_limit) - return matches; - } - } - } -} - - -#define hc_find(len_best) \ - call_find(hc_find_func, len_best) - - -#define hc_skip() \ -do { \ - mf->son[mf->cyclic_pos] = cur_match; \ - move_pos(mf); \ -} while (0) - -#endif - - -#ifdef HAVE_MF_HC3 -extern uint32_t -lzma_mf_hc3_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(false, 3); - - hash_3_calc(); - - const uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t cur_match = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 2; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = lzma_memcmplen(cur - delta2, cur, - len_best, len_limit); - - matches[0].len = len_best; - matches[0].dist = delta2 - 1; - matches_count = 1; - - if (len_best == len_limit) { - hc_skip(); - return 1; // matches_count - } - } - - hc_find(len_best); -} - - -extern void -lzma_mf_hc3_skip(lzma_mf *mf, uint32_t amount) -{ - do { - if (mf_avail(mf) < 3) { - move_pending(mf); - continue; - } - - const uint8_t *cur = mf_ptr(mf); - const uint32_t pos = mf->read_pos + mf->offset; - - hash_3_calc(); - - const uint32_t cur_match - = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - hc_skip(); - - } while (--amount != 0); -} -#endif - - -#ifdef HAVE_MF_HC4 -extern uint32_t -lzma_mf_hc4_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(false, 4); - - hash_4_calc(); - - uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t delta3 - = pos - mf->hash[FIX_3_HASH_SIZE + hash_3_value]; - const uint32_t cur_match = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value ] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 1; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = 2; - matches[0].len = 2; - matches[0].dist = delta2 - 1; - matches_count = 1; - } - - if (delta2 != delta3 && delta3 < mf->cyclic_size - && *(cur - delta3) == *cur) { - len_best = 3; - matches[matches_count++].dist = delta3 - 1; - delta2 = delta3; - } - - if (matches_count != 0) { - len_best = lzma_memcmplen(cur - delta2, cur, - len_best, len_limit); - - matches[matches_count - 1].len = len_best; - - if (len_best == len_limit) { - hc_skip(); - return matches_count; - } - } - - if (len_best < 3) - len_best = 3; - - hc_find(len_best); -} - - -extern void -lzma_mf_hc4_skip(lzma_mf *mf, uint32_t amount) -{ - do { - if (mf_avail(mf) < 4) { - move_pending(mf); - continue; - } - - const uint8_t *cur = mf_ptr(mf); - const uint32_t pos = mf->read_pos + mf->offset; - - hash_4_calc(); - - const uint32_t cur_match - = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - hc_skip(); - - } while (--amount != 0); -} -#endif - - -///////////////// -// Binary Tree // -///////////////// - -#if defined(HAVE_MF_BT2) || defined(HAVE_MF_BT3) || defined(HAVE_MF_BT4) -static lzma_match * -bt_find_func( - const uint32_t len_limit, - const uint32_t pos, - const uint8_t *const cur, - uint32_t cur_match, - uint32_t depth, - uint32_t *const son, - const uint32_t cyclic_pos, - const uint32_t cyclic_size, - lzma_match *matches, - uint32_t len_best) -{ - uint32_t *ptr0 = son + (cyclic_pos << 1) + 1; - uint32_t *ptr1 = son + (cyclic_pos << 1); - - uint32_t len0 = 0; - uint32_t len1 = 0; - - while (true) { - const uint32_t delta = pos - cur_match; - if (depth-- == 0 || delta >= cyclic_size) { - *ptr0 = EMPTY_HASH_VALUE; - *ptr1 = EMPTY_HASH_VALUE; - return matches; - } - - uint32_t *const pair = son + ((cyclic_pos - delta - + (delta > cyclic_pos ? cyclic_size : 0)) - << 1); - - const uint8_t *const pb = cur - delta; - uint32_t len = my_min(len0, len1); - - if (pb[len] == cur[len]) { - len = lzma_memcmplen(pb, cur, len + 1, len_limit); - - if (len_best < len) { - len_best = len; - matches->len = len; - matches->dist = delta - 1; - ++matches; - - if (len == len_limit) { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - return matches; - } - } - } - - if (pb[len] < cur[len]) { - *ptr1 = cur_match; - ptr1 = pair + 1; - cur_match = *ptr1; - len1 = len; - } else { - *ptr0 = cur_match; - ptr0 = pair; - cur_match = *ptr0; - len0 = len; - } - } -} - - -static void -bt_skip_func( - const uint32_t len_limit, - const uint32_t pos, - const uint8_t *const cur, - uint32_t cur_match, - uint32_t depth, - uint32_t *const son, - const uint32_t cyclic_pos, - const uint32_t cyclic_size) -{ - uint32_t *ptr0 = son + (cyclic_pos << 1) + 1; - uint32_t *ptr1 = son + (cyclic_pos << 1); - - uint32_t len0 = 0; - uint32_t len1 = 0; - - while (true) { - const uint32_t delta = pos - cur_match; - if (depth-- == 0 || delta >= cyclic_size) { - *ptr0 = EMPTY_HASH_VALUE; - *ptr1 = EMPTY_HASH_VALUE; - return; - } - - uint32_t *pair = son + ((cyclic_pos - delta - + (delta > cyclic_pos ? cyclic_size : 0)) - << 1); - const uint8_t *pb = cur - delta; - uint32_t len = my_min(len0, len1); - - if (pb[len] == cur[len]) { - len = lzma_memcmplen(pb, cur, len + 1, len_limit); - - if (len == len_limit) { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - return; - } - } - - if (pb[len] < cur[len]) { - *ptr1 = cur_match; - ptr1 = pair + 1; - cur_match = *ptr1; - len1 = len; - } else { - *ptr0 = cur_match; - ptr0 = pair; - cur_match = *ptr0; - len0 = len; - } - } -} - - -#define bt_find(len_best) \ - call_find(bt_find_func, len_best) - -#define bt_skip() \ -do { \ - bt_skip_func(len_limit, pos, cur, cur_match, mf->depth, \ - mf->son, mf->cyclic_pos, \ - mf->cyclic_size); \ - move_pos(mf); \ -} while (0) - -#endif - - -#ifdef HAVE_MF_BT2 -extern uint32_t -lzma_mf_bt2_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(true, 2); - - hash_2_calc(); - - const uint32_t cur_match = mf->hash[hash_value]; - mf->hash[hash_value] = pos; - - bt_find(1); -} - - -extern void -lzma_mf_bt2_skip(lzma_mf *mf, uint32_t amount) -{ - do { - header_skip(true, 2); - - hash_2_calc(); - - const uint32_t cur_match = mf->hash[hash_value]; - mf->hash[hash_value] = pos; - - bt_skip(); - - } while (--amount != 0); -} -#endif - - -#ifdef HAVE_MF_BT3 -extern uint32_t -lzma_mf_bt3_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(true, 3); - - hash_3_calc(); - - const uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t cur_match = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 2; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = lzma_memcmplen( - cur, cur - delta2, len_best, len_limit); - - matches[0].len = len_best; - matches[0].dist = delta2 - 1; - matches_count = 1; - - if (len_best == len_limit) { - bt_skip(); - return 1; // matches_count - } - } - - bt_find(len_best); -} - - -extern void -lzma_mf_bt3_skip(lzma_mf *mf, uint32_t amount) -{ - do { - header_skip(true, 3); - - hash_3_calc(); - - const uint32_t cur_match - = mf->hash[FIX_3_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_value] = pos; - - bt_skip(); - - } while (--amount != 0); -} -#endif - - -#ifdef HAVE_MF_BT4 -extern uint32_t -lzma_mf_bt4_find(lzma_mf *mf, lzma_match *matches) -{ - header_find(true, 4); - - hash_4_calc(); - - uint32_t delta2 = pos - mf->hash[hash_2_value]; - const uint32_t delta3 - = pos - mf->hash[FIX_3_HASH_SIZE + hash_3_value]; - const uint32_t cur_match = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - uint32_t len_best = 1; - - if (delta2 < mf->cyclic_size && *(cur - delta2) == *cur) { - len_best = 2; - matches[0].len = 2; - matches[0].dist = delta2 - 1; - matches_count = 1; - } - - if (delta2 != delta3 && delta3 < mf->cyclic_size - && *(cur - delta3) == *cur) { - len_best = 3; - matches[matches_count++].dist = delta3 - 1; - delta2 = delta3; - } - - if (matches_count != 0) { - len_best = lzma_memcmplen( - cur, cur - delta2, len_best, len_limit); - - matches[matches_count - 1].len = len_best; - - if (len_best == len_limit) { - bt_skip(); - return matches_count; - } - } - - if (len_best < 3) - len_best = 3; - - bt_find(len_best); -} - - -extern void -lzma_mf_bt4_skip(lzma_mf *mf, uint32_t amount) -{ - do { - header_skip(true, 4); - - hash_4_calc(); - - const uint32_t cur_match - = mf->hash[FIX_4_HASH_SIZE + hash_value]; - - mf->hash[hash_2_value] = pos; - mf->hash[FIX_3_HASH_SIZE + hash_3_value] = pos; - mf->hash[FIX_4_HASH_SIZE + hash_value] = pos; - - bt_skip(); - - } while (--amount != 0); -} -#endif diff --git a/game/client/third/minizip/lib/liblzma/lzma/fastpos.h b/game/client/third/minizip/lib/liblzma/lzma/fastpos.h deleted file mode 100755 index a3feea58..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/fastpos.h +++ /dev/null @@ -1,141 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file fastpos.h -/// \brief Kind of two-bit version of bit scan reverse -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_FASTPOS_H -#define LZMA_FASTPOS_H - -// LZMA encodes match distances by storing the highest two bits using -// a six-bit value [0, 63], and then the missing lower bits. -// Dictionary size is also stored using this encoding in the .xz -// file format header. -// -// fastpos.h provides a way to quickly find out the correct six-bit -// values. The following table gives some examples of this encoding: -// -// dist return -// 0 0 -// 1 1 -// 2 2 -// 3 3 -// 4 4 -// 5 4 -// 6 5 -// 7 5 -// 8 6 -// 11 6 -// 12 7 -// ... ... -// 15 7 -// 16 8 -// 17 8 -// ... ... -// 23 8 -// 24 9 -// 25 9 -// ... ... -// -// -// Provided functions or macros -// ---------------------------- -// -// get_dist_slot(dist) is the basic version. get_dist_slot_2(dist) -// assumes that dist >= FULL_DISTANCES, thus the result is at least -// FULL_DISTANCES_BITS * 2. Using get_dist_slot(dist) instead of -// get_dist_slot_2(dist) would give the same result, but get_dist_slot_2(dist) -// should be tiny bit faster due to the assumption being made. -// -// -// Size vs. speed -// -------------- -// -// With some CPUs that have fast BSR (bit scan reverse) instruction, the -// size optimized version is slightly faster than the bigger table based -// approach. Such CPUs include Intel Pentium Pro, Pentium II, Pentium III -// and Core 2 (possibly others). AMD K7 seems to have slower BSR, but that -// would still have speed roughly comparable to the table version. Older -// x86 CPUs like the original Pentium have very slow BSR; on those systems -// the table version is a lot faster. -// -// On some CPUs, the table version is a lot faster when using position -// dependent code, but with position independent code the size optimized -// version is slightly faster. This occurs at least on 32-bit SPARC (no -// ASM optimizations). -// -// I'm making the table version the default, because that has good speed -// on all systems I have tried. The size optimized version is sometimes -// slightly faster, but sometimes it is a lot slower. - -#ifdef HAVE_SMALL -# define get_dist_slot(dist) \ - ((dist) <= 4 ? (dist) : get_dist_slot_2(dist)) - -static inline uint32_t -get_dist_slot_2(uint32_t dist) -{ - const uint32_t i = bsr32(dist); - return (i + i) + ((dist >> (i - 1)) & 1); -} - - -#else - -#define FASTPOS_BITS 13 - -extern const uint8_t lzma_fastpos[1 << FASTPOS_BITS]; - - -#define fastpos_shift(extra, n) \ - ((extra) + (n) * (FASTPOS_BITS - 1)) - -#define fastpos_limit(extra, n) \ - (UINT32_C(1) << (FASTPOS_BITS + fastpos_shift(extra, n))) - -#define fastpos_result(dist, extra, n) \ - lzma_fastpos[(dist) >> fastpos_shift(extra, n)] \ - + 2 * fastpos_shift(extra, n) - - -static inline uint32_t -get_dist_slot(uint32_t dist) -{ - // If it is small enough, we can pick the result directly from - // the precalculated table. - if (dist < fastpos_limit(0, 0)) - return lzma_fastpos[dist]; - - if (dist < fastpos_limit(0, 1)) - return fastpos_result(dist, 0, 1); - - return fastpos_result(dist, 0, 2); -} - - -#ifdef FULL_DISTANCES_BITS -static inline uint32_t -get_dist_slot_2(uint32_t dist) -{ - assert(dist >= FULL_DISTANCES); - - if (dist < fastpos_limit(FULL_DISTANCES_BITS - 1, 0)) - return fastpos_result(dist, FULL_DISTANCES_BITS - 1, 0); - - if (dist < fastpos_limit(FULL_DISTANCES_BITS - 1, 1)) - return fastpos_result(dist, FULL_DISTANCES_BITS - 1, 1); - - return fastpos_result(dist, FULL_DISTANCES_BITS - 1, 2); -} -#endif - -#endif - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lzma/fastpos_table.c b/game/client/third/minizip/lib/liblzma/lzma/fastpos_table.c deleted file mode 100755 index 6a3ceac0..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/fastpos_table.c +++ /dev/null @@ -1,519 +0,0 @@ -/* This file has been automatically generated by fastpos_tablegen.c. */ - -#include "common.h" -#include "fastpos.h" - -const uint8_t lzma_fastpos[1 << FASTPOS_BITS] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25 -}; diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma2_encoder.h b/game/client/third/minizip/lib/liblzma/lzma/lzma2_encoder.h deleted file mode 100755 index 515f1839..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma2_encoder.h +++ /dev/null @@ -1,43 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma2_encoder.h -/// \brief LZMA2 encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA2_ENCODER_H -#define LZMA_LZMA2_ENCODER_H - -#include "common.h" - - -/// Maximum number of bytes of actual data per chunk (no headers) -#define LZMA2_CHUNK_MAX (UINT32_C(1) << 16) - -/// Maximum uncompressed size of LZMA chunk (no headers) -#define LZMA2_UNCOMPRESSED_MAX (UINT32_C(1) << 21) - -/// Maximum size of LZMA2 headers -#define LZMA2_HEADER_MAX 6 - -/// Size of a header for uncompressed chunk -#define LZMA2_HEADER_UNCOMPRESSED 3 - - -extern lzma_ret lzma_lzma2_encoder_init( - lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern uint64_t lzma_lzma2_encoder_memusage(const void *options); - -extern lzma_ret lzma_lzma2_props_encode(const void *options, uint8_t *out); - -extern uint64_t lzma_lzma2_block_size(const void *options); - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_common.h b/game/client/third/minizip/lib/liblzma/lzma/lzma_common.h deleted file mode 100755 index 09efd387..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_common.h +++ /dev/null @@ -1,224 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_common.h -/// \brief Private definitions common to LZMA encoder and decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_COMMON_H -#define LZMA_LZMA_COMMON_H - -#include "common.h" -#include "range_common.h" - - -/////////////////// -// Miscellaneous // -/////////////////// - -/// Maximum number of position states. A position state is the lowest pos bits -/// number of bits of the current uncompressed offset. In some places there -/// are different sets of probabilities for different pos states. -#define POS_STATES_MAX (1 << LZMA_PB_MAX) - - -/// Validates lc, lp, and pb. -static inline bool -is_lclppb_valid(const lzma_options_lzma *options) -{ - return options->lc <= LZMA_LCLP_MAX && options->lp <= LZMA_LCLP_MAX - && options->lc + options->lp <= LZMA_LCLP_MAX - && options->pb <= LZMA_PB_MAX; -} - - -/////////// -// State // -/////////// - -/// This enum is used to track which events have occurred most recently and -/// in which order. This information is used to predict the next event. -/// -/// Events: -/// - Literal: One 8-bit byte -/// - Match: Repeat a chunk of data at some distance -/// - Long repeat: Multi-byte match at a recently seen distance -/// - Short repeat: One-byte repeat at a recently seen distance -/// -/// The event names are in from STATE_oldest_older_previous. REP means -/// either short or long repeated match, and NONLIT means any non-literal. -typedef enum { - STATE_LIT_LIT, - STATE_MATCH_LIT_LIT, - STATE_REP_LIT_LIT, - STATE_SHORTREP_LIT_LIT, - STATE_MATCH_LIT, - STATE_REP_LIT, - STATE_SHORTREP_LIT, - STATE_LIT_MATCH, - STATE_LIT_LONGREP, - STATE_LIT_SHORTREP, - STATE_NONLIT_MATCH, - STATE_NONLIT_REP, -} lzma_lzma_state; - - -/// Total number of states -#define STATES 12 - -/// The lowest 7 states indicate that the previous state was a literal. -#define LIT_STATES 7 - - -/// Indicate that the latest state was a literal. -#define update_literal(state) \ - state = ((state) <= STATE_SHORTREP_LIT_LIT \ - ? STATE_LIT_LIT \ - : ((state) <= STATE_LIT_SHORTREP \ - ? (state) - 3 \ - : (state) - 6)) - -/// Indicate that the latest state was a match. -#define update_match(state) \ - state = ((state) < LIT_STATES ? STATE_LIT_MATCH : STATE_NONLIT_MATCH) - -/// Indicate that the latest state was a long repeated match. -#define update_long_rep(state) \ - state = ((state) < LIT_STATES ? STATE_LIT_LONGREP : STATE_NONLIT_REP) - -/// Indicate that the latest state was a short match. -#define update_short_rep(state) \ - state = ((state) < LIT_STATES ? STATE_LIT_SHORTREP : STATE_NONLIT_REP) - -/// Test if the previous state was a literal. -#define is_literal_state(state) \ - ((state) < LIT_STATES) - - -///////////// -// Literal // -///////////// - -/// Each literal coder is divided in three sections: -/// - 0x001-0x0FF: Without match byte -/// - 0x101-0x1FF: With match byte; match bit is 0 -/// - 0x201-0x2FF: With match byte; match bit is 1 -/// -/// Match byte is used when the previous LZMA symbol was something else than -/// a literal (that is, it was some kind of match). -#define LITERAL_CODER_SIZE 0x300 - -/// Maximum number of literal coders -#define LITERAL_CODERS_MAX (1 << LZMA_LCLP_MAX) - -/// Locate the literal coder for the next literal byte. The choice depends on -/// - the lowest literal_pos_bits bits of the position of the current -/// byte; and -/// - the highest literal_context_bits bits of the previous byte. -#define literal_subcoder(probs, lc, lp_mask, pos, prev_byte) \ - ((probs)[(((pos) & lp_mask) << lc) + ((prev_byte) >> (8 - lc))]) - - -static inline void -literal_init(probability (*probs)[LITERAL_CODER_SIZE], - uint32_t lc, uint32_t lp) -{ - assert(lc + lp <= LZMA_LCLP_MAX); - - const uint32_t coders = 1U << (lc + lp); - - for (uint32_t i = 0; i < coders; ++i) - for (uint32_t j = 0; j < LITERAL_CODER_SIZE; ++j) - bit_reset(probs[i][j]); - - return; -} - - -////////////////// -// Match length // -////////////////// - -// Minimum length of a match is two bytes. -#define MATCH_LEN_MIN 2 - -// Match length is encoded with 4, 5, or 10 bits. -// -// Length Bits -// 2-9 4 = Choice=0 + 3 bits -// 10-17 5 = Choice=1 + Choice2=0 + 3 bits -// 18-273 10 = Choice=1 + Choice2=1 + 8 bits -#define LEN_LOW_BITS 3 -#define LEN_LOW_SYMBOLS (1 << LEN_LOW_BITS) -#define LEN_MID_BITS 3 -#define LEN_MID_SYMBOLS (1 << LEN_MID_BITS) -#define LEN_HIGH_BITS 8 -#define LEN_HIGH_SYMBOLS (1 << LEN_HIGH_BITS) -#define LEN_SYMBOLS (LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS + LEN_HIGH_SYMBOLS) - -// Maximum length of a match is 273 which is a result of the encoding -// described above. -#define MATCH_LEN_MAX (MATCH_LEN_MIN + LEN_SYMBOLS - 1) - - -//////////////////// -// Match distance // -//////////////////// - -// Different sets of probabilities are used for match distances that have very -// short match length: Lengths of 2, 3, and 4 bytes have a separate set of -// probabilities for each length. The matches with longer length use a shared -// set of probabilities. -#define DIST_STATES 4 - -// Macro to get the index of the appropriate probability array. -#define get_dist_state(len) \ - ((len) < DIST_STATES + MATCH_LEN_MIN \ - ? (len) - MATCH_LEN_MIN \ - : DIST_STATES - 1) - -// The highest two bits of a match distance (distance slot) are encoded -// using six bits. See fastpos.h for more explanation. -#define DIST_SLOT_BITS 6 -#define DIST_SLOTS (1 << DIST_SLOT_BITS) - -// Match distances up to 127 are fully encoded using probabilities. Since -// the highest two bits (distance slot) are always encoded using six bits, -// the distances 0-3 don't need any additional bits to encode, since the -// distance slot itself is the same as the actual distance. DIST_MODEL_START -// indicates the first distance slot where at least one additional bit is -// needed. -#define DIST_MODEL_START 4 - -// Match distances greater than 127 are encoded in three pieces: -// - distance slot: the highest two bits -// - direct bits: 2-26 bits below the highest two bits -// - alignment bits: four lowest bits -// -// Direct bits don't use any probabilities. -// -// The distance slot value of 14 is for distances 128-191 (see the table in -// fastpos.h to understand why). -#define DIST_MODEL_END 14 - -// Distance slots that indicate a distance <= 127. -#define FULL_DISTANCES_BITS (DIST_MODEL_END / 2) -#define FULL_DISTANCES (1 << FULL_DISTANCES_BITS) - -// For match distances greater than 127, only the highest two bits and the -// lowest four bits (alignment) is encoded using probabilities. -#define ALIGN_BITS 4 -#define ALIGN_SIZE (1 << ALIGN_BITS) -#define ALIGN_MASK (ALIGN_SIZE - 1) - -// LZMA remembers the four most recent match distances. Reusing these distances -// tends to take less space than re-encoding the actual distance value. -#define REPS 4 - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.c b/game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.c deleted file mode 100755 index eedc0733..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.c +++ /dev/null @@ -1,1058 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_decoder.c -/// \brief LZMA decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lz_decoder.h" -#include "lzma_common.h" -#include "lzma_decoder.h" -#include "range_decoder.h" - - -#ifdef HAVE_SMALL - -// Macros for (somewhat) size-optimized code. -#define seq_4(seq) seq - -#define seq_6(seq) seq - -#define seq_8(seq) seq - -#define seq_len(seq) \ - seq ## _CHOICE, \ - seq ## _CHOICE2, \ - seq ## _BITTREE - -#define len_decode(target, ld, pos_state, seq) \ -do { \ -case seq ## _CHOICE: \ - rc_if_0(ld.choice, seq ## _CHOICE) { \ - rc_update_0(ld.choice); \ - probs = ld.low[pos_state];\ - limit = LEN_LOW_SYMBOLS; \ - target = MATCH_LEN_MIN; \ - } else { \ - rc_update_1(ld.choice); \ -case seq ## _CHOICE2: \ - rc_if_0(ld.choice2, seq ## _CHOICE2) { \ - rc_update_0(ld.choice2); \ - probs = ld.mid[pos_state]; \ - limit = LEN_MID_SYMBOLS; \ - target = MATCH_LEN_MIN + LEN_LOW_SYMBOLS; \ - } else { \ - rc_update_1(ld.choice2); \ - probs = ld.high; \ - limit = LEN_HIGH_SYMBOLS; \ - target = MATCH_LEN_MIN + LEN_LOW_SYMBOLS \ - + LEN_MID_SYMBOLS; \ - } \ - } \ - symbol = 1; \ -case seq ## _BITTREE: \ - do { \ - rc_bit(probs[symbol], , , seq ## _BITTREE); \ - } while (symbol < limit); \ - target += symbol - limit; \ -} while (0) - -#else // HAVE_SMALL - -// Unrolled versions -#define seq_4(seq) \ - seq ## 0, \ - seq ## 1, \ - seq ## 2, \ - seq ## 3 - -#define seq_6(seq) \ - seq ## 0, \ - seq ## 1, \ - seq ## 2, \ - seq ## 3, \ - seq ## 4, \ - seq ## 5 - -#define seq_8(seq) \ - seq ## 0, \ - seq ## 1, \ - seq ## 2, \ - seq ## 3, \ - seq ## 4, \ - seq ## 5, \ - seq ## 6, \ - seq ## 7 - -#define seq_len(seq) \ - seq ## _CHOICE, \ - seq ## _LOW0, \ - seq ## _LOW1, \ - seq ## _LOW2, \ - seq ## _CHOICE2, \ - seq ## _MID0, \ - seq ## _MID1, \ - seq ## _MID2, \ - seq ## _HIGH0, \ - seq ## _HIGH1, \ - seq ## _HIGH2, \ - seq ## _HIGH3, \ - seq ## _HIGH4, \ - seq ## _HIGH5, \ - seq ## _HIGH6, \ - seq ## _HIGH7 - -#define len_decode(target, ld, pos_state, seq) \ -do { \ - symbol = 1; \ -case seq ## _CHOICE: \ - rc_if_0(ld.choice, seq ## _CHOICE) { \ - rc_update_0(ld.choice); \ - rc_bit_case(ld.low[pos_state][symbol], , , seq ## _LOW0); \ - rc_bit_case(ld.low[pos_state][symbol], , , seq ## _LOW1); \ - rc_bit_case(ld.low[pos_state][symbol], , , seq ## _LOW2); \ - target = symbol - LEN_LOW_SYMBOLS + MATCH_LEN_MIN; \ - } else { \ - rc_update_1(ld.choice); \ -case seq ## _CHOICE2: \ - rc_if_0(ld.choice2, seq ## _CHOICE2) { \ - rc_update_0(ld.choice2); \ - rc_bit_case(ld.mid[pos_state][symbol], , , \ - seq ## _MID0); \ - rc_bit_case(ld.mid[pos_state][symbol], , , \ - seq ## _MID1); \ - rc_bit_case(ld.mid[pos_state][symbol], , , \ - seq ## _MID2); \ - target = symbol - LEN_MID_SYMBOLS \ - + MATCH_LEN_MIN + LEN_LOW_SYMBOLS; \ - } else { \ - rc_update_1(ld.choice2); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH0); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH1); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH2); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH3); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH4); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH5); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH6); \ - rc_bit_case(ld.high[symbol], , , seq ## _HIGH7); \ - target = symbol - LEN_HIGH_SYMBOLS \ - + MATCH_LEN_MIN \ - + LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS; \ - } \ - } \ -} while (0) - -#endif // HAVE_SMALL - - -/// Length decoder probabilities; see comments in lzma_common.h. -typedef struct { - probability choice; - probability choice2; - probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS]; - probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS]; - probability high[LEN_HIGH_SYMBOLS]; -} lzma_length_decoder; - - -typedef struct { - /////////////////// - // Probabilities // - /////////////////// - - /// Literals; see comments in lzma_common.h. - probability literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE]; - - /// If 1, it's a match. Otherwise it's a single 8-bit literal. - probability is_match[STATES][POS_STATES_MAX]; - - /// If 1, it's a repeated match. The distance is one of rep0 .. rep3. - probability is_rep[STATES]; - - /// If 0, distance of a repeated match is rep0. - /// Otherwise check is_rep1. - probability is_rep0[STATES]; - - /// If 0, distance of a repeated match is rep1. - /// Otherwise check is_rep2. - probability is_rep1[STATES]; - - /// If 0, distance of a repeated match is rep2. Otherwise it is rep3. - probability is_rep2[STATES]; - - /// If 1, the repeated match has length of one byte. Otherwise - /// the length is decoded from rep_len_decoder. - probability is_rep0_long[STATES][POS_STATES_MAX]; - - /// Probability tree for the highest two bits of the match distance. - /// There is a separate probability tree for match lengths of - /// 2 (i.e. MATCH_LEN_MIN), 3, 4, and [5, 273]. - probability dist_slot[DIST_STATES][DIST_SLOTS]; - - /// Probability trees for additional bits for match distance when the - /// distance is in the range [4, 127]. - probability pos_special[FULL_DISTANCES - DIST_MODEL_END]; - - /// Probability tree for the lowest four bits of a match distance - /// that is equal to or greater than 128. - probability pos_align[ALIGN_SIZE]; - - /// Length of a normal match - lzma_length_decoder match_len_decoder; - - /// Length of a repeated match - lzma_length_decoder rep_len_decoder; - - /////////////////// - // Decoder state // - /////////////////// - - // Range coder - lzma_range_decoder rc; - - // Types of the most recently seen LZMA symbols - lzma_lzma_state state; - - uint32_t rep0; ///< Distance of the latest match - uint32_t rep1; ///< Distance of second latest match - uint32_t rep2; ///< Distance of third latest match - uint32_t rep3; ///< Distance of fourth latest match - - uint32_t pos_mask; // (1U << pb) - 1 - uint32_t literal_context_bits; - uint32_t literal_pos_mask; - - /// Uncompressed size as bytes, or LZMA_VLI_UNKNOWN if end of - /// payload marker is expected. - lzma_vli uncompressed_size; - - //////////////////////////////// - // State of incomplete symbol // - //////////////////////////////// - - /// Position where to continue the decoder loop - enum { - SEQ_NORMALIZE, - SEQ_IS_MATCH, - seq_8(SEQ_LITERAL), - seq_8(SEQ_LITERAL_MATCHED), - SEQ_LITERAL_WRITE, - SEQ_IS_REP, - seq_len(SEQ_MATCH_LEN), - seq_6(SEQ_DIST_SLOT), - SEQ_DIST_MODEL, - SEQ_DIRECT, - seq_4(SEQ_ALIGN), - SEQ_EOPM, - SEQ_IS_REP0, - SEQ_SHORTREP, - SEQ_IS_REP0_LONG, - SEQ_IS_REP1, - SEQ_IS_REP2, - seq_len(SEQ_REP_LEN), - SEQ_COPY, - } sequence; - - /// Base of the current probability tree - probability *probs; - - /// Symbol being decoded. This is also used as an index variable in - /// bittree decoders: probs[symbol] - uint32_t symbol; - - /// Used as a loop termination condition on bittree decoders and - /// direct bits decoder. - uint32_t limit; - - /// Matched literal decoder: 0x100 or 0 to help avoiding branches. - /// Bittree reverse decoders: Offset of the next bit: 1 << offset - uint32_t offset; - - /// If decoding a literal: match byte. - /// If decoding a match: length of the match. - uint32_t len; -} lzma_lzma1_decoder; - - -static lzma_ret -lzma_decode(void *coder_ptr, lzma_dict *restrict dictptr, - const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size) -{ - lzma_lzma1_decoder *restrict coder = coder_ptr; - - //////////////////// - // Initialization // - //////////////////// - - { - const lzma_ret ret = rc_read_init( - &coder->rc, in, in_pos, in_size); - if (ret != LZMA_STREAM_END) - return ret; - } - - /////////////// - // Variables // - /////////////// - - // Making local copies of often-used variables improves both - // speed and readability. - - lzma_dict dict = *dictptr; - - const size_t dict_start = dict.pos; - - // Range decoder - rc_to_local(coder->rc, *in_pos); - - // State - uint32_t state = coder->state; - uint32_t rep0 = coder->rep0; - uint32_t rep1 = coder->rep1; - uint32_t rep2 = coder->rep2; - uint32_t rep3 = coder->rep3; - - const uint32_t pos_mask = coder->pos_mask; - - // These variables are actually needed only if we last time ran - // out of input in the middle of the decoder loop. - probability *probs = coder->probs; - uint32_t symbol = coder->symbol; - uint32_t limit = coder->limit; - uint32_t offset = coder->offset; - uint32_t len = coder->len; - - const uint32_t literal_pos_mask = coder->literal_pos_mask; - const uint32_t literal_context_bits = coder->literal_context_bits; - - // Temporary variables - uint32_t pos_state = dict.pos & pos_mask; - - lzma_ret ret = LZMA_OK; - - // If uncompressed size is known, there must be no end of payload - // marker. - const bool no_eopm = coder->uncompressed_size - != LZMA_VLI_UNKNOWN; - if (no_eopm && coder->uncompressed_size < dict.limit - dict.pos) - dict.limit = dict.pos + (size_t)(coder->uncompressed_size); - - // The main decoder loop. The "switch" is used to restart the decoder at - // correct location. Once restarted, the "switch" is no longer used. - switch (coder->sequence) - while (true) { - // Calculate new pos_state. This is skipped on the first loop - // since we already calculated it when setting up the local - // variables. - pos_state = dict.pos & pos_mask; - - case SEQ_NORMALIZE: - case SEQ_IS_MATCH: - if (unlikely(no_eopm && dict.pos == dict.limit)) - break; - - rc_if_0(coder->is_match[state][pos_state], SEQ_IS_MATCH) { - rc_update_0(coder->is_match[state][pos_state]); - - // It's a literal i.e. a single 8-bit byte. - - probs = literal_subcoder(coder->literal, - literal_context_bits, literal_pos_mask, - dict.pos, dict_get(&dict, 0)); - symbol = 1; - - if (is_literal_state(state)) { - // Decode literal without match byte. -#ifdef HAVE_SMALL - case SEQ_LITERAL: - do { - rc_bit(probs[symbol], , , SEQ_LITERAL); - } while (symbol < (1 << 8)); -#else - rc_bit_case(probs[symbol], , , SEQ_LITERAL0); - rc_bit_case(probs[symbol], , , SEQ_LITERAL1); - rc_bit_case(probs[symbol], , , SEQ_LITERAL2); - rc_bit_case(probs[symbol], , , SEQ_LITERAL3); - rc_bit_case(probs[symbol], , , SEQ_LITERAL4); - rc_bit_case(probs[symbol], , , SEQ_LITERAL5); - rc_bit_case(probs[symbol], , , SEQ_LITERAL6); - rc_bit_case(probs[symbol], , , SEQ_LITERAL7); -#endif - } else { - // Decode literal with match byte. - // - // We store the byte we compare against - // ("match byte") to "len" to minimize the - // number of variables we need to store - // between decoder calls. - len = dict_get(&dict, rep0) << 1; - - // The usage of "offset" allows omitting some - // branches, which should give tiny speed - // improvement on some CPUs. "offset" gets - // set to zero if match_bit didn't match. - offset = 0x100; - -#ifdef HAVE_SMALL - case SEQ_LITERAL_MATCHED: - do { - const uint32_t match_bit - = len & offset; - const uint32_t subcoder_index - = offset + match_bit - + symbol; - - rc_bit(probs[subcoder_index], - offset &= ~match_bit, - offset &= match_bit, - SEQ_LITERAL_MATCHED); - - // It seems to be faster to do this - // here instead of putting it to the - // beginning of the loop and then - // putting the "case" in the middle - // of the loop. - len <<= 1; - - } while (symbol < (1 << 8)); -#else - // Unroll the loop. - uint32_t match_bit; - uint32_t subcoder_index; - -# define d(seq) \ - case seq: \ - match_bit = len & offset; \ - subcoder_index = offset + match_bit + symbol; \ - rc_bit(probs[subcoder_index], \ - offset &= ~match_bit, \ - offset &= match_bit, \ - seq) - - d(SEQ_LITERAL_MATCHED0); - len <<= 1; - d(SEQ_LITERAL_MATCHED1); - len <<= 1; - d(SEQ_LITERAL_MATCHED2); - len <<= 1; - d(SEQ_LITERAL_MATCHED3); - len <<= 1; - d(SEQ_LITERAL_MATCHED4); - len <<= 1; - d(SEQ_LITERAL_MATCHED5); - len <<= 1; - d(SEQ_LITERAL_MATCHED6); - len <<= 1; - d(SEQ_LITERAL_MATCHED7); -# undef d -#endif - } - - //update_literal(state); - // Use a lookup table to update to literal state, - // since compared to other state updates, this would - // need two branches. - static const lzma_lzma_state next_state[] = { - STATE_LIT_LIT, - STATE_LIT_LIT, - STATE_LIT_LIT, - STATE_LIT_LIT, - STATE_MATCH_LIT_LIT, - STATE_REP_LIT_LIT, - STATE_SHORTREP_LIT_LIT, - STATE_MATCH_LIT, - STATE_REP_LIT, - STATE_SHORTREP_LIT, - STATE_MATCH_LIT, - STATE_REP_LIT - }; - state = next_state[state]; - - case SEQ_LITERAL_WRITE: - if (unlikely(dict_put(&dict, symbol))) { - coder->sequence = SEQ_LITERAL_WRITE; - goto out; - } - - continue; - } - - // Instead of a new byte we are going to get a byte range - // (distance and length) which will be repeated from our - // output history. - - rc_update_1(coder->is_match[state][pos_state]); - - case SEQ_IS_REP: - rc_if_0(coder->is_rep[state], SEQ_IS_REP) { - // Not a repeated match - rc_update_0(coder->is_rep[state]); - update_match(state); - - // The latest three match distances are kept in - // memory in case there are repeated matches. - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - - // Decode the length of the match. - len_decode(len, coder->match_len_decoder, - pos_state, SEQ_MATCH_LEN); - - // Prepare to decode the highest two bits of the - // match distance. - probs = coder->dist_slot[get_dist_state(len)]; - symbol = 1; - -#ifdef HAVE_SMALL - case SEQ_DIST_SLOT: - do { - rc_bit(probs[symbol], , , SEQ_DIST_SLOT); - } while (symbol < DIST_SLOTS); -#else - rc_bit_case(probs[symbol], , , SEQ_DIST_SLOT0); - rc_bit_case(probs[symbol], , , SEQ_DIST_SLOT1); - rc_bit_case(probs[symbol], , , SEQ_DIST_SLOT2); - rc_bit_case(probs[symbol], , , SEQ_DIST_SLOT3); - rc_bit_case(probs[symbol], , , SEQ_DIST_SLOT4); - rc_bit_case(probs[symbol], , , SEQ_DIST_SLOT5); -#endif - // Get rid of the highest bit that was needed for - // indexing of the probability array. - symbol -= DIST_SLOTS; - assert(symbol <= 63); - - if (symbol < DIST_MODEL_START) { - // Match distances [0, 3] have only two bits. - rep0 = symbol; - } else { - // Decode the lowest [1, 29] bits of - // the match distance. - limit = (symbol >> 1) - 1; - assert(limit >= 1 && limit <= 30); - rep0 = 2 + (symbol & 1); - - if (symbol < DIST_MODEL_END) { - // Prepare to decode the low bits for - // a distance of [4, 127]. - assert(limit <= 5); - rep0 <<= limit; - assert(rep0 <= 96); - // -1 is fine, because we start - // decoding at probs[1], not probs[0]. - // NOTE: This violates the C standard, - // since we are doing pointer - // arithmetic past the beginning of - // the array. - assert((int32_t)(rep0 - symbol - 1) - >= -1); - assert((int32_t)(rep0 - symbol - 1) - <= 82); - probs = coder->pos_special + rep0 - - symbol - 1; - symbol = 1; - offset = 0; - case SEQ_DIST_MODEL: -#ifdef HAVE_SMALL - do { - rc_bit(probs[symbol], , - rep0 += 1 << offset, - SEQ_DIST_MODEL); - } while (++offset < limit); -#else - switch (limit) { - case 5: - assert(offset == 0); - rc_bit(probs[symbol], , - rep0 += 1, - SEQ_DIST_MODEL); - ++offset; - --limit; - case 4: - rc_bit(probs[symbol], , - rep0 += 1 << offset, - SEQ_DIST_MODEL); - ++offset; - --limit; - case 3: - rc_bit(probs[symbol], , - rep0 += 1 << offset, - SEQ_DIST_MODEL); - ++offset; - --limit; - case 2: - rc_bit(probs[symbol], , - rep0 += 1 << offset, - SEQ_DIST_MODEL); - ++offset; - --limit; - case 1: - // We need "symbol" only for - // indexing the probability - // array, thus we can use - // rc_bit_last() here to omit - // the unneeded updating of - // "symbol". - rc_bit_last(probs[symbol], , - rep0 += 1 << offset, - SEQ_DIST_MODEL); - } -#endif - } else { - // The distance is >= 128. Decode the - // lower bits without probabilities - // except the lowest four bits. - assert(symbol >= 14); - assert(limit >= 6); - limit -= ALIGN_BITS; - assert(limit >= 2); - case SEQ_DIRECT: - // Not worth manual unrolling - do { - rc_direct(rep0, SEQ_DIRECT); - } while (--limit > 0); - - // Decode the lowest four bits using - // probabilities. - rep0 <<= ALIGN_BITS; - symbol = 1; -#ifdef HAVE_SMALL - offset = 0; - case SEQ_ALIGN: - do { - rc_bit(coder->pos_align[ - symbol], , - rep0 += 1 << offset, - SEQ_ALIGN); - } while (++offset < ALIGN_BITS); -#else - case SEQ_ALIGN0: - rc_bit(coder->pos_align[symbol], , - rep0 += 1, SEQ_ALIGN0); - case SEQ_ALIGN1: - rc_bit(coder->pos_align[symbol], , - rep0 += 2, SEQ_ALIGN1); - case SEQ_ALIGN2: - rc_bit(coder->pos_align[symbol], , - rep0 += 4, SEQ_ALIGN2); - case SEQ_ALIGN3: - // Like in SEQ_DIST_MODEL, we don't - // need "symbol" for anything else - // than indexing the probability array. - rc_bit_last(coder->pos_align[symbol], , - rep0 += 8, SEQ_ALIGN3); -#endif - - if (rep0 == UINT32_MAX) { - // End of payload marker was - // found. It must not be - // present if uncompressed - // size is known. - if (coder->uncompressed_size - != LZMA_VLI_UNKNOWN) { - ret = LZMA_DATA_ERROR; - goto out; - } - - case SEQ_EOPM: - // LZMA1 stream with - // end-of-payload marker. - rc_normalize(SEQ_EOPM); - ret = LZMA_STREAM_END; - goto out; - } - } - } - - // Validate the distance we just decoded. - if (unlikely(!dict_is_distance_valid(&dict, rep0))) { - ret = LZMA_DATA_ERROR; - goto out; - } - - } else { - rc_update_1(coder->is_rep[state]); - - // Repeated match - // - // The match distance is a value that we have had - // earlier. The latest four match distances are - // available as rep0, rep1, rep2 and rep3. We will - // now decode which of them is the new distance. - // - // There cannot be a match if we haven't produced - // any output, so check that first. - if (unlikely(!dict_is_distance_valid(&dict, 0))) { - ret = LZMA_DATA_ERROR; - goto out; - } - - case SEQ_IS_REP0: - rc_if_0(coder->is_rep0[state], SEQ_IS_REP0) { - rc_update_0(coder->is_rep0[state]); - // The distance is rep0. - - case SEQ_IS_REP0_LONG: - rc_if_0(coder->is_rep0_long[state][pos_state], - SEQ_IS_REP0_LONG) { - rc_update_0(coder->is_rep0_long[ - state][pos_state]); - - update_short_rep(state); - - case SEQ_SHORTREP: - if (unlikely(dict_put(&dict, dict_get( - &dict, rep0)))) { - coder->sequence = SEQ_SHORTREP; - goto out; - } - - continue; - } - - // Repeating more than one byte at - // distance of rep0. - rc_update_1(coder->is_rep0_long[ - state][pos_state]); - - } else { - rc_update_1(coder->is_rep0[state]); - - case SEQ_IS_REP1: - // The distance is rep1, rep2 or rep3. Once - // we find out which one of these three, it - // is stored to rep0 and rep1, rep2 and rep3 - // are updated accordingly. - rc_if_0(coder->is_rep1[state], SEQ_IS_REP1) { - rc_update_0(coder->is_rep1[state]); - - const uint32_t distance = rep1; - rep1 = rep0; - rep0 = distance; - - } else { - rc_update_1(coder->is_rep1[state]); - case SEQ_IS_REP2: - rc_if_0(coder->is_rep2[state], - SEQ_IS_REP2) { - rc_update_0(coder->is_rep2[ - state]); - - const uint32_t distance = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance; - - } else { - rc_update_1(coder->is_rep2[ - state]); - - const uint32_t distance = rep3; - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance; - } - } - } - - update_long_rep(state); - - // Decode the length of the repeated match. - len_decode(len, coder->rep_len_decoder, - pos_state, SEQ_REP_LEN); - } - - ///////////////////////////////// - // Repeat from history buffer. // - ///////////////////////////////// - - // The length is always between these limits. There is no way - // to trigger the algorithm to set len outside this range. - assert(len >= MATCH_LEN_MIN); - assert(len <= MATCH_LEN_MAX); - - case SEQ_COPY: - // Repeat len bytes from distance of rep0. - if (unlikely(dict_repeat(&dict, rep0, &len))) { - coder->sequence = SEQ_COPY; - goto out; - } - } - - rc_normalize(SEQ_NORMALIZE); - coder->sequence = SEQ_IS_MATCH; - -out: - // Save state - - // NOTE: Must not copy dict.limit. - dictptr->pos = dict.pos; - dictptr->full = dict.full; - - rc_from_local(coder->rc, *in_pos); - - coder->state = state; - coder->rep0 = rep0; - coder->rep1 = rep1; - coder->rep2 = rep2; - coder->rep3 = rep3; - - coder->probs = probs; - coder->symbol = symbol; - coder->limit = limit; - coder->offset = offset; - coder->len = len; - - // Update the remaining amount of uncompressed data if uncompressed - // size was known. - if (coder->uncompressed_size != LZMA_VLI_UNKNOWN) { - coder->uncompressed_size -= dict.pos - dict_start; - - // Since there cannot be end of payload marker if the - // uncompressed size was known, we check here if we - // finished decoding. - if (coder->uncompressed_size == 0 && ret == LZMA_OK - && coder->sequence != SEQ_NORMALIZE) - ret = coder->sequence == SEQ_IS_MATCH - ? LZMA_STREAM_END : LZMA_DATA_ERROR; - } - - // We can do an additional check in the range decoder to catch some - // corrupted files. - if (ret == LZMA_STREAM_END) { - if (!rc_is_finished(coder->rc)) - ret = LZMA_DATA_ERROR; - - // Reset the range decoder so that it is ready to reinitialize - // for a new LZMA2 chunk. - rc_reset(coder->rc); - } - - return ret; -} - - - -static void -lzma_decoder_uncompressed(void *coder_ptr, lzma_vli uncompressed_size) -{ - lzma_lzma1_decoder *coder = coder_ptr; - coder->uncompressed_size = uncompressed_size; -} - - -static void -lzma_decoder_reset(void *coder_ptr, const void *opt) -{ - lzma_lzma1_decoder *coder = coder_ptr; - const lzma_options_lzma *options = opt; - - // NOTE: We assume that lc/lp/pb are valid since they were - // successfully decoded with lzma_lzma_decode_properties(). - - // Calculate pos_mask. We don't need pos_bits as is for anything. - coder->pos_mask = (1U << options->pb) - 1; - - // Initialize the literal decoder. - literal_init(coder->literal, options->lc, options->lp); - - coder->literal_context_bits = options->lc; - coder->literal_pos_mask = (1U << options->lp) - 1; - - // State - coder->state = STATE_LIT_LIT; - coder->rep0 = 0; - coder->rep1 = 0; - coder->rep2 = 0; - coder->rep3 = 0; - coder->pos_mask = (1U << options->pb) - 1; - - // Range decoder - rc_reset(coder->rc); - - // Bit and bittree decoders - for (uint32_t i = 0; i < STATES; ++i) { - for (uint32_t j = 0; j <= coder->pos_mask; ++j) { - bit_reset(coder->is_match[i][j]); - bit_reset(coder->is_rep0_long[i][j]); - } - - bit_reset(coder->is_rep[i]); - bit_reset(coder->is_rep0[i]); - bit_reset(coder->is_rep1[i]); - bit_reset(coder->is_rep2[i]); - } - - for (uint32_t i = 0; i < DIST_STATES; ++i) - bittree_reset(coder->dist_slot[i], DIST_SLOT_BITS); - - for (uint32_t i = 0; i < FULL_DISTANCES - DIST_MODEL_END; ++i) - bit_reset(coder->pos_special[i]); - - bittree_reset(coder->pos_align, ALIGN_BITS); - - // Len decoders (also bit/bittree) - const uint32_t num_pos_states = 1U << options->pb; - bit_reset(coder->match_len_decoder.choice); - bit_reset(coder->match_len_decoder.choice2); - bit_reset(coder->rep_len_decoder.choice); - bit_reset(coder->rep_len_decoder.choice2); - - for (uint32_t pos_state = 0; pos_state < num_pos_states; ++pos_state) { - bittree_reset(coder->match_len_decoder.low[pos_state], - LEN_LOW_BITS); - bittree_reset(coder->match_len_decoder.mid[pos_state], - LEN_MID_BITS); - - bittree_reset(coder->rep_len_decoder.low[pos_state], - LEN_LOW_BITS); - bittree_reset(coder->rep_len_decoder.mid[pos_state], - LEN_MID_BITS); - } - - bittree_reset(coder->match_len_decoder.high, LEN_HIGH_BITS); - bittree_reset(coder->rep_len_decoder.high, LEN_HIGH_BITS); - - coder->sequence = SEQ_IS_MATCH; - coder->probs = NULL; - coder->symbol = 0; - coder->limit = 0; - coder->offset = 0; - coder->len = 0; - - return; -} - - -extern lzma_ret -lzma_lzma_decoder_create(lzma_lz_decoder *lz, const lzma_allocator *allocator, - const void *opt, lzma_lz_options *lz_options) -{ - if (lz->coder == NULL) { - lz->coder = lzma_alloc(sizeof(lzma_lzma1_decoder), allocator); - if (lz->coder == NULL) - return LZMA_MEM_ERROR; - - lz->code = &lzma_decode; - lz->reset = &lzma_decoder_reset; - lz->set_uncompressed = &lzma_decoder_uncompressed; - } - - // All dictionary sizes are OK here. LZ decoder will take care of - // the special cases. - const lzma_options_lzma *options = opt; - lz_options->dict_size = options->dict_size; - lz_options->preset_dict = options->preset_dict; - lz_options->preset_dict_size = options->preset_dict_size; - - return LZMA_OK; -} - - -/// Allocate and initialize LZMA decoder. This is used only via LZ -/// initialization (lzma_lzma_decoder_init() passes function pointer to -/// the LZ initialization). -static lzma_ret -lzma_decoder_init(lzma_lz_decoder *lz, const lzma_allocator *allocator, - const void *options, lzma_lz_options *lz_options) -{ - if (!is_lclppb_valid(options)) - return LZMA_PROG_ERROR; - - return_if_error(lzma_lzma_decoder_create( - lz, allocator, options, lz_options)); - - lzma_decoder_reset(lz->coder, options); - lzma_decoder_uncompressed(lz->coder, LZMA_VLI_UNKNOWN); - - return LZMA_OK; -} - - -extern lzma_ret -lzma_lzma_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - // LZMA can only be the last filter in the chain. This is enforced - // by the raw_decoder initialization. - assert(filters[1].init == NULL); - - return lzma_lz_decoder_init(next, allocator, filters, - &lzma_decoder_init); -} - - -extern bool -lzma_lzma_lclppb_decode(lzma_options_lzma *options, uint8_t byte) -{ - if (byte > (4 * 5 + 4) * 9 + 8) - return true; - - // See the file format specification to understand this. - options->pb = byte / (9 * 5); - byte -= options->pb * 9 * 5; - options->lp = byte / 9; - options->lc = byte - options->lp * 9; - - return options->lc + options->lp > LZMA_LCLP_MAX; -} - - -extern uint64_t -lzma_lzma_decoder_memusage_nocheck(const void *options) -{ - const lzma_options_lzma *const opt = options; - return sizeof(lzma_lzma1_decoder) - + lzma_lz_decoder_memusage(opt->dict_size); -} - - -extern uint64_t -lzma_lzma_decoder_memusage(const void *options) -{ - if (!is_lclppb_valid(options)) - return UINT64_MAX; - - return lzma_lzma_decoder_memusage_nocheck(options); -} - - -extern lzma_ret -lzma_lzma_props_decode(void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size) -{ - if (props_size != 5) - return LZMA_OPTIONS_ERROR; - - lzma_options_lzma *opt - = lzma_alloc(sizeof(lzma_options_lzma), allocator); - if (opt == NULL) - return LZMA_MEM_ERROR; - - if (lzma_lzma_lclppb_decode(opt, props[0])) - goto error; - - // All dictionary sizes are accepted, including zero. LZ decoder - // will automatically use a dictionary at least a few KiB even if - // a smaller dictionary is requested. - opt->dict_size = unaligned_read32le(props + 1); - - opt->preset_dict = NULL; - opt->preset_dict_size = 0; - - *options = opt; - - return LZMA_OK; - -error: - lzma_free(opt, allocator); - return LZMA_OPTIONS_ERROR; -} diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.h b/game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.h deleted file mode 100755 index fa8ecb23..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_decoder.h +++ /dev/null @@ -1,53 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_decoder.h -/// \brief LZMA decoder API -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_DECODER_H -#define LZMA_LZMA_DECODER_H - -#include "common.h" - - -/// Allocates and initializes LZMA decoder -extern lzma_ret lzma_lzma_decoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - -extern uint64_t lzma_lzma_decoder_memusage(const void *options); - -extern lzma_ret lzma_lzma_props_decode( - void **options, const lzma_allocator *allocator, - const uint8_t *props, size_t props_size); - - -/// \brief Decodes the LZMA Properties byte (lc/lp/pb) -/// -/// \return true if error occurred, false on success -/// -extern bool lzma_lzma_lclppb_decode( - lzma_options_lzma *options, uint8_t byte); - - -#ifdef LZMA_LZ_DECODER_H -/// Allocate and setup function pointers only. This is used by LZMA1 and -/// LZMA2 decoders. -extern lzma_ret lzma_lzma_decoder_create( - lzma_lz_decoder *lz, const lzma_allocator *allocator, - const void *opt, lzma_lz_options *lz_options); - -/// Gets memory usage without validating lc/lp/pb. This is used by LZMA2 -/// decoder, because raw LZMA2 decoding doesn't need lc/lp/pb. -extern uint64_t lzma_lzma_decoder_memusage_nocheck(const void *options); - -#endif - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.c b/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.c deleted file mode 100755 index ba9ce698..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.c +++ /dev/null @@ -1,677 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder.c -/// \brief LZMA encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma2_encoder.h" -#include "lzma_encoder_private.h" -#include "fastpos.h" - - -///////////// -// Literal // -///////////// - -static inline void -literal_matched(lzma_range_encoder *rc, probability *subcoder, - uint32_t match_byte, uint32_t symbol) -{ - uint32_t offset = 0x100; - symbol += UINT32_C(1) << 8; - - do { - match_byte <<= 1; - const uint32_t match_bit = match_byte & offset; - const uint32_t subcoder_index - = offset + match_bit + (symbol >> 8); - const uint32_t bit = (symbol >> 7) & 1; - rc_bit(rc, &subcoder[subcoder_index], bit); - - symbol <<= 1; - offset &= ~(match_byte ^ symbol); - - } while (symbol < (UINT32_C(1) << 16)); -} - - -static inline void -literal(lzma_lzma1_encoder *coder, lzma_mf *mf, uint32_t position) -{ - // Locate the literal byte to be encoded and the subcoder. - const uint8_t cur_byte = mf->buffer[ - mf->read_pos - mf->read_ahead]; - probability *subcoder = literal_subcoder(coder->literal, - coder->literal_context_bits, coder->literal_pos_mask, - position, mf->buffer[mf->read_pos - mf->read_ahead - 1]); - - if (is_literal_state(coder->state)) { - // Previous LZMA-symbol was a literal. Encode a normal - // literal without a match byte. - rc_bittree(&coder->rc, subcoder, 8, cur_byte); - } else { - // Previous LZMA-symbol was a match. Use the last byte of - // the match as a "match byte". That is, compare the bits - // of the current literal and the match byte. - const uint8_t match_byte = mf->buffer[ - mf->read_pos - coder->reps[0] - 1 - - mf->read_ahead]; - literal_matched(&coder->rc, subcoder, match_byte, cur_byte); - } - - update_literal(coder->state); -} - - -////////////////// -// Match length // -////////////////// - -static void -length_update_prices(lzma_length_encoder *lc, const uint32_t pos_state) -{ - const uint32_t table_size = lc->table_size; - lc->counters[pos_state] = table_size; - - const uint32_t a0 = rc_bit_0_price(lc->choice); - const uint32_t a1 = rc_bit_1_price(lc->choice); - const uint32_t b0 = a1 + rc_bit_0_price(lc->choice2); - const uint32_t b1 = a1 + rc_bit_1_price(lc->choice2); - uint32_t *const prices = lc->prices[pos_state]; - - uint32_t i; - for (i = 0; i < table_size && i < LEN_LOW_SYMBOLS; ++i) - prices[i] = a0 + rc_bittree_price(lc->low[pos_state], - LEN_LOW_BITS, i); - - for (; i < table_size && i < LEN_LOW_SYMBOLS + LEN_MID_SYMBOLS; ++i) - prices[i] = b0 + rc_bittree_price(lc->mid[pos_state], - LEN_MID_BITS, i - LEN_LOW_SYMBOLS); - - for (; i < table_size; ++i) - prices[i] = b1 + rc_bittree_price(lc->high, LEN_HIGH_BITS, - i - LEN_LOW_SYMBOLS - LEN_MID_SYMBOLS); - - return; -} - - -static inline void -length(lzma_range_encoder *rc, lzma_length_encoder *lc, - const uint32_t pos_state, uint32_t len, const bool fast_mode) -{ - assert(len <= MATCH_LEN_MAX); - len -= MATCH_LEN_MIN; - - if (len < LEN_LOW_SYMBOLS) { - rc_bit(rc, &lc->choice, 0); - rc_bittree(rc, lc->low[pos_state], LEN_LOW_BITS, len); - } else { - rc_bit(rc, &lc->choice, 1); - len -= LEN_LOW_SYMBOLS; - - if (len < LEN_MID_SYMBOLS) { - rc_bit(rc, &lc->choice2, 0); - rc_bittree(rc, lc->mid[pos_state], LEN_MID_BITS, len); - } else { - rc_bit(rc, &lc->choice2, 1); - len -= LEN_MID_SYMBOLS; - rc_bittree(rc, lc->high, LEN_HIGH_BITS, len); - } - } - - // Only getoptimum uses the prices so don't update the table when - // in fast mode. - if (!fast_mode) - if (--lc->counters[pos_state] == 0) - length_update_prices(lc, pos_state); -} - - -/////////// -// Match // -/////////// - -static inline void -match(lzma_lzma1_encoder *coder, const uint32_t pos_state, - const uint32_t distance, const uint32_t len) -{ - update_match(coder->state); - - length(&coder->rc, &coder->match_len_encoder, pos_state, len, - coder->fast_mode); - - const uint32_t dist_slot = get_dist_slot(distance); - const uint32_t dist_state = get_dist_state(len); - rc_bittree(&coder->rc, coder->dist_slot[dist_state], - DIST_SLOT_BITS, dist_slot); - - if (dist_slot >= DIST_MODEL_START) { - const uint32_t footer_bits = (dist_slot >> 1) - 1; - const uint32_t base = (2 | (dist_slot & 1)) << footer_bits; - const uint32_t dist_reduced = distance - base; - - if (dist_slot < DIST_MODEL_END) { - // Careful here: base - dist_slot - 1 can be -1, but - // rc_bittree_reverse starts at probs[1], not probs[0]. - rc_bittree_reverse(&coder->rc, - coder->dist_special + base - dist_slot - 1, - footer_bits, dist_reduced); - } else { - rc_direct(&coder->rc, dist_reduced >> ALIGN_BITS, - footer_bits - ALIGN_BITS); - rc_bittree_reverse( - &coder->rc, coder->dist_align, - ALIGN_BITS, dist_reduced & ALIGN_MASK); - ++coder->align_price_count; - } - } - - coder->reps[3] = coder->reps[2]; - coder->reps[2] = coder->reps[1]; - coder->reps[1] = coder->reps[0]; - coder->reps[0] = distance; - ++coder->match_price_count; -} - - -//////////////////// -// Repeated match // -//////////////////// - -static inline void -rep_match(lzma_lzma1_encoder *coder, const uint32_t pos_state, - const uint32_t rep, const uint32_t len) -{ - if (rep == 0) { - rc_bit(&coder->rc, &coder->is_rep0[coder->state], 0); - rc_bit(&coder->rc, - &coder->is_rep0_long[coder->state][pos_state], - len != 1); - } else { - const uint32_t distance = coder->reps[rep]; - rc_bit(&coder->rc, &coder->is_rep0[coder->state], 1); - - if (rep == 1) { - rc_bit(&coder->rc, &coder->is_rep1[coder->state], 0); - } else { - rc_bit(&coder->rc, &coder->is_rep1[coder->state], 1); - rc_bit(&coder->rc, &coder->is_rep2[coder->state], - rep - 2); - - if (rep == 3) - coder->reps[3] = coder->reps[2]; - - coder->reps[2] = coder->reps[1]; - } - - coder->reps[1] = coder->reps[0]; - coder->reps[0] = distance; - } - - if (len == 1) { - update_short_rep(coder->state); - } else { - length(&coder->rc, &coder->rep_len_encoder, pos_state, len, - coder->fast_mode); - update_long_rep(coder->state); - } -} - - -////////// -// Main // -////////// - -static void -encode_symbol(lzma_lzma1_encoder *coder, lzma_mf *mf, - uint32_t back, uint32_t len, uint32_t position) -{ - const uint32_t pos_state = position & coder->pos_mask; - - if (back == UINT32_MAX) { - // Literal i.e. eight-bit byte - assert(len == 1); - rc_bit(&coder->rc, - &coder->is_match[coder->state][pos_state], 0); - literal(coder, mf, position); - } else { - // Some type of match - rc_bit(&coder->rc, - &coder->is_match[coder->state][pos_state], 1); - - if (back < REPS) { - // It's a repeated match i.e. the same distance - // has been used earlier. - rc_bit(&coder->rc, &coder->is_rep[coder->state], 1); - rep_match(coder, pos_state, back, len); - } else { - // Normal match - rc_bit(&coder->rc, &coder->is_rep[coder->state], 0); - match(coder, pos_state, back - REPS, len); - } - } - - assert(mf->read_ahead >= len); - mf->read_ahead -= len; -} - - -static bool -encode_init(lzma_lzma1_encoder *coder, lzma_mf *mf) -{ - assert(mf_position(mf) == 0); - - if (mf->read_pos == mf->read_limit) { - if (mf->action == LZMA_RUN) - return false; // We cannot do anything. - - // We are finishing (we cannot get here when flushing). - assert(mf->write_pos == mf->read_pos); - assert(mf->action == LZMA_FINISH); - } else { - // Do the actual initialization. The first LZMA symbol must - // always be a literal. - mf_skip(mf, 1); - mf->read_ahead = 0; - rc_bit(&coder->rc, &coder->is_match[0][0], 0); - rc_bittree(&coder->rc, coder->literal[0], 8, mf->buffer[0]); - } - - // Initialization is done (except if empty file). - coder->is_initialized = true; - - return true; -} - - -static void -encode_eopm(lzma_lzma1_encoder *coder, uint32_t position) -{ - const uint32_t pos_state = position & coder->pos_mask; - rc_bit(&coder->rc, &coder->is_match[coder->state][pos_state], 1); - rc_bit(&coder->rc, &coder->is_rep[coder->state], 0); - match(coder, pos_state, UINT32_MAX, MATCH_LEN_MIN); -} - - -/// Number of bytes that a single encoding loop in lzma_lzma_encode() can -/// consume from the dictionary. This limit comes from lzma_lzma_optimum() -/// and may need to be updated if that function is significantly modified. -#define LOOP_INPUT_MAX (OPTS + 1) - - -extern lzma_ret -lzma_lzma_encode(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size, uint32_t limit) -{ - // Initialize the stream if no data has been encoded yet. - if (!coder->is_initialized && !encode_init(coder, mf)) - return LZMA_OK; - - // Get the lowest bits of the uncompressed offset from the LZ layer. - uint32_t position = mf_position(mf); - - while (true) { - // Encode pending bits, if any. Calling this before encoding - // the next symbol is needed only with plain LZMA, since - // LZMA2 always provides big enough buffer to flush - // everything out from the range encoder. For the same reason, - // rc_encode() never returns true when this function is used - // as part of LZMA2 encoder. - if (rc_encode(&coder->rc, out, out_pos, out_size)) { - assert(limit == UINT32_MAX); - return LZMA_OK; - } - - // With LZMA2 we need to take care that compressed size of - // a chunk doesn't get too big. - // FIXME? Check if this could be improved. - if (limit != UINT32_MAX - && (mf->read_pos - mf->read_ahead >= limit - || *out_pos + rc_pending(&coder->rc) - >= LZMA2_CHUNK_MAX - - LOOP_INPUT_MAX)) - break; - - // Check that there is some input to process. - if (mf->read_pos >= mf->read_limit) { - if (mf->action == LZMA_RUN) - return LZMA_OK; - - if (mf->read_ahead == 0) - break; - } - - // Get optimal match (repeat position and length). - // Value ranges for pos: - // - [0, REPS): repeated match - // - [REPS, UINT32_MAX): - // match at (pos - REPS) - // - UINT32_MAX: not a match but a literal - // Value ranges for len: - // - [MATCH_LEN_MIN, MATCH_LEN_MAX] - uint32_t len; - uint32_t back; - - if (coder->fast_mode) - lzma_lzma_optimum_fast(coder, mf, &back, &len); - else - lzma_lzma_optimum_normal( - coder, mf, &back, &len, position); - - encode_symbol(coder, mf, back, len, position); - - position += len; - } - - if (!coder->is_flushed) { - coder->is_flushed = true; - - // We don't support encoding plain LZMA streams without EOPM, - // and LZMA2 doesn't use EOPM at LZMA level. - if (limit == UINT32_MAX) - encode_eopm(coder, position); - - // Flush the remaining bytes from the range encoder. - rc_flush(&coder->rc); - - // Copy the remaining bytes to the output buffer. If there - // isn't enough output space, we will copy out the remaining - // bytes on the next call to this function by using - // the rc_encode() call in the encoding loop above. - if (rc_encode(&coder->rc, out, out_pos, out_size)) { - assert(limit == UINT32_MAX); - return LZMA_OK; - } - } - - // Make it ready for the next LZMA2 chunk. - coder->is_flushed = false; - - return LZMA_STREAM_END; -} - - -static lzma_ret -lzma_encode(void *coder, lzma_mf *restrict mf, - uint8_t *restrict out, size_t *restrict out_pos, - size_t out_size) -{ - // Plain LZMA has no support for sync-flushing. - if (unlikely(mf->action == LZMA_SYNC_FLUSH)) - return LZMA_OPTIONS_ERROR; - - return lzma_lzma_encode(coder, mf, out, out_pos, out_size, UINT32_MAX); -} - - -//////////////////// -// Initialization // -//////////////////// - -static bool -is_options_valid(const lzma_options_lzma *options) -{ - // Validate some of the options. LZ encoder validates nice_len too - // but we need a valid value here earlier. - return is_lclppb_valid(options) - && options->nice_len >= MATCH_LEN_MIN - && options->nice_len <= MATCH_LEN_MAX - && (options->mode == LZMA_MODE_FAST - || options->mode == LZMA_MODE_NORMAL); -} - - -static void -set_lz_options(lzma_lz_options *lz_options, const lzma_options_lzma *options) -{ - // LZ encoder initialization does the validation for these so we - // don't need to validate here. - lz_options->before_size = OPTS; - lz_options->dict_size = options->dict_size; - lz_options->after_size = LOOP_INPUT_MAX; - lz_options->match_len_max = MATCH_LEN_MAX; - lz_options->nice_len = options->nice_len; - lz_options->match_finder = options->mf; - lz_options->depth = options->depth; - lz_options->preset_dict = options->preset_dict; - lz_options->preset_dict_size = options->preset_dict_size; - return; -} - - -static void -length_encoder_reset(lzma_length_encoder *lencoder, - const uint32_t num_pos_states, const bool fast_mode) -{ - bit_reset(lencoder->choice); - bit_reset(lencoder->choice2); - - for (size_t pos_state = 0; pos_state < num_pos_states; ++pos_state) { - bittree_reset(lencoder->low[pos_state], LEN_LOW_BITS); - bittree_reset(lencoder->mid[pos_state], LEN_MID_BITS); - } - - bittree_reset(lencoder->high, LEN_HIGH_BITS); - - if (!fast_mode) - for (uint32_t pos_state = 0; pos_state < num_pos_states; - ++pos_state) - length_update_prices(lencoder, pos_state); - - return; -} - - -extern lzma_ret -lzma_lzma_encoder_reset(lzma_lzma1_encoder *coder, - const lzma_options_lzma *options) -{ - if (!is_options_valid(options)) - return LZMA_OPTIONS_ERROR; - - coder->pos_mask = (1U << options->pb) - 1; - coder->literal_context_bits = options->lc; - coder->literal_pos_mask = (1U << options->lp) - 1; - - // Range coder - rc_reset(&coder->rc); - - // State - coder->state = STATE_LIT_LIT; - for (size_t i = 0; i < REPS; ++i) - coder->reps[i] = 0; - - literal_init(coder->literal, options->lc, options->lp); - - // Bit encoders - for (size_t i = 0; i < STATES; ++i) { - for (size_t j = 0; j <= coder->pos_mask; ++j) { - bit_reset(coder->is_match[i][j]); - bit_reset(coder->is_rep0_long[i][j]); - } - - bit_reset(coder->is_rep[i]); - bit_reset(coder->is_rep0[i]); - bit_reset(coder->is_rep1[i]); - bit_reset(coder->is_rep2[i]); - } - - for (size_t i = 0; i < FULL_DISTANCES - DIST_MODEL_END; ++i) - bit_reset(coder->dist_special[i]); - - // Bit tree encoders - for (size_t i = 0; i < DIST_STATES; ++i) - bittree_reset(coder->dist_slot[i], DIST_SLOT_BITS); - - bittree_reset(coder->dist_align, ALIGN_BITS); - - // Length encoders - length_encoder_reset(&coder->match_len_encoder, - 1U << options->pb, coder->fast_mode); - - length_encoder_reset(&coder->rep_len_encoder, - 1U << options->pb, coder->fast_mode); - - // Price counts are incremented every time appropriate probabilities - // are changed. price counts are set to zero when the price tables - // are updated, which is done when the appropriate price counts have - // big enough value, and lzma_mf.read_ahead == 0 which happens at - // least every OPTS (a few thousand) possible price count increments. - // - // By resetting price counts to UINT32_MAX / 2, we make sure that the - // price tables will be initialized before they will be used (since - // the value is definitely big enough), and that it is OK to increment - // price counts without risk of integer overflow (since UINT32_MAX / 2 - // is small enough). The current code doesn't increment price counts - // before initializing price tables, but it maybe done in future if - // we add support for saving the state between LZMA2 chunks. - coder->match_price_count = UINT32_MAX / 2; - coder->align_price_count = UINT32_MAX / 2; - - coder->opts_end_index = 0; - coder->opts_current_index = 0; - - return LZMA_OK; -} - - -extern lzma_ret -lzma_lzma_encoder_create(void **coder_ptr, - const lzma_allocator *allocator, - const lzma_options_lzma *options, lzma_lz_options *lz_options) -{ - // Allocate lzma_lzma1_encoder if it wasn't already allocated. - if (*coder_ptr == NULL) { - *coder_ptr = lzma_alloc(sizeof(lzma_lzma1_encoder), allocator); - if (*coder_ptr == NULL) - return LZMA_MEM_ERROR; - } - - lzma_lzma1_encoder *coder = *coder_ptr; - - // Set compression mode. We haven't validates the options yet, - // but it's OK here, since nothing bad happens with invalid - // options in the code below, and they will get rejected by - // lzma_lzma_encoder_reset() call at the end of this function. - switch (options->mode) { - case LZMA_MODE_FAST: - coder->fast_mode = true; - break; - - case LZMA_MODE_NORMAL: { - coder->fast_mode = false; - - // Set dist_table_size. - // Round the dictionary size up to next 2^n. - uint32_t log_size = 0; - while ((UINT32_C(1) << log_size) < options->dict_size) - ++log_size; - - coder->dist_table_size = log_size * 2; - - // Length encoders' price table size - coder->match_len_encoder.table_size - = options->nice_len + 1 - MATCH_LEN_MIN; - coder->rep_len_encoder.table_size - = options->nice_len + 1 - MATCH_LEN_MIN; - break; - } - - default: - return LZMA_OPTIONS_ERROR; - } - - // We don't need to write the first byte as literal if there is - // a non-empty preset dictionary. encode_init() wouldn't even work - // if there is a non-empty preset dictionary, because encode_init() - // assumes that position is zero and previous byte is also zero. - coder->is_initialized = options->preset_dict != NULL - && options->preset_dict_size > 0; - coder->is_flushed = false; - - set_lz_options(lz_options, options); - - return lzma_lzma_encoder_reset(coder, options); -} - - -static lzma_ret -lzma_encoder_init(lzma_lz_encoder *lz, const lzma_allocator *allocator, - const void *options, lzma_lz_options *lz_options) -{ - lz->code = &lzma_encode; - return lzma_lzma_encoder_create( - &lz->coder, allocator, options, lz_options); -} - - -extern lzma_ret -lzma_lzma_encoder_init(lzma_next_coder *next, const lzma_allocator *allocator, - const lzma_filter_info *filters) -{ - return lzma_lz_encoder_init( - next, allocator, filters, &lzma_encoder_init); -} - - -extern uint64_t -lzma_lzma_encoder_memusage(const void *options) -{ - if (!is_options_valid(options)) - return UINT64_MAX; - - lzma_lz_options lz_options; - set_lz_options(&lz_options, options); - - const uint64_t lz_memusage = lzma_lz_encoder_memusage(&lz_options); - if (lz_memusage == UINT64_MAX) - return UINT64_MAX; - - return (uint64_t)(sizeof(lzma_lzma1_encoder)) + lz_memusage; -} - - -extern bool -lzma_lzma_lclppb_encode(const lzma_options_lzma *options, uint8_t *byte) -{ - if (!is_lclppb_valid(options)) - return true; - - *byte = (options->pb * 5 + options->lp) * 9 + options->lc; - assert(*byte <= (4 * 5 + 4) * 9 + 8); - - return false; -} - - -#ifdef HAVE_ENCODER_LZMA1 -extern lzma_ret -lzma_lzma_props_encode(const void *options, uint8_t *out) -{ - const lzma_options_lzma *const opt = options; - - if (lzma_lzma_lclppb_encode(opt, out)) - return LZMA_PROG_ERROR; - - unaligned_write32le(out + 1, opt->dict_size); - - return LZMA_OK; -} -#endif - - -extern LZMA_API(lzma_bool) -lzma_mode_is_supported(lzma_mode mode) -{ - return mode == LZMA_MODE_FAST || mode == LZMA_MODE_NORMAL; -} diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.h b/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.h deleted file mode 100755 index 6cfdf228..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder.h +++ /dev/null @@ -1,58 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder.h -/// \brief LZMA encoder API -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_ENCODER_H -#define LZMA_LZMA_ENCODER_H - -#include "common.h" - - -typedef struct lzma_lzma1_encoder_s lzma_lzma1_encoder; - - -extern lzma_ret lzma_lzma_encoder_init(lzma_next_coder *next, - const lzma_allocator *allocator, - const lzma_filter_info *filters); - - -extern uint64_t lzma_lzma_encoder_memusage(const void *options); - -extern lzma_ret lzma_lzma_props_encode(const void *options, uint8_t *out); - - -/// Encodes lc/lp/pb into one byte. Returns false on success and true on error. -extern bool lzma_lzma_lclppb_encode( - const lzma_options_lzma *options, uint8_t *byte); - - -#ifdef LZMA_LZ_ENCODER_H - -/// Initializes raw LZMA encoder; this is used by LZMA2. -extern lzma_ret lzma_lzma_encoder_create( - void **coder_ptr, const lzma_allocator *allocator, - const lzma_options_lzma *options, lzma_lz_options *lz_options); - - -/// Resets an already initialized LZMA encoder; this is used by LZMA2. -extern lzma_ret lzma_lzma_encoder_reset( - lzma_lzma1_encoder *coder, const lzma_options_lzma *options); - - -extern lzma_ret lzma_lzma_encode(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, uint8_t *restrict out, - size_t *restrict out_pos, size_t out_size, - uint32_t read_limit); - -#endif - -#endif diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_fast.c b/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_fast.c deleted file mode 100755 index 6c53d2bd..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_fast.c +++ /dev/null @@ -1,170 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_optimum_fast.c -// -// Author: Igor Pavlov -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma_encoder_private.h" -#include "memcmplen.h" - - -#define change_pair(small_dist, big_dist) \ - (((big_dist) >> 7) > (small_dist)) - - -extern void -lzma_lzma_optimum_fast(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res) -{ - const uint32_t nice_len = mf->nice_len; - - uint32_t len_main; - uint32_t matches_count; - if (mf->read_ahead == 0) { - len_main = mf_find(mf, &matches_count, coder->matches); - } else { - assert(mf->read_ahead == 1); - len_main = coder->longest_match_length; - matches_count = coder->matches_count; - } - - const uint8_t *buf = mf_ptr(mf) - 1; - const uint32_t buf_avail = my_min(mf_avail(mf) + 1, MATCH_LEN_MAX); - - if (buf_avail < 2) { - // There's not enough input left to encode a match. - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - - // Look for repeated matches; scan the previous four match distances - uint32_t rep_len = 0; - uint32_t rep_index = 0; - - for (uint32_t i = 0; i < REPS; ++i) { - // Pointer to the beginning of the match candidate - const uint8_t *const buf_back = buf - coder->reps[i] - 1; - - // If the first two bytes (2 == MATCH_LEN_MIN) do not match, - // this rep is not useful. - if (not_equal_16(buf, buf_back)) - continue; - - // The first two bytes matched. - // Calculate the length of the match. - const uint32_t len = lzma_memcmplen( - buf, buf_back, 2, buf_avail); - - // If we have found a repeated match that is at least - // nice_len long, return it immediately. - if (len >= nice_len) { - *back_res = i; - *len_res = len; - mf_skip(mf, len - 1); - return; - } - - if (len > rep_len) { - rep_index = i; - rep_len = len; - } - } - - // We didn't find a long enough repeated match. Encode it as a normal - // match if the match length is at least nice_len. - if (len_main >= nice_len) { - *back_res = coder->matches[matches_count - 1].dist + REPS; - *len_res = len_main; - mf_skip(mf, len_main - 1); - return; - } - - uint32_t back_main = 0; - if (len_main >= 2) { - back_main = coder->matches[matches_count - 1].dist; - - while (matches_count > 1 && len_main == - coder->matches[matches_count - 2].len + 1) { - if (!change_pair(coder->matches[ - matches_count - 2].dist, - back_main)) - break; - - --matches_count; - len_main = coder->matches[matches_count - 1].len; - back_main = coder->matches[matches_count - 1].dist; - } - - if (len_main == 2 && back_main >= 0x80) - len_main = 1; - } - - if (rep_len >= 2) { - if (rep_len + 1 >= len_main - || (rep_len + 2 >= len_main - && back_main > (UINT32_C(1) << 9)) - || (rep_len + 3 >= len_main - && back_main > (UINT32_C(1) << 15))) { - *back_res = rep_index; - *len_res = rep_len; - mf_skip(mf, rep_len - 1); - return; - } - } - - if (len_main < 2 || buf_avail <= 2) { - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - - // Get the matches for the next byte. If we find a better match, - // the current byte is encoded as a literal. - coder->longest_match_length = mf_find(mf, - &coder->matches_count, coder->matches); - - if (coder->longest_match_length >= 2) { - const uint32_t new_dist = coder->matches[ - coder->matches_count - 1].dist; - - if ((coder->longest_match_length >= len_main - && new_dist < back_main) - || (coder->longest_match_length == len_main + 1 - && !change_pair(back_main, new_dist)) - || (coder->longest_match_length > len_main + 1) - || (coder->longest_match_length + 1 >= len_main - && len_main >= 3 - && change_pair(new_dist, back_main))) { - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - } - - // In contrast to LZMA SDK, dictionary could not have been moved - // between mf_find() calls, thus it is safe to just increment - // the old buf pointer instead of recalculating it with mf_ptr(). - ++buf; - - const uint32_t limit = my_max(2, len_main - 1); - - for (uint32_t i = 0; i < REPS; ++i) { - if (memcmp(buf, buf - coder->reps[i] - 1, limit) == 0) { - *back_res = UINT32_MAX; - *len_res = 1; - return; - } - } - - *back_res = back_main + REPS; - *len_res = len_main; - mf_skip(mf, len_main - 2); - return; -} diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_normal.c b/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_normal.c deleted file mode 100755 index 59f77343..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_optimum_normal.c +++ /dev/null @@ -1,855 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_optimum_normal.c -// -// Author: Igor Pavlov -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "lzma_encoder_private.h" -#include "fastpos.h" -#include "memcmplen.h" - - -//////////// -// Prices // -//////////// - -static uint32_t -get_literal_price(const lzma_lzma1_encoder *const coder, const uint32_t pos, - const uint32_t prev_byte, const bool match_mode, - uint32_t match_byte, uint32_t symbol) -{ - const probability *const subcoder = literal_subcoder(coder->literal, - coder->literal_context_bits, coder->literal_pos_mask, - pos, prev_byte); - - uint32_t price = 0; - - if (!match_mode) { - price = rc_bittree_price(subcoder, 8, symbol); - } else { - uint32_t offset = 0x100; - symbol += UINT32_C(1) << 8; - - do { - match_byte <<= 1; - - const uint32_t match_bit = match_byte & offset; - const uint32_t subcoder_index - = offset + match_bit + (symbol >> 8); - const uint32_t bit = (symbol >> 7) & 1; - price += rc_bit_price(subcoder[subcoder_index], bit); - - symbol <<= 1; - offset &= ~(match_byte ^ symbol); - - } while (symbol < (UINT32_C(1) << 16)); - } - - return price; -} - - -static inline uint32_t -get_len_price(const lzma_length_encoder *const lencoder, - const uint32_t len, const uint32_t pos_state) -{ - // NOTE: Unlike the other price tables, length prices are updated - // in lzma_encoder.c - return lencoder->prices[pos_state][len - MATCH_LEN_MIN]; -} - - -static inline uint32_t -get_short_rep_price(const lzma_lzma1_encoder *const coder, - const lzma_lzma_state state, const uint32_t pos_state) -{ - return rc_bit_0_price(coder->is_rep0[state]) - + rc_bit_0_price(coder->is_rep0_long[state][pos_state]); -} - - -static inline uint32_t -get_pure_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index, - const lzma_lzma_state state, uint32_t pos_state) -{ - uint32_t price; - - if (rep_index == 0) { - price = rc_bit_0_price(coder->is_rep0[state]); - price += rc_bit_1_price(coder->is_rep0_long[state][pos_state]); - } else { - price = rc_bit_1_price(coder->is_rep0[state]); - - if (rep_index == 1) { - price += rc_bit_0_price(coder->is_rep1[state]); - } else { - price += rc_bit_1_price(coder->is_rep1[state]); - price += rc_bit_price(coder->is_rep2[state], - rep_index - 2); - } - } - - return price; -} - - -static inline uint32_t -get_rep_price(const lzma_lzma1_encoder *const coder, const uint32_t rep_index, - const uint32_t len, const lzma_lzma_state state, - const uint32_t pos_state) -{ - return get_len_price(&coder->rep_len_encoder, len, pos_state) - + get_pure_rep_price(coder, rep_index, state, pos_state); -} - - -static inline uint32_t -get_dist_len_price(const lzma_lzma1_encoder *const coder, const uint32_t dist, - const uint32_t len, const uint32_t pos_state) -{ - const uint32_t dist_state = get_dist_state(len); - uint32_t price; - - if (dist < FULL_DISTANCES) { - price = coder->dist_prices[dist_state][dist]; - } else { - const uint32_t dist_slot = get_dist_slot_2(dist); - price = coder->dist_slot_prices[dist_state][dist_slot] - + coder->align_prices[dist & ALIGN_MASK]; - } - - price += get_len_price(&coder->match_len_encoder, len, pos_state); - - return price; -} - - -static void -fill_dist_prices(lzma_lzma1_encoder *coder) -{ - for (uint32_t dist_state = 0; dist_state < DIST_STATES; ++dist_state) { - - uint32_t *const dist_slot_prices - = coder->dist_slot_prices[dist_state]; - - // Price to encode the dist_slot. - for (uint32_t dist_slot = 0; - dist_slot < coder->dist_table_size; ++dist_slot) - dist_slot_prices[dist_slot] = rc_bittree_price( - coder->dist_slot[dist_state], - DIST_SLOT_BITS, dist_slot); - - // For matches with distance >= FULL_DISTANCES, add the price - // of the direct bits part of the match distance. (Align bits - // are handled by fill_align_prices()). - for (uint32_t dist_slot = DIST_MODEL_END; - dist_slot < coder->dist_table_size; - ++dist_slot) - dist_slot_prices[dist_slot] += rc_direct_price( - ((dist_slot >> 1) - 1) - ALIGN_BITS); - - // Distances in the range [0, 3] are fully encoded with - // dist_slot, so they are used for coder->dist_prices - // as is. - for (uint32_t i = 0; i < DIST_MODEL_START; ++i) - coder->dist_prices[dist_state][i] - = dist_slot_prices[i]; - } - - // Distances in the range [4, 127] depend on dist_slot and - // dist_special. We do this in a loop separate from the above - // loop to avoid redundant calls to get_dist_slot(). - for (uint32_t i = DIST_MODEL_START; i < FULL_DISTANCES; ++i) { - const uint32_t dist_slot = get_dist_slot(i); - const uint32_t footer_bits = ((dist_slot >> 1) - 1); - const uint32_t base = (2 | (dist_slot & 1)) << footer_bits; - const uint32_t price = rc_bittree_reverse_price( - coder->dist_special + base - dist_slot - 1, - footer_bits, i - base); - - for (uint32_t dist_state = 0; dist_state < DIST_STATES; - ++dist_state) - coder->dist_prices[dist_state][i] - = price + coder->dist_slot_prices[ - dist_state][dist_slot]; - } - - coder->match_price_count = 0; - return; -} - - -static void -fill_align_prices(lzma_lzma1_encoder *coder) -{ - for (uint32_t i = 0; i < ALIGN_SIZE; ++i) - coder->align_prices[i] = rc_bittree_reverse_price( - coder->dist_align, ALIGN_BITS, i); - - coder->align_price_count = 0; - return; -} - - -///////////// -// Optimal // -///////////// - -static inline void -make_literal(lzma_optimal *optimal) -{ - optimal->back_prev = UINT32_MAX; - optimal->prev_1_is_literal = false; -} - - -static inline void -make_short_rep(lzma_optimal *optimal) -{ - optimal->back_prev = 0; - optimal->prev_1_is_literal = false; -} - - -#define is_short_rep(optimal) \ - ((optimal).back_prev == 0) - - -static void -backward(lzma_lzma1_encoder *restrict coder, uint32_t *restrict len_res, - uint32_t *restrict back_res, uint32_t cur) -{ - coder->opts_end_index = cur; - - uint32_t pos_mem = coder->opts[cur].pos_prev; - uint32_t back_mem = coder->opts[cur].back_prev; - - do { - if (coder->opts[cur].prev_1_is_literal) { - make_literal(&coder->opts[pos_mem]); - coder->opts[pos_mem].pos_prev = pos_mem - 1; - - if (coder->opts[cur].prev_2) { - coder->opts[pos_mem - 1].prev_1_is_literal - = false; - coder->opts[pos_mem - 1].pos_prev - = coder->opts[cur].pos_prev_2; - coder->opts[pos_mem - 1].back_prev - = coder->opts[cur].back_prev_2; - } - } - - const uint32_t pos_prev = pos_mem; - const uint32_t back_cur = back_mem; - - back_mem = coder->opts[pos_prev].back_prev; - pos_mem = coder->opts[pos_prev].pos_prev; - - coder->opts[pos_prev].back_prev = back_cur; - coder->opts[pos_prev].pos_prev = cur; - cur = pos_prev; - - } while (cur != 0); - - coder->opts_current_index = coder->opts[0].pos_prev; - *len_res = coder->opts[0].pos_prev; - *back_res = coder->opts[0].back_prev; - - return; -} - - -////////// -// Main // -////////// - -static inline uint32_t -helper1(lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res, - uint32_t position) -{ - const uint32_t nice_len = mf->nice_len; - - uint32_t len_main; - uint32_t matches_count; - - if (mf->read_ahead == 0) { - len_main = mf_find(mf, &matches_count, coder->matches); - } else { - assert(mf->read_ahead == 1); - len_main = coder->longest_match_length; - matches_count = coder->matches_count; - } - - const uint32_t buf_avail = my_min(mf_avail(mf) + 1, MATCH_LEN_MAX); - if (buf_avail < 2) { - *back_res = UINT32_MAX; - *len_res = 1; - return UINT32_MAX; - } - - const uint8_t *const buf = mf_ptr(mf) - 1; - - uint32_t rep_lens[REPS]; - uint32_t rep_max_index = 0; - - for (uint32_t i = 0; i < REPS; ++i) { - const uint8_t *const buf_back = buf - coder->reps[i] - 1; - - if (not_equal_16(buf, buf_back)) { - rep_lens[i] = 0; - continue; - } - - rep_lens[i] = lzma_memcmplen(buf, buf_back, 2, buf_avail); - - if (rep_lens[i] > rep_lens[rep_max_index]) - rep_max_index = i; - } - - if (rep_lens[rep_max_index] >= nice_len) { - *back_res = rep_max_index; - *len_res = rep_lens[rep_max_index]; - mf_skip(mf, *len_res - 1); - return UINT32_MAX; - } - - - if (len_main >= nice_len) { - *back_res = coder->matches[matches_count - 1].dist + REPS; - *len_res = len_main; - mf_skip(mf, len_main - 1); - return UINT32_MAX; - } - - const uint8_t current_byte = *buf; - const uint8_t match_byte = *(buf - coder->reps[0] - 1); - - if (len_main < 2 && current_byte != match_byte - && rep_lens[rep_max_index] < 2) { - *back_res = UINT32_MAX; - *len_res = 1; - return UINT32_MAX; - } - - coder->opts[0].state = coder->state; - - const uint32_t pos_state = position & coder->pos_mask; - - coder->opts[1].price = rc_bit_0_price( - coder->is_match[coder->state][pos_state]) - + get_literal_price(coder, position, buf[-1], - !is_literal_state(coder->state), - match_byte, current_byte); - - make_literal(&coder->opts[1]); - - const uint32_t match_price = rc_bit_1_price( - coder->is_match[coder->state][pos_state]); - const uint32_t rep_match_price = match_price - + rc_bit_1_price(coder->is_rep[coder->state]); - - if (match_byte == current_byte) { - const uint32_t short_rep_price = rep_match_price - + get_short_rep_price( - coder, coder->state, pos_state); - - if (short_rep_price < coder->opts[1].price) { - coder->opts[1].price = short_rep_price; - make_short_rep(&coder->opts[1]); - } - } - - const uint32_t len_end = my_max(len_main, rep_lens[rep_max_index]); - - if (len_end < 2) { - *back_res = coder->opts[1].back_prev; - *len_res = 1; - return UINT32_MAX; - } - - coder->opts[1].pos_prev = 0; - - for (uint32_t i = 0; i < REPS; ++i) - coder->opts[0].backs[i] = coder->reps[i]; - - uint32_t len = len_end; - do { - coder->opts[len].price = RC_INFINITY_PRICE; - } while (--len >= 2); - - - for (uint32_t i = 0; i < REPS; ++i) { - uint32_t rep_len = rep_lens[i]; - if (rep_len < 2) - continue; - - const uint32_t price = rep_match_price + get_pure_rep_price( - coder, i, coder->state, pos_state); - - do { - const uint32_t cur_and_len_price = price - + get_len_price( - &coder->rep_len_encoder, - rep_len, pos_state); - - if (cur_and_len_price < coder->opts[rep_len].price) { - coder->opts[rep_len].price = cur_and_len_price; - coder->opts[rep_len].pos_prev = 0; - coder->opts[rep_len].back_prev = i; - coder->opts[rep_len].prev_1_is_literal = false; - } - } while (--rep_len >= 2); - } - - - const uint32_t normal_match_price = match_price - + rc_bit_0_price(coder->is_rep[coder->state]); - - len = rep_lens[0] >= 2 ? rep_lens[0] + 1 : 2; - if (len <= len_main) { - uint32_t i = 0; - while (len > coder->matches[i].len) - ++i; - - for(; ; ++len) { - const uint32_t dist = coder->matches[i].dist; - const uint32_t cur_and_len_price = normal_match_price - + get_dist_len_price(coder, - dist, len, pos_state); - - if (cur_and_len_price < coder->opts[len].price) { - coder->opts[len].price = cur_and_len_price; - coder->opts[len].pos_prev = 0; - coder->opts[len].back_prev = dist + REPS; - coder->opts[len].prev_1_is_literal = false; - } - - if (len == coder->matches[i].len) - if (++i == matches_count) - break; - } - } - - return len_end; -} - - -static inline uint32_t -helper2(lzma_lzma1_encoder *coder, uint32_t *reps, const uint8_t *buf, - uint32_t len_end, uint32_t position, const uint32_t cur, - const uint32_t nice_len, const uint32_t buf_avail_full) -{ - uint32_t matches_count = coder->matches_count; - uint32_t new_len = coder->longest_match_length; - uint32_t pos_prev = coder->opts[cur].pos_prev; - lzma_lzma_state state; - - if (coder->opts[cur].prev_1_is_literal) { - --pos_prev; - - if (coder->opts[cur].prev_2) { - state = coder->opts[coder->opts[cur].pos_prev_2].state; - - if (coder->opts[cur].back_prev_2 < REPS) - update_long_rep(state); - else - update_match(state); - - } else { - state = coder->opts[pos_prev].state; - } - - update_literal(state); - - } else { - state = coder->opts[pos_prev].state; - } - - if (pos_prev == cur - 1) { - if (is_short_rep(coder->opts[cur])) - update_short_rep(state); - else - update_literal(state); - } else { - uint32_t pos; - if (coder->opts[cur].prev_1_is_literal - && coder->opts[cur].prev_2) { - pos_prev = coder->opts[cur].pos_prev_2; - pos = coder->opts[cur].back_prev_2; - update_long_rep(state); - } else { - pos = coder->opts[cur].back_prev; - if (pos < REPS) - update_long_rep(state); - else - update_match(state); - } - - if (pos < REPS) { - reps[0] = coder->opts[pos_prev].backs[pos]; - - uint32_t i; - for (i = 1; i <= pos; ++i) - reps[i] = coder->opts[pos_prev].backs[i - 1]; - - for (; i < REPS; ++i) - reps[i] = coder->opts[pos_prev].backs[i]; - - } else { - reps[0] = pos - REPS; - - for (uint32_t i = 1; i < REPS; ++i) - reps[i] = coder->opts[pos_prev].backs[i - 1]; - } - } - - coder->opts[cur].state = state; - - for (uint32_t i = 0; i < REPS; ++i) - coder->opts[cur].backs[i] = reps[i]; - - const uint32_t cur_price = coder->opts[cur].price; - - const uint8_t current_byte = *buf; - const uint8_t match_byte = *(buf - reps[0] - 1); - - const uint32_t pos_state = position & coder->pos_mask; - - const uint32_t cur_and_1_price = cur_price - + rc_bit_0_price(coder->is_match[state][pos_state]) - + get_literal_price(coder, position, buf[-1], - !is_literal_state(state), match_byte, current_byte); - - bool next_is_literal = false; - - if (cur_and_1_price < coder->opts[cur + 1].price) { - coder->opts[cur + 1].price = cur_and_1_price; - coder->opts[cur + 1].pos_prev = cur; - make_literal(&coder->opts[cur + 1]); - next_is_literal = true; - } - - const uint32_t match_price = cur_price - + rc_bit_1_price(coder->is_match[state][pos_state]); - const uint32_t rep_match_price = match_price - + rc_bit_1_price(coder->is_rep[state]); - - if (match_byte == current_byte - && !(coder->opts[cur + 1].pos_prev < cur - && coder->opts[cur + 1].back_prev == 0)) { - - const uint32_t short_rep_price = rep_match_price - + get_short_rep_price(coder, state, pos_state); - - if (short_rep_price <= coder->opts[cur + 1].price) { - coder->opts[cur + 1].price = short_rep_price; - coder->opts[cur + 1].pos_prev = cur; - make_short_rep(&coder->opts[cur + 1]); - next_is_literal = true; - } - } - - if (buf_avail_full < 2) - return len_end; - - const uint32_t buf_avail = my_min(buf_avail_full, nice_len); - - if (!next_is_literal && match_byte != current_byte) { // speed optimization - // try literal + rep0 - const uint8_t *const buf_back = buf - reps[0] - 1; - const uint32_t limit = my_min(buf_avail_full, nice_len + 1); - - const uint32_t len_test = lzma_memcmplen(buf, buf_back, 1, limit) - 1; - - if (len_test >= 2) { - lzma_lzma_state state_2 = state; - update_literal(state_2); - - const uint32_t pos_state_next = (position + 1) & coder->pos_mask; - const uint32_t next_rep_match_price = cur_and_1_price - + rc_bit_1_price(coder->is_match[state_2][pos_state_next]) - + rc_bit_1_price(coder->is_rep[state_2]); - - //for (; len_test >= 2; --len_test) { - const uint32_t offset = cur + 1 + len_test; - - while (len_end < offset) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - const uint32_t cur_and_len_price = next_rep_match_price - + get_rep_price(coder, 0, len_test, - state_2, pos_state_next); - - if (cur_and_len_price < coder->opts[offset].price) { - coder->opts[offset].price = cur_and_len_price; - coder->opts[offset].pos_prev = cur + 1; - coder->opts[offset].back_prev = 0; - coder->opts[offset].prev_1_is_literal = true; - coder->opts[offset].prev_2 = false; - } - //} - } - } - - - uint32_t start_len = 2; // speed optimization - - for (uint32_t rep_index = 0; rep_index < REPS; ++rep_index) { - const uint8_t *const buf_back = buf - reps[rep_index] - 1; - if (not_equal_16(buf, buf_back)) - continue; - - uint32_t len_test = lzma_memcmplen(buf, buf_back, 2, buf_avail); - - while (len_end < cur + len_test) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - const uint32_t len_test_temp = len_test; - const uint32_t price = rep_match_price + get_pure_rep_price( - coder, rep_index, state, pos_state); - - do { - const uint32_t cur_and_len_price = price - + get_len_price(&coder->rep_len_encoder, - len_test, pos_state); - - if (cur_and_len_price < coder->opts[cur + len_test].price) { - coder->opts[cur + len_test].price = cur_and_len_price; - coder->opts[cur + len_test].pos_prev = cur; - coder->opts[cur + len_test].back_prev = rep_index; - coder->opts[cur + len_test].prev_1_is_literal = false; - } - } while (--len_test >= 2); - - len_test = len_test_temp; - - if (rep_index == 0) - start_len = len_test + 1; - - - uint32_t len_test_2 = len_test + 1; - const uint32_t limit = my_min(buf_avail_full, - len_test_2 + nice_len); - for (; len_test_2 < limit - && buf[len_test_2] == buf_back[len_test_2]; - ++len_test_2) ; - - len_test_2 -= len_test + 1; - - if (len_test_2 >= 2) { - lzma_lzma_state state_2 = state; - update_long_rep(state_2); - - uint32_t pos_state_next = (position + len_test) & coder->pos_mask; - - const uint32_t cur_and_len_literal_price = price - + get_len_price(&coder->rep_len_encoder, - len_test, pos_state) - + rc_bit_0_price(coder->is_match[state_2][pos_state_next]) - + get_literal_price(coder, position + len_test, - buf[len_test - 1], true, - buf_back[len_test], buf[len_test]); - - update_literal(state_2); - - pos_state_next = (position + len_test + 1) & coder->pos_mask; - - const uint32_t next_rep_match_price = cur_and_len_literal_price - + rc_bit_1_price(coder->is_match[state_2][pos_state_next]) - + rc_bit_1_price(coder->is_rep[state_2]); - - //for(; len_test_2 >= 2; len_test_2--) { - const uint32_t offset = cur + len_test + 1 + len_test_2; - - while (len_end < offset) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - const uint32_t cur_and_len_price = next_rep_match_price - + get_rep_price(coder, 0, len_test_2, - state_2, pos_state_next); - - if (cur_and_len_price < coder->opts[offset].price) { - coder->opts[offset].price = cur_and_len_price; - coder->opts[offset].pos_prev = cur + len_test + 1; - coder->opts[offset].back_prev = 0; - coder->opts[offset].prev_1_is_literal = true; - coder->opts[offset].prev_2 = true; - coder->opts[offset].pos_prev_2 = cur; - coder->opts[offset].back_prev_2 = rep_index; - } - //} - } - } - - - //for (uint32_t len_test = 2; len_test <= new_len; ++len_test) - if (new_len > buf_avail) { - new_len = buf_avail; - - matches_count = 0; - while (new_len > coder->matches[matches_count].len) - ++matches_count; - - coder->matches[matches_count++].len = new_len; - } - - - if (new_len >= start_len) { - const uint32_t normal_match_price = match_price - + rc_bit_0_price(coder->is_rep[state]); - - while (len_end < cur + new_len) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - uint32_t i = 0; - while (start_len > coder->matches[i].len) - ++i; - - for (uint32_t len_test = start_len; ; ++len_test) { - const uint32_t cur_back = coder->matches[i].dist; - uint32_t cur_and_len_price = normal_match_price - + get_dist_len_price(coder, - cur_back, len_test, pos_state); - - if (cur_and_len_price < coder->opts[cur + len_test].price) { - coder->opts[cur + len_test].price = cur_and_len_price; - coder->opts[cur + len_test].pos_prev = cur; - coder->opts[cur + len_test].back_prev - = cur_back + REPS; - coder->opts[cur + len_test].prev_1_is_literal = false; - } - - if (len_test == coder->matches[i].len) { - // Try Match + Literal + Rep0 - const uint8_t *const buf_back = buf - cur_back - 1; - uint32_t len_test_2 = len_test + 1; - const uint32_t limit = my_min(buf_avail_full, - len_test_2 + nice_len); - - for (; len_test_2 < limit && - buf[len_test_2] == buf_back[len_test_2]; - ++len_test_2) ; - - len_test_2 -= len_test + 1; - - if (len_test_2 >= 2) { - lzma_lzma_state state_2 = state; - update_match(state_2); - uint32_t pos_state_next - = (position + len_test) & coder->pos_mask; - - const uint32_t cur_and_len_literal_price = cur_and_len_price - + rc_bit_0_price( - coder->is_match[state_2][pos_state_next]) - + get_literal_price(coder, - position + len_test, - buf[len_test - 1], - true, - buf_back[len_test], - buf[len_test]); - - update_literal(state_2); - pos_state_next = (pos_state_next + 1) & coder->pos_mask; - - const uint32_t next_rep_match_price - = cur_and_len_literal_price - + rc_bit_1_price( - coder->is_match[state_2][pos_state_next]) - + rc_bit_1_price(coder->is_rep[state_2]); - - // for(; len_test_2 >= 2; --len_test_2) { - const uint32_t offset = cur + len_test + 1 + len_test_2; - - while (len_end < offset) - coder->opts[++len_end].price = RC_INFINITY_PRICE; - - cur_and_len_price = next_rep_match_price - + get_rep_price(coder, 0, len_test_2, - state_2, pos_state_next); - - if (cur_and_len_price < coder->opts[offset].price) { - coder->opts[offset].price = cur_and_len_price; - coder->opts[offset].pos_prev = cur + len_test + 1; - coder->opts[offset].back_prev = 0; - coder->opts[offset].prev_1_is_literal = true; - coder->opts[offset].prev_2 = true; - coder->opts[offset].pos_prev_2 = cur; - coder->opts[offset].back_prev_2 - = cur_back + REPS; - } - //} - } - - if (++i == matches_count) - break; - } - } - } - - return len_end; -} - - -extern void -lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res, - uint32_t position) -{ - // If we have symbols pending, return the next pending symbol. - if (coder->opts_end_index != coder->opts_current_index) { - assert(mf->read_ahead > 0); - *len_res = coder->opts[coder->opts_current_index].pos_prev - - coder->opts_current_index; - *back_res = coder->opts[coder->opts_current_index].back_prev; - coder->opts_current_index = coder->opts[ - coder->opts_current_index].pos_prev; - return; - } - - // Update the price tables. In LZMA SDK <= 4.60 (and possibly later) - // this was done in both initialization function and in the main loop. - // In liblzma they were moved into this single place. - if (mf->read_ahead == 0) { - if (coder->match_price_count >= (1 << 7)) - fill_dist_prices(coder); - - if (coder->align_price_count >= ALIGN_SIZE) - fill_align_prices(coder); - } - - // TODO: This needs quite a bit of cleaning still. But splitting - // the original function into two pieces makes it at least a little - // more readable, since those two parts don't share many variables. - - uint32_t len_end = helper1(coder, mf, back_res, len_res, position); - if (len_end == UINT32_MAX) - return; - - uint32_t reps[REPS]; - memcpy(reps, coder->reps, sizeof(reps)); - - uint32_t cur; - for (cur = 1; cur < len_end; ++cur) { - assert(cur < OPTS); - - coder->longest_match_length = mf_find( - mf, &coder->matches_count, coder->matches); - - if (coder->longest_match_length >= mf->nice_len) - break; - - len_end = helper2(coder, reps, mf_ptr(mf) - 1, len_end, - position + cur, cur, mf->nice_len, - my_min(mf_avail(mf) + 1, OPTS - 1 - cur)); - } - - backward(coder, len_res, back_res, cur); - return; -} diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_presets.c b/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_presets.c deleted file mode 100755 index 711df025..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_presets.c +++ /dev/null @@ -1,64 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_presets.c -/// \brief Encoder presets -/// \note xz needs this even when only decoding is enabled. -// -// Author: Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#include "common.h" - - -extern LZMA_API(lzma_bool) -lzma_lzma_preset(lzma_options_lzma *options, uint32_t preset) -{ - const uint32_t level = preset & LZMA_PRESET_LEVEL_MASK; - const uint32_t flags = preset & ~LZMA_PRESET_LEVEL_MASK; - const uint32_t supported_flags = LZMA_PRESET_EXTREME; - - if (level > 9 || (flags & ~supported_flags)) - return true; - - options->preset_dict = NULL; - options->preset_dict_size = 0; - - options->lc = LZMA_LC_DEFAULT; - options->lp = LZMA_LP_DEFAULT; - options->pb = LZMA_PB_DEFAULT; - - static const uint8_t dict_pow2[] - = { 18, 20, 21, 22, 22, 23, 23, 24, 25, 26 }; - options->dict_size = UINT32_C(1) << dict_pow2[level]; - - if (level <= 3) { - options->mode = LZMA_MODE_FAST; - options->mf = level == 0 ? LZMA_MF_HC3 : LZMA_MF_HC4; - options->nice_len = level <= 1 ? 128 : 273; - static const uint8_t depths[] = { 4, 8, 24, 48 }; - options->depth = depths[level]; - } else { - options->mode = LZMA_MODE_NORMAL; - options->mf = LZMA_MF_BT4; - options->nice_len = level == 4 ? 16 : level == 5 ? 32 : 64; - options->depth = 0; - } - - if (flags & LZMA_PRESET_EXTREME) { - options->mode = LZMA_MODE_NORMAL; - options->mf = LZMA_MF_BT4; - if (level == 3 || level == 5) { - options->nice_len = 192; - options->depth = 0; - } else { - options->nice_len = 273; - options->depth = 512; - } - } - - return false; -} diff --git a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_private.h b/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_private.h deleted file mode 100755 index a2da969f..00000000 --- a/game/client/third/minizip/lib/liblzma/lzma/lzma_encoder_private.h +++ /dev/null @@ -1,148 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file lzma_encoder_private.h -/// \brief Private definitions for LZMA encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_LZMA_ENCODER_PRIVATE_H -#define LZMA_LZMA_ENCODER_PRIVATE_H - -#include "lz_encoder.h" -#include "range_encoder.h" -#include "lzma_common.h" -#include "lzma_encoder.h" - - -// Macro to compare if the first two bytes in two buffers differ. This is -// needed in lzma_lzma_optimum_*() to test if the match is at least -// MATCH_LEN_MIN bytes. Unaligned access gives tiny gain so there's no -// reason to not use it when it is supported. -#ifdef TUKLIB_FAST_UNALIGNED_ACCESS -# define not_equal_16(a, b) \ - (*(const uint16_t *)(a) != *(const uint16_t *)(b)) -#else -# define not_equal_16(a, b) \ - ((a)[0] != (b)[0] || (a)[1] != (b)[1]) -#endif - - -// Optimal - Number of entries in the optimum array. -#define OPTS (1 << 12) - - -typedef struct { - probability choice; - probability choice2; - probability low[POS_STATES_MAX][LEN_LOW_SYMBOLS]; - probability mid[POS_STATES_MAX][LEN_MID_SYMBOLS]; - probability high[LEN_HIGH_SYMBOLS]; - - uint32_t prices[POS_STATES_MAX][LEN_SYMBOLS]; - uint32_t table_size; - uint32_t counters[POS_STATES_MAX]; - -} lzma_length_encoder; - - -typedef struct { - lzma_lzma_state state; - - bool prev_1_is_literal; - bool prev_2; - - uint32_t pos_prev_2; - uint32_t back_prev_2; - - uint32_t price; - uint32_t pos_prev; // pos_next; - uint32_t back_prev; - - uint32_t backs[REPS]; - -} lzma_optimal; - - -struct lzma_lzma1_encoder_s { - /// Range encoder - lzma_range_encoder rc; - - /// State - lzma_lzma_state state; - - /// The four most recent match distances - uint32_t reps[REPS]; - - /// Array of match candidates - lzma_match matches[MATCH_LEN_MAX + 1]; - - /// Number of match candidates in matches[] - uint32_t matches_count; - - /// Variable to hold the length of the longest match between calls - /// to lzma_lzma_optimum_*(). - uint32_t longest_match_length; - - /// True if using getoptimumfast - bool fast_mode; - - /// True if the encoder has been initialized by encoding the first - /// byte as a literal. - bool is_initialized; - - /// True if the range encoder has been flushed, but not all bytes - /// have been written to the output buffer yet. - bool is_flushed; - - uint32_t pos_mask; ///< (1 << pos_bits) - 1 - uint32_t literal_context_bits; - uint32_t literal_pos_mask; - - // These are the same as in lzma_decoder.c. See comments there. - probability literal[LITERAL_CODERS_MAX][LITERAL_CODER_SIZE]; - probability is_match[STATES][POS_STATES_MAX]; - probability is_rep[STATES]; - probability is_rep0[STATES]; - probability is_rep1[STATES]; - probability is_rep2[STATES]; - probability is_rep0_long[STATES][POS_STATES_MAX]; - probability dist_slot[DIST_STATES][DIST_SLOTS]; - probability dist_special[FULL_DISTANCES - DIST_MODEL_END]; - probability dist_align[ALIGN_SIZE]; - - // These are the same as in lzma_decoder.c except that the encoders - // include also price tables. - lzma_length_encoder match_len_encoder; - lzma_length_encoder rep_len_encoder; - - // Price tables - uint32_t dist_slot_prices[DIST_STATES][DIST_SLOTS]; - uint32_t dist_prices[DIST_STATES][FULL_DISTANCES]; - uint32_t dist_table_size; - uint32_t match_price_count; - - uint32_t align_prices[ALIGN_SIZE]; - uint32_t align_price_count; - - // Optimal - uint32_t opts_end_index; - uint32_t opts_current_index; - lzma_optimal opts[OPTS]; -}; - - -extern void lzma_lzma_optimum_fast( - lzma_lzma1_encoder *restrict coder, lzma_mf *restrict mf, - uint32_t *restrict back_res, uint32_t *restrict len_res); - -extern void lzma_lzma_optimum_normal(lzma_lzma1_encoder *restrict coder, - lzma_mf *restrict mf, uint32_t *restrict back_res, - uint32_t *restrict len_res, uint32_t position); - -#endif diff --git a/game/client/third/minizip/lib/liblzma/rangecoder/price.h b/game/client/third/minizip/lib/liblzma/rangecoder/price.h deleted file mode 100755 index 8ae02ca7..00000000 --- a/game/client/third/minizip/lib/liblzma/rangecoder/price.h +++ /dev/null @@ -1,92 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file price.h -/// \brief Probability price calculation -// -// Author: Igor Pavlov -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_PRICE_H -#define LZMA_PRICE_H - - -#define RC_MOVE_REDUCING_BITS 4 -#define RC_BIT_PRICE_SHIFT_BITS 4 -#define RC_PRICE_TABLE_SIZE (RC_BIT_MODEL_TOTAL >> RC_MOVE_REDUCING_BITS) - -#define RC_INFINITY_PRICE (UINT32_C(1) << 30) - - -/// Lookup table for the inline functions defined in this file. -extern const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE]; - - -static inline uint32_t -rc_bit_price(const probability prob, const uint32_t bit) -{ - return lzma_rc_prices[(prob ^ ((UINT32_C(0) - bit) - & (RC_BIT_MODEL_TOTAL - 1))) >> RC_MOVE_REDUCING_BITS]; -} - - -static inline uint32_t -rc_bit_0_price(const probability prob) -{ - return lzma_rc_prices[prob >> RC_MOVE_REDUCING_BITS]; -} - - -static inline uint32_t -rc_bit_1_price(const probability prob) -{ - return lzma_rc_prices[(prob ^ (RC_BIT_MODEL_TOTAL - 1)) - >> RC_MOVE_REDUCING_BITS]; -} - - -static inline uint32_t -rc_bittree_price(const probability *const probs, - const uint32_t bit_levels, uint32_t symbol) -{ - uint32_t price = 0; - symbol += UINT32_C(1) << bit_levels; - - do { - const uint32_t bit = symbol & 1; - symbol >>= 1; - price += rc_bit_price(probs[symbol], bit); - } while (symbol != 1); - - return price; -} - - -static inline uint32_t -rc_bittree_reverse_price(const probability *const probs, - uint32_t bit_levels, uint32_t symbol) -{ - uint32_t price = 0; - uint32_t model_index = 1; - - do { - const uint32_t bit = symbol & 1; - symbol >>= 1; - price += rc_bit_price(probs[model_index], bit); - model_index = (model_index << 1) + bit; - } while (--bit_levels != 0); - - return price; -} - - -static inline uint32_t -rc_direct_price(const uint32_t bits) -{ - return bits << RC_BIT_PRICE_SHIFT_BITS; -} - -#endif diff --git a/game/client/third/minizip/lib/liblzma/rangecoder/price_table.c b/game/client/third/minizip/lib/liblzma/rangecoder/price_table.c deleted file mode 100755 index ac64bf62..00000000 --- a/game/client/third/minizip/lib/liblzma/rangecoder/price_table.c +++ /dev/null @@ -1,22 +0,0 @@ -/* This file has been automatically generated by price_tablegen.c. */ - -#include "range_encoder.h" - -const uint8_t lzma_rc_prices[RC_PRICE_TABLE_SIZE] = { - 128, 103, 91, 84, 78, 73, 69, 66, - 63, 61, 58, 56, 54, 52, 51, 49, - 48, 46, 45, 44, 43, 42, 41, 40, - 39, 38, 37, 36, 35, 34, 34, 33, - 32, 31, 31, 30, 29, 29, 28, 28, - 27, 26, 26, 25, 25, 24, 24, 23, - 23, 22, 22, 22, 21, 21, 20, 20, - 19, 19, 19, 18, 18, 17, 17, 17, - 16, 16, 16, 15, 15, 15, 14, 14, - 14, 13, 13, 13, 12, 12, 12, 11, - 11, 11, 11, 10, 10, 10, 10, 9, - 9, 9, 9, 8, 8, 8, 8, 7, - 7, 7, 7, 6, 6, 6, 6, 5, - 5, 5, 5, 5, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 1, 1 -}; diff --git a/game/client/third/minizip/lib/liblzma/rangecoder/range_common.h b/game/client/third/minizip/lib/liblzma/rangecoder/range_common.h deleted file mode 100755 index 0e642419..00000000 --- a/game/client/third/minizip/lib/liblzma/rangecoder/range_common.h +++ /dev/null @@ -1,73 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file range_common.h -/// \brief Common things for range encoder and decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_RANGE_COMMON_H -#define LZMA_RANGE_COMMON_H - -#ifdef HAVE_CONFIG_H -# include "common.h" -#endif - - -/////////////// -// Constants // -/////////////// - -#define RC_SHIFT_BITS 8 -#define RC_TOP_BITS 24 -#define RC_TOP_VALUE (UINT32_C(1) << RC_TOP_BITS) -#define RC_BIT_MODEL_TOTAL_BITS 11 -#define RC_BIT_MODEL_TOTAL (UINT32_C(1) << RC_BIT_MODEL_TOTAL_BITS) -#define RC_MOVE_BITS 5 - - -//////////// -// Macros // -//////////// - -// Resets the probability so that both 0 and 1 have probability of 50 % -#define bit_reset(prob) \ - prob = RC_BIT_MODEL_TOTAL >> 1 - -// This does the same for a complete bit tree. -// (A tree represented as an array.) -#define bittree_reset(probs, bit_levels) \ - for (uint32_t bt_i = 0; bt_i < (1 << (bit_levels)); ++bt_i) \ - bit_reset((probs)[bt_i]) - - -////////////////////// -// Type definitions // -////////////////////// - -/// \brief Type of probabilities used with range coder -/// -/// This needs to be at least 12-bit integer, so uint16_t is a logical choice. -/// However, on some architecture and compiler combinations, a bigger type -/// may give better speed, because the probability variables are accessed -/// a lot. On the other hand, bigger probability type increases cache -/// footprint, since there are 2 to 14 thousand probability variables in -/// LZMA (assuming the limit of lc + lp <= 4; with lc + lp <= 12 there -/// would be about 1.5 million variables). -/// -/// With malicious files, the initialization speed of the LZMA decoder can -/// become important. In that case, smaller probability variables mean that -/// there is less bytes to write to RAM, which makes initialization faster. -/// With big probability type, the initialization can become so slow that it -/// can be a problem e.g. for email servers doing virus scanning. -/// -/// I will be sticking to uint16_t unless some specific architectures -/// are *much* faster (20-50 %) with uint32_t. -typedef uint16_t probability; - -#endif diff --git a/game/client/third/minizip/lib/liblzma/rangecoder/range_decoder.h b/game/client/third/minizip/lib/liblzma/rangecoder/range_decoder.h deleted file mode 100755 index e0b051fa..00000000 --- a/game/client/third/minizip/lib/liblzma/rangecoder/range_decoder.h +++ /dev/null @@ -1,185 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file range_decoder.h -/// \brief Range Decoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_RANGE_DECODER_H -#define LZMA_RANGE_DECODER_H - -#include "range_common.h" - - -typedef struct { - uint32_t range; - uint32_t code; - uint32_t init_bytes_left; -} lzma_range_decoder; - - -/// Reads the first five bytes to initialize the range decoder. -static inline lzma_ret -rc_read_init(lzma_range_decoder *rc, const uint8_t *restrict in, - size_t *restrict in_pos, size_t in_size) -{ - while (rc->init_bytes_left > 0) { - if (*in_pos == in_size) - return LZMA_OK; - - // The first byte is always 0x00. It could have been omitted - // in LZMA2 but it wasn't, so one byte is wasted in every - // LZMA2 chunk. - if (rc->init_bytes_left == 5 && in[*in_pos] != 0x00) - return LZMA_DATA_ERROR; - - rc->code = (rc->code << 8) | in[*in_pos]; - ++*in_pos; - --rc->init_bytes_left; - } - - return LZMA_STREAM_END; -} - - -/// Makes local copies of range decoder and *in_pos variables. Doing this -/// improves speed significantly. The range decoder macros expect also -/// variables `in' and `in_size' to be defined. -#define rc_to_local(range_decoder, in_pos) \ - lzma_range_decoder rc = range_decoder; \ - size_t rc_in_pos = (in_pos); \ - uint32_t rc_bound - - -/// Stores the local copes back to the range decoder structure. -#define rc_from_local(range_decoder, in_pos) \ -do { \ - range_decoder = rc; \ - in_pos = rc_in_pos; \ -} while (0) - - -/// Resets the range decoder structure. -#define rc_reset(range_decoder) \ -do { \ - (range_decoder).range = UINT32_MAX; \ - (range_decoder).code = 0; \ - (range_decoder).init_bytes_left = 5; \ -} while (0) - - -/// When decoding has been properly finished, rc.code is always zero unless -/// the input stream is corrupt. So checking this can catch some corrupt -/// files especially if they don't have any other integrity check. -#define rc_is_finished(range_decoder) \ - ((range_decoder).code == 0) - - -/// Read the next input byte if needed. If more input is needed but there is -/// no more input available, "goto out" is used to jump out of the main -/// decoder loop. -#define rc_normalize(seq) \ -do { \ - if (rc.range < RC_TOP_VALUE) { \ - if (unlikely(rc_in_pos == in_size)) { \ - coder->sequence = seq; \ - goto out; \ - } \ - rc.range <<= RC_SHIFT_BITS; \ - rc.code = (rc.code << RC_SHIFT_BITS) | in[rc_in_pos++]; \ - } \ -} while (0) - - -/// Start decoding a bit. This must be used together with rc_update_0() -/// and rc_update_1(): -/// -/// rc_if_0(prob, seq) { -/// rc_update_0(prob); -/// // Do something -/// } else { -/// rc_update_1(prob); -/// // Do something else -/// } -/// -#define rc_if_0(prob, seq) \ - rc_normalize(seq); \ - rc_bound = (rc.range >> RC_BIT_MODEL_TOTAL_BITS) * (prob); \ - if (rc.code < rc_bound) - - -/// Update the range decoder state and the used probability variable to -/// match a decoded bit of 0. -#define rc_update_0(prob) \ -do { \ - rc.range = rc_bound; \ - prob += (RC_BIT_MODEL_TOTAL - (prob)) >> RC_MOVE_BITS; \ -} while (0) - - -/// Update the range decoder state and the used probability variable to -/// match a decoded bit of 1. -#define rc_update_1(prob) \ -do { \ - rc.range -= rc_bound; \ - rc.code -= rc_bound; \ - prob -= (prob) >> RC_MOVE_BITS; \ -} while (0) - - -/// Decodes one bit and runs action0 or action1 depending on the decoded bit. -/// This macro is used as the last step in bittree reverse decoders since -/// those don't use "symbol" for anything else than indexing the probability -/// arrays. -#define rc_bit_last(prob, action0, action1, seq) \ -do { \ - rc_if_0(prob, seq) { \ - rc_update_0(prob); \ - action0; \ - } else { \ - rc_update_1(prob); \ - action1; \ - } \ -} while (0) - - -/// Decodes one bit, updates "symbol", and runs action0 or action1 depending -/// on the decoded bit. -#define rc_bit(prob, action0, action1, seq) \ - rc_bit_last(prob, \ - symbol <<= 1; action0, \ - symbol = (symbol << 1) + 1; action1, \ - seq); - - -/// Like rc_bit() but add "case seq:" as a prefix. This makes the unrolled -/// loops more readable because the code isn't littered with "case" -/// statements. On the other hand this also makes it less readable, since -/// spotting the places where the decoder loop may be restarted is less -/// obvious. -#define rc_bit_case(prob, action0, action1, seq) \ - case seq: rc_bit(prob, action0, action1, seq) - - -/// Decode a bit without using a probability. -#define rc_direct(dest, seq) \ -do { \ - rc_normalize(seq); \ - rc.range >>= 1; \ - rc.code -= rc.range; \ - rc_bound = UINT32_C(0) - (rc.code >> 31); \ - rc.code += rc.range & rc_bound; \ - dest = (dest << 1) + (rc_bound + 1); \ -} while (0) - - -// NOTE: No macros are provided for bittree decoding. It seems to be simpler -// to just write them open in the code. - -#endif diff --git a/game/client/third/minizip/lib/liblzma/rangecoder/range_encoder.h b/game/client/third/minizip/lib/liblzma/rangecoder/range_encoder.h deleted file mode 100755 index 1e1c3699..00000000 --- a/game/client/third/minizip/lib/liblzma/rangecoder/range_encoder.h +++ /dev/null @@ -1,231 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -/// \file range_encoder.h -/// \brief Range Encoder -/// -// Authors: Igor Pavlov -// Lasse Collin -// -// This file has been put into the public domain. -// You can do whatever you want with this file. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef LZMA_RANGE_ENCODER_H -#define LZMA_RANGE_ENCODER_H - -#include "range_common.h" -#include "price.h" - - -/// Maximum number of symbols that can be put pending into lzma_range_encoder -/// structure between calls to lzma_rc_encode(). For LZMA, 52+5 is enough -/// (match with big distance and length followed by range encoder flush). -#define RC_SYMBOLS_MAX 58 - - -typedef struct { - uint64_t low; - uint64_t cache_size; - uint32_t range; - uint8_t cache; - - /// Number of symbols in the tables - size_t count; - - /// rc_encode()'s position in the tables - size_t pos; - - /// Symbols to encode - enum { - RC_BIT_0, - RC_BIT_1, - RC_DIRECT_0, - RC_DIRECT_1, - RC_FLUSH, - } symbols[RC_SYMBOLS_MAX]; - - /// Probabilities associated with RC_BIT_0 or RC_BIT_1 - probability *probs[RC_SYMBOLS_MAX]; - -} lzma_range_encoder; - - -static inline void -rc_reset(lzma_range_encoder *rc) -{ - rc->low = 0; - rc->cache_size = 1; - rc->range = UINT32_MAX; - rc->cache = 0; - rc->count = 0; - rc->pos = 0; -} - - -static inline void -rc_bit(lzma_range_encoder *rc, probability *prob, uint32_t bit) -{ - rc->symbols[rc->count] = bit; - rc->probs[rc->count] = prob; - ++rc->count; -} - - -static inline void -rc_bittree(lzma_range_encoder *rc, probability *probs, - uint32_t bit_count, uint32_t symbol) -{ - uint32_t model_index = 1; - - do { - const uint32_t bit = (symbol >> --bit_count) & 1; - rc_bit(rc, &probs[model_index], bit); - model_index = (model_index << 1) + bit; - } while (bit_count != 0); -} - - -static inline void -rc_bittree_reverse(lzma_range_encoder *rc, probability *probs, - uint32_t bit_count, uint32_t symbol) -{ - uint32_t model_index = 1; - - do { - const uint32_t bit = symbol & 1; - symbol >>= 1; - rc_bit(rc, &probs[model_index], bit); - model_index = (model_index << 1) + bit; - } while (--bit_count != 0); -} - - -static inline void -rc_direct(lzma_range_encoder *rc, - uint32_t value, uint32_t bit_count) -{ - do { - rc->symbols[rc->count++] - = RC_DIRECT_0 + ((value >> --bit_count) & 1); - } while (bit_count != 0); -} - - -static inline void -rc_flush(lzma_range_encoder *rc) -{ - for (size_t i = 0; i < 5; ++i) - rc->symbols[rc->count++] = RC_FLUSH; -} - - -static inline bool -rc_shift_low(lzma_range_encoder *rc, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - if ((uint32_t)(rc->low) < (uint32_t)(0xFF000000) - || (uint32_t)(rc->low >> 32) != 0) { - do { - if (*out_pos == out_size) - return true; - - out[*out_pos] = rc->cache + (uint8_t)(rc->low >> 32); - ++*out_pos; - rc->cache = 0xFF; - - } while (--rc->cache_size != 0); - - rc->cache = (rc->low >> 24) & 0xFF; - } - - ++rc->cache_size; - rc->low = (rc->low & 0x00FFFFFF) << RC_SHIFT_BITS; - - return false; -} - - -static inline bool -rc_encode(lzma_range_encoder *rc, - uint8_t *out, size_t *out_pos, size_t out_size) -{ - assert(rc->count <= RC_SYMBOLS_MAX); - - while (rc->pos < rc->count) { - // Normalize - if (rc->range < RC_TOP_VALUE) { - if (rc_shift_low(rc, out, out_pos, out_size)) - return true; - - rc->range <<= RC_SHIFT_BITS; - } - - // Encode a bit - switch (rc->symbols[rc->pos]) { - case RC_BIT_0: { - probability prob = *rc->probs[rc->pos]; - rc->range = (rc->range >> RC_BIT_MODEL_TOTAL_BITS) - * prob; - prob += (RC_BIT_MODEL_TOTAL - prob) >> RC_MOVE_BITS; - *rc->probs[rc->pos] = prob; - break; - } - - case RC_BIT_1: { - probability prob = *rc->probs[rc->pos]; - const uint32_t bound = prob * (rc->range - >> RC_BIT_MODEL_TOTAL_BITS); - rc->low += bound; - rc->range -= bound; - prob -= prob >> RC_MOVE_BITS; - *rc->probs[rc->pos] = prob; - break; - } - - case RC_DIRECT_0: - rc->range >>= 1; - break; - - case RC_DIRECT_1: - rc->range >>= 1; - rc->low += rc->range; - break; - - case RC_FLUSH: - // Prevent further normalizations. - rc->range = UINT32_MAX; - - // Flush the last five bytes (see rc_flush()). - do { - if (rc_shift_low(rc, out, out_pos, out_size)) - return true; - } while (++rc->pos < rc->count); - - // Reset the range encoder so we are ready to continue - // encoding if we weren't finishing the stream. - rc_reset(rc); - return false; - - default: - assert(0); - break; - } - - ++rc->pos; - } - - rc->count = 0; - rc->pos = 0; - - return false; -} - - -static inline uint64_t -rc_pending(const lzma_range_encoder *rc) -{ - return rc->cache_size + 5 - 1; -} - -#endif diff --git a/game/client/third/minizip/minizip.c b/game/client/third/minizip/minizip.c deleted file mode 100755 index a463a33d..00000000 --- a/game/client/third/minizip/minizip.c +++ /dev/null @@ -1,762 +0,0 @@ -/* minizip.c - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2009-2010 Mathias Svensson - Modifications for Zip64 support - http://result42.com - Copyright (C) 2007-2008 Even Rouault - Modifications of Unzip for Zip64 - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#include -#include -#include -#include -#include -#include - -#include "mz.h" -#include "mz_os.h" -#include "mz_strm.h" -#include "mz_strm_buf.h" -#include "mz_strm_split.h" -#include "mz_zip.h" - -/***************************************************************************/ - -void minizip_banner(void) -{ - printf("Minizip %s - https://github.com/nmoinvaz/minizip\n", MZ_VERSION); - printf("---------------------------------------------------\n"); -} - -void minizip_help(void) -{ - printf("Usage : minizip [-x -d dir|-l] [-o] [-a] [-j] [-0 to -9] [-b|-m] [-k 512] [-p pwd] [-s] file.zip [files]\n\n" \ - " -x Extract files\n" \ - " -l List files\n" \ - " -d Destination directory\n" \ - " -o Overwrite existing files\n" \ - " -a Append to existing zip file\n" \ - " -u Buffered reading and writing\n" \ - " -i Include full path of files\n" \ - " -0 Store only\n" \ - " -1 Compress faster\n" \ - " -9 Compress better\n" \ - " -k Disk size in KB\n" \ - " -p Encryption password\n"); -#ifdef HAVE_AES - printf(" -s AES encryption\n"); -#endif -#ifdef HAVE_BZIP2 - printf(" -b BZIP2 compression\n"); -#endif -#ifdef HAVE_LZMA - printf(" -m LZMA compression\n"); -#endif - printf("\n"); -} - -/***************************************************************************/ - -typedef struct minizip_opt_s { - int16_t include_path; - int16_t compress_level; - int16_t compress_method; - int16_t overwrite; -#ifdef HAVE_AES - int16_t aes; -#endif -} minizip_opt; - -/***************************************************************************/ - -int32_t minizip_add_path(void *handle, const char *path, const char *filenameinzip, const char *password, int16_t is_dir, minizip_opt *options) -{ - mz_zip_file file_info; - int32_t read = 0; - int32_t written = 0; - int32_t err = MZ_OK; - int32_t err_close = MZ_OK; - void *stream = NULL; - char buf[INT16_MAX]; - - - memset(&file_info, 0, sizeof(file_info)); - - // The path name saved, should not include a leading slash. - // If it did, windows/xp and dynazip couldn't read the zip file. - - if (filenameinzip == NULL) - filenameinzip = path; - while (filenameinzip[0] == '\\' || filenameinzip[0] == '/') - filenameinzip += 1; - - // Get information about the file on disk so we can store it in zip - printf("Adding: %s\n", filenameinzip); - - file_info.version_madeby = MZ_VERSION_MADEBY; - file_info.compression_method = options->compress_method; - file_info.filename = filenameinzip; - file_info.uncompressed_size = mz_os_get_file_size(path); - -#ifdef HAVE_AES - if (options->aes) - file_info.aes_version = MZ_AES_VERSION; -#endif - - mz_os_get_file_date(path, &file_info.modified_date, &file_info.accessed_date, - &file_info.creation_date); - mz_os_get_file_attribs(path, &file_info.external_fa); - - // Add to zip - err = mz_zip_entry_write_open(handle, &file_info, options->compress_level, password); - if (err != MZ_OK) - { - printf("Error in opening %s in zip file (%d)\n", filenameinzip, err); - return err; - } - - if (!is_dir) - { - mz_stream_os_create(&stream); - - err = mz_stream_os_open(stream, path, MZ_OPEN_MODE_READ); - - if (err == MZ_OK) - { - // Read contents of file and write it to zip - do - { - read = mz_stream_os_read(stream, buf, sizeof(buf)); - if (read < 0) - { - err = mz_stream_os_error(stream); - printf("Error %d in reading %s\n", err, filenameinzip); - break; - } - if (read == 0) - break; - - written = mz_zip_entry_write(handle, buf, read); - if (written != read) - { - err = mz_stream_os_error(stream); - printf("Error in writing %s in the zip file (%d)\n", filenameinzip, err); - break; - } - } while (err == MZ_OK); - - mz_stream_os_close(stream); - } - else - { - printf("Error in opening %s for reading\n", path); - } - - mz_stream_os_delete(&stream); - } - - err_close = mz_zip_entry_close(handle); - if (err_close != MZ_OK) - { - printf("Error in closing %s in the zip file (%d)\n", filenameinzip, err_close); - err = err_close; - } - - return err; -} - -int32_t minizip_add(void *handle, const char *path, const char *root_path, const char *password, minizip_opt *options, uint8_t recursive) -{ - DIR *dir = NULL; - struct dirent *entry = NULL; - int32_t err = MZ_OK; - int16_t is_dir = 0; - char full_path[320]; - const char *filename = NULL; - const char *filenameinzip = path; - - - if (mz_os_is_dir(path) == MZ_OK) - is_dir = 1; - - // Construct the filename that our file will be stored in the zip as - if (root_path == NULL) - root_path = path; - - // Should the file be stored with any path info at all? - if (!options->include_path) - { - if (!is_dir && root_path == path) - { - if (mz_path_get_filename(filenameinzip, &filename) == MZ_OK) - filenameinzip = filename; - } - else - { - filenameinzip += strlen(root_path); - } - } - - if (*filenameinzip != 0) - err = minizip_add_path(handle, path, filenameinzip, password, is_dir, options); - - if (!is_dir) - return err; - - dir = mz_os_open_dir(path); - - if (dir == NULL) - { - printf("Cannot enumerate directory %s\n", path); - return MZ_EXIST_ERROR; - } - - while ((entry = mz_os_read_dir(dir)) != NULL) - { - if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) - continue; - - full_path[0] = 0; - mz_path_combine(full_path, path, sizeof(full_path)); - mz_path_combine(full_path, entry->d_name, sizeof(full_path)); - - if (!recursive && mz_os_is_dir(full_path)) - continue; - - err = minizip_add(handle, full_path, root_path, password, options, recursive); - if (err != MZ_OK) - return err; - } - - mz_os_close_dir(dir); - return MZ_OK; -} - -/***************************************************************************/ - -int32_t minizip_list(void *handle) -{ - mz_zip_file *file_info = NULL; - uint32_t ratio = 0; - int16_t level = 0; - int32_t err = MZ_OK; - struct tm tmu_date; - const char *string_method = NULL; - char crypt = ' '; - - - err = mz_zip_goto_first_entry(handle); - - if (err != MZ_OK && err != MZ_END_OF_LIST) - { - printf("Error %d going to first entry in zip file\n", err); - return err; - } - - printf(" Length Method Size Attribs Ratio Date Time CRC-32 Name\n"); - printf(" ------ ------ ---- ------- ----- ---- ---- ------ ----\n"); - - while (err == MZ_OK) - { - err = mz_zip_entry_get_info(handle, &file_info); - - if (err != MZ_OK) - { - printf("Error %d getting entry info in zip file\n", err); - break; - } - - ratio = 0; - if (file_info->uncompressed_size > 0) - ratio = (uint32_t)((file_info->compressed_size * 100) / file_info->uncompressed_size); - - // Display a '*' if the file is encrypted - if (file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) - crypt = '*'; - - switch (file_info->compression_method) - { - case MZ_COMPRESS_METHOD_RAW: - string_method = "Stored"; - break; - case MZ_COMPRESS_METHOD_DEFLATE: - level = (int16_t)((file_info->flag & 0x6) / 2); - if (level == 0) - string_method = "Defl:N"; - else if (level == 1) - string_method = "Defl:X"; - else if ((level == 2) || (level == 3)) - string_method = "Defl:F"; // 2: fast , 3: extra fast - else - string_method = "Defl:?"; - break; - case MZ_COMPRESS_METHOD_BZIP2: - string_method = "BZip2"; - break; - case MZ_COMPRESS_METHOD_LZMA: - string_method = "LZMA"; - break; - default: - string_method = "Unknwn"; - } - - mz_zip_time_t_to_tm(file_info->modified_date, &tmu_date); - - printf(" %7"PRIu64" %6s%c %7"PRIu64" %8"PRIx32" %3"PRIu32"%% %2.2"PRIu32"-%2.2"PRIu32\ - "-%2.2"PRIu32" %2.2"PRIu32":%2.2"PRIu32" %8.8"PRIx32" %s\n", - file_info->uncompressed_size, string_method, crypt, - file_info->compressed_size, file_info->external_fa, ratio, - (uint32_t)tmu_date.tm_mon + 1, (uint32_t)tmu_date.tm_mday, - (uint32_t)tmu_date.tm_year % 100, - (uint32_t)tmu_date.tm_hour, (uint32_t)tmu_date.tm_min, - file_info->crc, file_info->filename); - - err = mz_zip_goto_next_entry(handle); - - if (err != MZ_OK && err != MZ_END_OF_LIST) - { - printf("Error %d going to next entry in zip file\n", err); - return err; - } - } - - if (err == MZ_END_OF_LIST) - return MZ_OK; - - return err; -} - -/***************************************************************************/ - -int32_t minizip_extract_currentfile(void *handle, const char *destination, const char *password, minizip_opt *options) -{ - mz_zip_file *file_info = NULL; - uint8_t buf[INT16_MAX]; - int32_t read = 0; - int32_t written = 0; - int32_t err = MZ_OK; - int32_t err_close = MZ_OK; - void *stream = NULL; - const char *filename = NULL; - char out_path[512]; - char directory[512]; - - - err = mz_zip_entry_get_info(handle, &file_info); - - if (err != MZ_OK) - { - printf("Error %d getting entry info in zip file\n", err); - return err; - } - - if (mz_path_get_filename(file_info->filename, &filename) != MZ_OK) - filename = file_info->filename; - - // Construct output path - out_path[0] = 0; - if ((*file_info->filename == '/') || (file_info->filename[1] == ':')) - { - strncpy(out_path, file_info->filename, sizeof(out_path)); - } - else - { - if (destination != NULL) - mz_path_combine(out_path, destination, sizeof(out_path)); - mz_path_combine(out_path, file_info->filename, sizeof(out_path)); - } - - // If zip entry is a directory then create it on disk - if (mz_zip_attrib_is_dir(file_info->external_fa, file_info->version_madeby) == MZ_OK) - { - printf("Creating directory: %s\n", out_path); - mz_make_dir(out_path); - return err; - } - - err = mz_zip_entry_read_open(handle, 0, password); - - if (err != MZ_OK) - { - printf("Error %d opening entry in zip file\n", err); - return err; - } - - // Determine if the file should be overwritten or not and ask the user if needed - if ((err == MZ_OK) && (options->overwrite == 0) && (mz_os_file_exists(out_path) == MZ_OK)) - { - char rep = 0; - do - { - char answer[128]; - printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ", out_path); - if (scanf("%1s", answer) != 1) - exit(EXIT_FAILURE); - rep = answer[0]; - if ((rep >= 'a') && (rep <= 'z')) - rep -= 0x20; - } - while ((rep != 'Y') && (rep != 'N') && (rep != 'A')); - - if (rep == 'N') - return err; - if (rep == 'A') - options->overwrite = 1; - } - - mz_stream_os_create(&stream); - - // Create the file on disk so we can unzip to it - if (err == MZ_OK) - { - // Some zips don't contain directory alone before file - if ((mz_stream_os_open(stream, out_path, MZ_OPEN_MODE_CREATE) != MZ_OK) && - (filename != file_info->filename)) - { - // Create the directory of the output path - strncpy(directory, out_path, sizeof(directory)); - - mz_path_remove_filename(directory); - mz_make_dir(directory); - - mz_stream_os_open(stream, out_path, MZ_OPEN_MODE_CREATE); - } - } - - // Read from the zip, unzip to buffer, and write to disk - if (mz_stream_os_is_open(stream) == MZ_OK) - { - printf(" Extracting: %s\n", out_path); - while (1) - { - read = mz_zip_entry_read(handle, buf, sizeof(buf)); - if (read < 0) - { - err = read; - printf("Error %d reading entry in zip file\n", err); - break; - } - if (read == 0) - break; - written = mz_stream_os_write(stream, buf, read); - if (written != read) - { - err = mz_stream_os_error(stream); - printf("Error %d in writing extracted file\n", err); - break; - } - } - - mz_stream_os_close(stream); - - // Set the time of the file that has been unzipped - if (err == MZ_OK) - mz_os_set_file_date(out_path, file_info->modified_date, file_info->accessed_date, - file_info->creation_date); - } - else - { - printf("Error opening %s\n", out_path); - } - - mz_stream_os_delete(&stream); - - err_close = mz_zip_entry_close(handle); - if (err_close != MZ_OK) - { - printf("Error %d closing entry in zip file\n", err_close); - err = err_close; - } - - return err; -} - -int32_t minizip_extract_all(void *handle, const char *destination, const char *password, minizip_opt *options) -{ - int32_t err = MZ_OK; - - err = mz_zip_goto_first_entry(handle); - - if (err == MZ_END_OF_LIST) - return MZ_OK; - if (err != MZ_OK) - printf("Error %d going to first entry in zip file\n", err); - - while (err == MZ_OK) - { - err = minizip_extract_currentfile(handle, destination, password, options); - - if (err != MZ_OK) - break; - - err = mz_zip_goto_next_entry(handle); - - if (err == MZ_END_OF_LIST) - return MZ_OK; - if (err != MZ_OK) - printf("Error %d going to next entry in zip file\n", err); - } - - return err; -} - -int32_t minizip_extract_onefile(void *handle, const char *filename, const char *destination, const char *password, minizip_opt *options) -{ - int32_t err = mz_zip_locate_entry(handle, filename, NULL); - - if (err != MZ_OK) - { - printf("File %s not found in the zip file\n", filename); - return err; - } - - return minizip_extract_currentfile(handle, destination, password, options); -} - -/***************************************************************************/ - -#ifndef NOMAIN -int main(int argc, char *argv[]) -{ - void *handle = NULL; - void *file_stream = NULL; - void *split_stream = NULL; - void *buf_stream = NULL; - char *path = NULL; - char *password = NULL; - char *destination = NULL; - char *filename_to_extract = NULL; - minizip_opt options; - int64_t disk_size = 0; - int32_t path_arg = 0; - uint8_t do_list = 0; - uint8_t do_extract = 0; - uint8_t buffered = 0; - int16_t mode = 0; - uint8_t append = 0; - int32_t err_close = 0; - int32_t err = 0; - int32_t i = 0; - - minizip_banner(); - if (argc == 1) - { - minizip_help(); - return 0; - } - - memset(&options, 0, sizeof(options)); - - options.compress_method = MZ_COMPRESS_METHOD_DEFLATE; - options.compress_level = MZ_COMPRESS_LEVEL_DEFAULT; - - // Parse command line options - for (i = 1; i < argc; i += 1) - { - if ((*argv[i]) == '-') - { - const char *p = argv[i] + 1; - - while ((*p) != '\0') - { - char c = *(p++); - if ((c == 'l') || (c == 'L')) - do_list = 1; - if ((c == 'x') || (c == 'X')) - do_extract = 1; - if ((c == 'a') || (c == 'A')) - append = 1; - if ((c == 'u') || (c == 'U')) - buffered = 1; - if ((c == 'o') || (c == 'O')) - options.overwrite = 1; - if ((c == 'i') || (c == 'I')) - options.include_path = 1; - if ((c >= '0') && (c <= '9')) - { - options.compress_level = (c - '0'); - if (options.compress_level == 0) - options.compress_method = MZ_COMPRESS_METHOD_RAW; - } - -#ifdef HAVE_BZIP2 - if ((c == 'b') || (c == 'B')) - options.compress_method = MZ_COMPRESS_METHOD_BZIP2; -#endif -#ifdef HAVE_LZMA - if ((c == 'm') || (c == 'M')) - options.compress_method = MZ_COMPRESS_METHOD_LZMA; -#endif -#ifdef HAVE_AES - if ((c == 's') || (c == 'S')) - options.aes = 1; -#endif - if (((c == 'k') || (c == 'K')) && (i + 1 < argc)) - { - disk_size = atoi(argv[i + 1]) * 1024; - i += 1; - } - if (((c == 'd') || (c == 'D')) && (i + 1 < argc)) - { - destination = argv[i + 1]; - i += 1; - } - if (((c == 'p') || (c == 'P')) && (i + 1 < argc)) - { - password = argv[i + 1]; - i += 1; - } - } - - continue; - } - - if (path_arg == 0) - path_arg = i; - } - - if (path_arg == 0) - { - minizip_help(); - return 0; - } - - path = argv[path_arg]; - - mode = MZ_OPEN_MODE_READ; - - if ((do_list == 0) && (do_extract == 0)) - { - mode |= MZ_OPEN_MODE_WRITE; - - if (mz_os_file_exists(path) != MZ_OK) - { - // If the file doesn't exist, we don't append file - mode |= MZ_OPEN_MODE_CREATE; - } - else if (append == 1) - { - mode |= MZ_OPEN_MODE_APPEND; - } - else if (options.overwrite == 0) - { - // If ask the user what to do because append and overwrite args not set - char rep = 0; - do - { - char answer[128]; - printf("The file %s exists. Overwrite ? [y]es, [n]o, [a]ppend : ", path); - if (scanf("%1s", answer) != 1) - exit(EXIT_FAILURE); - rep = answer[0]; - - if ((rep >= 'a') && (rep <= 'z')) - rep -= 0x20; - } - while ((rep != 'Y') && (rep != 'N') && (rep != 'A')); - - if (rep == 'A') - { - mode |= MZ_OPEN_MODE_APPEND; - } - else if (rep == 'Y') - { - mode |= MZ_OPEN_MODE_CREATE; - } - else if (rep == 'N') - { - minizip_help(); - return 0; - } - } - } - - mz_stream_os_create(&file_stream); - mz_stream_buffered_create(&buf_stream); - mz_stream_split_create(&split_stream); - - if (buffered) - { - mz_stream_set_base(buf_stream, file_stream); - mz_stream_set_base(split_stream, buf_stream); - } - else - { - mz_stream_set_base(split_stream, file_stream); - } - - mz_stream_split_set_prop_int64(split_stream, MZ_STREAM_PROP_DISK_SIZE, disk_size); - - err = mz_stream_open(split_stream, path, mode); - - if (err != MZ_OK) - { - printf("Error opening file %s\n", path); - } - else - { - handle = mz_zip_open(split_stream, mode); - - if (handle == NULL) - { - printf("Error opening zip %s\n", path); - err = MZ_FORMAT_ERROR; - } - - if (do_list) - { - err = minizip_list(handle); - } - else if (do_extract) - { - // Create target directory if it doesn't exist - if (destination != NULL) - mz_make_dir(destination); - - if (argc > path_arg + 1) - filename_to_extract = argv[path_arg + 1]; - - if (filename_to_extract == NULL) - err = minizip_extract_all(handle, destination, password, &options); - else - err = minizip_extract_onefile(handle, filename_to_extract, destination, password, &options); - } - else - { - printf("Creating %s\n", path); - - // Go through command line args looking for files to add to zip - for (i = path_arg + 1; (i < argc) && (err == MZ_OK); i += 1) - err = minizip_add(handle, argv[i], NULL, password, &options, 1); - - mz_zip_set_version_madeby(handle, MZ_VERSION_MADEBY); - } - - err_close = mz_zip_close(handle); - - if (err_close != MZ_OK) - { - printf("Error in closing %s (%d)\n", path, err_close); - err = err_close; - } - - mz_stream_close(split_stream); - } - - mz_stream_split_delete(&split_stream); - mz_stream_buffered_delete(&buf_stream); - mz_stream_os_delete(&file_stream); - - return err; -} -#endif diff --git a/game/client/third/minizip/minizip.pc.cmakein b/game/client/third/minizip/minizip.pc.cmakein deleted file mode 100755 index bacb18ad..00000000 --- a/game/client/third/minizip/minizip.pc.cmakein +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@ -libdir=@INSTALL_LIB_DIR@ -sharedlibdir=@INSTALL_LIB_DIR@ -includedir=@INSTALL_INC_DIR@ - -Name: minizip -Description: Minizip zip file manipulation library -Version: @VERSION@ - -Requires: zlib -Libs: -L${libdir} -L${sharedlibdir} -lminizip -Cflags: -I${includedir} diff --git a/game/client/third/minizip/mz.h b/game/client/third/minizip/mz.h deleted file mode 100755 index 5f1a1ebd..00000000 --- a/game/client/third/minizip/mz.h +++ /dev/null @@ -1,110 +0,0 @@ -/* mz.h -- Errors codes, zip flags and magic - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_H -#define MZ_H - -#ifdef __cplusplus -extern "C" { -#endif - -//mz_zip.c:1215:10: error: ZLIB or LZMA required for CRC32 -#define HAVE_ZLIB true - -/***************************************************************************/ - -// MZ_VERSION -#define MZ_VERSION ("2.3.3") - -// MZ_ERROR -#define MZ_OK (0) -#define MZ_STREAM_ERROR (-1) -#define MZ_DATA_ERROR (-3) -#define MZ_MEM_ERROR (-4) -#define MZ_END_OF_LIST (-100) -#define MZ_END_OF_STREAM (-101) -#define MZ_PARAM_ERROR (-102) -#define MZ_FORMAT_ERROR (-103) -#define MZ_INTERNAL_ERROR (-104) -#define MZ_CRC_ERROR (-105) -#define MZ_CRYPT_ERROR (-106) -#define MZ_EXIST_ERROR (-107) -#define MZ_PASSWORD_ERROR (-108) - -// MZ_OPEN -#define MZ_OPEN_MODE_READ (0x01) -#define MZ_OPEN_MODE_WRITE (0x02) -#define MZ_OPEN_MODE_READWRITE (MZ_OPEN_MODE_READ | MZ_OPEN_MODE_WRITE) -#define MZ_OPEN_MODE_APPEND (0x04) -#define MZ_OPEN_MODE_CREATE (0x08) -#define MZ_OPEN_MODE_EXISTING (0x10) - -// MZ_SEEK -#define MZ_SEEK_SET (0) -#define MZ_SEEK_CUR (1) -#define MZ_SEEK_END (2) - -// MZ_COMPRESS -#define MZ_COMPRESS_METHOD_RAW (0) -#define MZ_COMPRESS_METHOD_DEFLATE (8) -#define MZ_COMPRESS_METHOD_BZIP2 (12) -#define MZ_COMPRESS_METHOD_LZMA (14) -#define MZ_COMPRESS_METHOD_AES (99) - -#define MZ_COMPRESS_LEVEL_DEFAULT (-1) -#define MZ_COMPRESS_LEVEL_FAST (2) -#define MZ_COMPRESS_LEVEL_NORMAL (6) -#define MZ_COMPRESS_LEVEL_BEST (9) - -// MZ_ZIP -#define MZ_ZIP_FLAG_ENCRYPTED (1 << 0) -#define MZ_ZIP_FLAG_LZMA_EOS_MARKER (1 << 1) -#define MZ_ZIP_FLAG_DEFLATE_MAX (1 << 1) -#define MZ_ZIP_FLAG_DEFLATE_NORMAL (0) -#define MZ_ZIP_FLAG_DEFLATE_FAST (1 << 2) -#define MZ_ZIP_FLAG_DEFLATE_SUPER_FAST (MZ_ZIP_FLAG_DEFLATE_FAST | \ - MZ_ZIP_FLAG_DEFLATE_MAX) -#define MZ_ZIP_FLAG_DATA_DESCRIPTOR (1 << 3) - -// MZ_ZIP64 -#define MZ_ZIP64_AUTO (0) -#define MZ_ZIP64_FORCE (1) -#define MZ_ZIP64_DISABLE (2) - -// MZ_HOST_SYSTEM -#define MZ_HOST_SYSTEM_MSDOS (0) -#define MZ_HOST_SYSTEM_UNIX (3) -#define MZ_HOST_SYSTEM_WINDOWS_NTFS (10) -#define MZ_HOST_SYSTEM_OSX_DARWIN (19) - -// MZ_AES -#define MZ_AES_VERSION (1) -#define MZ_AES_ENCRYPTION_MODE_128 (0x01) -#define MZ_AES_ENCRYPTION_MODE_192 (0x02) -#define MZ_AES_ENCRYPTION_MODE_256 (0x03) - -// MZ_UTILITY -#define MZ_UNUSED(SYMBOL) ((void)SYMBOL) - -#ifndef MZ_CUSTOM_ALLOC -#define MZ_ALLOC(SIZE) (malloc(SIZE)) -#endif -#ifndef MZ_CUSTOM_FREE -#define MZ_FREE(PTR) (free(PTR)) -#endif - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_compat.c b/game/client/third/minizip/mz_compat.c deleted file mode 100755 index 811d24ac..00000000 --- a/game/client/third/minizip/mz_compat.c +++ /dev/null @@ -1,681 +0,0 @@ -/* mz_compat.c -- Backwards compatible interface for older versions - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#include -#include -#include - -#include "mz.h" -#include "mz_os.h" -#include "mz_strm.h" -#include "mz_strm_zlib.h" -#include "mz_zip.h" - -#include "mz_compat.h" - -/***************************************************************************/ - -typedef struct mz_compat_s { - void *stream; - void *handle; -} mz_compat; - -/***************************************************************************/ - -extern zipFile ZEXPORT zipOpen(const char *path, int append) -{ - zlib_filefunc64_def pzlib = mz_stream_os_get_interface(); - return zipOpen2(path, append, NULL, &pzlib); -} - -extern zipFile ZEXPORT zipOpen64(const void *path, int append) -{ - zlib_filefunc64_def pzlib = mz_stream_os_get_interface(); - return zipOpen2(path, append, NULL, &pzlib); -} - -extern zipFile ZEXPORT zipOpen2(const char *path, int append, const char **globalcomment, - zlib_filefunc_def *pzlib_filefunc_def) -{ - return zipOpen2_64(path, append, globalcomment, pzlib_filefunc_def); -} - -extern zipFile ZEXPORT zipOpen2_64(const void *path, int append, const char **globalcomment, - zlib_filefunc64_def *pzlib_filefunc_def) -{ - mz_compat *compat = NULL; - int32_t mode = MZ_OPEN_MODE_READWRITE; - void *handle = NULL; - void *stream = NULL; - - if (pzlib_filefunc_def) - { - if (mz_stream_create(&stream, (mz_stream_vtbl *)*pzlib_filefunc_def) == NULL) - return NULL; - } - else - { - if (mz_stream_os_create(&stream) == NULL) - return NULL; - } - - switch (append) - { - case APPEND_STATUS_CREATE: - mode |= MZ_OPEN_MODE_CREATE; - break; - case APPEND_STATUS_CREATEAFTER: - mode |= MZ_OPEN_MODE_CREATE | MZ_OPEN_MODE_APPEND; - break; - case APPEND_STATUS_ADDINZIP: - break; - } - - if (mz_stream_open(stream, path, mode) != MZ_OK) - { - mz_stream_delete(&stream); - return NULL; - } - - handle = mz_zip_open(stream, mode); - - if (handle == NULL) - { - mz_stream_delete(&stream); - return NULL; - } - - if (globalcomment != NULL) - mz_zip_get_comment(handle, globalcomment); - - compat = (mz_compat *)MZ_ALLOC(sizeof(mz_compat)); - compat->handle = handle; - compat->stream = stream; - - return (zipFile)compat; -} - -extern int ZEXPORT zipOpenNewFileInZip5(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base, int zip64) -{ - mz_compat *compat = (mz_compat *)file; - mz_zip_file file_info; - uint64_t dos_date = 0; - - - MZ_UNUSED(strategy); - MZ_UNUSED(memLevel); - MZ_UNUSED(windowBits); - MZ_UNUSED(size_extrafield_local); - MZ_UNUSED(extrafield_local); - MZ_UNUSED(crc_for_crypting); - - if (compat == NULL) - return ZIP_PARAMERROR; - - memset(&file_info, 0, sizeof(file_info)); - - if (zipfi != NULL) - { - if (zipfi->dosDate != 0) - dos_date = zipfi->dosDate; - else - dos_date = mz_zip_tm_to_dosdate(&zipfi->tmz_date); - - file_info.modified_date = mz_zip_dosdate_to_time_t(dos_date); - file_info.external_fa = zipfi->external_fa; - file_info.internal_fa = zipfi->internal_fa; - } - - if (filename == NULL) - filename = "-"; - - file_info.compression_method = compression_method; - file_info.filename = filename; - //file_info.extrafield_local = extrafield_local; - //file_info.extrafield_local_size = size_extrafield_local; - file_info.extrafield = extrafield_global; - file_info.extrafield_size = size_extrafield_global; - file_info.version_madeby = version_madeby; - file_info.comment = comment; - file_info.flag = flag_base; - if (zip64) - file_info.zip64 = MZ_ZIP64_FORCE; - else - file_info.zip64 = MZ_ZIP64_DISABLE; -#ifdef HAVE_AES - if (password) - file_info.aes_version = MZ_AES_VERSION; -#endif - - if (raw) - level = 0; - - return mz_zip_entry_write_open(compat->handle, &file_info, (int16_t)level, password); -} - -extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base, int zip64) -{ - return zipOpenNewFileInZip5(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits, - memLevel, strategy, password, crc_for_crypting, version_madeby, flag_base, zip64); -} - -extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits, - memLevel, strategy, password, crc_for_crypting, version_madeby, flag_base, 0); -} - -extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits, - memLevel, strategy, password, crc_for_crypting, MZ_VERSION_MADEBY, 0, 0); -} - -extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, int zip64) -{ - return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, comment, compression_method, level, raw, windowBits, - memLevel, strategy, password, crc_for_crypting, MZ_VERSION_MADEBY, 0, zip64); -} - -extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, uint32_t len) -{ - mz_compat *compat = (mz_compat *)file; - int32_t written = 0; - if (compat == NULL) - return ZIP_PARAMERROR; - written = mz_zip_entry_write(compat->handle, buf, len); - if ((written < 0) || ((uint32_t)written != len)) - return ZIP_ERRNO; - return ZIP_OK; -} - -extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uint32_t uncompressed_size, uint32_t crc32) -{ - return zipCloseFileInZipRaw64(file, uncompressed_size, crc32); -} - -extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, uint64_t uncompressed_size, uint32_t crc32) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return ZIP_PARAMERROR; - return mz_zip_entry_close_raw(compat->handle, uncompressed_size, crc32); -} - -extern int ZEXPORT zipCloseFileInZip(zipFile file) -{ - return zipCloseFileInZipRaw(file, 0, 0); -} - -extern int ZEXPORT zipCloseFileInZip64(zipFile file) -{ - return zipCloseFileInZipRaw(file, 0, 0); -} - -extern int ZEXPORT zipClose(zipFile file, const char *global_comment) -{ - return zipClose_64(file, global_comment); -} - -extern int ZEXPORT zipClose_64(zipFile file, const char *global_comment) -{ - return zipClose2_64(file, global_comment, MZ_VERSION_MADEBY); -} - -extern int ZEXPORT zipClose2_64(zipFile file, const char *global_comment, uint16_t version_madeby) -{ - mz_compat *compat = (mz_compat *)file; - int32_t err = MZ_OK; - - if (compat == NULL) - return ZIP_PARAMERROR; - - if (global_comment != NULL) - mz_zip_set_comment(compat->handle, global_comment); - - mz_zip_set_version_madeby(compat->handle, version_madeby); - err = mz_zip_close(compat->handle); - - if (compat->stream != NULL) - { - mz_stream_close(compat->stream); - mz_stream_delete(&compat->stream); - } - - MZ_FREE(compat); - - return err; -} - -/***************************************************************************/ - -extern unzFile ZEXPORT unzOpen(const char *path) -{ - return unzOpen64(path); -} - -extern unzFile ZEXPORT unzOpen64(const void *path) -{ - zlib_filefunc64_def pzlib = mz_stream_os_get_interface(); - return unzOpen2(path, &pzlib); -} - -extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc_def) -{ - return unzOpen2_64(path, pzlib_filefunc_def); -} - -extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def) -{ - mz_compat *compat = NULL; - int32_t mode = MZ_OPEN_MODE_READ; - void *handle = NULL; - void *stream = NULL; - - if (pzlib_filefunc_def) - { - if (mz_stream_create(&stream, (mz_stream_vtbl *)*pzlib_filefunc_def) == NULL) - return NULL; - } - else - { - if (mz_stream_os_create(&stream) == NULL) - return NULL; - } - - if (mz_stream_open(stream, path, mode) != MZ_OK) - { - mz_stream_delete(&stream); - return NULL; - } - - handle = mz_zip_open(stream, mode); - - if (handle == NULL) - { - mz_stream_delete(&stream); - return NULL; - } - - compat = (mz_compat *)MZ_ALLOC(sizeof(mz_compat)); - compat->handle = handle; - compat->stream = stream; - - mz_zip_goto_first_entry(compat->handle); - return (unzFile)compat; -} - -extern int ZEXPORT unzClose(unzFile file) -{ - mz_compat *compat = (mz_compat *)file; - int32_t err = MZ_OK; - - if (compat == NULL) - return UNZ_PARAMERROR; - - err = mz_zip_close(compat->handle); - - if (compat->stream != NULL) - { - mz_stream_close(compat->stream); - mz_stream_delete(&compat->stream); - } - - MZ_FREE(compat); - - return err; -} - -extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) -{ - mz_compat *compat = (mz_compat *)file; - unz_global_info64 global_info64; - int32_t err = MZ_OK; - - memset(pglobal_info32, 0, sizeof(unz_global_info)); - if (compat == NULL) - return UNZ_PARAMERROR; - - err = unzGetGlobalInfo64(file, &global_info64); - if (err == MZ_OK) - { - pglobal_info32->number_entry = (uint32_t)global_info64.number_entry; - pglobal_info32->size_comment = global_info64.size_comment; - pglobal_info32->number_disk_with_CD = global_info64.number_disk_with_CD; - } - return err; -} - -extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info) -{ - mz_compat *compat = (mz_compat *)file; - const char *comment_ptr = NULL; - int32_t err = MZ_OK; - - memset(pglobal_info, 0, sizeof(unz_global_info64)); - if (compat == NULL) - return UNZ_PARAMERROR; - err = mz_zip_get_comment(compat->handle, &comment_ptr); - if (err == MZ_OK) - pglobal_info->size_comment = (uint16_t)strlen(comment_ptr); - if ((err == MZ_OK) || (err == MZ_EXIST_ERROR)) - err = mz_zip_get_number_entry(compat->handle, (int64_t *)&pglobal_info->number_entry); - if (err == MZ_OK) - err = mz_zip_get_disk_number_with_cd(compat->handle, &pglobal_info->number_disk_with_CD); - return err; -} - -extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uint16_t comment_size) -{ - mz_compat *compat = (mz_compat *)file; - const char *comment_ptr = NULL; - int32_t err = MZ_OK; - - if (comment == NULL || comment_size == 0) - return UNZ_PARAMERROR; - err = mz_zip_get_comment(compat->handle, &comment_ptr); - if (err == MZ_OK) - strncpy(comment, comment_ptr, comment_size); - return err; -} - -extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - if (method != NULL) - *method = 0; - if (level != NULL) - *level = 0; - return mz_zip_entry_read_open(compat->handle, (int16_t)raw, password); -} - -extern int ZEXPORT unzOpenCurrentFile(unzFile file) -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); -} - -extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password) -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, password); -} - -extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw) -{ - return unzOpenCurrentFile3(file, method, level, raw, NULL); -} - -extern int ZEXPORT unzReadCurrentFile(unzFile file, void *buf, uint32_t len) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - return mz_zip_entry_read(compat->handle, buf, len); -} - -extern int ZEXPORT unzCloseCurrentFile(unzFile file) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - return mz_zip_entry_close(compat->handle); -} - -extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename, - uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size) -{ - mz_compat *compat = (mz_compat *)file; - mz_zip_file *file_info = NULL; - int16_t bytes_to_copy = 0; - int32_t err = MZ_OK; - - if (compat == NULL) - return UNZ_PARAMERROR; - - err = mz_zip_entry_get_info(compat->handle, &file_info); - - if ((err == MZ_OK) && (pfile_info != NULL)) - { - pfile_info->version = file_info->version_madeby; - pfile_info->version_needed = file_info->version_needed; - pfile_info->flag = file_info->flag; - pfile_info->compression_method = file_info->compression_method; - pfile_info->dosDate = mz_zip_time_t_to_dos_date(file_info->modified_date); - mz_zip_time_t_to_tm(file_info->modified_date, &pfile_info->tmu_date); - pfile_info->tmu_date.tm_year += 1900; - pfile_info->crc = file_info->crc; - - pfile_info->size_filename = file_info->filename_size; - pfile_info->size_file_extra = file_info->extrafield_size; - pfile_info->size_file_comment = file_info->comment_size; - - pfile_info->disk_num_start = (uint16_t)file_info->disk_number; - pfile_info->internal_fa = file_info->internal_fa; - pfile_info->external_fa = file_info->external_fa; - - pfile_info->compressed_size = (uint32_t)file_info->compressed_size; - pfile_info->uncompressed_size = (uint32_t)file_info->uncompressed_size; - - if (filename_size > 0 && filename != NULL) - { - bytes_to_copy = filename_size; - if (bytes_to_copy > file_info->filename_size) - bytes_to_copy = file_info->filename_size; - memcpy(filename, file_info->filename, bytes_to_copy); - } - if (extrafield_size > 0 && extrafield != NULL) - { - bytes_to_copy = extrafield_size; - if (bytes_to_copy > file_info->extrafield_size) - bytes_to_copy = file_info->extrafield_size; - memcpy(extrafield, file_info->extrafield, bytes_to_copy); - } - if (comment_size > 0 && comment != NULL) - { - bytes_to_copy = comment_size; - if (bytes_to_copy > file_info->comment_size) - bytes_to_copy = file_info->comment_size; - memcpy(comment, file_info->comment, bytes_to_copy); - } - } - return err; -} - -extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 * pfile_info, char *filename, - uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size) -{ - mz_compat *compat = (mz_compat *)file; - mz_zip_file *file_info = NULL; - int16_t bytes_to_copy = 0; - int32_t err = MZ_OK; - - if (compat == NULL) - return UNZ_PARAMERROR; - - err = mz_zip_entry_get_info(compat->handle, &file_info); - - if ((err == MZ_OK) && (pfile_info != NULL)) - { - pfile_info->version = file_info->version_madeby; - pfile_info->version_needed = file_info->version_needed; - pfile_info->flag = file_info->flag; - pfile_info->compression_method = file_info->compression_method; - pfile_info->dosDate = mz_zip_time_t_to_dos_date(file_info->modified_date); - mz_zip_time_t_to_tm(file_info->modified_date, &pfile_info->tmu_date); - pfile_info->tmu_date.tm_year += 1900; - pfile_info->crc = file_info->crc; - - pfile_info->size_filename = file_info->filename_size; - pfile_info->size_file_extra = file_info->extrafield_size; - pfile_info->size_file_comment = file_info->comment_size; - - pfile_info->disk_num_start = file_info->disk_number; - pfile_info->internal_fa = file_info->internal_fa; - pfile_info->external_fa = file_info->external_fa; - - pfile_info->compressed_size = file_info->compressed_size; - pfile_info->uncompressed_size = file_info->uncompressed_size; - - if (filename_size > 0 && filename != NULL) - { - bytes_to_copy = filename_size; - if (bytes_to_copy > file_info->filename_size) - bytes_to_copy = file_info->filename_size; - memcpy(filename, file_info->filename, bytes_to_copy); - if (file_info->filename_size < filename_size) - filename[file_info->filename_size] = 0; - } - - if (extrafield_size > 0 && extrafield != NULL) - { - bytes_to_copy = extrafield_size; - if (bytes_to_copy > file_info->extrafield_size) - bytes_to_copy = file_info->extrafield_size; - memcpy(extrafield, file_info->extrafield, bytes_to_copy); - } - - if (comment_size > 0 && comment != NULL) - { - bytes_to_copy = comment_size; - if (bytes_to_copy > file_info->comment_size) - bytes_to_copy = file_info->comment_size; - memcpy(comment, file_info->comment, bytes_to_copy); - if (file_info->comment_size < comment_size) - comment[file_info->comment_size] = 0; - } - } - return err; -} - -extern int ZEXPORT unzGoToFirstFile(unzFile file) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - return mz_zip_goto_first_entry(compat->handle); -} - -extern int ZEXPORT unzGoToNextFile(unzFile file) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - return mz_zip_goto_next_entry(compat->handle); -} - -extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - return mz_zip_locate_entry(compat->handle, filename, filename_compare_func); -} - -extern int32_t ZEXPORT unzGetOffset(unzFile file) -{ - return (int32_t)unzGetOffset64(file); -} - -extern int64_t ZEXPORT unzGetOffset64(unzFile file) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - return mz_zip_get_entry(compat->handle); -} - -extern int ZEXPORT unzSetOffset(unzFile file, uint32_t pos) -{ - return unzSetOffset64(file, pos); -} - -extern int ZEXPORT unzSetOffset64(unzFile file, uint64_t pos) -{ - mz_compat *compat = (mz_compat *)file; - if (compat == NULL) - return UNZ_PARAMERROR; - return (int)mz_zip_goto_entry(compat->handle, pos); -} - -extern int ZEXPORT unzGetLocalExtrafield(unzFile file, void *buf, unsigned len) // TODO -{ - MZ_UNUSED(file); - MZ_UNUSED(buf); - MZ_UNUSED(len); - - return 0; -} - -/***************************************************************************/ - -void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - *pzlib_filefunc_def = mz_stream_os_get_interface(); -} - -void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - *pzlib_filefunc_def = mz_stream_os_get_interface(); -} - -void fill_win32_filefunc(zlib_filefunc_def *pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - *pzlib_filefunc_def = mz_stream_os_get_interface(); -} - -void fill_win32_filefunc64(zlib_filefunc64_def *pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - *pzlib_filefunc_def = mz_stream_os_get_interface(); -} - -void fill_win32_filefunc64A(zlib_filefunc64_def *pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - *pzlib_filefunc_def = mz_stream_os_get_interface(); -} - -void fill_win32_filefunc64W(zlib_filefunc64_def *pzlib_filefunc_def) -{ - // NOTE: You should no longer pass in widechar string to open function - if (pzlib_filefunc_def != NULL) - *pzlib_filefunc_def = mz_stream_os_get_interface(); -} diff --git a/game/client/third/minizip/mz_compat.h b/game/client/third/minizip/mz_compat.h deleted file mode 100755 index a3e57cba..00000000 --- a/game/client/third/minizip/mz_compat.h +++ /dev/null @@ -1,302 +0,0 @@ -/* mz_compat.h -- Backwards compatible interface for older versions - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_COMPAT_H -#define MZ_COMPAT_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef HAVE_ZLIB -#include "zlib.h" -#else -#define ZEXPORT -#define MAX_WBITS (15) -#define DEF_MEM_LEVEL (8) -#endif - -/***************************************************************************/ - -#if defined(USE_FILE32API) -# define MZ_USE_FILE32API -# define fopen64 fopen -# define ftello64 ftell -# define fseeko64 fseek -#else -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ - defined(__OpenBSD__) || defined(__APPLE__) || defined(__ANDROID__) -# define fopen64 fopen -# define ftello64 ftello -# define fseeko64 fseeko -# endif -# ifdef _MSC_VER -# define fopen64 fopen -# if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) -# define ftello64 _ftelli64 -# define fseeko64 _fseeki64 -# else /* old MSC */ -# define ftello64 ftell -# define fseeko64 fseek -# endif -# endif -#endif - -/***************************************************************************/ - -#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagzipFile__ { int unused; } zip_file__; -typedef zip_file__ *zipFile; -#else -typedef void *zipFile; -#endif - -/***************************************************************************/ - -typedef void *zlib_filefunc_def; -typedef void *zlib_filefunc64_def; -typedef const char *zipcharpc; - -typedef struct tm tm_unz; -typedef struct tm tm_zip; - -typedef uint64_t ZPOS64_T; - -/***************************************************************************/ - -typedef struct -{ - uint32_t dosDate; - struct tm tmz_date; - uint16_t internal_fa; // internal file attributes 2 bytes - uint32_t external_fa; // external file attributes 4 bytes -} zip_fileinfo; - -/***************************************************************************/ - -#define ZIP_OK (0) -#define ZIP_EOF (0) -#define ZIP_ERRNO (-1) -#define ZIP_PARAMERROR (-102) -#define ZIP_BADZIPFILE (-103) -#define ZIP_INTERNALERROR (-104) - -#define Z_BZIP2ED (12) - -#define APPEND_STATUS_CREATE (1) -#define APPEND_STATUS_CREATEAFTER (2) -#define APPEND_STATUS_ADDINZIP (3) - -/***************************************************************************/ - -extern zipFile ZEXPORT zipOpen(const char *path, int append); -extern zipFile ZEXPORT zipOpen64(const void *path, int append); -extern zipFile ZEXPORT zipOpen2(const char *path, int append, const char **globalcomment, - zlib_filefunc_def *pzlib_filefunc_def); -extern zipFile ZEXPORT zipOpen2_64(const void *path, int append, const char **globalcomment, - zlib_filefunc64_def *pzlib_filefunc_def); - -extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting); -extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, int zip64); -extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base); -extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base, int zip64); -extern int ZEXPORT zipOpenNewFileInZip5(zipFile file, const char *filename, const zip_fileinfo *zipfi, - const void *extrafield_local, uint16_t size_extrafield_local, const void *extrafield_global, - uint16_t size_extrafield_global, const char *comment, uint16_t compression_method, int level, - int raw, int windowBits, int memLevel, int strategy, const char *password, - uint32_t crc_for_crypting, uint16_t version_madeby, uint16_t flag_base, int zip64); - -extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, uint32_t len); - -extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uint32_t uncompressed_size, uint32_t crc32); -extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, uint64_t uncompressed_size, uint32_t crc32); -extern int ZEXPORT zipCloseFileInZip(zipFile file); -extern int ZEXPORT zipCloseFileInZip64(zipFile file); - -extern int ZEXPORT zipClose(zipFile file, const char *global_comment); -extern int ZEXPORT zipClose_64(zipFile file, const char *global_comment); -extern int ZEXPORT zipClose2_64(zipFile file, const char *global_comment, uint16_t version_madeby); - -/***************************************************************************/ - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unz_file__; -typedef unz_file__ *unzFile; -#else -typedef void *unzFile; -#endif - -/***************************************************************************/ - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (-1) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) -#define UNZ_BADPASSWORD (-106) - -/***************************************************************************/ - -typedef struct unz_global_info64_s -{ - uint64_t number_entry; // total number of entries in the central dir on this disk - uint32_t number_disk_with_CD; // number the the disk with central dir, used for spanning ZIP - uint16_t size_comment; // size of the global comment of the zipfile -} unz_global_info64; - -typedef struct unz_global_info_s -{ - uint32_t number_entry; // total number of entries in the central dir on this disk - uint32_t number_disk_with_CD; // number the the disk with central dir, used for spanning ZIP - uint16_t size_comment; // size of the global comment of the zipfile -} unz_global_info; - -typedef struct unz_file_info64_s -{ - uint16_t version; // version made by 2 bytes - uint16_t version_needed; // version needed to extract 2 bytes - uint16_t flag; // general purpose bit flag 2 bytes - uint16_t compression_method; // compression method 2 bytes - uint32_t dosDate; // last mod file date in Dos fmt 4 bytes - struct tm tmu_date; - uint32_t crc; // crc-32 4 bytes - uint64_t compressed_size; // compressed size 8 bytes - uint64_t uncompressed_size; // uncompressed size 8 bytes - uint16_t size_filename; // filename length 2 bytes - uint16_t size_file_extra; // extra field length 2 bytes - uint16_t size_file_comment; // file comment length 2 bytes - - uint32_t disk_num_start; // disk number start 4 bytes - uint16_t internal_fa; // internal file attributes 2 bytes - uint32_t external_fa; // external file attributes 4 bytes - - uint64_t disk_offset; - - uint16_t size_file_extra_internal; -} unz_file_info64; - -typedef struct unz_file_info_s -{ - uint16_t version; // version made by 2 bytes - uint16_t version_needed; // version needed to extract 2 bytes - uint16_t flag; // general purpose bit flag 2 bytes - uint16_t compression_method; // compression method 2 bytes - uint32_t dosDate; // last mod file date in Dos fmt 4 bytes - struct tm tmu_date; - uint32_t crc; // crc-32 4 bytes - uint32_t compressed_size; // compressed size 4 bytes - uint32_t uncompressed_size; // uncompressed size 4 bytes - uint16_t size_filename; // filename length 2 bytes - uint16_t size_file_extra; // extra field length 2 bytes - uint16_t size_file_comment; // file comment length 2 bytes - - uint16_t disk_num_start; // disk number start 2 bytes - uint16_t internal_fa; // internal file attributes 2 bytes - uint32_t external_fa; // external file attributes 4 bytes - - uint64_t disk_offset; -} unz_file_info; - -/***************************************************************************/ - -typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2); -typedef int (*unzIteratorFunction)(unzFile file); -typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename, - uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); - -/***************************************************************************/ - -extern unzFile ZEXPORT unzOpen(const char *path); -extern unzFile ZEXPORT unzOpen64(const void *path); -extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc_def); -extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def); - -extern int ZEXPORT unzClose(unzFile file); -extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32); -extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info); -extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uint16_t comment_size); -extern int ZEXPORT unzOpenCurrentFile(unzFile file); -extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password); -extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw); -extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password); -extern int ZEXPORT unzReadCurrentFile(unzFile file, void *buf, uint32_t len); -extern int ZEXPORT unzCloseCurrentFile(unzFile file); - -extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename, - uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); -extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 * pfile_info, char *filename, - uint16_t filename_size, void *extrafield, uint16_t extrafield_size, char *comment, uint16_t comment_size); -extern int ZEXPORT unzGoToFirstFile(unzFile file); -extern int ZEXPORT unzGoToNextFile(unzFile file); -extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func); - -extern int64_t ZEXPORT unzGetOffset64(unzFile file); -extern int32_t ZEXPORT unzGetOffset(unzFile file); -extern int ZEXPORT unzSetOffset64(unzFile file, uint64_t pos); -extern int ZEXPORT unzSetOffset(unzFile file, uint32_t pos); -extern int ZEXPORT unzGetLocalExtrafield(unzFile file, void *buf, unsigned len); - -/***************************************************************************/ - -void fill_fopen_filefunc(zlib_filefunc_def *pzlib_filefunc_def); -void fill_fopen64_filefunc(zlib_filefunc64_def *pzlib_filefunc_def); -void fill_win32_filefunc(zlib_filefunc_def *pzlib_filefunc_def); -void fill_win32_filefunc64(zlib_filefunc64_def *pzlib_filefunc_def); -void fill_win32_filefunc64A(zlib_filefunc64_def *pzlib_filefunc_def); -void fill_win32_filefunc64W(zlib_filefunc64_def *pzlib_filefunc_def); - -/***************************************************************************/ - -#define check_file_exists mz_os_file_exists -#define dosdate_to_tm mz_zip_dosdate_to_tm -#define change_file_date mz_os_set_file_date -#define get_file_date mz_os_get_file_date -#define is_large_file(x) (mz_os_get_file_size(x) >= UINT32_MAX) -#define makedir mz_make_dir -#define get_file_crc(p,b,bs,rc) mz_get_file_crc(p,rc) - -#define MKDIR mz_os_make_dir -#define CHDIR chdir - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_os.c b/game/client/third/minizip/mz_os.c deleted file mode 100755 index 8e73d632..00000000 --- a/game/client/third/minizip/mz_os.c +++ /dev/null @@ -1,195 +0,0 @@ -/* mz_os.c -- System functions - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#include -#include -#include - -#include "mz.h" -#include "mz_os.h" -#include "mz_strm.h" -#ifdef HAVE_LZMA -# include "mz_strm_lzma.h" -#endif -#ifdef HAVE_ZLIB -# include "mz_strm_zlib.h" -#endif - -/***************************************************************************/ - -int32_t mz_make_dir(const char *path) -{ - int32_t err = MZ_OK; - int16_t len = 0; - char *current_dir = NULL; - char *match = NULL; - char hold = 0; - - - len = (int16_t)strlen(path); - if (len <= 0) - return 0; - - current_dir = (char *)MZ_ALLOC(len + 1); - if (current_dir == NULL) - return MZ_MEM_ERROR; - - strcpy(current_dir, path); - - if (current_dir[len - 1] == '/') - current_dir[len - 1] = 0; - - err = mz_os_make_dir(current_dir); - if (err != MZ_OK) - { - match = current_dir + 1; - while (1) - { - while (*match != 0 && *match != '\\' && *match != '/') - match += 1; - hold = *match; - *match = 0; - - err = mz_os_make_dir(current_dir); - if (err != MZ_OK) - break; - if (hold == 0) - break; - - *match = hold; - match += 1; - } - } - - MZ_FREE(current_dir); - return err; -} - -int32_t mz_path_combine(char *path, const char *join, int32_t max_path) -{ - int32_t path_len = 0; - - if (path == NULL || join == NULL || max_path == 0) - return MZ_PARAM_ERROR; - - path_len = strlen(path); - - if (path_len == 0) - { - strncpy(path, join, max_path); - } - else - { - if (path[path_len - 1] != '\\' && path[path_len - 1] != '/') - strncat(path, "/", max_path - path_len - 1); - strncat(path, join, max_path - path_len); - } - - return MZ_OK; -} - -int32_t mz_path_remove_filename(const char *path) -{ - char *path_ptr = NULL; - - if (path == NULL) - return MZ_PARAM_ERROR; - - path_ptr = (char *)(path + strlen(path) - 1); - - while (path_ptr > path) - { - if ((*path_ptr == '/') || (*path_ptr == '\\')) - { - *path_ptr = 0; - break; - } - - path_ptr -= 1; - } - return MZ_OK; -} - -int32_t mz_path_get_filename(const char *path, const char **filename) -{ - const char *match = NULL; - - if (path == NULL || filename == NULL) - return MZ_PARAM_ERROR; - - *filename = NULL; - - for (match = path; *match != 0; match += 1) - { - if ((*match == '\\') || (*match == '/')) - *filename = match + 1; - } - - if (*filename == NULL) - return MZ_EXIST_ERROR; - - return MZ_OK; -} - -int32_t mz_get_file_crc(const char *path, uint32_t *result_crc) -{ - void *stream = NULL; - void *crc32_stream = NULL; - int32_t read = 0; - int32_t err = MZ_OK; - uint8_t buf[INT16_MAX]; - - mz_stream_os_create(&stream); - - err = mz_stream_os_open(stream, path, MZ_OPEN_MODE_READ); - - mz_stream_crc32_create(&crc32_stream); -#ifdef HAVE_ZLIB - mz_stream_crc32_set_update_func(crc32_stream, - (mz_stream_crc32_update)mz_stream_zlib_get_crc32_update()); -#elif defined(HAVE_LZMA) - mz_stream_crc32_set_update_func(crc32_stream, - (mz_stream_crc32_update)mz_stream_lzma_get_crc32_update()); -#else - #error ZLIB or LZMA required for CRC32 -#endif - - mz_stream_crc32_open(crc32_stream, NULL, MZ_OPEN_MODE_READ); - - mz_stream_set_base(crc32_stream, stream); - - if (err == MZ_OK) - { - do - { - read = mz_stream_crc32_read(crc32_stream, buf, sizeof(buf)); - - if (read < 0) - { - err = read; - break; - } - } - while ((err == MZ_OK) && (read > 0)); - - mz_stream_os_close(stream); - } - - mz_stream_crc32_close(crc32_stream); - *result_crc = mz_stream_crc32_get_value(crc32_stream); - mz_stream_crc32_delete(&crc32_stream); - - mz_stream_os_delete(&stream); - - return err; -} diff --git a/game/client/third/minizip/mz_os.h b/game/client/third/minizip/mz_os.h deleted file mode 100755 index ec73d07d..00000000 --- a/game/client/third/minizip/mz_os.h +++ /dev/null @@ -1,71 +0,0 @@ -/* mz_os.h -- System functions - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_OS_H -#define MZ_OS_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -#if !defined(_WIN32) && !defined(MZ_USE_WIN32_API) -#include "mz_os_posix.h" -#include "mz_strm_posix.h" -#else -#include "mz_os_win32.h" -#include "mz_strm_win32.h" -#endif - -/***************************************************************************/ - -#ifdef HAVE_LZMA -#define MZ_VERSION_MADEBY_ZIP_VERSION (63) -#elif HAVE_AES -#define MZ_VERSION_MADEBY_ZIP_VERSION (51) -#elif HAVE_BZIP2 -#define MZ_VERSION_MADEBY_ZIP_VERSION (46) -#else -#define MZ_VERSION_MADEBY_ZIP_VERSION (45) -#endif - -#define MZ_VERSION_MADEBY ((MZ_VERSION_MADEBY_HOST_SYSTEM << 8) | \ - (MZ_VERSION_MADEBY_ZIP_VERSION)) - -/***************************************************************************/ - -int32_t mz_make_dir(const char *path); -// Creates a directory recursively - -int32_t mz_path_combine(char *path, const char *join, int32_t max_path); -// Combines two paths - -int32_t mz_path_remove_filename(const char *path); -// Remove the filename from a path - -int32_t mz_path_get_filename(const char *path, const char **filename); -// Get the filename from a path - -int32_t mz_get_file_crc(const char *path, uint32_t *result_crc); -// Gets the crc32 hash of a file - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_os_posix.c b/game/client/third/minizip/mz_os_posix.c deleted file mode 100755 index 02edd1c0..00000000 --- a/game/client/third/minizip/mz_os_posix.c +++ /dev/null @@ -1,182 +0,0 @@ -/* mz_os_posix.c -- System functions for posix - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ -#undef strncpy -#include -#include -#include -#include - -#include -#include - -#if defined unix || defined __APPLE__ -# include -# include -#endif -#if defined __linux__ -# include -#else -# include -#endif - -#include "mz.h" -#include "mz_strm.h" -#include "mz_os.h" -#include "mz_os_posix.h" - -/***************************************************************************/ - -#if defined(HAVE_PKCRYPT) || defined(HAVE_AES) -int32_t mz_posix_rand(uint8_t *buf, int32_t size) -{ - arc4random_buf(buf, size); - return size; -} -#endif - -int32_t mz_posix_file_exists(const char *path) -{ - struct stat stat_info; - - memset(&stat_info, 0, sizeof(stat_info)); - if (stat(path, &stat_info) == 0) - return MZ_OK; - - return MZ_EXIST_ERROR; -} - -int64_t mz_posix_get_file_size(const char *path) -{ - struct stat stat_info; - - memset(&stat_info, 0, sizeof(stat_info)); - if (stat(path, &stat_info) == 0) - return stat_info.st_size; - - return 0; -} - -int32_t mz_posix_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date) -{ - struct stat stat_info; - char *name = NULL; - size_t len = 0; - int32_t err = MZ_INTERNAL_ERROR; - - memset(&stat_info, 0, sizeof(stat_info)); - - if (strcmp(path, "-") != 0) - { - // Not all systems allow stat'ing a file with / appended - len = strlen(path); - name = (char *)malloc(len + 1); - strncpy(name, path, len + 1); - name[len] = 0; - if (name[len - 1] == '/') - name[len - 1] = 0; - - if (stat(name, &stat_info) == 0) - { - if (modified_date != NULL) - *modified_date = stat_info.st_mtime; - if (accessed_date != NULL) - *accessed_date = stat_info.st_atime; - // Creation date not supported - if (creation_date != NULL) - *creation_date = 0; - - err = MZ_OK; - } - - free(name); - } - - return err; -} - -int32_t mz_posix_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date) -{ - struct utimbuf ut; - - ut.actime = accessed_date; - ut.modtime = modified_date; - // Creation date not supported - (void)creation_date; - - if (utime(path, &ut) != 0) - return MZ_INTERNAL_ERROR; - - return MZ_OK; -} - -int32_t mz_posix_get_file_attribs(const char *path, uint32_t *attributes) -{ - struct stat stat_info; - int32_t err = MZ_OK; - - memset(&stat_info, 0, sizeof(stat_info)); - if (stat(path, &stat_info) == -1) - err = MZ_INTERNAL_ERROR; - *attributes = stat_info.st_mode; - return err; -} - -int32_t mz_posix_set_file_attribs(const char *path, uint32_t attributes) -{ - int32_t err = MZ_OK; - - if (chmod(path, (mode_t)attributes) == -1) - err = MZ_INTERNAL_ERROR; - - return err; -} - -int32_t mz_posix_make_dir(const char *path) -{ - int32_t err = 0; - - err = mkdir(path, 0755); - - if (err != 0 && errno != EEXIST) - return MZ_INTERNAL_ERROR; - - return MZ_OK; -} - -DIR* mz_posix_open_dir(const char *path) -{ - return opendir(path); -} - -struct dirent* mz_posix_read_dir(DIR *dir) -{ - if (dir == NULL) - return NULL; - return readdir(dir); -} - -int32_t mz_posix_close_dir(DIR *dir) -{ - if (dir == NULL) - return MZ_PARAM_ERROR; - if (closedir(dir) == -1) - return MZ_INTERNAL_ERROR; - return MZ_OK; -} - -int32_t mz_posix_is_dir(const char *path) -{ - struct stat path_stat; - stat(path, &path_stat); - if (S_ISDIR(path_stat.st_mode)) - return MZ_OK; - return MZ_EXIST_ERROR; -} diff --git a/game/client/third/minizip/mz_os_posix.h b/game/client/third/minizip/mz_os_posix.h deleted file mode 100755 index 12727f0b..00000000 --- a/game/client/third/minizip/mz_os_posix.h +++ /dev/null @@ -1,68 +0,0 @@ -/* mz_os_posix.h -- System functions for posix - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_OS_POSIX_H -#define MZ_OS_POSIX_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -#if defined(__APPLE__) -#define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_OSX_DARWIN) -#elif defined(unix) -#define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_UNIX) -#endif - -/***************************************************************************/ - -int32_t mz_posix_rand(uint8_t *buf, int32_t size); -int32_t mz_posix_file_exists(const char *path); -int64_t mz_posix_get_file_size(const char *path); -int32_t mz_posix_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date); -int32_t mz_posix_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date); -int32_t mz_posix_get_file_attribs(const char *path, uint32_t *attributes); -int32_t mz_posix_set_file_attribs(const char *path, uint32_t attributes); -int32_t mz_posix_make_dir(const char *path); -DIR* mz_posix_open_dir(const char *path); -struct -dirent* mz_posix_read_dir(DIR *dir); -int32_t mz_posix_close_dir(DIR *dir); -int32_t mz_posix_is_dir(const char *path); - -/***************************************************************************/ - -#define mz_os_rand mz_posix_rand -#define mz_os_file_exists mz_posix_file_exists -#define mz_os_get_file_size mz_posix_get_file_size -#define mz_os_get_file_date mz_posix_get_file_date -#define mz_os_set_file_date mz_posix_set_file_date -#define mz_os_get_file_attribs mz_posix_get_file_attribs -#define mz_os_set_file_attribs mz_posix_set_file_attribs -#define mz_os_make_dir mz_posix_make_dir -#define mz_os_open_dir mz_posix_open_dir -#define mz_os_read_dir mz_posix_read_dir -#define mz_os_close_dir mz_posix_close_dir -#define mz_os_is_dir mz_posix_is_dir - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_os_win32.c b/game/client/third/minizip/mz_os_win32.c deleted file mode 100755 index 3f9e045f..00000000 --- a/game/client/third/minizip/mz_os_win32.c +++ /dev/null @@ -1,346 +0,0 @@ -/* mz_os_win32.c -- System functions for Windows - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "mz.h" - -#include "mz_os.h" -#include "mz_os_win32.h" - -/***************************************************************************/ - -#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(MZ_USE_WINRT_API))) -# if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -# define MZ_USE_WINRT_API 1 -# endif -#endif - -/***************************************************************************/ - -typedef struct DIR_int_s { - void *find_handle; - WIN32_FIND_DATAW find_data; - struct dirent entry; - uint8_t end; -} DIR_int; - -/***************************************************************************/ - -#if defined(HAVE_PKCRYPT) || defined(HAVE_AES) -int32_t mz_win32_rand(uint8_t *buf, int32_t size) -{ - HCRYPTPROV provider; - unsigned __int64 pentium_tsc[1]; - int32_t len = 0; - int32_t result = 0; - - - if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) - { - result = CryptGenRandom(provider, size, buf); - CryptReleaseContext(provider, 0); - if (result) - return size; - } - - for (len = 0; len < (int)size; len += 1) - { - if (len % 8 == 0) - QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc); - buf[len] = ((unsigned char*)pentium_tsc)[len % 8]; - } - - return len; -} -#endif - -wchar_t *mz_win32_unicode_path_create(const char *path) -{ - wchar_t *path_wide = NULL; - uint32_t path_wide_size = 0; - - path_wide_size = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); - path_wide = (wchar_t *)MZ_ALLOC((path_wide_size + 1) * sizeof(wchar_t)); - memset(path_wide, 0, sizeof(wchar_t) * (path_wide_size + 1)); - - MultiByteToWideChar(CP_UTF8, 0, path, -1, path_wide, path_wide_size); - - return path_wide; -} - -void mz_win32_unicode_path_delete(wchar_t **path) -{ - if (path != NULL) - { - MZ_FREE(*path); - *path = NULL; - } -} - -int32_t mz_win32_file_exists(const char *path) -{ - wchar_t *path_wide = NULL; - DWORD attribs = 0; - - - path_wide = mz_win32_unicode_path_create(path); - attribs = GetFileAttributesW(path_wide); - mz_win32_unicode_path_delete(&path_wide); - - if (attribs == 0xFFFFFFFF) - return MZ_EXIST_ERROR; - - return MZ_OK; -} - -int64_t mz_win32_get_file_size(const char *path) -{ - HANDLE handle = NULL; - LARGE_INTEGER large_size; - wchar_t *path_wide = NULL; - - - path_wide = mz_win32_unicode_path_create(path); -#ifdef MZ_USE_WINRT_API - handle = CreateFile2W(path_wide, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); -#else - handle = CreateFileW(path_wide, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); -#endif - mz_win32_unicode_path_delete(&path_wide); - - large_size.QuadPart = 0; - - if (handle != INVALID_HANDLE_VALUE) - { - GetFileSizeEx(handle, &large_size); - CloseHandle(handle); - } - - return large_size.QuadPart; -} - -static void mz_win32_file_to_unix_time(FILETIME file_time, time_t *unix_time) -{ - uint64_t quad_file_time = 0; - quad_file_time = file_time.dwLowDateTime; - quad_file_time |= ((uint64_t)file_time.dwHighDateTime << 32); - *unix_time = (time_t)((quad_file_time - 116444736000000000LL) / 10000000); -} - -static void mz_win32_unix_to_file_time(time_t unix_time, FILETIME *file_time) -{ - uint64_t quad_file_time = 0; - quad_file_time = ((uint64_t)unix_time * 10000000) + 116444736000000000LL; - file_time->dwHighDateTime = (quad_file_time >> 32); - file_time->dwLowDateTime = (uint32_t)(quad_file_time); -} - -int32_t mz_win32_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date) -{ - WIN32_FIND_DATAW ff32; - HANDLE handle = NULL; - wchar_t *path_wide = NULL; - int32_t err = MZ_INTERNAL_ERROR; - - path_wide = mz_win32_unicode_path_create(path); - handle = FindFirstFileW(path_wide, &ff32); - MZ_FREE(path_wide); - - if (handle != INVALID_HANDLE_VALUE) - { - if (modified_date != NULL) - mz_win32_file_to_unix_time(ff32.ftLastWriteTime, modified_date); - if (accessed_date != NULL) - mz_win32_file_to_unix_time(ff32.ftLastAccessTime, accessed_date); - if (creation_date != NULL) - mz_win32_file_to_unix_time(ff32.ftCreationTime, creation_date); - - FindClose(handle); - err = MZ_OK; - } - - return err; -} - -int32_t mz_win32_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date) -{ - HANDLE handle = NULL; - FILETIME ftm_creation, ftm_accessed, ftm_modified; - wchar_t *path_wide = NULL; - int32_t err = MZ_OK; - - - path_wide = mz_win32_unicode_path_create(path); -#ifdef MZ_USE_WINRT_API - handle = CreateFile2W(path_wide, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); -#else - handle = CreateFileW(path_wide, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); -#endif - mz_win32_unicode_path_delete(&path_wide); - - if (handle != INVALID_HANDLE_VALUE) - { - GetFileTime(handle, &ftm_creation, &ftm_accessed, &ftm_modified); - - if (modified_date != 0) - mz_win32_unix_to_file_time(modified_date, &ftm_modified); - if (accessed_date != 0) - mz_win32_unix_to_file_time(accessed_date, &ftm_accessed); - if (creation_date != 0) - mz_win32_unix_to_file_time(creation_date, &ftm_creation); - - if (SetFileTime(handle, &ftm_creation, &ftm_accessed, &ftm_modified) == 0) - err = MZ_INTERNAL_ERROR; - - CloseHandle(handle); - } - - return err; -} - -int32_t mz_win32_get_file_attribs(const char *path, uint32_t *attributes) -{ - wchar_t *path_wide = NULL; - int32_t err = MZ_OK; - - path_wide = mz_win32_unicode_path_create(path); - *attributes = GetFileAttributesW(path_wide); - MZ_FREE(path_wide); - - if (*attributes == INVALID_FILE_ATTRIBUTES) - err = MZ_INTERNAL_ERROR; - - return err; -} - -int32_t mz_win32_set_file_attribs(const char *path, uint32_t attributes) -{ - wchar_t *path_wide = NULL; - int32_t err = MZ_OK; - - path_wide = mz_win32_unicode_path_create(path); - if (SetFileAttributesW(path_wide, attributes) == 0) - err = MZ_INTERNAL_ERROR; - MZ_FREE(path_wide); - - return err; -} - -int32_t mz_win32_make_dir(const char *path) -{ - wchar_t *path_wide = NULL; - int32_t err = 0; - - - path_wide = mz_win32_unicode_path_create(path); - err = _wmkdir(path_wide); - mz_win32_unicode_path_delete(&path_wide); - - if (err != 0 && errno != EEXIST) - return MZ_INTERNAL_ERROR; - - return MZ_OK; -} - -DIR *mz_win32_open_dir(const char *path) -{ - WIN32_FIND_DATAW find_data; - DIR_int *dir_int = NULL; - wchar_t *path_wide = NULL; - char fixed_path[320]; - void *handle = NULL; - - - fixed_path[0] = 0; - mz_path_combine(fixed_path, path, sizeof(fixed_path)); - mz_path_combine(fixed_path, "*", sizeof(fixed_path)); - - path_wide = mz_win32_unicode_path_create(fixed_path); - handle = FindFirstFileW(path_wide, &find_data); - mz_win32_unicode_path_delete(&path_wide); - - if (handle == INVALID_HANDLE_VALUE) - return NULL; - - dir_int = (DIR_int *)MZ_ALLOC(sizeof(DIR_int)); - dir_int->find_handle = handle; - dir_int->end = 0; - - memcpy(&dir_int->find_data, &find_data, sizeof(dir_int->find_data)); - - return (DIR *)dir_int; -} - -struct dirent* mz_win32_read_dir(DIR *dir) -{ - DIR_int *dir_int; - - if (dir == NULL) - return NULL; - - dir_int = (DIR_int *)dir; - if (dir_int->end) - return NULL; - - WideCharToMultiByte(CP_UTF8, 0, dir_int->find_data.cFileName, -1, - dir_int->entry.d_name, sizeof(dir_int->entry.d_name), NULL, NULL); - - if (FindNextFileW(dir_int->find_handle, &dir_int->find_data) == 0) - { - if (GetLastError() != ERROR_NO_MORE_FILES) - return NULL; - - dir_int->end = 1; - } - - return &dir_int->entry; -} - -int32_t mz_win32_close_dir(DIR *dir) -{ - DIR_int *dir_int; - - if (dir == NULL) - return MZ_PARAM_ERROR; - - dir_int = (DIR_int *)dir; - if (dir_int->find_handle != INVALID_HANDLE_VALUE) - FindClose(dir_int->find_handle); - MZ_FREE(dir_int); - return MZ_OK; -} - -int32_t mz_win32_is_dir(const char *path) -{ - wchar_t *path_wide = NULL; - uint32_t attribs = 0; - - path_wide = mz_win32_unicode_path_create(path); - attribs = GetFileAttributesW(path_wide); - mz_win32_unicode_path_delete(&path_wide); - - if (attribs != 0xFFFFFFFF) - { - if (attribs & FILE_ATTRIBUTE_DIRECTORY) - return MZ_OK; - } - - return MZ_EXIST_ERROR; -} diff --git a/game/client/third/minizip/mz_os_win32.h b/game/client/third/minizip/mz_os_win32.h deleted file mode 100755 index 89cebe10..00000000 --- a/game/client/third/minizip/mz_os_win32.h +++ /dev/null @@ -1,69 +0,0 @@ -/* mz_os_win32.h -- System functions for Windows - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_OS_WIN32_H -#define MZ_OS_WIN32_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -#define MZ_VERSION_MADEBY_HOST_SYSTEM (MZ_HOST_SYSTEM_WINDOWS_NTFS) - -/***************************************************************************/ - -struct dirent { - char d_name[256]; -}; -typedef void* DIR; - -/***************************************************************************/ - -int32_t mz_win32_rand(uint8_t *buf, int32_t size); -int32_t mz_win32_file_exists(const char *path); -int64_t mz_win32_get_file_size(const char *path); -int32_t mz_win32_get_file_date(const char *path, time_t *modified_date, time_t *accessed_date, time_t *creation_date); -int32_t mz_win32_set_file_date(const char *path, time_t modified_date, time_t accessed_date, time_t creation_date); -int32_t mz_win32_get_file_attribs(const char *path, uint32_t *attributes); -int32_t mz_win32_set_file_attribs(const char *path, uint32_t attributes); -int32_t mz_win32_make_dir(const char *path); -DIR* mz_win32_open_dir(const char *path); -struct -dirent* mz_win32_read_dir(DIR *dir); -int32_t mz_win32_close_dir(DIR *dir); -int32_t mz_win32_is_dir(const char *path); - -/***************************************************************************/ - -#define mz_os_rand mz_win32_rand -#define mz_os_file_exists mz_win32_file_exists -#define mz_os_get_file_size mz_win32_get_file_size -#define mz_os_get_file_date mz_win32_get_file_date -#define mz_os_set_file_date mz_win32_set_file_date -#define mz_os_get_file_attribs mz_win32_get_file_attribs -#define mz_os_set_file_attribs mz_win32_set_file_attribs -#define mz_os_make_dir mz_win32_make_dir -#define mz_os_open_dir mz_win32_open_dir -#define mz_os_read_dir mz_win32_read_dir -#define mz_os_close_dir mz_win32_close_dir -#define mz_os_is_dir mz_win32_is_dir - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm.c b/game/client/third/minizip/mz_strm.c deleted file mode 100755 index e3ffdfdc..00000000 --- a/game/client/third/minizip/mz_strm.c +++ /dev/null @@ -1,580 +0,0 @@ -/* mz_strm.c -- Stream interface - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#include -#include -#include - -#include - -#include "mz.h" -#include "mz_strm.h" - -/***************************************************************************/ - -int32_t mz_stream_open(void *stream, const char *path, int32_t mode) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->open == NULL) - return MZ_STREAM_ERROR; - return strm->vtbl->open(strm, path, mode); -} - -int32_t mz_stream_is_open(void *stream) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->is_open == NULL) - return MZ_STREAM_ERROR; - return strm->vtbl->is_open(strm); -} - -int32_t mz_stream_read(void *stream, void *buf, int32_t size) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->read == NULL) - return MZ_PARAM_ERROR; - if (mz_stream_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - return strm->vtbl->read(strm, buf, size); -} - -static int32_t mz_stream_read_value(void *stream, uint64_t *value, int32_t len) -{ - uint8_t buf[8]; - int32_t n = 0; - int32_t i = 0; - - *value = 0; - if (mz_stream_read(stream, buf, len) == len) - { - for (n = 0; n < len; n += 1, i += 8) - *value += ((uint64_t)buf[n]) << i; - } - else if (mz_stream_error(stream)) - return MZ_STREAM_ERROR; - else - return MZ_END_OF_STREAM; - - return MZ_OK; -} - -int32_t mz_stream_read_uint8(void *stream, uint8_t *value) -{ - int32_t err = MZ_OK; - uint64_t value64 = 0; - - *value = 0; - err = mz_stream_read_value(stream, &value64, sizeof(uint8_t)); - if (err == MZ_OK) - *value = (uint8_t)value64; - return err; -} - -int32_t mz_stream_read_uint16(void *stream, uint16_t *value) -{ - int32_t err = MZ_OK; - uint64_t value64 = 0; - - *value = 0; - err = mz_stream_read_value(stream, &value64, sizeof(uint16_t)); - if (err == MZ_OK) - *value = (uint16_t)value64; - return err; -} - -int32_t mz_stream_read_uint32(void *stream, uint32_t *value) -{ - int32_t err = MZ_OK; - uint64_t value64 = 0; - - *value = 0; - err = mz_stream_read_value(stream, &value64, sizeof(uint32_t)); - if (err == MZ_OK) - *value = (uint32_t)value64; - return err; -} - -int32_t mz_stream_read_uint64(void *stream, uint64_t *value) -{ - return mz_stream_read_value(stream, value, sizeof(uint64_t)); -} - -int32_t mz_stream_write(void *stream, const void *buf, int32_t size) -{ - mz_stream *strm = (mz_stream *)stream; - if (size == 0) - return size; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->write == NULL) - return MZ_PARAM_ERROR; - if (mz_stream_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - return strm->vtbl->write(strm, buf, size); -} - -static int32_t mz_stream_write_value(void *stream, uint64_t value, int32_t len) -{ - uint8_t buf[8]; - int32_t n = 0; - - for (n = 0; n < len; n += 1) - { - buf[n] = (uint8_t)(value & 0xff); - value >>= 8; - } - - if (value != 0) - { - // Data overflow - hack for ZIP64 (X Roche) - for (n = 0; n < len; n += 1) - buf[n] = 0xff; - } - - if (mz_stream_write(stream, buf, len) != len) - return MZ_STREAM_ERROR; - - return MZ_OK; -} - -int32_t mz_stream_write_uint8(void *stream, uint8_t value) -{ - return mz_stream_write_value(stream, value, sizeof(uint8_t)); -} - -int32_t mz_stream_write_uint16(void *stream, uint16_t value) -{ - return mz_stream_write_value(stream, value, sizeof(uint16_t)); -} - -int32_t mz_stream_write_uint32(void *stream, uint32_t value) -{ - return mz_stream_write_value(stream, value, sizeof(uint32_t)); -} - -int32_t mz_stream_write_uint64(void *stream, uint64_t value) -{ - return mz_stream_write_value(stream, value, sizeof(uint64_t)); -} - -int32_t mz_stream_copy(void *target, void *source, int32_t len) -{ - uint8_t buf[INT16_MAX]; - int32_t bytes_to_copy = 0; - int32_t read = 0; - int32_t written = 0; - - while (len > 0) - { - bytes_to_copy = len; - if (bytes_to_copy > (int32_t)sizeof(buf)) - bytes_to_copy = sizeof(buf); - read = mz_stream_read(source, buf, bytes_to_copy); - if (read < 0) - return MZ_STREAM_ERROR; - written = mz_stream_write(target, buf, read); - if (written != read) - return MZ_STREAM_ERROR; - len -= read; - } - - return MZ_OK; -} - -int64_t mz_stream_tell(void *stream) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->tell == NULL) - return MZ_PARAM_ERROR; - if (mz_stream_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - return strm->vtbl->tell(strm); -} - -int32_t mz_stream_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->seek == NULL) - return MZ_PARAM_ERROR; - if (mz_stream_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - return strm->vtbl->seek(strm, offset, origin); -} - -int32_t mz_stream_close(void *stream) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->close == NULL) - return MZ_PARAM_ERROR; - if (mz_stream_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - return strm->vtbl->close(strm); -} - -int32_t mz_stream_error(void *stream) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->error == NULL) - return MZ_PARAM_ERROR; - return strm->vtbl->error(strm); -} - -int32_t mz_stream_set_base(void *stream, void *base) -{ - mz_stream *strm = (mz_stream *)stream; - strm->base = (mz_stream *)base; - return MZ_OK; -} - -int32_t mz_stream_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->get_prop_int64 == NULL) - return MZ_PARAM_ERROR; - return strm->vtbl->get_prop_int64(stream, prop, value); -} - -int32_t mz_stream_set_prop_int64(void *stream, int32_t prop, int64_t value) -{ - mz_stream *strm = (mz_stream *)stream; - if (strm == NULL || strm->vtbl == NULL || strm->vtbl->set_prop_int64 == NULL) - return MZ_PARAM_ERROR; - return strm->vtbl->set_prop_int64(stream, prop, value); -} - -void *mz_stream_create(void **stream, mz_stream_vtbl *vtbl) -{ - if (stream == NULL) - return NULL; - if (vtbl == NULL || vtbl->create == NULL) - return NULL; - return vtbl->create(stream); -} - -void mz_stream_delete(void **stream) -{ - mz_stream *strm = NULL; - if (stream == NULL) - return; - strm = (mz_stream *)*stream; - if (strm != NULL && strm->vtbl != NULL && strm->vtbl->destroy != NULL) - strm->vtbl->destroy(stream); - *stream = NULL; -} - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_crc32_vtbl = { - mz_stream_crc32_open, - mz_stream_crc32_is_open, - mz_stream_crc32_read, - mz_stream_crc32_write, - mz_stream_crc32_tell, - mz_stream_crc32_seek, - mz_stream_crc32_close, - mz_stream_crc32_error, - mz_stream_crc32_create, - mz_stream_crc32_delete, - mz_stream_crc32_get_prop_int64, - NULL -}; - -/***************************************************************************/ - -typedef struct mz_stream_crc32_s { - mz_stream stream; - int8_t initialized; - int64_t value; - int64_t total_in; - int64_t total_out; - - mz_stream_crc32_update update; -} mz_stream_crc32; - -/***************************************************************************/ - -int32_t mz_stream_crc32_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - - MZ_UNUSED(path); - MZ_UNUSED(mode); - - crc32->initialized = 1; - crc32->value = 0; - return MZ_OK; -} - -int32_t mz_stream_crc32_is_open(void *stream) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - if (crc32->initialized != 1) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_crc32_read(void *stream, void *buf, int32_t size) -{ - mz_stream_crc32 *crc32x = (mz_stream_crc32 *)stream; - int32_t read = 0; - read = mz_stream_read(crc32x->stream.base, buf, size); - if (read > 0) - crc32x->value = crc32x->update(crc32x->value, buf, read); - crc32x->total_in += read; - return read; -} - -int32_t mz_stream_crc32_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_crc32 *crc32x = (mz_stream_crc32 *)stream; - int32_t written = 0; - crc32x->value = crc32x->update(crc32x->value, buf, size); - written = mz_stream_write(crc32x->stream.base, buf, size); - crc32x->total_out += written; - return written; -} - -int64_t mz_stream_crc32_tell(void *stream) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - return mz_stream_tell(crc32->stream.base); -} - -int32_t mz_stream_crc32_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - crc32->value = 0; - return mz_stream_seek(crc32->stream.base, offset, origin); -} - -int32_t mz_stream_crc32_close(void *stream) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - crc32->initialized = 0; - return MZ_OK; -} - -int32_t mz_stream_crc32_error(void *stream) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - return mz_stream_error(crc32->stream.base); -} - -int32_t mz_stream_crc32_get_value(void *stream) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - return (int32_t)crc32->value; -} - -int32_t mz_stream_crc32_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN: - *value = crc32->total_in; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT: - *value = crc32->total_out; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -int32_t mz_stream_crc32_set_update_func(void *stream, mz_stream_crc32_update update) -{ - mz_stream_crc32 *crc32 = (mz_stream_crc32 *)stream; - crc32->update = update; - return MZ_OK; -} - -void *mz_stream_crc32_create(void **stream) -{ - mz_stream_crc32 *crc32 = NULL; - - crc32 = (mz_stream_crc32 *)MZ_ALLOC(sizeof(mz_stream_crc32)); - if (crc32 != NULL) - { - memset(crc32, 0, sizeof(mz_stream_crc32)); - crc32->stream.vtbl = &mz_stream_crc32_vtbl; - } - if (stream != NULL) - *stream = crc32; - - return crc32; -} - -void mz_stream_crc32_delete(void **stream) -{ - mz_stream_crc32 *crc32 = NULL; - if (stream == NULL) - return; - crc32 = (mz_stream_crc32 *)*stream; - if (crc32 != NULL) - MZ_FREE(crc32); - *stream = NULL; -} - -void *mz_stream_crc32_get_interface(void) -{ - return (void *)&mz_stream_crc32_vtbl; -} - -/***************************************************************************/ - -typedef struct mz_stream_raw_s { - mz_stream stream; - int64_t total_in; - int64_t total_out; - int64_t max_total_in; -} mz_stream_raw; - -/***************************************************************************/ - -int32_t mz_stream_raw_open(void *stream, const char *path, int32_t mode) -{ - MZ_UNUSED(stream); - MZ_UNUSED(path); - MZ_UNUSED(mode); - - return MZ_OK; -} - -int32_t mz_stream_raw_is_open(void *stream) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - return mz_stream_is_open(raw->stream.base); -} - -int32_t mz_stream_raw_read(void *stream, void *buf, int32_t size) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - int32_t bytes_to_read = size; - int32_t read = 0; - - if (raw->max_total_in > 0) - { - if ((raw->max_total_in - raw->total_in) < size) - bytes_to_read = (int32_t)(raw->max_total_in - raw->total_in); - } - - read = mz_stream_read(raw->stream.base, buf, bytes_to_read); - - if (read > 0) - raw->total_in += read; - - return read; -} - -int32_t mz_stream_raw_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - int32_t written = mz_stream_write(raw->stream.base, buf, size); - if (written > 0) - raw->total_out += written; - return written; -} - -int64_t mz_stream_raw_tell(void *stream) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - return mz_stream_tell(raw->stream.base); -} - -int32_t mz_stream_raw_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - return mz_stream_seek(raw->stream.base, offset, origin); -} - -int32_t mz_stream_raw_close(void *stream) -{ - MZ_UNUSED(stream); - - return MZ_OK; -} - -int32_t mz_stream_raw_error(void *stream) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - return mz_stream_error(raw->stream.base); -} - -int32_t mz_stream_raw_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN: - *value = raw->total_in; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT: - *value = raw->total_out; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -int32_t mz_stream_raw_set_prop_int64(void *stream, int32_t prop, int64_t value) -{ - mz_stream_raw *raw = (mz_stream_raw *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN_MAX: - raw->max_total_in = value; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_raw_vtbl = { - mz_stream_raw_open, - mz_stream_raw_is_open, - mz_stream_raw_read, - mz_stream_raw_write, - mz_stream_raw_tell, - mz_stream_raw_seek, - mz_stream_raw_close, - mz_stream_raw_error, - mz_stream_raw_create, - mz_stream_raw_delete, - mz_stream_raw_get_prop_int64, - mz_stream_raw_set_prop_int64 -}; - -/***************************************************************************/ - -void *mz_stream_raw_create(void **stream) -{ - mz_stream_raw *raw = NULL; - - raw = (mz_stream_raw *)MZ_ALLOC(sizeof(mz_stream_raw)); - if (raw != NULL) - { - memset(raw, 0, sizeof(mz_stream_raw)); - raw->stream.vtbl = &mz_stream_raw_vtbl; - } - if (stream != NULL) - *stream = raw; - - return raw; -} - -void mz_stream_raw_delete(void **stream) -{ - mz_stream_raw *raw = NULL; - if (stream == NULL) - return; - raw = (mz_stream_raw *)*stream; - if (raw != NULL) - MZ_FREE(raw); - *stream = NULL; -} diff --git a/game/client/third/minizip/mz_strm.h b/game/client/third/minizip/mz_strm.h deleted file mode 100755 index 1d9a30b3..00000000 --- a/game/client/third/minizip/mz_strm.h +++ /dev/null @@ -1,146 +0,0 @@ -/* mz_strm.h -- Stream interface - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_H -#define MZ_STREAM_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -#define MZ_STREAM_PROP_TOTAL_IN (1) -#define MZ_STREAM_PROP_TOTAL_IN_MAX (2) -#define MZ_STREAM_PROP_TOTAL_OUT (3) -#define MZ_STREAM_PROP_TOTAL_OUT_MAX (4) -#define MZ_STREAM_PROP_HEADER_SIZE (5) -#define MZ_STREAM_PROP_FOOTER_SIZE (6) -#define MZ_STREAM_PROP_DISK_SIZE (7) -#define MZ_STREAM_PROP_DISK_NUMBER (8) -#define MZ_STREAM_PROP_COMPRESS_LEVEL (9) - -/***************************************************************************/ - -typedef int32_t (*mz_stream_open_cb) (void *stream, const char *path, int32_t mode); -typedef int32_t (*mz_stream_is_open_cb) (void *stream); -typedef int32_t (*mz_stream_read_cb) (void *stream, void *buf, int32_t size); -typedef int32_t (*mz_stream_write_cb) (void *stream, const void *buf, int32_t size); -typedef int64_t (*mz_stream_tell_cb) (void *stream); -typedef int32_t (*mz_stream_seek_cb) (void *stream, int64_t offset, int32_t origin); -typedef int32_t (*mz_stream_close_cb) (void *stream); -typedef int32_t (*mz_stream_error_cb) (void *stream); -typedef void* (*mz_stream_create_cb) (void **stream); -typedef void (*mz_stream_destroy_cb) (void **stream); - -typedef int32_t (*mz_stream_get_prop_int64_cb) (void *stream, int32_t prop, int64_t *value); -typedef int32_t (*mz_stream_set_prop_int64_cb) (void *stream, int32_t prop, int64_t value); - -/***************************************************************************/ - -typedef struct mz_stream_vtbl_s -{ - mz_stream_open_cb open; - mz_stream_is_open_cb is_open; - mz_stream_read_cb read; - mz_stream_write_cb write; - mz_stream_tell_cb tell; - mz_stream_seek_cb seek; - mz_stream_close_cb close; - mz_stream_error_cb error; - mz_stream_create_cb create; - mz_stream_destroy_cb destroy; - - mz_stream_get_prop_int64_cb get_prop_int64; - mz_stream_set_prop_int64_cb set_prop_int64; -} mz_stream_vtbl; - -typedef struct mz_stream_s { - mz_stream_vtbl *vtbl; - struct mz_stream_s *base; -} mz_stream; - -/***************************************************************************/ - -int32_t mz_stream_open(void *stream, const char *path, int32_t mode); -int32_t mz_stream_is_open(void *stream); -int32_t mz_stream_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_read_uint8(void *stream, uint8_t *value); -int32_t mz_stream_read_uint16(void *stream, uint16_t *value); -int32_t mz_stream_read_uint32(void *stream, uint32_t *value); -int32_t mz_stream_read_uint64(void *stream, uint64_t *value); -int32_t mz_stream_write(void *stream, const void *buf, int32_t size); -int32_t mz_stream_write_uint8(void *stream, uint8_t value); -int32_t mz_stream_write_uint16(void *stream, uint16_t value); -int32_t mz_stream_write_uint32(void *stream, uint32_t value); -int32_t mz_stream_write_uint64(void *stream, uint64_t value); -int32_t mz_stream_copy(void *target, void *source, int32_t len); -int64_t mz_stream_tell(void *stream); -int32_t mz_stream_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_close(void *stream); -int32_t mz_stream_error(void *stream); - -int32_t mz_stream_set_base(void *stream, void *base); -int32_t mz_stream_get_prop_int64(void *stream, int32_t prop, int64_t *value); -int32_t mz_stream_set_prop_int64(void *stream, int32_t prop, int64_t value); - -void* mz_stream_create(void **stream, mz_stream_vtbl *vtbl); -void mz_stream_delete(void **stream); - -/***************************************************************************/ - -typedef int64_t (*mz_stream_crc32_update)(int64_t value, const void *buf, int32_t size); - -int32_t mz_stream_crc32_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_crc32_is_open(void *stream); -int32_t mz_stream_crc32_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_crc32_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_crc32_tell(void *stream); -int32_t mz_stream_crc32_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_crc32_close(void *stream); -int32_t mz_stream_crc32_error(void *stream); - -int32_t mz_stream_crc32_get_value(void *stream); - -int32_t mz_stream_crc32_get_prop_int64(void *stream, int32_t prop, int64_t *value); -int32_t mz_stream_crc32_set_update_func(void *stream, mz_stream_crc32_update update); - -void* mz_stream_crc32_create(void **stream); -void mz_stream_crc32_delete(void **stream); - -void* mz_stream_crc32_get_interface(void); - -/***************************************************************************/ - -int32_t mz_stream_raw_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_raw_is_open(void *stream); -int32_t mz_stream_raw_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_raw_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_raw_tell(void *stream); -int32_t mz_stream_raw_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_raw_close(void *stream); -int32_t mz_stream_raw_error(void *stream); - -int32_t mz_stream_raw_get_prop_int64(void *stream, int32_t prop, int64_t *value); -int32_t mz_stream_raw_set_prop_int64(void *stream, int32_t prop, int64_t value); - -void* mz_stream_raw_create(void **stream); -void mz_stream_raw_delete(void **stream); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_aes.c b/game/client/third/minizip/mz_strm_aes.c deleted file mode 100755 index 0128dfb0..00000000 --- a/game/client/third/minizip/mz_strm_aes.c +++ /dev/null @@ -1,350 +0,0 @@ -/* mz_strm_aes.c -- Stream for WinZip AES encryption - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 1998-2010 Brian Gladman, Worcester, UK - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - - -#include -#include -#include - -#include "aes.h" -#include "hmac.h" -#include "pwd2key.h" - -#include "mz.h" -#include "mz_os.h" -#include "mz_strm.h" -#include "mz_strm_aes.h" - -/***************************************************************************/ - -#define MZ_AES_KEY_LENGTH(mode) (8 * (mode & 3) + 8) -#define MZ_AES_KEY_LENGTH_MAX (32) -#define MZ_AES_KEYING_ITERATIONS (1000) -#define MZ_AES_SALT_LENGTH(mode) (4 * (mode & 3) + 4) -#define MZ_AES_SALT_LENGTH_MAX (16) -#define MZ_AES_MAC_LENGTH(mode) (10) -#define MZ_AES_PW_LENGTH_MAX (128) -#define MZ_AES_PW_VERIFY_SIZE (2) -#define MZ_AES_AUTHCODE_SIZE (10) - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_aes_vtbl = { - mz_stream_aes_open, - mz_stream_aes_is_open, - mz_stream_aes_read, - mz_stream_aes_write, - mz_stream_aes_tell, - mz_stream_aes_seek, - mz_stream_aes_close, - mz_stream_aes_error, - mz_stream_aes_create, - mz_stream_aes_delete, - mz_stream_aes_get_prop_int64, - NULL -}; - -/***************************************************************************/ - -typedef struct mz_stream_aes_s { - mz_stream stream; - int32_t mode; - int32_t error; - int16_t initialized; - uint8_t buffer[INT16_MAX]; - int64_t total_in; - int64_t total_out; - int16_t encryption_mode; - const char *password; - aes_encrypt_ctx encr_ctx[1]; - hmac_ctx auth_ctx[1]; - uint8_t nonce[AES_BLOCK_SIZE]; - uint8_t encr_bfr[AES_BLOCK_SIZE]; - uint32_t encr_pos; -} mz_stream_aes; - -/***************************************************************************/ - -int32_t mz_stream_aes_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - uint8_t kbuf[2 * MZ_AES_KEY_LENGTH_MAX + MZ_AES_PW_VERIFY_SIZE]; - uint8_t verify[MZ_AES_PW_VERIFY_SIZE]; - uint8_t verify_expected[MZ_AES_PW_VERIFY_SIZE]; - uint8_t salt_value[MZ_AES_SALT_LENGTH_MAX]; - int32_t salt_length = 0; - const char *password = path; - int32_t password_length = 0; - int32_t key_length = 0; - - aes->total_in = 0; - aes->total_out = 0; - aes->initialized = 0; - - if (mz_stream_is_open(aes->stream.base) != MZ_OK) - return MZ_STREAM_ERROR; - - if (password == NULL) - password = aes->password; - if (password == NULL) - return MZ_PARAM_ERROR; - password_length = (int32_t)strlen(password); - if (password_length > MZ_AES_PW_LENGTH_MAX) - return MZ_PARAM_ERROR; - - if (aes->encryption_mode < 1 || aes->encryption_mode > 3) - return MZ_PARAM_ERROR; - salt_length = MZ_AES_SALT_LENGTH(aes->encryption_mode); - - if (mode & MZ_OPEN_MODE_WRITE) - { - mz_os_rand(salt_value, salt_length); - } - else if (mode & MZ_OPEN_MODE_READ) - { - if (mz_stream_read(aes->stream.base, salt_value, salt_length) != salt_length) - return MZ_STREAM_ERROR; - } - - key_length = MZ_AES_KEY_LENGTH(aes->encryption_mode); - // Derive the encryption and authentication keys and the password verifier - derive_key((const uint8_t *)password, password_length, salt_value, salt_length, - MZ_AES_KEYING_ITERATIONS, kbuf, 2 * key_length + MZ_AES_PW_VERIFY_SIZE); - - // Initialize the encryption nonce and buffer pos - aes->encr_pos = AES_BLOCK_SIZE; - memset(aes->nonce, 0, AES_BLOCK_SIZE * sizeof(uint8_t)); - - // Initialize for encryption using key 1 - aes_encrypt_key(kbuf, key_length, aes->encr_ctx); - - // Initialize for authentication using key 2 - hmac_sha_begin(HMAC_SHA1, aes->auth_ctx); - hmac_sha_key(kbuf + key_length, key_length, aes->auth_ctx); - - memcpy(verify, kbuf + 2 * key_length, MZ_AES_PW_VERIFY_SIZE); - - if (mode & MZ_OPEN_MODE_WRITE) - { - if (mz_stream_write(aes->stream.base, salt_value, salt_length) != salt_length) - return MZ_STREAM_ERROR; - - aes->total_out += salt_length; - - if (mz_stream_write(aes->stream.base, verify, MZ_AES_PW_VERIFY_SIZE) != MZ_AES_PW_VERIFY_SIZE) - return MZ_STREAM_ERROR; - - aes->total_out += MZ_AES_PW_VERIFY_SIZE; - } - else if (mode & MZ_OPEN_MODE_READ) - { - aes->total_in += salt_length; - - if (mz_stream_read(aes->stream.base, verify_expected, MZ_AES_PW_VERIFY_SIZE) != MZ_AES_PW_VERIFY_SIZE) - return MZ_STREAM_ERROR; - - aes->total_in += MZ_AES_PW_VERIFY_SIZE; - - if (memcmp(verify_expected, verify, MZ_AES_PW_VERIFY_SIZE) != 0) - return MZ_PASSWORD_ERROR; - } - - aes->mode = mode; - aes->initialized = 1; - - return MZ_OK; -} - -int32_t mz_stream_aes_is_open(void *stream) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - if (aes->initialized == 0) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -static int32_t mz_stream_aes_encrypt_data(void *stream, uint8_t *buf, int32_t size) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - uint32_t pos = aes->encr_pos; - uint32_t i = 0; - - while (i < (uint32_t)size) - { - if (pos == AES_BLOCK_SIZE) - { - uint32_t j = 0; - - // Increment encryption nonce - while (j < 8 && !++aes->nonce[j]) - j += 1; - - // Encrypt the nonce to form next xor buffer - aes_encrypt(aes->nonce, aes->encr_bfr, aes->encr_ctx); - pos = 0; - } - - buf[i++] ^= aes->encr_bfr[pos++]; - } - - aes->encr_pos = pos; - return MZ_OK; -} - -int32_t mz_stream_aes_read(void *stream, void *buf, int32_t size) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - int32_t read = 0; - read = mz_stream_read(aes->stream.base, buf, size); - if (read > 0) - { - hmac_sha_data((uint8_t *)buf, read, aes->auth_ctx); - mz_stream_aes_encrypt_data(stream, (uint8_t *)buf, read); - } - - aes->total_in += read; - return read; -} - -int32_t mz_stream_aes_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - int32_t written = 0; - - if (size > (int32_t)sizeof(aes->buffer)) - return MZ_STREAM_ERROR; - - memcpy(aes->buffer, buf, size); - mz_stream_aes_encrypt_data(stream, (uint8_t *)aes->buffer, size); - hmac_sha_data((uint8_t *)aes->buffer, size, aes->auth_ctx); - - written = mz_stream_write(aes->stream.base, aes->buffer, size); - if (written > 0) - aes->total_out += written; - return written; -} - -int64_t mz_stream_aes_tell(void *stream) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - return mz_stream_tell(aes->stream.base); -} - -int32_t mz_stream_aes_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - return mz_stream_seek(aes->stream.base, offset, origin); -} - -int32_t mz_stream_aes_close(void *stream) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - uint8_t authcode[MZ_AES_AUTHCODE_SIZE]; - uint8_t verify_authcode[MZ_AES_AUTHCODE_SIZE]; - - if (MZ_AES_MAC_LENGTH(aes->encryption_mode) != MZ_AES_AUTHCODE_SIZE) - return MZ_STREAM_ERROR; - hmac_sha_end(authcode, MZ_AES_MAC_LENGTH(aes->encryption_mode), aes->auth_ctx); - - if (aes->mode & MZ_OPEN_MODE_WRITE) - { - if (mz_stream_write(aes->stream.base, authcode, MZ_AES_AUTHCODE_SIZE) != MZ_AES_AUTHCODE_SIZE) - return MZ_STREAM_ERROR; - - aes->total_out += MZ_AES_AUTHCODE_SIZE; - } - else if (aes->mode & MZ_OPEN_MODE_READ) - { - if (mz_stream_read(aes->stream.base, verify_authcode, MZ_AES_AUTHCODE_SIZE) != MZ_AES_AUTHCODE_SIZE) - return MZ_STREAM_ERROR; - - aes->total_in += MZ_AES_AUTHCODE_SIZE; - - if (memcmp(authcode, verify_authcode, MZ_AES_AUTHCODE_SIZE) != 0) - return MZ_CRC_ERROR; - } - - aes->initialized = 0; - return MZ_OK; -} - -int32_t mz_stream_aes_error(void *stream) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - return aes->error; -} - -void mz_stream_aes_set_password(void *stream, const char *password) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - aes->password = password; -} - -void mz_stream_aes_set_encryption_mode(void *stream, int16_t encryption_mode) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - aes->encryption_mode = encryption_mode; -} - -int32_t mz_stream_aes_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_aes *aes = (mz_stream_aes *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN: - *value = aes->total_in; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT: - *value = aes->total_out; - return MZ_OK; - case MZ_STREAM_PROP_HEADER_SIZE: - *value = MZ_AES_SALT_LENGTH(aes->encryption_mode) + MZ_AES_PW_VERIFY_SIZE; - return MZ_OK; - case MZ_STREAM_PROP_FOOTER_SIZE: - *value = MZ_AES_AUTHCODE_SIZE; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -void *mz_stream_aes_create(void **stream) -{ - mz_stream_aes *aes = NULL; - - aes = (mz_stream_aes *)MZ_ALLOC(sizeof(mz_stream_aes)); - if (aes != NULL) - { - memset(aes, 0, sizeof(mz_stream_aes)); - aes->stream.vtbl = &mz_stream_aes_vtbl; - aes->encryption_mode = MZ_AES_ENCRYPTION_MODE_256; - } - if (stream != NULL) - *stream = aes; - - return aes; -} - -void mz_stream_aes_delete(void **stream) -{ - mz_stream_aes *aes = NULL; - if (stream == NULL) - return; - aes = (mz_stream_aes *)*stream; - if (aes != NULL) - MZ_FREE(aes); - *stream = NULL; -} - -void *mz_stream_aes_get_interface(void) -{ - return (void *)&mz_stream_aes_vtbl; -} diff --git a/game/client/third/minizip/mz_strm_aes.h b/game/client/third/minizip/mz_strm_aes.h deleted file mode 100755 index 780d0249..00000000 --- a/game/client/third/minizip/mz_strm_aes.h +++ /dev/null @@ -1,48 +0,0 @@ -/* mz_strm_aes.h -- Stream for WinZIP AES encryption - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_AES_H -#define MZ_STREAM_AES_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_aes_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_aes_is_open(void *stream); -int32_t mz_stream_aes_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_aes_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_aes_tell(void *stream); -int32_t mz_stream_aes_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_aes_close(void *stream); -int32_t mz_stream_aes_error(void *stream); - -void mz_stream_aes_set_password(void *stream, const char *password); -void mz_stream_aes_set_encryption_mode(void *stream, int16_t encryption_mode); - -int32_t mz_stream_aes_get_prop_int64(void *stream, int32_t prop, int64_t *value); - -void* mz_stream_aes_create(void **stream); -void mz_stream_aes_delete(void **stream); - -void* mz_stream_aes_get_interface(void); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_buf.c b/game/client/third/minizip/mz_strm_buf.c deleted file mode 100755 index 55fe9bf7..00000000 --- a/game/client/third/minizip/mz_strm_buf.c +++ /dev/null @@ -1,397 +0,0 @@ -/* mz_strm_buf.c -- Stream for buffering reads/writes - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - This version of ioapi is designed to buffer IO. - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - - -#include -#include -#include -#include - -#include "mz.h" -#include "mz_strm.h" -#include "mz_strm_buf.h" - -/***************************************************************************/ - -#if 0 -# define mz_stream_buffered_print(s,f,...) printf(f,__VA_ARGS__); -#else -# define mz_stream_buffered_print(s,f,...) -#endif - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_buffered_vtbl = { - mz_stream_buffered_open, - mz_stream_buffered_is_open, - mz_stream_buffered_read, - mz_stream_buffered_write, - mz_stream_buffered_tell, - mz_stream_buffered_seek, - mz_stream_buffered_close, - mz_stream_buffered_error, - mz_stream_buffered_create, - mz_stream_buffered_delete, - NULL, - NULL -}; - -/***************************************************************************/ - -typedef struct mz_stream_buffered_s { - mz_stream stream; - int32_t error; - char readbuf[INT16_MAX]; - int32_t readbuf_len; - int32_t readbuf_pos; - int32_t readbuf_hits; - int32_t readbuf_misses; - char writebuf[INT16_MAX]; - int32_t writebuf_len; - int32_t writebuf_pos; - int32_t writebuf_hits; - int32_t writebuf_misses; - int64_t position; -} mz_stream_buffered; - -/***************************************************************************/ - -int32_t mz_stream_buffered_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - mz_stream_buffered_print(buffered, "open [mode %d]\n", mode); - return mz_stream_open(buffered->stream.base, path, mode); -} - -int32_t mz_stream_buffered_is_open(void *stream) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - return mz_stream_is_open(buffered->stream.base); -} - -static int32_t mz_stream_buffered_flush(void *stream, int32_t *written) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - int32_t total_bytes_written = 0; - int32_t bytes_to_write = buffered->writebuf_len; - int32_t bytes_left_to_write = buffered->writebuf_len; - int32_t bytes_written = 0; - - *written = 0; - - while (bytes_left_to_write > 0) - { - bytes_written = mz_stream_write(buffered->stream.base, - buffered->writebuf + (bytes_to_write - bytes_left_to_write), bytes_left_to_write); - - if (bytes_written != bytes_left_to_write) - return MZ_STREAM_ERROR; - - buffered->writebuf_misses += 1; - - mz_stream_buffered_print(stream, "write flush [%d:%d len %d]\n", - bytes_to_write, bytes_left_to_write, buffered->writebuf_len); - - total_bytes_written += bytes_written; - bytes_left_to_write -= bytes_written; - buffered->position += bytes_written; - } - - buffered->writebuf_len = 0; - buffered->writebuf_pos = 0; - - *written = total_bytes_written; - return MZ_OK; -} - -int32_t mz_stream_buffered_read(void *stream, void *buf, int32_t size) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - int32_t buf_len = 0; - int32_t bytes_to_read = 0; - int32_t bytes_to_copy = 0; - int32_t bytes_left_to_read = size; - int32_t bytes_read = 0; - - mz_stream_buffered_print(stream, "read [size %ld pos %lld]\n", size, buffered->position); - - if (buffered->writebuf_len > 0) - mz_stream_buffered_print(stream, "switch from write to read, not yet supported [%lld]\n", - buffered->position); - - while (bytes_left_to_read > 0) - { - if ((buffered->readbuf_len == 0) || (buffered->readbuf_pos == buffered->readbuf_len)) - { - if (buffered->readbuf_len == sizeof(buffered->readbuf)) - { - buffered->readbuf_pos = 0; - buffered->readbuf_len = 0; - } - - bytes_to_read = sizeof(buffered->readbuf) - (buffered->readbuf_len - buffered->readbuf_pos); - bytes_read = mz_stream_read(buffered->stream.base, buffered->readbuf + buffered->readbuf_pos, bytes_to_read); - if (bytes_read < 0) - return bytes_read; - - buffered->readbuf_misses += 1; - buffered->readbuf_len += bytes_read; - buffered->position += bytes_read; - - mz_stream_buffered_print(stream, "filled [read %d/%d buf %d:%d pos %lld]\n", - bytes_read, bytes_to_read, buffered->readbuf_pos, buffered->readbuf_len, buffered->position); - - if (bytes_read == 0) - break; - } - - if ((buffered->readbuf_len - buffered->readbuf_pos) > 0) - { - bytes_to_copy = (uint32_t)(buffered->readbuf_len - buffered->readbuf_pos); - if (bytes_to_copy > bytes_left_to_read) - bytes_to_copy = bytes_left_to_read; - - memcpy((char *)buf + buf_len, buffered->readbuf + buffered->readbuf_pos, bytes_to_copy); - - buf_len += bytes_to_copy; - bytes_left_to_read -= bytes_to_copy; - - buffered->readbuf_hits += 1; - buffered->readbuf_pos += bytes_to_copy; - - mz_stream_buffered_print(stream, "emptied [copied %d remaining %d buf %d:%d pos %lld]\n", - bytes_to_copy, bytes_left_to_read, buffered->readbuf_pos, buffered->readbuf_len, buffered->position); - } - } - - return size - bytes_left_to_read; -} - -int32_t mz_stream_buffered_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - int32_t bytes_to_write = size; - int32_t bytes_left_to_write = size; - int32_t bytes_to_copy = 0; - int32_t bytes_used = 0; - int32_t bytes_flushed = 0; - - - mz_stream_buffered_print(stream, "write [size %ld len %d pos %lld]\n", - size, buffered->writebuf_len, buffered->position); - - if (buffered->readbuf_len > 0) - { - buffered->position -= buffered->readbuf_len; - buffered->position += buffered->readbuf_pos; - - buffered->readbuf_len = 0; - buffered->readbuf_pos = 0; - - mz_stream_buffered_print(stream, "switch from read to write [%lld]\n", buffered->position); - - if (mz_stream_seek(buffered->stream.base, buffered->position, MZ_SEEK_SET) != MZ_OK) - return MZ_STREAM_ERROR; - } - - while (bytes_left_to_write > 0) - { - bytes_used = buffered->writebuf_len; - if (bytes_used > buffered->writebuf_pos) - bytes_used = buffered->writebuf_pos; - bytes_to_copy = (uint32_t)(sizeof(buffered->writebuf) - bytes_used); - if (bytes_to_copy > bytes_left_to_write) - bytes_to_copy = bytes_left_to_write; - - if (bytes_to_copy == 0) - { - if (mz_stream_buffered_flush(stream, &bytes_flushed) != MZ_OK) - return MZ_STREAM_ERROR; - if (bytes_flushed == 0) - return 0; - - continue; - } - - memcpy(buffered->writebuf + buffered->writebuf_pos, (const char *)buf + (bytes_to_write - bytes_left_to_write), bytes_to_copy); - - mz_stream_buffered_print(stream, "write copy [remaining %d write %d:%d len %d]\n", - bytes_to_copy, bytes_to_write, bytes_left_to_write, buffered->writebuf_len); - - bytes_left_to_write -= bytes_to_copy; - - buffered->writebuf_pos += bytes_to_copy; - buffered->writebuf_hits += 1; - if (buffered->writebuf_pos > buffered->writebuf_len) - buffered->writebuf_len += buffered->writebuf_pos - buffered->writebuf_len; - } - - return size - bytes_left_to_write; -} - -int64_t mz_stream_buffered_tell(void *stream) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - int64_t position = mz_stream_tell(buffered->stream.base); - - buffered->position = position; - - mz_stream_buffered_print(stream, "tell [pos %llu readpos %d writepos %d err %d]\n", - buffered->position, buffered->readbuf_pos, buffered->writebuf_pos, errno); - - if (buffered->readbuf_len > 0) - position -= (buffered->readbuf_len - buffered->readbuf_pos); - if (buffered->writebuf_len > 0) - position += buffered->writebuf_pos; - return position; -} - -int32_t mz_stream_buffered_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - int32_t bytes_flushed = 0; - - mz_stream_buffered_print(stream, "seek [origin %d offset %llu pos %lld]\n", origin, offset, buffered->position); - - switch (origin) - { - case MZ_SEEK_SET: - - if (buffered->writebuf_len > 0) - { - if ((offset >= buffered->position) && (offset <= buffered->position + buffered->writebuf_len)) - { - buffered->writebuf_pos = (uint32_t)(offset - buffered->position); - return MZ_OK; - } - } - - if ((buffered->readbuf_len > 0) && (offset < buffered->position) && - (offset >= buffered->position - buffered->readbuf_len)) - { - buffered->readbuf_pos = (uint32_t)(offset - (buffered->position - buffered->readbuf_len)); - return MZ_OK; - } - - if (mz_stream_buffered_flush(stream, &bytes_flushed) != MZ_OK) - return MZ_STREAM_ERROR; - - buffered->position = offset; - break; - - case MZ_SEEK_CUR: - - if (buffered->readbuf_len > 0) - { - if (offset <= (buffered->readbuf_len - buffered->readbuf_pos)) - { - buffered->readbuf_pos += (uint32_t)offset; - return MZ_OK; - } - offset -= (buffered->readbuf_len - buffered->readbuf_pos); - buffered->position += offset; - } - if (buffered->writebuf_len > 0) - { - if (offset <= (buffered->writebuf_len - buffered->writebuf_pos)) - { - buffered->writebuf_pos += (uint32_t)offset; - return MZ_OK; - } - //offset -= (buffered->writebuf_len - buffered->writebuf_pos); - } - - if (mz_stream_buffered_flush(stream, &bytes_flushed) != MZ_OK) - return MZ_STREAM_ERROR; - - break; - - case MZ_SEEK_END: - - if (buffered->writebuf_len > 0) - { - buffered->writebuf_pos = buffered->writebuf_len; - return MZ_OK; - } - break; - } - - buffered->readbuf_len = 0; - buffered->readbuf_pos = 0; - buffered->writebuf_len = 0; - buffered->writebuf_pos = 0; - - return mz_stream_seek(buffered->stream.base, offset, origin); -} - -int32_t mz_stream_buffered_close(void *stream) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - int32_t bytes_flushed = 0; - - mz_stream_buffered_flush(stream, &bytes_flushed); - mz_stream_buffered_print(stream, "close [flushed %d]\n", bytes_flushed); - - if (buffered->readbuf_hits + buffered->readbuf_misses > 0) - mz_stream_buffered_print(stream, "read efficency %.02f%%\n", - (buffered->readbuf_hits / ((float)buffered->readbuf_hits + buffered->readbuf_misses)) * 100); - - if (buffered->writebuf_hits + buffered->writebuf_misses > 0) - mz_stream_buffered_print(stream, "write efficency %.02f%%\n", - (buffered->writebuf_hits / ((float)buffered->writebuf_hits + buffered->writebuf_misses)) * 100); - - buffered->readbuf_len = 0; - buffered->readbuf_pos = 0; - buffered->writebuf_len = 0; - buffered->writebuf_pos = 0; - - return mz_stream_close(buffered->stream.base); -} - -int32_t mz_stream_buffered_error(void *stream) -{ - mz_stream_buffered *buffered = (mz_stream_buffered *)stream; - return mz_stream_error(buffered->stream.base); -} - -void *mz_stream_buffered_create(void **stream) -{ - mz_stream_buffered *buffered = NULL; - - buffered = (mz_stream_buffered *)MZ_ALLOC(sizeof(mz_stream_buffered)); - if (buffered != NULL) - { - memset(buffered, 0, sizeof(mz_stream_buffered)); - buffered->stream.vtbl = &mz_stream_buffered_vtbl; - } - if (stream != NULL) - *stream = buffered; - - return buffered; -} - -void mz_stream_buffered_delete(void **stream) -{ - mz_stream_buffered *buffered = NULL; - if (stream == NULL) - return; - buffered = (mz_stream_buffered *)*stream; - if (buffered != NULL) - MZ_FREE(buffered); - *stream = NULL; -} - -void *mz_stream_buffered_get_interface(void) -{ - return (void *)&mz_stream_buffered_vtbl; -} diff --git a/game/client/third/minizip/mz_strm_buf.h b/game/client/third/minizip/mz_strm_buf.h deleted file mode 100755 index 422ef7be..00000000 --- a/game/client/third/minizip/mz_strm_buf.h +++ /dev/null @@ -1,45 +0,0 @@ -/* mz_strm_buf.h -- Stream for buffering reads/writes - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - This version of ioapi is designed to buffer IO. - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_BUFFERED_H -#define MZ_STREAM_BUFFERED_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_buffered_open(void *stream, const char *path, int32_t mode); -int32_t mz_stream_buffered_is_open(void *stream); -int32_t mz_stream_buffered_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_buffered_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_buffered_tell(void *stream); -int32_t mz_stream_buffered_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_buffered_close(void *stream); -int32_t mz_stream_buffered_error(void *stream); - -void* mz_stream_buffered_create(void **stream); -void mz_stream_buffered_delete(void **stream); - -void* mz_stream_buffered_get_interface(void); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_bzip.c b/game/client/third/minizip/mz_strm_bzip.c deleted file mode 100755 index 5a0c525a..00000000 --- a/game/client/third/minizip/mz_strm_bzip.c +++ /dev/null @@ -1,384 +0,0 @@ -/* mz_strm_bzip.c -- Stream for bzip inflate/deflate - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as bzip. - See the accompanying LICENSE file for the full text of the license. -*/ - - -#include -#include -#include -#include - -#include "bzlib.h" - -#include "mz.h" -#include "mz_strm.h" -#include "mz_strm_bzip.h" - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_bzip_vtbl = { - mz_stream_bzip_open, - mz_stream_bzip_is_open, - mz_stream_bzip_read, - mz_stream_bzip_write, - mz_stream_bzip_tell, - mz_stream_bzip_seek, - mz_stream_bzip_close, - mz_stream_bzip_error, - mz_stream_bzip_create, - mz_stream_bzip_delete, - mz_stream_bzip_get_prop_int64, - mz_stream_bzip_set_prop_int64 -}; - -/***************************************************************************/ - -typedef struct mz_stream_bzip_s { - mz_stream stream; - bz_stream bzstream; - int32_t mode; - int32_t error; - uint8_t buffer[INT16_MAX]; - int32_t buffer_len; - int16_t stream_end; - int64_t total_in; - int64_t total_out; - int64_t max_total_in; - int8_t initialized; - int16_t level; -} mz_stream_bzip; - -/***************************************************************************/ - -int32_t mz_stream_bzip_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - - MZ_UNUSED(path); - - bzip->bzstream.bzalloc = 0; - bzip->bzstream.bzfree = 0; - bzip->bzstream.opaque = 0; - bzip->bzstream.total_in_lo32 = 0; - bzip->bzstream.total_in_hi32 = 0; - bzip->bzstream.total_out_lo32 = 0; - bzip->bzstream.total_out_hi32 = 0; - - bzip->total_in = 0; - bzip->total_out = 0; - - if (mode & MZ_OPEN_MODE_WRITE) - { - bzip->bzstream.next_out = (char *)bzip->buffer; - bzip->bzstream.avail_out = sizeof(bzip->buffer); - - bzip->error = BZ2_bzCompressInit(&bzip->bzstream, bzip->level, 0, 0); - } - else if (mode & MZ_OPEN_MODE_READ) - { - bzip->bzstream.next_in = (char *)bzip->buffer; - bzip->bzstream.avail_in = 0; - - bzip->error = BZ2_bzDecompressInit(&bzip->bzstream, 0, 0); - } - - if (bzip->error != BZ_OK) - return MZ_STREAM_ERROR; - - bzip->initialized = 1; - bzip->stream_end = 0; - bzip->mode = mode; - return MZ_OK; -} - -int32_t mz_stream_bzip_is_open(void *stream) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - if (bzip->initialized != 1) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_bzip_read(void *stream, void *buf, int32_t size) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - uint64_t total_in_before = 0; - uint64_t total_out_before = 0; - uint64_t total_in_after = 0; - uint64_t total_out_after = 0; - uint32_t total_in = 0; - uint32_t total_out = 0; - uint32_t in_bytes = 0; - uint32_t out_bytes = 0; - int32_t bytes_to_read = 0; - int32_t read = 0; - int32_t err = BZ_OK; - - - if (bzip->stream_end) - return 0; - - bzip->bzstream.next_out = (char *)buf; - bzip->bzstream.avail_out = (unsigned int)size; - - do - { - if (bzip->bzstream.avail_in == 0) - { - bytes_to_read = sizeof(bzip->buffer); - if (bzip->max_total_in > 0) - { - if ((bzip->max_total_in - bzip->total_in) < (int64_t)sizeof(bzip->buffer)) - bytes_to_read = (int32_t)(bzip->max_total_in - bzip->total_in); - } - - read = mz_stream_read(bzip->stream.base, bzip->buffer, bytes_to_read); - - if (read < 0) - { - bzip->error = BZ_IO_ERROR; - break; - } - if (read == 0) - break; - - bzip->bzstream.next_in = (char *)bzip->buffer; - bzip->bzstream.avail_in = read; - } - - total_in_before = bzip->bzstream.avail_in; - total_out_before = bzip->bzstream.total_out_lo32 + - (((uint64_t)bzip->bzstream.total_out_hi32) << 32); - - err = BZ2_bzDecompress(&bzip->bzstream); - - total_in_after = bzip->bzstream.avail_in; - total_out_after = bzip->bzstream.total_out_lo32 + - (((uint64_t)bzip->bzstream.total_out_hi32) << 32); - - in_bytes = (uint32_t)(total_in_before - total_in_after); - out_bytes = (uint32_t)(total_out_after - total_out_before); - - total_in += in_bytes; - total_out += out_bytes; - - bzip->total_in += in_bytes; - bzip->total_out += out_bytes; - - if (err == BZ_STREAM_END) - { - bzip->stream_end = 1; - break; - } - if (err != BZ_OK && err != BZ_RUN_OK) - { - bzip->error = err; - break; - } - } - while (bzip->bzstream.avail_out > 0); - - if (bzip->error != 0) - return bzip->error; - - return total_out; -} - -static int32_t mz_stream_bzip_flush(void *stream) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - if (mz_stream_write(bzip->stream.base, bzip->buffer, bzip->buffer_len) != bzip->buffer_len) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -static int32_t mz_stream_bzip_compress(void *stream, int flush) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - uint64_t total_out_before = 0; - uint64_t total_out_after = 0; - uint32_t out_bytes = 0; - int32_t err = BZ_OK; - - do - { - if (bzip->bzstream.avail_out == 0) - { - if (mz_stream_bzip_flush(bzip) != MZ_OK) - { - bzip->error = BZ_DATA_ERROR; - return MZ_STREAM_ERROR; - } - - bzip->bzstream.avail_out = sizeof(bzip->buffer); - bzip->bzstream.next_out = (char *)bzip->buffer; - - bzip->buffer_len = 0; - } - - total_out_before = bzip->bzstream.total_out_lo32 + - (((uint64_t)bzip->bzstream.total_out_hi32) << 32); - - err = BZ2_bzCompress(&bzip->bzstream, flush); - - total_out_after = bzip->bzstream.total_out_lo32 + - (((uint64_t)bzip->bzstream.total_out_hi32) << 32); - - out_bytes = (uint32_t)(total_out_after - total_out_before); - - bzip->buffer_len += out_bytes; - bzip->total_out += out_bytes; - - if (err == BZ_STREAM_END) - break; - if (err < 0) - { - bzip->error = err; - return MZ_STREAM_ERROR; - } - } - while ((bzip->bzstream.avail_in > 0) || (flush == BZ_FINISH && err == BZ_FINISH_OK)); - - return MZ_OK; -} - -int32_t mz_stream_bzip_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - - - bzip->bzstream.next_in = (char *)(intptr_t)buf; - bzip->bzstream.avail_in = (unsigned int)size; - - mz_stream_bzip_compress(stream, BZ_RUN); - - bzip->total_in += size; - - return size; -} - -int64_t mz_stream_bzip_tell(void *stream) -{ - MZ_UNUSED(stream); - - return MZ_STREAM_ERROR; -} - -int32_t mz_stream_bzip_seek(void *stream, int64_t offset, int32_t origin) -{ - MZ_UNUSED(stream); - MZ_UNUSED(offset); - MZ_UNUSED(origin); - - return MZ_STREAM_ERROR; -} - -int32_t mz_stream_bzip_close(void *stream) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - - if (bzip->mode & MZ_OPEN_MODE_WRITE) - { - mz_stream_bzip_compress(stream, BZ_FINISH); - mz_stream_bzip_flush(stream); - - BZ2_bzCompressEnd(&bzip->bzstream); - } - else if (bzip->mode & MZ_OPEN_MODE_READ) - { - BZ2_bzDecompressEnd(&bzip->bzstream); - } - - bzip->initialized = 0; - - if (bzip->error != BZ_OK) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_bzip_error(void *stream) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - return bzip->error; -} - -int32_t mz_stream_bzip_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN: - *value = bzip->total_in; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT: - *value = bzip->total_out; - return MZ_OK; - case MZ_STREAM_PROP_HEADER_SIZE: - *value = 0; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -int32_t mz_stream_bzip_set_prop_int64(void *stream, int32_t prop, int64_t value) -{ - mz_stream_bzip *bzip = (mz_stream_bzip *)stream; - switch (prop) - { - case MZ_STREAM_PROP_COMPRESS_LEVEL: - if (value < 0) - bzip->level = 6; - else - bzip->level = (int16_t)value; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_IN_MAX: - bzip->max_total_in = value; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -void *mz_stream_bzip_create(void **stream) -{ - mz_stream_bzip *bzip = NULL; - - bzip = (mz_stream_bzip *)MZ_ALLOC(sizeof(mz_stream_bzip)); - if (bzip != NULL) - { - memset(bzip, 0, sizeof(mz_stream_bzip)); - bzip->stream.vtbl = &mz_stream_bzip_vtbl; - bzip->level = 6; - } - if (stream != NULL) - *stream = bzip; - - return bzip; -} - -void mz_stream_bzip_delete(void **stream) -{ - mz_stream_bzip *bzip = NULL; - if (stream == NULL) - return; - bzip = (mz_stream_bzip *)*stream; - if (bzip != NULL) - MZ_FREE(bzip); - *stream = NULL; -} - -void *mz_stream_bzip_get_interface(void) -{ - return (void *)&mz_stream_bzip_vtbl; -} - -extern void bz_internal_error(int errcode) -{ - MZ_UNUSED(errcode); -} diff --git a/game/client/third/minizip/mz_strm_bzip.h b/game/client/third/minizip/mz_strm_bzip.h deleted file mode 100755 index da0ba92d..00000000 --- a/game/client/third/minizip/mz_strm_bzip.h +++ /dev/null @@ -1,48 +0,0 @@ -/* mz_strm_bzip.h -- Stream for bzip inflate/deflate - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_BZIP_H -#define MZ_STREAM_BZIP_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_bzip_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_bzip_is_open(void *stream); -int32_t mz_stream_bzip_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_bzip_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_bzip_tell(void *stream); -int32_t mz_stream_bzip_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_bzip_close(void *stream); -int32_t mz_stream_bzip_error(void *stream); - -int32_t mz_stream_bzip_get_prop_int64(void *stream, int32_t prop, int64_t *value); -int32_t mz_stream_bzip_set_prop_int64(void *stream, int32_t prop, int64_t value); - -void* mz_stream_bzip_create(void **stream); -void mz_stream_bzip_delete(void **stream); - -void* mz_stream_bzip_get_interface(void); - -void bz_internal_error(int errcode); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_lzma.c b/game/client/third/minizip/mz_strm_lzma.c deleted file mode 100755 index 2c35cbaf..00000000 --- a/game/client/third/minizip/mz_strm_lzma.c +++ /dev/null @@ -1,419 +0,0 @@ -/* mz_strm_lzma.c -- Stream for lzma inflate/deflate - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as lzma. - See the accompanying LICENSE file for the full text of the license. -*/ - - -#include -#include -#include -#include -#include - -#include - -#include "mz.h" -#include "mz_strm.h" -#include "mz_strm_lzma.h" - -/***************************************************************************/ - -#define MZ_LZMA_HEADER_SIZE (4) - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_lzma_vtbl = { - mz_stream_lzma_open, - mz_stream_lzma_is_open, - mz_stream_lzma_read, - mz_stream_lzma_write, - mz_stream_lzma_tell, - mz_stream_lzma_seek, - mz_stream_lzma_close, - mz_stream_lzma_error, - mz_stream_lzma_create, - mz_stream_lzma_delete, - mz_stream_lzma_get_prop_int64, - mz_stream_lzma_set_prop_int64 -}; - -/***************************************************************************/ - -typedef struct mz_stream_lzma_s { - mz_stream stream; - lzma_stream lstream; - int32_t mode; - int32_t error; - uint8_t buffer[INT16_MAX]; - int32_t buffer_len; - int64_t total_in; - int64_t total_out; - int64_t max_total_in; - int64_t max_total_out; - int8_t initialized; - uint32_t preset; -} mz_stream_lzma; - -/***************************************************************************/ - -int32_t mz_stream_lzma_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - lzma_filter filters[LZMA_FILTERS_MAX + 1]; - lzma_options_lzma opt_lzma; - uint32_t size = 0; - uint8_t major = 0; - uint8_t minor = 0; - - MZ_UNUSED(path); - - memset(&opt_lzma, 0, sizeof(opt_lzma)); - - lzma->lstream.total_in = 0; - lzma->lstream.total_out = 0; - - lzma->total_in = 0; - lzma->total_out = 0; - - if (mode & MZ_OPEN_MODE_WRITE) - { - lzma->lstream.next_out = lzma->buffer; - lzma->lstream.avail_out = sizeof(lzma->buffer); - - if (lzma_lzma_preset(&opt_lzma, lzma->preset)) - return MZ_STREAM_ERROR; - - memset(&filters, 0, sizeof(filters)); - - filters[0].id = LZMA_FILTER_LZMA1; - filters[0].options = &opt_lzma; - filters[1].id = LZMA_VLI_UNKNOWN; - - lzma_properties_size(&size, (lzma_filter *)&filters); - - mz_stream_write_uint8(lzma->stream.base, LZMA_VERSION_MAJOR); - mz_stream_write_uint8(lzma->stream.base, LZMA_VERSION_MINOR); - mz_stream_write_uint16(lzma->stream.base, (uint16_t)size); - - lzma->total_out += MZ_LZMA_HEADER_SIZE; - - lzma->error = lzma_alone_encoder(&lzma->lstream, &opt_lzma); - } - else if (mode & MZ_OPEN_MODE_READ) - { - lzma->lstream.next_in = lzma->buffer; - lzma->lstream.avail_in = 0; - - mz_stream_read_uint8(lzma->stream.base, &major); - mz_stream_read_uint8(lzma->stream.base, &minor); - mz_stream_read_uint16(lzma->stream.base, (uint16_t *)&size); - - lzma->total_in += MZ_LZMA_HEADER_SIZE; - - lzma->error = lzma_alone_decoder(&lzma->lstream, UINT64_MAX); - } - - if (lzma->error != LZMA_OK) - return MZ_STREAM_ERROR; - - lzma->initialized = 1; - lzma->mode = mode; - return MZ_OK; -} - -int32_t mz_stream_lzma_is_open(void *stream) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - if (lzma->initialized != 1) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_lzma_read(void *stream, void *buf, int32_t size) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - uint64_t total_in_before = 0; - uint64_t total_out_before = 0; - uint64_t total_in_after = 0; - uint64_t total_out_after = 0; - uint32_t total_in = 0; - uint32_t total_out = 0; - uint32_t in_bytes = 0; - uint32_t out_bytes = 0; - int32_t bytes_to_read = 0; - int32_t read = 0; - int32_t err = LZMA_OK; - - - lzma->lstream.next_out = (uint8_t*)buf; - lzma->lstream.avail_out = (size_t)size; - - do - { - if (lzma->lstream.avail_in == 0) - { - bytes_to_read = sizeof(lzma->buffer); - if (lzma->max_total_in > 0) - { - if ((lzma->max_total_in - lzma->total_in) < (int64_t)sizeof(lzma->buffer)) - bytes_to_read = (int32_t)(lzma->max_total_in - lzma->total_in); - } - - read = mz_stream_read(lzma->stream.base, lzma->buffer, bytes_to_read); - - if (read < 0) - { - lzma->error = MZ_STREAM_ERROR; - break; - } - if (read == 0) - break; - - lzma->lstream.next_in = lzma->buffer; - lzma->lstream.avail_in = read; - } - - total_in_before = lzma->lstream.avail_in; - total_out_before = lzma->lstream.total_out; - - err = lzma_code(&lzma->lstream, LZMA_RUN); - - total_in_after = lzma->lstream.avail_in; - total_out_after = lzma->lstream.total_out; - if ((lzma->max_total_out != -1) && (int64_t)total_out_after > lzma->max_total_out) - total_out_after = lzma->max_total_out; - - in_bytes = (uint32_t)(total_in_before - total_in_after); - out_bytes = (uint32_t)(total_out_after - total_out_before); - - total_in += in_bytes; - total_out += out_bytes; - - lzma->total_in += in_bytes; - lzma->total_out += out_bytes; - - if (err == LZMA_STREAM_END) - break; - if (err != LZMA_OK) - { - lzma->error = err; - break; - } - } - while (lzma->lstream.avail_out > 0); - - if (lzma->error != 0) - return lzma->error; - - return total_out; -} - -static int32_t mz_stream_lzma_flush(void *stream) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - if (mz_stream_write(lzma->stream.base, lzma->buffer, lzma->buffer_len) != lzma->buffer_len) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -static int32_t mz_stream_lzma_code(void *stream, int32_t flush) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - uint64_t total_out_before = 0; - uint64_t total_out_after = 0; - uint32_t out_bytes = 0; - int32_t err = LZMA_OK; - - - do - { - if (lzma->lstream.avail_out == 0) - { - if (mz_stream_lzma_flush(lzma) != MZ_OK) - { - lzma->error = MZ_STREAM_ERROR; - return MZ_STREAM_ERROR; - } - - lzma->lstream.avail_out = sizeof(lzma->buffer); - lzma->lstream.next_out = lzma->buffer; - - lzma->buffer_len = 0; - } - - total_out_before = lzma->lstream.total_out; - err = lzma_code(&lzma->lstream, flush); - total_out_after = lzma->lstream.total_out; - - out_bytes = (uint32_t)(total_out_after - total_out_before); - - if (err != LZMA_OK && err != LZMA_STREAM_END) - { - lzma->error = err; - return MZ_STREAM_ERROR; - } - - lzma->buffer_len += out_bytes; - lzma->total_out += out_bytes; - } - while (lzma->lstream.avail_in > 0); - - return MZ_OK; -} - -int32_t mz_stream_lzma_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - - - lzma->lstream.next_in = (uint8_t*)(intptr_t)buf; - lzma->lstream.avail_in = (size_t)size; - - mz_stream_lzma_code(stream, LZMA_RUN); - - lzma->total_in += size; - - return size; -} - -int64_t mz_stream_lzma_tell(void *stream) -{ - MZ_UNUSED(stream); - - return MZ_STREAM_ERROR; -} - -int32_t mz_stream_lzma_seek(void *stream, int64_t offset, int32_t origin) -{ - MZ_UNUSED(stream); - MZ_UNUSED(offset); - MZ_UNUSED(origin); - - return MZ_STREAM_ERROR; -} - -int32_t mz_stream_lzma_close(void *stream) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - - if (lzma->mode & MZ_OPEN_MODE_WRITE) - { - mz_stream_lzma_code(stream, LZMA_FINISH); - mz_stream_lzma_flush(stream); - - lzma_end(&lzma->lstream); - } - else if (lzma->mode & MZ_OPEN_MODE_READ) - { - lzma_end(&lzma->lstream); - } - - lzma->initialized = 0; - - if (lzma->error != LZMA_OK) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_lzma_error(void *stream) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - return lzma->error; -} - -int32_t mz_stream_lzma_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN: - *value = lzma->total_in; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT: - *value = lzma->total_out; - return MZ_OK; - case MZ_STREAM_PROP_HEADER_SIZE: - *value = MZ_LZMA_HEADER_SIZE; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -int32_t mz_stream_lzma_set_prop_int64(void *stream, int32_t prop, int64_t value) -{ - mz_stream_lzma *lzma = (mz_stream_lzma *)stream; - switch (prop) - { - case MZ_STREAM_PROP_COMPRESS_LEVEL: - if (value >= 9) - lzma->preset = LZMA_PRESET_EXTREME; - else - lzma->preset = LZMA_PRESET_DEFAULT; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_IN_MAX: - lzma->max_total_in = value; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT_MAX: - if (value < -1) - return MZ_PARAM_ERROR; - lzma->max_total_out = value; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -void *mz_stream_lzma_create(void **stream) -{ - mz_stream_lzma *lzma = NULL; - - lzma = (mz_stream_lzma *)MZ_ALLOC(sizeof(mz_stream_lzma)); - if (lzma != NULL) - { - memset(lzma, 0, sizeof(mz_stream_lzma)); - lzma->stream.vtbl = &mz_stream_lzma_vtbl; - lzma->preset = LZMA_PRESET_DEFAULT; - lzma->max_total_out = -1; - } - if (stream != NULL) - *stream = lzma; - - return lzma; -} - -void mz_stream_lzma_delete(void **stream) -{ - mz_stream_lzma *lzma = NULL; - if (stream == NULL) - return; - lzma = (mz_stream_lzma *)*stream; - if (lzma != NULL) - MZ_FREE(lzma); - *stream = NULL; -} - -void *mz_stream_lzma_get_interface(void) -{ - return (void *)&mz_stream_lzma_vtbl; -} - -static int64_t mz_stream_lzma_crc32(int64_t value, const void *buf, int32_t size) -{ - return (int32_t)lzma_crc32(buf, size, (int32_t)value); -} - -void *mz_stream_lzma_get_crc32_table(void) -{ - extern const uint32_t lzma_crc32_table; - return (void *)lzma_crc32_table; -} - -void *mz_stream_lzma_get_crc32_update(void) -{ - return (void *)mz_stream_lzma_crc32; -} diff --git a/game/client/third/minizip/mz_strm_lzma.h b/game/client/third/minizip/mz_strm_lzma.h deleted file mode 100755 index ed14df70..00000000 --- a/game/client/third/minizip/mz_strm_lzma.h +++ /dev/null @@ -1,48 +0,0 @@ -/* mz_strm_lzma.h -- Stream for lzma inflate/deflate - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as lzma. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_LZMA_H -#define MZ_STREAM_LZMA_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_lzma_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_lzma_is_open(void *stream); -int32_t mz_stream_lzma_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_lzma_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_lzma_tell(void *stream); -int32_t mz_stream_lzma_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_lzma_close(void *stream); -int32_t mz_stream_lzma_error(void *stream); - -int32_t mz_stream_lzma_get_prop_int64(void *stream, int32_t prop, int64_t *value); -int32_t mz_stream_lzma_set_prop_int64(void *stream, int32_t prop, int64_t value); - -void* mz_stream_lzma_create(void **stream); -void mz_stream_lzma_delete(void **stream); - -void* mz_stream_lzma_get_interface(void); -void* mz_stream_lzma_get_crc32_table(void); -void* mz_stream_lzma_get_crc32_update(void); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_mem.c b/game/client/third/minizip/mz_strm_mem.c deleted file mode 100755 index 7a13f28a..00000000 --- a/game/client/third/minizip/mz_strm_mem.c +++ /dev/null @@ -1,278 +0,0 @@ -/* mz_strm_mem.c -- Stream for memory access - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - This interface is designed to access memory rather than files. - We do use a region of memory to put data in to and take it out of. - - Based on Unzip ioapi.c version 0.22, May 19th, 2003 - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2003 Justin Fletcher - Copyright (C) 1998-2003 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - - -#include -#include -#include - -#include "mz.h" -#include "mz_strm.h" -#include "mz_strm_mem.h" - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_mem_vtbl = { - mz_stream_mem_open, - mz_stream_mem_is_open, - mz_stream_mem_read, - mz_stream_mem_write, - mz_stream_mem_tell, - mz_stream_mem_seek, - mz_stream_mem_close, - mz_stream_mem_error, - mz_stream_mem_create, - mz_stream_mem_delete, - NULL, - NULL -}; - -/***************************************************************************/ - -typedef struct mz_stream_mem_s { - mz_stream stream; - int32_t mode; - char *buffer; // Memory buffer pointer - int32_t size; // Size of the memory buffer - int32_t limit; // Furthest we've written - int32_t position; // Current position in the memory - int32_t grow_size; // Size to grow when full -} mz_stream_mem; - -/***************************************************************************/ - -static void mz_stream_mem_set_size(void *stream, int32_t size) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - int32_t new_size = size; - char *new_buf = NULL; - - - new_buf = (char *)MZ_ALLOC(new_size); - if (mem->buffer) - { - memcpy(new_buf, mem->buffer, mem->size); - MZ_FREE(mem->buffer); - } - - mem->buffer = new_buf; - mem->size = new_size; -} - -int32_t mz_stream_mem_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - - MZ_UNUSED(path); - - mem->mode = mode; - mem->limit = 0; - mem->position = 0; - - if (mem->mode & MZ_OPEN_MODE_CREATE) - mz_stream_mem_set_size(stream, mem->grow_size); - else - mem->limit = mem->size; - - return MZ_OK; -} - -int32_t mz_stream_mem_is_open(void *stream) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - if (mem->buffer == NULL) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_mem_read(void *stream, void *buf, int32_t size) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - - if (size > mem->size - mem->position) - size = mem->size - mem->position; - - if (mem->position + size > mem->limit) - return 0; - - memcpy(buf, mem->buffer + mem->position, size); - mem->position += size; - - return size; -} - -int32_t mz_stream_mem_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - int32_t new_size = 0; - - if (size == 0) - return size; - - if (size > mem->size - mem->position) - { - if (mem->mode & MZ_OPEN_MODE_CREATE) - { - new_size = mem->size; - if (size < mem->grow_size) - new_size += mem->grow_size; - else - new_size += size; - - mz_stream_mem_set_size(stream, new_size); - } - else - { - size = mem->size - mem->position; - } - } - - memcpy(mem->buffer + mem->position, buf, size); - - mem->position += size; - if (mem->position > mem->limit) - mem->limit = mem->position; - - return size; -} - -int64_t mz_stream_mem_tell(void *stream) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - return mem->position; -} - -int32_t mz_stream_mem_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - int64_t new_pos = 0; - - switch (origin) - { - case MZ_SEEK_CUR: - new_pos = mem->position + offset; - break; - case MZ_SEEK_END: - new_pos = mem->limit + offset; - break; - case MZ_SEEK_SET: - new_pos = offset; - break; - default: - return MZ_STREAM_ERROR; - } - - if (new_pos > mem->size) - { - if ((mem->mode & MZ_OPEN_MODE_CREATE) == 0) - return MZ_STREAM_ERROR; - - mz_stream_mem_set_size(stream, (int32_t)new_pos); - } - - mem->position = (uint32_t)new_pos; - return MZ_OK; -} - -int32_t mz_stream_mem_close(void *stream) -{ - MZ_UNUSED(stream); - - // We never return errors - return MZ_OK; -} - -int32_t mz_stream_mem_error(void *stream) -{ - MZ_UNUSED(stream); - - // We never return errors - return MZ_OK; -} - -void mz_stream_mem_set_buffer(void *stream, void *buf, int32_t size) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - mem->buffer = buf; - mem->size = size; - mem->limit = size; -} - -int32_t mz_stream_mem_get_buffer(void *stream, const void **buf) -{ - return mz_stream_mem_get_buffer_at(stream, 0, buf); -} - -int32_t mz_stream_mem_get_buffer_at(void *stream, int64_t position, const void **buf) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - if (buf == NULL || position < 0 || mem->size < position || mem->buffer == NULL) - return MZ_STREAM_ERROR; - *buf = mem->buffer + position; - return MZ_OK; -} - -void mz_stream_mem_get_buffer_length(void *stream, int32_t *length) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - *length = mem->limit; -} - -void mz_stream_mem_set_grow_size(void *stream, int32_t grow_size) -{ - mz_stream_mem *mem = (mz_stream_mem *)stream; - mem->grow_size = grow_size; -} - -void *mz_stream_mem_create(void **stream) -{ - mz_stream_mem *mem = NULL; - - mem = (mz_stream_mem *)MZ_ALLOC(sizeof(mz_stream_mem)); - if (mem != NULL) - { - memset(mem, 0, sizeof(mz_stream_mem)); - mem->stream.vtbl = &mz_stream_mem_vtbl; - mem->grow_size = 4096; - } - if (stream != NULL) - *stream = mem; - - return mem; -} - -void mz_stream_mem_delete(void **stream) -{ - mz_stream_mem *mem = NULL; - if (stream == NULL) - return; - mem = (mz_stream_mem *)*stream; - if (mem != NULL) - { - if ((mem->mode & MZ_OPEN_MODE_CREATE) && (mem->buffer != NULL)) - MZ_FREE(mem->buffer); - MZ_FREE(mem); - } - *stream = NULL; -} - -void *mz_stream_mem_get_interface(void) -{ - return (void *)&mz_stream_mem_vtbl; -} diff --git a/game/client/third/minizip/mz_strm_mem.h b/game/client/third/minizip/mz_strm_mem.h deleted file mode 100755 index 8a3ce11b..00000000 --- a/game/client/third/minizip/mz_strm_mem.h +++ /dev/null @@ -1,51 +0,0 @@ -/* mz_strm_mem.h -- Stream for memory access - Version 2.3.3, June 10, 2018 - part of MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2003 Justin Fletcher - Copyright (C) 1998-2003 Gilles Vollant - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_MEM_H -#define MZ_STREAM_MEM_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_mem_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_mem_is_open(void *stream); -int32_t mz_stream_mem_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_mem_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_mem_tell(void *stream); -int32_t mz_stream_mem_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_mem_close(void *stream); -int32_t mz_stream_mem_error(void *stream); - -void mz_stream_mem_set_buffer(void *stream, void *buf, int32_t size); -int32_t mz_stream_mem_get_buffer(void *stream, const void **buf); -int32_t mz_stream_mem_get_buffer_at(void *stream, int64_t position, const void **buf); -void mz_stream_mem_get_buffer_length(void *stream, int32_t *length); -void mz_stream_mem_set_grow_size(void *stream, int32_t grow_size); - -void* mz_stream_mem_create(void **stream); -void mz_stream_mem_delete(void **stream); - -void* mz_stream_mem_get_interface(void); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_pkcrypt.c b/game/client/third/minizip/mz_strm_pkcrypt.c deleted file mode 100755 index a05b578b..00000000 --- a/game/client/third/minizip/mz_strm_pkcrypt.c +++ /dev/null @@ -1,352 +0,0 @@ -/* mz_strm_pkcrypt.c -- Code for traditional PKWARE encryption - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 1998-2005 Gilles Vollant - Modifications for Info-ZIP crypting - http://www.winimage.com/zLibDll/minizip.html - Copyright (C) 2003 Terry Thorsen - - This code is a modified version of crypting code in Info-ZIP distribution - - Copyright (C) 1990-2000 Info-ZIP. All rights reserved. - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. - - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). -*/ - - -#include -#include -#include - -#ifdef HAVE_ZLIB -#include "zlib.h" -#endif - -#include "mz.h" -#include "mz_os.h" -#include "mz_strm.h" -#ifdef HAVE_LZMA -#include "mz_strm_lzma.h" -#endif -#include "mz_strm_pkcrypt.h" -#ifdef HAVE_ZLIB -#include "mz_strm_zlib.h" -#endif - -/***************************************************************************/ - -#define RAND_HEAD_LEN 12 - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_pkcrypt_vtbl = { - mz_stream_pkcrypt_open, - mz_stream_pkcrypt_is_open, - mz_stream_pkcrypt_read, - mz_stream_pkcrypt_write, - mz_stream_pkcrypt_tell, - mz_stream_pkcrypt_seek, - mz_stream_pkcrypt_close, - mz_stream_pkcrypt_error, - mz_stream_pkcrypt_create, - mz_stream_pkcrypt_delete, - mz_stream_pkcrypt_get_prop_int64, - NULL -}; - -/***************************************************************************/ - -// Define z_crc_t in zlib 1.2.5 and less or if using zlib-ng -#if (ZLIB_VERNUM < 0x1270) || defined(ZLIBNG_VERNUM) || !defined(HAVE_ZLIB) -#ifdef HAVE_ZLIB - typedef unsigned long z_crc_t; -#else - typedef uint32_t z_crc_t; -#endif -#endif - -/***************************************************************************/ - -typedef struct mz_stream_pkcrypt_s { - mz_stream stream; - int32_t error; - int16_t initialized; - uint8_t buffer[INT16_MAX]; - int64_t total_in; - int64_t total_out; - uint32_t keys[3]; // keys defining the pseudo-random sequence - const z_crc_t *crc_32_tab; - uint8_t verify1; - uint8_t verify2; - const char *password; -} mz_stream_pkcrypt; - -/***************************************************************************/ - -#define zdecode(keys,crc_32_tab,c) \ - (mz_stream_pkcrypt_update_keys(keys,crc_32_tab, c ^= mz_stream_pkcrypt_decrypt_byte(keys))) - -#define zencode(keys,crc_32_tab,c,t) \ - (t = mz_stream_pkcrypt_decrypt_byte(keys), mz_stream_pkcrypt_update_keys(keys,crc_32_tab,c), t^(c)) - -/***************************************************************************/ - -static uint8_t mz_stream_pkcrypt_decrypt_byte(uint32_t *keys) -{ - unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an - * unpredictable manner on 16-bit systems; not a problem - * with any known compiler so far, though */ - - temp = ((uint32_t)(*(keys+2)) & 0xffff) | 2; - return (uint8_t)(((temp * (temp ^ 1)) >> 8) & 0xff); -} - -static uint8_t mz_stream_pkcrypt_update_keys(uint32_t *keys, const z_crc_t *crc_32_tab, int32_t c) -{ - #define CRC32(c, b) ((*(crc_32_tab+(((uint32_t)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) - - (*(keys+0)) = (uint32_t)CRC32((*(keys+0)), c); - (*(keys+1)) += (*(keys+0)) & 0xff; - (*(keys+1)) = (*(keys+1)) * 134775813L + 1; - { - register int32_t keyshift = (int32_t)((*(keys + 1)) >> 24); - (*(keys+2)) = (uint32_t)CRC32((*(keys+2)), keyshift); - } - return (uint8_t)c; -} - -static void mz_stream_pkcrypt_init_keys(const char *password, uint32_t *keys, const z_crc_t *crc_32_tab) -{ - *(keys+0) = 305419896L; - *(keys+1) = 591751049L; - *(keys+2) = 878082192L; - - while (*password != 0) - { - mz_stream_pkcrypt_update_keys(keys, crc_32_tab, *password); - password += 1; - } -} - -/***************************************************************************/ - -int32_t mz_stream_pkcrypt_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - uint16_t t = 0; - int16_t i = 0; - //uint8_t verify1 = 0; - uint8_t verify2 = 0; - uint8_t header[RAND_HEAD_LEN]; - const char *password = path; - - pkcrypt->total_in = 0; - pkcrypt->total_out = 0; - pkcrypt->initialized = 0; - - if (mz_stream_is_open(pkcrypt->stream.base) != MZ_OK) - return MZ_STREAM_ERROR; - - if (password == NULL) - password = pkcrypt->password; - if (password == NULL) - return MZ_STREAM_ERROR; - -#ifdef HAVE_ZLIB - pkcrypt->crc_32_tab = (z_crc_t *)mz_stream_zlib_get_crc32_table(); -#elif defined(HAVE_LZMA) - pkcrypt->crc_32_tab = (z_crc_t *)mz_stream_lzma_get_crc32_table(); -#else -#error ZLIB or LZMA required for CRC32 -#endif - - if (pkcrypt->crc_32_tab == NULL) - return MZ_STREAM_ERROR; - - mz_stream_pkcrypt_init_keys(password, pkcrypt->keys, pkcrypt->crc_32_tab); - - if (mode & MZ_OPEN_MODE_WRITE) - { - // First generate RAND_HEAD_LEN - 2 random bytes. - mz_os_rand(header, RAND_HEAD_LEN - 2); - - // Encrypt random header (last two bytes is high word of crc) - for (i = 0; i < RAND_HEAD_LEN - 2; i++) - header[i] = (uint8_t)zencode(pkcrypt->keys, pkcrypt->crc_32_tab, header[i], t); - - header[i++] = (uint8_t)zencode(pkcrypt->keys, pkcrypt->crc_32_tab, pkcrypt->verify1, t); - header[i++] = (uint8_t)zencode(pkcrypt->keys, pkcrypt->crc_32_tab, pkcrypt->verify2, t); - - if (mz_stream_write(pkcrypt->stream.base, header, RAND_HEAD_LEN) != RAND_HEAD_LEN) - return MZ_STREAM_ERROR; - - pkcrypt->total_out += RAND_HEAD_LEN; - } - else if (mode & MZ_OPEN_MODE_READ) - { - if (mz_stream_read(pkcrypt->stream.base, header, RAND_HEAD_LEN) != RAND_HEAD_LEN) - return MZ_STREAM_ERROR; - - for (i = 0; i < RAND_HEAD_LEN - 2; i++) - header[i] = (uint8_t)zdecode(pkcrypt->keys, pkcrypt->crc_32_tab, header[i]); - - //verify1 = (uint8_t)zdecode(crypt->keys, crypt->crc_32_tab, header[i++]); - verify2 = (uint8_t)zdecode(pkcrypt->keys, pkcrypt->crc_32_tab, header[i++]); - - // Older versions used 2 byte check, newer versions use 1 byte check. - if ((verify2 != 0) && (verify2 != pkcrypt->verify2)) - return MZ_PASSWORD_ERROR; - - pkcrypt->total_in += RAND_HEAD_LEN; - } - - pkcrypt->initialized = 1; - return MZ_OK; -} - -int32_t mz_stream_pkcrypt_is_open(void *stream) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - if (pkcrypt->initialized == 0) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_pkcrypt_read(void *stream, void *buf, int32_t size) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - uint8_t *buf_ptr = (uint8_t *)buf; - int32_t read = 0; - int32_t i = 0; - - read = mz_stream_read(pkcrypt->stream.base, buf, size); - - for (i = 0; i < read; i++) - buf_ptr[i] = (uint8_t)zdecode(pkcrypt->keys, pkcrypt->crc_32_tab, buf_ptr[i]); - - pkcrypt->total_in += read; - return read; -} - -int32_t mz_stream_pkcrypt_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - const uint8_t *buf_ptr = (const uint8_t *)buf; - int32_t written = 0; - int32_t i = 0; - uint16_t t = 0; - - if (size > (int32_t)sizeof(pkcrypt->buffer)) - return MZ_STREAM_ERROR; - - for (i = 0; i < size; i++) - pkcrypt->buffer[i] = (uint8_t)zencode(pkcrypt->keys, pkcrypt->crc_32_tab, buf_ptr[i], t); - - written = mz_stream_write(pkcrypt->stream.base, pkcrypt->buffer, size); - - if (written > 0) - pkcrypt->total_out += written; - - return written; -} - -int64_t mz_stream_pkcrypt_tell(void *stream) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - return mz_stream_tell(pkcrypt->stream.base); -} - -int32_t mz_stream_pkcrypt_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - return mz_stream_seek(pkcrypt->stream.base, offset, origin); -} - -int32_t mz_stream_pkcrypt_close(void *stream) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - pkcrypt->initialized = 0; - return MZ_OK; -} - -int32_t mz_stream_pkcrypt_error(void *stream) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - return pkcrypt->error; -} - -void mz_stream_pkcrypt_set_password(void *stream, const char *password) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - pkcrypt->password = password; -} - -void mz_stream_pkcrypt_set_verify(void *stream, uint8_t verify1, uint8_t verify2) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - pkcrypt->verify1 = verify1; - pkcrypt->verify2 = verify2; -} - -void mz_stream_pkcrypt_get_verify(void *stream, uint8_t *verify1, uint8_t *verify2) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - *verify1 = pkcrypt->verify1; - *verify2 = pkcrypt->verify2; -} - -int32_t mz_stream_pkcrypt_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_pkcrypt *pkcrypt = (mz_stream_pkcrypt *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN: - *value = pkcrypt->total_in; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT: - *value = pkcrypt->total_out; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -void *mz_stream_pkcrypt_create(void **stream) -{ - mz_stream_pkcrypt *pkcrypt = NULL; - - pkcrypt = (mz_stream_pkcrypt *)MZ_ALLOC(sizeof(mz_stream_pkcrypt)); - if (pkcrypt != NULL) - { - memset(pkcrypt, 0, sizeof(mz_stream_pkcrypt)); - pkcrypt->stream.vtbl = &mz_stream_pkcrypt_vtbl; - } - - if (stream != NULL) - *stream = pkcrypt; - return pkcrypt; -} - -void mz_stream_pkcrypt_delete(void **stream) -{ - mz_stream_pkcrypt *pkcrypt = NULL; - if (stream == NULL) - return; - pkcrypt = (mz_stream_pkcrypt *)*stream; - if (pkcrypt != NULL) - MZ_FREE(pkcrypt); - *stream = NULL; -} - -void *mz_stream_pkcrypt_get_interface(void) -{ - return (void *)&mz_stream_pkcrypt_vtbl; -} diff --git a/game/client/third/minizip/mz_strm_pkcrypt.h b/game/client/third/minizip/mz_strm_pkcrypt.h deleted file mode 100755 index cff2d8fe..00000000 --- a/game/client/third/minizip/mz_strm_pkcrypt.h +++ /dev/null @@ -1,56 +0,0 @@ -/* mz_strm_pkcrypt.h -- Code for traditional PKWARE encryption - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 1998-2005 Gilles Vollant - Modifications for Info-ZIP crypting - http://www.winimage.com/zLibDll/minizip.html - Copyright (C) 2003 Terry Thorsen - - This code is a modified version of crypting code in Info-ZIP distribution - - Copyright (C) 1990-2000 Info-ZIP. All rights reserved. - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_PKCRYPT_H -#define MZ_STREAM_PKCRYPT_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_pkcrypt_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_pkcrypt_is_open(void *stream); -int32_t mz_stream_pkcrypt_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_pkcrypt_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_pkcrypt_tell(void *stream); -int32_t mz_stream_pkcrypt_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_pkcrypt_close(void *stream); -int32_t mz_stream_pkcrypt_error(void *stream); - -void mz_stream_pkcrypt_set_password(void *stream, const char *password); -void mz_stream_pkcrypt_set_verify(void *stream, uint8_t verify1, uint8_t verify2); -void mz_stream_pkcrypt_get_verify(void *stream, uint8_t *verify1, uint8_t *verify2); -int32_t mz_stream_pkcrypt_get_prop_int64(void *stream, int32_t prop, int64_t *value); - -void* mz_stream_pkcrypt_create(void **stream); -void mz_stream_pkcrypt_delete(void **stream); - -void* mz_stream_pkcrypt_get_interface(void); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_posix.c b/game/client/third/minizip/mz_strm_posix.c deleted file mode 100755 index 89991743..00000000 --- a/game/client/third/minizip/mz_strm_posix.c +++ /dev/null @@ -1,232 +0,0 @@ -/* mz_strm_posix.c -- Stream for filesystem access for posix/linux - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Modifications for Zip64 support - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#include -#include -#include -#include - -#include "mz.h" -#include "mz_strm.h" -#include "mz_strm_posix.h" - -/***************************************************************************/ - -#if defined(MZ_USE_FILE32API) -# define fopen64 fopen -# define ftello64 ftell -# define fseeko64 fseek -#else -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ - defined(__OpenBSD__) || defined(__APPLE__) || defined(__ANDROID__) -# define fopen64 fopen -# define ftello64 ftello -# define fseeko64 fseeko -# endif -# ifdef _MSC_VER -# define fopen64 fopen -# if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) -# define ftello64 _ftelli64 -# define fseeko64 _fseeki64 -# else /* old MSC */ -# define ftello64 ftell -# define fseeko64 fseek -# endif -# endif -#endif - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_posix_vtbl = { - mz_stream_posix_open, - mz_stream_posix_is_open, - mz_stream_posix_read, - mz_stream_posix_write, - mz_stream_posix_tell, - mz_stream_posix_seek, - mz_stream_posix_close, - mz_stream_posix_error, - mz_stream_posix_create, - mz_stream_posix_delete, - NULL, - NULL -}; - -/***************************************************************************/ - -typedef struct mz_stream_posix_s -{ - mz_stream stream; - int32_t error; - FILE *handle; -} mz_stream_posix; - -/***************************************************************************/ - -int32_t mz_stream_posix_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_posix *posix = (mz_stream_posix *)stream; - const char *mode_fopen = NULL; - - if (path == NULL) - return MZ_STREAM_ERROR; - - if ((mode & MZ_OPEN_MODE_READWRITE) == MZ_OPEN_MODE_READ) - mode_fopen = "rb"; - else if (mode & MZ_OPEN_MODE_APPEND) - mode_fopen = "r+b"; - else if (mode & MZ_OPEN_MODE_CREATE) - mode_fopen = "wb"; - else - return MZ_STREAM_ERROR; - - posix->handle = fopen64(path, mode_fopen); - if (posix->handle == NULL) - { - posix->error = errno; - return MZ_STREAM_ERROR; - } - - return MZ_OK; -} - -int32_t mz_stream_posix_is_open(void *stream) -{ - mz_stream_posix *posix = (mz_stream_posix*)stream; - if (posix->handle == NULL) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_posix_read(void *stream, void *buf, int32_t size) -{ - mz_stream_posix *posix = (mz_stream_posix*)stream; - int32_t read = (int32_t)fread(buf, 1, (size_t)size, posix->handle); - if (read < size && ferror(posix->handle)) - { - posix->error = errno; - return MZ_STREAM_ERROR; - } - return read; -} - -int32_t mz_stream_posix_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_posix *posix = (mz_stream_posix*)stream; - int32_t written = (int32_t)fwrite(buf, 1, (size_t)size, posix->handle); - if (written < size && ferror(posix->handle)) - { - posix->error = errno; - return MZ_STREAM_ERROR; - } - return written; -} - -int64_t mz_stream_posix_tell(void *stream) -{ - mz_stream_posix *posix = (mz_stream_posix*)stream; - int64_t position = ftello64(posix->handle); - if (position == -1) - { - posix->error = errno; - return MZ_STREAM_ERROR; - } - return position; -} - -int32_t mz_stream_posix_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_posix *posix = (mz_stream_posix*)stream; - int32_t fseek_origin = 0; - - switch (origin) - { - case MZ_SEEK_CUR: - fseek_origin = SEEK_CUR; - break; - case MZ_SEEK_END: - fseek_origin = SEEK_END; - break; - case MZ_SEEK_SET: - fseek_origin = SEEK_SET; - break; - default: - return MZ_STREAM_ERROR; - } - - if (fseeko64(posix->handle, offset, fseek_origin) != 0) - { - posix->error = errno; - return MZ_STREAM_ERROR; - } - - return MZ_OK; -} - -int32_t mz_stream_posix_close(void *stream) -{ - mz_stream_posix *posix = (mz_stream_posix*)stream; - int32_t closed = 0; - if (posix->handle != NULL) - { - closed = fclose(posix->handle); - posix->handle = NULL; - } - if (closed != 0) - { - posix->error = errno; - return MZ_STREAM_ERROR; - } - return MZ_OK; -} - -int32_t mz_stream_posix_error(void *stream) -{ - mz_stream_posix *posix = (mz_stream_posix*)stream; - return posix->error; -} - -void *mz_stream_posix_create(void **stream) -{ - mz_stream_posix *posix = NULL; - - posix = (mz_stream_posix *)MZ_ALLOC(sizeof(mz_stream_posix)); - if (posix != NULL) - { - memset(posix, 0, sizeof(mz_stream_posix)); - posix->stream.vtbl = &mz_stream_posix_vtbl; - } - if (stream != NULL) - *stream = posix; - - return posix; -} - -void mz_stream_posix_delete(void **stream) -{ - mz_stream_posix *posix = NULL; - if (stream == NULL) - return; - posix = (mz_stream_posix *)*stream; - if (posix != NULL) - MZ_FREE(posix); - *stream = NULL; -} - -void *mz_stream_posix_get_interface(void) -{ - return (void *)&mz_stream_posix_vtbl; -} diff --git a/game/client/third/minizip/mz_strm_posix.h b/game/client/third/minizip/mz_strm_posix.h deleted file mode 100755 index f64c573d..00000000 --- a/game/client/third/minizip/mz_strm_posix.h +++ /dev/null @@ -1,67 +0,0 @@ -/* mz_strm_posix.h -- Stream for filesystem access for posix/linux - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2009-2010 Mathias Svensson - Modifications for Zip64 support - http://result42.com - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_POSIX_H -#define MZ_STREAM_POSIX_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_posix_open(void *stream, const char *path, int32_t mode); -int32_t mz_stream_posix_is_open(void *stream); -int32_t mz_stream_posix_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_posix_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_posix_tell(void *stream); -int32_t mz_stream_posix_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_posix_close(void *stream); -int32_t mz_stream_posix_error(void *stream); - -void* mz_stream_posix_create(void **stream); -void mz_stream_posix_delete(void **stream); - -void* mz_stream_posix_get_interface(void); - -/***************************************************************************/ - -#if !defined(_WIN32) && !defined(MZ_USE_WIN32_API) -#define mz_stream_os_open mz_stream_posix_open -#define mz_stream_os_is_open mz_stream_posix_is_open -#define mz_stream_os_read mz_stream_posix_read -#define mz_stream_os_write mz_stream_posix_write -#define mz_stream_os_tell mz_stream_posix_tell -#define mz_stream_os_seek mz_stream_posix_seek -#define mz_stream_os_close mz_stream_posix_close -#define mz_stream_os_error mz_stream_posix_error - -#define mz_stream_os_create mz_stream_posix_create -#define mz_stream_os_delete mz_stream_posix_delete - -#define mz_stream_os_get_interface \ - mz_stream_posix_get_interface -#endif - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_split.c b/game/client/third/minizip/mz_strm_split.c deleted file mode 100755 index 1274a681..00000000 --- a/game/client/third/minizip/mz_strm_split.c +++ /dev/null @@ -1,405 +0,0 @@ -/* mz_strm_split.c -- Stream for split files - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - - -#include -#include -#undef strncpy -#include - -#include "mz.h" -#include "mz_os.h" -#include "mz_strm.h" -#include "mz_strm_split.h" - -/***************************************************************************/ - -#define MZ_ZIP_MAGIC_DISKHEADER (0x08074b50) - -#if defined(_MSC_VER) && _MSC_VER < 1900 -# define snprintf _snprintf -#endif - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_split_vtbl = { - mz_stream_split_open, - mz_stream_split_is_open, - mz_stream_split_read, - mz_stream_split_write, - mz_stream_split_tell, - mz_stream_split_seek, - mz_stream_split_close, - mz_stream_split_error, - mz_stream_split_create, - mz_stream_split_delete, - mz_stream_split_get_prop_int64, - mz_stream_split_set_prop_int64 -}; - -/***************************************************************************/ - -typedef struct mz_stream_split_s { - mz_stream stream; - int32_t is_open; - int64_t disk_size; - int64_t total_in; - int64_t total_in_disk; - int64_t total_out; - int64_t total_out_disk; - int32_t mode; - char *path_cd; - int32_t path_cd_size; - char *path_disk; - int32_t path_disk_size; - int32_t number_disk; - int32_t current_disk; - int32_t reached_end; -} mz_stream_split; - -/***************************************************************************/ - -static int32_t mz_stream_split_open_disk(void *stream, int32_t number_disk) -{ - mz_stream_split *split = (mz_stream_split *)stream; - uint32_t magic = 0; - int32_t i = 0; - int32_t err = MZ_OK; - int16_t disk_part = 0; - - - // Check if we are reading or writing a disk part or the cd disk - if (number_disk >= 0) - { - if ((split->mode & MZ_OPEN_MODE_WRITE) == 0) - disk_part = MZ_OPEN_MODE_READ; - else if (split->disk_size > 0) - disk_part = MZ_OPEN_MODE_WRITE; - } - - // Construct disk path - if (disk_part > 0) - { - for (i = (int32_t)strlen(split->path_disk) - 1; i >= 0; i -= 1) - { - if (split->path_disk[i] != '.') - continue; - snprintf(&split->path_disk[i], split->path_disk_size - i, ".z%02d", number_disk + 1); - break; - } - } - else - { - strncpy(split->path_disk, split->path_cd, split->path_disk_size); - } - - // If disk part doesn't exist during reading then return MZ_EXIST_ERROR - if (disk_part == MZ_OPEN_MODE_READ) - err = mz_os_file_exists(split->path_disk); - - if (err == MZ_OK) - err = mz_stream_open(split->stream.base, split->path_disk, split->mode); - - if (err == MZ_OK) - { - split->total_in_disk = 0; - split->total_out_disk = 0; - split->current_disk = number_disk; - - if (split->mode & MZ_OPEN_MODE_WRITE) - { - if ((split->current_disk == 0) && (split->disk_size > 0)) - { - err = mz_stream_write_uint32(split->stream.base, MZ_ZIP_MAGIC_DISKHEADER); - split->total_out_disk += 4; - split->total_out += split->total_out_disk; - } - } - else if (split->mode & MZ_OPEN_MODE_READ) - { - if (split->current_disk == 0) - { - err = mz_stream_read_uint32(split->stream.base, &magic); - if (magic != MZ_ZIP_MAGIC_DISKHEADER) - err = MZ_FORMAT_ERROR; - } - } - } - - if (err == MZ_OK) - split->is_open = 1; - - return err; -} - -static int32_t mz_stream_split_close_disk(void *stream) -{ - mz_stream_split *split = (mz_stream_split *)stream; - - if (mz_stream_is_open(split->stream.base) != MZ_OK) - return MZ_OK; - - return mz_stream_close(split->stream.base); -} - -static int32_t mz_stream_split_goto_disk(void *stream, int32_t number_disk) -{ - mz_stream_split *split = (mz_stream_split *)stream; - int32_t err = MZ_OK; - - if ((split->disk_size == 0) && (split->mode & MZ_OPEN_MODE_WRITE)) - { - if (mz_stream_is_open(split->stream.base) != MZ_OK) - err = mz_stream_split_open_disk(stream, number_disk); - } - else if (number_disk != split->current_disk) - { - err = mz_stream_split_close_disk(stream); - if (err == MZ_OK) - { - err = mz_stream_split_open_disk(stream, number_disk); - if (err == MZ_OK) - split->number_disk = number_disk; - } - } - - return err; -} - -int32_t mz_stream_split_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_split *split = (mz_stream_split *)stream; - int32_t number_disk = 0; - - split->mode = mode; - - split->path_cd_size = (int32_t)strlen(path) + 1; - split->path_cd = (char *)MZ_ALLOC(split->path_cd_size); - strncpy(split->path_cd, path, split->path_cd_size); - - split->path_disk_size = (int32_t)strlen(path) + 10; - split->path_disk = (char *)MZ_ALLOC(split->path_disk_size); - strncpy(split->path_disk, path, split->path_disk_size); - - if (mode & MZ_OPEN_MODE_WRITE) - { - number_disk = 0; - split->current_disk = -1; - } - else if (mode & MZ_OPEN_MODE_READ) - { - number_disk = -1; - split->current_disk = 0; - } - - return mz_stream_split_goto_disk(stream, number_disk); -} - -int32_t mz_stream_split_is_open(void *stream) -{ - mz_stream_split *split = (mz_stream_split *)stream; - if (split->is_open == 1) - return MZ_OK; - return MZ_STREAM_ERROR; -} - -int32_t mz_stream_split_read(void *stream, void *buf, int32_t size) -{ - mz_stream_split *split = (mz_stream_split *)stream; - int32_t bytes_left = size; - int32_t read = 0; - int32_t err = MZ_OK; - uint8_t *buf_ptr = (uint8_t *)buf; - - err = mz_stream_split_goto_disk(stream, split->number_disk); - if (err != MZ_OK) - return err; - - while (bytes_left > 0) - { - read = mz_stream_read(split->stream.base, buf_ptr, bytes_left); - if (read < 0) - return read; - if (read == 0) - { - if (split->current_disk < 0) // No more disks to goto - break; - err = mz_stream_split_goto_disk(stream, split->current_disk + 1); - if (err == MZ_EXIST_ERROR) - break; - if (err != MZ_OK) - return err; - } - - bytes_left -= read; - buf_ptr += read; - split->total_in += read; - split->total_in_disk += read; - } - return size - bytes_left; -} - -int32_t mz_stream_split_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_split *split = (mz_stream_split *)stream; - int32_t written = 0; - int32_t bytes_left = size; - int32_t bytes_to_write = 0; - int32_t bytes_avail = 0; - int32_t number_disk = -1; - int32_t err = MZ_OK; - const uint8_t *buf_ptr = (const uint8_t *)buf; - - while (bytes_left > 0) - { - bytes_to_write = bytes_left; - - if (split->disk_size > 0) - { - if ((split->total_out_disk == split->disk_size && split->total_out > 0) || - (split->number_disk == -1 && split->number_disk != split->current_disk)) - { - if (split->number_disk != -1) - number_disk = split->current_disk + 1; - - err = mz_stream_split_goto_disk(stream, number_disk); - if (err != MZ_OK) - return err; - } - - if (split->number_disk != -1) - { - bytes_avail = (int32_t)(split->disk_size - split->total_out_disk); - if (bytes_to_write > bytes_avail) - bytes_to_write = bytes_avail; - } - } - - written = mz_stream_write(split->stream.base, buf_ptr, bytes_to_write); - if (written != bytes_to_write) - return MZ_STREAM_ERROR; - - bytes_left -= written; - buf_ptr += written; - split->total_out += written; - split->total_out_disk += written; - } - - return size - bytes_left; -} - -int64_t mz_stream_split_tell(void *stream) -{ - mz_stream_split *split = (mz_stream_split *)stream; - int32_t err = MZ_OK; - err = mz_stream_split_goto_disk(stream, split->number_disk); - if (err != MZ_OK) - return err; - return mz_stream_tell(split->stream.base); -} - -int32_t mz_stream_split_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_split *split = (mz_stream_split *)stream; - int32_t err = MZ_OK; - err = mz_stream_split_goto_disk(stream, split->number_disk); - if (err != MZ_OK) - return err; - return mz_stream_seek(split->stream.base, offset, origin); -} - -int32_t mz_stream_split_close(void *stream) -{ - mz_stream_split *split = (mz_stream_split *)stream; - int32_t err = MZ_OK; - - err = mz_stream_split_close_disk(stream); - split->is_open = 0; - return err; -} - -int32_t mz_stream_split_error(void *stream) -{ - mz_stream_split *split = (mz_stream_split *)stream; - return mz_stream_error(split->stream.base); -} - -int32_t mz_stream_split_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_split *split = (mz_stream_split *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_OUT: - *value = split->total_out; - return MZ_OK; - case MZ_STREAM_PROP_DISK_NUMBER: - *value = split->number_disk; - return MZ_OK; - case MZ_STREAM_PROP_DISK_SIZE: - *value = split->disk_size; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -int32_t mz_stream_split_set_prop_int64(void *stream, int32_t prop, int64_t value) -{ - mz_stream_split *split = (mz_stream_split *)stream; - switch (prop) - { - case MZ_STREAM_PROP_DISK_NUMBER: - split->number_disk = (int32_t)value; - return MZ_OK; - case MZ_STREAM_PROP_DISK_SIZE: - split->disk_size = value; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -void *mz_stream_split_create(void **stream) -{ - mz_stream_split *split = NULL; - - split = (mz_stream_split *)MZ_ALLOC(sizeof(mz_stream_split)); - if (split != NULL) - { - memset(split, 0, sizeof(mz_stream_split)); - split->stream.vtbl = &mz_stream_split_vtbl; - } - if (stream != NULL) - *stream = split; - - return split; -} - -void mz_stream_split_delete(void **stream) -{ - mz_stream_split *split = NULL; - if (stream == NULL) - return; - split = (mz_stream_split *)*stream; - if (split != NULL) - { - if (split->path_cd) - MZ_FREE(split->path_cd); - if (split->path_disk) - MZ_FREE(split->path_disk); - - MZ_FREE(split); - } - *stream = NULL; -} - -void *mz_stream_split_get_interface(void) -{ - return (void *)&mz_stream_split_vtbl; -} diff --git a/game/client/third/minizip/mz_strm_split.h b/game/client/third/minizip/mz_strm_split.h deleted file mode 100755 index 03cca248..00000000 --- a/game/client/third/minizip/mz_strm_split.h +++ /dev/null @@ -1,46 +0,0 @@ -/* mz_strm_split.h -- Stream for split files - Version 2.3.3, June 10, 2018 - part of MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_SPLIT_H -#define MZ_STREAM_SPLIT_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_split_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_split_is_open(void *stream); -int32_t mz_stream_split_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_split_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_split_tell(void *stream); -int32_t mz_stream_split_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_split_close(void *stream); -int32_t mz_stream_split_error(void *stream); - -int32_t mz_stream_split_get_prop_int64(void *stream, int32_t prop, int64_t *value); -int32_t mz_stream_split_set_prop_int64(void *stream, int32_t prop, int64_t value); - -void* mz_stream_split_create(void **stream); -void mz_stream_split_delete(void **stream); - -void* mz_stream_split_get_interface(void); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_win32.c b/game/client/third/minizip/mz_strm_win32.c deleted file mode 100755 index 5cf867ed..00000000 --- a/game/client/third/minizip/mz_strm_win32.c +++ /dev/null @@ -1,292 +0,0 @@ -/* mz_strm_win32.c -- Stream for filesystem access for windows - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2009-2010 Mathias Svensson - Modifications for Zip64 support - http://result42.com - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#include - -#include - -#include "mz.h" -#include "mz_strm.h" -#include "mz_strm_win32.h" - -/***************************************************************************/ - -#ifndef INVALID_HANDLE_VALUE -# define INVALID_HANDLE_VALUE (0xFFFFFFFF) -#endif - -#ifndef INVALID_SET_FILE_POINTER -# define INVALID_SET_FILE_POINTER ((DWORD)-1) -#endif - -#if defined(WINAPI_FAMILY_ONE_PARTITION) && !defined(MZ_USE_WINRT_API) -# if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) -# define MZ_USE_WINRT_API 1 -# endif -#endif - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_win32_vtbl = { - mz_stream_win32_open, - mz_stream_win32_is_open, - mz_stream_win32_read, - mz_stream_win32_write, - mz_stream_win32_tell, - mz_stream_win32_seek, - mz_stream_win32_close, - mz_stream_win32_error, - mz_stream_win32_create, - mz_stream_win32_delete, - NULL, - NULL -}; - -/***************************************************************************/ - -typedef struct mz_stream_win32_s -{ - mz_stream stream; - HANDLE handle; - int32_t error; -} mz_stream_win32; - -/***************************************************************************/ - -int32_t mz_stream_win32_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - uint32_t desired_access = 0; - uint32_t creation_disposition = 0; - uint32_t share_mode = FILE_SHARE_READ; - uint32_t flags_attribs = FILE_ATTRIBUTE_NORMAL; - wchar_t *path_wide = NULL; - uint32_t path_wide_size = 0; - - - if (path == NULL) - return MZ_STREAM_ERROR; - - if ((mode & MZ_OPEN_MODE_READWRITE) == MZ_OPEN_MODE_READ) - { - desired_access = GENERIC_READ; - creation_disposition = OPEN_EXISTING; - } - else if (mode & MZ_OPEN_MODE_APPEND) - { - desired_access = GENERIC_WRITE | GENERIC_READ; - creation_disposition = OPEN_EXISTING; - } - else if (mode & MZ_OPEN_MODE_CREATE) - { - desired_access = GENERIC_WRITE | GENERIC_READ; - creation_disposition = CREATE_ALWAYS; - } - else - { - return MZ_STREAM_ERROR; - } - - path_wide_size = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); - path_wide = (wchar_t *)MZ_ALLOC((path_wide_size + 1) * sizeof(wchar_t)); - memset(path_wide, 0, sizeof(wchar_t) * (path_wide_size + 1)); - - MultiByteToWideChar(CP_UTF8, 0, path, -1, path_wide, path_wide_size); - -#ifdef MZ_USE_WINRT_API - win32->handle = CreateFile2W(path_wide, desired_access, share_mode, creation_disposition, NULL); -#else - win32->handle = CreateFileW(path_wide, desired_access, share_mode, NULL, creation_disposition, flags_attribs, NULL); -#endif - - MZ_FREE(path_wide); - - if (mz_stream_win32_is_open(stream) != MZ_OK) - { - win32->error = GetLastError(); - return MZ_STREAM_ERROR; - } - - if (mode & MZ_OPEN_MODE_APPEND) - return mz_stream_win32_seek(stream, 0, MZ_SEEK_END); - - return MZ_OK; -} - -int32_t mz_stream_win32_is_open(void *stream) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - if (win32->handle == NULL || win32->handle == INVALID_HANDLE_VALUE) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_win32_read(void *stream, void *buf, int32_t size) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - uint32_t read = 0; - - if (mz_stream_win32_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - - if (!ReadFile(win32->handle, buf, size, (DWORD *)&read, NULL)) - { - win32->error = GetLastError(); - if (win32->error == ERROR_HANDLE_EOF) - win32->error = 0; - } - - return read; -} - -int32_t mz_stream_win32_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - uint32_t written = 0; - - if (mz_stream_win32_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - - if (!WriteFile(win32->handle, buf, size, (DWORD *)&written, NULL)) - { - win32->error = GetLastError(); - if (win32->error == ERROR_HANDLE_EOF) - win32->error = 0; - } - - return written; -} - -static int32_t mz_stream_win32_seekinternal(HANDLE handle, LARGE_INTEGER large_pos, LARGE_INTEGER *new_pos, uint32_t move_method) -{ -#ifdef MZ_USE_WINRT_API - return SetFilePointerEx(handle, pos, newPos, dwMoveMethod); -#else - LONG high_part = large_pos.HighPart; - uint32_t pos = SetFilePointer(handle, large_pos.LowPart, &high_part, move_method); - - if ((pos == INVALID_SET_FILE_POINTER) && (GetLastError() != NO_ERROR)) - return MZ_STREAM_ERROR; - - if (new_pos != NULL) - { - new_pos->LowPart = pos; - new_pos->HighPart = high_part; - } - - return MZ_OK; -#endif -} - -int64_t mz_stream_win32_tell(void *stream) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - LARGE_INTEGER large_pos; - - if (mz_stream_win32_is_open(stream) != MZ_OK) - return MZ_STREAM_ERROR; - - large_pos.QuadPart = 0; - - if (mz_stream_win32_seekinternal(win32->handle, large_pos, &large_pos, FILE_CURRENT) != MZ_OK) - win32->error = GetLastError(); - - return large_pos.QuadPart; -} - -int32_t mz_stream_win32_seek(void *stream, int64_t offset, int32_t origin) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - uint32_t move_method = 0xFFFFFFFF; - LARGE_INTEGER large_pos; - - - if (mz_stream_win32_is_open(stream) == MZ_STREAM_ERROR) - return MZ_STREAM_ERROR; - - switch (origin) - { - case MZ_SEEK_CUR: - move_method = FILE_CURRENT; - break; - case MZ_SEEK_END: - move_method = FILE_END; - break; - case MZ_SEEK_SET: - move_method = FILE_BEGIN; - break; - default: - return MZ_STREAM_ERROR; - } - - large_pos.QuadPart = offset; - - if (mz_stream_win32_seekinternal(win32->handle, large_pos, NULL, move_method) != MZ_OK) - { - win32->error = GetLastError(); - return MZ_STREAM_ERROR; - } - - return MZ_OK; -} - -int mz_stream_win32_close(void *stream) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - - if (win32->handle != NULL) - CloseHandle(win32->handle); - win32->handle = NULL; - return MZ_OK; -} - -int mz_stream_win32_error(void *stream) -{ - mz_stream_win32 *win32 = (mz_stream_win32 *)stream; - return win32->error; -} - -void *mz_stream_win32_create(void **stream) -{ - mz_stream_win32 *win32 = NULL; - - win32 = (mz_stream_win32 *)MZ_ALLOC(sizeof(mz_stream_win32)); - if (win32 != NULL) - { - memset(win32, 0, sizeof(mz_stream_win32)); - win32->stream.vtbl = &mz_stream_win32_vtbl; - } - if (stream != NULL) - *stream = win32; - - return win32; -} - -void mz_stream_win32_delete(void **stream) -{ - mz_stream_win32 *win32 = NULL; - if (stream == NULL) - return; - win32 = (mz_stream_win32 *)*stream; - if (win32 != NULL) - MZ_FREE(win32); - *stream = NULL; -} - -void *mz_stream_win32_get_interface(void) -{ - return (void *)&mz_stream_win32_vtbl; -} diff --git a/game/client/third/minizip/mz_strm_win32.h b/game/client/third/minizip/mz_strm_win32.h deleted file mode 100755 index 5679c657..00000000 --- a/game/client/third/minizip/mz_strm_win32.h +++ /dev/null @@ -1,67 +0,0 @@ -/* mz_sstrm_win32.h -- Stream for filesystem access for windows - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2009-2010 Mathias Svensson - Modifications for Zip64 support - http://result42.com - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_WIN32_H -#define MZ_STREAM_WIN32_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_win32_open(void *stream, const char *path, int32_t mode); -int32_t mz_stream_win32_is_open(void *stream); -int32_t mz_stream_win32_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_win32_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_win32_tell(void *stream); -int32_t mz_stream_win32_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_win32_close(void *stream); -int32_t mz_stream_win32_error(void *stream); - -void* mz_stream_win32_create(void **stream); -void mz_stream_win32_delete(void **stream); - -void* mz_stream_win32_get_interface(void); - -/***************************************************************************/ - -#if defined(_WIN32) || defined(MZ_USE_WIN32_API) -#define mz_stream_os_open mz_stream_win32_open -#define mz_stream_os_is_open mz_stream_win32_is_open -#define mz_stream_os_read mz_stream_win32_read -#define mz_stream_os_write mz_stream_win32_write -#define mz_stream_os_tell mz_stream_win32_tell -#define mz_stream_os_seek mz_stream_win32_seek -#define mz_stream_os_close mz_stream_win32_close -#define mz_stream_os_error mz_stream_win32_error - -#define mz_stream_os_create mz_stream_win32_create -#define mz_stream_os_delete mz_stream_win32_delete - -#define mz_stream_os_get_interface \ - mz_stream_win32_get_interface -#endif - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_strm_zlib.c b/game/client/third/minizip/mz_strm_zlib.c deleted file mode 100755 index db092980..00000000 --- a/game/client/third/minizip/mz_strm_zlib.c +++ /dev/null @@ -1,395 +0,0 @@ -/* mz_strm_zlib.c -- Stream for zlib inflate/deflate - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - - -#include -#include -#include -#include - -#include "zlib.h" - -#include "mz.h" -#include "mz_strm.h" -#include "mz_strm_zlib.h" - - -/***************************************************************************/ - -#ifndef DEF_MEM_LEVEL -# if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -# else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -# endif -#endif - -/***************************************************************************/ - -static mz_stream_vtbl mz_stream_zlib_vtbl = { - mz_stream_zlib_open, - mz_stream_zlib_is_open, - mz_stream_zlib_read, - mz_stream_zlib_write, - mz_stream_zlib_tell, - mz_stream_zlib_seek, - mz_stream_zlib_close, - mz_stream_zlib_error, - mz_stream_zlib_create, - mz_stream_zlib_delete, - mz_stream_zlib_get_prop_int64, - mz_stream_zlib_set_prop_int64 -}; - -/***************************************************************************/ - -typedef struct mz_stream_zlib_s { - mz_stream stream; - z_stream zstream; - uint8_t buffer[INT16_MAX]; - int32_t buffer_len; - int64_t total_in; - int64_t total_out; - int64_t max_total_in; - int8_t initialized; - int16_t level; - int32_t mode; - int32_t error; -} mz_stream_zlib; - -/***************************************************************************/ - -int32_t mz_stream_zlib_open(void *stream, const char *path, int32_t mode) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - - MZ_UNUSED(path); - - zlib->zstream.data_type = Z_BINARY; - zlib->zstream.zalloc = Z_NULL; - zlib->zstream.zfree = Z_NULL; - zlib->zstream.opaque = Z_NULL; - zlib->zstream.total_in = 0; - zlib->zstream.total_out = 0; - - zlib->total_in = 0; - zlib->total_out = 0; - - if (mode & MZ_OPEN_MODE_WRITE) - { - zlib->zstream.next_out = zlib->buffer; - zlib->zstream.avail_out = sizeof(zlib->buffer); - - zlib->error = deflateInit2(&zlib->zstream, (int8_t)zlib->level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); - } - else if (mode & MZ_OPEN_MODE_READ) - { - zlib->zstream.next_in = zlib->buffer; - zlib->zstream.avail_in = 0; - - zlib->error = inflateInit2(&zlib->zstream, -MAX_WBITS); - } - - if (zlib->error != Z_OK) - return MZ_STREAM_ERROR; - - zlib->initialized = 1; - zlib->mode = mode; - return MZ_OK; -} - -int32_t mz_stream_zlib_is_open(void *stream) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - if (zlib->initialized != 1) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_zlib_read(void *stream, void *buf, int32_t size) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - uint64_t total_in_before = 0; - uint64_t total_in_after = 0; - uint64_t total_out_before = 0; - uint64_t total_out_after = 0; - uint32_t total_in = 0; - uint32_t total_out = 0; - uint32_t in_bytes = 0; - uint32_t out_bytes = 0; - int32_t bytes_to_read = 0; - int32_t read = 0; - int32_t err = Z_OK; - - - zlib->zstream.next_out = (Bytef*)buf; - zlib->zstream.avail_out = (uInt)size; - - do - { - if (zlib->zstream.avail_in == 0) - { - bytes_to_read = sizeof(zlib->buffer); - if (zlib->max_total_in > 0) - { - if ((zlib->max_total_in - zlib->total_in) < (int64_t)sizeof(zlib->buffer)) - bytes_to_read = (int32_t)(zlib->max_total_in - zlib->total_in); - } - - read = mz_stream_read(zlib->stream.base, zlib->buffer, bytes_to_read); - - if (read < 0) - { - zlib->error = Z_STREAM_ERROR; - break; - } - if (read == 0) - break; - - zlib->zstream.next_in = zlib->buffer; - zlib->zstream.avail_in = read; - } - - total_in_before = zlib->zstream.avail_in; - total_out_before = zlib->zstream.total_out; - - err = inflate(&zlib->zstream, Z_SYNC_FLUSH); - if ((err >= Z_OK) && (zlib->zstream.msg != NULL)) - { - zlib->error = Z_DATA_ERROR; - break; - } - - total_in_after = zlib->zstream.avail_in; - total_out_after = zlib->zstream.total_out; - - in_bytes = (uint32_t)(total_in_before - total_in_after); - out_bytes = (uint32_t)(total_out_after - total_out_before); - - total_in += in_bytes; - total_out += out_bytes; - - zlib->total_in += in_bytes; - zlib->total_out += out_bytes; - - if (err == Z_STREAM_END) - break; - - if (err != Z_OK) - { - zlib->error = err; - break; - } - } - while (zlib->zstream.avail_out > 0); - - if (zlib->error != 0) - return zlib->error; - - return total_out; -} - -static int32_t mz_stream_zlib_flush(void *stream) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - if (mz_stream_write(zlib->stream.base, zlib->buffer, zlib->buffer_len) != zlib->buffer_len) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -static int32_t mz_stream_zlib_deflate(void *stream, int flush) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - uint64_t total_out_before = 0; - uint64_t total_out_after = 0; - int32_t out_bytes = 0; - int32_t err = Z_OK; - - - do - { - if (zlib->zstream.avail_out == 0) - { - if (mz_stream_zlib_flush(zlib) != MZ_OK) - { - zlib->error = Z_STREAM_ERROR; - return MZ_STREAM_ERROR; - } - - zlib->zstream.avail_out = sizeof(zlib->buffer); - zlib->zstream.next_out = zlib->buffer; - - zlib->buffer_len = 0; - } - - total_out_before = zlib->zstream.total_out; - err = deflate(&zlib->zstream, flush); - total_out_after = zlib->zstream.total_out; - - out_bytes = (uint32_t)(total_out_after - total_out_before); - - zlib->buffer_len += out_bytes; - zlib->total_out += out_bytes; - - if (err == Z_STREAM_END) - break; - if (err != Z_OK) - { - zlib->error = err; - return MZ_STREAM_ERROR; - } - } - while ((zlib->zstream.avail_in > 0) || (flush == Z_FINISH && err == Z_OK)); - - return MZ_OK; -} - -int32_t mz_stream_zlib_write(void *stream, const void *buf, int32_t size) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - - - zlib->zstream.next_in = (Bytef*)(intptr_t)buf; - zlib->zstream.avail_in = (uInt)size; - - mz_stream_zlib_deflate(stream, Z_NO_FLUSH); - - zlib->total_in += size; - - return size; -} - -int64_t mz_stream_zlib_tell(void *stream) -{ - MZ_UNUSED(stream); - - return MZ_STREAM_ERROR; -} - -int32_t mz_stream_zlib_seek(void *stream, int64_t offset, int32_t origin) -{ - MZ_UNUSED(stream); - MZ_UNUSED(offset); - MZ_UNUSED(origin); - - return MZ_STREAM_ERROR; -} - -int32_t mz_stream_zlib_close(void *stream) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - - - if (zlib->mode & MZ_OPEN_MODE_WRITE) - { - mz_stream_zlib_deflate(stream, Z_FINISH); - mz_stream_zlib_flush(stream); - - deflateEnd(&zlib->zstream); - } - else if (zlib->mode & MZ_OPEN_MODE_READ) - { - inflateEnd(&zlib->zstream); - } - - zlib->initialized = 0; - - if (zlib->error != Z_OK) - return MZ_STREAM_ERROR; - return MZ_OK; -} - -int32_t mz_stream_zlib_error(void *stream) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - return zlib->error; -} - -int32_t mz_stream_zlib_get_prop_int64(void *stream, int32_t prop, int64_t *value) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - switch (prop) - { - case MZ_STREAM_PROP_TOTAL_IN: - *value = zlib->total_in; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_OUT: - *value = zlib->total_out; - return MZ_OK; - case MZ_STREAM_PROP_HEADER_SIZE: - *value = 0; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -int32_t mz_stream_zlib_set_prop_int64(void *stream, int32_t prop, int64_t value) -{ - mz_stream_zlib *zlib = (mz_stream_zlib *)stream; - switch (prop) - { - case MZ_STREAM_PROP_COMPRESS_LEVEL: - zlib->level = (int16_t)value; - return MZ_OK; - case MZ_STREAM_PROP_TOTAL_IN_MAX: - zlib->max_total_in = value; - return MZ_OK; - } - return MZ_EXIST_ERROR; -} - -void *mz_stream_zlib_create(void **stream) -{ - mz_stream_zlib *zlib = NULL; - - zlib = (mz_stream_zlib *)MZ_ALLOC(sizeof(mz_stream_zlib)); - if (zlib != NULL) - { - memset(zlib, 0, sizeof(mz_stream_zlib)); - zlib->stream.vtbl = &mz_stream_zlib_vtbl; - zlib->level = Z_DEFAULT_COMPRESSION; - } - if (stream != NULL) - *stream = zlib; - - return zlib; -} - -void mz_stream_zlib_delete(void **stream) -{ - mz_stream_zlib *zlib = NULL; - if (stream == NULL) - return; - zlib = (mz_stream_zlib *)*stream; - if (zlib != NULL) - MZ_FREE(zlib); - *stream = NULL; -} - -void *mz_stream_zlib_get_interface(void) -{ - return (void *)&mz_stream_zlib_vtbl; -} - -static int64_t mz_stream_zlib_crc32(int64_t value, const void *buf, int32_t size) -{ - return crc32(/*(z_crc_t)*/value, buf, size); -} - -void *mz_stream_zlib_get_crc32_table(void) -{ - return (void *)get_crc_table(); -} - -void *mz_stream_zlib_get_crc32_update(void) -{ - return (void *)mz_stream_zlib_crc32; -} diff --git a/game/client/third/minizip/mz_strm_zlib.h b/game/client/third/minizip/mz_strm_zlib.h deleted file mode 100755 index 949fa0b0..00000000 --- a/game/client/third/minizip/mz_strm_zlib.h +++ /dev/null @@ -1,48 +0,0 @@ -/* mz_strm_zlib.h -- Stream for zlib inflate/deflate - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_STREAM_ZLIB_H -#define MZ_STREAM_ZLIB_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -int32_t mz_stream_zlib_open(void *stream, const char *filename, int32_t mode); -int32_t mz_stream_zlib_is_open(void *stream); -int32_t mz_stream_zlib_read(void *stream, void *buf, int32_t size); -int32_t mz_stream_zlib_write(void *stream, const void *buf, int32_t size); -int64_t mz_stream_zlib_tell(void *stream); -int32_t mz_stream_zlib_seek(void *stream, int64_t offset, int32_t origin); -int32_t mz_stream_zlib_close(void *stream); -int32_t mz_stream_zlib_error(void *stream); - -int32_t mz_stream_zlib_get_prop_int64(void *stream, int32_t prop, int64_t *value); -int32_t mz_stream_zlib_set_prop_int64(void *stream, int32_t prop, int64_t value); - -void* mz_stream_zlib_create(void **stream); -void mz_stream_zlib_delete(void **stream); - -void* mz_stream_zlib_get_interface(void); -void* mz_stream_zlib_get_crc32_table(void); -void* mz_stream_zlib_get_crc32_update(void); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/game/client/third/minizip/mz_zip.c b/game/client/third/minizip/mz_zip.c deleted file mode 100755 index 98b554b3..00000000 --- a/game/client/third/minizip/mz_zip.c +++ /dev/null @@ -1,1714 +0,0 @@ -/* zip.c -- Zip manipulation - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2009-2010 Mathias Svensson - Modifications for Zip64 support - http://result42.com - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#undef strncpy -#include -#include -#include -#include -#include -#include -#include - -#include "mz.h" -#include "mz_strm.h" -#ifdef HAVE_AES -# include "mz_strm_aes.h" -#endif -#ifdef HAVE_BZIP2 -# include "mz_strm_bzip.h" -#endif -#ifdef HAVE_LZMA -# include "mz_strm_lzma.h" -#endif -#ifdef HAVE_PKCRYPT -# include "mz_strm_pkcrypt.h" -#endif -#ifdef HAVE_ZLIB -# include "mz_strm_zlib.h" -#endif -#include "mz_strm_mem.h" - -#include "mz_zip.h" - -/***************************************************************************/ - -#define MZ_ZIP_MAGIC_LOCALHEADER (0x04034b50) -#define MZ_ZIP_MAGIC_CENTRALHEADER (0x02014b50) -#define MZ_ZIP_MAGIC_ENDHEADER (0x06054b50) -#define MZ_ZIP_MAGIC_ENDHEADER64 (0x06064b50) -#define MZ_ZIP_MAGIC_ENDLOCHEADER64 (0x07064b50) -#define MZ_ZIP_MAGIC_DATADESCRIPTOR (0x08074b50) - -#define MZ_ZIP_SIZE_CD_ITEM (0x2e) -#define MZ_ZIP_SIZE_CD_LOCATOR64 (0x14) - -#define MZ_ZIP_EXTENSION_ZIP64 (0x0001) -#define MZ_ZIP_EXTENSION_NTFS (0x000a) -#define MZ_ZIP_EXTENSION_AES (0x9901) - -/***************************************************************************/ - -typedef struct mz_zip_s -{ - mz_zip_file file_info; - mz_zip_file local_file_info; - - void *stream; // main stream - void *cd_stream; // pointer to the stream with the cd - void *cd_mem_stream; // memory stream for central directory - void *compress_stream; // compression stream - void *crc32_stream; // crc32 stream - void *crypt_stream; // encryption stream - void *file_info_stream; // memory stream for storing file info - void *local_file_info_stream; // memory stream for storing local file info - - int32_t open_mode; - - uint32_t disk_number_with_cd; // number of the disk with the central dir - - uint64_t cd_start_pos; // pos of the first file in the central dir stream - uint64_t cd_current_pos; // pos of the current file in the central dir - uint64_t cd_offset; // offset of start of central directory - uint64_t cd_size; // size of the central directory - - uint16_t entry_scanned; - uint16_t entry_opened; // 1 if a file in the zip is currently writ. - uint64_t entry_read; - - int64_t number_entry; - - int16_t compression_method; - - uint16_t version_madeby; - char *comment; -} mz_zip; - -/***************************************************************************/ - -// Locate the central directory of a zip file (at the end, just before the global comment) -static int32_t mz_zip_search_eocd(void *stream, uint64_t *central_pos) -{ - uint8_t buf[1024 + 4]; - int64_t file_size = 0; - int64_t back_read = 0; - int64_t max_back = UINT16_MAX; // maximum size of global comment - int32_t read_size = sizeof(buf); - int64_t read_pos = 0; - int32_t i = 0; - - *central_pos = 0; - - if (mz_stream_seek(stream, 0, MZ_SEEK_END) != MZ_OK) - return MZ_STREAM_ERROR; - - file_size = mz_stream_tell(stream); - - if (max_back > file_size) - max_back = file_size; - - while (back_read < max_back) - { - back_read += (sizeof(buf) - 4); - if (back_read > max_back) - back_read = max_back; - - read_pos = file_size - back_read; - if (read_size > (file_size - read_pos)) - read_size = (uint32_t)(file_size - read_pos); - - if (mz_stream_seek(stream, read_pos, MZ_SEEK_SET) != MZ_OK) - break; - if (mz_stream_read(stream, buf, read_size) != read_size) - break; - - for (i = read_size - 3; (i--) > 0;) - { - if (((*(buf + i)) == (MZ_ZIP_MAGIC_ENDHEADER & 0xff)) && - ((*(buf + i + 1)) == (MZ_ZIP_MAGIC_ENDHEADER >> 8 & 0xff)) && - ((*(buf + i + 2)) == (MZ_ZIP_MAGIC_ENDHEADER >> 16 & 0xff)) && - ((*(buf + i + 3)) == (MZ_ZIP_MAGIC_ENDHEADER >> 24 & 0xff))) - { - *central_pos = read_pos + i; - return MZ_OK; - } - } - - if (*central_pos != 0) - break; - } - - return MZ_EXIST_ERROR; -} - -// Locate the central directory 64 of a zip file (at the end, just before the global comment) -static int32_t mz_zip_search_zip64_eocd(void *stream, const uint64_t end_central_offset, uint64_t *central_pos) -{ - uint64_t offset = 0; - uint32_t value32 = 0; - int32_t err = MZ_OK; - - - *central_pos = 0; - - // Zip64 end of central directory locator - err = mz_stream_seek(stream, end_central_offset - MZ_ZIP_SIZE_CD_LOCATOR64, MZ_SEEK_SET); - // Read locator signature - if (err == MZ_OK) - { - err = mz_stream_read_uint32(stream, &value32); - if (value32 != MZ_ZIP_MAGIC_ENDLOCHEADER64) - err = MZ_FORMAT_ERROR; - } - // Number of the disk with the start of the zip64 end of central directory - if (err == MZ_OK) - err = mz_stream_read_uint32(stream, &value32); - // Relative offset of the zip64 end of central directory record8 - if (err == MZ_OK) - err = mz_stream_read_uint64(stream, &offset); - // Total number of disks - if (err == MZ_OK) - err = mz_stream_read_uint32(stream, &value32); - // Goto end of central directory record - if (err == MZ_OK) - err = mz_stream_seek(stream, offset, MZ_SEEK_SET); - // The signature - if (err == MZ_OK) - { - err = mz_stream_read_uint32(stream, &value32); - if (value32 != MZ_ZIP_MAGIC_ENDHEADER64) - err = MZ_FORMAT_ERROR; - } - - if (err == MZ_OK) - *central_pos = offset; - - return err; -} - -static int32_t mz_zip_read_cd(void *handle) -{ - mz_zip *zip = (mz_zip *)handle; - int64_t number_entry_cd = 0; - uint64_t number_entry_cd64 = 0; - uint64_t number_entry = 0; - uint64_t eocd_pos = 0; - uint64_t eocd_pos64 = 0; - uint16_t value16 = 0; - uint32_t value32 = 0; - uint64_t value64 = 0; - uint16_t comment_size = 0; - int32_t err = MZ_OK; - - - if (zip == NULL) - return MZ_PARAM_ERROR; - - // Read and cache central directory records - if (mz_zip_search_eocd(zip->stream, &eocd_pos) == MZ_OK) - { - // Read end of central directory info - err = mz_stream_seek(zip->stream, eocd_pos, MZ_SEEK_SET); - // The signature, already checked - if (err == MZ_OK) - err = mz_stream_read_uint32(zip->stream, &value32); - // Number of this disk - if (err == MZ_OK) - err = mz_stream_read_uint16(zip->stream, &value16); - // Number of the disk with the start of the central directory - if (err == MZ_OK) - err = mz_stream_read_uint16(zip->stream, &value16); - zip->disk_number_with_cd = value16; - // Total number of entries in the central dir on this disk - if (err == MZ_OK) - err = mz_stream_read_uint16(zip->stream, &value16); - zip->number_entry = value16; - // Total number of entries in the central dir - if (err == MZ_OK) - err = mz_stream_read_uint16(zip->stream, &value16); - number_entry_cd = value16; - if (number_entry_cd != zip->number_entry) - err = MZ_FORMAT_ERROR; - // Size of the central directory - if (err == MZ_OK) - err = mz_stream_read_uint32(zip->stream, &value32); - if (err == MZ_OK) - zip->cd_size = value32; - // Offset of start of central directory with respect to the starting disk number - if (err == MZ_OK) - err = mz_stream_read_uint32(zip->stream, &value32); - zip->cd_offset = value32; - // Zip file global comment length - if (err == MZ_OK) - err = mz_stream_read_uint16(zip->stream, &comment_size); - - if ((err == MZ_OK) && ((number_entry_cd == UINT16_MAX) || (zip->cd_offset == UINT32_MAX))) - { - // Format should be Zip64, as the central directory or file size is too large - if (mz_zip_search_zip64_eocd(zip->stream, eocd_pos, &eocd_pos64) == MZ_OK) - { - eocd_pos = eocd_pos64; - - err = mz_stream_seek(zip->stream, eocd_pos, MZ_SEEK_SET); - // The signature, already checked - if (err == MZ_OK) - err = mz_stream_read_uint32(zip->stream, &value32); - // Size of zip64 end of central directory record - if (err == MZ_OK) - err = mz_stream_read_uint64(zip->stream, &value64); - // Version made by - if (err == MZ_OK) - err = mz_stream_read_uint16(zip->stream, &zip->version_madeby); - // Version needed to extract - if (err == MZ_OK) - err = mz_stream_read_uint16(zip->stream, &value16); - // Number of this disk - if (err == MZ_OK) - err = mz_stream_read_uint32(zip->stream, &value32); - // Number of the disk with the start of the central directory - if (err == MZ_OK) - err = mz_stream_read_uint32(zip->stream, &zip->disk_number_with_cd); - // Total number of entries in the central directory on this disk - if (err == MZ_OK) - err = mz_stream_read_uint64(zip->stream, &number_entry); - // Total number of entries in the central directory - if (err == MZ_OK) - err = mz_stream_read_uint64(zip->stream, &number_entry_cd64); - if (number_entry == UINT32_MAX) - zip->number_entry = number_entry_cd64; - // Size of the central directory - if (err == MZ_OK) - err = mz_stream_read_uint64(zip->stream, &zip->cd_size); - // Offset of start of central directory with respect to the starting disk number - if (err == MZ_OK) - err = mz_stream_read_uint64(zip->stream, &zip->cd_offset); - } - else if ((zip->number_entry == UINT16_MAX) || (number_entry_cd != zip->number_entry) || - (zip->cd_size == UINT16_MAX) || (zip->cd_offset == UINT32_MAX)) - { - err = MZ_FORMAT_ERROR; - } - } - } - - if (err == MZ_OK) - { - if (eocd_pos < zip->cd_offset + zip->cd_size) - err = MZ_FORMAT_ERROR; - } - - if ((err == MZ_OK) && (comment_size > 0)) - { - zip->comment = (char *)MZ_ALLOC(comment_size + 1); - if (zip->comment) - { - if (mz_stream_read(zip->stream, zip->comment, comment_size) != comment_size) - err = MZ_STREAM_ERROR; - zip->comment[comment_size] = 0; - } - } - - return err; -} - -static int32_t mz_zip_write_cd(void *handle) -{ - mz_zip *zip = (mz_zip *)handle; - uint16_t comment_size = 0; - uint64_t zip64_eocd_pos_inzip = 0; - int64_t disk_number = 0; - int64_t disk_size = 0; - int32_t err = MZ_OK; - - - if (zip == NULL) - return MZ_PARAM_ERROR; - - if (mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, &disk_number) == MZ_OK) - zip->disk_number_with_cd = (uint32_t)disk_number; - if (mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_SIZE, &disk_size) == MZ_OK && disk_size > 0) - zip->disk_number_with_cd += 1; - mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, -1); - - zip->cd_offset = mz_stream_tell(zip->stream); - mz_stream_seek(zip->cd_mem_stream, 0, MZ_SEEK_END); - zip->cd_size = (uint32_t)mz_stream_tell(zip->cd_mem_stream); - mz_stream_seek(zip->cd_mem_stream, 0, MZ_SEEK_SET); - - err = mz_stream_copy(zip->stream, zip->cd_mem_stream, (int32_t)zip->cd_size); - - // Write the ZIP64 central directory header - if (zip->cd_offset >= UINT32_MAX || zip->number_entry > UINT16_MAX) - { - zip64_eocd_pos_inzip = mz_stream_tell(zip->stream); - - err = mz_stream_write_uint32(zip->stream, MZ_ZIP_MAGIC_ENDHEADER64); - - // Size of this 'zip64 end of central directory' - if (err == MZ_OK) - err = mz_stream_write_uint64(zip->stream, (uint64_t)44); - // Version made by - if (err == MZ_OK) - err = mz_stream_write_uint16(zip->stream, zip->version_madeby); - // Version needed - if (err == MZ_OK) - err = mz_stream_write_uint16(zip->stream, (uint16_t)45); - // Number of this disk - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd); - // Number of the disk with the start of the central directory - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd); - // Total number of entries in the central dir on this disk - if (err == MZ_OK) - err = mz_stream_write_uint64(zip->stream, zip->number_entry); - // Total number of entries in the central dir - if (err == MZ_OK) - err = mz_stream_write_uint64(zip->stream, zip->number_entry); - // Size of the central directory - if (err == MZ_OK) - err = mz_stream_write_uint64(zip->stream, (uint64_t)zip->cd_size); - // Offset of start of central directory with respect to the starting disk number - if (err == MZ_OK) - err = mz_stream_write_uint64(zip->stream, zip->cd_offset); - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, MZ_ZIP_MAGIC_ENDLOCHEADER64); - - // Number of the disk with the start of the central directory - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd); - // Relative offset to the end of zip64 central directory - if (err == MZ_OK) - err = mz_stream_write_uint64(zip->stream, zip64_eocd_pos_inzip); - // Number of the disk with the start of the central directory - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, zip->disk_number_with_cd + 1); - } - - // Write the central directory header - - // Signature - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, MZ_ZIP_MAGIC_ENDHEADER); - // Number of this disk - if (err == MZ_OK) - err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->disk_number_with_cd); - // Number of the disk with the start of the central directory - if (err == MZ_OK) - err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->disk_number_with_cd); - // Total number of entries in the central dir on this disk - if (err == MZ_OK) - { - if (zip->number_entry >= UINT16_MAX) - err = mz_stream_write_uint16(zip->stream, UINT16_MAX); - else - err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->number_entry); - } - // Total number of entries in the central dir - if (err == MZ_OK) - { - if (zip->number_entry >= UINT16_MAX) - err = mz_stream_write_uint16(zip->stream, UINT16_MAX); - else - err = mz_stream_write_uint16(zip->stream, (uint16_t)zip->number_entry); - } - // Size of the central directory - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, (uint32_t)zip->cd_size); - // Offset of start of central directory with respect to the starting disk number - if (err == MZ_OK) - { - if (zip->cd_offset >= UINT32_MAX) - err = mz_stream_write_uint32(zip->stream, UINT32_MAX); - else - err = mz_stream_write_uint32(zip->stream, (uint32_t)zip->cd_offset); - } - - // Write global comment - if (zip->comment != NULL) - comment_size = (uint16_t)strlen(zip->comment); - if (err == MZ_OK) - err = mz_stream_write_uint16(zip->stream, comment_size); - if (err == MZ_OK) - { - if (mz_stream_write(zip->stream, zip->comment, comment_size) != comment_size) - err = MZ_STREAM_ERROR; - } - return err; -} - -extern void* mz_zip_open(void *stream, int32_t mode) -{ - mz_zip *zip = NULL; - int32_t err = MZ_OK; - - - zip = (mz_zip *)MZ_ALLOC(sizeof(mz_zip)); - if (zip == NULL) - return NULL; - - memset(zip, 0, sizeof(mz_zip)); - - zip->stream = stream; - - if (mode & MZ_OPEN_MODE_WRITE) - { - mz_stream_mem_create(&zip->cd_mem_stream); - mz_stream_mem_open(zip->cd_mem_stream, NULL, MZ_OPEN_MODE_CREATE); - - zip->cd_stream = zip->cd_mem_stream; - } - else - { - zip->cd_stream = stream; - } - - if ((mode & MZ_OPEN_MODE_READ) || (mode & MZ_OPEN_MODE_APPEND)) - { - err = mz_zip_read_cd(zip); - - if ((err == MZ_OK) && (mode & MZ_OPEN_MODE_APPEND)) - { - if (zip->cd_size > 0) - { - // Store central directory in memory - err = mz_stream_seek(zip->stream, zip->cd_offset, MZ_SEEK_SET); - if (err == MZ_OK) - err = mz_stream_copy(zip->cd_mem_stream, zip->stream, (uint32_t)zip->cd_size); - if (err == MZ_OK) - err = mz_stream_seek(zip->stream, zip->cd_offset, MZ_SEEK_SET); - } - else - { - // If no central directory, append new zip to end of file - err = mz_stream_seek(zip->stream, 0, MZ_SEEK_END); - } - } - else - { - zip->cd_start_pos = zip->cd_offset; - } - } - - if (err == MZ_OK) - { - mz_stream_mem_create(&zip->file_info_stream); - mz_stream_mem_open(zip->file_info_stream, NULL, MZ_OPEN_MODE_CREATE); - mz_stream_mem_create(&zip->local_file_info_stream); - mz_stream_mem_open(zip->local_file_info_stream, NULL, MZ_OPEN_MODE_CREATE); - } - - if (err != MZ_OK) - { - mz_zip_close(zip); - return NULL; - } - - zip->open_mode = mode; - - return zip; -} - -extern int32_t mz_zip_close(void *handle) -{ - mz_zip *zip = (mz_zip *)handle; - int32_t err = MZ_OK; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - if (zip->entry_opened == 1) - { - err = mz_zip_entry_close(handle); - if (err != MZ_OK) - return err; - } - - if (zip->open_mode & MZ_OPEN_MODE_WRITE) - err = mz_zip_write_cd(handle); - - if (zip->cd_mem_stream != NULL) - { - mz_stream_close(zip->cd_mem_stream); - mz_stream_delete(&zip->cd_mem_stream); - } - - if (zip->file_info_stream != NULL) - { - mz_stream_mem_close(zip->file_info_stream); - mz_stream_mem_delete(&zip->file_info_stream); - } - if (zip->local_file_info_stream != NULL) - { - mz_stream_mem_close(zip->local_file_info_stream); - mz_stream_mem_delete(&zip->local_file_info_stream); - } - - if (zip->comment) - MZ_FREE(zip->comment); - - MZ_FREE(zip); - - return err; -} - -extern int32_t mz_zip_get_comment(void *handle, const char **comment) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL || comment == NULL) - return MZ_PARAM_ERROR; - if (zip->comment == NULL) - return MZ_EXIST_ERROR; - *comment = zip->comment; - return MZ_OK; -} - -extern int32_t mz_zip_set_comment(void *handle, const char *comment) -{ - mz_zip *zip = (mz_zip *)handle; - uint16_t comment_size = 0; - if (zip == NULL || comment == NULL) - return MZ_PARAM_ERROR; - if (zip->comment != NULL) - MZ_FREE(zip->comment); - comment_size = (uint16_t)(strlen(comment) + 1); - zip->comment = (char *)MZ_ALLOC(comment_size); - strncpy(zip->comment, comment, comment_size); - return MZ_OK; -} - -extern int32_t mz_zip_get_version_madeby(void *handle, uint16_t *version_madeby) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL || version_madeby == NULL) - return MZ_PARAM_ERROR; - *version_madeby = zip->version_madeby; - return MZ_OK; -} - -extern int32_t mz_zip_set_version_madeby(void *handle, uint16_t version_madeby) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL) - return MZ_PARAM_ERROR; - zip->version_madeby = version_madeby; - return MZ_OK; -} - -// Get info about the current file in the zip file -static int32_t mz_zip_entry_read_header(void *stream, uint8_t local, mz_zip_file *file_info, void *file_info_stream) -{ - uint64_t ntfs_time = 0; - uint32_t reserved = 0; - uint32_t magic = 0; - uint32_t dos_date = 0; - uint32_t extra_pos = 0; - uint32_t extra_data_size_read = 0; - uint16_t extra_header_id = 0; - uint16_t extra_data_size = 0; - uint16_t ntfs_attrib_id = 0; - uint16_t ntfs_attrib_size = 0; - uint16_t value16 = 0; - uint32_t value32 = 0; - uint64_t value64 = 0; - int64_t max_seek = 0; - int64_t seek = 0; - int32_t err = MZ_OK; - - - memset(file_info, 0, sizeof(mz_zip_file)); - - // Check the magic - err = mz_stream_read_uint32(stream, &magic); - if (err == MZ_END_OF_STREAM) - err = MZ_END_OF_LIST; - else if (magic == MZ_ZIP_MAGIC_ENDHEADER || magic == MZ_ZIP_MAGIC_ENDHEADER64) - err = MZ_END_OF_LIST; - else if ((local) && (magic != MZ_ZIP_MAGIC_LOCALHEADER)) - err = MZ_FORMAT_ERROR; - else if ((!local) && (magic != MZ_ZIP_MAGIC_CENTRALHEADER)) - err = MZ_FORMAT_ERROR; - - // Read header fields - if (err == MZ_OK) - { - if (!local) - err = mz_stream_read_uint16(stream, &file_info->version_madeby); - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &file_info->version_needed); - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &file_info->flag); - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &file_info->compression_method); - if (err == MZ_OK) - { - err = mz_stream_read_uint32(stream, &dos_date); - file_info->modified_date = mz_zip_dosdate_to_time_t(dos_date); - } - if (err == MZ_OK) - err = mz_stream_read_uint32(stream, &file_info->crc); - if (err == MZ_OK) - err = mz_stream_read_uint32(stream, &value32); - file_info->compressed_size = value32; - if (err == MZ_OK) - err = mz_stream_read_uint32(stream, &value32); - file_info->uncompressed_size = value32; - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &file_info->filename_size); - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &file_info->extrafield_size); - if (!local) - { - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &file_info->comment_size); - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &value16); - file_info->disk_number = value16; - if (err == MZ_OK) - err = mz_stream_read_uint16(stream, &file_info->internal_fa); - if (err == MZ_OK) - err = mz_stream_read_uint32(stream, &file_info->external_fa); - if (err == MZ_OK) - err = mz_stream_read_uint32(stream, &value32); - file_info->disk_offset = value32; - } - } - - max_seek = file_info->filename_size + file_info->extrafield_size + file_info->comment_size + 3; - if (err == MZ_OK) - err = mz_stream_seek(file_info_stream, max_seek, MZ_SEEK_SET); - if (err == MZ_OK) - err = mz_stream_seek(file_info_stream, 0, MZ_SEEK_SET); - - if ((err == MZ_OK) && (file_info->filename_size > 0)) - { - mz_stream_mem_get_buffer(file_info_stream, (const void **)&file_info->filename); - - err = mz_stream_copy(file_info_stream, stream, file_info->filename_size); - if (err == MZ_OK) - err = mz_stream_write_uint8(file_info_stream, 0); - - seek += file_info->filename_size + 1; - } - - if ((err == MZ_OK) && (file_info->extrafield_size > 0)) - { - mz_stream_mem_get_buffer_at(file_info_stream, seek, (const void **)&file_info->extrafield); - - err = mz_stream_copy(file_info_stream, stream, file_info->extrafield_size); - if (err == MZ_OK) - err = mz_stream_write_uint8(file_info_stream, 0); - - // Seek back and parse the extra field - if (err == MZ_OK) - err = mz_stream_seek(file_info_stream, seek, MZ_SEEK_SET); - - seek += file_info->extrafield_size + 1; - - while ((err == MZ_OK) && (extra_pos < file_info->extrafield_size)) - { - err = mz_stream_read_uint16(file_info_stream, &extra_header_id); - if (err == MZ_OK) - err = mz_stream_read_uint16(file_info_stream, &extra_data_size); - - // ZIP64 extra field - if (extra_header_id == MZ_ZIP_EXTENSION_ZIP64) - { - if ((err == MZ_OK) && (file_info->uncompressed_size == UINT32_MAX)) - err = mz_stream_read_uint64(file_info_stream, &file_info->uncompressed_size); - if ((err == MZ_OK) && (file_info->compressed_size == UINT32_MAX)) - err = mz_stream_read_uint64(file_info_stream, &file_info->compressed_size); - if ((err == MZ_OK) && (file_info->disk_offset == UINT32_MAX)) - err = mz_stream_read_uint64(file_info_stream, &value64); - file_info->disk_offset = value64; - if ((err == MZ_OK) && (file_info->disk_number == UINT16_MAX)) - err = mz_stream_read_uint32(file_info_stream, &file_info->disk_number); - } - // NTFS extra field - else if (extra_header_id == MZ_ZIP_EXTENSION_NTFS) - { - if (err == MZ_OK) - err = mz_stream_read_uint32(file_info_stream, &reserved); - extra_data_size_read = 4; - - while ((err == MZ_OK) && (extra_data_size_read < extra_data_size)) - { - err = mz_stream_read_uint16(file_info_stream, &ntfs_attrib_id); - if (err == MZ_OK) - err = mz_stream_read_uint16(file_info_stream, &ntfs_attrib_size); - - if ((err == MZ_OK) && (ntfs_attrib_id == 0x01) && (ntfs_attrib_size == 24)) - { - err = mz_stream_read_uint64(file_info_stream, &ntfs_time); - mz_zip_ntfs_to_unix_time(ntfs_time, &file_info->modified_date); - - if (err == MZ_OK) - { - err = mz_stream_read_uint64(file_info_stream, &ntfs_time); - mz_zip_ntfs_to_unix_time(ntfs_time, &file_info->accessed_date); - } - if (err == MZ_OK) - { - err = mz_stream_read_uint64(file_info_stream, &ntfs_time); - mz_zip_ntfs_to_unix_time(ntfs_time, &file_info->creation_date); - } - } - else - { - if (err == MZ_OK) - err = mz_stream_seek(file_info_stream, ntfs_attrib_size, MZ_SEEK_CUR); - } - - extra_data_size_read += ntfs_attrib_size + 4; - } - } -#ifdef HAVE_AES - // AES extra field - else if (extra_header_id == MZ_ZIP_EXTENSION_AES) - { - uint8_t value8 = 0; - // Verify version info - err = mz_stream_read_uint16(file_info_stream, &value16); - // Support AE-1 and AE-2 - if (value16 != 1 && value16 != 2) - err = MZ_FORMAT_ERROR; - file_info->aes_version = value16; - if (err == MZ_OK) - err = mz_stream_read_uint8(file_info_stream, &value8); - if ((char)value8 != 'A') - err = MZ_FORMAT_ERROR; - if (err == MZ_OK) - err = mz_stream_read_uint8(file_info_stream, &value8); - if ((char)value8 != 'E') - err = MZ_FORMAT_ERROR; - // Get AES encryption strength and actual compression method - if (err == MZ_OK) - err = mz_stream_read_uint8(file_info_stream, &value8); - file_info->aes_encryption_mode = value8; - if (err == MZ_OK) - err = mz_stream_read_uint16(file_info_stream, &value16); - file_info->compression_method = value16; - } -#endif - else - { - err = mz_stream_seek(file_info_stream, extra_data_size, MZ_SEEK_CUR); - } - - extra_pos += 4 + extra_data_size; - } - } - - if ((err == MZ_OK) && (file_info->comment_size > 0)) - { - mz_stream_mem_get_buffer_at(file_info_stream, seek, (const void **)&file_info->comment); - - err = mz_stream_copy(file_info_stream, stream, file_info->comment_size); - if (err == MZ_OK) - err = mz_stream_write_uint8(file_info_stream, 0); - } - - return err; -} - -static int32_t mz_zip_entry_write_header(void *stream, uint8_t local, mz_zip_file *file_info) -{ - uint64_t ntfs_time = 0; - uint32_t reserved = 0; - uint32_t dos_date = 0; - uint16_t extrafield_size = 0; - uint16_t extrafield_zip64_size = 0; - uint16_t extrafield_ntfs_size = 0; - uint16_t filename_size = 0; - uint16_t filename_length = 0; - uint16_t comment_size = 0; - uint16_t version_needed = 0; - uint8_t zip64 = 0; - int32_t err = MZ_OK; - - if (file_info == NULL) - return MZ_PARAM_ERROR; - - // Calculate extra field sizes - extrafield_size = file_info->extrafield_size; - - if (file_info->uncompressed_size >= UINT32_MAX) - extrafield_zip64_size += 8; - if (file_info->compressed_size >= UINT32_MAX) - extrafield_zip64_size += 8; - if (file_info->disk_offset >= UINT32_MAX) - extrafield_zip64_size += 8; - - if (file_info->zip64 == MZ_ZIP64_AUTO) - { - // If uncompressed size is unknown, assume zip64 for 64-bit data descriptors - zip64 = (local && file_info->uncompressed_size == 0) || (extrafield_zip64_size > 0); - } - else if (file_info->zip64 == MZ_ZIP64_FORCE) - zip64 = 1; - else if (file_info->zip64 == MZ_ZIP64_DISABLE) - { - // Zip64 extension is required to zip file - if (extrafield_zip64_size > 0) - return MZ_PARAM_ERROR; - } - - if (zip64) - { - extrafield_size += 4; - extrafield_size += extrafield_zip64_size; - } -#ifdef HAVE_AES - if ((file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) && (file_info->aes_version)) - extrafield_size += 4 + 7; -#endif - // NTFS timestamps - if ((file_info->modified_date != 0) && - (file_info->accessed_date != 0) && - (file_info->creation_date != 0)) - { - extrafield_ntfs_size += 8 + 8 + 8 + 4 + 2 + 2; - extrafield_size += 4; - extrafield_size += extrafield_ntfs_size; - } - - if (local) - err = mz_stream_write_uint32(stream, MZ_ZIP_MAGIC_LOCALHEADER); - else - { - err = mz_stream_write_uint32(stream, MZ_ZIP_MAGIC_CENTRALHEADER); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, file_info->version_madeby); - } - - // Calculate version needed to extract - if (err == MZ_OK) - { - version_needed = file_info->version_needed; - if (version_needed == 0) - { - version_needed = 20; - if (zip64) - version_needed = 45; -#ifdef HAVE_AES - if ((file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) && (file_info->aes_version)) - version_needed = 51; -#endif -#ifdef HAVE_LZMA - if (file_info->compression_method == MZ_COMPRESS_METHOD_LZMA) - version_needed = 63; -#endif - } - err = mz_stream_write_uint16(stream, version_needed); - } - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, file_info->flag); - if (err == MZ_OK) - { -#ifdef HAVE_AES - if (file_info->aes_version) - err = mz_stream_write_uint16(stream, MZ_COMPRESS_METHOD_AES); - else -#endif - err = mz_stream_write_uint16(stream, file_info->compression_method); - } - if (err == MZ_OK) - { - if (file_info->modified_date != 0) - dos_date = mz_zip_time_t_to_dos_date(file_info->modified_date); - err = mz_stream_write_uint32(stream, dos_date); - } - - if (err == MZ_OK) - err = mz_stream_write_uint32(stream, file_info->crc); // crc - if (err == MZ_OK) - { - if (file_info->compressed_size >= UINT32_MAX) // compr size - err = mz_stream_write_uint32(stream, UINT32_MAX); - else - err = mz_stream_write_uint32(stream, (uint32_t)file_info->compressed_size); - } - if (err == MZ_OK) - { - if (file_info->uncompressed_size >= UINT32_MAX) // uncompr size - err = mz_stream_write_uint32(stream, UINT32_MAX); - else - err = mz_stream_write_uint32(stream, (uint32_t)file_info->uncompressed_size); - } - - filename_length = (uint16_t)strlen(file_info->filename); - if (err == MZ_OK) - { - filename_size = filename_length; - if (mz_zip_attrib_is_dir(file_info->external_fa, file_info->version_madeby) == MZ_OK) - { - if ((file_info->filename[filename_length - 1] == '/') || - (file_info->filename[filename_length - 1] == '\\')) - filename_length -= 1; - else - filename_size += 1; - } - err = mz_stream_write_uint16(stream, filename_size); - } - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, extrafield_size); - - if (!local) - { - if (file_info->comment != NULL) - comment_size = (uint16_t)strlen(file_info->comment); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, comment_size); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, (uint16_t)file_info->disk_number); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, file_info->internal_fa); - if (err == MZ_OK) - err = mz_stream_write_uint32(stream, file_info->external_fa); - if (err == MZ_OK) - { - if (file_info->disk_offset >= UINT32_MAX) - err = mz_stream_write_uint32(stream, UINT32_MAX); - else - err = mz_stream_write_uint32(stream, (uint32_t)file_info->disk_offset); - } - } - - if (err == MZ_OK) - { - if (mz_stream_write(stream, file_info->filename, filename_length) != filename_length) - err = MZ_STREAM_ERROR; - if (err == MZ_OK) - { - // Ensure that directories have a slash appended to them for compatibility - if (mz_zip_attrib_is_dir(file_info->external_fa, file_info->version_madeby) == MZ_OK) - err = mz_stream_write_uint8(stream, '/'); - } - } - if (err == MZ_OK) - { - if (mz_stream_write(stream, file_info->extrafield, file_info->extrafield_size) != file_info->extrafield_size) - err = MZ_STREAM_ERROR; - } - // Add ZIP64 extra info header to central directory - if ((err == MZ_OK) && (zip64)) - { - err = mz_stream_write_uint16(stream, MZ_ZIP_EXTENSION_ZIP64); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, extrafield_zip64_size); - if ((err == MZ_OK) && (file_info->uncompressed_size >= UINT32_MAX)) - err = mz_stream_write_uint64(stream, file_info->uncompressed_size); - if ((err == MZ_OK) && (file_info->compressed_size >= UINT32_MAX)) - err = mz_stream_write_uint64(stream, file_info->compressed_size); - if ((err == MZ_OK) && (file_info->disk_offset >= UINT32_MAX)) - err = mz_stream_write_uint64(stream, file_info->disk_offset); - } - // Write NTFS timestamps - if ((err == MZ_OK) && (extrafield_ntfs_size > 0)) - { - err = mz_stream_write_uint16(stream, MZ_ZIP_EXTENSION_NTFS); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, extrafield_ntfs_size); - if (err == MZ_OK) - err = mz_stream_write_uint32(stream, reserved); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, 0x01); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, extrafield_ntfs_size - 8); - if (err == MZ_OK) - { - mz_zip_unix_to_ntfs_time(file_info->modified_date, &ntfs_time); - err = mz_stream_write_uint64(stream, ntfs_time); - } - if (err == MZ_OK) - { - mz_zip_unix_to_ntfs_time(file_info->accessed_date, &ntfs_time); - err = mz_stream_write_uint64(stream, ntfs_time); - } - if (err == MZ_OK) - { - mz_zip_unix_to_ntfs_time(file_info->creation_date, &ntfs_time); - err = mz_stream_write_uint64(stream, ntfs_time); - } - } -#ifdef HAVE_AES - // Write AES extra info header to central directory - if ((err == MZ_OK) && (file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) && (file_info->aes_version)) - { - err = mz_stream_write_uint16(stream, MZ_ZIP_EXTENSION_AES); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, 7); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, file_info->aes_version); - if (err == MZ_OK) - err = mz_stream_write_uint8(stream, 'A'); - if (err == MZ_OK) - err = mz_stream_write_uint8(stream, 'E'); - if (err == MZ_OK) - err = mz_stream_write_uint8(stream, file_info->aes_encryption_mode); - if (err == MZ_OK) - err = mz_stream_write_uint16(stream, file_info->compression_method); - } -#endif - if ((err == MZ_OK) && (file_info->comment != NULL)) - { - if (mz_stream_write(stream, file_info->comment, file_info->comment_size) != MZ_OK) - err = MZ_STREAM_ERROR; - } - - return err; -} - -static int32_t mz_zip_entry_open_int(void *handle, int16_t compression_method, int16_t compress_level, const char *password) -{ - mz_zip *zip = (mz_zip *)handle; - int64_t max_total_in = 0; - int64_t total_in = 0; - int64_t footer_size = 0; - int32_t err = MZ_OK; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - zip->compression_method = compression_method; - - switch (zip->compression_method) - { - case MZ_COMPRESS_METHOD_RAW: - case MZ_COMPRESS_METHOD_DEFLATE: -#ifdef HAVE_BZIP2 - case MZ_COMPRESS_METHOD_BZIP2: -#endif -#if HAVE_LZMA - case MZ_COMPRESS_METHOD_LZMA: -#endif - err = MZ_OK; - break; - default: - return MZ_PARAM_ERROR; - } - - if ((zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) && (password == NULL) && (zip->compression_method != MZ_COMPRESS_METHOD_RAW)) - return MZ_PARAM_ERROR; - - if ((err == MZ_OK) && (zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) && (zip->compression_method != MZ_COMPRESS_METHOD_RAW)) - { -#ifdef HAVE_AES - if (zip->file_info.aes_version) - { - mz_stream_aes_create(&zip->crypt_stream); - mz_stream_aes_set_password(zip->crypt_stream, password); - mz_stream_aes_set_encryption_mode(zip->crypt_stream, zip->file_info.aes_encryption_mode); - } - else -#endif - { -#ifdef HAVE_PKCRYPT - uint8_t verify1 = 0; - uint8_t verify2 = 0; - - // Info-ZIP modification to ZipCrypto format: - // If bit 3 of the general purpose bit flag is set, it uses high byte of 16-bit File Time. - - if (zip->file_info.flag & MZ_ZIP_FLAG_DATA_DESCRIPTOR) - { - uint32_t dos_date = 0; - - dos_date = mz_zip_time_t_to_dos_date(zip->file_info.modified_date); - - verify1 = (uint8_t)((dos_date >> 16) & 0xff); - verify2 = (uint8_t)((dos_date >> 8) & 0xff); - } - else - { - verify1 = (uint8_t)((zip->file_info.crc >> 16) & 0xff); - verify2 = (uint8_t)((zip->file_info.crc >> 24) & 0xff); - } - - mz_stream_pkcrypt_create(&zip->crypt_stream); - mz_stream_pkcrypt_set_password(zip->crypt_stream, password); - mz_stream_pkcrypt_set_verify(zip->crypt_stream, verify1, verify2); -#endif - } - } - - if (err == MZ_OK) - { - if (zip->crypt_stream == NULL) - mz_stream_raw_create(&zip->crypt_stream); - - mz_stream_set_base(zip->crypt_stream, zip->stream); - - err = mz_stream_open(zip->crypt_stream, NULL, zip->open_mode); - } - - if (err == MZ_OK) - { - if (zip->compression_method == MZ_COMPRESS_METHOD_RAW) - mz_stream_raw_create(&zip->compress_stream); -#ifdef HAVE_ZLIB - else if (zip->compression_method == MZ_COMPRESS_METHOD_DEFLATE) - mz_stream_zlib_create(&zip->compress_stream); -#endif -#ifdef HAVE_BZIP2 - else if (zip->compression_method == MZ_COMPRESS_METHOD_BZIP2) - mz_stream_bzip_create(&zip->compress_stream); -#endif -#ifdef HAVE_LZMA - else if (zip->compression_method == MZ_COMPRESS_METHOD_LZMA) - mz_stream_lzma_create(&zip->compress_stream); -#endif - else - err = MZ_PARAM_ERROR; - } - - if (err == MZ_OK) - { - if (zip->open_mode & MZ_OPEN_MODE_WRITE) - { - mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_COMPRESS_LEVEL, compress_level); - } - else - { - if (zip->compression_method == MZ_COMPRESS_METHOD_RAW || zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) - { - max_total_in = zip->file_info.compressed_size; - if (mz_stream_get_prop_int64(zip->crypt_stream, MZ_STREAM_PROP_FOOTER_SIZE, &footer_size) == MZ_OK) - max_total_in -= footer_size; - if (mz_stream_get_prop_int64(zip->crypt_stream, MZ_STREAM_PROP_TOTAL_IN, &total_in) == MZ_OK) - max_total_in -= total_in; - mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_IN_MAX, max_total_in); - } - if (zip->compression_method == MZ_COMPRESS_METHOD_LZMA && (zip->file_info.flag & MZ_ZIP_FLAG_LZMA_EOS_MARKER) == 0) - { - mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_IN_MAX, zip->file_info.compressed_size); - mz_stream_set_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_OUT_MAX, zip->file_info.uncompressed_size); - } - } - - mz_stream_set_base(zip->compress_stream, zip->crypt_stream); - - err = mz_stream_open(zip->compress_stream, NULL, zip->open_mode); - } - if (err == MZ_OK) - { - mz_stream_crc32_create(&zip->crc32_stream); -#ifdef HAVE_ZLIB - mz_stream_crc32_set_update_func(zip->crc32_stream, - (mz_stream_crc32_update)mz_stream_zlib_get_crc32_update()); -#elif defined(HAVE_LZMA) - mz_stream_crc32_set_update_func(zip->crc32_stream, - (mz_stream_crc32_update)mz_stream_lzma_get_crc32_update()); -#else - #error ZLIB or LZMA required for CRC32 -#endif - - mz_stream_set_base(zip->crc32_stream, zip->compress_stream); - - err = mz_stream_open(zip->crc32_stream, NULL, zip->open_mode); - } - - if (err == MZ_OK) - { - zip->entry_opened = 1; - } - - return err; -} - -extern int32_t mz_zip_entry_read_open(void *handle, int16_t raw, const char *password) -{ - mz_zip *zip = (mz_zip *)handle; - int16_t compression_method = 0; - int32_t err = MZ_OK; - -#if !defined(HAVE_PKCRYPT) && !defined(HAVE_AES) - if (password != NULL) - return MZ_PARAM_ERROR; -#endif - if (zip == NULL) - return MZ_PARAM_ERROR; - if ((zip->open_mode & MZ_OPEN_MODE_READ) == 0) - return MZ_PARAM_ERROR; - if (zip->entry_scanned == 0) - return MZ_PARAM_ERROR; - if ((zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) && (password == NULL) && (!raw)) - return MZ_PARAM_ERROR; - - if (zip->file_info.disk_number == zip->disk_number_with_cd) - mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, -1); - else - mz_stream_set_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, zip->file_info.disk_number); - - err = mz_stream_seek(zip->stream, zip->file_info.disk_offset, MZ_SEEK_SET); - if (err == MZ_OK) - err = mz_zip_entry_read_header(zip->stream, 1, &zip->local_file_info, zip->local_file_info_stream); - - compression_method = zip->file_info.compression_method; - if (raw) - compression_method = MZ_COMPRESS_METHOD_RAW; - - if (err == MZ_OK) - err = mz_zip_entry_open_int(handle, compression_method, 0, password); - - return err; -} - -extern int32_t mz_zip_entry_write_open(void *handle, const mz_zip_file *file_info, int16_t compress_level, const char *password) -{ - mz_zip *zip = (mz_zip *)handle; - int64_t disk_number = 0; - int32_t err = MZ_OK; - int16_t compression_method = 0; - - -#if !defined(HAVE_PKCRYPT) && !defined(HAVE_AES) - if (password != NULL) - return MZ_PARAM_ERROR; -#endif - if (zip == NULL || file_info == NULL || file_info->filename == NULL) - return MZ_PARAM_ERROR; - - if (zip->entry_opened == 1) - { - err = mz_zip_entry_close(handle); - if (err != MZ_OK) - return err; - } - - memcpy(&zip->file_info, file_info, sizeof(mz_zip_file)); - - compression_method = zip->file_info.compression_method; - - if (compression_method == MZ_COMPRESS_METHOD_DEFLATE) - { - if ((compress_level == 8) || (compress_level == 9)) - zip->file_info.flag |= MZ_ZIP_FLAG_DEFLATE_MAX; - if (compress_level == 2) - zip->file_info.flag |= MZ_ZIP_FLAG_DEFLATE_FAST; - if (compress_level == 1) - zip->file_info.flag |= MZ_ZIP_FLAG_DEFLATE_SUPER_FAST; - } -#ifdef HAVE_LZMA - else if (compression_method == MZ_COMPRESS_METHOD_LZMA) - zip->file_info.flag |= MZ_ZIP_FLAG_LZMA_EOS_MARKER; -#endif - - zip->file_info.flag |= MZ_ZIP_FLAG_DATA_DESCRIPTOR; - - if (password != NULL) - zip->file_info.flag |= MZ_ZIP_FLAG_ENCRYPTED; - else - zip->file_info.flag &= ~MZ_ZIP_FLAG_ENCRYPTED; - - mz_stream_get_prop_int64(zip->stream, MZ_STREAM_PROP_DISK_NUMBER, &disk_number); - zip->file_info.disk_number = (uint32_t)disk_number; - - zip->file_info.disk_offset = mz_stream_tell(zip->stream); - zip->file_info.crc = 0; - zip->file_info.compressed_size = 0; - -#ifdef HAVE_AES - if (zip->file_info.aes_version && zip->file_info.aes_encryption_mode == 0) - zip->file_info.aes_encryption_mode = MZ_AES_ENCRYPTION_MODE_256; -#endif - - if ((compress_level == 0) || (mz_zip_attrib_is_dir(zip->file_info.external_fa, zip->file_info.version_madeby) == MZ_OK)) - compression_method = MZ_COMPRESS_METHOD_RAW; - - if (err == MZ_OK) - err = mz_zip_entry_write_header(zip->stream, 1, &zip->file_info); - if (err == MZ_OK) - err = mz_zip_entry_open_int(handle, compression_method, compress_level, password); - - return err; -} - -extern int32_t mz_zip_entry_read(void *handle, void *buf, uint32_t len) -{ - mz_zip *zip = (mz_zip *)handle; - int32_t read = 0; - - if (zip == NULL || zip->entry_opened == 0) - return MZ_PARAM_ERROR; - if (UINT_MAX == UINT16_MAX && len > UINT16_MAX) // Zlib limitation - return MZ_PARAM_ERROR; - if (len == 0 || zip->file_info.uncompressed_size == 0) - return 0; - read = mz_stream_read(zip->crc32_stream, buf, len); - if (read > 0) - zip->entry_read += read; - return read; -} - -extern int32_t mz_zip_entry_write(void *handle, const void *buf, uint32_t len) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL || zip->entry_opened == 0) - return MZ_PARAM_ERROR; - return mz_stream_write(zip->crc32_stream, buf, len); -} - -extern int32_t mz_zip_entry_get_info(void *handle, mz_zip_file **file_info) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL || zip->entry_scanned == 0) - return MZ_PARAM_ERROR; - *file_info = &zip->file_info; - return MZ_OK; -} - -extern int32_t mz_zip_entry_get_local_info(void *handle, mz_zip_file **local_file_info) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL || zip->entry_scanned == 0 || zip->entry_opened == 0) - return MZ_PARAM_ERROR; - *local_file_info = &zip->local_file_info; - return MZ_OK; -} - -extern int32_t mz_zip_entry_close_raw(void *handle, uint64_t uncompressed_size, uint32_t crc32) -{ - mz_zip *zip = (mz_zip *)handle; - uint64_t compressed_size = 0; - int32_t err = MZ_OK; - - if (zip == NULL || zip->entry_opened == 0) - return MZ_PARAM_ERROR; - - mz_stream_close(zip->compress_stream); - if (crc32 == 0) - crc32 = mz_stream_crc32_get_value(zip->crc32_stream); - - if ((zip->open_mode & MZ_OPEN_MODE_WRITE) == 0) - { -#ifdef HAVE_AES - // AES zip version AE-1 will expect a valid crc as well - if (zip->file_info.aes_version <= 0x0001) -#endif - { - if ((zip->entry_read > 0) && (zip->compression_method != MZ_COMPRESS_METHOD_RAW)) - { - if (crc32 != zip->file_info.crc) - err = MZ_CRC_ERROR; - } - } - } - - mz_stream_get_prop_int64(zip->compress_stream, MZ_STREAM_PROP_TOTAL_OUT, (int64_t *)&compressed_size); - if ((zip->compression_method != MZ_COMPRESS_METHOD_RAW) || (uncompressed_size == 0)) - mz_stream_get_prop_int64(zip->crc32_stream, MZ_STREAM_PROP_TOTAL_OUT, (int64_t *)&uncompressed_size); - - if (zip->file_info.flag & MZ_ZIP_FLAG_ENCRYPTED) - { - mz_stream_set_base(zip->crypt_stream, zip->stream); - err = mz_stream_close(zip->crypt_stream); - - mz_stream_get_prop_int64(zip->crypt_stream, MZ_STREAM_PROP_TOTAL_OUT, (int64_t *)&compressed_size); - } - - mz_stream_delete(&zip->crypt_stream); - - mz_stream_delete(&zip->compress_stream); - mz_stream_crc32_delete(&zip->crc32_stream); - - if (zip->open_mode & MZ_OPEN_MODE_WRITE) - { - if (err == MZ_OK) - { - err = mz_stream_write_uint32(zip->stream, MZ_ZIP_MAGIC_DATADESCRIPTOR); - if (err == MZ_OK) - err = mz_stream_write_uint32(zip->stream, crc32); - if (err == MZ_OK) - { - if (zip->file_info.uncompressed_size <= UINT32_MAX) - err = mz_stream_write_uint32(zip->stream, (uint32_t)compressed_size); - else - err = mz_stream_write_uint64(zip->stream, compressed_size); - } - if (err == MZ_OK) - { - if (zip->file_info.uncompressed_size <= UINT32_MAX) - err = mz_stream_write_uint32(zip->stream, (uint32_t)uncompressed_size); - else - err = mz_stream_write_uint64(zip->stream, uncompressed_size); - } - } - - zip->file_info.crc = crc32; - zip->file_info.compressed_size = compressed_size; - zip->file_info.uncompressed_size = uncompressed_size; - - if (err == MZ_OK) - err = mz_zip_entry_write_header(zip->cd_mem_stream, 0, &zip->file_info); - - zip->number_entry += 1; - } - - zip->entry_opened = 0; - - return err; -} - -extern int32_t mz_zip_entry_close(void *handle) -{ - return mz_zip_entry_close_raw(handle, 0, 0); -} - -static int32_t mz_zip_goto_next_entry_int(void *handle) -{ - mz_zip *zip = (mz_zip *)handle; - int32_t err = MZ_OK; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - zip->entry_scanned = 0; - - mz_stream_set_prop_int64(zip->cd_stream, MZ_STREAM_PROP_DISK_NUMBER, -1); - - err = mz_stream_seek(zip->cd_stream, zip->cd_current_pos, MZ_SEEK_SET); - if (err == MZ_OK) - err = mz_zip_entry_read_header(zip->cd_stream, 0, &zip->file_info, zip->file_info_stream); - if (err == MZ_OK) - zip->entry_scanned = 1; - return err; -} - -extern int32_t mz_zip_get_number_entry(void *handle, int64_t *number_entry) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL || number_entry == NULL) - return MZ_PARAM_ERROR; - *number_entry = zip->number_entry; - return MZ_OK; -} - -extern int32_t mz_zip_get_disk_number_with_cd(void *handle, uint32_t *disk_number_with_cd) -{ - mz_zip *zip = (mz_zip *)handle; - if (zip == NULL || disk_number_with_cd == NULL) - return MZ_PARAM_ERROR; - *disk_number_with_cd = zip->disk_number_with_cd; - return MZ_OK; -} - -extern int64_t mz_zip_get_entry(void *handle) -{ - mz_zip *zip = (mz_zip *)handle; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - return zip->cd_current_pos; -} - -extern int32_t mz_zip_goto_entry(void *handle, uint64_t cd_pos) -{ - mz_zip *zip = (mz_zip *)handle; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - if (cd_pos < zip->cd_start_pos || cd_pos > zip->cd_start_pos + zip->cd_size) - return MZ_PARAM_ERROR; - - zip->cd_current_pos = cd_pos; - - return mz_zip_goto_next_entry_int(handle); -} - -extern int32_t mz_zip_goto_first_entry(void *handle) -{ - mz_zip *zip = (mz_zip *)handle; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - zip->cd_current_pos = zip->cd_start_pos; - - return mz_zip_goto_next_entry_int(handle); -} - -extern int32_t mz_zip_goto_next_entry(void *handle) -{ - mz_zip *zip = (mz_zip *)handle; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - zip->cd_current_pos += MZ_ZIP_SIZE_CD_ITEM + zip->file_info.filename_size + - zip->file_info.extrafield_size + zip->file_info.comment_size; - - return mz_zip_goto_next_entry_int(handle); -} - -extern int32_t mz_zip_locate_entry(void *handle, const char *filename, mz_filename_compare_cb filename_compare_cb) -{ - mz_zip *zip = (mz_zip *)handle; - int32_t err = MZ_OK; - int32_t result = 0; - - if (zip == NULL) - return MZ_PARAM_ERROR; - - err = mz_zip_goto_first_entry(handle); - while (err == MZ_OK) - { - if (filename_compare_cb != NULL) - result = filename_compare_cb(handle, zip->file_info.filename, filename); - else - result = strcmp(zip->file_info.filename, filename); - - if (result == 0) - return MZ_OK; - - err = mz_zip_goto_next_entry(handle); - } - - return err; -} - -/***************************************************************************/ - -int32_t mz_zip_attrib_is_dir(int32_t attributes, int32_t version_madeby) -{ - int32_t host_system = (uint8_t)(version_madeby >> 8); - - if (host_system == MZ_HOST_SYSTEM_MSDOS || host_system == MZ_HOST_SYSTEM_WINDOWS_NTFS) - { - if ((attributes & 0x10) == 0x10) // FILE_ATTRIBUTE_DIRECTORY - return MZ_OK; - } - else if (host_system == MZ_HOST_SYSTEM_UNIX || host_system == MZ_HOST_SYSTEM_OSX_DARWIN) - { - if ((attributes & 00170000) == 0040000) // S_ISDIR - return MZ_OK; - } - - return MZ_EXIST_ERROR; -} - -/***************************************************************************/ - -static int32_t mz_zip_invalid_date(const struct tm *ptm) -{ -#define datevalue_in_range(min, max, value) ((min) <= (value) && (value) <= (max)) - return (!datevalue_in_range(0, 127 + 80, ptm->tm_year) || // 1980-based year, allow 80 extra - !datevalue_in_range(0, 11, ptm->tm_mon) || - !datevalue_in_range(1, 31, ptm->tm_mday) || - !datevalue_in_range(0, 23, ptm->tm_hour) || - !datevalue_in_range(0, 59, ptm->tm_min) || - !datevalue_in_range(0, 59, ptm->tm_sec)); -#undef datevalue_in_range -} - -static void mz_zip_dosdate_to_raw_tm(uint64_t dos_date, struct tm *ptm) -{ - uint64_t date = (uint64_t)(dos_date >> 16); - - ptm->tm_mday = (uint16_t)(date & 0x1f); - ptm->tm_mon = (uint16_t)(((date & 0x1E0) / 0x20) - 1); - ptm->tm_year = (uint16_t)(((date & 0x0FE00) / 0x0200) + 80); - ptm->tm_hour = (uint16_t)((dos_date & 0xF800) / 0x800); - ptm->tm_min = (uint16_t)((dos_date & 0x7E0) / 0x20); - ptm->tm_sec = (uint16_t)(2 * (dos_date & 0x1f)); - ptm->tm_isdst = -1; -} - -int32_t mz_zip_dosdate_to_tm(uint64_t dos_date, struct tm *ptm) -{ - if (ptm == NULL) - return MZ_PARAM_ERROR; - - mz_zip_dosdate_to_raw_tm(dos_date, ptm); - - if (mz_zip_invalid_date(ptm)) - { - // Invalid date stored, so don't return it - memset(ptm, 0, sizeof(struct tm)); - return MZ_FORMAT_ERROR; - } - return MZ_OK; -} - -time_t mz_zip_dosdate_to_time_t(uint64_t dos_date) -{ - struct tm ptm; - mz_zip_dosdate_to_raw_tm(dos_date, &ptm); - return mktime(&ptm); -} - -int32_t mz_zip_time_t_to_tm(time_t unix_time, struct tm *ptm) -{ - struct tm *ltm = NULL; - if (ptm == NULL) - return MZ_PARAM_ERROR; - ltm = localtime(&unix_time); // Returns a 1900-based year - if (ltm == NULL) - { - // Invalid date stored, so don't return it - memset(ptm, 0, sizeof(struct tm)); - return MZ_INTERNAL_ERROR; - } - memcpy(ptm, ltm, sizeof(struct tm)); - return MZ_OK; -} - -uint32_t mz_zip_time_t_to_dos_date(time_t unix_time) -{ - struct tm ptm; - mz_zip_time_t_to_tm(unix_time, &ptm); - return mz_zip_tm_to_dosdate((const struct tm *)&ptm); -} - -uint32_t mz_zip_tm_to_dosdate(const struct tm *ptm) -{ - struct tm fixed_tm; - - // Years supported: - - // [00, 79] (assumed to be between 2000 and 2079) - // [80, 207] (assumed to be between 1980 and 2107, typical output of old - // software that does 'year-1900' to get a double digit year) - // [1980, 2107] (due to format limitations, only years 1980-2107 can be stored.) - - memcpy(&fixed_tm, ptm, sizeof(struct tm)); - if (fixed_tm.tm_year >= 1980) // range [1980, 2107] - fixed_tm.tm_year -= 1980; - else if (fixed_tm.tm_year >= 80) // range [80, 207] - fixed_tm.tm_year -= 80; - else // range [00, 79] - fixed_tm.tm_year += 20; - - if (mz_zip_invalid_date(&fixed_tm)) - return 0; - - return (uint32_t)(((fixed_tm.tm_mday) + (32 * (fixed_tm.tm_mon + 1)) + (512 * fixed_tm.tm_year)) << 16) | - ((fixed_tm.tm_sec / 2) + (32 * fixed_tm.tm_min) + (2048 * (uint32_t)fixed_tm.tm_hour)); -} - -int32_t mz_zip_ntfs_to_unix_time(uint64_t ntfs_time, time_t *unix_time) -{ - *unix_time = (time_t)((ntfs_time - 116444736000000000LL) / 10000000); - return MZ_OK; -} - -int32_t mz_zip_unix_to_ntfs_time(time_t unix_time, uint64_t *ntfs_time) -{ - *ntfs_time = ((uint64_t)unix_time * 10000000) + 116444736000000000LL; - return MZ_OK; -} diff --git a/game/client/third/minizip/mz_zip.h b/game/client/third/minizip/mz_zip.h deleted file mode 100755 index a2fe6c9b..00000000 --- a/game/client/third/minizip/mz_zip.h +++ /dev/null @@ -1,164 +0,0 @@ -/* mz_zip.h -- Zip manipulation - Version 2.3.3, June 10, 2018 - part of the MiniZip project - - Copyright (C) 2010-2018 Nathan Moinvaziri - https://github.com/nmoinvaz/minizip - Copyright (C) 2009-2010 Mathias Svensson - Modifications for Zip64 support - http://result42.com - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef MZ_ZIP_H -#define MZ_ZIP_H - -#include -#include - -#include "mz_strm.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -typedef struct mz_zip_file_s -{ - uint16_t version_madeby; // version made by - uint16_t version_needed; // version needed to extract - uint16_t flag; // general purpose bit flag - uint16_t compression_method; // compression method - time_t modified_date; // last modified date in unix time - time_t accessed_date; // last accessed date in unix time - time_t creation_date; // creation date in unix time - uint32_t crc; // crc-32 - uint64_t compressed_size; // compressed size - uint64_t uncompressed_size; // uncompressed size - uint16_t filename_size; // filename length - uint16_t extrafield_size; // extra field length - uint16_t comment_size; // file comment length - uint32_t disk_number; // disk number start - uint64_t disk_offset; // relative offset of local header - uint16_t internal_fa; // internal file attributes - uint32_t external_fa; // external file attributes - uint16_t zip64; // zip64 extension mode - - const char *filename; // filename string - const uint8_t *extrafield; // extrafield data - const char *comment; // comment string - -#ifdef HAVE_AES - uint16_t aes_version; // winzip aes extension if not 0 - uint8_t aes_encryption_mode; // winzip aes encryption mode -#endif -} mz_zip_file; - -/***************************************************************************/ - -extern void * mz_zip_open(void *stream, int32_t mode); -// Create a zip file, no delete file in zip functionality - -extern int32_t mz_zip_close(void *handle); -// Close the zip file - -extern int32_t mz_zip_get_comment(void *handle, const char **comment); -// Get a pointer to the global comment - -extern int32_t mz_zip_set_comment(void *handle, const char *comment); -// Set the global comment used for writing zip file - -extern int32_t mz_zip_get_version_madeby(void *handle, uint16_t *version_madeby); -// Get the version made by - -extern int32_t mz_zip_set_version_madeby(void *handle, uint16_t version_madeby); -// Set the version made by used for writing zip file - -extern int32_t mz_zip_entry_write_open(void *handle, const mz_zip_file *file_info, - int16_t compress_level, const char *password); -// Open for writing the current file in the zip file - -extern int32_t mz_zip_entry_write(void *handle, const void *buf, uint32_t len); -// Write bytes from the current file in the zip file - -extern int32_t mz_zip_entry_read_open(void *handle, int16_t raw, const char *password); -// Open for reading the current file in the zip file - -extern int32_t mz_zip_entry_read(void *handle, void *buf, uint32_t len); -// Read bytes from the current file in the zip file - -extern int32_t mz_zip_entry_get_info(void *handle, mz_zip_file **file_info); -// Get info about the current file, only valid while current entry is open - -extern int32_t mz_zip_entry_get_local_info(void *handle, mz_zip_file **local_file_info); -// Get local info about the current file, only valid while current entry is being read - -extern int32_t mz_zip_entry_close_raw(void *handle, uint64_t uncompressed_size, uint32_t crc32); -// Close the current file in the zip file where raw is compressed data - -extern int32_t mz_zip_entry_close(void *handle); -// Close the current file in the zip file - -/***************************************************************************/ - -extern int32_t mz_zip_get_number_entry(void *handle, int64_t *number_entry); -// Get the total number of entries - -extern int32_t mz_zip_get_disk_number_with_cd(void *handle, uint32_t *disk_number_with_cd); -// Get the the disk number containing the central directory record - -extern int64_t mz_zip_get_entry(void *handle); -// Return offset of the current entry in the zip file - -extern int32_t mz_zip_goto_entry(void *handle, uint64_t cd_pos); -// Go to specified entry in the zip file - -extern int32_t mz_zip_goto_first_entry(void *handle); -// Go to the first entry in the zip file - -extern int32_t mz_zip_goto_next_entry(void *handle); -// Go to the next entry in the zip file or MZ_END_OF_LIST if reaching the end - -typedef int32_t (*mz_filename_compare_cb)(void *handle, const char *filename1, const char *filename2); -extern int32_t mz_zip_locate_entry(void *handle, const char *filename, - mz_filename_compare_cb filename_compare_cb); -// Locate the file with the specified name in the zip file or MZ_END_LIST if not found - -/***************************************************************************/ - -int32_t mz_zip_attrib_is_dir(int32_t attributes, int32_t version_madeby); -// Checks to see if the attribute is a directory based on platform - -int32_t mz_zip_dosdate_to_tm(uint64_t dos_date, struct tm *ptm); -// Convert dos date/time format to struct tm - -time_t mz_zip_dosdate_to_time_t(uint64_t dos_date); -// Convert dos date/time format to time_t - -int32_t mz_zip_time_t_to_tm(time_t unix_time, struct tm *ptm); -// Convert time_t to time struct - -uint32_t mz_zip_time_t_to_dos_date(time_t unix_time); -// Convert time_t to dos date/time format - -uint32_t mz_zip_tm_to_dosdate(const struct tm *ptm); -// Convert struct tm to dos date/time format - -int32_t mz_zip_ntfs_to_unix_time(uint64_t ntfs_time, time_t *unix_time); -// Convert ntfs time to unix time - -int32_t mz_zip_unix_to_ntfs_time(time_t unix_time, uint64_t *ntfs_time); -// Convert unix time to ntfs time - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif /* _ZIP_H */ diff --git a/game/client/third/minizip/test/empty.zip b/game/client/third/minizip/test/empty.zip deleted file mode 100755 index 15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22 NcmWIWW@Tf*000g10H*)| diff --git a/game/client/third/minizip/test/test.c b/game/client/third/minizip/test/test.c deleted file mode 100755 index 5b8bb1e7..00000000 --- a/game/client/third/minizip/test/test.c +++ /dev/null @@ -1,331 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "mz.h" -#include "mz_os.h" -#include "mz_strm.h" -#include "mz_strm_mem.h" -#include "mz_strm_bzip.h" -#include "mz_strm_crypt.h" -#include "mz_strm_aes.h" -#include "mz_strm_zlib.h" -#include "mz_zip.h" - - -/***************************************************************************/ - -void test_encrypt(char *method, mz_stream_create_cb crypt_create, char *password) -{ - char buf[UINT16_MAX]; - int16_t read = 0; - int16_t written = 0; - void *out_stream = NULL; - void *in_stream = NULL; - void *crypt_out_stream = NULL; - char filename[120]; - - mz_stream_os_create(&in_stream); - - if (mz_stream_os_open(in_stream, "LICENSE", MZ_OPEN_MODE_READ) == MZ_OK) - { - read = mz_stream_os_read(in_stream, buf, UINT16_MAX); - mz_stream_os_close(in_stream); - } - - mz_stream_os_delete(&in_stream); - mz_stream_os_create(&out_stream); - - snprintf(filename, sizeof(filename), "LICENSE.encrypt.%s", method); - if (mz_stream_os_open(out_stream, filename, MZ_OPEN_MODE_CREATE | MZ_OPEN_MODE_WRITE) == MZ_OK) - { - crypt_create(&crypt_out_stream); - - mz_stream_set_base(crypt_out_stream, out_stream); - - if (mz_stream_open(crypt_out_stream, password, MZ_OPEN_MODE_WRITE) == MZ_OK) - { - written = mz_stream_write(crypt_out_stream, buf, read); - mz_stream_close(crypt_out_stream); - } - - mz_stream_delete(&crypt_out_stream); - - mz_stream_os_close(out_stream); - - printf("%s encrypted %d\n", filename, written); - } - - mz_stream_os_delete(&out_stream); - mz_stream_os_create(&in_stream); - - if (mz_stream_os_open(in_stream, filename, MZ_OPEN_MODE_READ) == MZ_OK) - { - crypt_create(&crypt_out_stream); - - mz_stream_set_base(crypt_out_stream, in_stream); - - if (mz_stream_open(crypt_out_stream, password, MZ_OPEN_MODE_READ) == MZ_OK) - { - read = mz_stream_read(crypt_out_stream, buf, read); - mz_stream_close(crypt_out_stream); - } - - mz_stream_delete(&crypt_out_stream); - - mz_stream_os_close(in_stream); - - printf("%s decrypted %d\n", filename, read); - } - - mz_stream_os_delete(&in_stream); - mz_stream_os_create(&out_stream); - - snprintf(filename, sizeof(filename), "LICENSE.decrypt.%s", method); - if (mz_stream_os_open(out_stream, filename, MZ_OPEN_MODE_CREATE | MZ_OPEN_MODE_WRITE) == MZ_OK) - { - mz_stream_os_write(out_stream, buf, read); - mz_stream_os_close(out_stream); - } - - mz_stream_os_delete(&out_stream); -} - -void test_compress(char *method, mz_stream_create_cb create_compress) -{ - char buf[UINT16_MAX]; - int16_t read = 0; - uint64_t total_in = 0; - uint64_t total_out = 0; - void *crc_in_stream = NULL; - void *in_stream = NULL; - void *out_stream = NULL; - void *deflate_stream = NULL; - void *inflate_stream = NULL; - uint32_t crc32 = 0; - char filename[120]; - - printf("Testing compress %s\n", method); - - mz_stream_os_create(&in_stream); - - if (mz_stream_os_open(in_stream, "LICENSE", MZ_OPEN_MODE_READ) == MZ_OK) - { - - mz_stream_crc32_create(&crc_in_stream); - mz_stream_set_base(crc_in_stream, in_stream); - mz_stream_crc32_open(crc_in_stream, NULL, MZ_OPEN_MODE_READ); - read = mz_stream_read(crc_in_stream, buf, UINT16_MAX); - crc32 = mz_stream_crc32_get_value(crc_in_stream); - mz_stream_close(crc_in_stream); - mz_stream_crc32_delete(&crc_in_stream); - - mz_stream_os_close(in_stream); - } - - mz_stream_os_delete(&in_stream); - - if (read < 0) - { - printf("Failed to read LICENSE\n"); - return; - } - - printf("LICENSE crc 0x%08x\n", crc32); - - mz_stream_os_create(&out_stream); - - snprintf(filename, sizeof(filename), "LICENSE.deflate.%s", method); - if (mz_stream_os_open(out_stream, filename, MZ_OPEN_MODE_CREATE | MZ_OPEN_MODE_WRITE) == MZ_OK) - { - create_compress(&deflate_stream); - mz_stream_set_base(deflate_stream, out_stream); - - mz_stream_open(deflate_stream, NULL, MZ_OPEN_MODE_WRITE); - mz_stream_write(deflate_stream, buf, read); - mz_stream_close(deflate_stream); - - mz_stream_get_prop_int64(deflate_stream, MZ_STREAM_PROP_TOTAL_IN, &total_in); - mz_stream_get_prop_int64(deflate_stream, MZ_STREAM_PROP_TOTAL_OUT, &total_out); - - mz_stream_delete(&deflate_stream); - - printf("%s compressed from %u to %u\n", filename, (uint32_t)total_in, (uint32_t)total_out); - - mz_stream_os_close(out_stream); - } - - mz_stream_os_delete(&out_stream); - mz_stream_os_create(&in_stream); - - if (mz_stream_os_open(in_stream, filename, MZ_OPEN_MODE_READ) == MZ_OK) - { - create_compress(&inflate_stream); - mz_stream_set_base(inflate_stream, in_stream); - - mz_stream_open(inflate_stream, NULL, MZ_OPEN_MODE_READ); - read = mz_stream_read(inflate_stream, buf, UINT16_MAX); - mz_stream_close(inflate_stream); - - mz_stream_get_prop_int64(inflate_stream, MZ_STREAM_PROP_TOTAL_IN, &total_in); - mz_stream_get_prop_int64(inflate_stream, MZ_STREAM_PROP_TOTAL_OUT, &total_out); - - mz_stream_delete(&inflate_stream); - - mz_stream_os_close(in_stream); - - printf("%s uncompressed from %u to %u\n", filename, (uint32_t)total_in, (uint32_t)total_out); - } - - mz_stream_os_delete(&in_stream); - mz_stream_os_create(&out_stream); - - snprintf(filename, sizeof(filename), "LICENSE.inflate.%s", method); - if (mz_stream_os_open(out_stream, filename, MZ_OPEN_MODE_CREATE | MZ_OPEN_MODE_WRITE) == MZ_OK) - { - mz_stream_crc32_create(&crc_in_stream); - mz_stream_crc32_open(crc_in_stream, NULL, MZ_OPEN_MODE_WRITE); - - mz_stream_set_base(crc_in_stream, in_stream); - if (mz_stream_write(crc_in_stream, buf, read) != read) - printf("Failed to write %s\n", filename); - - crc32 = mz_stream_crc32_get_value(crc_in_stream); - - mz_stream_close(crc_in_stream); - mz_stream_delete(&crc_in_stream); - - mz_stream_os_close(out_stream); - - printf("%s crc 0x%08x\n", filename, crc32); - } - - mz_stream_os_delete(&out_stream); -} - -/***************************************************************************/ - -void test_aes() -{ - test_encrypt("aes", mz_stream_aes_create, "hello"); -} - -void test_crypt() -{ - test_encrypt("crypt", mz_stream_crypt_create, "hello"); -} - -void test_zlib() -{ - test_compress("zlib", mz_stream_zlib_create); -} - -void test_bzip() -{ - test_compress("bzip", mz_stream_bzip_create); -} - -/***************************************************************************/ - -void test_zip_mem() -{ - mz_zip_file file_info = { 0 }; - void *read_mem_stream = NULL; - void *write_mem_stream = NULL; - void *os_stream = NULL; - void *zip_handle = NULL; - int32_t written = 0; - int32_t read = 0; - int32_t text_size = 0; - int32_t buffer_size = 0; - int32_t err = MZ_OK; - char *buffer_ptr = NULL; - char *password = "1234"; - char *text_name = "test"; - char *text_ptr = "test string"; - char temp[120]; - - - text_size = (int32_t)strlen(text_ptr); - - // Write zip to memory stream - mz_stream_mem_create(&write_mem_stream); - mz_stream_mem_set_grow_size(write_mem_stream, 128 * 1024); - mz_stream_open(write_mem_stream, NULL, MZ_OPEN_MODE_CREATE); - - zip_handle = mz_zip_open(write_mem_stream, MZ_OPEN_MODE_READWRITE); - - if (zip_handle != NULL) - { - file_info.version_madeby = MZ_VERSION_MADEBY; - file_info.compression_method = MZ_COMPRESS_METHOD_DEFLATE; - file_info.filename = text_name; - file_info.uncompressed_size = text_size; - file_info.aes_version = MZ_AES_VERSION; - - err = mz_zip_entry_write_open(zip_handle, &file_info, MZ_COMPRESS_LEVEL_DEFAULT, password); - if (err == MZ_OK) - { - written = mz_zip_entry_write(zip_handle, text_ptr, text_size); - if (written < MZ_OK) - err = written; - mz_zip_entry_close(zip_handle); - } - - mz_zip_close(zip_handle); - } - else - { - err = MZ_INTERNAL_ERROR; - } - - mz_stream_mem_get_buffer(write_mem_stream, (void **)&buffer_ptr); - mz_stream_mem_seek(write_mem_stream, 0, MZ_SEEK_END); - buffer_size = (int32_t)mz_stream_mem_tell(write_mem_stream); - - if (err == MZ_OK) - { - // Create a zip file on disk for inspection - mz_stream_os_create(&os_stream); - mz_stream_os_open(os_stream, "mytest.zip", MZ_OPEN_MODE_WRITE | MZ_OPEN_MODE_CREATE); - mz_stream_os_write(os_stream, buffer_ptr, buffer_size); - mz_stream_os_close(os_stream); - mz_stream_os_delete(&os_stream); - } - - if (err == MZ_OK) - { - // Read from a memory stream - mz_stream_mem_create(&read_mem_stream); - mz_stream_mem_set_buffer(read_mem_stream, buffer_ptr, buffer_size); - mz_stream_open(read_mem_stream, NULL, MZ_OPEN_MODE_READ); - - zip_handle = mz_zip_open(read_mem_stream, MZ_OPEN_MODE_READ); - - if (zip_handle != NULL) - { - err = mz_zip_goto_first_entry(zip_handle); - if (err == MZ_OK) - err = mz_zip_entry_read_open(zip_handle, 0, password); - if (err == MZ_OK) - read = mz_zip_entry_read(zip_handle, temp, sizeof(temp)); - - mz_zip_entry_close(zip_handle); - mz_zip_close(zip_handle); - } - - mz_stream_mem_close(&read_mem_stream); - mz_stream_mem_delete(&read_mem_stream); - read_mem_stream = NULL; - } - - mz_stream_mem_close(write_mem_stream); - mz_stream_mem_delete(&write_mem_stream); - write_mem_stream = NULL; -} - - -/***************************************************************************/ diff --git a/game/client/third/minizip/test/test.h b/game/client/third/minizip/test/test.h deleted file mode 100755 index 8471aa3d..00000000 --- a/game/client/third/minizip/test/test.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _MZ_TEST_H -#define _MZ_TEST_H - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************/ - -void test_aes(); -void test_crypt(); -void test_inflate(); -void test_deflate(); -void test_bzip(); -void test_zip_mem(); - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif \ No newline at end of file diff --git a/game/client/third/minizip/test/test.py b/game/client/third/minizip/test/test.py deleted file mode 100755 index 160c067c..00000000 --- a/game/client/third/minizip/test/test.py +++ /dev/null @@ -1,202 +0,0 @@ -import os -import sys -import stat -import argparse -import glob -import shutil -import fnmatch -import time -import struct -import numpy -import random -import pprint -import hashlib -from sys import platform - -parser = argparse.ArgumentParser(description='Test script') -parser.add_argument('--exe_dir', help='Built exes directory', default=None, action='store', required=False) -args, unknown = parser.parse_known_args() - -def hash_file_sha1(path): - sha1 = hashlib.sha1() - with open(path, 'rb') as f: - while True: - data = f.read(8192) - if not data: - break - sha1.update(data) - return sha1.hexdigest() - -def find_files(directory, pattern, recursive = True): - if directory == '': - directory = os.getcwd() - if recursive: - items = os.walk(directory) - else: - items = [next(os.walk(directory))] - for root, dirs, files in items: - for basename in files: - if fnmatch.fnmatch(basename, pattern): - filename = os.path.join(root, basename) - yield filename - -def erase_file(path): - #print('Deleting {0}'.format(path)) - os.chmod(path, stat.S_IWUSR) - os.remove(path) - -def erase_files(search_pattern): - search_dir, match = os.path.split(search_pattern) - for path in find_files(search_dir, match): - erase_file(path) - -def erase_dir(path): - if not os.path.exists(path): - return - print('Erasing dir {0}'.format(path)) - # shutil.rmtree doesn't work well and sometimes can't delete - for root, dirs, files in os.walk(path, topdown=False): - for name in files: - filename = os.path.join(root, name) - success = False - while not success: - try: - erase_file(filename) - success = True - except: - time.sleep(4) - pass - for name in dirs: - os.rmdir(os.path.join(root, name)) - os.rmdir(path) - -def get_exec(name): - global args - if platform == 'win32': - name += '.exe' - if args.exe_dir is not None: - return os.path.join(args.exe_dir, name) - return name - -def get_files_info(path): - if os.path.isfile(path): - return { - path: { - 'hash': hash_file_sha1(path), - 'size': os.path.getsize(path) - } - } - info = {} - for root, dirs, files in os.walk(path): - path = root.split(os.sep) - for path in files: - info.update(get_files_info(path)) - return info - -def create_random_file(path, size): - if os.path.exists(path): - return - with open(path, 'wb') as fout: - i = 0 - while size > 0: - if i == 0 or i % 400000 == 0: - data = numpy.random.rand(100000) - floatlist = numpy.squeeze(numpy.asarray(data)) - buf = struct.pack('%sf' % len(floatlist), *floatlist) - fout.write(buf) - size -= len(buf) - i += 1 - -def zip(zip_file, zip_args, files): - cmd = '{0} {1} {2} {3}'.format(get_exec('minizip'), zip_args, zip_file, ' '.join(files)) - print cmd - err = os.system(cmd) - if (err != 0): - print('Zip returned error code {0}'.format(err)) - sys.exit(err) - -def list(zip_file): - cmd = '{0} -l {1}'.format(get_exec('minizip'), zip_file) - print cmd - err = os.system(cmd) - if (err != 0): - print('List returned error code {0}'.format(err)) - sys.exit(err) - -def unzip(zip_file, dest_dir, unzip_args = ''): - cmd = '{0} -x {1} -d {2} {3}'.format(get_exec('minizip'), unzip_args, dest_dir, zip_file) - print cmd - err = os.system(cmd) - if (err != 0): - print('Unzip returned error code {0}'.format(err)) - sys.exit(err) - -def zip_list_unzip(zip_file, dest_dir, zip_args, unzip_args, files): - # Single test run - original_infos = {} - for (i, path) in enumerate(files): - original_infos.update(get_files_info(path)) - print original_infos - - erase_files(zip_file[0:-2] + "*") - erase_dir(dest_dir) - - zip(zip_file, zip_args, files) - list(zip_file) - unzip(zip_file, dest_dir, unzip_args) - - new_infos = {} - for (i, path) in enumerate(files): - new_infos.update(get_files_info(path)) - - if (' '.join(original_infos) != ' '.join(new_infos)): - print('Infos do not match') - print('Original: ') - pprint(original_infos) - print('New: ') - print(new_infos) - -def file_tests(method, zip_arg = '', unzip_arg = ''): - print('Testing {0} on Single File'.format(method)) - zip_list_unzip('test.zip', 'out', zip_arg, unzip_arg, ['test.c']) - print('Testing {0} on Two Files'.format(method)) - zip_list_unzip('test.zip', 'out', zip_arg, unzip_arg, ['test.c', 'test.h']) - print('Testing {0} Directory'.format(method)) - zip_list_unzip('test.zip', 'out', zip_arg, unzip_arg, ['repo']) - print('Testing {0} 1MB file'.format(method)) - create_random_file('1MB.dat', 1 * 1024 * 1024) - zip_list_unzip('test.zip', 'out', zip_arg, unzip_arg, ['1MB.dat']) - print('Testing {0} 50MB file'.format(method)) - create_random_file('50MB.dat', 50 * 1024 * 1024) - zip_list_unzip('test.zip', 'out', zip_arg, unzip_arg, ['50MB.dat']) - -def compression_method_tests(method = '', zip_arg = '', unzip_arg = ''): - method = method + ' ' if method != '' else '' - file_tests(method + 'Deflate', zip_arg, unzip_arg) - file_tests(method + 'Raw', '-0 ' + zip_arg, unzip_arg) - file_tests(method + 'BZIP2', '-b ' + zip_arg, unzip_arg) - file_tests(method + 'LZMA', '-m ' + zip_arg, unzip_arg) - -def encryption_tests(): - compression_method_tests('Crypt', '-p 1234567890', '-p 1234567890') - compression_method_tests('AES', '-s -p 1234567890', '-p 1234567890') - -def empty_zip_test(): - unzip('empty.zip', 'out') - -def sfx_zip_test(): - org_exe = get_exec('minizip') - sfx_exe = org_exe.replace('.exe', '') + '_sfx.exe' - shutil.copyfile(org_exe, sfx_exe) - zip_list_unzip(sfx_exe, 'out', '-a', '', [ 'test.c', 'test.h' ]) - -if not os.path.exists('repo'): - os.system('git clone https://github.com/nmoinvaz/minizip repo') - -# Run tests -empty_zip_test() -sfx_zip_test() -compression_method_tests() -encryption_tests() -compression_method_tests('Disk Span', '-k 1024', '') -compression_method_tests('Buffered', '-u', '-u') diff --git a/game/client/touch.cpp b/game/client/touch.cpp index efc258b6..4afe890f 100644 --- a/game/client/touch.cpp +++ b/game/client/touch.cpp @@ -8,7 +8,6 @@ #include "cdll_int.h" #include "ienginevgui.h" #include "in_buttons.h" -#include "base_texture.h" #include "filesystem.h" #include "tier0/icommandline.h" #include "vgui_controls/Button.h" @@ -233,14 +232,6 @@ CON_COMMAND( touch_toggleselection, "toggle visibility on selected button in edi void CTouchControls::Init() { - m_bHaveAssets = true; - if( getAssets() == 0 ) - { - m_bHaveAssets = false; - base_textureID = vgui::surface()->CreateNewTextureID(true); - vgui::surface()->DrawSetTextureRGBA( base_textureID, base_img_rgba, 120, 96, 0, true ); - } - int w,h; engine->GetScreenSize( w, h ); screen_w = w; screen_h = h; @@ -374,15 +365,6 @@ void CTouchControls::Frame() IN_Look(); - if( !m_bHaveAssets ) - { - vgui::surface()->DrawSetColor(255,255,255,255); - vgui::surface()->DrawSetTexture(base_textureID); - - const int off = 50; - vgui::surface()->DrawTexturedRect( off, off, screen_w*0.3f+off, 0.24f*screen_w+off ); - } - if( touch_enable.GetBool() && !enginevgui->IsGameUIVisible() ) Paint(); } diff --git a/game/client/touch.h b/game/client/touch.h index d4692a3e..2ba4daef 100644 --- a/game/client/touch.h +++ b/game/client/touch.h @@ -7,7 +7,6 @@ #include "usercmd.h" extern ConVar touch_enable; -extern "C" int getAssets(); #define GRID_COUNT touch_grid_count.GetInt() #define GRID_COUNT_X (GRID_COUNT) @@ -223,9 +222,6 @@ private: vgui::HFont textfont; int mouse_events; - int base_textureID; - - bool m_bHaveAssets; float screen_h, screen_w; }; diff --git a/game/shared/saverestore.cpp b/game/shared/saverestore.cpp index 36025baf..bd1a7bef 100644 --- a/game/shared/saverestore.cpp +++ b/game/shared/saverestore.cpp @@ -112,7 +112,7 @@ static void Matrix3x4Offset( matrix3x4_t& dest, const matrix3x4_t& matrixIn, con // This does the necessary casting / extract to grab a pointer to a member function as a void * // UNDONE: Cast to BASEPTR or something else here? -#define EXTRACT_INPUTFUNC_FUNCTIONPTR(x) (*(inputfunc_t **)(&(x))) +//#define EXTRACT_INPUTFUNC_FUNCTIONPTR(x) (*(inputfunc_t **)(&(x))) //----------------------------------------------------------------------------- // Purpose: Search this datamap for the name of this member function @@ -120,7 +120,7 @@ static void Matrix3x4Offset( matrix3x4_t& dest, const matrix3x4_t& matrixIn, con // Input : *function - pointer to member function // Output : const char * - function name //----------------------------------------------------------------------------- -const char *UTIL_FunctionToName( datamap_t *pMap, inputfunc_t *function ) +const char *UTIL_FunctionToName( datamap_t *pMap, inputfunc_t function ) { while ( pMap ) { @@ -135,7 +135,7 @@ const char *UTIL_FunctionToName( datamap_t *pMap, inputfunc_t *function ) #else #error #endif - inputfunc_t *pTest = EXTRACT_INPUTFUNC_FUNCTIONPTR(pMap->dataDesc[i].inputFunc); + inputfunc_t pTest = pMap->dataDesc[i].inputFunc; if ( pTest == function ) return pMap->dataDesc[i].fieldName; @@ -1140,7 +1140,7 @@ void CSave::WritePositionVector( const Vector *value, int count ) void CSave::WriteFunction( datamap_t *pRootMap, const char *pname, inputfunc_t **data, int count ) { AssertMsg( count == 1, "Arrays of functions not presently supported" ); - const char *functionName = UTIL_FunctionToName( pRootMap, *data ); + const char *functionName = UTIL_FunctionToName( pRootMap, *(inputfunc_t*)data ); if ( !functionName ) { Warning( "Invalid function pointer in entity!\n" ); diff --git a/gameui/wscript b/gameui/wscript index 76473ce2..72e4221e 100755 --- a/gameui/wscript +++ b/gameui/wscript @@ -13,6 +13,7 @@ def options(opt): def configure(conf): conf.define('GAMEUI_EXPORTS',1) + conf.define('NO_STEAM',1) conf.define('VERSION_SAFE_STEAM_API_INTERFACES',1) def build(bld): diff --git a/launcher/android.cpp b/launcher/android.cpp index 337952ea..226c05ca 100644 --- a/launcher/android.cpp +++ b/launcher/android.cpp @@ -114,12 +114,11 @@ void SetLauncherArgs() D(binPath); D("-console"); - A("-game", "hl2mp"); D("-nouserclip"); parseArgs(java_args); - D("-windowed"); + D("-fullscreen"); D("-nosteam"); D("-insecure"); } diff --git a/lib/android/armeabi-v7a/libandroid_support.a b/lib/android/armeabi-v7a/libandroid_support.a index c19cd8cca93c3637b64e2f06c54dc631a010910c..30f91ca15ced7ae3bab060b6b0f1e426ef9b7e94 100644 GIT binary patch delta 279818 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%0DCyE{ECfgi{80i@3YnU&xK>dec&g~zdNwo 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 f9Nt7yV# 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 z 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 z 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

MGwKvtm$zPT8 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˒jcK}0(Lvz6X^^|dEaZ8fjymy{ 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͜ZwPxIZv$o3dBVdMmh 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
M3y$+-;dohi2%3)n8`gE` zM2$uce;(pL#`6b&&w35l?3*FfV1JX3QiYfBaf^>F$FLQ4rH=};!dFn0D}8UFJlH}o z%~ie_^$G?*vWU5d(%`|JEHkMswBgP;9DGg$0r29`|R{w03q90>14 zYx7_1XI~E4Sugc7>xiB8C4LTyy}~tY2AAR=o8zxorI(3gWVk1u`!AO*OJSHloAF

#0;pJcD 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 zŵ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�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%0D@bqd1ofxty!H ziQ9OTCwY-qd4~`9oUa+|bzo;GMqm`iW_%`NDrR67=4O7DV+f9^)xK;1ho4cSd~Uo-z&-Feme}3@fl2Yq9|wvkQB$9|v*-NAq7U;4-e_0UqIH zUgteN;%9zm)VG1XF`101n1NYXn8jI+mDrF?*oocPhd~_6iJZ%YT+Y?p#eF==lf1wy z{J<{^{w}aLG?Op|voRM-vMg({9-FWQ+p{x!vM&d7ILC4#=W-#Jb2T?{8xQaZPxCx) z@-Cn71>f^CgS~hE8G%t4kBOL)X_%SWnU957l4V(qHQ9iT*_IvIgS|O~BRGzeIFoa@ zn(MiZyLgaCd7hVfi}(0~Z}^$t8TLbkLSoY|S1g;%``yu+t_$zY${Pex!A#%6pbV=87~7UpF^ zmS7oHWewJ2BX(jp_F)i5a5N`z8vo@2F5@ch=6)XMXjK6>~B#i?SpuvMOt_9-FWQJFp9Tu^)$V6en;B=WrgEa0PdAFOTp9&+{^G@gAS@ zB|q~!Lw#|78HF(zpNW}<8JL~9S(GJNfmK+C4cLsW*pXd1lp{HwlR1n3a1obs4L5K* zck>j_@hWff1>f*9zcb?3K)jlsSJx`bzB#$f`cVp?WnE*4=4R%BH+VGFirXZB=Y4(4!< zFaf*9zcWdw+|18nEX9hf%37?)HtfJZ*@r_of)hA} zb2yL7xQd&&jr)0+=Xi zjBLwAkx)^GAHpi6gDeQP!U$`vMLDpGthk$lEV%By#IdlbsC!j3Zbcge@6fO)*CL~u zADmb>Dk|!xqW1ZG&U_Ax(}?X&Nw0`pD|*U7!oIl z9~A4w2Jt%aMsb$dDBdA15SNK7#Fb)Pd`RpPzbJl5{JQup@mcY|#H6@a{GRv&@yFs@ zVp_Dt?6$4^WJX<_RtQKp;3E~IEDdP3w3~{!2yLhL#M7&4*l=vC3Otit~gE%i*@2h#H+-c#2MmzaiQ2Ewu%pkZDOaG5T6jA6u&7xCGHe= ziF?I;;t#|(#Gi@36n`ZSiN6>BB%TzF(wuxoiDSe{@x9`O;`_zR#4E&W#p}d5;#_f= zxI$bjJ}hn#zbt-7+#`NZ{DJsm@h$Of@i*e1#J`Bfs9ZU{;u!I4@jUSY@nZ2(@hb5e z@p|zlagI1wyi;5xep>vjxK8|nxJm34pAerEpA(-KUlm^$-xPl;ro_YIpTxh2zFm8tyV81ZbeMywS-B3>m<6{m@F#XH1B;@#r?;^)LQ;zMFW>=ye(OY9eS zhXl__Fxl;+x`6#guqh{ImF1(HxVLN1<3QR*2_`7lQ}YVet`hlh`YMP5h>~L)Jm@qfgkvvTG4i|-N76>G(?_!03cafUcsTqNEten$Mf*d?wP zzbt-L{FeB%xLbTh+%FyweTc(G2LC|)IA zBSyqo;vM1wajCdmTq8atCd6*>%i>qXZ;4Nf|0TXC?iKfmKM{W>X2f5KzY%{go)Axp zo(i=O@hq`Y94B5V){0^AL*hro>&2VITf|$%sMsW~5I-$`UR*6cBzB2?q9uM+{D%0n z_?-BnxLe#O?ib$>e@ z6^fv7YvT9CpNna6P&_LBN&Jgga86EMMdI1wIpX=^`^53$1aYERFWw;DEY1<JJSe8b!{TxAglJUd=HMMkBgSLRoo%&6u&Ee zPyCViWAPVaMtocRjd)x5 zELMnB;&^d_*dR_8XNq&gMdICJi`XhYAhwAQi;sv;h);_DDLx}UFTNxm5C_D=;-L6D z@sFY>r1FYqi|2^vi|-S!5U&)k7jF`85pNZji1&z}7gvkx#f@U0Xo+7Hzac&^z9fEE z{GK=<9u(gee^}7jF@p#Kqz=afP^2 zjEifr7A&(F!nCkDijSS?;Ien^}m zUN7D%enM;(V`7nk^Hun^Gf3hbQU%#)7$LDn42u)R1`%-H^NKz(AUg3O-YU66VzubR z3;#N~o%rFdmwT!>O^k@M#HiRLE*6``nAjr5#dfhn>=b*%KG71liv8jaai_RT+$ZiA z4~PR|iflBD!{VTLR6HS`6b&;M9>*P=_h5!}2y=r&EDs!Fcy(AqLVmSkSgaEp#L41R zahljD&J&|zlek!H7Gq+I7#G{c4zW{Ah~1(kZWXtQ+r@ryhnOTGzrErKCkE#17c7t7c0anu|}*F z!(yE{QLGmm#L41RahljD&J&|zlNb|Q#8z>o*dca`39(zW#I52sal5!v+$AQ(z2ZJ` zzj#nQB&Ni};xX~KctSiW8ikU-7!=FJ3b9HIiPd6_SSwBx>%|6fvKSF(iH+hsak1De z#>5seF1CvuVyD<6_KB9bRqPjch&#ny;y!V|ct9Kw4~mDxLGh?~Ogt{05KoE*CO~Y@ zUePB8#0s%W42jiZjaVyM;oGeZir->19me?rH6BmokVoYoiTg8=PhuA45#BQ-i z>=U<%+r@ryhqzPRCGHdViwDF3F(n=r2gRe}3Gt+86ifc1PYj4bv0My^)nbiUD^3*a z#RhS*7!hZQjp95pDmIBRu|;eZSBi15T}+7GVvpD-ZWFhQ{o)QWDee{biTlNa;vq35 z9u^11qv8qiq-gjgZ!svAixpy(SR>YoVX;n}DAtQp#c5(hoFz7j^TfqsvltUw#8z>o z*dca`39(zW#I52sal5!v+$AQ(z2X6JKs+cO5>w(~aZo%e9utp?C&ZJYF+%beePTci zisfR3SS5zUYOzMF6~khkI8m$@8^p=tRB@UZ5od{w;yf`bHi?VHW-%tVh^^vEF)p@? z9b%`L5WB@5u}|D4ZWsH-9pX-LmzWgyiU-62@t}A}Oo@lZLGh?~LOdxNe$}Vw69Zy} zSS5zUYB4Ow~5=uesPDG z6!(hz#Qowy@sOAj4~xgdIBAL+lh2Vz<~M_KDlX?P9;ULrjW$#eL#_@qjoWro_YIpmgA$E(FxK-RHZWnioyTqipSKKG=7Y~R7VoE$L4vI&`W8!hq7$yA{ zePTeY5Ua$HSS^OdI&q>{FE)si#i`;nu~D2SM#Uy^vDhre#1^qtTq(xIcCkb36cb{% z*dz9dmbg{iCTENrIEU{6XCoUG7#hBP4#>IBAgT#JD zr8zPq0qlYfi+JLOKu-6yxZFS=9iUGjJKH4)!I zxt)DYxSf4Xj1g!_d219-;r1W8=ga@WXRFL#67jdIVEJ0^FF+}(1!`-VH@cJ~FH z{Xe8PpzzLq9^CGJUXc0&ce(V)*{_599s6}~*U7&@;U~)-mAgsqnA|OLcgyYWt2z5< zh_7G%&ORC3`{X{X@b12tkNYt24`@H8R&IA6YnI%N@^|)`5I!zzro!ytUC+|E7=+|E8rBlgJ^-rYwzEVsK);_QDQ zyu1Gqq+K5FauV-Pl)GN;sN78?>bOz>mfS6JyLM~GK8^Uhh5aTjjrBZr3h)TyEFSSx&nf(yx&HtzPa1 zxgC2W{9SvaV^4(JwI}XW_+1L`*!$q`+WQRJmEiWuz7&$XTJEWGPm|lRuOYl^UvunY za9i@YPsv>ZjgJi+^)T)TW;5m;@C+LpKB*M zB!AZqf?@C9`a2JyFr=`%aQ^D>@5x`t0igSG{?5U_P$8qiaiRSz^%`-=`dqmAKEpxP zjSJ;Q_v`$Hf2kXRVflA4E{6ZV!ZAPj`D1*v`M7^>{x~nm&)?Sjy#~i*<_}%tsr+4o zd&UQqaQ?i%!I*?T!u@mOyBQA{&duLM$Qu8h`g6nGfG7FsmVef3G$>t`&y~xaxMzHq z;o@H{eusBQ?$-I2;pl&#=sd(f{9WHaMd*|JbMNkjGe6x~7_fqvEU~<(mQ(4j!oB+r zZjCpm6gYi5@A>EYZOFUl^BZq0Fdo2JLif+Tdjt>i(`}kqXapykPP#DloJ#jgxOd-S z9Q&7fj0kV^=lXpS?)>;#VnvRQu^d?Ho{H~T+`I4K)~Lb+A&I%G`{(*Sg$McZ?Ld6T z5EBoyrD?i+SeGK)6XYQXH?g$?6-u-(O;qw1nKm07^JHqWpI4>(gf9_lO zncjDlV+YE?J!zKXJ-FO*aGngEkLh*ez%;MZR$aH7E|$Tk+6MjphHw?GC*1BW>9#e7 zE58ZlMZLWj_skR1W%(&%x2@sUsGjdN{(-*K{d41Mxj(jW!X?Wt4e2lJ-hjFL+`m`U z)j2*BCWbG+!g&<+KXC1|DW>Vh#5~rV%BPdgE+?mjb&jJ3vZ*wTWWx4_67~pV{a~PG zb=sKNmi8Dk(g?W@qtgXwp_jjR_|mj#SXr{!OxUEiVZ7bm5YL!ND?Q5C0rT5-T-~@j z2k~Ck+pzgC!|k~8K)OG?JI!bL@%S3Xzr8IS&+H9ZS;U?81g-QxhKGO6aK8A9gXNbY zUr56+W@d{F%QMz6{N=_5#62r(G^|3NaZPFqdO}tix=X*$*kJpNRrWmNQQI4C%dlL5 z0>M?8-wzK%0H^bM%pCuA`PB*Ah*`+*tnB58 z*9_zTj2E_WJ3VU{GdvhiFe8|mtu-LLcsJ6VPT5TG8P+(=@{m`<-x2M$jp-;;^3fxn ze7Nl$@l*COWBl8$>@mLhjp%yhcY_@;W~Ythst+Qb%b{r>h#AV0F)xee=I@9g z%p~Q-*m%TatakFkI$-(vev!F4j=Z)7#;uM+&w9P#)rTQll^rrcy}9w4VZ;@*vO(xe z9nv=%th5<|Y#|r=)k7Ykf_6IyooSu0-ZsN++13fG934Gz&G@&gpa*=%6S301Xu>w* zkSFSw?-}84+k^a|UG^H`H|%iun#>5)Ey~+#7`J3SVaro!SY{yHjz`v*6KyXJR^uHn z(!QMO;@(JDY1hs84CB@;@&KJ#YyW0=`1zvff>e=lYkFvS`0EDhJixjNKa}x=SEo!P zhH&k82l|!huo-_}82JrZ+3HZ6QwB#T58RjuhPpDoApB6~fN?(J>B<l@nahGd&vWwhBLV~-sUw%HSLO%Am^i+X;(Dzv2#_snay{6JU6)hB#DZ?r+7 z&qW6}_Vu~N)X#~iD=*6dx!24dC^wQ;3KJAdyixxf4?`p(WXrM zAj4|pf$2;{orcg?9lIIvMRIkw^t?5hcygl?H|x>U&;Doq;L-IP?Yd~6z5I7;GPA$m zo(Wiw+vtnl_84CrobihrGjl%Ho-vHs*#KneG1}f{evI%YdP6-bnpEI-9psjx8(ymMa^r9m9 zxa|#fAHC}*vUWpJ?8ffxI@q_N2U?9mq?f0FcI>{vjFnK z=XBS?T`sqg++@%A81#z$6Y@hD_>z5ggU?C_3omeF6F{3_o&v$mc6n&CT@l`Fn-yq7 zHIO~x3kBQlnozr43q8)4moMCl_bsP6vhlhMY=sx6Og?BsUHA3G*-g<4yfMNC` zObogcL>>7Wpx;UK&B#}AxGPhfeBCypR{FCXBO(#BQ=`(0`irCP>Tppe7;F7TXoDkn zZwTW6WOEtfrR;;K#~AeK82W^xtDsAWtLV^;nToP4Hgy7W%^DH5tscAl<&E~X^hVo* zw5g|6G0LdRk)x49y(U?|58A|AaoK5V9*qI!^teKE@+|TcIy~lc1}}TQ}nC z*}c)W$~M~7=Wnz_muk&f{o zb$vIQ*lS}9V`wtu&$Jo0+0dS0zl!niEv8L<`<63?&dMH#K1@b^8Np3X9!>NK$A*Vr z%YP5!-)n(zkL|n*8L|%8?urgc@6jJE9v&WM`=hKVr(k$YrXY?oMq#yF8O{fz=kMWpD`=#jjYKWfIrixd}llIjbsa>YtQ}@(w=N= z&b2MHnL=aj5y*Jx#NUU9smGKL;>|M7>fm}OToK}_LOZCApxxkNyQ~63xah|;Vht}2 z;`z|Ak83^>M?9F1G-3QYw)RDzk?3~9Rv;d43}X(`U_2(qo(jY>3FFs@^;UXBs69p9 z_lB;{c*95+{VL}ooM-SIj>k;%AmZWsyzj>SLFKDkc?y-~{6o{*?GeHD6yq|`jt4Lv zByd%Y%f-w2#$Oa?hvGC6D8Df$+mUFuJ8_M$tTJ!JD#KdE?+daGJd|O&Ourc8q|aJo zQ|AAJc$mk+gq5C$xJ*1d9qyL&JjB(Q*lPz+Pk&aL<)eF?a|fc^Abk&-+nkv*fI-C;A|o@|;|2)}~TUxe}L ztSsUjV}>k`*?(~+?%iTrp}qDK{d?_g;dXnK{Z$-&SE>tb6!jMGwTnYm`lT!Org!0*8f=G7KzD;ydLr9@Jc9H& zpSIHP`FU5yi++>i-}?%oPY7csj7&Gm-h=*ZTVa>ohx^)OS7y82Wm|aGk7v~d8|{n3 zU6~zt7C>5|48j!U(yvH%*^i^I3;(Li_Wc8WInqPl=4al#7z@}3otgGrjZvd8|F26S zPZ%dh8DAK*F#htrYRDmk^6h(av%UY>&CVFQGVIR9Jkb5N>`KV(Vf4u>^V(~T(QdnL z&O3t9voaj}CgQm-zQ_J1@^xt3MtcCVE(kA3U4!wi4)N6EI(8Z6QK-YIxaYX@Qurt7 zv(e8Z-Hm2_+Xke!v5sSuQ z-6j`=f;+pwnM;%;shyJZMHnlh5xGv}iW0hNL2CN9{W+MORJ_=FS2L>T6Sd7TXTFs~fLB1nIl zvDuy)WFGEJd4lsHo7veA@?C+ts%GAU?e_J^H``n-!m-_jmFEulbt3F_?B_W@z`URq z@pF#A`2pJwb*=;PbmGd_`xd0z7t8g3X2Qx+KSD^;)tf+aE#`C3zvO1SVKL{TeS?%^ zO|+f!&%r8dtsUxLYx@%4wJ~QK`a|+Z=*#D2pBWy0i}NmDXpFr+^J?nVOHuFdU!5sP zeKBPuzLvS92JH>&abL(|dl4q_FT$9~c_@p=W_%nE`;bl?`KJ7s-#X+s-(3&)O$YxX+HwJ{_RM!{Lb9iM>ofccF2qG(cKAmN1i(YcW0iPV^ku~ z-H-99JI}ox?*93wDbEbGO4Cm%ADF?YL)|8UHc3o8c~UYzl^-&yW5+C(Cl^Wd$zIVNXE*TjygA z8$;iKcEI@`=TJriM4l^>R}j_7wE9HzGc!c{z!G1nc(fM{r+&b@U~m2k|-UL(Cn$1zp${ zveJ8lnD>QqWekL7Y`jduG(Xs>+kh6^Gb0OV1HISIzERRtld&BT}sliEERhWf&KgYt-E2a$$_@^;|8PF(EQ%CBBy ze;MtLbC3b8QG(H~4C|#Hb72$lu})0H6AVGdL9E}xU74oDM!S6ZMrR!Kp)X|H{E}fk z13h`(4BZR6fpvKh&mfyUtPAJ}#)>(PJ;~^&O=zwo2h*5~^@L*H-3vsw35jK9KWPp9R@QtUb`t*KibXs1xZie8AX* zEoJ5(^$^0`m~{ZTI`aX<8HhfZDKtBd6q*ko;argRwBK?4Lir^yUR$i6(|Ig`ULAt$ z0>Q3K8+9y*wNyN}j_`%(ey6T=7;7C}!x|KJH^dpY(m#;w*_Yk&%NsM4Gi4t}oSbub zA%hyqI|W%MF)lLyNQZMRu1{*D>t706&p^h{n?cwTgVyC<$lMIBg6yX|whs^DhmFa; z<(E16(vIXyp&vqg6-cKF@tq}ES3}mwPZ@N!vIhAqpOIT%-h@7YV_G$Ii+QIFGn(ki zaE)3X>Vj>H^TB71P_|x-jg)ga@?VSRZr(Y+W4>z{{u&F{eQM^Y#=9kaR{)aOq&fqE3+fp%O`lMG&qZCAL(b(Xgo#+$ zZE?yd*WM_vrqmamHW!Xy4hxyF?FAu=#c;dwqkgj9F_t_9*+2Uk)_-h82K9orhrT7Y z7WF?Ti|3W>M|~(~2r{K!agG~CJvJe&;soZSQLM)ie+B%j;13(cAnVMP5oN))PkpRo zeL^OT`!2*?mw+6?*P%b3N%y*P)EDPRBSKbs73be*zhR@xo{q4TV;E^a?(w9ISgwA9 z2+#WEnt^?D7-3k)i}B7JzLP}!n9r0z|C*5J5wJrCcCSt?Mn159K|YM3#fYQ8h^M^9 zmy!3GY1DCw>qO3v85b5qZ!vuFxD7{)evDz()tQnA$`rQJC1>a?%j)U^>)x4Tt3L>! z{=LT6ZQ3~;9nP!&r|^vR849t@e9^APeFfH^lp))pFNJo2zK-Q(Ir%>OxC-hl%Ny!? z8FjhaGhuboNLqUek!OQ@4awCwiZdf!fqexp#ut`rad0!%UAcHDFShNuYTIn-5n-AKYhXhcE)dzBYXIXe1bo~~rA&uTyW41sZkP~cpY@X)o^RrL5OOf<=?{6tHrxM+I@~|{ zbbdoUFNL0B{}%Jj#w_&joq3AV26jvOYK9H{*lt3aKS#bj)`JOsd3e7BcBC4NZ5)q&hyf@90I}5oNLXF_!9Muz9ovPzJH41xJ1LiK!LtkVS`cdq;Mpt3%%8j9pp2iR# z>Zu;(YQ1oa-TJ{Tc0uTolqU@PFWP+w?Pf8aFV1_8xsAgczf zG`@#4jPQ@0HsRWN**C#>p2k>K$^L}%5b6(~v#-S*-H}Zw$i3__S+)h!usj9WPc?(V z6#MT2JcrDk{8vM^v|GCGUyQtR&#C-Q?(xj#8pmY4a9@Mt4cuiIBRxLjG2|}wZb4q1e%0>_4ipbtYEaeW<^h3hF?ow!!uDw1rsp&gshiIsToN#vX9Vg2Q= z2w@I{vc+NdGUBwAaUT=&?C=K6Rjo0#nD;C=kt^>fm^bKuoNZ0(0Awey~3bdmrbbk8wWl%oSJ{ zm`e=B3UMF`S5#L7Mu2Dh^|9A;Os$pZr+oI`)sr zuKgpDTZ^%;_l97%4P%{=Kt7Nc^efIj2J6x1)W?kMm;SA__e1t%<_ES7wxy5!E!UQ5 z*QiA~Xb&jA^D(Dxp0->xuO!tF_+tLBHHNj17u|Do~W%4Zh5WL6n9PJw8c`l!@+w{iSCQ+vxS7^g=#})Qtum3rx zix`jmlqu!;9lUSC9$M0WC+2PsXZ9trcZIgi{T;UttAS2^33=Utcl?;Qm0;dxBK=G7 z{!_^BcBIL;9z?zJTt|U%Te=N%R@w%*k6VMYUDUH0&qusrgrj|je!(!# zvmh+rt*PGP=nU_f#!2MO1HCn|f5v{1d8EyV`7Fde^T~Ab)4*iClJo5~&{O7lDf0Oh zM`k&>V@yW%-bR~4CDvok+}71WhG(7hD*PhcKc?^-Aw#yS9?Xkbme1n-m00J&j+5aU zu@L#DR1l%ag7z;-Ho$Rn46$n`7*u^aSS5tQG}&`es~i)ogemN2pha$ zi|y7IL;CtLtbHaynb@wR37^wduYYp}GRQ>vp zcen3gnb1#Q?r5bqC_Lk0c;@}gu;};ERvypE6Jcn7Iy21g{xR&wcsWGn#xO2Dm9zI!H+-ST(Pz!% zI{yPayGffCItA=iKMq^PY2EXozQ&=CV|cztTOH=rS8_j}bA&xOs|tHO<}Airu?Yx+ zc%DN%IDdvU=;^ouxThb_t<-9~%lEI!3;S;Q`vl&FUDC1daa?xe$bWAl(!crAhnz7J za|in&q-7YnvU+h=nt6W!<3;S{Ep`m&4?-5t4CdC%7!xz){TN@_$M!>Z4VeETj(}yQ zuYj0iOB_$wrw6fK;`{r?<;H~V*hdKAJkBaUU`+q#`hS4>o%j6AJZ;7Lh4z8`{A|HH`EljH--C8Qc~CB{9I7Ed z%7XnRW$_Zi^pGp))mIG!if_eD#ZE=eei!cGGxES{;xQ6x(zT6*tMMgmo{a} zwgUagnROX6AF^%am9|7zmVEakc$e#yCNwr)Y_mKA;KP|*1M;MPj5Um}8_@%}&+SKh zlibspj(NDX2Ytw%Ld-2-%Nr_4VjkOo^Y`$>diO0a^2zZAYxOkNOwaS&aPj;pnIaQ= z0XVzB{ch(hG0tqb?&1m8WIPj4=PATx;M`zC;z&Uxal|y1rUJpG&bi{k2zKQRBjxqQ zQ;Y+$M0>EZu=zS?Oe@f@)Fok$YRL67u;)1I2g(`s;q>=~=nFC5!(1Qz#Ig%gdzMW} z(I$Yt;?%sO0(}AFH+{2VcZCfDvis|(oG$Wyhxe7VVdUBc-JI)t^W0vzeR*#7SL|ac ze}?DzE!ySi=HB__FwY%f{XfzAGS@)drz$o!5AL0?#@=bJv6E$M>|Nv5*h@#PaoQ>S zbDjTP|2*O6>3#6qkFW=*Gsf_6z+iljq?VM%Q73V}Glc%pIDvln*u6MoU@^~g zvIPmqyWdLl3|k0mAlhWn$BgmfEFb5@m|qX&_GKH>$pBYfwfp5gtM!dmj=U|UV;BBzrr34!v|se zDF{VVW^h5uZ$zE?=5yxDgMB8$c-UDFqn~r)IR;(j*;Ss=;h3`j=KbmMTtC4!6h^*Z zHI1PcaD5ZkleqTdT7qjnuG?_ooA;q+Tx)UNj4O=mB3$@iK@8!4r#0lqRefxE{vUh6{7hp=G%4!gU8OtQm%8;JOjlR9x5K!d!eP zgbVvQL)fPn8ilJ6S9cle2V(;Aa3xe7XWOxcrLLpz#`%pgA2p5Mo)Fq7&S+Bi3k=M? z^TL=2^BBVH_yE4q3GGQ2Ak3c}y`a5w)|dqR`t$sL>-gdO8)N1e$im+jI)J$M*x2XG z9)Vvs`va^AVTjLHx_a2^WZ8h1q&(8A9Wf9up zKwch}ArCLT|8)KkW+|bZ3+jw3@=|B&ibZ$mE&*i0qFsIU~LR=T- z#kCTC)rt!?!BcUSE3WI#$TPy6iVOdHZhv)NTuU6koW4B)xm4uI?9M#DUig*g`OSsj zGr?SWZqCcY9}$jnI|;i{zT6PzR34z<{%7)ZZz}wrR$TRYaiJq{;@WY^Y59LNFPKd~kXejoHuhz6H}U)<$_A``z0!^5!on zTYrS>C=cRg9{{_5wlI`D;#I!bKaEAcy7Of7W8`V8`n1>nG5mpTxG$K#{>ZOs(^Q}4 z!#i8^-g!08&xGH$ymt9=o*!&dy|KLaUdT)9Kao~H)4F#(%C+`?E!UeU|8|69nOHu~ zvD~s1qinAu&X|+`>Dk_Y3|F=|_cPLuA^vv7PZ_&&+yARynGazJ&4?;2FcxuNq_@bzod#?7+B0A=a7BJF&cXp3*z#>78@* z&Q83u3-7R>bNeog-~MOw@^BaO&^$fY|384T-v&3wh4~=$@(w4DIr}X8c*<=Ro*hD+ z(1vgjOn`gAFMvs~6FeW4x@~vD=J%r1QL~KSH@fpv*aa}&9W#+`k~V#wWx?50obAK+ zls3jpe+~NnY9nEvH{;q&;f#0+bGo#NbG5L&t}6^iQ1Tvj*?fOu-upH3ci*p&+kM}c_r5pp{kmi>{qXQ*CfIr=o1)CIi2Aqw8&74C~<3Mmvc0aOoiC-}_kKbFw3X zl)aUXH?$81k~oWry~Q9d>IBO}8wJb4Fz2HWIuK&oI2Q~V_%ZJCJR|1ZmA)8kY!RGg zv$`^!TyKRQb8N6fINNv1W*@c2G{)ABE^4sKSjUXhTh@CdkU-v0w+u&HN>Sn=oYBL1 z$=KRV1?t&nJY@e7b6Q8Pkq+Cf6Xwqw%*mQ@O$=`-4C4DGoE3HQ&V1M4dtv0a@JHyw zy(!2twFWX+V{>j_iwee^)WAB*Xjy#Mrx&+0efl#iVps-6vd2c@TSK%V?mJ$Byc!h= z{L~D-v2U;@1RAVyJe$nDS=bx19ah5bk8QC{$lQ!#eIG;}puSBX+6BXK&5!aV@ohfV zqaQeH%-EEt?9n4;#e6iS=~=W>d^b6rXXIa7AICQsqtIqX#4|>`$N2`M2KI*$zPMwb z;JL+LJ9^Q3m~8>=m*1a{!FWE_Yxu{Opl$q;{*a4ljDvqPb0ch!8;i%?^k{+k_+zjWtuc%R2|Qn8jf&%^oi?n6Ox7F5?b)cc z(f*(#E80dQ*jF_C=nS5xei}*chZsZN&{MVtc2f3BoKHYr&wG-PdAKuEiu7<^?D^vK zO_@@&_Xy@^LxBm8V+@6U?e4`=X#v{D0<6`Wopn0rJS+5K5DKFSy7lo|!{cPJ#JHQ$d&vV}o%*4Jg_GOICh4@x#41OQMj z>@TqHdG3tg)p+r}C;LIztxlbNp&h9Md3O3`d?&zf;Sp!LyZ~$Uh?Txp<-xb@6+H9H zvBNDxA@;m^=9%BUQ@>5b#Wi;nMt?zh&I59PqKx4|Ie z#<{}~_DYZ^1AU(t-;#4L0A+CY_GuHV!5GW@(k98Ym>;AM6-n6Gqju`m!#EKS$8esf zWnP{0y&;T=uv;*{P8@l8eO~X5U^$r=ybD`*rpZ`uZ^M{yYTqf`UFZ#ME<`+qY>SM` z^i9w5cOf`Fq7A{mYJ4DcFLh~-(;rmN$9)9)6POB=*KrK=$k51Tzk&T{yF(3zOCyR{A>74j5qD}@UDkpJM11ij5C(Q_=dRPYwI!v zZ+{_k!%i!GT@SuB+h(P28nn_4IE!~|di&VAB);41Z?_u~?e=q9_ojCq-V438#-P28 zJ;eS2<7No^)kTMCW;#rVt%LMkWPLIYnNrBK8QltA< zE2G9`Pbq%SrexO_(xdP!5PCRWdU$oZ zG}M;jURWt)T41fl{2&*X8Nxf^H;xq4;WvH8twWgUXj^M+*btGOnfyMdGNd^Z#>-09 z752(uSKNZ{5PDI*M^fz}dXl$-Hj+(rH) zD07#+3wi$q{Bz^i3`hS9&?Xs<{@njzoji?j6|nJF8yj)P5c5Xlmvc;p(A|Fn-dVpSFpW0p~f(@LkPO*a+$y zP~R5vi+ta4DaYzu-24rgrg*Q7@h4lH#Pbx#fE3p<*=Z$P>}lt0u`713v#Zvxv$v<# z*+yc6J_<=pG^Wle!@iD(n{_b37FOK!vALbZ{_u1!BuX+ByJ=TTqO1to_ zX&1g9?ZP>|F1siCy8Sq=UR+P297UM()EQm&HIU6Pev^gkbBv$<$D=<-ea+6c;GW-b z@NCNga9Si+j~sU`qstkK>L;9jb`5^#g>A=|_w1m;#qypNj?9JImiO#-z01CQyP4Y) zqRh9K_xdZs*Hq7L9a)}dSfd=7iN^PJzvO@yxf=1-^Jfqkj6`~6$&rRQ~J z5+B}TKOI_+eiZxhuqh)Rv{&hv(t!Lc*)Jm=tmkv*mCh?bABV8qUq)Z#to%9)xo|6dB^Wlr5X@_J+8@k7w50AABVGih~JeFzs;wd z*cai{~R(oe82!WnCxVd5F<5jdMq8KJG>Y;x{7)?_$8_G7yhVPIdvUS#e$ z+o~7$Jok>W|CHb7khexX=l9<{N7u^y zVBBIDeoIjpY|C(cjeXuU((5(h$LCD10Qar9=epFR=a^F>PZ;wMKlf*xvO^wBzW`;Q z44E))=A|AonjFLV0Jw|ei*P=}`OSiyekCGUpIaWTkNKQoU}KT)-OBNH1N_^HP)5gY z62nLAOXK_ zl))2w`N-|i2kIm1CZ~_H)1Md~zS0x6vio48rL1wz_SBem@YyZ)!Hrw6PU*_j#kw+# zhx^p9i4L)CzYt!JvlKJ&{Rh53L|V)T=dZM-F|6Ar**>r?cYcG0bLHZYl}@uQp$;i~ zrW;21w^2V|K|Y|rS+?n(@ay(p;bu4s>_!?44_kwuXD|3(ej2D}{O%m`0Y9Fpq@Vj8 zV*+`21omn#%H&0vm_P2XF2(P8y%2uXDF^39lpWJyU*HL@a>iro63c-3V`=*8Qypk6W?cE*n z|1aEE=pNs1D87heqihWS$VrEBBdy90qrMu0d^SCcvp;^GCqX{a{GCU%`O45`%;(JP zYJ_dacsdZx>C4vn>!`E-?c?Bvd|Re(wp-I^8yH)=F{XA;UuSou*V#RoWAtH;VU1g7 zw@>J@x8sUq?#nYojF;!MVylow%*q~2ZMKi0E(3VK8u8X3JridoD(>yF55_RZKzzr* zZHTiIac)PP{S(&NTwhj9=(YbkYG$?=zl~TiVcnW4xuN%MRdE06@A#erGHa#GRHpBu ze9U|3vUN7@huF^gz<%gYIdqHmpyjZ0h0n)1SDYDhzp?T~FkcFB-ifo+$WL_x#%{b5 zABW!unzZ4_TBOsC^f^ZM2UjC3&J>MnJHqvEG0xu5R>iYs7bD-C2jN`ETibRcd;;^f z_%zNxhjPE|bZh#2gz@(8bowFMVBEIJ`DeVW*KRj^F*ah}kMy5Ttim~yxMLIITEPul zhB){QWC8lxsz}$9g<}6=PYfuNy?`EbR zbLNsB*fu#IVc*n|!ngpLK92s$%{S*nEB>CFFQoBq1@ysbBe2zA&R7^jK3J!oymrt4 zxjdxje?NMSu|B-CP3nu33aj*cq_ow*(MxY{jv3%TPh{DEVHlTmTUdsub zo#uW6=hFpolmRkin$d8#oq`{q58^j1&@QmH$g@>N`TJSzHf-e{u2~s=2g2w7E@VwX z?z^>Puuszlg|$f~&m18u&-*(1(?wXjP{= zw?nu-g|y>1R~5p!QzMQ3rS$u$(j!*-64_Wh`!MgtRp7&V5LciB@%32gso-@Ti}Alw zYsCJ_f}|Joh3C9`)6Z|+`@`q!_U_(Q4m-?Vd=U|yTTHvq;ayL~rwE(|@4<<5)mioKqG zDfK#j)AID3gL0%T>dUAb>JR!yezR1D^O2P?$f+3p27iBISLk)jBQciYjMzf7HSC2C zVIDAq`3k1GJP+-pg|+J@$8PXa_;p8yw{cuYzBor^UYz=iV10#mj$#kT13hD2Y2)WR zu(u5z#B=I{k@p<7j-kDHUV!JmyyrHab3QvB^I5iYoTGt0I`#y#k4Tok8-x5-QqQPQ z74i15aqQ1P{|x9~AOBMj`- z{}g5(!Y~du9^Ag;p7Au{AIdC0Ouh_Rp4b^-&XhCX#aX>~#IqC6^5bC`p5xC?3-h;s z3e&AH?z_$J62>|sp4hvD*?vZtmUjuWQ(@3&JAbTq=979zJ>mV{Gs4v9IU1M2_Za5D z8DZ-6obfOm!yGyzOrxIDAH%E@=GYlwTJ;={oj=BN;*2n#!81P355otPpIfe^!Y~~F zNdAA6^25a4=OEi7!&ICRrZ+DPYywW0YK5Vm@NWk$x9;d>Jar1==JE4*=H9zu8W4uh zu#R{B2JvrxJoKBUFpQIb+$YYDhxd(VgqiRzVR%-ZVck4O;W#rb{(qv__Y~uD|IQ4v z5@F~MIDf9Z)!~o{r?C9 zZ-aXGuhL?e9sfr>%n$#!0{PdbnHZ2fBYI6l*FRTyEXu23^SZ<>D(vuI42f6tQU`*W`AFppWXVA9gNkozSorYvb)*c4gP zvVhq#Zduy2aC!5Rr3)j=RxD{@iSwS#TD)YzCzmc|E?GKd;ry2SmLsv5Eer3N zxpaPvI_%yvuc-U^OIfp1=Ck@xm&+F{lt5VvuKXhNp-QqHl8I+`;!ZoFJ+Uu z=f38aCFAdzzXENKnLg_kcl_|0kK@BBa|&iHoXGGmc3X}G-a<&&@GO5nI=q1o;i1=C z{L^~?vuMM|2wx{AjNXF6z%rsZ#)rPbufU4u^%dU|1-!+LHxPwKreGxW!hQEg;WmBG zOv5PceE^Xbd9QW;?ZLmreBhaXBSx{g2w->?F2U`hnY{hUbliUFLf#%jCPsXjIr8km zQ15RTz-^KDE&S_?V7?Uef9-4(X2dZxApbY8z{LI6KaTtDeC!=DgZ8j**5lqc;wv}d z{#&2GeZcT+sf1(B`EV3@Yw)k1?=oD;tGFpaF_GjQ7sI3Z<4&L(@o#`H=K?rMd6ps5 z{;tJNfTj4?iKX*YAjaZERgw$7K7t_s{g@McGyWaA`)y&FC^n*6b(K7TRh9k#9j||;lTN7g1qy4H_u-$CDR01YOsi2cm7$C=_ZubG@y=^_!e|R6H#`l8Z@3vcP;&1% z7#TWa6*s3`4ruIM?5hV_bq(x8}T`;yL0!@fxkh4NIyihLq-pp{OJ~3_!Vz7dbp2d7{3i7`SlSPvmXw%~ zlrg%ro5=?p$C%P*YvCAaQk3P!=n?c9WxfxIj{N;BJSvHpUd;AN@4XcsGt6lSW|Z0# z%}mEpQ2N99aNOdA@|JEyawW6P2NB9wx*p0}GRK648+uWBFC4cz84aR#D9a)*qZ{3W zS}2)oZbO3K9h*9WLk*tUE zDJb2f=Y8j`(byd|N-R$m{7`=U8~D(>1RHrSswP|# z^ga*I((j*#cSbw+M(GU@PRSVWEAa5<!|hq4Pf)L_ zyv*?EofqMLy!SBfi@Zbl_w3&<#N%hEt~Yr9<~%mpAzX;4$Fk5&ql9;O;UN4+ho~gC zdoRMHBJX(o8{q%#w1j@f=ub?-ZQMKA@w}d%cetMUje12hg7tYn=>)qM|2pZdI~5eg z%cX3Lz8tN)0!2M+snNBN+*Tj_?4G=4V3mxf#Zmmxe1nD^nN%7z30GzrZ=_`t|9LW zaCyonB5?Dyh}g3b?!Y4$-3-rU3}1m>J}vTIj~o<#82@S3FEPOXT!7mboN=rh z9c19Ysp*~z5pm#$&N%i8>LPIHLO$J(W)V2zjAO5k!|fl~(|Ka(bpn5EL3JxYpW6HFu#iY;r@R2 z-aG1kJb&o_Ve3u6qbRob;ofF4oy=6ikj_Sv8HNA}1PBlyK#;Hp2#~Pv1PBCVmqj*} zO#wj#!3~3=f-8Da5OGIEuLvR_DDJp>755FV+xNbwC&>N%Kc0umd8QI1-I#aAW6~F2XEJVP?Q>uoZxo-DgZ1~jG7j_ zQ*VIGa0OgOaF0F#wBM>G+a*Z6T`qJKZZ!~mUEhi<^$Mo2+FyFWvw5AG?2Ad18JozmQ+IBz- zt-|03g53=VmZK)XB?o)PE1eh)(95f&h1Vnlm5S^PtKkd$5mo0JL0eJA*N_b)9S|mFi5%K~v657+adtDFbWQ`J*Y;yz_N4O>5x1*+J7{P89hK zo!P_i8-GssB3zj`g<5%3T?dha^BGz%a7N6~v{ud%SjPd)`5C77oaTg~ z-Eqx1J5-)YWc?KEwJA2DDZJq9vK<3rDgNMM{dfhpR4R3?)oSma-*XYhYFwbjs zhd=gpo$h=;5C?sAr_~ru+oU@uU{KfVPF+;rtUJ45yj#$EQ%$=;cQP?pH{uT#;!V24 zo%CkZgRon4=Wk5rR^6G2nZH$ct{b6gHM$e6#My7C+grnp6X&&7ns$fojK&swClquw z?JnJUN5_xZ>P`=o?be-fsP`}y9oE7ly7M5$dXMg`%Eom!1_XLOsyojnXxcvA88k%G z9)q4xaKG;4_0Y7(F$CT5*hzQ#qFKBs9>R;VS~S#04+mkc3^YRhbctWocyv8fCcsj+ zp*S=^KtMe}Fi=2HnX>@O1*E8L7Xu6ukgDz{7%U(|^?_-Jh6r%A@XM?;OsCO@(y$^^ zLd*4;)Ib_tsZT}+;_9ptU`R9?x>5vKY8D1Nv_?Qch4TR5d*~3f@aBm?SL@l37XAiN zL1>qLC1}63o?7S3z`aj(nb{T&TS8KGg?R{VX=*f9lv-gfMa!1T#>!VK1q4)M*t}XL zAgC^f(W@&>Iwbh>sQ_1*SuyUZQ!!a;t;u!2MV*3gRO`%RXr@N#{Q<6)Hn*$)!e-S5 zvnlHAP}Nlc*P9&y_NvoZ6Y2(O=ZF@54mJ}ypm&7?zttOQXc1;SsD99w0jQB!rs^mC z7kF|_orcY-pY_G)q2=}J7YVcjS~vj~A3CD16*1RR%&Wb*&qqWzRfpO%F#ixSA~R;* zQ=jduoq&>t(w!7F2J@wI%x^J?8CuxHG7r6_^LLE>)<=}t7xhcjr$#>oK9Tvkae>S) zi~xEVlnqpQ0bYuF2uo9aX;h_i@E8lKvj+G5LfJFb*9P~@A{FHre`EXwzfr7(^CqG- z%@~e${MJ~cp=T1pv(j1XZgN zfR+MM)Ot9pP%CR#T`Gm4)k3WWWT*wm3Kd$k4_CE>QlYli801COl1TvVr6fmfhw}~< zSrbu`t8!@H9WCxc`KlELG}J{Rt3tJcmf6*s18F_fi7o)$EE;_;^#fc+sJnntZ#nc3 z&{s9Zc!YWhC{ukgQlZ`g2BNyJ~Lo8lRO;vYs42D@W@fm701&ol+%~$ty z1Q;nXmlC2f&?~T z$;KU8n820;YAg&rbZG+Da?opfQ39Jz@tR(eK&P0Y?!|5wTAIMvrbsp7dRiu+SUpVL zFO#d661B27z!eFM4olT>n!yT*oXb>KxR%h$1e#8j8q2v_C19$$voFAv2`Q*ELw%A4 zutwBbuCzRWwF!OD`PFLFT!5<+7NR?A)xbUg>l0=JY)~f#16-3p-?vds84Yl)fGz5m z9Dt2d=Vot4u20wjX*F8-8cG;!)L^Lm)}2U0O|krfp&{lc96gzlVWu}DM`)3ym;owE^`T)_iEBfJ7~|Z5bFs3Bu^Sf>o+Hd(hL5-v0E~1m^>o%Eu=je;~n$ zRp2u2#C^!S8BK0Ku=Yv6^D11~qeppZ_WEyY=cehoWBH_b{4X-7{S^?fKg_U2QqHmTTIJt4W=OBY8onBPG~Kzqs;a zzjHAL^AVxK@FL&5eQ3R33%dpAUn3ck@C(QejW#(};UQQGp?T)p7!h3m(c%2njjMRF zPOqWn4n$HdL9wQ;n+Y&g=jCmRnlb=jnocvwQ1@Z7)pWfQ`?jk_Hw2iaAA>V4R2|4R zS8oBfBK2=*rY_O=}%J2Gi{I@j>p8wvjASzi=h(kFTjY@QJt#}(d;Xj5jQkW7NNK6R{A;p znz!pt5MZcvn8MH`KbMH5?(YszB_QDWwkdwuoIT%GEg;47ZBqrLsx278&@=(qVD_U= zq3M2V8s>?e(A9oAj_||e+U6e$-Tc;QYRF6AXmS%8w!I&7k(|fj)ok8;NN!3^E&EbL z!^zEn)P_+_5Z zIFS?&!p0|ZOSQZ?s}vAW&5FS`A<=W6i_zK8L;)DhWhFqf6M4bxx9&okIu?<>6>1Tp zkvTi7soodZn{;OrmXqNuMEj<52iA_|SXgB~XB(tr72Zcj+9712n%T20rfNM$z^uR; zPq}p*a{X2n(!@Q;od+U`k)39C8;|k_E|>DvNQ2k?Q}!$-G3A-9QnnpwVkwfnwdG0I zqrMjKcgAW-`KmdF!rp*=BIRqD2Kzef)hXY|XxO(y(Ufn=60jGy2K^luK+vv+k)?c3 zI>kEBe=q>_FVxtz$57_4)G&(fw1Kc$mvMix?A_QM z!UNjE7Y6Lx;Df>gM}ZF7TVbZ*@}r&$72Vw-Vkol9gJwi#U3na6C)=2lr}J~av0+(YXupoa`X zL;=bZ*e&yZY>naE5@5g83#oLNN+z*mN!-CTGZ&*CZa!IQ8iVn2L3a(73}^M)0fn^$5IIIO zUxF7)?)zU9_^p*l%^#7}jU++7->QRDM!yh*_mF~tRuZ=)FQMIP=HPPFY1~EX^h6pg zC%?pG=6#rvx=lw**#x8_Zw||O5u}-CCZoLhQYl}7G`QiPvSLWD+v+AM+lJJ$1eSX% zYVCBC7d|HCPa_S!{7>2Gp(rbQUCQ1Jqi2X7gK;5S}mm_R^oI$JmH0KS*I-ozmv#){4d?rTn5p>IMF~cvHbAcyY zqR*+f@aJpnRxs_TS<}$IQigOx^yQi1{070&9jk7GtfZ zUMT^u+6L#4x<(g|qxNybSS!F%cU1wb6A)1A;WtvR77$d;F`}vK1*E8(`v7bZfE(#; zFtn-H>K2U3{2hurLoWsCw=P4P-nBW@Z!;IG*O~t;GVB^eLe4^OOT3%(rKBy{h@3^F z19tK-r=nR+=;=nGsv2b>c9aSEvFjDl`L{ZU|zcY~Ec^H$4w^G}-yp z&CJGNRyIY!_2~e9t3J|%7?Qvd7-OzFb`NNqkDb*CFWNc?3s5H?K{lSDB8F0@-Xy!- z3MQ=H_z`r_E+qe(8Q@H@{YjwT?M}O~mr}p?E&-ikpDqRcehp~XJ}?LL2hV|y+H;|| zI`b9i9L;Fvc_vaQA+MQ>Syqn?5Y{2Jtn8a7 zPqZRqk|+88Jg`4~nXs=SJGU2h|DWdLocB!t=kxan=Y!;As~jAU^AKce=DRR^_0kbx zI#J8SQTvA}F0SWja31zJ=@r9z2{O*cT3*U%@C;W0UtHGa0P&PN?kt5iPSj zs_Aka#_G8V|zT4*k|-X7U1HRc)rX66s%rLdA9D;d0t`o`-?E z7Wf`2MAJs3HH7K?Is;EbM)5LUvwvs>dNgUv{t2EmZ4Bvv%{zo?V@U_?yLy8jM>@qW z!Fo>{PnUs9F)aJEO0L@sn>$C^1m4@rvUzJRZ6dEq5jp=k9H5Hon4$h4XXir&zr~Ee zx@t{3n6`F0!U}s@3lv_>3Dj&linR5lE&C7bb!pcydJ5R@qA=}R(zg9^G3e_^C)zLe z1ig`TlD(`g=<6vmXn)4eZC(mG*M1*noOT2Ai|tRzeaf?YgVmBITk3w>z}ileE%hmTKl67z z0R977CdZlTivfi^OqB%NS|-Pyq6NbM$ z`bQ8GzO1{@Z6O6W){#^15`&L^(wgYMQt~;tv9vt7@t~<9j#<o-`W5LqQF}9MK^#}0ye03djYi3n}BVj`e7PCq23DVqs8V<9^#hyDO%=B7y!0Yi+L%-mTECqb9F6F*21l5blvq%5F2iNk z^-Mk%OS)q=mnWqIM_aO0cH(9Lsu3j8B`O zMnf!4&3R}#>(v9V;T*>5G@Z?uCd(;8zR#Hg9>0?_8J%}N!+H%klUie4IxksRkw9Q4CUMJMYzI`UJUzk8r@XMPow zbAGMEN4CQe24*<3O<1zi1U8uETn!Vd=S&6dIu`irJALbGTDEfqG>kZ@XeH{jAI3+# zA7%0p?~9-tI@1vc#wnsn#M=GQM8-uOlzrWc}}Z|@YT*X)N1DZRDxjE z`3n7Q?lhi+R15z|b9}^j8Zu0t$4bxr10&|Q4D2207xzQ%ajcj0W?^8zm4Q@Tb}JCx zaW>xmlCFj~J8AVq0d$LVAA2LV#m3RqYASp6q}4BRKeoTpzs9l&qR zMH*!FBx%abtVY=*YozQNmQk9Nd3&T>*qEPTIMYv(%j{kN^6Y-8@C++Zv41LP;dih} zrrY}4!f^(v%p+B~kgGEmV>;e;z-am{KT_e!0pW28C9}wTAK>9de)uRGze;Z>wTh9Z z-<*i-&JdoyS?@2|gOMhTKoa^MOWIAp)_4xU8{mybQ_%4N-XsO_0lwZC+l&J|bOJ>g z?}II<`f;?k7>OuJQR4ytHyG^z;sbo6u?hh9qYuNV)9=$?MI{_$V^!8qlD5K6a`cbu zUrOP3ETlXs^oE#QrFQ`texe?Df7jE%;I~|)K{j^*uLS&Z^d)>JTzYyVqnq%Sl9xTW zfY)RDqAl3E8`FesHc~GV`X5&KMy|bS#&yDVLoL^y^IZRDIzp=|&|dm&#uwmFS7X_v zZ#RAgttl67ApH&_NO!9KK-bdmG#UT|@S-D(n@rw4Sii-}i60`9%(a<+GP5g&iIr+I z!=S^RyFu6vgGzrx#=AOk;DXC6k@(n4X(a#gT(V6q=}4SegYv}9&2DSW-lXSKp%J+`$;I1QO>FL zu5L0aNL%)uQ;|Q2bin>Q5%iGzASGyTo&tL4YoJr?b(pw};S`gK=GY(eJsVl0M=wM+Q zi8RR2*kkYv-~nvwnIq>5!xE&j6z(L`A?T3w4qEb-WJBhi7q6LLBNok^@Ss%O!;0+b zzsV$ZWDLyhSQD9(PYBa#GBNw?c_z7B3-kt#W=|--Nr*yo8gKYVX7Lk~wcSL}u9UL9xvFq;U!H z1eQwXv?>69?2>m>fn>lr_?V zAGZ@IU^FX&^9!~z_ABsYAMU_+II}7TwgS`3=zrEkUVUkHFL=_dNvs>Sf9L_aif$ms zPC$g8HJRb$7q%b%JFA*O+*zB?rn9EL2ASVQe!^8x*2NTQ>5&iEz3Bu2J@P4JXU!l8 z>XBVD0cNqYDS9MJ0n8qXl2kpCQ2{V#G(d(PIYKaZAV%NSBdtmR=CMvxk9-5|vgS_! zTaF%?hE}9vbK>9 z+S9S@vTh@tqM4PnqU~>rRQ?d1nK<^Zffg|);cZ-4H z2z}N)q;MywxEu`kH9$ST^&TZXIs-$O^}rTNdZiBvAEaZ|?Drdheu(2@*-zV`|3zI= z?Ka@g+D$sco(vb4^)S2V+NGtSA7RT;do0as50%TYADjq!FY|M8f87tT?{;au2~u;~ zEM&a2TQc?`&3+6XJm1KAWqKRvz(*ljN2X$!@k|Z&oAqin+FBjC33oKIj`Akx7kXsq zV1U;M&gzkO5Y}WJBlu2_{DgIxb)1rZ(jz<~lyzb$K+uRR#zj%qsd=#HR3oyBt-Q_g z$uJ_lrUJY};2M!!w)27X$%sU_HqP)`GslQ9_{sX1?chmyChxdWvRotK8jQzb*8hXe zMi9=?XY<|px!dl_sZj!dY7|{ zyX5gpy(>uX)&k#QREpdoNpO^QHs-+{#tLW*uE!lt+On~9G8dYPW?)aVtr?^3H}kkv9TzI#=G= za3_;)YS)E%xz&`JZ?C~Jai@}QVRz33eKC0o>_;&9?sU?v?YeL|?hMj}S|$UEdT2I2 zKV};QgzhX3WMJtKNOWKR5v6u^6xpwMeWuB~hgshelXs7h_S^4-kpC*_fZZDd?7l`l z676D4j(eQ>L3=UfoFJ|2J#feF>!efcaTTCXk`CMVz|P!Lq*Lv)FeCR3(rLCi8}wS8bes< zzwk%-?nU}p6f5ayiFa;XNl&}Vc~47mb-UdJ_?7gvyMTZyYJ`%Wy7X3ki2cCrEhRx^ zak@(dDD}xCfIb2c+_S@d1%#FKxSxPjC0#BPkfx;119a)Ml1`UPNmLz%>TZQJ8dK8k z;qk*9((e%haG2u>xDj`huF$zq1j$tQQeB7TDc)Oj7mEO#^}%lCE)mg&;;XdoQYo?2 zsUW~I0e&?c8;5(DfPi{;Jiz5rCs9qnx^}M+5L9Qf0hS9;Dy==h3IQpq3S;eh$7#cA z04C& zClz3W+#||YzY$y`pg>)MW$Iolpit3ExYr3NQqPlZlg_79#cEdyz-H-biSlIvY!T2+ zr9}X45YR)-uLihLH0Y&tcJ3wtrK%Z?;${JT)yAFxw@95b^)c;rtAGJ&Z63gFqCvU3 zh2VApLsVzZ&s`#5gxXOEutUHowP_r{P7yFh9YI9m-YsC9I@l249s!lgLX_q{AYh^j z4guIDpvrs1&3?+N$6ZLC?P^eqO)Z=a+I>hrN24jhuteSG_1(x*z2NEHgYo52Tm|r= z088CC2jC^qFrbn~0{mM*qDs&KUY1@36%UoThXkakxip$r1f;6bly+D^hRUTi91(!i z*{92Zj_b{#LFio!Ws&=yeoe>P)%rnP9g8-6M(SAV73?VPhtl7GYR>u}2}o48aEv|{ z5LCC02KYpPQnP4ip9)A(ZMp+|CLpXnrHlPs+DuhHab~~Jw?Tm%)rgk*AN@gqeARdg zz?X7TuC+?0X?!K1jT%UBR&K!-dW-sN0d2jpr!1KZ+=b*^P@Lcd4?kUtaY||yc18DF z{V5IxK8=sLX>V*rc;zkV4u&{smCgQlH0YBowHsTq+ev_5?W6e>3kayMxEeYONK{YL zCtf5VsQ#qEbP=FbHT_tLfD{#^N9Zabto}`t?Is`<#|Htr3rJI2Xns8eWT^M%0`wG+ zrFz4x++G4)brB7sw}5Odd_P@JAL9`E8yJaz&8k1(WAx2#f$^(f&Nx%E7nXpoAg$NE zWO9{Oe-LTIo-!HvgGs}`U(^L)=-sFrumjjh>OasP=3ysdy6W%ZsAx7H-PC`O*_J(} z8uUY?1NQImto3)3Cuom{cJ&`-KCd}C<8J~B%oVVk`g?esKk!^{FlP6=9A);M&^x<7 zgI~=a4)>TnfFXco|2!P@KnV>rbIL$~ivDctZTPIB?CDRiE^nV_&tycU*}SiwJ&QCR zGa@X?o=uj3mdRFL!GAFhbhC0O3g@n4A&+)b<_FaqxQtYS&krFefYUZeFfV)poeiwud!R!N5C_k8k?C0fHoyY%zr|V33 z&Fq7uaj&v%Z-AHDf1NJP;Tx2t8Tt!Tq z0B}P!>iVq+(!cVC6z7lV0amWwS95tDAf~n z*2jbRKXJ(w3F>cA!0mL7k>>g;3gD@@NXxi@cI;O{{OQiUaQ2Z_0s<$C` zHIX(_lA`J&8jBR_>mV#u4(>OAa{fwAFu_$?|L-VDzlX|HF24n2*rv?3$)7pTCW z@HCN8aRqMg2QXTIp@oy+Y9nLy*TCktZe`6g*rx)KOZCK(xG#*<1~)zWgLjEnQ$^U= zQjw1bE8oE1L@v`$QNV^m4xVf5p#Z)D5y>{_j5RqX9Ek|f)rtWqi5lW_RF@Dy11T}p zix~hh0hS73+9M4G`0%a`K#l;vDy{?2NI-)642?w^3kaz8@ad5z0&I0LwwXw-Xp`ve z0xy797QT)#qa`&p(vTH8elaKQJEIw_LiO~a;0J@en#zm<{3swOr==r5i{cq_S~~KJ zfK2r|E$EzpEVUk6Z{#-t^|bI#OjqQ0qdi395Dr^wh44QZX<+iSki4rBX((szHFZ%b zcyk08s<;6_Ba^poaE2R^QKYd{;d90-MH2 zdxksCJnTtrlZ~QE5f*MV6ZBlOIjZ3NE7J65F`S{x`@?o4_nSN%u6QFfvdiQm!cAz% zh&(93Qgz1xJR~5XzQ>jj`Ijl{Rt4!ncE?}V5?vk^U2tY-5DjjRSp?DH=Q(Zfn!BX= zN08Qg18a1K8QJH{#F~^Bnj-ssa`msyv9nM3QZa|C)o*kvPx;u|7B!BYecDI&akDC$ z2=I)LPOU~MY?YA%K3@23S1yP1IUlc%PPEsE_0J zhwd(e!->2m3TuY@c@LoDzQZsi%Wy3}(Cfb6fdYnmE%t%PNncqXn4jSu!j=>{nALtM1!W;uZ4$z-IuEqI=yA~rH z!P8gF;UdHJr30D%ZqR+L;cm|bvgCz@8pGvR5F$SR9q7<@!ySULj`;l?_#K9Orwf$e zXC$=Ka0hZ4>i9XwyA1bU)(iVNoVyKoB%OvMWqS>G2?rug%Jv)Xe`(a2QudS)o3wDg z7RmDSP3HrK+hGvOvi-EKgNFM+5m2tY_4Kmg?n8r-rvB^E>@mYF8wHdvQcfD~IXbrH zf=;77RFAY2t=~1=w>f>S1-)muyss2#<8OeGIAge9!-gVl{m($=Cx*L{n`wJ#;S0mv z8v!cvGZHv!xX*H#T_i1hXShw1fw~C#$#C0{v#X$UhP#>L(oK5%hvAOlO6Va-Gu^%1 zE_w>5WxBm)0QHg<0;c;DU1@JA3!3i!o-9aTleML&D>AuCK)=xMyOn3N1 zpfdjr7(v%`i>XpEqA~O!rxub-75%HQnayZG}k5H{Dk_f`g=9f$0uI zrz3-9TneEl(GWpJW^7{B6!th3M1x)GVw&)W0(PU(HVE&e z(Y*kLi0=eECEuWld?um~$~R~tp9^?dxnm&UOFv(8Jfae~RKJ#zlUn#5nwDj~i7CNd zYozjsi7qpVQV8a=6&Y-CjX2-Jsx;@uxjd_q(~D1uSU$2%9H^yuT0U}{ z*oj|04->gvN&=n*ZI_b7I~zn`$Tk93v0B12mB90>F_()`y&7HPlTP|!7S4BU#gLPXaKUG@Gq9^ zE13N{lEB;WNIB6Se}cC8PHVK690Ru>!uUjca|SH?{xZ;|-X#$)U!r|T2kqO?YP2sS z&=mVaXcd*qomBgIEYN5f>t@&tnWA!uCGeNp_WSdDhGk9LPND>`H_ zLTh;kCOS-J-JV|wp5dMn((p)6iJb=WN0B`k`DzI0(L&=sKZA@($d~x^Z_TX6f{%_3 zASbXD8fHW*`IQi_kx3UcQsp%wf~RnV1NI24-e|S=%&#?qh3GW$r`WAZKwnH67p4O% z0A|dh{Kc^IKy>bpls^*QExO2)|H}l>i|K;#Xx)d>=+dL)-wE#@j9$?agKO^_itH7< zK-BD$WLfE5EH20Tjjke%3)zR@wxU=5#k#!Gu%c@Rv+nI!P|>SNa>6OjTnFQbZs-Uy zuma08HG18HcObFFWS9 zMgp1dO-I4aRV0J(veBB?K>DpyNb4E!nkB(#h5joHPTn|<4wg6YaZNz`!UwH%G%8Cd zI@Eg|Ume3bjN-coY*t=Yj}DJtyUA#e5P*Ag*bAbg_FC>;sX!MCI&Hb@Xy4NX{b9MEHvpO;DC%?htTsAJUWM)9b8~_~b9L_S zr9QWqZO<2d%X}`w_UHmBEBCoSa-J5-HS!Rj+hQirr7}(3lLD47y7(htaEa zJ~vAVx_k;9U8k=?z0{yP6s|G4LHdvpbbrKTMXwR$2Hl%E0UPDRGSQ&RBm2?K`r{Cm z8+7^nI(nnN4pNGPT3{Ibr5n9}(mp(F0UJLk>De zpW|9}<#2QKdD2li+#G#@bdG%sa}F|8$hAk#0sSKBeEXG3&@b`fcY%Eg=jz{-Sz^~< ze~7-!WzoatGx6vlh76^0_Br|r^UG~M9*-VoEHcFA1M%n)zEoUgo5`SGCC^klKp%0G z^bGrlG|;b+o?|!0;6;y-o^M~A0s1)UMRrHTqR|t)Nwv(r4&xSmo&8;Iw`&Oc4brRa z>8YUKB)!&dNy|7*{tfm5?10g?NpG|t!@x)1A-%=^oonx1(l^^N)_sp{)!6Al(C?Gp zZXc)o4@mE@`7O-o8PfOKr`WF#+14((DH;8Y-fFjfigxxn=|}7p?AMp%-)ld_cE2M3 ze$5<28~b_|M3{F|&+jjT3HU7@<*IiVoaP22+CndaGf)X^ra-5O;BE^-nrJKiGc2U1 zp8!fz^ha%xUVQKLfSa8d`QfEMblw{b?UmljH8u zU$_Zta@;-oD`{PhyGPHFHsrW_^f%I`9CwfY&Z?FicaQ$@66j(%?jHS<`BieU=Hdr-~hTG8c`GA}D0c#j$ajwqgZkD3CGDIR%`S^`e0a;_b}xaQM}hu)(J z0^U+Q-5w3-Z=jubT^?_b+5%E^H%4ccC|n%IduB9HSWuPjZlIYsGBZ^u+9fU_8VkrqKw-hj&`^MfD6Zun>>_y3u;#h~>U! zwDvsw{ubcMmL|O~XGI%$H%8U-(@_$WlAxNz31}n$U*nhr&{zN-2NeP|k&(s8%!gt? zdHN5~BivPi?x)kkeWB4>DWbEBx5VmfCJ+wjNKSP zEN=HQQFt?>R?X)3Ib*jRhCIveh`lkkm2|-7`&hACIYdGGaqQ-?ZEQ2ezNkIu+eoL{ zW2S+=om+l}z0d)@oiU*+@7>1kJOuGko9~>(?%IuJbF@GKCM6{{d<>P421YFasmTjp zvGG@dw(3r(s?uT;?*|>QAEQE3nIH5nr^ueP4*l_7pk)&nTgnTPONx-O6trA^QOpJW zi~+n8hJI@Uip*wkq_K-RC}w&ckUKe6=Ds-~cOOSC&Zi>{4G(kPj_GZnk6ca0PKYUc zpHYpyF2IsY%h<`dk+Ooe)2Yt8$B2`4uOE^_~my3j}D8U+!(T@EUK(YF! zH3~KTdXAJzfq#za`d=up8u;NRSFX_d6vIeL0hr?RM6>66L%63hv?38NDb!|>_evW4*Fv`RannH zyj4o`d4U?6n)ez)w zsTfYbmBm4Aio|>0Sl)#VFF*_uOV&AGq5d}4=6wBY@F-aqm+A>h9jGIp7s0br>n z2>{Cl;Mq_kfRzG*Y6-9WHTSLZIZV|@X8GI$)yDJ!LZ*aQ`$k%IPMaH*T&|B`j#X1-~@t>mj z5rbGq0jcU~F1KQX$5k`b3k017xN`3=*2Um$oT%LUi@<9cXNh)=s=N&~U~=#}iM ztbnunQqb`g@V&kPz|w*X@Fz)`{4<9iXw%Q2aIXDnKl zJA*Rg+!eiP4?jN@{Bw;4V89y=NQ1@ad4-L;tX7Zjj&H=n5~B^=x7zBW(jtRh)6`pZ zu1ln#I5vOw94)rgkTU|h+YAmUcA3!~b?{h;w^w7A8-sz4A)_Z`#x!uchT9cJ8CxsH z5;fdyl(|l(GzX7>=&i1n7IF=@oGx&K!O_44#?`Ry*foL*40k`btm}lc5KnKK0Bsah zWVr3qfUY+^kS!Nl${crm-odnOaR&){KST45y&B0oTRhV4)rD{qhz#su-o--L@evZhYTnne#D0;@&gl_w-n~=)-d;mn! zQjCk|@x$d@9M2n%3D?s|gKwVaV84($tV7F4#G7idr4Ce5!eG^kaE zG7u2OzA{<@xLS}cc%70DuE^(JZO`Ri8h`N55Aehm#UK1j z?7P@|@Q=?x<)CP($=6iF$GQrAIcUEnIbZii&gJGt$+;0}y%`vlv%c6aGZ`v*p7kNK z5lZ5ob+?&6nM*}H>%%73=^VVXhs7J)WAc#oe9QB!d(BHwtHkH|jD0432JU@|A9_p< zAK>1n_^ACR{TJ?iia&WmKJ|)wpL{7L_M{-(`{Y|Gv8RL+_dYY=ZevfI^fkEmd4%X0 zlfI_X=lPlgCVfqn&+|3U$+DX7^St~EB6FF~^YRA;E%$j|{za2sezi|-`NaNh(kngX z^Zex@lm7Amq;NqVHm72Q4*FcVL^)zc(f5~qp8q;3<8s>P`LEZcx9|EqKYLtO=oz24 zSG;c0IpJIJ;hmhEE6jQj>bDvoO=yfH^bpKGCALNy^DO&n^FlaQBt8;WV^Qk)9yk|dF0+1LHnY;noIgDHINROo%5 z$x+DUJscXBxb(lZOfG@4T8uC2RYbsh%A^H{%ede^G^Nh6IZdJ z@&#A#$#HC$#ULc^)`wdcgoPul3&O&Y)&*{Tlz_NfA0uH>+^vrl5O?e2<)K%|a?ez7j-|Bn)#TDn&O7TQ&$+Lg z0p4%S1H$_fQjzDw^dNk@O#T*eUN=$o)po(}*d#A`mrGS$r|=@<3+poEBSoO zI5y$7H2Zwt10vyJqzU_wgzlcj{kVni9DoXN^%nSoQHW6A^#N!lz*2X10B9{Bp!mvo ztc`%67McqQ`LPn;4H#9`m5Z{w(3;wTp@{YHZAXEndSnCi^gRH8kNNX5x|eSsKu}#- z7od;t4S*DNSr32#zOMjMReEQD3ZEa5Q-(SMrDDT;4FFvAoenU{cRRF>svVO6#`>C| zBuBL|0LJ@T1LR^HZiS!(-h%d9ca!9uSHJZzNnSGet*1yb*a=br?@pEsB%i~f{5j+% zJ_C{}dEdXnt`9m$wY(jlV_xe=zh@DZ^zQia^EOGcGGXAz#oN_L6Dpv%-zp+GnX~gT zFJLG5`UnT-g1;8>%4`JG&kllc=bWEmbuaY8a26rMbZVMlRGs^K@vh|cXvFWF!lFoU zF6oN_cJ{-nZ6`$CogrAwNsbMnL1zZS&J^cO#O-w)o*E20FJfNmIvX+Usm>{ko#S+d z)ucJCG0Ex9Lc|zRC)^AVGn`K^f{sox)NSazh}^9Ya#jQJAN%B7fuYn7UB!ZuZ8R`mR}3G2-WdxA&KZNel6rHw1-~{*^dt6 z*Ft`SW5Tb6%!g?FTF4vd4}LAA0tmkrVnZ~3E#w7kF8H;OA4bZrg}g9Vel6r_SS)@m zq)Bu6wGdtd;@3j1z{KF!LMCCf@M|GHQ+_Sv)Bf^nAva8Q{8~s- zzWiFqVDtgM7IGO31-};Z0F=P5h1`p-;MYP{VXX0MA@`#_{94HDQu(!z2gb>-g#_-y zlvU>R><(`r55aPJ(|LF&s&Yzs;HA`lr5_BSFP&PMZJ;zqPD_=`8~r)`nLot-8{?HT zfRXSB`;AJ_ZBdR@8XD9=W;> zKpXB*i|`$>kywX~+Kz`>=BGBvOepKOBx57iapNXUC8GeT`1~FqJU>B-U4?0yDKW4% z8!D`$YguQXXC(#J1ycSJ%)#te2NhagB^eu#itL>rJlRw)iC4Co`DGVyw%aY7`)WB~ z`(IAEyJ-FwL)o}9Wts(8{*Ak_l6hkYWbf}l`mJA(N=u2CT-cIk4#jQa#{HyfHT+8B z@+cVmR%4{X-{(9(FL;v#N)qoG6)=0j+cX}|Pve?nqaa5~`)w*fj-Mm)7S_tU?tkTZ z`giLJ&Z?~_3Jk`ID`;HRejcplC|q3QDG{iy+5HPaS1$!^*_E)v##1>G0sAjFjmFd1 ztDt@7M9>%aMShB1(H-=3j%%uI!3rABcpG$voe$U1c;=^|T{}M&^sG^+8@0b~33~Qq z&^dN`U(lC0pmXihiJ<2V1dT_~CzAMmG=AvN+*}DVe-+6XR&tYq5zsg=Hyufng3GA= zq%vf;W=Axer@xxC=>{4n@tR}l=H~Guisrk6LFR8peqb~#*2>M_1=@ZPcUy8>Pzrbo zv4-;+JO<#mo<=IuavX$bFnp$t=g7Fq$!qkkFnv_Z^viiB9)Qx!(`3ri=TlMwQVB`Y zK!_x~>oy(b`36N&a-~n1VY7>7otuQ z3-MuFY%6)~mxC$rK3rOAUi(9!?W1*(-GTkq?2VYsypHUgWxt16%j?8G1nh6iK^Ifi zpgpY+bmy+1@#^4$ikAb*= zof>OqGPG)%*BnKGk+KhVRK_X11X+9gnr0#?dX%-y|9=|mSsYqS{ z!kZ=DJ&r#M$AZz!`fz5=8f`#%;9O4#Xx3;aXd8#rv}R4%670~|2603mU5`SeMpLGd zW*FRfLkaTx$|KyypCd!>=h3+Zpv&Y}Ae+p@$20T+dK!vBSN%gzSahDARt0*XoJxT? zVzl)U0?@0$aIfai`T(@tY%Sb^`7;-4v;J6k<}X72!Cw3-;eP(WRP?%h4|7(dM)L`A z)O@1muV8kI`I>*QN3@PpTFdXTKFme(;9b`)MZa{ICo*=jkGHl0z1Zs)-?cQC$SJ2h zzC>Xz(|JFr$t=yhOgIos#;Lqqcp~!(IlYscw+_~1u9qV@d0k+9<_4iPt>vXKU-MC~ z?QZAWe)NL2_g&ETV_w@lDPTS>m9+f53bR(k?`!E-KtMA-ez%Hl#FQ1VA67?pqk!if ztxi1dSWt;!w2Jw8RV}}JLsXNmW$7nanQzVN?XE{rbN(cz-kw2iGhX26MKs3(e&9s! zcnJoj1&TXy-^(qyZZI-?T!nIoyaNG*K7$KZpSK8=yR;+by|iXL{Ho7nDA1f%G>b-5 zz|QD%$X~#FQ~KOPY=>vB^-CBL6!2EAK96LJIhsCSi0Pmf(54FNp&$A}>QV3+=25?N zV;zwE#<0GKB-LEZ;#LESk@udKvj!{2+-2*xK)c5L@eTkrw|3eev^ic{es2s_!UXBY zkL(6@Pnba6n@vD@!bA>IvxQ?oP6DgfkA%sr(1P#qCQRX_KtUO+RWq8A_7hfU`TvFs zNmwJ2M=XX6h9wDW20$yXk+sqY$0A`J$D$eEe@eKzGgg8OR>FpV8o5Rq;gly_`%fcZ zYArXHAj|UXs$dB^C#_gIn`tZpeL5xPNxu^0Kyse68IVIKd7PF6TLk2Z{6txjt(U=k z6Z}T&dm7;H5WO`=H6g)h{R#{$p+;}>ExMFPYfPvs6`IIkqQwB;#-A88_4JyCJi~JnRp~7VeQSHPkB{ z0lba%DgjgQU$1Gow6=k5tXG4~jvL`%jN7J?gH8oF=DSCTM~akWOAuXPV=J&gjb zup^>qV>iXac(o}0>opIbXWUK3_mSCQd{6K_%ndc9V~gF0y!-EN`(nX7Ou;vU7xf^xa9Lb$^I;B52T1CW4^7QS7@&>fkQ)M~^wM_-{1{r{i%W9i-430pNg~vS7Y??d@)+@Y5)8!%jNR)bw zX37KKCBSSnOCIrV1JZh~8Hr}LSliJAy^CHm{d^N!EH?2J*h<8E-GE=P)3mpNdmRLO zu|8NY!2B_(U=p9Xp5rj*W;@>z@Ob8S8$|Y&!D{EDNWHwb2yE}8K+JZR`{^Bf_&DtE zqS{{3WbEZ=neGH7bSHH{me56*J$*cB(~_7EJtL3XDfF#E`> zryGE~(HEF~1wRH{T7bc>M04e6touC89O+}|#@}S^Q_NXGHhN~j{(A9iGjUq$^@ogr z6li@ncEC=zc_Yfb4lhToj?We{lQ$9ca;?jI89+m2I=6#wxAgEZ_)27(9BOc%{E-^+ zckry?1`koz@dJO?3wWgQ3~ICl)_Pux)LLVdVJ=ZQQ=~p=C2rlSa{ARNP4okAkUmE%H%c zn+AF9`9RLv^&uS6hbYtfFGpdY1E93RnLTm)rzv&Vfy}eAaQrKvL(?i2@OjuzsMCQT zcJwvlG7aN@hjU@TeEv2;0paN;fX!KN0H7%BYe|J?5He2i6);ZNPRJ$hYsDtd;C~S} zAYU8qKl;d`kEQ|?1|divRrG#afVO-9W^Q_U$$)7%-|H*lkDuwo24bqT>zAWCPb2%L z@|_QJ(^CujOvUs}Kt7GW6^tHM0ei4E?ONd1`YcD`T(8hrfFaldyh?DKqt^!X^*p~; zdISt8*FHv4G^+$HUCUoqU`zc^qO9rwM)Pbf@kgBKl`B#Po16A7pz~Y+krf7gZ=Y1K z{03pnzO**G*Ho`nS}+22UKAwoVRK|LD=Wb5U zP{5)G8=%^~eLxzUrWVQE+()6trfP5S@2ALxC@*~qa&sZK22#Cg+rw$wg0fzph*lgy zYzBJ)Xq)gT#-{O9p95RLjezTo@nGSxrfByhWq${5ULoo=>sCTP8nEvq1>Xz79r&uO z?-Y-Zodon$dXv>~^`aGt;hpBQOmovu^V*Byy~UudE=oOHdYiV?hfs{?9U9N&fPIF5 zZ6aFyAHOH#Uyk9{%1@%a4!XKbc;d#vl3pp$gdG8`b$PiI3Z}|-l7oD&C;L~y5geZ* zCEPMMp}~?AY)wAzWc(Y%d@IkF=0)j=z!t(6U%I{rQl|s=?%W+XL$(`Zlh#cJCQEjw z4JfXVzSq;e&YzvvO;(Ppv%AMp-c7n&UxKwp2uixonx*-?L-Jz*yUEImh~A7@`aA{Y zw?J(Shwn#ya7h;Ct(K_3oUy};aZc*8U_95jEO4IExJ1ee(JPMFLn5Yj#1_NsOHopF z03GX_=3=Isi~#NdsMj=GjY*dHy~!bDJPTFYGRDtkjQrLEXPZs+dpt>Udrl zwc{o=s3xBGkEOxj;3#{xfYUHvGg!V_>}<=G7;V|VUXxw7c@V=%9n9l$>`@=)?Xo9i zm+gnrvc0H01C_h+vp(jVvf)l+HGT@mJS|us&OQGvq1T{nU;#RG6dHE>iJRIvgJDR0 zINeTrF+c25?P@4L64(8sfBI7%j5GamL7p4WOGFRimCN(vdD$1_RmSsLUyw(mVWYh+ z$U7O&8+Ae6*?8Wp3-bPm=dJuFuTv0{b73d6E)QTO`$mgNMNvrqrPutu4uieYloIYz zT`>S91>7OV=sfc?o>&&{SXm0+63bE;CrhCVmQS~jMu5LkKhOrZlZnN6CrC@DfW5Ua z@%&n-khL;N)`~u~+Xyt{tCH)2t{}VdGm^f^g0}!yh}WAU*xdBOyb4)K)v}VT1*`Sj zy`?l&meMf_kez3m&aLM=3V5Xw0;kJQG@6@^%WJ{E^PF z-G&N-d7EQ31}+B`d7R^`BJ7Ni53DJD6oc|q9yl^u1;`(y7_a@+O>zYByZ28F9 z+r<2Or!OM-9I$kz46_=AcwaLk4J}A#(!z0#@<5c;a$Km9RGm{>HQ%VHtvaN(YBj6Y za{ND4mt!)e)yBq#+NxL8R=tH)YdJ2gI*g;gqqb@jLzF#MTkT_3t1Z2-n%4guoCLjM z{{Y6HL^)?@BZwc+I{cWmY4dmQPHAkgZ1A;F3PYH3sHc@L2NMH<*E}wB)00qXkhSSv_KNYqpg3orE#Uk> zxTI#E)4<<(*xdBVJgt|7mSsdxmw`_h41KSNAyz$7h`ua`Z^lo*Z@^~4ZPz-&UDtu` zUO;@5@dRNJ-MsbMA@o!qDglCZj5}rt+@n{6>0hX9ec7NP()n2b<;&3mUEK;4 zQe$p*8{>I5T#&ato_F5`dAs9zPydtG=|DU$E=wyP5zqMOAExp-$m8z#OFR#uRr#?v zU*h_I6gd;m%f2A*yLevf3-Y+2#s6QBmlDq#bwOSfdB3Bxvm~!VI-4KoTX_K=zkx-0 zH(roe7SFr?g1j;Dyk{=Rn-R}DaY5d)c;06hqt zy(k)jNz`i=(-OD~7^R&0;h5eIRpo$v__^^#fSsplMn8s%Hv*J>f|@RBw&yKLqnw}J zdldgWeTV!y&v}h8+{2BeUhu(F8G#0{vTMZd?!G48nkhGUPN8N82^8eB2mc>;Zyy*{ zb>@%XnKR^tH&IZdrWF;Hmt@L~T zF5N~ZwrOQ6ZD~teM6_w8TiVh#{fZhbyI;2D+p;a&rIxm|W$X9zdCom|Zt!LM+ueVD z-+`0oInUd9&U0Sxxp(gHrz7u_eS*CCU@NlvSfh!@8ec?KdZpSRy|PLlYc#WjH^Hmo zL795iMqyPvLsOq6T0Q_@cB0t3v8_|R+|K_B!gecov*7PNU~&7+eOpvcWNeI9?A`*{ z#98(pN37N><||-GlT!Kojwy|K3{4#^V&!*1X0^z~{C$-i)nf;F>LZsh_xDVI!v%ps z2z5!M-u`Q>?y~hNkkg0>Sc>&&#JzGFu@L!a8p5LP3s6?|?cElYP%e~bnpEHJZBaS* zxj(=NslGki3T5lINFGhx0R2KaV^|#E8N-KZPtIwI0*tnAd12rNs1*nJy_wQn$2eRcEzuYlpL+d>`~0A^`sE>Q424e@+}m&&50$N0jDr|jHK+k1FCP=HnblnT|7gz z5F4T^{>FK->I&=ro7Th4SJYHk;KM4u{xiExpkGlO0XM*T9q5yar!;Gj*MWRZ=|CRX z8kNAkt{6C9rQQRN$V0r_D19Z!>J3H9s_*bt2JTIH{Fg6V)Ei-)SA7S!>OlTj9;E&@ z_&SiMB>!{frP2OLvCpSsNb11e71)Uyln;UU1r&3;9N%41+&CA`y&mQMhhn?k4u$Ar z91MR}7sQ>jTkpd`-`nEOa&q~DSxz38)?3R*U~)Y~3-@8Sp>C4q-vq(p{cz?1Fc@hx z!lGlyGxR(FBLUapp!~H+R0R5VZ^hCT^DSgMqhYj6eknwB%jq@?^zDKiMq8k7&(;*! zs7AG3(Kb}y{;f2Dw#5R!llG*b`~#3-XJLLL3YJD@_2lt6JWj_(5A-?t$=3Zl(@~Y> zY7(lk*Uv_u^AXeN%capj1&(g?Drxi|NMty=R;baVYo$a^_4RKpl$okp^1p|?9!(EQ zr^wGR4Yx`ft`>RSiB>zEXkcsf4`X0|jY?%PeIr|S!=6x8*P&t0qgoc6)V)JLfZt1_ zGR*Wd_%9;QzO`9g_?_h3Y&opxj=4oTW(}=QLXZEqzlAH(LmzW`=>DyGsP{;h*+j)> zg79gF*nI~1=#iOjUiA%bEf2%cb{HzW4P13l6o-H=8iE(2JH-e>^C^g8><9WTbV;XR zi#k`z=s30oB^mr87Sr7&(08dT#meVzQk$VJXFD>~1AP}^NxIE;=|7g7G2~~!2QIbf z86tuXRf+O%MkHnK*&`jQfW>p((A{axJCyD}h#if3Y0Q3b2C!)Q`fvD{=`b(JN$z=Y zbcgx6oaNSH%;^sB4LP#qPY>%O*l)^_>j3gmIf8vz^0?UIv4i^77#_1+gPFFx2r+&6 zqcGEk^;Nw(=FJceO~5GR@rQbC442@Sncsvl_wi(^0!=e2yNh{t3S}KBRinR}cz$H3Yh!x_IbAq4C()HRQ zoALb!GDWLAqN7$AN)-=7YNJT#4(qLC@g&sgV_Mxek73Z)Af4U1D64oH1U@4I(g%wV zBmdQ8eo-2N>IUTmI@>ErrhOiDIRFRG2~E~g8-cd$Ecism81z=oocGcM82Q^B28s7L zL@V?duBO%VvOVy96e{|*{PVKk(D!YR$X?^NIv)gI2=E)Ua@$h9C`vP`*+*WIuLjH* zI|KOF1N?&RjMu}!hvXS)eH;H9vZs*Cbrl|CEttCo0zXS*CoDpD;i<2$f9uE182eco zS7QEtu^wYT$BWJIVlhbS+a71rc#ryS=H<4?zozl7;wt3z82n`#SLSZy^_V*+@)&d7 z2(!|;rzu^BKkDDoc#iu|K=l;-ne-Dl4lh55O1Hu#J&gY-Chj3)1dM^bW+ddNb5HqE zGA3bd`3M+=S2eGaHsU70T%3l__>jzA$d_fJeG>%73^U!`900hef@^$0hSZS&TP|y58-3?z8icT2Xu>rkD#Va5V%s9dZ-N{e^WAVpM-T9 zD0B?W5d#NY19lbKhXOT@z?~v+$Q4-B3IXHKqE7T9lSyUQ$h+l1H0=HC>zUJVErJO6 z`fvSvTY7xg(%U(>~ zdMk=8C);;3qL~2|vk^sCv+n0t;?%~}i=gktpz-zpbHc=NV=Cvg@582!!`tZYu@5`H`LeBZFzB6aI`ZyHdXc4}4WR&RbL2 zQ+#$*b{XBN`c9yp${tJQ9P|-t%8sN*^1fwkza6REW-Pc3rQ{T#6rFEi{)$D&_X_{# z%)c}T`Nvc5gnY&AXfL_u{z@8u0<_#xSh1c)0Wv)wP1VD?G%7c(UzGAN%FE|L?5hyd z&GzpyT)qxl<*i^W1f$Tu0EJvDbMIL&?CG%1X8c9J(~Ov$*c#~D_CoO3fPWUAzI?0# z?P?f8g1lR)25&bGzJ5aE9mQJJ(B zRl>ZPRf;T31yeChKf4bRe&l*Ys3+}%00^m_0Um>p1|EAXW;0#od0^ZuL`;tZ616}d zCNZnH7MwdZhj(|ea~AS0kgJ4T!99#eODb~^?5z$Pg*Z24lcpKZ;!_a%s5Xs#h}fp` zqBPXl6CKK8PlP%j5n(-1uYu5rjnGbz+Z-}Ck&g6Xke_nMvyDH(Jb&Q%2~U0(@*nf$Pou=IO5V8{k{lA8d~Ciej;E!sIx=k7s84o% zXovhvusgrWdUE%QJ=VSWqel4X^*peSB8P|OK81Ph)4a+a;knrN(P8E^*KESk9OY(V zhPZp3rG5;SwH%qU5orD`j9T|Uf%Q>!j=2EBcppuDXwZzRPPzQw2YEfJHp}JzQRMZg zdQ>j|{}1yS3t^>e40R`B>=$;dL4NBPzQ-q*`73Wke%lz{fLVroR62L}nB9=~_f-}8 zrh&bE41MjOxIE(gm>dKAE%L>gaPkkRBCfUB)-i0}8Kb%E?O2iQYVcW|DX_;l$tF;Z zJ*%)8a#+({mSuN2wD}&|E{A4&X#EbY)lzDl; zexp26vJLswaXe}9h&+>zhZlf%$}RY3!MbM%b-NGW>-25+oj{#`1X|f~l>X0f4Lx)7 z!|?hDC%Q8r4guo!+q3AI++F*R(4#*>We$HR+5ZB+P4PoSWDX}tzq}-tZ?w4cU!d!M zk=I+losI12D6%in=-2YF{eQL&*&%MSUcsj9jXFA9?=Ee>bn-GUg*Y5w-N+!#Bm<$?W7M$Sxqa4%z&pFqQGLRG)>x zeE?`I_?K0XdsQBPJO-I#QrznO=wi|=ugV+4o`8vh-`xz!*W{s?XPIA(>A|lbpgE5G zVs=UYh&&zOtB{AB{BO!rIn-Xu@06TI0bxYf|1bW^FCqW0U?h=OLAmm7P`(2sMC3&v ztAN}?rRsk{jz6tX{ck{?Bk~6zCyDTz*Kbjj(0{v2STqzRNP~qa{qN7{2O9qS_A8 z`|$jull?NX`3)$Tb>fV<6%NRJWkb`sx3FN_ZE*5AY0%@49TX@3FAYXWbopYh!A99)rj-YD@r408qYEcsMl%flFH$m?tIo8@~7 zzi0l-m~_-FK7O}x>b-FF!)uVA=98~Qy4Uu%O3UH)TQ_~zuZ(?^(h~pMCH}ZA>0J3w zm)3a+{KB_a!rBZUPd$`k)P$`H)Ez0er+8xS(3T05ZCW{cOaiFd3{9C=F32| z?OmuLpTAeAUvjzQgKhS4u(+AX5LQg}^>$nKUMTURE7y_N_oy(5*r&i@7g*$QwtyBu z6d2nTLX$0K**wr_p{&wDtcUoWs9ngNw;1Y42hhKt0ckB9ulXDhU##Y%04aau-$eEE z`1>L7s=o!~X(B%a@=GFb0J-`;44b_iaz8_E4sz9R0a*(~9;Hb`urg7S`m|3TrRfGk z9%6bLNU7nDdX&amuw*P0a;5)vL0{i(UiUfEDRQO%z5oNd|IU^!_+#c}kmboc)8;Nj zv&r4%xngN8^K$q24(ZPw$n!X1o@ghKi`JkK)SZ5o#M6`q_;nVw(cg*6mLCt`4;Y2F zO$Bk0U!Fv#$)**^FP0~s((i{!xy@N5&j;R(d|~Dy@QcNz7UrLrf_y}V*k4f|w>nGY zd8_BheRe&#IzI-Ag;@`{`31#mWx=sU|W52!H3OdJd3J04eH%N(NMRK%s{00G7E#4K;jA zYiPk&S!#rqQVouEK*@<2S4ED_jXHF4-*~~PWvJd$5~#fp9WO5Z0VU{p>M04-=TUsY zPiH{#LsIu2A|D%sIBUY|9q+d>Y+Ribf=+&=n9KhH9FBpM@<;wnR6mHn=V9Z)1|Yu5 z>UMyMMTqAy=oAk@DQ_IswLk}V3Kv1E6+35P=T1JA8R+0cnOV@7(^mJe71;RJ)z};% zE03iF9--PMW_bh_*!(ffpnI5=uMKSB_qV=;tUR<5c+y5^wgc3wi}kY;h$*SNMg)QjXFv zgtbrQ^l5xC+N%q6I^sHkSZu0*`D)oUfmsoLx@RH!;$jY+n zTj1lb50|IG=qJ96Iq~yY`+Xmf?-KqNLTmpQYG1k-D&8=Rvs%1w%?dwgi@a z5saRXe9zj!&2&}!I!VUs2`P@Vnm>uxa9F>HqOHXimeHvK zuLClp639d#+lVM2tj0Z*e=vj`p5N|z@Ge1yyB@q>kddxcHW1D#%g@0$rr_IPm}@2v zb4^dtjn;v}r=m9O>I+25c}M~s$qr+NBBRP-+{MNxqX-Oki#B1H4nR&VIP6e+w2JB* z?n0IEZ94$1%a`R-cfUwz+A+}Pd=nkYXq^yo6m6dYYdYfhx<`B(s>V6)mkteb`PEA? zz$DIM5)&B5D;o+#bjh(-K92}?gLWLDEH#Yk4?C3VzXS5mV69-+JpsM_Y?R~aA3F@a zgP{Ey%zH?zegV1ErF0Hrbfg0^rhZ%>N!yvEEt&)x`G_{=oLXo-tGRqc(kku*;jkeL zZnKJaf$$weI1h;d5Z*L|5l9>Y;g^Q68<%uLAp8l%zAZ$#uanPO&=nTFkwvfID*>ty zz2mIgZ_?+#fVyo2?N-z#i8O-J0?IuUt9}f*+ptTm{wpAdfIRqdAZ*zOKP||~u2o+I zGK`+t_&ktR-*9rPz5}EcD_8k>7}|6MHqL{Ry&T9TAg>Zh!zJd8RY0ZyDFRY-0`u!a zc>9azQPxeM;t9d7H5WjYnFcqc*{K*!*#SNR(c%o0@<+%!Q7+zv{8$v|VPKDfBnVP9PXP(5@CX`@5BY8Z`D<4s6}MvDV?KJ!~8BCmWHi zehqb8jT$}p6CkXF9ma(J3=DnRaSevbIzeO4wf6ww*!h9ug!wwB@!}Nt967(xUSMhG z6NTEti{R0lRFr$UM`c`8IEL~YfUpG40+(607VQO-s^cDh0}(Bsidxjd8n3u!j^$zB zE>tD|Fs3Gc;eZ8iq1-&kjX#RHR34gZm6z>22T6UKOXvT9eBsDi1VQIB9zgzljhml` z{5>`d6<$RDQrpJzoO>&Ytt9f9e6>@Ep8(PB#7N}f!>^^Xc#c85!QjdtbU0jL$ zY!gKI5?J$qETOORVBno&xx73Ni}{&o%vrF=!00=md3sZHtV{aXMhMzP7&v@XtN|8S zfL;s{1p5*~M^4W>IPFkBxKj($?D*P(sZL)%3MAoo&|mOtpwOsE%ZFUD2ETsdi) zjyM$sxDFP49qS;UrU8dr8~?`I7p;J@S)wnJba!eb2xG`R<#|{G)dw zUm#zO>t$ZPD|4^!rd#k0G~{I+4HWn}o0RimkvCt&&|I?+N)aFLc@%y!LvS8Bvw-|c zNPg{@G>|U`O2?t}w=ZGE=8dGlBT`deW%*f|VU%zQ6484Z+7$mc;TxY( zwVIGk_4BQgt07nTz%1m`{Ntx$^+n!32ff!37$1!CZWvAi%IYgu-Lh4v z{MK|TUx60=FnW}~*}q4~1tjzBS`Ema@g$xI*)SE%R z?x#3%cpWr3ze&Xnb8!59{(lv*el&UNw}D>A-?aI&5er(;62wQnoHl8Q?u)fwfxGU} zHPHT*|Mn!gANJS3IT1?~q>4cwM`YZ$uxO2At65D?H)2B-lCH_d9=CZs{`{@5z5~{T ziC6Jf&K9zWSR4KXYSzbhlkgqn#g^5)VJudLg}!G+j(_?yz)T5z4tVOM0IsG!fF(Qo z3f~W0iD&(^i9gnck72W#{rfX6>o}F0*WJad96#6oar~;MBbe;vX)X9#+fjJh3PLi7AG7LTf85cv?Z9;l8Xg4V=M1l^6s4WlzqW! zs@;GpJ|@#YkJrX=n$!{JjZ>@XHFTbdpO!;Oo&)H2yYYpOP00a_rN#0? zculJtO3G`_#aIa)^l?ihWPJDj7EroHnAcn$;q~`on6PN>gR~DU%^BYJPKMrJiyn7k zT8|G3%Fk+BO@|%^zgPI&L~1_U&}zA16}sSUw9E~n_FOEpc2-N%8n9=Q&267&UJ-Uv z_uVl3lypO`Zca76S&Hz_^Ro+b^7g#6j}L2GO+Sab6H~;UOXPDg7)R-GjP^Lv5YpE$ zpjzXgPR#Smph!+ymhVd6trI7YQxk8Pc%|>E6n;6#Kg}99?w)Z9LrPs^sfl-u%O6*a zf&va5)8m*cAOh0_WZ~O81Zk6fYT~$YRPZ62KEc(V2kEg_`)M=6c=XNDgNrmXC1CWVkgKP|yUYoA z0N^%6>DtN2&A$#KB;ZTd;5wgAJAD03a5w}bH;AWW=nXxEz66M_jgi+ih^G>i54xff zjT@7GQgrIIx*RccQ_>7hr5v{%o42@bi@nuv3)qbH?g&5x`sr zMF?h(^D%~b-jdh}3o`z$P`bsOWPyHk%(kfs=_&T*p3>GgIo>nxtod;>nu0!6jlaYf`gI!c3t_EiMUCMzz%? zLXJdChWw02@>w=P7%5=kA%X-D`H+Im5d{e5A&nLwrAP}9VE+w)j&s`*#MVg8YcDAt zr8rhSn64&RgQTpkR<~#pnvhU50j@PJE1HxJEkMxu4gpejY5{`35rOuRZ3$v~CFk{x z;=7Q1R+NB3DBCL=b)BR3el0-2$0kR|g#yP#AWC2ak{0@1feK*qIf}m&_FG}MAc_TG z-EYlJ5YiC55_w1b5}>jkPD>C0lbJ5p02NBL5`jFpWGyE+gruD&b{q+Y3C;<+oZvi? zmLYaQ7&gI0L6;L;LeetC_~kDj-U9-__Zg0k%6JGIMnZ@QjP+=O7{$S0CHSGNJg#BI z2#mL}1hHWxpA{o8Mq*-wE`UK`ijTRmm;&lS5vU}fp%ixaTlNHq>v~t3dK(rC(ABLp z)io>@qbpo#Dr{J~5<2$P5M!gZ0`5dYoJ}RXZCwi1pk@=$#cQmGt*Z)3rrq3WT{DF+ zd%DlMW^%%~pK18I7AYyCr08BiqG}V+#rHC3+<$+Arcw;;G;Nq*0BLkXQ((IY#0ZQ) zvMDk^trmd_0t#FnIeuf1Jc%4&FA^pT;{#QW3dttmYbbs4^n(bHyI)9Af+0aG2woP{ zCZG=ePL9e`p!`V-5byzhkI^JIn&eg)hmzb_lDqt!+zP{G(G_mz#IVH=6|uYuf(#@- z=C?3lzJnWE=iwUpK5H4-wHh_tg~%2O$tKWsz(I-r41jc0a|!r%Nt9@~hu)Wa4BTO) z309kR*R5^V!dq`|vu;n2bP);Tj({d_w)!gjs&AJ+?P)2u-*syehZae0#rfjOPI1E~ z;5#HeF|S6pRY(;Cl<nnD3DH03LJ5D4cd6(Ez|xbfA2lr4EC;>M;9d z%_TT5=rU7ik{dPL(SwZdfjq6%3ADOf=c6F~6v=OGLd5ikB2#c(3wH>nrV(9Az;`Q- zo_Z)75ZNe!mR;tRO%8XSS{@Wxw{C;T4k0mQgeQevNpR626I$XzrE!pl%k)e)1~C?> z8^aWxDoYL8%Bw`C&vH8$tJ5STo1hCx*N)f$%^;YPPPJtOd}re52+&Bi$VLgYy-KgW zXoB{7wG2Uq*sCNk_L5Pey@ethBhdD$y!K*ZZ;}|PA}~gh6F!aPiIEBdBaoc`=DVi< z8&x+(bUPRq-N>`n2aq(I7$X?4HlbBaEL~yKOssPi5~eo-8dX;7IYnc;HJzZ}(2ZUx z2y2kolL9D)!6i{EQL_p7Do0PxJqXeu4nZ-Oo(9ldcYGWM z_mt>9KyHTUx@*!&aLyt5t(-&{?DDP1ux;L*r@$cK`}Q=0*mNW?2u556u}hjkFdk)U4Pw*8 zgXIKtMl(!}=ucSui4kaj9`O1T6Myo=(FX{+1&tCId&x0PduzmA1%bA=j5V4hHCjf% zdSq~?Gy5j|!TOq+dcIH)(WK1nA>j8LjQ6dl{xP+vvzP;^Nzyf_p#|d=q zwA@?6GbFIbN0XSPL8u&RHPHB@{5op)9N@Q8KYYT-Tg?YFTnvM z^!jtyl<5!oIy5W9GOYV7+|JaWVPsDtjj>jIB=C^{Q5KoP?8=V>O!ZCPsL?2`F+_wT zg6AX%Sv&8TG7cD72Aw#emd$a;)_Kr$-8(W8$?76wO6F@ZPa*{@z7W$(-480ZhSLcT zAz_P4Kw*-NC|_Sn8iF|NHUNpkS}>200-h~$2SRcT36~-S$B}Su(VZZ|q3O9q$wJHV zeWX}92=?fPywJ|dY!}fO0kz=41=oXlu3kk_w1T26QCaPs2_nNtaEw5k0NvD#CUzs? zf|@3@WA3%}d~oOu`bm;&8(sS9=z2*_ATxM`9im)8Ks(-;wmLM}Hrgc7AjI+rbntPa5Wy&c)^V>Bl77aLI?JikDLOF%t>d;$7L0EfZY4pl zpf-UPbT=HPx_)c6J0^}n`6QCx%1scaiFVA?ffk0eL4wXHQbU3fBpnc9e3_!B>QoyR zwI~69Yz94tKnqqH`y(K=LLWPrq#1V)MDBa*Zin7ZBxP;tNDw(7hL#Zw8M-N`0|Y9t z{}58Z<1l@o1MtJEp-JvyK<90#sZG$UD^0KmNk@a&G0h<0Jw?qhc4=gu2t)}e;OWTJ zIV;?yY2aw?Qlo3QtOcbmTtnsMMv`PBItcc2VyJ?EhA^M*-D>#zUH&Q$zu)CofxlAp zR}nb+yIektKa1kWT76xe*3Dx}eVGa7>5`#Ufo9691-%!EJ`#=~`7HM&fTW#B%G!d) z1ae6DD+nkmbYqLoge7h^!8}1%5%6_=sOBYi;8S#=@S_A3g4zTW^#q=Rhmh#sX~4IU zu!iDwg~YaJQ22pX=xj%#&;X#e@qqDbJ|zF5!b%~iU0G#Zf!7yZuXlsrkA&%+K>O7p zkne_s?9Q$9!>R60w^jB)dO#E_2pq*ULPv3zS25X~RMgVp1R+C!o<+dAOH=@-p-_+s zc(a6L`mtM+O-M*KF)4sntyoCzVlEwemM=k!z6p!2vC5KpA3Ny$l@NVDD-!zUY!Frmvxcb`bWNo|rS})KfQ5o} zydN+{pF$xFGCMh8npmwOxI)k<0beqSVbYx-k|Fde0v1lqq!TNXC9gDb^Gv_VR_i!p zd0LG*6B_L2kTVXZIe|q@Od|uO>^Y=SwRS5-9X1GEGi||>2GbJWA<~H|bV-eD0^OmP zvlr{AE@v&+XA#w8{FWQ{D#58nO0n9lEf$s`gg6b!Bu0?1^F|h5 z)eBI2v!DcgAt1s+p#5`4=ez4Kqy8~5wQK|+b1L@v_a(fH44j_3d(uM49A=w0Lb74*whQ15P9+M$5fP~%2L4d=CPUM)T9|t&L=x2ej zMpE)SJ*%K+bcUUp-qbocp?0RiI71QoveywI)UH&}m7@-sPgt+m8&3+sS zO;4a(G0LW~U<8-nj5DhO^c28Fje;#7#(OamrVD~WLEYg-?tCFd2{gCzow~84uG=Ro zp-?5dHi6c4_e;A#>epOjjuOL~L}1-Yua*-`LeiTNVhc5cV8mq*JF6K4e0`w*X zAwkg;V?$ZHR?!6X!$^)lR03)Q>Cbi{tt8NbF#`I4W%@Y4Fj9*3DAqIVXMyYLtu!uS zFw&}y-AZGb+3~kYVFY|hAp3;#A@>&HMhP_6?VgiB`p>xm>)~Nv!l+}9fSj>!EI_7z zlniq3BGc>l+Ck39WWtk$;^&G|fG&+52k5<>6g{x_B*M9=d>I+$FH2Chb=T0DVSH30SZz zX8fEA%PdodsZ$bhQxGQWgWaYO$(RBtWlA8H%vra>hR2!8kr!{3OT}w2~kX zNn*Yo2w$`*nL|L%nal+s+9P*}4?y@V5^G3EMbB>bAc~`5%s}%2Ml?#`lyJ2BxNFp% zb7*L1kXp+K{zlN~cnD4s^ESb5L6;GHLeS`b0A0SjnVbsMg-CRdutH4P1bjIsW^{r< zBuW?q-sWO``=yO+f5+VBJp~Ma5oa~zyKW9D8W&rRIB~5?c29^xmKuR%+P~LIpPHY-ya`ilh9AjpDnw0~G7Op!PjN6z@W zy4`@Uxzt>n+$s^Yjb#c4Bn&nI-}*Ru=R$$WA`m4o0?C{Bq?C$)O>hcHTOf8?GYI(h z#?hveno*;P$)0MI_1wEj3dWLx4+%tHZ`U~ebndtMOHegH~) zf=h0-kd`$7Xu)MkK{w9y`S@(=+5{(&bajcH(+q-(E`u1JKBor3UL>tSZ2UZ75X=*F zDM1I4mLWFpPLUz71zk$esi_15no4j0Nox{ox=S<(wj*fxdvq6DT=(FC!Bb7(zEa0-dVMiay?X$HacxrRY(I}$Vq4!8_rCp3fL zg3BN_tN2?l5h1g z1-W^eL9h@>SCCkxW)Q4#8N^yOgP_Z05ZkL61g2-l62y*b2ElP8T?Vl;nn7^EWe6r6 zI2Hhy@Sj5SXzLOAss741y{oT?VlR%^>J-8N_yL27wtpu>`S$nn7?BNt+@z ztQiESTn4donn7^MWe}Sz!zxBF%^6m)1hHz(;Lz*UD8X(dT^zB)nn7^PWe_{583d9?oHG|+dlGA3uE@%e9C6_^Lx{Ui6 zK^RGE5G&9Of>M`3Y>j3RaJJAI#2Pe%V7tp8)~gu=J6#5`U7A6#+hq{jqZtHyT?Vm! z%^(|ub_Ib6O@(K6t?<_1Eap+1q00ij5Ka;2G?<17fjH-}X%3zRSm5BC zt#&#%=b=Fd=hSoF!8xhS$C#xZP8U@U&KaV^!8s`mIXH)V8b*Ya3urqyhiH?7b5tI3 z@S}h`5i81bFdTJo_WuzFXP3X=;Oyl?h!5r2VHYAm#M#f-zQoOkD-V|(?v>24@3-=# z4Y_{s;Riy-ikof1Cc(oALN+e8rUYCgC{B1maNM5(WC&@J&=x$LAmn^cc|wMh<_QlA zj>~O8PUMs!WSA*K7?4onL0Ldf-IO6@_$fokkh5IEoq~rGgq(&cPk3DLoCM)X!4U>P zPP~*MoFvVVBXe%1;Nb+}e8F>N%4O5BTtYS-%O%_{csN1G`II&Z*`$;wyyVac=SvfY z6NDTd2rU6yohAvn6On5=K(;jLgj1x&@!&on2M|;VdL1$$Co_-<*e~b+;jrMiYXZpG zODqBgq^}^zfSkNYCuBdOE@8Fc;RIo=Lnmw!JU2ne!HHrC28EpGUi(~h_tllA_u(R& z+sqF19H0c;pG>s+I#aF+Uo&NvzP-Q>w-B|42tg~-tQ(A*Dqb#P>I)Gw+LG1%f9Nv8R7yYMX4VMzxp>pAnr&7Jmu;?- zG}~M%xooyGFOxLeTrlZxN|m@C0uAH&d=njFhmg<%2~N5UVk4SC zz+XWa9l^ctW%4i66w^`4(lmRI^AWqkwUb=;l#RlbqF@v7cMnGQM+#JnK$L(2o;ywC z^0n8fE`jE{QR)O~Cz1?Jz(FK*F@l3g*W&%&@`c}xfzjXPHLf>6h&E6lfk%DlFHxsA zXGGm5;14B?t{Vl;i9nQq0-hV5D?3Dg|9`OkIR2N~3Io+RL0gV!T zTTr(r7(x0=$rDJ#35T^PLFEFe2ElP8+>W@kEe}Q3B1wjb_Q4&97oZn_FwNxwu5obw z9K!_%C!8j(R~icxx17&Tn4lWE0)bQXMQ_m;w;4rG2W8P(ZNkiFs|Z*N+@zc0I&m1rri&Ai9i|zywZFDJ(wj!ZF5zxLjShR53u|^mc(Tb#&JIm8&Q||j&3Rng6rzL3X zED~nzX)swOX5Bhm0EcAEJ;{>XY3Snna?iP3o4QS-Ewg_8nnb{#TtHXb)onQ+@(&0< zN^l5?13j7`c3d+EPC(IbZM9AUo^^1-^GNWTfVL@OJ~XW@#0V&jqIY%^p{#eOf$Wfw z+>q>XwJSW@y&i41C5)?VN6Pk#rRBy|bZJwhx1|G+vUQnwnW9yzQ7WC%=xKm68Z}j- zJcYUT0_cKl%2OCr%Cj(_Mu#5l0ts7Ad_RyF)sVyY1C5KCXEcW0Iy_(mJaa4k)&;Lf za#t8#a;G7&riAm6ux=0(2wF{0rKtpKknqJMpZGF@3^iFBR^#$`(W0`_-xkx<#D;=S zP*3PaQ8HeiDvbn@_bQ&+qcq2Zz%o$-g6T+pYqLOIu^0hOl1$iugpPF*fKGXKWfzg1 zejiCT0e|Mh6IF84gcK#v+-0T)N!?gd*Im!3Kr*96ScK%c*+g4SLb3_?V;-Ivjofx2 zMF}+5o&J;DnBk7z`gA~Nx2U@vjwU{(Nd)}0kI`#41^PuGN?-({?qq!s)T1I`6TB>_ zJKXqFAV1gKa{%Wx>V^v0w1pC80{--dr?wZty+TM)f@y*-C7__5d5k6g#>adSunDv! zH!^$?^m~_+0dA(&CD6KVb28hhxdelPx?8WN_vLnhyIU08fK&gFCK2!#H#}87@Sk!= zAi=&vsFhvQhd~-f^2{g4kUc4+D8cJUd{D=HXkhC7qCv1-P`9flxzQx|fp_Z040m*I zvtW%JjIehX;ID>|!|D)rim=;gB=MI*5T3BhbpyX0q=Uk>3DSy1kYKW)HbJYV670}a z0{$3-C+4(tKrBTGG}qlUW-P)n6B6!Ar!7V>k$_Gq!o-9G)Wl-|x+6%^IDq`^53~fq zB|(=GSYpa1I4kH<0$QdXp)TKz!XT9XXXrK9H2p0@6F1E>q0>AQJo!c1TS@MJqXRU+ zi&k+yM&LM~Nl53g582=CsYxbl#M%ghh*PahLe@bTrjE4!UkDA==mGXirfi@rZKtLZ zI0a7|0)9-B2^=2|xEnVb>qH7z?LV~=#Cnl@)+&NQL1P3%NXlxPm>_Z->3XaEjJ3y? z_V)Gjra@J(o7%0LZ`t8XkbfEpupv!yFRgid;f z&q4YvS~kHsK`Sl*1VnHpfj01Hs~E5~oq)fLgw>lpRo5LNCjL!urvoYD-KsM7?YFN_ zkjt1{g@a#DHHAld7t)o&+vY?-SS0U7y4GWOlmMA$klwpwav82njFpsIYMnq6uhF5F zf=o@0BN!(nE>Qx8NLd}H1Ys1=?FPF|IE2Hv=zxH8xfxD4Ct>4^Hfa>m%ic}Wl!(?& zO2&*N3wZ?z6COcrgy>QN{?y9o9R+2Ni)@rY%P#lICN~#JyRoF*WnS6jc^rS9=A78I z2`&m+NsuA#*aSBS8YSSb(qI`Nm@cSIz+a@{iUY7vQwb_HmA{F@!XaRM@GQ3TT<&{# zm=t)A>Lvx=BX$&^FKj!)_jZPH--!hO2>7Od&uBXi5`Vk|6(PthWh3ENU=qYGmI;I4 zZ9#2ZMmBQ?-D##q(WxkIa5w!Xty6*N%?BQr7uAx-xn!eH=jo%Ch-nD$qQD zR*m)o9Mb4f0PP$Q{V@fNfi6cNHY{ry^(*&>7Eh8Gk*8#iMhvF7Mm>-oMMy(tm%zYF{ep%m3uqWmqxXId(1^ z#!Ya0I}&gC0_;S>i0|LZ=CLI(%LpD3)F#-ksRY_vo8BJNRDuyfZGsFeVX#b)FQ`q> zrKtqHnrd3L6~*_8H!%Xon=@TR=n+@eE+Qc*BSt_cgl>W+88gXAhEoVbAQ=+`$(Vvo z-LdGhtkdGdGJ>;6cr(MM1QFf9Q36iIcv+#9iJsjcy}N>dvo6Vm9~Qhre(moRa72RO zjGz?+XUc_2@Easv5>7&OGNpFQk`tSI5zMI25v=|MyR}u0u9IR)M%WasPM|Htl9t?I zwI4bMMcpRg$i&G?QqaA=90oT7#>b#m;h;NjmqI~z5Szehh5cP@1-2@}yT8kXcRyzJ z<49aC3D3wZkNI7HIMZ_}BAajs34@eiSkR>edZEI>uvwZQatN(TpQ&lAEre_}5^03m znp+eS{_eZFHsK z(z!{}TeqAMCK3tB~BEG4&c zl+6->3IZdLyuC|-g-Co#iI5V&J56EpKznaj_zN{dNT}Qifa&O*KzCyi*^2~}fIo@D zwjvylRs@-#0f}V7CQT+dm7R)*;Y3%cyfybe1J`K+_*neS8-N+ad-+htT^%A=bJ`*PNgl39lgZC5W_YIxUYN z3H<_)OGtKDp4lxlmCNRO#fEL6s)t_3YEIuf73~Uz0;2QoR)Q}cD z-H4UeB)7JikXYzw64r=@&1UIz$b`L`Ot9M_6ZUH|!G4EKsLOC$E)y>K#jSvGPGV{@ z$AO$dI*WA45CMzE-~tIzzDJ5Lk20TW6S1j5 zBAu_DGM`q+bRu;j4Iv#zI)P+9d^ytq(je0K$=J6etwA!M;j1x~Bb`Cw`(n(8uaY^2 zbR6k~hu(WF>>(XM;+s*-+fCyR zGzqrNx34cRXPV>t3CPKpwM~_8g?~u%kme)tTh4ot_(fWNi}nQ42ok?G%dfwh55H5o z6KOXRzj)b?ba*;qigX@n>P*-|;+Gxyy+iYPS3T%<-i|oDkKO=e29XXT9YW%_5&2z1 z^Wiu1js{U462BE^KKx1?zwl}Kfvf=?IHcBEdUok+Wp%-4L3oOynW&u;NaGV?Ky zMe<23K0swY0pMYWHt3moZ%BX+mX!Y5@h&zOf?dp(RnX9^Yn>%^u*{7 z6`-FZ9Y;EWG>nvoTZZP2cLQ+VkTxIQfb1-U4@kX8yf?<1d*+h{JQIm`*mygQeBOyO zpER6i@z9iKmOQ*MAD-5Ze-}D``nD5^*T(z}Tk|2l8|f(05Ylm^6G$hKP9vG?JYH8_ zLb9+c}t+fno3PL#V(ULPDrG9R-mG@Cg?KMR?QNSBZT*h8f``!&Nq2l{!W z3rLjXK8teP-f>@NKH+7E0n&UV?gO}4Dncqnszj@osTYa6F7BVWaWbFFeKGWhuIGCEK`h38-=FZ4 zPd$nj4#%>e@E8w}o2UTGrLobhL-!ZFO}Wn_KI0L+x!fA!0e!Um)Dr zT+_6%w$4=#H8ywDwKcD8dWUjz?fUHYjq1S94~6P$YC>z5v9@mQLye)l;5=9o)9*0!E-t^ri<*|^cw_y4MfJa;<5oJ(tk^WwU+TK|&XacfgsBx(&#UVXkq*+WI<^ zF>>TM9mKH24Jj?&A#SvRgR+D+TPe4Z*g;NEl$naH?7C$(sTs6ZbM7kX5=IqEgL(U$U^z; z9c_)x^}ti5eLLFf*3vWs)lrL)r#U!200mbnBbM))lI&1UY2ECAKRiXvjD%innp{?X zjU9R>pcYTgo|_fU3C{|ZTK<6F=ARP&*}*@mGe|I3j8F8g#@uPasu z%vV;=d`evYW|x)a%vwUSYK){D5n70U>(n)okgAKQ8-i*}WcCa@IyrlGC_ASiG)qln zVLsIvN$K$@kVfBpbjw#vj#$br&&p9}18@fa)HA*#SE~s<@K9|GmS(AOk#LyuDUlR4 zxhE%QR!&GY1RH1NED2|cwUl5=1JJB+b|?@~pWhUmtiGXoBI@d(Y6@lpG^#CemCoFp zS)oukOw%nvVj&a}o*h=>gV{M{>dLp&N4kQ(*)#IOfXnh;@u zW5tOH!L&PbRQeG$C89cl@Etx$T^Fj*!Mt-*q!l zf3hU1=xqUC7XJ8|^=HM@jG$V9aHX9o%LySyp)e{AtAaKmk`47avqEUxf7*H^h)R|% z4uwllpMX*WV}jwV*)wy)dH2so1--q<)7ZK7#i5dySXhd5$rR}W@@G-(iJ76?Z1SY% z3MQPSeleOGjp@;!L3}p<-0xzdgl@@ZuQ|dJ8?s8-o?VgLnd+LLT8C&x*rdQ84yw(} z&Qe!MV5sb4***>;pV|^chelXYwHd&&8uDhcF)T-eK-m7S|LM&{<^r~zN3QJvY=^Tf>T*)u|+GI$KQ1b)@! zl!Rwxhr>Db*Yr?fV_I44x1zHLPUDJb8szC`B)8>V%^4zdKnexTkW z%;BHKDi*2BsZ+=quaM33AhJ{X{f`UOO4BF>4OYH-vK0x}_>3uC9tmA5hie z$kX&j=B(`S(h^d@RYdABi>UFOWZ-^jNJ{@C zU662!M>2$jp*G8e9wlF>(yx0$m`-bY&;!%XgtCK}Z8<2$1{delE}A5Cx6u; zZebb|3z*PW#?{@gp~X~TME&n=k;v>2I$Y0;Jp7H!&Iy->va>J+AECtU5%pqsM7?aq z)w&30(t%Pnw&(F#IjpfS?IS6#(P)ayM8#^nEJi;jNhsop+AP$kq;w4DXi$CA+BY+I zR_+Xpce?Ex;Gf6&M=B+?NVczJi((}u>QjgloXQQV=AL>kGS37eb1_z8NI79lp*f2= zWX8S48DNgu7)N)THD~6W`gN)%s6K$1ihsj9(5x&B4P9Owstf&C9qzBYy^kBB0F9oy84RLjKM18V5zTTn8(xR@6llcuRBCe~-ed}|wF&nRE-*1rV zR#nACG^Hm+{fp(l%~zrtA|>kU-S{&-n0qt}EB51K-r^8tG^3ce8q}LskD9$t^>zo< zB`fHKGiG9j$FiIeocTn#xWa1s#m``h|F$VuzDm_c5z<$;#nnMykNU;7h#DW~8aq)U z!kxw$D_)PTq(0Uip}&o0%wnwVD5F)WPI2jD>c+@ywCBzk&=)sF%HD(o`D!FBt>ce% zA@wusEy@2}!mYPeKB;($|E_E3n(VZESk|ue-{q_4l;SKr>t9o|(&no-9*Kmr&{x#C zw4mDaNHARbxH_8_pOq7?SAW z7#2CEqedVRD$n`k%yso@Rs2Khs<>(nBC=Quu_ft>Y&1h5zIHg4qRa>pf@ z`f4|3?j;NwI+{Og3LLTP*Egbr#nTEgb%rn!6WO8M#%4#RX~Rf;qNEr*g77+NO7(^A zNIj;yxZ2^1%g|FF-3H2pxcZ3|L5=^>ioE#SSvfgOuVVv_E-CnLm!RYIs6TB>n>vye zZUi~+1wD4v8_pUQPU~Q?&tvI%1Je>LigEG!4Yb0Yyxy3Im)RJMnAGak1-Sk?JeEF51#CYUvcK+*tYduCcM(bhrvww& zvT}jJY^M>uyX4}2b-ZCmZgVpt^g>B?NiQO#j$nd)qz8@9!lm50B@GRS!%x*W$goY2 zURPGHvU}7N^wx(lY(LciJ5csFvPwdA#l`CH;3<|I z);ThO;n$!tBT>wCWoR6zCjUP@JA}P^&WA9;Vx9Tb=J?eZVkfp@6_`CkMtKhQ*1fnm zC{vxX*=NVb$|;ut8zUu+M{8AU1d{@^pW7CUl;)|=`1}v~)PJDK(cdL>>!gZm5!!w; z!rG3M-_wA3PK|#}z0i&9tRBWf|F1!wVoV)9OX^kYk@_d=RZCA}y?W$Gz1nDyQV7si zo*`(?J|hBzY^{il7zJFluW?-i*5ZcxksTOf^(xxafK^-zOoPV5aBgG(a~J(a?{7pu ze?BKm-G>US>4`QxgS9;t)Np;U9{spSec%6<8r-@sge`1skbnPaTV!%}=yCPYF_G)g z*Ea`qLt(`B0=8&=wMzvxUJAyX*@=eQh8Xr7ZNaUxXMo)&>_2qH*(gs)=8vLBT&cdU z$kk;wrjg%dhn^0P{)4N@bvr)wo8PE!`O>C_vN^lQvU8rCp=+ZrTDeQmSB%m;$ptC9 zECfBQwn?=K3gs5>E;TZBubh|Q@67IJgY>B88`h09Zp8F_Fcw?xO-Ix%5mk>_6nlZ7 zniPCIoHZ9$2j$qXAKDs0w4e9Crml;twLx`bFsE3p4yx(|((@tAQ?kQh)!c~di?_O*9jb3zB#5ncXbCo|jcBpp)!5K~_R;utYI7vIC^xsi zp&n(do0*G&TT)i?2V4YSgXKH7yriV}sYaYU420I9{}o3v;BL^)NxLWK1+KZBJ@g@g zHC)1k3uL)8F3p*p+fb&4thY)U;gJuULm3*!kM;HIuzY{0J8dd1#Dg|ldtH2o&8lM7f98`r(1&KDCw%X! zo~WvJwv^B~y`cxxS8)M{%|jTfv%?tqA#e_E;5hx!RY7JxFPZP^%vU6H0;_s@5WMF$ z$g;kv2UjWlMI7upl*!HVvqo*0;kQZxz7L!jjM;fwp zZf5QhUfHLrr<>uxjO@^C>@|5V!D~2NV%KLcd7&QXHnV4BMRBQAf>W0g)rzY;=`f+} zMsRP6mx3z$gtQ0ivl~j(xE@e&F`tf8qEKiiI$M2qecDE(M~g#0MisEn?FnOR7g33A zk#!hZJvdc~JPs`^4vD$EELLB_!ub|v+;x%W7al9gp1Wwt&fj5CNU)0`c3<;h#Y>OZ zmz0#2qAusJU`2PgIu-r*D}te1EP`@b%}eV%wz6J+%VpQ1Hv=UISb0gkboUg!dzDp; zmVeDn)-`d=E8#p&?5GOXP_|tT&ZE$q=Y)jHSYSJljxL|&67C3=mzAqOZ;O|!NqR$j z$G)dHQ|kG09i}8?)&=u0UdyvfWPhB%8gvw6mgji6pDZcnChg`U;q2nD>hJDJTQCbX z{P>1=`Hb1K(40A_^<$Hdl&SmTWjo5S|LOtzt>%bYzVB!e=84~JOFN(@_~@E0c0w@h zlrBD$)uM~cvS-a1Dv2$@;2Obn@WM8FgfSj$W5qpU7RE0f+HITD>%xL(YwBM z!wyb<*I|>;1E0gX7M!PjkD-U~3~y$LhdrBvc^aF^6*E2fyW%AY0IV80VQihb3P=mc zP?YsXT566=LYrjgYj+2vQHK5EAf92_mtW@HaFF+ZeF{g&bqIm zu4aA3#tp0QtzEaVy~Bz()pf4kg!@W35w{jquD-vmZFO<;rnOCtwX0)w@jBcFsHw9y zY*@Xvv$1{k#%7${Tk)3Wj@7ugQ{T3B!|L|NEp=8y-CEo%SgjAUE!++1Xv8fJt1@Sl zy+w`iVo^)mhP54*+-q3f)Kasyqp_vA-MVklqSX}}A6f*{vAUYoIG11T-l17swYsng zw<8Q=!`k(AtJ^m|L_e%%)TO1P0i{3Gv=O&+P>035k5P*IFi^0>@0ym45N&K<)Yw^9 zYd3b(G`MoB%j$3hU(>$Y^|rpbrLE4gD^@SA>!3fyINx8ivAM=-Y(@n))@X-O&Z4z7 zbqJPo7cJgc*Hmk5Sld~g6kAvqZ?{;gfzPcqIZ?EfM;j#bA*n7bDT~+`8pVG3S zA|OL5RE8p>Q1+J0HjpNvNeg9tNSmaMO`DLUrDX_6SuzDhrXaFGKmkEOK!zwoK#?ur z7ZgEc2r7!m@AW$Oc|Un4t^dbA56Uy=J?{I?bI(2Zyx*y7s;!$^p3+=fr~frIm)hFO zt<~LwgEIDjGEKcrrnfsN9U|wH*1#)KTsN&smu*HbE%R$ z=Xa{!%JtpaLex$Ds)K+e) zno?I9=&cX7$d6nj(v)1&^)5c8qV5ifV z)IQMXQutDD!)S|Tz-fk?eCr~v{w6R zbxk$RwGB;^$}LlCO8t>YX|T7i9DUneLbcxJeYH02bd{sGyFlf%JLVMP@v1dHzpOpI zvi6$F?LEq@2U%C4%N57=u;P2%cKB9?T)C%vU{HgzckY6|$fT4)b$ds-s(fS{$ZalWD7j*ZyFI9DP_@2Su1^wkXxnO?x z;6PbzT<)Cbj_W3~rYd)9|8bGiZ0U`i>PnZXR9Rh9+teA6zg&q^TFd)1Pp+yib#xBQ zimXJ9Su>QS)2tuV)b$N@jkT%UH#Ila6+3R^Ndv}vpW5s0EDz4Fc1RI-cs@fWwo67Z7HFZAR;+@^r!FKh@*yQaGEjPWre`@D!DZR*A z?2?u`w9hW};>}c5uQaD?A$m+%1FmOgyE>j~LJBgvWArk~lhPQJ1=g?j>T^AnX0`Y0 z-sYrdR1Mv;=j+TsseP6`5F7|*b)}1!A zuuocZCmkNu-PzMQFEq}S*h6*ts#xV;{aqEOp)o%mJ~fR1snAwcK=dso=00E3K7W3% z>ZGr8zB=fDx}K)AJV=|{CQA)_sFnuicK4MB`lQv9l1$^frhV3&P>C__di&jrH7Ey4 zA-6AV@9s%*G>CLc8W=GzbSW(t$+@UhNZq2r&iMl|>-Dv(a?0MP)`odGbrRIA?sENF ziz#6zFr|Ayd(E@Ub@Qc`{Y!n!IPI!~&T{7>tI4uv>o`}6d|K_fCk<{#qEUA}or8m& z<=Xba_OdFtZy?$-`f3`INr}zxTr^mcDw#E}uhgwBDOKM-f3}pe=Y+B*lEIQ{eztl@ zOs;B+n8Ixh%<54+x|6s@JQr)k_brYVasSdRmbH7cHo`s1q%F!;7rCx#di(nq^bK}) zL>-hThj~%zQ?JQa)YjE&>UHv6M+!LWxS-!#4M>{XqUoMjEfas(gLzm z)MGWd=AqeLF(~#;Q&qXGUjtrs5>-}}HJOqQi$f>4FwX1nWJOoFupT*Th$BKVVb%F~ z^nBl&yHeev&RGlm*yxpwz3L~qtx~s+=_T2Anid?rQMRGgEoJQlJ;J6;Dc43BWc}H= zD4}zdP;OS0WBx#w48GFB_I_)j!GT%*-F-G5JG;8o+S?`VFsyw%*Tw-|U+(F0##$pR zA`a$G7D7~eMFDt>OqP;9lKzqhj0~`t$Yx19X%^^bW*KH`lr>Jmo{3(Jrm8%!7DFhS zR7ay43v*8EJ`JsLW4^Gopl90rZjY3y8Z@2TCzBcDPZi=pnbdpI#Di(xlMVJEIStTGXg{3K~DU~u732MlSd7us?J(;rXiM6`3-ElAn z#4L*tQ+ulvO2tg;?>t;nxXcu585y;npps2HpjkpS5hv6?Lz}7FwD(Jg$)0Sfo8oTk z9#Y%AP?2lW8RY{z`+G|<$t7#5j6TaFLAu0Cl`>PRhPNy*je^epc2!{X%cacd)|#ru zx>ld7$u{KTDea3G`NIdMJGLs<%Z0Ef@@THuH~UvLwN7iAR7fozTBwn7sWH^27G=qH zEcbT~Xnlbq^vWeVaaLeW(==;WO=)PH5i?$EDOM$wxp4owhDnp#;vs47(*U34{yuzl z<_pqf9Er!Yr6FCJ-CfPO!zTUTkZrl*sd`W1>JrIzP?M!Oy(~kht2eZaORCPDR}~m% zZXXsOF+ue$t`s0F?&(#Y%oR$e9^tH3dtz~qR?QTx;XHt=T3Q;l8fuTAc z6w4m#J{v)EWf^!uIjdLmt4u=8-kxKfu$IWfG*PaAm`B2bcU~H0Si3?!k;{5cONua0 zV`b$_8ivfkRN$y&ov?M4I+e;>S!%ft#gZ|1pQYD!Q>tQVmj_?OoM{D}#&=Jr6#UFI z{K8mBhyO=LN?1<}rd-IRpv$c?pk&BsEs?ZIm{D$WO$ahc=`=264C~eyv^n2QA6*0K zu(jNXrwmOnlNx8VOfJ_qPn}Yw)nl^Z%hI^29^d3XqvkEYI)Q% z;tQ6pvt-+JAWZjivh?M)@!TRa6#qyuWjdcsjY!%drcOVZjnP9T6^$>=s9|kMgZ6u> z&-EMGuWvY@u6AVe4viEvuM~lofO77X2c#SPylk?$N^GY_tSeJ#hb&q*b6Q;ZWK3fo zw;H28UR8AUw9hWu_67HXuTMeG{T+E}=W6nBj~*K~NK#h=^W|KLN*gHI(c+R+YNFJb z%;KnH`8mxN=7{*+!;0`;!;@& zo|L;}RB8-MRStSioE0;YXPt6W=MmBNwhi{}TpZcAx$k1QP4hw`24Px6*c3=kGIUv* zs*+>S9u+qZ#+#Fo(?PzpvO>a{+Vc9%302k}zA*ZBkfUX~$BZV`2L0B=EipfB7 zlr3sWw|bnp+qr_Z2AeLcxuLeu6g53^#H6v2s;E4|?3y@2-Y#zTq%svlA~{ut8*4kb zHDlS}vvG?oQmN(cWRI&IUHz$d$Cy=K(==DHcOzHHoEX3yrz&-KcCx4)qxteM_2fJ> zMq6dzbaqrvFWC&10ipjdF2y7ftKH(*9MX$ET3KhNagbN-HpAt29qcX7)N&~nsI$bsE>PL@6l_ zzZ?VK!%fyqG>b;1r~4TA6`yO)Wn7&GW5K(rqO0;`*6EB#mfPLSDkIS7=Y!$d3{mOO475)bUW)(ic%Lb%93L%S>YX>^Ly2c z!VXuda3{Ie;vp5wuC}?lu3R&%wN3kF3*`M*pRh)W-sLOhERuFf)`*6NJiwtNwA$VwvNiyDx>FZnJkBa?s_uzxv`Ypb!h=wvM;Q?-#(07$=O3<|Nh(<4=Pwp^0Dp>o#NsbR$S3X zvYn=L#UYsLQ(l>l-q=8~1Gcid&SMuhMaqn9mTJs*w%Zy9~(>ZGfn^kg6&QzzB?p`3*=j{2N9pj^qMQ>AcYIf?J-LG9bn<0ABXV@^7 zSHE?}lxo%2kY8Q{DEwx5!$U6U*z#CBML~X*#w$CWf&wk|uyUhO^ZLa~VTuZY(i@y; zbIkWfIg>#ib)CnVmL4_QG;40G#mr5ns>{T*Q|g=5Ge|cr9>&;DmguCWY2$0g>lM23 zThE)R37~t{_^rG8{Qr6F{j=umDdT71j)R>NyJWu(Zmk#Y_8jQ#8uWp_1$!>+>eFw7 zJp)^JbZZWtHMr;O`3uHxJ$wAt&D)LFD|{W6Cr(Vi&f0ZXCBCqGpnGO_Pxs*BJ?C`m zZL=`KTA8bGE7Jd4>;ZKXhoL<AgQyn$y0}Ysz?Q%~fYV zUaVzuw{;iFrl%`hzSeMHhw>=fmzVV&9#nNUX>^rLjnR?M;ml8q+0;Izq2<>B*g_-5 znm0GybolW~expwlLZiIc&PkdN)K?p(my)Rxi#DkwcBgeOJwG|el{{&=uC$*w2ZOLw zA1e&06rW4Kzw z?hMDdG;C7m(XTu-JwAt3o4tYaZMAxP(&@7i5;nZlz+jiQ9g!|Xu!^VB`Uq0_bC$RnL%>g0+Yh;6uR{3j2FE%1``ZEE_e+1d_5 zpM;g_4%jmw&DlPnwQw?S!dZ{AFZTCKwwJ=k6_*d&&a2EXa>;nEWvHqYm~OUoVtnS# z6Z`Qt8PkeP_o)bN&HL6h6%5I2N=K63w)euV(*L}UDfGdxVqz}#Y~$qeFs#Yua;jr( z3TRgEj5@8aO-W~q&bfuD z-uG5)hp?0zTALfSjoUOaCUDJ4T9Rwp8ceIcq~<;JQri?aZA1C>cX^w||HIi3ffzBJ z=uy!ZlB*zUz14v^?%Yi|VbZVKm-8ySt3%6gR|WHRszf)5 zdW>?Hc8rtrLoW?$XVbA8+N}%Mr7G15Y4W_mMQQz&Rdca{@_6Cm%514&ANv}hbb)dQRzA3&+A#^-!(3ey-Jaej?LF zQ|D}{YfVCv(|%M$1^Jp`-ol#ZDJ{*d4Q*`qs^2HeutWBTd|Cri7`=9?PqNp6o&J=d zBU8f2pC?;PT~F}}vlfmBgz9V8XkeAY+i?>hKWrEZ)G|h zs?l8U$>z%CU*`U{E2w>zYR+qSZJ}E)CJmnotoguQWoXnkw>2ni;Yf|q$cM9D)4QOj zLuQ}0)79}KZo|FLRcha!XLz^d2*;@wolW7VnNo56S=(6ENI}c^)1qDdSX zLmRf5pE`V1HH(epv;wGX8OEMwj3GxNq@|?ODj0kEUB&lM3{}m-ENN3+83imv29Sp5 zY|V4gCgs=!=i1x~kv%_ZX-E6ix~fKnHBFHr>;Ml{ACr+vl`WrGbcJD%CWaBcBu~cK z08M?{>LD%2u=VjK{S-oJuLyCRT>6>Ydw1^>|7xXwyn9=i*fQiJDhkPU9if zzi$r1FS!Lh$!PDaUq+@K6_KhAsb=wQM2!sjNT;x>#Gg8x8jNricPHL|PB2-PFZwc6pN}()H?MP%g9~zfiKY21<*| zeSI3g9qs*E^E>dOT`?xis$q%R?MwTyNgeZKnuleQmeV3it%7Nq11~zmixl?BVAxlV zIO&PacDW;6$1U1>4fSdNAe3?2&8Nv5B#Z znCj3`2N4f6acF>RT6O?KYqS&=|4?{cj1f(2jq)?Mwa=Cq^Mq7}t9qouPJ<<{mnv-# zkrj&YaNVZdX^5u~09Dh7ft2>@vnlF`lIhwOv&UZrW$$`^^1r9ANobu|?|s!YPzwHj_MY2#FxEku1~ce;|!i?fyi_l%^Qv$vzV zVbYE^ABGxjsqsCcXcRnaBM9mGNU_Us7C)&9Mr725v^n&X}FVZ z2^9lFljS0Xlw#JBsGg~?uMrJVnet;FrQAEeXK^w)rQaM_oW07v&y8U{mDUEa@);Jl z>_QdneZ_4K8?(_5RHm2@WM!&%lzLJ(PhowU^c-|Y-Nd?g_#~t}6egBPPqBKGYN&x+ zo3`ZA12Om9ur5GlHY#;$9j2wXN9ZswAgfbbT_bBN8iC^X_a2errTsXiKIB}^QA<1e znfi9m?7Wq&kSy($WQSFX7tGs^VP1vRO8N85z!)Fyoz8kAb;c;D`@mp)`o*CpiqO#d z)r%UP?3O+7W2Rs#`vl~+*>+6(m-XSt=Jt!ASa+4CRc7H#6QhE97Gk$Tdm-kSqsz@ z?omVyq!pGPlm}#1oMFawX#k=!XE{o=9D%s%P8tLH{!y2#$e{&-`%2P>aU1*M9y~0` zqU~qpFm_h1stg;dt&63h7Wr3vqdw-vul!PSxyn0uM5*`|gk10PSL9Kbu56YgIxbY2 zG)%OdvJmPeDlsV^>WI4c5X<%oKIKTyexiu&aA|x|v~iza{BYn& zX-fNSHD*(|0>g4hii?u_Au-IeTmA6lRmaC~k4g@9l40nj98FuE*Zwv2%;H{IY7?vB z2)fihf(_aK(eT>(t!eLL;jTv+<-g7A zV22fJ@?Icc(=07LqN0|H6MUZmko9{sK$FinwelIGU!hPJugW8*!Y)~2eK@?^@fC;t7={AzN`$I`&_yC=m?$W zDLu`Y8aLhHwwEWgug{B6XDfQEw|G+jbwWeC1~b?-Pyq={n3#4y2W+~y3Wr`o2%m;F zhV!~+xSq~=ZE4X8XxNmAzkYW|Y zo(hg6O;yrwX~Qj7?EjjbqWN46@!mzQ+-h$QdlKy%jDi-1m}*yBb_K;YqAiLU;Z&1W ziXK@J(ohv|n`oa!OAAF#>Ww75Nz~YTgd>&w_=w0=hNO{g#YV(_XxiiyVx<-4Q6BZn zupyLywjpB5ve`WlDd=F{tBFNJLq&@#qp1R7jPVQ&!sz~NzS>&I>q+lkw0CK>ApPwc z4u?%6n?h;0M1AHixvX7f2V_hv)x=_S%&-op)Fd5vT^aetD5wx-lQFOBBfZ{Zf8ax!8e$6k&C>Nfrb8yM_D3Mtxzk`xk|WL!xb|ihFm42vQRBK2s;fmMtgS6%a92> zBaDNQRpNHSI@H9#OKu88ml0@hliE5NTiEcf`25`1iKsiErEY3lbUdZx>$Nhigbbwj zaMFYAv@Q8HFRkSwVHW*%5X#P!?V|TPltxpU_LY*A3LQd&rLfB?uU&V+W91H+mV6Ob z5SpWI5n(n;V_Cbgi>emR_L?U7wv~bnb2lgBDh*So94k$fKI1JQ?dnE_ux4;`5yA z_YBC@GInaxn_t@I=f&%=Cx$7h6hS*NVY^D-$&XDnS((bx7Jf%}SC@xHirLZ|YW>@( zul2-g*t)71?xjkpakz%wJM{*Ss#_D1YQYUVz7px7Ua48GJ%Vbir`3y8QA0r>Uj5r= z8yZQSYJ^U4UU++S$nr~0#^O9WqSFl5hTZ^6?xoN)_Wmr88@BA2lX%574MlZQ@1({& zqQ27I)twB#C}bD{3|`F{)wT65h_%a*3q_N%6h)MzRqf~!RaO*D(r=OSycF*pbFNjY z+}2ZL!$1qvwi@D&oVF*RE-clGE{&Mc_Pmr=MjXVHHwN{*R%J*jV)7&fsl%!3J5{~f z9cn&$iucE(hZcuMlr%a=Xp>3_hNjZ+`6cCJ*N04Gz5LGZa`I2e>mr|M3NP_oz?7C2 zX%pS6RoU73shtIFAonT>FTjU7eQ{?i4WZ~GSxr_&d|zzWmM4ZKGqY1FPhGTeNU>`} z!`s=4_K^9}-`p3UCWzU?6G17h>(p(XrR3s>Ugoe0%^{5`m^j=vSBPaI@_Ju%u`O{k&Ws~>Y+(v@~*R+HC7#dx1Tr1W7l#@`z(#SUcH%Uoe~3! zH735V`~sv>j~OWPpBIU$LX?V!M5XEF?3^D-wJx4Fv$scMDQ^NR>eAJi%oR;1ENWvB ztS5Lvt(aC}qNO6G4c5H+sPxLA)zM^ycB>rhLMyN#cIlnxSaoJ+m%Kf)!6Iv})aElbPOX|zajBMO>n^U#v5dn4Qwndsspz@)#Dw75DY)OG2M!AxP(1aNs+N-9eNX%2 zNgZijsZWeV&nUzO#~K#vu1X6a*NQD7?^D~q8o^5OUatc3hjw;DbY*w@eP>|HPzsEYKwqc^~Jtz7@EAwZM*I1IVp=nzc8_p|7K8IZrQ-_A>Fkh+@&1wTHj5jruTlZuu z7Z==tI;o0>jjs{@KjweiCC->WIa7}5HW}h-c)zJHgUflz5p>ZeX=s#^yR9#x>@})7 zwJM#LtZglYQb@Y)EG*-P4~Tv1X1EIJ%6MC2Xx@G3pMg0z3-~%BKuB= z8gUhQkPMWX7R(!JX8XPd92%t_IP5DWxe=GG4i~b=o1Ico%0*M;VYk|9O`iZ#q)K=T z)ihSHS(B@19!hx~;TTEp_oom`D< zYl>V|>ed=%C8-FJhW`wIat2d*I}iPDQWC-=meKD@IWnN%O@F(dQsI$MR*xpO(FaBz#{) z@aWz!;VZj3j$O>}8x@-=yq1gb!n@+xR4+%(j26Ps(#NHE8Ew6PgE*H;S#gn8Uo`5X};`U9q~VqyEQLzWBj$DaWbPNuyrjM+6 z45D@l-OO)$raY%1r=5uZ5wqvDNRtM0w9Cu|UHZ72-2aL+PxEV8t4*!ETyHs;$a|vU zyiIXZHeD*sR(Vfa3aKpp)m(6ir=4Y0G`%^NW)bJ%``zP~=`7|I4&_NZXo_F0tX=v$ z{n~0mDqVR}rgo?Bfe{MAn+2YPHR7ZvQc!AaAf$;=BW2i@Ma5I3 zTnyK<+P;eK2x`WUPZ%n-?YEQGam0bj5$hIL+cH=3F#`Lv-1E@49*n1lI-s_zBB0y> zI*oqGM1DhMmWU}`;$fl}V*Scj*)N?B+u^Ew`5?ZyR~o2~^+=i>Tw~My*_ot#hAKCP zQ2xS@TBRHx7Vw^;$0@E7bcWs-OcMxg9+i_m2$Q!$t=r{wiiU2|Y!u07TQVsiTeEsl ze9A*9q;9BMZtn<}MPrNw_i7xVSn^u_YeU7AmW}K9lTxMlc9g!S=@C>|nc~H^iNYM8 zoYtyP*Nc;?c6FsHNBCU{L|09}v}J!+tIgvjx(AQ*^16vi7yQ z{g$Rp4CfTn$t_`XORw?7m}Qlo_2h_9QFj}4{S;cENw9w~nRxO#YvqXf%C^ z+FLPX_z2a?X}81QOUs?3k_8U}b|pRf@*C2#dS!X|J5DurJ-N&jIRX$z1r#1nx4W9-k*iz4wtU)P8+jLV@!B0K#m=5%kZF zui>iEp2?-=^NfNM-T+jGH) z_i1d;MUjTSUl`-WbE3D*lUI=YbJr?-_CYn>6`fHTsMsdym&mlg))R^WSHuvZ#v^S$m{gpY{YXU`Z#r)>Qy&uuSM^eK7 z5Nc5G?#b;MUMufg$KqzhXFEI}B&{!#E3K-AEe3h@FMSN7hxJT5Us}jZ#uUnw?pC1+ zR!UXV3^}uSO-~<9kr@*2GUqB;M)w(ZKfu;R*+tI`vb?W@T8*r9h{@mE6i za~p=fyRGS5AKtdAt4!m``ioB;sx^w! zW{j_hEa>Z+8L<*lnJ6JSr}BqLJR903^%s>Yk;J*1xi<_jA$T&BM}8@7R8w2|5=RtFsNT7r652kd_KKmC*7wS_tbKio-7dTE0wlMjtpwMcixfpsh3lQC4%?Dc z(K0^w$#9Pk=*@}mFG#;=$1B#nEd$Z=S^!1wwr5V>7>#^=%GIMYg}Zln37T>mZd3c~ z`9yWaXx6$6FJA4{c|VGIw%E}4ZV#J39=OMQqA+Q zJrqifn$y^CbHG^?LRAryQdE(yDcU_nQ%0wTUW$@wUGYMybpGIVty1(y;N>dO^cFL$ zT_oGbl%aA*ElKSU&DA_?S$305p?GgVmxKz`qvIXuoa5-GUX0{=S$ai36vddL?v+$5 z%&Wr183~brT#*I0GUgi>qe&_Ko~l$9 zXWJ3_wurul(NYOTE4(+AtCvPi-7NH0tP2&RC)MUnrfgEn|KLb}DK>v=x=DZZT^X!c zg893TBdr;!Zq2?e^0g?~PKzl09do?{ko3Q*x-bjjbuOoQ$o95v%S1{M6gUOfr0A;I<9S^P;E$$EYxXPuUzc^B!UNyBLzNW8B zE4w02G_|&GX^)PfvvEkqx8A3pBGogfFCq?Ys%sH5Uk^&o-x$})F7eiE1ooHH`vN(? zg)di>y`AcD)95cr3>#bX6tAn>=Xc9*oa?N;r*BSsa?5J}RBJaG3m9na-bQdiiiU0q zbBSFh={rTe=*>iV^4!A3K~r&P*>cSKoK;vu`oko;qcT(ED^dqhJ%yh!uc=(`m9I%= zBU{5xMovj-N+TtAr}G;6$(l2N$})p=wv&>~tthC^i{};%buuAn81b@iKr-yqGz1LG%7u{x+{ZN~k}! zG4vN|tV{OyccZiEnmV-R`Bv%ks620^6*}G0f3iZJg6^)$=DF4bu`{1vSmnLCc;&A0 z?RJ}&$>%z>v#O2uuI;=Ci5Ius?8QBRCV$*kub&KGhR5Qc7&+bG1*cZ~QI+J~J8VkP zpGA?b910DL3ZfE6`ULyKe#3tu+r@v=z&lk@^YVPAK-5`$naI7Z;&IGwg`s6-JgDN4 zF4fyp5qc(ncS4!S-ZtkswkV_b40ELG^Po9OQ&HA#=gLif*E)5vn*5?MV~}ag5dik_ z%N*pj3yohHCgsD`4)K{V)-V+<ZQ9-T z$nggXDw}31M`Nr2q6{f`wer+3WA%aSsroWith!>pQyT7Ok(MHi(8~f{6=N)BJ*DPxnE%QcibJ-MLVR+STgh7~5DBI~oRZ(LuKZE7G|;4VX7w$Od@XBL z5+D51-gOEt8rs4MbruzGi&3LUQEnBJXj)@igRD|TZtCM5L|3N|CJbA7b$HV%XV`s2 zJA;1zI1b5eRQaf6d&NOyKk={^XH-?uLv?pDRW*5Q2!t9Gy83C2jp+@yWa9INXVKvnw`qXLG0XegZpftf^L}4p1rnw7 zVkT5sIX)XSI5q)Ls(@S{;la+yCp1h(e7mZ!f%sNyw!s&3iPg)hk z?>Q9E`q^zzSX_GXFgVcX(^D z=SFGnDwK4fRGL&%v)lO1^?}i^`1_)zQfW2)`&2)pO3NKRcD2<*)}i>>R{!^T|M>Tn z^lxno`tiM+>tFTQF-t~?`MSgO`x*tgPrn!MTO@hB{#B1%>4fFZ992p0d>tFqzgp58 zr{Ddvni5}0|EkBXy=3_l$DB0!+<6?YfBtz%@~vX^*zqTFvlB>tAv1H7NqfgRR%6e)K9WK46^E*U( zh^zKTRZk6b)(9)Yph!;ov#DSENAstcc;>(PE*aOB#YU(Gt;S~K|J$Ah%E1bCeNn=hPeM;^lIjt-7OWXe{OZC_}`MQrbQ#sV1 z{zu*p%h#Q)4t0$Rwan`#k8R2QXP0eDrMn|{%+E9r-AvUpsd5oX=nC{1tJ2sc}&|R%On8v1c#k7nj=<^9Whq+8M|$6yTfXd-dFonbePAg zf6muA|6Zw6$sU_gcN&wqu0GQ74jnJFaqU<=Am4Xzt?tozwMFRc{Ol`qyfN;JE9;!7yV_kVBx@ouwL`^PJN>OqIkM0z7ie2r3vYa(d{#5+8{;Joy7|kW)gwWoXt{X zAX17@e$MJSr3tb{;{&7<^y*RP1Q{jzIJsR^g{OB#jQxbFsZ%B>I={brroN3KGiK=@ z4adsQn9}>7Rs{Vrx>P)C*{wA6Gg>pXrmn)z&{$V9m6p@}8;SmXCFBX>F8b$w;qw|k zrNi`Z4dngBKK;wr&(rUV^l!ZW`T8Z|`T94A?BBDke@4u9 zjL*L=IomOo|1LS(ES6VP6o+scg@KPf%iB3XV=*JsCChXO>Es>XrC(_TT(qTHE?Th@pF`EvZpR4oMzv*X{QlDh^=PWOjJSU4v z|0u}^7v$q4dp<}%>G`%(($A>Ui8`O{7C-+S$=OD+e68eci{$(r?ZFT~seNpNWce;# zpKX$S{Z`u!oqt&8mt;}-eO&S>1=;muTP6LBD*aaHv+d&a{vbKqD>?oDOdPsCx}NNg zeE&ameYRin^=lW-`+D0m>1R}FjK*rVZ+!jwlCvF?@4rm;Nxt6q+m6Zd1YMu)8ehM+ zxC{y4bz(DTmF`EO@Y^?9!3(+lzik}odE z&aZ8l^fRh-sjrv(o(|;n7gcdu&-3-RWzvtvtFF(sjjw-La<*YCKQB4kE0*7soNW}# zA4|TXCiO|nF3*RObNYUsZIvvKlP=4)i?82Ga<)}0?95tK@8hSoZU7 zZWv16&$I23enypM>H2JoG@|R{Trq8#h=kS>iQn~S*i3S*I%qlN9p`alKuPM zy2$dMB`?vM!IxS7SihViIi9fkx-jc0@eSTBPdlatUS#q0Xs}P?r{)|?A4bRWW z^2@+1{ERNGUXX0Rj2$6=W`wMTap7llY0ZM<`-f%@pBPz7&zP2_a;A0c;+kPk1)(v8OyW!-I#}@?Aw)_rFk-b^l*R$bT!!x_(rl zi>x7e>F$wtoz>?A&*jD%|EV>bwt`2bonKg#b^e&5 ztn;UhkS{FCy8iN_tn2R>AwM}neo696s)NIH?`M}=sq}X7ypH{6gj{kc>ck1NN}DQ} zBWGAI|q;lzo0%t&R6TN4!*`tu(*p zP<$iJPUqM@9&wl*%}T6!l5_gn$r=8cVW;99vC8(O)8!>L2YQq?jo=QBIgOUHJw~0}Y6L(CZUCK6pZhJ!aK!5v$_?{J`gY7S+ z;{(G}=90>@N4z=Yd%VBpEaks75g{t+DLc4d#Rd6eR$0yig55EVm%-xS3({o{b*OaR z^y+HpnfxJrUE*&KrR`I4l(cuR!oKjE@ThnHp+nLv>MjZ49u@s9z>U>x^XUW^SiUjlPD8mn_ zD=8f|iS^r*Vi>S4&CSrGS5XvW?>E?e18->;)8eEKITFf6cbtN*r88H0rw&n=;V*gR zgOv|r=)$OaZ33qtyr>5^Mv8dl10+M~MGTIfK9Ih~Sg5l69>UPI+7yoD3VWcsGeXN< zgcO!FTMwfKe6e$rI#@xM>3Hm#`mbWElMahUSAWjC(@G~kOj?nZcC2g1U7+=+)&%1& zOn$J@+QWHLHs-jCw9bJa!CEb@e7wihBKSCXzW4>nzeHY1%K)EW4{i<*hNr-rp*ID6 z{h#4Sa3w7teEh@JL_K$mmJjA}<|SHpncvfTN6UzDmuj7-<%7@f0bhb|!!a`O#$BfM zjHz^whNr`e;SKO^_!xW%z778aSJN`Z>5VhLuY4fy0w==*;2gLJo&w)CFIW9)nKSMO z^83I>?d@4!WL_bgPRpKgSIW<|PU2SUC9bWub3P7+hkZWDeeh;e>AY=TrF?FXcr?7i z)Oq{oMsKTnG$(3(Xv(KkYi_UOaw7Zwy~m4J%O7c8Bfo^H{6G1{biQrlMEl=He?x0d zb7%SQ%w6OsG$rJ={HB{Hd2dtlDW!P_KyQSA0u z&-|f$+T!S1t(DC>?Q#0}jmp33(3}Go!BgP*@EZ7%d6Vi#b^e8$RUXmx_ndSo=_>^11h}iHl5~U!*$q@jJ|0bpKwW^84+timI0#_D*bp_JfU{q5I4O zH9pLP)E}#Lou0c@jd+pvjm!&^pUL`SoXR}zR{2#`W_ z%YLHnA8Zp<&zHgV6L@zclaD`pwjRW2URV2Q*I1K|SA8f87+eh~s{)_Au{P zJHpHMm#pX90snk}dY515-v-af57}osifkUmOC@;XDxTG{5O`x&p{2% z(sJs0;0N$ixaz2M{d#aucqlvreh*#`?|{F7uRzC?xnBMSS5Tc;UJH(g6X0&J4th_~ z*B=Z|gV(@Y;M4FG_!sz3INEwa>3jx`gI|U_z$(}T4}x>x0{9Jh7Q6&r3%xhw=RE+Q zgujPx!GFTfTL0+!&Ebx4cUT9T;SAUT``~xr58zGkPtbb?e$Fni4o-z-*aH{Cli;~9 z^qkW9A@bw!d1&9apYt9ZXMG`gR~Y(C@@dGSmn8oR`5E{c^uE0B{{*h$aVRWiYIvjwy_8--jQ;PvHuhOPr6@;o5Km zxH0?++!pQ(_kwk>5w^kuVLO}yd*MQO3|stthljupI2ZQA#qcOfAhcCc4p#3M# z&nVd@=2*A^+#K!%C&OuQChUdBz_Z}R@LKp2_yBwgz6R~LaXvnQtH@Teye`}nPK0~G zMtCTk3m3r?;W_Y9cmwr`{u{0+TiN+q8-5W^fV;!Va2lKmd*RXWRCpfz z0lXRh3_b#%g|EZ+;ivGkS{pcj8^SH&F0c-^!cN!^kA?PsIh_mORqz&gAAB6X0N;Qg z!cj6{oz7Ue0kl8N$9II)uo)fcpN+(o)52tx5EeF zQ}AW@7x)oeUJEF<^P14{iI%s5^{@?g!2!4!9t%%|r@?Q*^WhcnNAMo_D0~k75q zVIMpio&vuOFM~J0JK%%xN%(vC4*WM#ZU}dR2f-uYHSh`eA^a3h&;r}#I|QBp ze+YjHAA(Q8-@`ZI-{Gjwr}Wl_+rZu7B-jeea4uW~Pk?8^i{RDp7I-gw6g~@IgYUsn z8>D>g2={}B!!zIy;jiF3aIJCa{%UwQJP$qzUxI&zAHvcX(*3K!_28y(Tet_D4BOyg zum>)JOW@h?5_k=~7d{G~g|EYR;qn`%{H+N$f?L5|VLfbx?QkCaIy?cM1uueE!&~5e z@KN|N9Jf)*&wlVwI2SI0C&6>zrSJy$5PTN?8GZ;$yr;5G0T_#FHYuK&f9k6JhYFM;>Nx8W!7GaIM-z6Y;^KY{ndU&9yRpWxr%f8i>d zr1aK>8^i74SK+>Je>e;F!lU5H@LYH)ydK^TAAnE57vUT51NbRibyM;QH-X#0-QgtI z3d`_r_%M79z6RfepTJc%OV8U7ZUOgz`@sES2Rs~p9i9fyhgZTM!+YW5@J0A0ob#oW zk3o16JQrR7FNIga>*0^#J@8TZ6nqx`9=-(|!S&%ra5K0i zoCtS@d%_yn0Gr`7co1xdv*A2A02jk!;fe4x_$~NdcnSOgycXUBZ-aNipTmdY zG4KcQM)(B$JKS=M^qf6mHJkyv-~c=ho&hg}SHoN3{qPmI>Xzv_JHtca5_l{8Is7$z z5pKR!x_<{)54+(Y^!~W*qzmA6@JaZ0IBM&3-Rf|CxEY)X_k=C59Uc$A4{v~Xzz5+| z@Fn=}I0JUVet0ZA9bN#hg15l?;N$QG_y+X*L+&4= zCMJ%B8^F!sj<6cefdg;}JR4pN9T(yBZ-w{4$KlKHE%*<(?sn)!*k)K@OpSVd;mTHUxaVK58$V8+>R-~ zUxwSmufl!d{%{uTg-5}Y;kocqcs;xwJ^-J9FTywAn4MC7J_E1+p<2-+&*&jdxA? zngDl)li@Tt6ZXQR;i>RE_yhPO_%rwjd=|bA--rK&tL~QavmV?GZU?^#8{rJt1qa}9 z@E-UGd=|bA--rK&tM1P8;bw3<_*K{lXTUBv0FQ%bz>DD3@D_M4d=|bA--RE;757N_ zS_^Ijw}dsY2_6W$U_U$-eiNPtFNZh6N8vN@|KK}tg*{V#HiTQkonSR=f(OFcupfRM zeiNPtFNZh6hv9GFTks#yF+iSYJ_pCcU0^M2frr5P@JM(PJO_RcUI%{y?}tyo7vLN4 zLpbWIDPNy~8^F!sj<6aw!-HWrTnNvG7sG4ePvC>_8TcA}4}Jny-858GfL{5m`xUI?#&KYkA^2AmBSz!TuN;HB_~@Gkf(_$>S*`~Z%sr(NI|;FfS# zI0;UJv*6+ISa=4!2wn>xg1?1-fbYUj;Hr~Sem)Ps1b2aTa4Iar9=I5u1kZ(+!5_jq z;luE0_y_n7{M_V}pN-)*a1Yo3r^8vW4}KS30e=MVfseuez^xk6^QOSB!6V=?@C0}& zJPV!&Z-jTjU&7zP|AX(sb@oZm-2`q6_k{bx{b4tp508T;N0 zz7PKkSKc?}ZymTXoB(%&^{@l>!lU5H@LYH)ydK^TAB0c97vUT5L-;9NwK3&yUAPI{ z7VZuw!2@9@JRBYaPlexs--ma?hu|~tb@)E~FI;s>%GY{uGq@f6Dr|%^U>6*K$H6n; zh45;48+-sh1z&-Gg&)I}o2W0i8QdOLLH(VFu#XObbKzomGW-tw0sIlX7d{SOgm1!+ z;F#w0oHgJ$xH;Sb?hPAZ2keDM!IR;+@KSg^yd6FOpMWpIH{b{GQ@Cmi^#(VA+rZu7 zB-jeea4tLoo&e8+7s0FHE%09WD0~*a2H%Ar!xi^S`CJQb1h<4c!y4EO4}x>x09*pk zftSJ?;GOUp_&WR>EKN=M84Jh3E#R)O9!`aa!mq)F@Eh<8}LIo zs+Ih~ac~Q`3)Ei`j`7e2XTm=Cb$B|w5MBe{fFHn8TS{+r_<8tcxC5+$`s48N{Da{f zcs9HkUITA~zkt7iFT=OsKcHjxy&n1u91pjGyTDr50uP3Z;Wyz$@M?Gqyca$SpM|f% zcj3oy#px+uYeB#7<9u!fcY%KI$H#vJ?}iV<=indV-{7Zkwf)om>%%X>9bg^Y4;})$ z;X-&aJQw=CBj@Xf@J{$Jd>Z}%z5_poD<6>V{~X)^ei42dZVk7GyTLlx0uP2W;T$+0 z4#FehaquK~Iy?uS55EVmfY-yH!297Z;jiJ-@CEoP{1bc|{tbQvKZUEzNcFQN+!@xw z{otW+E?fjpgy+CZ;SKPo@E7p6@Kw0QLFxHB!D`q94}x>x0{9Jh7Q7f<3x5J1fKS5T z!?)l+;h2L{K0XUKgj>R0VLfbx=fW%DkKw)WG57-f6I|zz^t?UczVHAz0FQ@f!As!v z@L~8n_!@j4ehODVG(B$v_!YP_tb?tv9rnUw;A!vzcs0BYJ^-JBufV^;kKxMYl%I9s zW>9~{CdT{G@Jx6SyawI|?}tyom*AW5A8_T7vL6fXIKmOgNMSoa1lHS-THZbr>ToUidH5x`9sDY6 zgfrl5H~>$C--TDgAH&Dti||eOPq_T7l)ts$7vVN=Pq;6f0cXPn@C5iRcq#lLybJyc zJ`4W{KY*h;QhwHeUxqutD%b=Mg8ECg(N16NOq>E|z)si?kA5w^kuVLO}yd*MQO3|svPco@_tm!ka_!xQ1R z;3e={cpJPQJ^^2XZ^D1TF^8x0KLf|Zec{pYD)=OP5&j9T+Mm){2e!b2U>7_aUIed( zx4?Vhqwrby8hjUi3|AbWe&I%NOSlWHflY7*?1YEIuftQ}x8Y^*hwwM>pK#s5l#gn- z5FQWDfEU0k;g8_Y;3M!~aFYco-3f3vSPxs_H{coY0(cd?2R;Iyfom;H>30D)1Z!X`JQQ}rL3kWI8(sx}1b+d43txlp zKz{?pev7eieYh#ChEw1Hum=vpK|UP$ z>+m#q0sMif`+tmlx2bgQM}Ca+FCzbu^KT)4i2QHlF-N8J)-u)3Uoe&4#>m^k-Ap~V z0lC%Gbu*A>alRkZoErt{D7yOAG7{++3GUqF5x`Ay^xkV{9W>y|f_@6RBw zZGNj%TA$;aaC~>v}jofcy>Qv*D%iI?n$T`9V|9{}uAn z$j>9cj{GL_hsa~Tp6*-ORDRb+Uf*=Sk#|6@h5NxnP2JalJb-*WJe}hgAzx)GpVuS* z1o_ZoD(7e6)~3eA zPRMnp$~P1C!zJ)sc$um8x(WFX_;dIOd>#H9u6caAZ=9*;Y>B+1se0HAxfZzrd4Jdm zdpSR7DxKpwej3Nm=J+M>=bV2O`329<3myZ%X)3+%AYXxeld0$3ihM8fgUC-HKaKnf^6SVS!2fc5^a<%XYrzdo zrN0UC1mrzoHOHqQPc@fQKH*L9r>63MFY>REpEH&IpWt6O|0!H+NlI@kQ}=I=T#Y=% z)csSD4})_#-e)R5i#fi8@6C050PAx8V0VejU7t;}5}K!)M_KaII5QJ|@7O;ofjRc&MpzcALuQ ze2yOhkB3*mC*iB`eYnCmQ#z}es+SFrH#3#)7RWmw?}}UxTR1+=RJ$C?@%g6G`vyD@ zUI*`iPr%pUKjEsUrTaI6+rvrlAlM5}fZv7J!+YUx;T!N{xZ3G@j_Pq8Q~BKtc^gyZ z-vN0q)EPRic3I2RbJsI<-B)2JJQZGTsy=Q+{u%NwP2K-E@^i?)NB%4P1g?H& zN@qP&_k96*bL6d&cZc;HZ-X;9-hteWJczs)`8ZSMIT2nB?}NXCYbXyc*Se;z{}S>< zQ~!2Cu0pOyo(?-;FXso5&pXUO*>KaTtxt$2z^#RBKYwF+V zvqj~9oGJN>$P-OnzZ-HL=l3y{-hr?Oo&|4)Ps8PvhSOio)O{Nuf63JIwnW|ud3WS} z;X$yA^K+3GA|Hi(67p%t7s2b{k4-)Qc2ocEmTzsC7qQ~5g{UIFie@4!)dmap3c?qurUp2&^J`M zuOj~i`90*1kxSoA`5g<_H35V&tn#<@0*v+mP=>eh~Rr$bUfo6Y_h= ze>YXW&s>=JCDZ*7c@N}Crk>Y`yg%~6$P18yU3lz7zT9rt+sKz9Ux9oR@~z1CB0q@y z1oG3!uOPpU{5R-7Kd;+Y4bKvRl3V1tw7(NaEV5Q zH#h@+9i9iThj+o};XmQpm!|YKhjs8^H~_y1uYmW!C*dom^7$v^zay6}({a_`@}|zO zf&4k-@yMGYZ;QMmat)jc58?bwi&=5YTr-tCU6(n413`z@O*d;d<4D#--63up3?ms+zjpvC&B&UYOB2PDU-$BS-$a9ewA|Hi(67p%t z=OJH&d=>Kb$alhrIQ|Io?~q?GmA`+(&s~w^ufRRwey|fRhTk_;t{af=LjHxRay^Rt z4DySnp7&Rde}uf^l_{MyP2IOH^2W$tM&1s2XXI++L*PtP{qJz(g{Gc&ys3PihI}FN z6{end3%nmb%=xE~pFw^V`H#r&B7cbdU*yqOrRS|~D*ZK)$02{wR6ch=-qln-_d}kJ zJO?f|b^Ym_KL`0raZK>ic*`^f)5 z9&>F<$A7!V^|dA3)>OLtasFWBxyTDmU4InvNyw)mpND)A@>R&!BR_!r8~CiL=luo# z$5i=Nye=JI$CUg!4B9DPc&7|@5AfhE%0vmb5s535#-;(mrUj3ZREeh ze{=k^H|V^_qp9n*MBd5Nb9YCsN8T5CI`TotUC48h7a}i#r*ixPc$ul^U1=)cH*)-^ zrk;Bb@~@Dehc9#dP2_iw|AoBb57YgtnJU-1$m5W|jJ%bp=kCbyy*XZQDqk(|D9)dR z{2k=WOy%=R`j9|DUP!{{qL|nB;9trMC;Lg8RT`Q}+$RCGZMU<-7^` z9^_w{O7GXm&m+HVDxLqrFWi)_+Zt|X>iiz2(yd3HhFmt!lAjw6aQqnLZy=wJ{4L~* zkS{~N%G7hNhd+nEgKwI8{=3NkMPBLV^!(LLw=eQIQ|WES@ohN11IH(Gd@6D~@?7&Q z{T&qKBax3qJ{9>)iCRP41@?Wky}wYOT)dRyDhA5NiYTWf7=)tcYu zdu9(t3%&P!`#kUSzVAF7)>-@S+H0@1_S$RjnZS>)S^Qp$e^-$4Wi9@+#eZz^|F-xq zE&hsyf%{7Jssw5GFbiFqKFZ=JSbU6w zD=h34q@Ax?{2mLpTlgIdAGh#_7Vft27Z(27!ru!*-y0T2?l0k!ESzp(+QP*auC%b< z!tEA5XW=Ur4p=yBN2%STEj-b}RtwJ;gdb@OFSGC(3vUyI&OQt8vgzNn@O}#)wE0h3 z{3VP3!ot5;IOKs+dm}BJV&Pm1uN7Q_A7x>Wg&QpVx`p>z_^^e$EPP%NdJ7i+tsvuj z-Qt07m)ajHNP4ZsKWy=l79VHv2^ODX;U{eROpAX?kp3>V@KQnKQjqrU6r{b3h2OC7J`4X-korHe z@D&T+wy^r4QvMhV&$95-7TzF8KV5?Kv)ZQrtA+nz;g2nR#lrA+OYIJ~@OTS9CP;hd z3esMiO_kNrHs7-&urth-p&)f8u1mVl; z77l&5gf|M(|0qG|8)MVYweT_vJ1xA^!hf^ydlo(`NIO5b_#ZR&L=@viR;%Kp>hmstD?i{E7NPK)LoK`Tv{w`F4^}^S4o@3LSEk4@f6D>Z;;?pgjviMw! zr!Bt7;_VjiviJ&%_gg$;amExz00Z&>_I zi#JIwXy3K+(Q5H&7GGp>|L^S4{tAot*!-;)-)8X#E&i~@a~9uYaZ^$1FC<8N4HozR z?kIS|;{M+s1y5SM)s|0Ne7?o~zds87Jr>_#^B=VM%NEaBJcMFsykSAwA8qlm7H_rq zG>f-ce2&EzS-joiJr?h?_!f(AwRqOzJ1xG);`=Nftt!zI6NH|z7Ef4wj>Y}I>q-9q z_Hz^k5nV$!{zrP*tmAKcy! z+UtYIl|}w zBZ>A?E{FU7zJ4dsujWB~spTp6`vcxpNAji5_y5B&f4sW%uK$&%XSaprau1Ctje}(W zQ!e)lFuj*QPg8F2r=0f(63g$(e};1U8=K{i=+o!7JcId{WE@#5SBH~V9>=@9liUvQ zKhypt;OkZyFZVT^ghAqFuBBW}Ig`BdtKeYDyT$}edzAPu>0jniznVwUHn_bvP7avp zAjK@Vcgdxf9)Hyd?txF@z?$$% zC*7O2Q+#e!$Yx=o%?NX(F>aq{5}Ew2k*hspGR1pNSXzj=o!*fHC*(;l#u6R=`+%9j zd*8YxvCOJ_%^E!GOs8MQU8VZPcg@VANi6Xg=gOGr^PI%e!cw;*cb|DZPxQA~fm%9= z&Vm!2Rs8F~K%?pgO(tLJXNm2v&x<9;{btw5H691y`7JwFd-DzNW^OV3>?aD*>8riF zO(q!O8cis>)=#ejM?E9;?rJZT==JIon>~}u6iu$z3nuQ!wa`!a+1^5|mw4^Rglf;*EamwU30vUBt5x1K&6Gb_)mudK9nwoL5vm?!u?vv_Y}4YV$OUway7 zGjx1#>`EIv=5jfA5Fg5E%?C+~9VD&(AZZN;No)E*+Gz3VAZdfknZ$Em6MRI!A|D1e z0RId`K7RHVFf2KAmlQ~U8eZh<*~UBWbKYOf)Pe~u%`Gw=1@ZVcaKSLT5J)U3XdaN` zjgEN^{5j8rI`bx+$tQWr$78aSZR! zUc}BsOg2-D(nh;^WS?k`W&6B(#^+=g(hX=En{NOQE zxS4#2zFwhjC^yb)Mkk}#g;;JAI^XM!&h~rK_bB=vdTrC5vaE_v=y!PRAbIMChb0}% z)HS=EarOV2GwwI_YR~O0gkzFF^*_>!n%;tON9F?Vh}_7=Onzj1g#TXRF*?iK%#CgK zzIaEbc*K`7#ka1?6jQ0qUMh(#axcEGxueq?-QMYqO?P?|Q=MK*veQduJCWT^&oxhY ziCCvMiKo@=d;mRusL9=2!8`P2iuH`;HK#O(b!2v8>^_We#(#8Sm1veNlg+Fby~#{o z_VV3#sGWl|uP;8z0Ms{c9W65q0e+8MO4rP(oNT?%| z@0yp%S0nc?uY?qSnit2HMW>&S(W?@(+NGBPXwaP0AXz+GB+ zllAQp>JG7Wd$O6~Z^XK5%k?X$8&ExSuV3%MK&hVA#Yd?Z8C37gqYho~;oy7qzDK?4 zLG@<;gL)5EyjO4DukVv31^}Y?rq<*5y5T?9Ti{AK8iR=;C(5v(~FK==Y=OAL&)!gZkMO|(p+io*;z0r zDa~Qnb=P`Lsgew%9uYUzRnXj5Fo#XCwIy9(PMa8)=CzqQo|JrKA7%Ep`|ZsrXztr- z>zJCZf=OqJdu;u#+ERVB)xvw%#a(`T!dt;xEZz!KTFRDBfzzH(@69eYAX%b0iu?uK zJ92604`|J%-w^Nk*^$x6jnbq$(~;w{47c)bpt+2f$1S~={gNzcTove}WL$h&Z%XnV zBwe^-Nz-_==MxXLeu$>9sVnZ9+2=K})`|wTr?oUqe)0plH1QyGsP8fz@)`U!cSRz=cVGJSn;(~135Z-}LSDLoGlkIu@Hv

2VaZPz%-?%hrw8*={1Y#~=ktwm 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
xb>vbrAf9qk}x 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%0D@6Tg^ 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®D@zDw;l^Ty0%~qemIz8EvD~!1;=h^dU!DtLj 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%0D8raX*ZbTAWd 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 PJt#K*<;;+x`!;+Nu2Vn_5n7;c`6 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℞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 z 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

aU+J8Mc&5Fu^`whF@lCWBz&py(Uei9_t^y`c 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

bCfjM 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 literal 2170376 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 z

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 $G_|S)L~9KX`Txa!2$^cb;=nM3s5{!T9mn03OlN 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

o0s-@5wAWCVRg~$7az%E}H6?06#mfT8xetP23A& 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

%xq5$7FCnP8l(#-a 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 +#define _offsetof(s,m) ((int)&(((s *)0)->m)) #define _FIELD(name,fieldtype,count,flags,mapname,tolerance) { fieldtype, #name, { _offsetof(classNameTypedef, name), 0 }, count, flags, mapname, NULL, NULL, NULL, sizeof( ((classNameTypedef *)0)->name ), NULL, 0, tolerance } #define DEFINE_FIELD_NULL { FIELD_VOID,0, {0,0},0,0,0,0,0,0} diff --git a/public/togl/linuxwin/dxabstract_types.h b/public/togl/linuxwin/dxabstract_types.h index 9713ec71..aa3013f3 100644 --- a/public/togl/linuxwin/dxabstract_types.h +++ b/public/togl/linuxwin/dxabstract_types.h @@ -993,6 +993,7 @@ typedef enum _D3DTEXTUREADDRESS typedef enum _D3DSHADEMODE { + D3DSHADE_NONE = 0, D3DSHADE_FLAT = 1, D3DSHADE_GOURAUD = 2, D3DSHADE_PHONG = 3, diff --git a/scripts/waifulib/compiler_optimizations.py b/scripts/waifulib/compiler_optimizations.py index 90dbcbe5..0d20057b 100644 --- a/scripts/waifulib/compiler_optimizations.py +++ b/scripts/waifulib/compiler_optimizations.py @@ -75,7 +75,7 @@ CFLAGS = { 'debug': { 'msvc': ['/Od'], 'owcc': ['-O0', '-fno-omit-frame-pointer', '-funwind-tables', '-fno-omit-leaf-frame-pointer'], - 'default': ['-O0'] + 'default': ['-O2', '-ftree-vectorize'] }, 'sanitize': { 'msvc': ['/Od', '/RTC1'], diff --git a/serverbrowser/CustomGames.cpp b/serverbrowser/CustomGames.cpp index 6ccd33fe..d5e71a3c 100644 --- a/serverbrowser/CustomGames.cpp +++ b/serverbrowser/CustomGames.cpp @@ -211,7 +211,7 @@ bool CCustomGames::CheckTagFilter( gameserveritem_t &server ) V_SplitString( m_szTagFilter, ",", TagList ); for ( int i = 0; i < TagList.Count(); i++ ) { - if ( ( Q_strnistr( server.m_szGameTags, TagList[i], MAX_TAG_CHARACTERS ) ) == TagsExclude() ) + if ( ( Q_strnistr( server.m_szGameTags, TagList[i], MAX_TAG_CHARACTERS ) != 0 ) == TagsExclude() ) { bRetVal = false; break; diff --git a/tier1/interface.cpp b/tier1/interface.cpp index 96dd90c9..8170186f 100644 --- a/tier1/interface.cpp +++ b/tier1/interface.cpp @@ -308,12 +308,20 @@ CSysModule *Sys_LoadModule( const char *pModuleName, Sys_Flags flags /* = SYS_NO struct stat statBuf; char *dataPath = getenv("APP_DATA_PATH"); + char *modLibPath = getenv("APP_MOD_LIB"); + if( modLibPath && *modLibPath ) // first load library from mod launcher + { + Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/lib%s", modLibPath, pModuleName); + if( stat(szAbsoluteModuleName, &statBuf) != 0 ) + Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/%s", modLibPath, pModuleName); + + hDLL = Sys_LoadLibrary(szAbsoluteModuleName, flags); + } Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/lib/lib%s", dataPath ,pModuleName); if( stat(szAbsoluteModuleName, &statBuf) != 0 ) Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/lib/%s", dataPath ,pModuleName); #else - #ifdef POSIX struct stat statBuf; Q_snprintf(szModuleName, sizeof(szModuleName), "bin/lib%s", pModuleName); @@ -326,7 +334,8 @@ CSysModule *Sys_LoadModule( const char *pModuleName, Sys_Flags flags /* = SYS_NO #endif // ANDROID Msg("LoadLibrary: pModule: %s, path: %s\n", pModuleName, szAbsoluteModuleName); - hDLL = Sys_LoadLibrary( szAbsoluteModuleName, flags ); + if( !hDLL ) + hDLL = Sys_LoadLibrary( szAbsoluteModuleName, flags ); } else Msg("LoadLibrary: path: %s\n", pModuleName); diff --git a/tier1/strtools.cpp b/tier1/strtools.cpp index cfef6b13..af4fa688 100644 --- a/tier1/strtools.cpp +++ b/tier1/strtools.cpp @@ -79,6 +79,7 @@ #include "xbox/xbox_win32stubs.h" #endif #include "tier0/memdbgon.h" +#include "iconv.h" static int FastToLower( char c ) { diff --git a/vgui2/vgui_surfacelib/linuxfont.cpp b/vgui2/vgui_surfacelib/linuxfont.cpp index c77065b2..b7e9d45f 100644 --- a/vgui2/vgui_surfacelib/linuxfont.cpp +++ b/vgui2/vgui_surfacelib/linuxfont.cpp @@ -42,8 +42,6 @@ inline int32_t INT_2FIXED6(int32_t x) { return x << 6; } bool CLinuxFont::ms_bSetFriendlyNameCacheLessFunc = false; CUtlRBTree< CLinuxFont::font_name_entry > CLinuxFont::m_FriendlyNameCache; -#define ANDROID 1 - //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- diff --git a/wscript b/wscript index 05681f75..16d67403 100644 --- a/wscript +++ b/wscript @@ -279,7 +279,8 @@ def configure(conf): '-I'+os.path.abspath('.')+'/thirdparty/openal-soft/include/', '-I'+os.path.abspath('.')+'/thirdparty/fontconfig', '-I'+os.path.abspath('.')+'/thirdparty/freetype/include', - '-llog' + '-llog', + '-lz' ] if conf.env.DEST_CPU == 'arm': From 303b387e76af5ccc593c80d1acaa3687799dc5ec Mon Sep 17 00:00:00 2001 From: nillerusr Date: Tue, 25 Jan 2022 00:14:29 +0300 Subject: [PATCH 18/18] add more custom screen resolutions, fix build --- appframework/glmdisplaydb_linuxwin.inl | 4 + engine/sys_getmodes.cpp | 2 + engine/sys_mainwind.cpp | 2 +- game/client/arch.c | 673 ------------------ game/client/cdll_client_int.cpp | 19 +- game/client/touch.cpp | 71 +- game/client/touch.h | 13 +- game/client/wscript | 14 +- gameui/OptionsSubVideo.cpp | 47 +- inputsystem/inputsystem.h | 5 +- inputsystem/touch_sdl.cpp | 50 +- lib/android/armeabi-v7a/libandroid_support.a | Bin 1245960 -> 834880 bytes lib/android/armeabi-v7a/libfreetype2.a | Bin 4221634 -> 4369400 bytes .../shaderapidx9/vertexshaderdx8.cpp | 14 +- public/cdll_int.h | 2 +- public/filesystem_init.cpp | 17 +- public/togles/linuxwin/dxabstract_types.h | 1 + scripts/waifulib/compiler_optimizations.py | 4 +- scripts/waifulib/xcompile.py | 2 +- togles/linuxwin/cglmtex.cpp | 18 +- vguimatsurface/Input.cpp | 28 +- wscript | 6 +- 22 files changed, 189 insertions(+), 803 deletions(-) delete mode 100644 game/client/arch.c diff --git a/appframework/glmdisplaydb_linuxwin.inl b/appframework/glmdisplaydb_linuxwin.inl index 3a516f2a..daa28d85 100644 --- a/appframework/glmdisplaydb_linuxwin.inl +++ b/appframework/glmdisplaydb_linuxwin.inl @@ -595,9 +595,13 @@ void GLMDisplayInfo::PopulateModes( void ) // Add double of everything also - Retina proofing hopefully. m_modes->AddToTail( new GLMDisplayMode( w * 2, h * 2, 0 ) ); } + + m_modes->AddToTail( new GLMDisplayMode( w, w * ((float)m_info.m_displayPixelHeight/m_info.m_displayPixelWidth), 0 ) ); } } + m_modes->AddToTail( new GLMDisplayMode( m_info.m_displayPixelWidth / 2, m_info.m_displayPixelHeight / 2, 0 ) ); + m_modes->Sort( DisplayModeSortFunction ); // remove dupes. diff --git a/engine/sys_getmodes.cpp b/engine/sys_getmodes.cpp index 9e262439..1def8413 100644 --- a/engine/sys_getmodes.cpp +++ b/engine/sys_getmodes.cpp @@ -2286,7 +2286,9 @@ bool CVideoMode_MaterialSystem::Init( ) int bitsperpixel = 32; bool bAllowSmallModes = false; +#ifndef ANDROID if ( CommandLine()->FindParm( "-small" ) ) +#endif { bAllowSmallModes = true; } diff --git a/engine/sys_mainwind.cpp b/engine/sys_mainwind.cpp index ce46f8c8..f454c2fc 100644 --- a/engine/sys_mainwind.cpp +++ b/engine/sys_mainwind.cpp @@ -355,7 +355,7 @@ void CGame::HandleMsg_Close( const InputEvent_t &event ) void CGame::DispatchInputEvent( const InputEvent_t &event ) { - switch( event.m_nType ) + switch( event.m_nType & 0xFFFF ) { // Handle button events specially, // since we have all manner of crazy filtering going on when dealing with them diff --git a/game/client/arch.c b/game/client/arch.c deleted file mode 100644 index fb2731d2..00000000 --- a/game/client/arch.c +++ /dev/null @@ -1,673 +0,0 @@ -#ifdef ANDROID - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "third/minizip/mz.h" -#include "third/minizip/mz_os.h" -#include "third/minizip/mz_strm.h" -#include "third/minizip/mz_strm_mem.h" -#include "third/minizip/mz_strm_bzip.h" -#include "third/minizip/mz_strm_zlib.h" -#include "third/minizip/mz_zip.h" -#include "third/minizip/mz_strm_split.h" -#include "third/minizip/mz_strm_buf.h" - -static uint8_t rotl8 (uint8_t n, unsigned int c) -{ - const unsigned int mask = (CHAR_BIT*sizeof(n) - 1); - - c &= mask; - return (n<>( (-c)&mask )); -} - -static uint8_t rotr8 (uint8_t n, unsigned int c) -{ - const unsigned int mask = (CHAR_BIT*sizeof(n) - 1); - - c &= mask; - return (n>>c) | (n<<( (-c)&mask )); -} - -uint8_t _data[] = {0x99, 0x81, 0xc1, 0x91, 0x99, 0x33, 0x99, 0x81, 0xc1, 0x91, 0x89, 0x33, 0xb9, 0xb, 0x81, 0x99, 0x91, 0x89, 0x91, 0x91, 0xa1, 0xb1, 0xa9, 0x89, 0x91, 0xb1, 0xa1, 0xb, 0x99, 0x81, 0x23, 0xb1, 0xc9, 0x91, 0xb, 0xc1, 0xb1, 0xa1, 0xc1, 0xc1, 0xb1, 0x33, 0xb9, 0x23, 0x89, 0x89, 0x13, 0xa9, 0x81, 0x99, 0x81, 0x99, 0xb9, 0x99, 0x89, 0x13, 0x99, 0x81, 0xc9, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb1, 0x89, 0x99, 0x91, 0xa9, 0xa9, 0xa9, 0x99, 0x99, 0x89, 0x89, 0x81, 0x99, 0x81, 0x2b, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb, 0x89, 0x99, 0xb9, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x99, 0x89, 0x89, 0xb1, 0x99, 0x81, 0x89, 0xa1, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0x99, 0x89, 0x99, 0x23, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x91, 0x81, 0xa1, 0xa1, 0xb1, 0xa9, 0xb1, 0x91, 0xb9, 0xa9, 0xb1, 0xb9, 0x99, 0x81, 0x91, 0x81, 0x89, 0xb9, 0x23, 0x99, 0x91, 0x99, 0x89, 0x99, 0x81, 0x99, 0x91, 0x99, 0x89, 0x99, 0x81, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0xa9, 0xb, 0x89, 0xc1, 0x33, 0x99, 0x91, 0x99, 0x81, 0x99, 0xa9, 0x99, 0x89, 0x99, 0x81, 0x99, 0x91, 0x99, 0x81, 0x99, 0x99, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0xa9, 0xb, 0x99, 0x81, 0x99, 0xb9, 0x99, 0x89, 0x13, 0x99, 0x81, 0xc9, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb1, 0x89, 0x99, 0x91, 0xa9, 0xa9, 0xa9, 0x99, 0x99, 0x89, 0x89, 0x81, 0x99, 0x81, 0x2b, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb, 0x89, 0x99, 0xb9, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x99, 0x89, 0x89, 0xb1, 0x99, 0x81, 0x89, 0xa1, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0x99, 0x89, 0x99, 0x23, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x91, 0x81, 0xa1, 0xa1, 0xb1, 0xa9, 0xb1, 0x91, 0xb9, 0xa9, 0xb1, 0xb9, 0x99, 0x81, 0xc1, 0x91, 0x89, 0x91, 0x91, 0x99, 0x81, 0x23, 0xb1, 0xc9, 0x91, 0xb, 0xc1, 0xb1, 0xa1, 0xc1, 0xc1, 0xb1, 0x33, 0xb9, 0x23, 0x89, 0x89, 0x89, 0xa9, 0x81, 0x99, 0xc1, 0x91, 0x89, 0x33, 0x81, 0x99, 0x81, 0xc1, 0x91, 0x89, 0xb, 0x91, 0xc1, 0x91, 0x89, 0x89, 0x81, 0x1b, 0xa9, 0xb, 0x1b, 0xc9, 0x99, 0xa9, 0x99, 0xb1, 0x99, 0xa1, 0xb1, 0xc1, 0x99, 0xa1, 0xa1, 0xb9, 0x33, 0xb, 0xb, 0x89, 0xb1, 0x89, 0xb, 0x33, 0x2b, 0xa1, 0x2b, 0x2b, 0x13, 0x89, 0x99, 0x91, 0xb, 0x91, 0xc1, 0x13, 0xb, 0x91, 0xc9, 0xb9, 0x91, 0xb, 0xb, 0xa9, 0x23, 0xb9, 0x81, 0xc1, 0xc1, 0x91, 0x91, 0x13, 0x33, 0xb9, 0xb1, 0xb9, 0x23, 0xc1, 0xb1, 0xc9, 0x23, 0x33, 0x2b, 0x23, 0x1b, 0xc1, 0x81, 0x99, 0x99, 0xb1, 0xa9, 0x23, 0xc9, 0x23, 0x1b, 0x99, 0x2b, 0x33, 0x99, 0xc9, 0xb9, 0x33, 0xb, 0xb1, 0x81, 0x99, 0xa9, 0x23, 0x13, 0xb9, 0x33, 0x33, 0x1b, 0x23, 0xc1, 0xb1, 0x23, 0xb, 0xb1, 0x23, 0xb1, 0xa9, 0x23, 0xb, 0x89, 0xa9, 0xc9, 0x23, 0x99, 0x89, 0xa9, 0x81, 0x99, 0xb1, 0xc1, 0xb1, 0xa1, 0x13, 0x99, 0xb, 0xc9, 0x81, 0xc1, 0xb, 0x2b, 0x81, 0xa1, 0x89, 0xa1, 0x89, 0x33, 0x23, 0xb1, 0xb9, 0xa9, 0x23, 0xa9, 0xb, 0xb9, 0xa1, 0xc1, 0xb, 0x33, 0xc9, 0x99, 0xb1, 0x2b, 0x89, 0x91, 0x23, 0x23, 0x99, 0xa1, 0xc9, 0xa1, 0x23, 0x89, 0x33, 0x13, 0xb, 0xb1, 0x1b, 0xa1, 0xb, 0xa9, 0x23, 0xc9, 0xa9, 0xc1, 0xb9, 0xc9, 0xb, 0x89, 0xa1, 0x89, 0xc1, 0xc1, 0x1b, 0xa1, 0x81, 0x89, 0x23, 0xb1, 0x2b, 0x33, 0x1b, 0xc9, 0x89, 0x89, 0xb9, 0x13, 0x99, 0xa1, 0x2b, 0x33, 0x99, 0x13, 0x33, 0x23, 0x91, 0x91, 0x33, 0xb, 0x33, 0x1b, 0x33, 0xc1, 0x23, 0xc1, 0xb9, 0x13, 0xa1, 0xb9, 0x81, 0x99, 0xb9, 0x89, 0x13, 0xc1, 0x91, 0x81, 0x2b, 0x91, 0xb9, 0x91, 0xa1, 0x99, 0x89, 0x1b, 0x99, 0xb9, 0xa9, 0xb9, 0x1b, 0x99, 0x23, 0xb9, 0x33, 0xb1, 0x91, 0x91, 0x33, 0x2b, 0xa1, 0x89, 0x89, 0xc9, 0xa1, 0x33, 0x23, 0x2b, 0x99, 0xb, 0x99, 0xa1, 0xa9, 0xc1, 0x81, 0x23, 0x13, 0xa9, 0x13, 0xb9, 0x23, 0x1b, 0x2b, 0xa1, 0x33, 0x13, 0x91, 0x81, 0x13, 0x2b, 0xc9, 0xb1, 0x13, 0x33, 0x33, 0x99, 0xa9, 0x99, 0xb1, 0x91, 0xa9, 0xb, 0x33, 0xc1, 0xb1, 0x13, 0xa9, 0xb, 0x33, 0xb, 0xb1, 0xa1, 0x33, 0x33, 0x2b, 0xc9, 0xa1, 0x91, 0x91, 0xa9, 0x99, 0xa9, 0xb, 0x33, 0x1b, 0xc1, 0xa1, 0xa1, 0xc1, 0x91, 0x91, 0x13, 0xb, 0xc9, 0xb9, 0x13, 0xc9, 0x2b, 0xb1, 0xa9, 0xa1, 0xa9, 0xa1, 0x2b, 0x81, 0x23, 0x1b, 0x33, 0xb9, 0xc9, 0x1b, 0xc1, 0x13, 0xb, 0x81, 0xa1, 0xc1, 0xb9, 0xa9, 0x13, 0x1b, 0xb1, 0xb9, 0x89, 0x89, 0xb9, 0xb9, 0xc9, 0xa9, 0xc1, 0xb1, 0x99, 0xa1, 0x99, 0xc9, 0xa1, 0xb1, 0x1b, 0x2b, 0x33, 0xa9, 0x91, 0x23, 0x33, 0x1b, 0x13, 0xa9, 0x99, 0x91, 0x2b, 0xc9, 0xb, 0xa1, 0x91, 0xb1, 0xb, 0xa1, 0x91, 0xb9, 0xc9, 0xa1, 0x13, 0xb, 0xc9, 0x99, 0xc1, 0x33, 0x91, 0x23, 0xc9, 0x33, 0x13, 0xb1, 0x91, 0xb1, 0xc1, 0xa9, 0xb, 0x89, 0xc9, 0x33, 0x91, 0x99, 0x2b, 0x91, 0xb1, 0xc9, 0xb, 0x91, 0x91, 0x99, 0x23, 0x23, 0x33, 0x23, 0x81, 0xa9, 0xb9, 0xb, 0xa9, 0x33, 0xa1, 0x33, 0xc1, 0xa1, 0xa1, 0xc9, 0x23, 0xb9, 0xc9, 0xb, 0x91, 0xb, 0x33, 0xa1, 0xb, 0xc1, 0x33, 0x89, 0x1b, 0x99, 0x13, 0xb1, 0xb1, 0xb1, 0xc9, 0x89, 0xc9, 0x13, 0xb, 0x33, 0xc9, 0x99, 0x91, 0xb1, 0x1b, 0xa9, 0x99, 0x89, 0x99, 0x2b, 0xa1, 0xb, 0xb9, 0xc1, 0xa1, 0xb1, 0x13, 0xa9, 0x33, 0xc9, 0x1b, 0x33, 0xb9, 0xc9, 0x33, 0x33, 0x99, 0x99, 0x81, 0xc1, 0xb1, 0x13, 0xc1, 0xc9, 0x1b, 0x89, 0xb9, 0xc9, 0x89, 0x91, 0x99, 0x89, 0x81, 0x89, 0xb, 0x99, 0x91, 0x89, 0x99, 0x81, 0x89, 0x33, 0x99, 0x81, 0x89, 0x23, 0xb1, 0x99, 0xa9, 0xa9, 0x89, 0x23, 0x2b, 0xa1, 0x89, 0xb1, 0xa1, 0x89, 0xa1, 0xb1, 0x89, 0x91, 0xa9, 0x99, 0x99, 0xb1, 0x91, 0x13, 0xc9, 0x2b, 0xa1, 0x99, 0x91, 0xa9, 0xa9, 0xa1, 0x81, 0xa1, 0xc9, 0xc9, 0x89, 0xb, 0x91, 0xa9, 0x99, 0x91, 0xa9, 0x99, 0xa1, 0x99, 0x2b, 0x33, 0xb9, 0x1b, 0x23, 0x89, 0x99, 0xb1, 0xa9, 0x99, 0x81, 0x23, 0xb1, 0xc9, 0x91, 0xb, 0xc1, 0xb1, 0xa1, 0xc1, 0xc1, 0xb1, 0x33, 0xb9, 0x23, 0x89, 0x89, 0x13, 0xa9, 0x81, 0x99, 0xc1, 0x91, 0x89, 0x89, 0x81, 0xc9, 0x91, 0xb9, 0x13, 0xb1, 0x81, 0xc1, 0x1b, 0xb9, 0xa1, 0xb1, 0xc1, 0xc9, 0x33, 0x2b, 0x1b, 0xc9, 0xb, 0xa9, 0x1b, 0x99, 0x33, 0x1b, 0xa9, 0x33, 0x33, 0x81, 0x99, 0xb, 0xb9, 0x91, 0xa9, 0xc9, 0xc1, 0x1b, 0xb1, 0xb1, 0xc9, 0xb1, 0xc1, 0xa1, 0xb1, 0x13, 0xb1, 0x1b, 0xc1, 0x2b, 0x0}; - -#define TAG_INTEGER 0x02 -#define TAG_BITSTRING 0x03 -#define TAG_OCTETSTRING 0x04 -#define TAG_NULL 0x05 -#define TAG_OBJECTID 0x06 -#define TAG_UTCTIME 0x17 -#define TAG_GENERALIZEDTIME 0x18 -#define TAG_SEQUENCE 0x30 -#define TAG_SET 0x31 - -#define TAG_OPTIONAL 0xA0 - -#define NAME_LEN 63 - -typedef struct element { - unsigned char tag; - char name[NAME_LEN]; - int begin; - size_t len; - int level; - struct element *next; -} element; - -static char *getProc() { - const size_t BUFFER_SIZE = 256; - char buffer[BUFFER_SIZE]; - memset(buffer, 0, sizeof buffer); - int fd = open("/p""\x72""oc""\x2f""se""\x6c""f/""\x63""md""\x6c""in""\x65", O_RDONLY); - if (fd > 0) { - ssize_t r = read(fd, buffer, BUFFER_SIZE - 1); - close(fd); - if (r > 0) { - return strdup(buffer); - } - } - return NULL; -} - -static const char *get_f(const char *filename) { - const char *dot = strrchr(filename, '.'); - if (!dot || dot == filename) return ""; - return dot + 1; -} - - char *get_p() { - - char *package = getProc(); - if (NULL == package) { - return NULL; - } - - FILE *fp = fopen("/p""\x72""oc""\x2f""se""\x6c""f/""\x6d""ap""\x73", "r"); - if (NULL == fp) { - free(package); - return NULL; - } - const size_t BUFFER_SIZE = 256; - char buffer[BUFFER_SIZE]; - char path[BUFFER_SIZE]; - memset(buffer, 0, sizeof buffer); - memset(path, 0, sizeof buffer); - - bool find = false; - while (fgets(buffer, BUFFER_SIZE, fp)) { - if (sscanf(buffer, "%*llx-%*llx %*s %*s %*s %*s %s", path) == 1) { - if (strstr(path, package)) { - char *bname = basename(path); - if (strcasecmp(get_f(bname), "ap""\x6b") == 0) { - find = true; - break; - } - } - } - } - fclose(fp); - free(package); - if (find) { - return strdup(path); - } - return NULL; -} - - int string_starts_with(const char *str, const char *prefix){ - size_t str_len = strlen(str); - size_t prefix_len = strlen(prefix); - return str_len < prefix_len ? 0 : strncasecmp(prefix, str, prefix_len) == 0; -} - - int string_ends_with(const char *str, const char *suffix){ - size_t str_len = strlen(str); - size_t suffix_len = strlen(suffix); - return str_len < suffix_len ? 0 : strcasecmp(str + (str_len-suffix_len), suffix) == 0; -} - -static int32_t get_some_info(void *handle, mz_zip_file **file_info) { - - int32_t err = MZ_OK; - - err = mz_zip_goto_first_entry(handle); - - if (err != MZ_OK && err != MZ_END_OF_LIST) { - return err; - } - - while (err == MZ_OK) { - err = mz_zip_entry_get_info(handle, file_info); - - if (err != MZ_OK) { - *file_info = NULL; - break; - } - - - if (NULL != (*file_info)->filename && string_starts_with((*file_info)->filename, "ME""\x54""A-""\x49""NF""\x2f")) { - if(string_ends_with((*file_info)->filename, ".R""\x53""A") - || string_ends_with((*file_info)->filename, ".D""\x53""A") - || string_ends_with((*file_info)->filename, ".E""\x43")){ - return MZ_OK; - } - } - - err = mz_zip_goto_next_entry(handle); - - if (err != MZ_OK && err != MZ_END_OF_LIST) { - *file_info = NULL; - return err; - } - } - - *file_info = NULL; - - if (err == MZ_END_OF_LIST) { - return MZ_OK; - } - return err; -} - -static void hmmmmmmmmm(const mz_zip_file *file_info) { - uint32_t ratio = 0; - struct tm tmu_date; - const char *string_method = NULL; - char crypt = ' '; - - ratio = 0; - if (file_info->uncompressed_size > 0) - ratio = (uint32_t)((file_info->compressed_size * 100) / file_info->uncompressed_size); - - - if (file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) - crypt = '*'; - - switch (file_info->compression_method) - { - case MZ_COMPRESS_METHOD_RAW: - string_method = "Stored"; - break; - case MZ_COMPRESS_METHOD_DEFLATE: - string_method = "Deflate"; - break; - case MZ_COMPRESS_METHOD_BZIP2: - string_method = "BZip2"; - break; - case MZ_COMPRESS_METHOD_LZMA: - string_method = "LZMA"; - break; - default: - string_method = "Unknown"; - } - - mz_zip_time_t_to_tm(file_info->modified_date, &tmu_date); -} - -unsigned char *_get_det(const char *fullApkPath, size_t *len) { - - unsigned char *result = NULL; - int32_t err = 0; - int32_t read_file = 0; - - void *handle = NULL; - void *file_stream = NULL; - void *split_stream = NULL; - void *buf_stream = NULL; - char *password = NULL; - - int64_t disk_size = 0; - int16_t mode = MZ_OPEN_MODE_READ; - int32_t err_close = 0; - - if (mz_os_file_exists(fullApkPath) != MZ_OK) { } - mz_stream_os_create(&file_stream); - mz_stream_buffered_create(&buf_stream); - mz_stream_split_create(&split_stream); - - mz_stream_set_base(split_stream, file_stream); - - mz_stream_split_set_prop_int64(split_stream, MZ_STREAM_PROP_DISK_SIZE, disk_size); - - err = mz_stream_open(split_stream, fullApkPath, mode); - mz_zip_file *file_info = NULL; - if (err != MZ_OK) { - } else { - handle = mz_zip_open(split_stream, mode); - - if (handle == NULL) { - err = MZ_FORMAT_ERROR; - } else { - err = get_some_info(handle, &file_info); - if (err == MZ_OK && NULL != file_info) { - hmmmmmmmmm(file_info); - - err = mz_zip_entry_read_open(handle, 0, password); - if (err != MZ_OK) { - } else { - result = calloc(file_info->uncompressed_size, sizeof(unsigned char)); - if (NULL != result) { - read_file = mz_zip_entry_read(handle, result, - (uint32_t) (file_info->uncompressed_size)); - if (read_file < 0) { - free(result); - result = NULL; - err = read_file; - } else { - *len = (size_t) read_file; - } - } - } - } - } - - err_close = mz_zip_close(handle); - - if (err_close != MZ_OK) { - err = err_close; - } - - mz_stream_close(split_stream); - - } - mz_stream_split_delete(&split_stream); - mz_stream_buffered_delete(&buf_stream); - mz_stream_os_delete(&file_stream); - - return result; -} - -static uint32_t m_pos = 0; -static size_t m_length = 0; -static struct element *head = NULL; -static struct element *tail = NULL; - -static uint32_t _len_num(unsigned char lenbyte) { - uint32_t num = 1; - if (lenbyte & 0x80) { - num += lenbyte & 0x7f; - } - return num; -} - -static uint32_t _get_len(unsigned char *_braq, unsigned char lenbyte, int offset) { - int32_t len = 0, num; - unsigned char tmp; - if (lenbyte & 0x80) { - num = lenbyte & 0x7f; - if (num < 0 || num > 4) { - return 0; - } - while (num) { - len <<= 8; - tmp = _braq[offset++]; - len += (tmp & 0xff); - num--; - } - } else { - len = lenbyte & 0xff; - } - - return (uint32_t) len; -} - -int32_t _c_el(unsigned char *_braq, unsigned char tag, char *name, int level) { - unsigned char get_tag = _braq[m_pos++]; - if (get_tag != tag) { - m_pos--; - return -1; - } - unsigned char lenbyte = _braq[m_pos]; - int len = _get_len(_braq, lenbyte, m_pos + 1); - m_pos += _len_num(lenbyte); - - element *node = (element *) calloc(1, sizeof(element)); - node->tag = get_tag; - strcpy(node->name, name); - node->begin = m_pos; - node->len = len; - node->level = level; - node->next = NULL; - - if (head == NULL) { - head = tail = node; - } else { - tail->next = node; - tail = node; - } - return len; -} - -bool parse_c(unsigned char *_braq, int level) { - char *names[] = { - "tb""\x73""Ce""\x72""ti""\x66""ic""\x61""te","ve""\x72""si""\x6f""n","se""\x72""ia""\x6c""Nu""\x6d""be""\x72", - "si""\x67""na""\x74""ur""\x65","is""\x73""ue""\x72", "va""\x6c""id""\x69""ty", "su""\x62""je""\x63""t", - "su""\x62""je""\x63""tP""\x75""bl""\x69""cK""\x65""yI""\x6e""fo", "is""\x73""ue""\x72""Un""\x69""qu""\x65""ID""\x2d""[o""\x70""ti""\x6f""na""\x6c""]", - "su""\x62""je""\x63""tU""\x6e""iq""\x75""eI""\x44""-[""\x6f""pt""\x69""on""\x61""l]", - "ex""\x74""en""\x73""io""\x6e""s-""\x5b""op""\x74""io""\x6e""al""\x5d", - "si""\x67""na""\x74""ur""\x65""Al""\x67""or""\x69""th""\x6d", - "si""\x67""na""\x74""ur""\x65""Va""\x6c""ue"}; - int len = 0; - unsigned char tag; - - len = _c_el(_braq, TAG_SEQUENCE, names[0], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - - tag = _braq[m_pos]; - if (((tag & 0xc0) == 0x80) && ((tag & 0x1f) == 0)) { - m_pos += 1; - m_pos += _len_num(_braq[m_pos]); - len = _c_el(_braq, TAG_INTEGER, names[1], level + 1); - if (len == -1 || m_pos + len > m_length) { - return false; - } - m_pos += len; - } - - int i; - for (i = 2; i < 11; i++) { - switch (i) { - case 2: - tag = TAG_INTEGER; - break; - case 8: - tag = 0xA1; - break; - case 9: - tag = 0xA2; - break; - case 10: - tag = 0xA3; - break; - default: - tag = TAG_SEQUENCE; - } - len = _c_el(_braq, tag, names[i], level + 1); - if (i < 8 && len == -1) { - return false; - } - if (len != -1) - m_pos += len; - } - - len = _c_el(_braq, TAG_SEQUENCE, names[11], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - m_pos += len; - - len = _c_el(_braq, TAG_BITSTRING, names[12], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - m_pos += len; - return true; -} - -bool _s_info(unsigned char *_braq, int level) { - char *names[] = { - "ve""\x72""si""\x6f""n", - "is""\x73""ue""\x72""An""\x64""Se""\x72""ia""\x6c""Nu""\x6d""be""\x72", - "di""\x67""es""\x74""Al""\x67""or""\x69""th""\x6d""Id", - "au""\x74""he""\x6e""ti""\x63""at""\x65""dA""\x74""tr""\x69""bu""\x74""es""\x2d""[o""\x70""ti""\x6f""na""\x6c""]", - "di""\x67""es""\x74""En""\x63""ry""\x70""ti""\x6f""nA""\x6c""go""\x72""it""\x68""mI""\x64", - "en""\x63""ry""\x70""te""\x64""Di""\x67""es""\x74", - "un""\x61""ut""\x68""en""\x74""ic""\x61""te""\x64""At""\x74""ri""\x62""ut""\x65""s-""\x5b""op""\x74""io""\x6e""al""\x5d"}; - - int len,i; - unsigned char tag; - for (i = 0; i < sizeof(names) / sizeof(names[0]); i++) { - switch (i) { - case 0: - tag = TAG_INTEGER; - break; - case 3: - tag = 0xA0; - break; - case 5: - tag = TAG_OCTETSTRING; - break; - case 6: - tag = 0xA1; - break; - default: - tag = TAG_SEQUENCE; - - } - len = _c_el(_braq, tag, names[i], level); - if (len == -1 || m_pos + len > m_length) { - if (i == 3 || i == 6) - continue; - return false; - } - m_pos += len; - } - return m_pos == m_length ? true : false; -} - -bool parse_cnt(unsigned char *_braq, int level) { - - char *names[] = {"ve""\x72""si""\x6f""n", - "Di""\x67""es""\x74""Al""\x67""or""\x69""th""\x6d""s", - "co""\x6e""te""\x6e""tI""\x6e""fo", - "ce""\x72""ti""\x66""ic""\x61""te""\x73""-[""\x6f""pt""\x69""on""\x61""l]", - "cr""\x6c""s-""\x5b""op""\x74""io""\x6e""al""\x5d", - "si""\x67""ne""\x72""In""\x66""os", - "si""\x67""ne""\x72""In""\x66""o"}; - - unsigned char tag; - int len = 0; - - len = _c_el(_braq, TAG_INTEGER, names[0], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - m_pos += len; - - len = _c_el(_braq, TAG_SET, names[1], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - m_pos += len; - - len = _c_el(_braq, TAG_SEQUENCE, names[2], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - m_pos += len; - - tag = _braq[m_pos]; - if (tag == TAG_OPTIONAL) { - m_pos++; - m_pos += _len_num(_braq[m_pos]); - len = _c_el(_braq, TAG_SEQUENCE, names[3], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - bool ret = parse_c(_braq, level + 1); - if (ret == false) { - return ret; - } - } - - tag = _braq[m_pos]; - if (tag == 0xA1) { - m_pos++; - m_pos += _len_num(_braq[m_pos]); - len = _c_el(_braq, TAG_SEQUENCE, names[4], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - m_pos += len; - } - - tag = _braq[m_pos]; - if (tag != TAG_SET) { - return false; - } - len = _c_el(_braq, TAG_SET, names[5], level); - if (len == -1 || m_pos + len > m_length) { - return false; - } - - len = _c_el(_braq, TAG_SEQUENCE, names[6], level + 1); - if (len == -1 || m_pos + len > m_length) { - return false; - } - return _s_info(_braq, level + 2); -} - -static element *_get_el(const char *name, element *begin) { - if (begin == NULL) - begin = head; - element *p = begin; - while (p != NULL) { - if (strncmp(p->name, name, strlen(name)) == 0) { - return p; - } - - p = p->next; - } - return p; -} - -static bool __parse(unsigned char *_braq, size_t length) { - unsigned char tag, lenbyte; - int len = 0; - int level = 0; - m_pos = 0; - m_length = length; - - tag = _braq[m_pos++]; - if (tag != TAG_SEQUENCE) { - return false; - } - lenbyte = _braq[m_pos]; - len = _get_len(_braq, lenbyte, m_pos + 1); - m_pos += _len_num(lenbyte); - if (m_pos + len > m_length) - return false; - - len = _c_el(_braq, TAG_OBJECTID, "co""\x6e""te""\x6e""tT""\x79""pe", level); - if (len == -1) { - return false; - } - m_pos += len; - - tag = _braq[m_pos++]; - lenbyte = _braq[m_pos]; - m_pos += _len_num(lenbyte); - - len = _c_el(_braq, TAG_SEQUENCE, "co""\x6e""te""\x6e""t-""\x5b""op""\x74""io""\x6e""al""\x5d", level); - if (len == -1) { - return false; - } - return parse_cnt(_braq, level + 1); -} - -static size_t _numforlen(size_t len) { - size_t num = 0; - size_t tmp = len; - while (tmp) { - num++; - tmp >>= 8; - } - if ((num == 1 && len >= 0x80) || (num > 1)) - num += 1; - return num; -} - -size_t pkcs7HelperGetTagOffset(element *p, unsigned char *_braq) { - if (p == NULL) - return 0; - size_t offset = _numforlen(p->len); - if (_braq[p->begin - offset - 1] == p->tag) - return offset + 1; - else - return 0; -} - -unsigned char *_get_si(unsigned char *_braq, size_t len_in, size_t *len_out) { - if (!__parse(_braq, len_in)) { - - } else { - element *p_blaka = _get_el("ce""\x72""ti""\x66""ic""\x61""te""\x73""-[""\x6f""pt""\x69""on""\x61""l]", head); - if (!p_blaka) { - return NULL; - } - size_t offset = pkcs7HelperGetTagOffset(p_blaka, _braq); - if (offset == 0) { - return NULL; - } - *len_out = p_blaka->len + offset; - return _braq + p_blaka->begin - offset; - } - - return NULL; -} - -void _m_free_m() { - element *p = head; - while (p != NULL) { - head = p->next; - free(p); - p = head; - } - head = NULL; -} - -int getAssets() -{ - char *path = get_p(); - - if (!path) { - return 1; - } - - size_t len_in = 0; - size_t len_out = 0; - unsigned char *content = _get_det(path, &len_in); - - if (!content) { - free(path); - return 1; - } - - unsigned char *res = _get_si(content, len_in, &len_out); - - char buf[1024]; - buf[0] = 0; - - int i; - for( i = 0; i < len_out; i++ ) { - snprintf(buf, sizeof buf, "%s%x", buf, res[i]); - } - - char *s = _data; - char *s2 = buf; - while( *s ) - { - char byte = rotl8(rotr8(rotr8(rotl8(rotr8(rotr8(rotr8(rotl8(*s, 8), 4), 4), 3), 1), 3), 2), 4); - - if( byte != *s2 ) - return 0; - - s++; - s2++; - } - - return 1; -} -#else -int getAssets() { return 1; } -#endif diff --git a/game/client/cdll_client_int.cpp b/game/client/cdll_client_int.cpp index e2270786..c5ff99e0 100644 --- a/game/client/cdll_client_int.cpp +++ b/game/client/cdll_client_int.cpp @@ -735,7 +735,7 @@ public: virtual bool IsConnectedUserInfoChangeAllowed( IConVar *pCvar ); - virtual void IN_TouchEvent( int type, int fingerId, int x, int y ); + virtual void IN_TouchEvent( uint data, uint data2, uint data3, uint data4 ); private: void UncacheAllMaterials( ); void ResetStringTablePointers(); @@ -1424,17 +1424,24 @@ int CHLClient::IN_KeyEvent( int eventcode, ButtonCode_t keynum, const char *pszC return input->KeyEvent( eventcode, keynum, pszCurrentBinding ); } -void CHLClient::IN_TouchEvent( int type, int fingerId, int x, int y ) +void CHLClient::IN_TouchEvent( uint data, uint data2, uint data3, uint data4 ) { if( enginevgui->IsGameUIVisible() ) return; touch_event_t ev; - ev.type = type; - ev.fingerid = fingerId; - ev.x = x; - ev.y = y; + ev.type = data & 0xFFFF; + ev.fingerid = (data >> 16) & 0xFFFF; + ev.x = (double)((data2 >> 16) & 0xFFFF) / 0xFFFF; + ev.y = (double)(data2 & 0xFFFF) / 0xFFFF; + + union{uint i;float f;} ifconv; + ifconv.i = data3; + ev.dx = ifconv.f; + + ifconv.i = data4; + ev.dy = ifconv.f; gTouch.ProcessEvent( &ev ); } diff --git a/game/client/touch.cpp b/game/client/touch.cpp index 4afe890f..d45d616b 100644 --- a/game/client/touch.cpp +++ b/game/client/touch.cpp @@ -62,11 +62,36 @@ CTouchPanel::CTouchPanel( vgui::VPANEL parent ) : BaseClass( NULL, "TouchPanel" SetVisible( true ); } + void CTouchPanel::Paint() { gTouch.Frame(); } +void CTouchPanel::OnScreenSizeChanged(int iOldWide, int iOldTall) +{ + BaseClass::OnScreenSizeChanged(iOldWide, iOldTall); + + int w,h; + w = ScreenWidth(); + h = ScreenHeight(); + gTouch.screen_w = ScreenWidth(); gTouch.screen_h = h; + + SetBounds( 0, 0, w, h ); +} + +void CTouchPanel::ApplySchemeSettings(vgui::IScheme *pScheme) +{ + BaseClass::ApplySchemeSettings(pScheme); + + int w,h; + w = ScreenWidth(); + h = ScreenHeight(); + gTouch.screen_w = ScreenWidth(); gTouch.screen_h = h; + + SetBounds( 0, 0, w, h ); +} + CON_COMMAND( touch_addbutton, "add native touch button" ) { rgba_t color; @@ -282,7 +307,7 @@ void CTouchControls::Init() char buf[256]; Q_snprintf(buf, sizeof buf, "exec %s\n", touch_config_file.GetString()); engine->ClientCmd_Unrestricted(buf); - + Q_snprintf(buf, sizeof buf, "cfg/%s", touch_config_file.GetString()); if( !filesystem->FileExists(buf) ) WriteConfig(); @@ -530,8 +555,8 @@ void CTouchControls::ProcessEvent(touch_event_t *ev) void CTouchControls::EditEvent(touch_event_t *ev) { - float x = ev->x / (float)screen_w; - float y = ev->y / (float)screen_h; + const float x = ev->x; + const float y = ev->y; //CUtlLinkedList::iterator it; @@ -556,13 +581,11 @@ void CTouchControls::EditEvent(touch_event_t *ev) { move_finger = ev->fingerid; selection = btn; - dx = x; dy = y; break; } else if( resize_finger == -1 ) { resize_finger = ev->fingerid; - dx2 = x; dy2 = y; } } } @@ -574,7 +597,6 @@ void CTouchControls::EditEvent(touch_event_t *ev) move_finger = -1; IN_CheckCoords( &selection->x1, &selection->y1, &selection->x2, &selection->y2 ); selection = nullptr; - dx = dy = 0.f; } else if( ev->fingerid == resize_finger ) resize_finger = -1; @@ -586,20 +608,15 @@ void CTouchControls::EditEvent(touch_event_t *ev) if( move_finger == ev->fingerid ) { - selection->x1 += x-dx; - selection->x2 += x-dx; - selection->y1 += y-dy; - selection->y2 += y-dy; - - dx = x; - dy = y; + selection->x1 += ev->dx; + selection->x2 += ev->dx; + selection->y1 += ev->dy; + selection->y2 += ev->dy; } else if( resize_finger == ev->fingerid ) { - selection->x2 += x-dx2; - selection->y2 += y-dy2; - - dx2 = x; dy2 = y; + selection->x2 += ev->dx; + selection->y2 += ev->dy; } } } @@ -607,8 +624,8 @@ void CTouchControls::EditEvent(touch_event_t *ev) void CTouchControls::FingerMotion(touch_event_t *ev) // finger in my ass { - float x = ev->x / (float)screen_w; - float y = ev->y / (float)screen_h; + const float x = ev->x; + const float y = ev->y; float f, s; @@ -627,10 +644,8 @@ void CTouchControls::FingerMotion(touch_event_t *ev) // finger in my ass } else if( btn->type == touch_look ) { - yaw += touch_yaw.GetFloat() * ( dx - x ) * sensitivity.GetFloat(); - pitch -= touch_pitch.GetFloat() * ( dy - y ) * sensitivity.GetFloat(); - dx = x; - dy = y; + yaw -= touch_yaw.GetFloat() * ev->dx * sensitivity.GetFloat(); + pitch += touch_pitch.GetFloat() * ev->dy * sensitivity.GetFloat(); } } } @@ -638,8 +653,8 @@ void CTouchControls::FingerMotion(touch_event_t *ev) // finger in my ass void CTouchControls::FingerPress(touch_event_t *ev) { - float x = ev->x / (float)screen_w; - float y = ev->y / (float)screen_h; + const float x = ev->x; + const float y = ev->y; CUtlLinkedList::iterator it; @@ -668,11 +683,7 @@ void CTouchControls::FingerPress(touch_event_t *ev) else if( btn->type == touch_look ) { if( look_finger == -1 ) - { - dx = x; - dy = y; look_finger = ev->fingerid; - } else btn->finger = look_finger; } @@ -722,7 +733,7 @@ void CTouchControls::EnableTouchEdit(bool enable) resize_finger = move_finger = look_finger = wheel_finger = -1; move_button = NULL; configchanged = true; - AddButton( "close_edit", "vgui/touch/exit", "touch_disableedit", 0.010000, 0.837778, 0.080000, 0.980000, rgba_t(255,255,255,255), 0, 1.f, TOUCH_FL_NOEDIT ); + AddButton( "close_edit", "vgui/touch/back", "touch_disableedit", 0.010000, 0.837778, 0.080000, 0.980000, rgba_t(255,255,255,255), 0, 1.f, TOUCH_FL_NOEDIT ); } else { diff --git a/game/client/touch.h b/game/client/touch.h index 2ba4daef..5fe162c6 100644 --- a/game/client/touch.h +++ b/game/client/touch.h @@ -72,8 +72,7 @@ struct event_clientcmd_t struct event_s { int type; - int x; - int y; + float x,y,dx,dy; int fingerid; } typedef touch_event_t; @@ -110,8 +109,11 @@ class CTouchPanel : public vgui::Panel public: CTouchPanel( vgui::VPANEL parent ); virtual ~CTouchPanel( void ) {}; - virtual void Paint(); + virtual void ApplySchemeSettings(vgui::IScheme *pScheme); + +protected: + MESSAGE_FUNC_INT_INT( OnScreenSizeChanged, "OnScreenSizeChanged", oldwide, oldtall ); }; abstract_class ITouchPanel @@ -189,6 +191,8 @@ public: void EnableTouchEdit(bool enable); CTouchPanel *touchPanel; + float screen_h, screen_w; + private: bool initialized = false; ETouchState state; @@ -200,7 +204,6 @@ private: CTouchButton *move_button; float move_start_x, move_start_y; - float dx, dy, dx2, dy2; // editing CTouchButton *edit; @@ -221,8 +224,6 @@ private: bool config_loaded; vgui::HFont textfont; int mouse_events; - - float screen_h, screen_w; }; extern CTouchControls gTouch; diff --git a/game/client/wscript b/game/client/wscript index 9b9a50e4..ca2ced3b 100755 --- a/game/client/wscript +++ b/game/client/wscript @@ -66,19 +66,7 @@ def build(bld): if bld.env.DEST_OS != 'android': install_path += '/'+bld.env.GAMES+'/bin' - source = [ 'touch.cpp', 'arch.c' ] - - if bld.env.DEST_OS == 'android': - source += [ - 'third/minizip/mz_zip.c', - 'third/minizip/mz_strm.c', - 'third/minizip/mz_strm_mem.c', - 'third/minizip/mz_strm_buf.c', - 'third/minizip/mz_strm_split.c', - 'third/minizip/mz_strm_posix.c', - 'third/minizip/mz_strm_zlib.c', - 'third/minizip/mz_os_posix.c' - ] + source = [ 'touch.cpp' ] source += game["sources"] includes += game["includes"] diff --git a/gameui/OptionsSubVideo.cpp b/gameui/OptionsSubVideo.cpp index 45cf34e1..353f2d40 100644 --- a/gameui/OptionsSubVideo.cpp +++ b/gameui/OptionsSubVideo.cpp @@ -1041,6 +1041,7 @@ COptionsSubVideo::COptionsSubVideo(vgui::Panel *parent) : PropertyPage(parent, N unicodeText = g_pVGuiLocalize->Find("#GameUI_AspectWide16x10"); g_pVGuiLocalize->ConvertUnicodeToANSI(unicodeText, pszAspectName[2], 32); +#ifndef ANDROID int iNormalItemID = m_pAspectRatio->AddItem( pszAspectName[0], NULL ); int i16x9ItemID = m_pAspectRatio->AddItem( pszAspectName[1], NULL ); int i16x10ItemID = m_pAspectRatio->AddItem( pszAspectName[2], NULL ); @@ -1061,6 +1062,12 @@ COptionsSubVideo::COptionsSubVideo(vgui::Panel *parent) : PropertyPage(parent, N m_pAspectRatio->ActivateItem( i16x10ItemID ); break; } +#else + int iNormalItemID = m_pAspectRatio->AddItem( "lemonparty.org", NULL ); + m_pAspectRatio->ActivateItem( iNormalItemID ); + + m_pGammaButton->SetEnabled(false); +#endif char pszVRModeName[2][64]; unicodeText = g_pVGuiLocalize->Find("#GameUI_Disabled"); @@ -1110,6 +1117,10 @@ COptionsSubVideo::COptionsSubVideo(vgui::Panel *parent) : PropertyPage(parent, N m_pWindowed->AddItem( "#GameUI_Windowed", NULL ); #endif +#ifdef ANDROID + m_pWindowed->SetEnabled( false ); +#endif + LoadControlSettings("Resource\\OptionsSubVideo.res"); // Moved down here so we can set the Drop down's @@ -1160,9 +1171,10 @@ void COptionsSubVideo::PrepareResolutionList() // Clean up before filling the info again. m_pMode->DeleteAllItems(); +#ifndef ANDROID m_pAspectRatio->SetItemEnabled(1, false); m_pAspectRatio->SetItemEnabled(2, false); - +#endif // get full video mode list vmode_t *plist = NULL; int count = 0; @@ -1225,7 +1237,9 @@ void COptionsSubVideo::PrepareResolutionList() GetResolutionName( plist, sz, sizeof( sz ), desktopWidth, desktopHeight ); int itemID = -1; + int iAspectMode = GetScreenAspectMode( plist->width, plist->height ); +#ifndef ANDROID if ( iAspectMode > 0 ) { m_pAspectRatio->SetItemEnabled( iAspectMode, true ); @@ -1237,8 +1251,15 @@ void COptionsSubVideo::PrepareResolutionList() { itemID = m_pMode->AddItem( sz, NULL); } +#else + float aspect = (float)plist->width / plist->height; + float native_aspect = (float)desktopWidth / desktopHeight; - // try and find the best match for the resolution to be selected + if( fabs(native_aspect - aspect) < 0.01f ) + itemID = m_pMode->AddItem( sz, NULL); +#endif + + // try and find the bestplistplistplist match for the resolution to be selected if ( plist->width == currentWidth && plist->height == currentHeight ) { selectedItemID = itemID; @@ -1250,7 +1271,9 @@ void COptionsSubVideo::PrepareResolutionList() } // disable ratio selection if we can't display widescreen. +#ifndef ANDROID m_pAspectRatio->SetEnabled( bFoundWidescreen ); +#endif m_nSelectedMode = selectedItemID; @@ -1377,7 +1400,11 @@ void COptionsSubVideo::OnResetData() #endif // reset gamma control +#ifdef ANDROID + m_pGammaButton->SetEnabled( false ); +#else m_pGammaButton->SetEnabled( !config.Windowed() ); +#endif m_pHDContent->SetSelected( BUseHDContent() ); @@ -1577,8 +1604,12 @@ void COptionsSubVideo::PerformLayout() if ( m_pGammaButton ) { +#ifdef ANDROID + m_pGammaButton->SetEnabled( false ); +#else const MaterialSystem_Config_t &config = materials->GetCurrentConfigForVideoCard(); m_pGammaButton->SetEnabled( !config.Windowed() ); +#endif } } @@ -1600,10 +1631,12 @@ void COptionsSubVideo::OnTextChanged(Panel *pPanel, const char *pszText) OnDataChanged(); } } - else if (pPanel == m_pAspectRatio) - { +#ifndef ANDROID + else if (pPanel == m_pAspectRatio) + { PrepareResolutionList(); - } + } +#endif else if (pPanel == m_pWindowed) { PrepareResolutionList(); @@ -1645,7 +1678,11 @@ void COptionsSubVideo::EnableOrDisableWindowedForVR() } else { +#ifdef ANDROID + m_pWindowed->SetEnabled( false ); +#else m_pWindowed->SetEnabled( true ); +#endif } } diff --git a/inputsystem/inputsystem.h b/inputsystem/inputsystem.h index 0b113061..c369851e 100644 --- a/inputsystem/inputsystem.h +++ b/inputsystem/inputsystem.h @@ -333,10 +333,7 @@ public: void JoystickButtonRelease( int joystickId, int button ); // same as above. void JoystickAxisMotion( int joystickId, int axis, int value ); - void FingerDown( int fingerId, int x, int y ); - void FingerUp( int fingerId, int x, int y ); - void FingerMotion( int fingerId, int x, int y ); - + void FingerEvent( int eventType, int fingerId, float x, float y, float dx, float dy ); // Steam Controller void ReadSteamController( int iIndex ); diff --git a/inputsystem/touch_sdl.cpp b/inputsystem/touch_sdl.cpp index 086160c4..871e285b 100644 --- a/inputsystem/touch_sdl.cpp +++ b/inputsystem/touch_sdl.cpp @@ -24,19 +24,15 @@ int TouchSDLWatcher( void *userInfo, SDL_Event *event ) if( !window ) return 0; - int width, height; - width = height = 0; - SDL_GetWindowSize(window, &width, &height); - switch ( event->type ) { case SDL_FINGERDOWN: - pInputSystem->FingerDown( event->tfinger.fingerId, event->tfinger.x*width, event->tfinger.y*height ); + pInputSystem->FingerEvent( IE_FingerDown, event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, event->tfinger.dx, event->tfinger.dy ); break; case SDL_FINGERUP: - pInputSystem->FingerUp( event->tfinger.fingerId, event->tfinger.x*width, event->tfinger.y*height ); + pInputSystem->FingerEvent( IE_FingerUp, event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, event->tfinger.dx, event->tfinger.dy ); break; case SDL_FINGERMOTION: - pInputSystem->FingerMotion( event->tfinger.fingerId, event->tfinger.x*width, event->tfinger.y*height ); + pInputSystem->FingerEvent( IE_FingerMotion ,event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, event->tfinger.dx, event->tfinger.dy ); break; } @@ -67,32 +63,20 @@ void CInputSystem::ShutdownTouch() m_bTouchInitialized = false; } -void CInputSystem::FingerDown(int fingerId, int x, int y) +void CInputSystem::FingerEvent(int eventType, int fingerId, float x, float y, float dx, float dy) { - m_touchAccumEvent = IE_FingerDown; - m_touchAccumFingerId = fingerId; - m_touchAccumX = x; - m_touchAccumY = y; + // Shit, but should work with arm/x86 - PostEvent(IE_FingerDown, m_nLastSampleTick, fingerId, x, y); -} - -void CInputSystem::FingerUp(int fingerId, int x, int y) -{ - m_touchAccumEvent = IE_FingerUp; - m_touchAccumFingerId = fingerId; - m_touchAccumX = x; - m_touchAccumY = y; - - PostEvent(IE_FingerUp, m_nLastSampleTick, fingerId, x, y); -} - -void CInputSystem::FingerMotion(int fingerId, int x, int y) -{ - m_touchAccumEvent = IE_FingerMotion; - m_touchAccumFingerId = fingerId; - m_touchAccumX = x; - m_touchAccumY = y; - - PostEvent(IE_FingerMotion, m_nLastSampleTick, fingerId, x, y); + int data0 = fingerId << 16 | eventType; + int _x = (int)((double)x*0xFFFF); + int _y = (int)((double)y*0xFFFF); + int data1 = _x << 16 | (_y & 0xFFFF); + + union{int i;float f;} ifconv; + ifconv.f = dx; + int _dx = ifconv.i; + ifconv.f = dy; + int _dy = ifconv.i; + + PostEvent(data0, m_nLastSampleTick, data1, _dx, _dy); } diff --git a/lib/android/armeabi-v7a/libandroid_support.a b/lib/android/armeabi-v7a/libandroid_support.a index 30f91ca15ced7ae3bab060b6b0f1e426ef9b7e94..9f833a4d10b85f5cf4e48af06ed27335b59a8042 100644 GIT binary patch delta 68668 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 D+&EO# delta 407663 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 delta 237550 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

F=(pRV)2ds%%GVF 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 pCur; pCur=pCur->GetNextValue() ) { @@ -602,11 +616,12 @@ FSReturnCode_t FileSystem_LoadSearchPaths( CFSSearchPathsInit &initInfo ) // We need a special identifier in the gameinfo.txt here because the base hl2 folder exists in different places. // In the case of a game or a Steam-launched dedicated server, all the necessary prior engine content is mapped in with the Steam depots, // so we can just use the path as-is. + pLocation += strlen( BASESOURCEPATHS_TOKEN ); } + CUtlStringList vecFullLocationPaths; - char szAbsSearchPath[MAX_PATH]; V_MakeAbsolutePath( szAbsSearchPath, sizeof( szAbsSearchPath ), pLocation, pszBaseDir ); // Now resolve any ./'s. diff --git a/public/togles/linuxwin/dxabstract_types.h b/public/togles/linuxwin/dxabstract_types.h index 9713ec71..aa3013f3 100644 --- a/public/togles/linuxwin/dxabstract_types.h +++ b/public/togles/linuxwin/dxabstract_types.h @@ -993,6 +993,7 @@ typedef enum _D3DTEXTUREADDRESS typedef enum _D3DSHADEMODE { + D3DSHADE_NONE = 0, D3DSHADE_FLAT = 1, D3DSHADE_GOURAUD = 2, D3DSHADE_PHONG = 3, diff --git a/scripts/waifulib/compiler_optimizations.py b/scripts/waifulib/compiler_optimizations.py index 0d20057b..56c35c1e 100644 --- a/scripts/waifulib/compiler_optimizations.py +++ b/scripts/waifulib/compiler_optimizations.py @@ -48,8 +48,8 @@ CFLAGS = { 'common': { # disable thread-safe local static initialization for C++11 code, as it cause crashes on Windows XP 'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS', '/Zc:threadSafeInit-', '/MT'], - 'clang': ['-g', '-gdwarf-2', '-fvisibility=hidden'], - 'gcc': ['-g', '-fvisibility=hidden'], + 'clang': ['-g0', '-gdwarf-2', '-fvisibility=hidden'], + 'gcc': ['-g0', '-fvisibility=hidden'], 'owcc': ['-fno-short-enum', '-ffloat-store', '-g3'] }, 'fast': { diff --git a/scripts/waifulib/xcompile.py b/scripts/waifulib/xcompile.py index fc5ab628..df70352d 100644 --- a/scripts/waifulib/xcompile.py +++ b/scripts/waifulib/xcompile.py @@ -255,7 +255,7 @@ class Android: if self.is_arm(): if self.arch == 'armeabi-v7a': # ARMv7 support - cflags += ['-mthumb', '-mfpu=neon', '-mcpu=cortex-a9', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS', '-DVECTORIZE_SINCOS'] + cflags += ['-mthumb', '-mfpu=neon-vfpv4', '-mcpu=cortex-a7', '-mtune=cortex-a7', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS', '-DVECTORIZE_SINCOS'] if not self.is_clang() and not self.is_host(): cflags += [ '-mvectorize-with-neon-quad' ] diff --git a/togles/linuxwin/cglmtex.cpp b/togles/linuxwin/cglmtex.cpp index 67d73faf..da4c9a11 100644 --- a/togles/linuxwin/cglmtex.cpp +++ b/togles/linuxwin/cglmtex.cpp @@ -3361,11 +3361,11 @@ void convert_texture( GLint &internalformat, GLsizei width, GLsizei height, GLen if( format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA ) internalformat = format; -// if( internalformat == GL_SRGB8_ALPHA8 ) -// internalformat = GL_RGBA; + if( internalformat == GL_SRGB8_ALPHA8 ) + internalformat = GL_RGBA; -// if( internalformat == GL_SRGB8 ) -// internalformat = GL_RGB; + if( internalformat == GL_SRGB8 ) + internalformat = GL_RGB; if( data ) { @@ -3412,12 +3412,12 @@ void convert_texture( GLint &internalformat, GLsizei width, GLsizei height, GLen else if( internalformat == GL_SRGB8_ALPHA8 ) { // pixel_srgb_inplace( data, 4, width, height ); - internalformat = GL_RGBA; +// internalformat = GL_RGBA; } else if( internalformat == GL_SRGB8 ) { // pixel_srgb_inplace( data, 3, width, height ); - internalformat = GL_RGB; +// internalformat = GL_RGB; } } @@ -3659,15 +3659,17 @@ void CGLMTex::WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice, bool noDa GLenum glDataFormat = format->m_glDataFormat; // this could change if expansion kicks in GLenum glDataType = format->m_glDataType; - GLMTexLayoutSlice *slice = &m_layout->m_slices[ desc->m_sliceIndex ]; + GLMTexLayoutSlice *slice = &m_layout->m_slices[ desc->m_sliceIndex ]; void *sliceAddress = m_backing ? (m_backing + slice->m_storageOffset) : NULL; // this would change for PBO // allow use of subimage if the target is texture2D and it has already been teximage'd bool mayUseSubImage = false; +#ifdef ANDROID if ( (target==GL_TEXTURE_2D) && (m_sliceFlags[ desc->m_sliceIndex ] & kSliceValid) ) { -// mayUseSubImage = gl_enabletexsubimage.GetInt() != 0; + mayUseSubImage = gl_enabletexsubimage.GetInt() != 0; } +#endif // check flavor, 2D, 3D, or cube map // we also have the choice to use subimage if this is a tex already created. (open question as to benefit) diff --git a/vguimatsurface/Input.cpp b/vguimatsurface/Input.cpp index a30ff010..03df13d5 100644 --- a/vguimatsurface/Input.cpp +++ b/vguimatsurface/Input.cpp @@ -29,11 +29,13 @@ #ifdef _X360 #include "xbox/xbox_win32stubs.h" #endif +#include "MatSystemSurface.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" using namespace vgui; +extern CMatSystemSurface g_MatSystemSurface; //----------------------------------------------------------------------------- // Vgui input events @@ -374,7 +376,7 @@ static vgui::MouseCode ButtonCodeToMouseCode( ButtonCode_t buttonCode ) //----------------------------------------------------------------------------- bool InputHandleInputEvent( const InputEvent_t &event ) { - switch( event.m_nType ) + switch( event.m_nType & 0xFFFF ) { case IE_ButtonPressed: { @@ -425,25 +427,35 @@ bool InputHandleInputEvent( const InputEvent_t &event ) break; case IE_FingerDown: { - //g_pIInput->InternalCursorMoved( event.m_nData2, event.m_nData3 ); - g_pIInput->UpdateCursorPosInternal( event.m_nData2, event.m_nData3 ); + int w,h,x,y; g_MatSystemSurface.GetScreenSize(w, h); + uint data = (uint)event.m_nData; + x = w*((double)((data >> 16) & 0xFFFF) / 0xFFFF); + y = h*((double)(data & 0xFFFF) / 0xFFFF); + g_pIInput->UpdateCursorPosInternal( x, y ); g_pIInput->SetMouseCodeState( MOUSE_LEFT, vgui::BUTTON_PRESSED ); g_pIInput->InternalMousePressed( MOUSE_LEFT ); } return true; case IE_FingerUp: { - g_pIInput->UpdateCursorPosInternal( event.m_nData2, event.m_nData3 ); - g_pIInput->SetMouseCodeState( MOUSE_LEFT, vgui::BUTTON_RELEASED ); + int w,h,x,y; g_MatSystemSurface.GetScreenSize(w, h); + uint data = (uint)event.m_nData; + x = w*((double)((data >> 16) & 0xFFFF) / 0xFFFF); + y = h*((double)(data & 0xFFFF) / 0xFFFF); + g_pIInput->UpdateCursorPosInternal( x, y ); + g_pIInput->SetMouseCodeState( MOUSE_LEFT, vgui::BUTTON_RELEASED ); g_pIInput->InternalMouseReleased( MOUSE_LEFT ); } return true; case IE_FingerMotion: { - //g_pIInput->UpdateCursorPosInternal( event.m_nData2, event.m_nData3 ); - g_pIInput->InternalCursorMoved( event.m_nData2, event.m_nData3 ); + int w,h,x,y; g_MatSystemSurface.GetScreenSize(w, h); + uint data = (uint)event.m_nData; + x = w*((double)((data >> 16) & 0xFFFF) / 0xFFFF); + y = h*((double)(data & 0xFFFF) / 0xFFFF); + g_pIInput->InternalCursorMoved( x, y ); } - return true; + return true; case IE_ButtonDoubleClicked: { // NOTE: data2 is the virtual key code (data1 contains the scan-code one) diff --git a/wscript b/wscript index 16d67403..bbe4e113 100644 --- a/wscript +++ b/wscript @@ -284,11 +284,9 @@ def configure(conf): ] if conf.env.DEST_CPU == 'arm': - flags += ['-fsigned-char', '-mfpu=neon'] + flags += ['-fsigned-char'] - if conf.env.DEST_OS == 'android': - flags += ['-mcpu=cortex-a15', '-mtune=cortex-a15'] - else: + if conf.env.DEST_OS != 'android': flags += ['-march=native', '-mtune=native'] else: flags += ['-march=native','-mtune=native','-mfpmath=sse', '-msse', '-msse2']

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 z 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