diff --git a/.gitignore b/.gitignore index 8daea8f806..00fb6fe69b 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ /ipch /rpcs3/Debug /rpcs3/Release +/llvm_build /wxWidgets/lib /bin/rpcs3.ini diff --git a/.gitmodules b/.gitmodules index a45f065200..fb181e64b1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,7 @@ [submodule "asmjit"] path = asmjit url = https://github.com/kobalicekp/asmjit +[submodule "llvm"] + path = llvm + url = https://github.com/llvm-mirror/llvm.git + branch = release_35 diff --git a/.travis.yml b/.travis.yml index 90ddcfd4de..5b47d8dd7a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,12 @@ before_install: sudo ./cmake-3.0.0-Linux-i386.sh --skip-license --prefix=/usr; before_script: - - git submodule update --init asmjit ffmpeg + - git submodule update --init asmjit ffmpeg llvm + - cd llvm_build + - cmake -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm + - make -j 4 + - sudo make install + - cd .. - mkdir build - cd build - cmake .. diff --git a/GL/glext.h b/GL/glext.h index f0999b8acb..8d33527fac 100644 --- a/GL/glext.h +++ b/GL/glext.h @@ -1,20 +1,13 @@ #ifndef __glext_h_ -#define __glext_h_ +#define __glext_h_ 1 #ifdef __cplusplus extern "C" { #endif /* -** THIS FILE IS OBSOLETE. Please migrate away from using the -** ".spec" files and the headers generated from them to the -** XML Registry and headers generated from that. See -** http://www.opengl.org/registry/api/README.txt -** for more information. -** -** -** Copyright (c) 2007-2013 The Khronos Group Inc. -** +** Copyright (c) 2013-2014 The Khronos Group Inc. +** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including @@ -22,10 +15,10 @@ extern "C" { ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are 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 Materials. -** +** ** THE MATERIALS ARE 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. @@ -34,15 +27,19 @@ extern "C" { ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ - -/* Header file version number, required by OpenGL ABI for Linux */ -/* glext.h last updated $Date: 2013-06-13 02:52:31 -0700 (Thu, 13 Jun 2013) $ */ -/* Current version at http://www.opengl.org/registry/ */ -#define GL_GLEXT_VERSION 87 -/* Function declaration macros - to move into glplatform.h */ +/* +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.opengl.org/registry/ +** +** Khronos $Revision: 28798 $ on $Date: 2014-10-30 03:27:48 -0700 (Thu, 30 Oct 2014) $ +*/ #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN 1 +#endif #include #endif @@ -56,9 +53,20 @@ extern "C" { #define GLAPI extern #endif -/*************************************************************/ +#define GL_GLEXT_VERSION 20141030 + +/* Generated C header for: + * API: gl + * Profile: compatibility + * Versions considered: .* + * Versions emitted: 1\.[2-9]|[234]\.[0-9] + * Default extensions included: gl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ #ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 #define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 #define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 @@ -100,87 +108,20 @@ extern "C" { #define GL_SINGLE_COLOR 0x81F9 #define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_ALIASED_POINT_SIZE_RANGE 0x846D +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); #endif - -#ifndef GL_ARB_imaging -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 -#endif +#endif /* GL_VERSION_1_2 */ #ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 #define GL_TEXTURE2 0x84C2 @@ -277,9 +218,104 @@ extern "C" { #define GL_PREVIOUS 0x8578 #define GL_DOT3_RGB 0x86AE #define GL_DOT3_RGBA 0x86AF +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); #endif +#endif /* GL_VERSION_1_3 */ #ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 #define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_DST_ALPHA 0x80CA @@ -319,9 +355,118 @@ extern "C" { #define GL_TEXTURE_FILTER_CONTROL 0x8500 #define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); #endif +#endif /* GL_VERSION_1_4 */ #ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +#include +typedef ptrdiff_t GLsizeiptr; +typedef ptrdiff_t GLintptr; #define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_USAGE 0x8765 #define GL_QUERY_COUNTER_BITS 0x8864 @@ -372,9 +517,51 @@ extern "C" { #define GL_SRC2_RGB 0x8582 #define GL_SRC0_ALPHA 0x8588 #define GL_SRC2_ALPHA 0x858A +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); #endif +#endif /* GL_VERSION_1_5 */ #ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +typedef char GLchar; #define GL_BLEND_EQUATION_RGB 0x8009 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 @@ -459,9 +646,198 @@ extern "C" { #define GL_POINT_SPRITE 0x8861 #define GL_COORD_REPLACE 0x8862 #define GL_MAX_TEXTURE_COORDS 0x8871 +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); #endif +#endif /* GL_VERSION_2_0 */ #ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_UNPACK_BUFFER 0x88EC #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED @@ -485,9 +861,25 @@ extern "C" { #define GL_SLUMINANCE8 0x8C47 #define GL_COMPRESSED_SLUMINANCE 0x8C4A #define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); #endif +#endif /* GL_VERSION_2_1 */ #ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +typedef unsigned short GLhalf; #define GL_COMPARE_REF_TO_TEXTURE 0x884E #define GL_CLIP_DISTANCE0 0x3000 #define GL_CLIP_DISTANCE1 0x3001 @@ -588,1353 +980,9 @@ extern "C" { #define GL_BUFFER_ACCESS_FLAGS 0x911F #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BUFFER_MAP_OFFSET 0x9121 -/* Reuse tokens from ARB_depth_buffer_float */ -/* reuse GL_DEPTH_COMPONENT32F */ -/* reuse GL_DEPTH32F_STENCIL8 */ -/* reuse GL_FLOAT_32_UNSIGNED_INT_24_8_REV */ -/* Reuse tokens from ARB_framebuffer_object */ -/* reuse GL_INVALID_FRAMEBUFFER_OPERATION */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_DEFAULT */ -/* reuse GL_FRAMEBUFFER_UNDEFINED */ -/* reuse GL_DEPTH_STENCIL_ATTACHMENT */ -/* reuse GL_INDEX */ -/* reuse GL_MAX_RENDERBUFFER_SIZE */ -/* reuse GL_DEPTH_STENCIL */ -/* reuse GL_UNSIGNED_INT_24_8 */ -/* reuse GL_DEPTH24_STENCIL8 */ -/* reuse GL_TEXTURE_STENCIL_SIZE */ -/* reuse GL_TEXTURE_RED_TYPE */ -/* reuse GL_TEXTURE_GREEN_TYPE */ -/* reuse GL_TEXTURE_BLUE_TYPE */ -/* reuse GL_TEXTURE_ALPHA_TYPE */ -/* reuse GL_TEXTURE_DEPTH_TYPE */ -/* reuse GL_UNSIGNED_NORMALIZED */ -/* reuse GL_FRAMEBUFFER_BINDING */ -/* reuse GL_DRAW_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_BINDING */ -/* reuse GL_READ_FRAMEBUFFER */ -/* reuse GL_DRAW_FRAMEBUFFER */ -/* reuse GL_READ_FRAMEBUFFER_BINDING */ -/* reuse GL_RENDERBUFFER_SAMPLES */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* reuse GL_FRAMEBUFFER_COMPLETE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */ -/* reuse GL_FRAMEBUFFER_UNSUPPORTED */ -/* reuse GL_MAX_COLOR_ATTACHMENTS */ -/* reuse GL_COLOR_ATTACHMENT0 */ -/* reuse GL_COLOR_ATTACHMENT1 */ -/* reuse GL_COLOR_ATTACHMENT2 */ -/* reuse GL_COLOR_ATTACHMENT3 */ -/* reuse GL_COLOR_ATTACHMENT4 */ -/* reuse GL_COLOR_ATTACHMENT5 */ -/* reuse GL_COLOR_ATTACHMENT6 */ -/* reuse GL_COLOR_ATTACHMENT7 */ -/* reuse GL_COLOR_ATTACHMENT8 */ -/* reuse GL_COLOR_ATTACHMENT9 */ -/* reuse GL_COLOR_ATTACHMENT10 */ -/* reuse GL_COLOR_ATTACHMENT11 */ -/* reuse GL_COLOR_ATTACHMENT12 */ -/* reuse GL_COLOR_ATTACHMENT13 */ -/* reuse GL_COLOR_ATTACHMENT14 */ -/* reuse GL_COLOR_ATTACHMENT15 */ -/* reuse GL_DEPTH_ATTACHMENT */ -/* reuse GL_STENCIL_ATTACHMENT */ -/* reuse GL_FRAMEBUFFER */ -/* reuse GL_RENDERBUFFER */ -/* reuse GL_RENDERBUFFER_WIDTH */ -/* reuse GL_RENDERBUFFER_HEIGHT */ -/* reuse GL_RENDERBUFFER_INTERNAL_FORMAT */ -/* reuse GL_STENCIL_INDEX1 */ -/* reuse GL_STENCIL_INDEX4 */ -/* reuse GL_STENCIL_INDEX8 */ -/* reuse GL_STENCIL_INDEX16 */ -/* reuse GL_RENDERBUFFER_RED_SIZE */ -/* reuse GL_RENDERBUFFER_GREEN_SIZE */ -/* reuse GL_RENDERBUFFER_BLUE_SIZE */ -/* reuse GL_RENDERBUFFER_ALPHA_SIZE */ -/* reuse GL_RENDERBUFFER_DEPTH_SIZE */ -/* reuse GL_RENDERBUFFER_STENCIL_SIZE */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */ -/* reuse GL_MAX_SAMPLES */ -/* Reuse tokens from ARB_framebuffer_sRGB */ -/* reuse GL_FRAMEBUFFER_SRGB */ -/* Reuse tokens from ARB_half_float_vertex */ -/* reuse GL_HALF_FLOAT */ -/* Reuse tokens from ARB_map_buffer_range */ -/* reuse GL_MAP_READ_BIT */ -/* reuse GL_MAP_WRITE_BIT */ -/* reuse GL_MAP_INVALIDATE_RANGE_BIT */ -/* reuse GL_MAP_INVALIDATE_BUFFER_BIT */ -/* reuse GL_MAP_FLUSH_EXPLICIT_BIT */ -/* reuse GL_MAP_UNSYNCHRONIZED_BIT */ -/* Reuse tokens from ARB_texture_compression_rgtc */ -/* reuse GL_COMPRESSED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_SIGNED_RED_RGTC1 */ -/* reuse GL_COMPRESSED_RG_RGTC2 */ -/* reuse GL_COMPRESSED_SIGNED_RG_RGTC2 */ -/* Reuse tokens from ARB_texture_rg */ -/* reuse GL_RG */ -/* reuse GL_RG_INTEGER */ -/* reuse GL_R8 */ -/* reuse GL_R16 */ -/* reuse GL_RG8 */ -/* reuse GL_RG16 */ -/* reuse GL_R16F */ -/* reuse GL_R32F */ -/* reuse GL_RG16F */ -/* reuse GL_RG32F */ -/* reuse GL_R8I */ -/* reuse GL_R8UI */ -/* reuse GL_R16I */ -/* reuse GL_R16UI */ -/* reuse GL_R32I */ -/* reuse GL_R32UI */ -/* reuse GL_RG8I */ -/* reuse GL_RG8UI */ -/* reuse GL_RG16I */ -/* reuse GL_RG16UI */ -/* reuse GL_RG32I */ -/* reuse GL_RG32UI */ -/* Reuse tokens from ARB_vertex_array_object */ -/* reuse GL_VERTEX_ARRAY_BINDING */ -#define GL_CLAMP_VERTEX_COLOR 0x891A -#define GL_CLAMP_FRAGMENT_COLOR 0x891B -#define GL_ALPHA_INTEGER 0x8D97 -/* Reuse tokens from ARB_framebuffer_object */ -/* reuse GL_TEXTURE_LUMINANCE_TYPE */ -/* reuse GL_TEXTURE_INTENSITY_TYPE */ -#endif - -#ifndef GL_VERSION_3_1 -#define GL_SAMPLER_2D_RECT 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 -#define GL_SAMPLER_BUFFER 0x8DC2 -#define GL_INT_SAMPLER_2D_RECT 0x8DCD -#define GL_INT_SAMPLER_BUFFER 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 -#define GL_TEXTURE_BUFFER 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D -#define GL_TEXTURE_RECTANGLE 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 -#define GL_RED_SNORM 0x8F90 -#define GL_RG_SNORM 0x8F91 -#define GL_RGB_SNORM 0x8F92 -#define GL_RGBA_SNORM 0x8F93 -#define GL_R8_SNORM 0x8F94 -#define GL_RG8_SNORM 0x8F95 -#define GL_RGB8_SNORM 0x8F96 -#define GL_RGBA8_SNORM 0x8F97 -#define GL_R16_SNORM 0x8F98 -#define GL_RG16_SNORM 0x8F99 -#define GL_RGB16_SNORM 0x8F9A -#define GL_RGBA16_SNORM 0x8F9B -#define GL_SIGNED_NORMALIZED 0x8F9C -#define GL_PRIMITIVE_RESTART 0x8F9D -#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E -/* Reuse tokens from ARB_copy_buffer */ -/* reuse GL_COPY_READ_BUFFER */ -/* reuse GL_COPY_WRITE_BUFFER */ -/* Reuse tokens from ARB_draw_instanced (none) */ -/* Reuse tokens from ARB_uniform_buffer_object */ -/* reuse GL_UNIFORM_BUFFER */ -/* reuse GL_UNIFORM_BUFFER_BINDING */ -/* reuse GL_UNIFORM_BUFFER_START */ -/* reuse GL_UNIFORM_BUFFER_SIZE */ -/* reuse GL_MAX_VERTEX_UNIFORM_BLOCKS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_BLOCKS */ -/* reuse GL_MAX_COMBINED_UNIFORM_BLOCKS */ -/* reuse GL_MAX_UNIFORM_BUFFER_BINDINGS */ -/* reuse GL_MAX_UNIFORM_BLOCK_SIZE */ -/* reuse GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT */ -/* reuse GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */ -/* reuse GL_ACTIVE_UNIFORM_BLOCKS */ -/* reuse GL_UNIFORM_TYPE */ -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_INDEX */ -/* reuse GL_UNIFORM_OFFSET */ -/* reuse GL_UNIFORM_ARRAY_STRIDE */ -/* reuse GL_UNIFORM_MATRIX_STRIDE */ -/* reuse GL_UNIFORM_IS_ROW_MAJOR */ -/* reuse GL_UNIFORM_BLOCK_BINDING */ -/* reuse GL_UNIFORM_BLOCK_DATA_SIZE */ -/* reuse GL_UNIFORM_BLOCK_NAME_LENGTH */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS */ -/* reuse GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_INVALID_INDEX */ -#endif - -#ifndef GL_VERSION_3_2 -#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 -#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 -#define GL_LINES_ADJACENCY 0x000A -#define GL_LINE_STRIP_ADJACENCY 0x000B -#define GL_TRIANGLES_ADJACENCY 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D -#define GL_PROGRAM_POINT_SIZE 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 -#define GL_GEOMETRY_SHADER 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT 0x8916 -#define GL_GEOMETRY_INPUT_TYPE 0x8917 -#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 -#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_CONTEXT_PROFILE_MASK 0x9126 -/* reuse GL_MAX_VARYING_COMPONENTS */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -/* Reuse tokens from ARB_depth_clamp */ -/* reuse GL_DEPTH_CLAMP */ -/* Reuse tokens from ARB_draw_elements_base_vertex (none) */ -/* Reuse tokens from ARB_fragment_coord_conventions (none) */ -/* Reuse tokens from ARB_provoking_vertex */ -/* reuse GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */ -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ -/* Reuse tokens from ARB_seamless_cube_map */ -/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */ -/* Reuse tokens from ARB_sync */ -/* reuse GL_MAX_SERVER_WAIT_TIMEOUT */ -/* reuse GL_OBJECT_TYPE */ -/* reuse GL_SYNC_CONDITION */ -/* reuse GL_SYNC_STATUS */ -/* reuse GL_SYNC_FLAGS */ -/* reuse GL_SYNC_FENCE */ -/* reuse GL_SYNC_GPU_COMMANDS_COMPLETE */ -/* reuse GL_UNSIGNALED */ -/* reuse GL_SIGNALED */ -/* reuse GL_ALREADY_SIGNALED */ -/* reuse GL_TIMEOUT_EXPIRED */ -/* reuse GL_CONDITION_SATISFIED */ -/* reuse GL_WAIT_FAILED */ -/* reuse GL_TIMEOUT_IGNORED */ -/* reuse GL_SYNC_FLUSH_COMMANDS_BIT */ -/* reuse GL_TIMEOUT_IGNORED */ -/* Reuse tokens from ARB_texture_multisample */ -/* reuse GL_SAMPLE_POSITION */ -/* reuse GL_SAMPLE_MASK */ -/* reuse GL_SAMPLE_MASK_VALUE */ -/* reuse GL_MAX_SAMPLE_MASK_WORDS */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_SAMPLES */ -/* reuse GL_TEXTURE_FIXED_SAMPLE_LOCATIONS */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE */ -/* reuse GL_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_MAX_COLOR_TEXTURE_SAMPLES */ -/* reuse GL_MAX_DEPTH_TEXTURE_SAMPLES */ -/* reuse GL_MAX_INTEGER_SAMPLES */ -/* Don't need to reuse tokens from ARB_vertex_array_bgra since they're already in 1.2 core */ -#endif - -#ifndef GL_VERSION_3_3 -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -/* Reuse tokens from ARB_blend_func_extended */ -/* reuse GL_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_COLOR */ -/* reuse GL_ONE_MINUS_SRC1_ALPHA */ -/* reuse GL_MAX_DUAL_SOURCE_DRAW_BUFFERS */ -/* Reuse tokens from ARB_explicit_attrib_location (none) */ -/* Reuse tokens from ARB_occlusion_query2 */ -/* reuse GL_ANY_SAMPLES_PASSED */ -/* Reuse tokens from ARB_sampler_objects */ -/* reuse GL_SAMPLER_BINDING */ -/* Reuse tokens from ARB_shader_bit_encoding (none) */ -/* Reuse tokens from ARB_texture_rgb10_a2ui */ -/* reuse GL_RGB10_A2UI */ -/* Reuse tokens from ARB_texture_swizzle */ -/* reuse GL_TEXTURE_SWIZZLE_R */ -/* reuse GL_TEXTURE_SWIZZLE_G */ -/* reuse GL_TEXTURE_SWIZZLE_B */ -/* reuse GL_TEXTURE_SWIZZLE_A */ -/* reuse GL_TEXTURE_SWIZZLE_RGBA */ -/* Reuse tokens from ARB_timer_query */ -/* reuse GL_TIME_ELAPSED */ -/* reuse GL_TIMESTAMP */ -/* Reuse tokens from ARB_vertex_type_2_10_10_10_rev */ -/* reuse GL_INT_2_10_10_10_REV */ -#endif - -#ifndef GL_VERSION_4_0 -#define GL_SAMPLE_SHADING 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F -#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F -/* Reuse tokens from ARB_texture_query_lod (none) */ -/* Reuse tokens from ARB_draw_buffers_blend (none) */ -/* Reuse tokens from ARB_draw_indirect */ -/* reuse GL_DRAW_INDIRECT_BUFFER */ -/* reuse GL_DRAW_INDIRECT_BUFFER_BINDING */ -/* Reuse tokens from ARB_gpu_shader5 */ -/* reuse GL_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MAX_GEOMETRY_SHADER_INVOCATIONS */ -/* reuse GL_MIN_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_MAX_FRAGMENT_INTERPOLATION_OFFSET */ -/* reuse GL_FRAGMENT_INTERPOLATION_OFFSET_BITS */ -/* Reuse tokens from ARB_gpu_shader_fp64 */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -/* Reuse tokens from ARB_shader_subroutine */ -/* reuse GL_ACTIVE_SUBROUTINES */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORMS */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_ACTIVE_SUBROUTINE_MAX_LENGTH */ -/* reuse GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH */ -/* reuse GL_MAX_SUBROUTINES */ -/* reuse GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS */ -/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_COMPATIBLE_SUBROUTINES */ -/* Reuse tokens from ARB_tessellation_shader */ -/* reuse GL_PATCHES */ -/* reuse GL_PATCH_VERTICES */ -/* reuse GL_PATCH_DEFAULT_INNER_LEVEL */ -/* reuse GL_PATCH_DEFAULT_OUTER_LEVEL */ -/* reuse GL_TESS_CONTROL_OUTPUT_VERTICES */ -/* reuse GL_TESS_GEN_MODE */ -/* reuse GL_TESS_GEN_SPACING */ -/* reuse GL_TESS_GEN_VERTEX_ORDER */ -/* reuse GL_TESS_GEN_POINT_MODE */ -/* reuse GL_ISOLINES */ -/* reuse GL_FRACTIONAL_ODD */ -/* reuse GL_FRACTIONAL_EVEN */ -/* reuse GL_MAX_PATCH_VERTICES */ -/* reuse GL_MAX_TESS_GEN_LEVEL */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_PATCH_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS */ -/* reuse GL_MAX_TESS_CONTROL_INPUT_COMPONENTS */ -/* reuse GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_EVALUATION_SHADER */ -/* reuse GL_TESS_CONTROL_SHADER */ -/* Reuse tokens from ARB_texture_buffer_object_rgb32 (none) */ -/* Reuse tokens from ARB_transform_feedback2 */ -/* reuse GL_TRANSFORM_FEEDBACK */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */ -/* reuse GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */ -/* reuse GL_TRANSFORM_FEEDBACK_BINDING */ -/* Reuse tokens from ARB_transform_feedback3 */ -/* reuse GL_MAX_TRANSFORM_FEEDBACK_BUFFERS */ -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif - -#ifndef GL_VERSION_4_1 -/* Reuse tokens from ARB_ES2_compatibility */ -/* reuse GL_FIXED */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_TYPE */ -/* reuse GL_IMPLEMENTATION_COLOR_READ_FORMAT */ -/* reuse GL_LOW_FLOAT */ -/* reuse GL_MEDIUM_FLOAT */ -/* reuse GL_HIGH_FLOAT */ -/* reuse GL_LOW_INT */ -/* reuse GL_MEDIUM_INT */ -/* reuse GL_HIGH_INT */ -/* reuse GL_SHADER_COMPILER */ -/* reuse GL_SHADER_BINARY_FORMATS */ -/* reuse GL_NUM_SHADER_BINARY_FORMATS */ -/* reuse GL_MAX_VERTEX_UNIFORM_VECTORS */ -/* reuse GL_MAX_VARYING_VECTORS */ -/* reuse GL_MAX_FRAGMENT_UNIFORM_VECTORS */ -/* reuse GL_RGB565 */ -/* Reuse tokens from ARB_get_program_binary */ -/* reuse GL_PROGRAM_BINARY_RETRIEVABLE_HINT */ -/* reuse GL_PROGRAM_BINARY_LENGTH */ -/* reuse GL_NUM_PROGRAM_BINARY_FORMATS */ -/* reuse GL_PROGRAM_BINARY_FORMATS */ -/* Reuse tokens from ARB_separate_shader_objects */ -/* reuse GL_VERTEX_SHADER_BIT */ -/* reuse GL_FRAGMENT_SHADER_BIT */ -/* reuse GL_GEOMETRY_SHADER_BIT */ -/* reuse GL_TESS_CONTROL_SHADER_BIT */ -/* reuse GL_TESS_EVALUATION_SHADER_BIT */ -/* reuse GL_ALL_SHADER_BITS */ -/* reuse GL_PROGRAM_SEPARABLE */ -/* reuse GL_ACTIVE_PROGRAM */ -/* reuse GL_PROGRAM_PIPELINE_BINDING */ -/* Reuse tokens from ARB_shader_precision (none) */ -/* Reuse tokens from ARB_vertex_attrib_64bit - all are in GL 3.0 and 4.0 already */ -/* Reuse tokens from ARB_viewport_array - some are in GL 1.1 and ARB_provoking_vertex already */ -/* reuse GL_MAX_VIEWPORTS */ -/* reuse GL_VIEWPORT_SUBPIXEL_BITS */ -/* reuse GL_VIEWPORT_BOUNDS_RANGE */ -/* reuse GL_LAYER_PROVOKING_VERTEX */ -/* reuse GL_VIEWPORT_INDEX_PROVOKING_VERTEX */ -/* reuse GL_UNDEFINED_VERTEX */ -#endif - -#ifndef GL_VERSION_4_2 -/* Reuse tokens from ARB_base_instance (none) */ -/* Reuse tokens from ARB_shading_language_420pack (none) */ -/* Reuse tokens from ARB_transform_feedback_instanced (none) */ -/* Reuse tokens from ARB_compressed_texture_pixel_storage */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_WIDTH */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_HEIGHT */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_DEPTH */ -/* reuse GL_UNPACK_COMPRESSED_BLOCK_SIZE */ -/* reuse GL_PACK_COMPRESSED_BLOCK_WIDTH */ -/* reuse GL_PACK_COMPRESSED_BLOCK_HEIGHT */ -/* reuse GL_PACK_COMPRESSED_BLOCK_DEPTH */ -/* reuse GL_PACK_COMPRESSED_BLOCK_SIZE */ -/* Reuse tokens from ARB_conservative_depth (none) */ -/* Reuse tokens from ARB_internalformat_query */ -/* reuse GL_NUM_SAMPLE_COUNTS */ -/* Reuse tokens from ARB_map_buffer_alignment */ -/* reuse GL_MIN_MAP_BUFFER_ALIGNMENT */ -/* Reuse tokens from ARB_shader_atomic_counters */ -/* reuse GL_ATOMIC_COUNTER_BUFFER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_BINDING */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_START */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_SIZE */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_VERTEX_ATOMIC_COUNTERS */ -/* reuse GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS */ -/* reuse GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS */ -/* reuse GL_MAX_GEOMETRY_ATOMIC_COUNTERS */ -/* reuse GL_MAX_FRAGMENT_ATOMIC_COUNTERS */ -/* reuse GL_MAX_COMBINED_ATOMIC_COUNTERS */ -/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE */ -/* reuse GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS */ -/* reuse GL_ACTIVE_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX */ -/* reuse GL_UNSIGNED_INT_ATOMIC_COUNTER */ -/* Reuse tokens from ARB_shader_image_load_store */ -/* reuse GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT */ -/* reuse GL_ELEMENT_ARRAY_BARRIER_BIT */ -/* reuse GL_UNIFORM_BARRIER_BIT */ -/* reuse GL_TEXTURE_FETCH_BARRIER_BIT */ -/* reuse GL_SHADER_IMAGE_ACCESS_BARRIER_BIT */ -/* reuse GL_COMMAND_BARRIER_BIT */ -/* reuse GL_PIXEL_BUFFER_BARRIER_BIT */ -/* reuse GL_TEXTURE_UPDATE_BARRIER_BIT */ -/* reuse GL_BUFFER_UPDATE_BARRIER_BIT */ -/* reuse GL_FRAMEBUFFER_BARRIER_BIT */ -/* reuse GL_TRANSFORM_FEEDBACK_BARRIER_BIT */ -/* reuse GL_ATOMIC_COUNTER_BARRIER_BIT */ -/* reuse GL_ALL_BARRIER_BITS */ -/* reuse GL_MAX_IMAGE_UNITS */ -/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */ -/* reuse GL_IMAGE_BINDING_NAME */ -/* reuse GL_IMAGE_BINDING_LEVEL */ -/* reuse GL_IMAGE_BINDING_LAYERED */ -/* reuse GL_IMAGE_BINDING_LAYER */ -/* reuse GL_IMAGE_BINDING_ACCESS */ -/* reuse GL_IMAGE_1D */ -/* reuse GL_IMAGE_2D */ -/* reuse GL_IMAGE_3D */ -/* reuse GL_IMAGE_2D_RECT */ -/* reuse GL_IMAGE_CUBE */ -/* reuse GL_IMAGE_BUFFER */ -/* reuse GL_IMAGE_1D_ARRAY */ -/* reuse GL_IMAGE_2D_ARRAY */ -/* reuse GL_IMAGE_CUBE_MAP_ARRAY */ -/* reuse GL_IMAGE_2D_MULTISAMPLE */ -/* reuse GL_IMAGE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_INT_IMAGE_1D */ -/* reuse GL_INT_IMAGE_2D */ -/* reuse GL_INT_IMAGE_3D */ -/* reuse GL_INT_IMAGE_2D_RECT */ -/* reuse GL_INT_IMAGE_CUBE */ -/* reuse GL_INT_IMAGE_BUFFER */ -/* reuse GL_INT_IMAGE_1D_ARRAY */ -/* reuse GL_INT_IMAGE_2D_ARRAY */ -/* reuse GL_INT_IMAGE_CUBE_MAP_ARRAY */ -/* reuse GL_INT_IMAGE_2D_MULTISAMPLE */ -/* reuse GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_1D */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D */ -/* reuse GL_UNSIGNED_INT_IMAGE_3D */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_RECT */ -/* reuse GL_UNSIGNED_INT_IMAGE_CUBE */ -/* reuse GL_UNSIGNED_INT_IMAGE_BUFFER */ -/* reuse GL_UNSIGNED_INT_IMAGE_1D_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE */ -/* reuse GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_MAX_IMAGE_SAMPLES */ -/* reuse GL_IMAGE_BINDING_FORMAT */ -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */ -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE */ -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS */ -/* reuse GL_MAX_VERTEX_IMAGE_UNIFORMS */ -/* reuse GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS */ -/* reuse GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS */ -/* reuse GL_MAX_GEOMETRY_IMAGE_UNIFORMS */ -/* reuse GL_MAX_FRAGMENT_IMAGE_UNIFORMS */ -/* reuse GL_MAX_COMBINED_IMAGE_UNIFORMS */ -/* Reuse tokens from ARB_shading_language_packing (none) */ -/* Reuse tokens from ARB_texture_storage */ -/* reuse GL_TEXTURE_IMMUTABLE_FORMAT */ -#endif - -#ifndef GL_VERSION_4_3 -#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 -#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E -/* Reuse tokens from ARB_arrays_of_arrays (none, GLSL only) */ -/* Reuse tokens from ARB_fragment_layer_viewport (none, GLSL only) */ -/* Reuse tokens from ARB_shader_image_size (none, GLSL only) */ -/* Reuse tokens from ARB_ES3_compatibility */ -/* reuse GL_COMPRESSED_RGB8_ETC2 */ -/* reuse GL_COMPRESSED_SRGB8_ETC2 */ -/* reuse GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 */ -/* reuse GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 */ -/* reuse GL_COMPRESSED_RGBA8_ETC2_EAC */ -/* reuse GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC */ -/* reuse GL_COMPRESSED_R11_EAC */ -/* reuse GL_COMPRESSED_SIGNED_R11_EAC */ -/* reuse GL_COMPRESSED_RG11_EAC */ -/* reuse GL_COMPRESSED_SIGNED_RG11_EAC */ -/* reuse GL_PRIMITIVE_RESTART_FIXED_INDEX */ -/* reuse GL_ANY_SAMPLES_PASSED_CONSERVATIVE */ -/* reuse GL_MAX_ELEMENT_INDEX */ -/* Reuse tokens from ARB_clear_buffer_object (none) */ -/* Reuse tokens from ARB_compute_shader */ -/* reuse GL_COMPUTE_SHADER */ -/* reuse GL_MAX_COMPUTE_UNIFORM_BLOCKS */ -/* reuse GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS */ -/* reuse GL_MAX_COMPUTE_IMAGE_UNIFORMS */ -/* reuse GL_MAX_COMPUTE_SHARED_MEMORY_SIZE */ -/* reuse GL_MAX_COMPUTE_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS */ -/* reuse GL_MAX_COMPUTE_ATOMIC_COUNTERS */ -/* reuse GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS */ -/* reuse GL_MAX_COMPUTE_LOCAL_INVOCATIONS */ -/* reuse GL_MAX_COMPUTE_WORK_GROUP_COUNT */ -/* reuse GL_MAX_COMPUTE_WORK_GROUP_SIZE */ -/* reuse GL_COMPUTE_LOCAL_WORK_SIZE */ -/* reuse GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER */ -/* reuse GL_DISPATCH_INDIRECT_BUFFER */ -/* reuse GL_DISPATCH_INDIRECT_BUFFER_BINDING */ -/* Reuse tokens from ARB_copy_image (none) */ -/* Reuse tokens from KHR_debug */ -/* reuse GL_DEBUG_OUTPUT_SYNCHRONOUS */ -/* reuse GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH */ -/* reuse GL_DEBUG_CALLBACK_FUNCTION */ -/* reuse GL_DEBUG_CALLBACK_USER_PARAM */ -/* reuse GL_DEBUG_SOURCE_API */ -/* reuse GL_DEBUG_SOURCE_WINDOW_SYSTEM */ -/* reuse GL_DEBUG_SOURCE_SHADER_COMPILER */ -/* reuse GL_DEBUG_SOURCE_THIRD_PARTY */ -/* reuse GL_DEBUG_SOURCE_APPLICATION */ -/* reuse GL_DEBUG_SOURCE_OTHER */ -/* reuse GL_DEBUG_TYPE_ERROR */ -/* reuse GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR */ -/* reuse GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR */ -/* reuse GL_DEBUG_TYPE_PORTABILITY */ -/* reuse GL_DEBUG_TYPE_PERFORMANCE */ -/* reuse GL_DEBUG_TYPE_OTHER */ -/* reuse GL_MAX_DEBUG_MESSAGE_LENGTH */ -/* reuse GL_MAX_DEBUG_LOGGED_MESSAGES */ -/* reuse GL_DEBUG_LOGGED_MESSAGES */ -/* reuse GL_DEBUG_SEVERITY_HIGH */ -/* reuse GL_DEBUG_SEVERITY_MEDIUM */ -/* reuse GL_DEBUG_SEVERITY_LOW */ -/* reuse GL_DEBUG_TYPE_MARKER */ -/* reuse GL_DEBUG_TYPE_PUSH_GROUP */ -/* reuse GL_DEBUG_TYPE_POP_GROUP */ -/* reuse GL_DEBUG_SEVERITY_NOTIFICATION */ -/* reuse GL_MAX_DEBUG_GROUP_STACK_DEPTH */ -/* reuse GL_DEBUG_GROUP_STACK_DEPTH */ -/* reuse GL_BUFFER */ -/* reuse GL_SHADER */ -/* reuse GL_PROGRAM */ -/* reuse GL_QUERY */ -/* reuse GL_PROGRAM_PIPELINE */ -/* reuse GL_SAMPLER */ -/* reuse GL_DISPLAY_LIST */ -/* reuse GL_MAX_LABEL_LENGTH */ -/* reuse GL_DEBUG_OUTPUT */ -/* reuse GL_CONTEXT_FLAG_DEBUG_BIT */ -/* reuse GL_STACK_UNDERFLOW */ -/* reuse GL_STACK_OVERFLOW */ -/* Reuse tokens from ARB_explicit_uniform_location */ -/* reuse GL_MAX_UNIFORM_LOCATIONS */ -/* Reuse tokens from ARB_framebuffer_no_attachments */ -/* reuse GL_FRAMEBUFFER_DEFAULT_WIDTH */ -/* reuse GL_FRAMEBUFFER_DEFAULT_HEIGHT */ -/* reuse GL_FRAMEBUFFER_DEFAULT_LAYERS */ -/* reuse GL_FRAMEBUFFER_DEFAULT_SAMPLES */ -/* reuse GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS */ -/* reuse GL_MAX_FRAMEBUFFER_WIDTH */ -/* reuse GL_MAX_FRAMEBUFFER_HEIGHT */ -/* reuse GL_MAX_FRAMEBUFFER_LAYERS */ -/* reuse GL_MAX_FRAMEBUFFER_SAMPLES */ -/* Reuse tokens from ARB_internalformat_query2 */ -/* reuse GL_INTERNALFORMAT_SUPPORTED */ -/* reuse GL_INTERNALFORMAT_PREFERRED */ -/* reuse GL_INTERNALFORMAT_RED_SIZE */ -/* reuse GL_INTERNALFORMAT_GREEN_SIZE */ -/* reuse GL_INTERNALFORMAT_BLUE_SIZE */ -/* reuse GL_INTERNALFORMAT_ALPHA_SIZE */ -/* reuse GL_INTERNALFORMAT_DEPTH_SIZE */ -/* reuse GL_INTERNALFORMAT_STENCIL_SIZE */ -/* reuse GL_INTERNALFORMAT_SHARED_SIZE */ -/* reuse GL_INTERNALFORMAT_RED_TYPE */ -/* reuse GL_INTERNALFORMAT_GREEN_TYPE */ -/* reuse GL_INTERNALFORMAT_BLUE_TYPE */ -/* reuse GL_INTERNALFORMAT_ALPHA_TYPE */ -/* reuse GL_INTERNALFORMAT_DEPTH_TYPE */ -/* reuse GL_INTERNALFORMAT_STENCIL_TYPE */ -/* reuse GL_MAX_WIDTH */ -/* reuse GL_MAX_HEIGHT */ -/* reuse GL_MAX_DEPTH */ -/* reuse GL_MAX_LAYERS */ -/* reuse GL_MAX_COMBINED_DIMENSIONS */ -/* reuse GL_COLOR_COMPONENTS */ -/* reuse GL_DEPTH_COMPONENTS */ -/* reuse GL_STENCIL_COMPONENTS */ -/* reuse GL_COLOR_RENDERABLE */ -/* reuse GL_DEPTH_RENDERABLE */ -/* reuse GL_STENCIL_RENDERABLE */ -/* reuse GL_FRAMEBUFFER_RENDERABLE */ -/* reuse GL_FRAMEBUFFER_RENDERABLE_LAYERED */ -/* reuse GL_FRAMEBUFFER_BLEND */ -/* reuse GL_READ_PIXELS */ -/* reuse GL_READ_PIXELS_FORMAT */ -/* reuse GL_READ_PIXELS_TYPE */ -/* reuse GL_TEXTURE_IMAGE_FORMAT */ -/* reuse GL_TEXTURE_IMAGE_TYPE */ -/* reuse GL_GET_TEXTURE_IMAGE_FORMAT */ -/* reuse GL_GET_TEXTURE_IMAGE_TYPE */ -/* reuse GL_MIPMAP */ -/* reuse GL_MANUAL_GENERATE_MIPMAP */ -/* reuse GL_AUTO_GENERATE_MIPMAP */ -/* reuse GL_COLOR_ENCODING */ -/* reuse GL_SRGB_READ */ -/* reuse GL_SRGB_WRITE */ -/* reuse GL_FILTER */ -/* reuse GL_VERTEX_TEXTURE */ -/* reuse GL_TESS_CONTROL_TEXTURE */ -/* reuse GL_TESS_EVALUATION_TEXTURE */ -/* reuse GL_GEOMETRY_TEXTURE */ -/* reuse GL_FRAGMENT_TEXTURE */ -/* reuse GL_COMPUTE_TEXTURE */ -/* reuse GL_TEXTURE_SHADOW */ -/* reuse GL_TEXTURE_GATHER */ -/* reuse GL_TEXTURE_GATHER_SHADOW */ -/* reuse GL_SHADER_IMAGE_LOAD */ -/* reuse GL_SHADER_IMAGE_STORE */ -/* reuse GL_SHADER_IMAGE_ATOMIC */ -/* reuse GL_IMAGE_TEXEL_SIZE */ -/* reuse GL_IMAGE_COMPATIBILITY_CLASS */ -/* reuse GL_IMAGE_PIXEL_FORMAT */ -/* reuse GL_IMAGE_PIXEL_TYPE */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE */ -/* reuse GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE */ -/* reuse GL_TEXTURE_COMPRESSED_BLOCK_WIDTH */ -/* reuse GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT */ -/* reuse GL_TEXTURE_COMPRESSED_BLOCK_SIZE */ -/* reuse GL_CLEAR_BUFFER */ -/* reuse GL_TEXTURE_VIEW */ -/* reuse GL_VIEW_COMPATIBILITY_CLASS */ -/* reuse GL_FULL_SUPPORT */ -/* reuse GL_CAVEAT_SUPPORT */ -/* reuse GL_IMAGE_CLASS_4_X_32 */ -/* reuse GL_IMAGE_CLASS_2_X_32 */ -/* reuse GL_IMAGE_CLASS_1_X_32 */ -/* reuse GL_IMAGE_CLASS_4_X_16 */ -/* reuse GL_IMAGE_CLASS_2_X_16 */ -/* reuse GL_IMAGE_CLASS_1_X_16 */ -/* reuse GL_IMAGE_CLASS_4_X_8 */ -/* reuse GL_IMAGE_CLASS_2_X_8 */ -/* reuse GL_IMAGE_CLASS_1_X_8 */ -/* reuse GL_IMAGE_CLASS_11_11_10 */ -/* reuse GL_IMAGE_CLASS_10_10_10_2 */ -/* reuse GL_VIEW_CLASS_128_BITS */ -/* reuse GL_VIEW_CLASS_96_BITS */ -/* reuse GL_VIEW_CLASS_64_BITS */ -/* reuse GL_VIEW_CLASS_48_BITS */ -/* reuse GL_VIEW_CLASS_32_BITS */ -/* reuse GL_VIEW_CLASS_24_BITS */ -/* reuse GL_VIEW_CLASS_16_BITS */ -/* reuse GL_VIEW_CLASS_8_BITS */ -/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGB */ -/* reuse GL_VIEW_CLASS_S3TC_DXT1_RGBA */ -/* reuse GL_VIEW_CLASS_S3TC_DXT3_RGBA */ -/* reuse GL_VIEW_CLASS_S3TC_DXT5_RGBA */ -/* reuse GL_VIEW_CLASS_RGTC1_RED */ -/* reuse GL_VIEW_CLASS_RGTC2_RG */ -/* reuse GL_VIEW_CLASS_BPTC_UNORM */ -/* reuse GL_VIEW_CLASS_BPTC_FLOAT */ -/* Reuse tokens from ARB_invalidate_subdata (none) */ -/* Reuse tokens from ARB_multi_draw_indirect (none) */ -/* Reuse tokens from ARB_program_interface_query */ -/* reuse GL_UNIFORM */ -/* reuse GL_UNIFORM_BLOCK */ -/* reuse GL_PROGRAM_INPUT */ -/* reuse GL_PROGRAM_OUTPUT */ -/* reuse GL_BUFFER_VARIABLE */ -/* reuse GL_SHADER_STORAGE_BLOCK */ -/* reuse GL_VERTEX_SUBROUTINE */ -/* reuse GL_TESS_CONTROL_SUBROUTINE */ -/* reuse GL_TESS_EVALUATION_SUBROUTINE */ -/* reuse GL_GEOMETRY_SUBROUTINE */ -/* reuse GL_FRAGMENT_SUBROUTINE */ -/* reuse GL_COMPUTE_SUBROUTINE */ -/* reuse GL_VERTEX_SUBROUTINE_UNIFORM */ -/* reuse GL_TESS_CONTROL_SUBROUTINE_UNIFORM */ -/* reuse GL_TESS_EVALUATION_SUBROUTINE_UNIFORM */ -/* reuse GL_GEOMETRY_SUBROUTINE_UNIFORM */ -/* reuse GL_FRAGMENT_SUBROUTINE_UNIFORM */ -/* reuse GL_COMPUTE_SUBROUTINE_UNIFORM */ -/* reuse GL_TRANSFORM_FEEDBACK_VARYING */ -/* reuse GL_ACTIVE_RESOURCES */ -/* reuse GL_MAX_NAME_LENGTH */ -/* reuse GL_MAX_NUM_ACTIVE_VARIABLES */ -/* reuse GL_MAX_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_NAME_LENGTH */ -/* reuse GL_TYPE */ -/* reuse GL_ARRAY_SIZE */ -/* reuse GL_OFFSET */ -/* reuse GL_BLOCK_INDEX */ -/* reuse GL_ARRAY_STRIDE */ -/* reuse GL_MATRIX_STRIDE */ -/* reuse GL_IS_ROW_MAJOR */ -/* reuse GL_ATOMIC_COUNTER_BUFFER_INDEX */ -/* reuse GL_BUFFER_BINDING */ -/* reuse GL_BUFFER_DATA_SIZE */ -/* reuse GL_NUM_ACTIVE_VARIABLES */ -/* reuse GL_ACTIVE_VARIABLES */ -/* reuse GL_REFERENCED_BY_VERTEX_SHADER */ -/* reuse GL_REFERENCED_BY_TESS_CONTROL_SHADER */ -/* reuse GL_REFERENCED_BY_TESS_EVALUATION_SHADER */ -/* reuse GL_REFERENCED_BY_GEOMETRY_SHADER */ -/* reuse GL_REFERENCED_BY_FRAGMENT_SHADER */ -/* reuse GL_REFERENCED_BY_COMPUTE_SHADER */ -/* reuse GL_TOP_LEVEL_ARRAY_SIZE */ -/* reuse GL_TOP_LEVEL_ARRAY_STRIDE */ -/* reuse GL_LOCATION */ -/* reuse GL_LOCATION_INDEX */ -/* reuse GL_IS_PER_PATCH */ -/* Reuse tokens from ARB_robust_buffer_access_behavior (none) */ -/* Reuse tokens from ARB_shader_storage_buffer_object */ -/* reuse GL_SHADER_STORAGE_BUFFER */ -/* reuse GL_SHADER_STORAGE_BUFFER_BINDING */ -/* reuse GL_SHADER_STORAGE_BUFFER_START */ -/* reuse GL_SHADER_STORAGE_BUFFER_SIZE */ -/* reuse GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS */ -/* reuse GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS */ -/* reuse GL_MAX_SHADER_STORAGE_BLOCK_SIZE */ -/* reuse GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT */ -/* reuse GL_SHADER_STORAGE_BARRIER_BIT */ -/* reuse GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES */ -/* Reuse tokens from ARB_stencil_texturing */ -/* reuse GL_DEPTH_STENCIL_TEXTURE_MODE */ -/* Reuse tokens from ARB_texture_buffer_range */ -/* reuse GL_TEXTURE_BUFFER_OFFSET */ -/* reuse GL_TEXTURE_BUFFER_SIZE */ -/* reuse GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT */ -/* Reuse tokens from ARB_texture_query_levels (none) */ -/* Reuse tokens from ARB_texture_storage_multisample (none) */ -/* Reuse tokens from ARB_texture_view */ -/* reuse GL_TEXTURE_VIEW_MIN_LEVEL */ -/* reuse GL_TEXTURE_VIEW_NUM_LEVELS */ -/* reuse GL_TEXTURE_VIEW_MIN_LAYER */ -/* reuse GL_TEXTURE_VIEW_NUM_LAYERS */ -/* reuse GL_TEXTURE_IMMUTABLE_LEVELS */ -/* Reuse tokens from ARB_vertex_attrib_binding */ -/* reuse GL_VERTEX_ATTRIB_BINDING */ -/* reuse GL_VERTEX_ATTRIB_RELATIVE_OFFSET */ -/* reuse GL_VERTEX_BINDING_DIVISOR */ -/* reuse GL_VERTEX_BINDING_OFFSET */ -/* reuse GL_VERTEX_BINDING_STRIDE */ -/* reuse GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET */ -/* reuse GL_MAX_VERTEX_ATTRIB_BINDINGS */ -#endif - -#ifndef GL_ARB_multitexture -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 -#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 -#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 -#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 -#endif - -#ifndef GL_ARB_multisample -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif - -#ifndef GL_ARB_texture_env_add -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C -#endif - -#ifndef GL_ARB_texture_compression -#define GL_COMPRESSED_ALPHA_ARB 0x84E9 -#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA -#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB -#define GL_COMPRESSED_INTENSITY_ARB 0x84EC -#define GL_COMPRESSED_RGB_ARB 0x84ED -#define GL_COMPRESSED_RGBA_ARB 0x84EE -#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF -#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 -#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 -#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif - -#ifndef GL_ARB_point_parameters -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_MATRIX_PALETTE_ARB 0x8840 -#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 -#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 -#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 -#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 -#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 -#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 -#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 -#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 -#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_COMBINE_ARB 0x8570 -#define GL_COMBINE_RGB_ARB 0x8571 -#define GL_COMBINE_ALPHA_ARB 0x8572 -#define GL_SOURCE0_RGB_ARB 0x8580 -#define GL_SOURCE1_RGB_ARB 0x8581 -#define GL_SOURCE2_RGB_ARB 0x8582 -#define GL_SOURCE0_ALPHA_ARB 0x8588 -#define GL_SOURCE1_ALPHA_ARB 0x8589 -#define GL_SOURCE2_ALPHA_ARB 0x858A -#define GL_OPERAND0_RGB_ARB 0x8590 -#define GL_OPERAND1_RGB_ARB 0x8591 -#define GL_OPERAND2_RGB_ARB 0x8592 -#define GL_OPERAND0_ALPHA_ARB 0x8598 -#define GL_OPERAND1_ALPHA_ARB 0x8599 -#define GL_OPERAND2_ALPHA_ARB 0x859A -#define GL_RGB_SCALE_ARB 0x8573 -#define GL_ADD_SIGNED_ARB 0x8574 -#define GL_INTERPOLATE_ARB 0x8575 -#define GL_SUBTRACT_ARB 0x84E7 -#define GL_CONSTANT_ARB 0x8576 -#define GL_PRIMARY_COLOR_ARB 0x8577 -#define GL_PREVIOUS_ARB 0x8578 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B -#endif - -#ifndef GL_ARB_shadow -#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C -#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D -#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF -#endif - -#ifndef GL_ARB_window_pos -#endif - -#ifndef GL_ARB_vertex_program -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#endif - -#ifndef GL_ARB_fragment_program -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#endif - -#ifndef GL_ARB_shader_objects -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#endif - -#ifndef GL_ARB_point_sprite -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_HALF_FLOAT_ARB 0x140B -#endif - -#ifndef GL_ARB_texture_float -#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 -#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 -#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 -#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 -#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 -#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 -#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 -#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_ALPHA32F_ARB 0x8816 -#define GL_INTENSITY32F_ARB 0x8817 -#define GL_LUMINANCE32F_ARB 0x8818 -#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#define GL_ALPHA16F_ARB 0x881C -#define GL_INTENSITY16F_ARB 0x881D -#define GL_LUMINANCE16F_ARB 0x881E -#define GL_LUMINANCE_ALPHA16F_ARB 0x881F -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif - -#ifndef GL_ARB_depth_buffer_float #define GL_DEPTH_COMPONENT32F 0x8CAC #define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#endif - -#ifndef GL_ARB_draw_instanced -#endif - -#ifndef GL_ARB_framebuffer_object #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 @@ -2015,68 +1063,18 @@ extern "C" { #define GL_INDEX 0x8222 #define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 #define GL_TEXTURE_INTENSITY_TYPE 0x8C15 -#endif - -#ifndef GL_ARB_framebuffer_sRGB #define GL_FRAMEBUFFER_SRGB 0x8DB9 -#endif - -#ifndef GL_ARB_geometry_shader4 -#define GL_LINES_ADJACENCY_ARB 0x000A -#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B -#define GL_TRIANGLES_ADJACENCY_ARB 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 -#define GL_GEOMETRY_SHADER_ARB 0x8DD9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 -/* reuse GL_MAX_VARYING_COMPONENTS */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */ -#endif - -#ifndef GL_ARB_half_float_vertex #define GL_HALF_FLOAT 0x140B -#endif - -#ifndef GL_ARB_instanced_arrays -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE -#endif - -#ifndef GL_ARB_map_buffer_range #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#endif - -#ifndef GL_ARB_texture_buffer_object -#define GL_TEXTURE_BUFFER_ARB 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E -#endif - -#ifndef GL_ARB_texture_compression_rgtc #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC #define GL_COMPRESSED_RG_RGTC2 0x8DBD #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE -#endif - -#ifndef GL_ARB_texture_rg #define GL_RG 0x8227 #define GL_RG_INTEGER 0x8228 #define GL_R8 0x8229 @@ -2099,13 +1097,212 @@ extern "C" { #define GL_RG16UI 0x823A #define GL_RG32I 0x823B #define GL_RG32UI 0x823C -#endif - -#ifndef GL_ARB_vertex_array_object #define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedback (void); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRender (void); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); #endif +#endif /* GL_VERSION_3_0 */ -#ifndef GL_ARB_uniform_buffer_object +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 #define GL_UNIFORM_BUFFER_START 0x8A29 @@ -2139,44 +1336,104 @@ extern "C" { #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_INVALID_INDEX 0xFFFFFFFFu +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); #endif +#endif /* GL_VERSION_3_1 */ -#ifndef GL_ARB_compatibility -/* ARB_compatibility just defines tokens from core 3.0 */ +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +typedef struct __GLsync *GLsync; +#ifndef GLEXT_64_TYPES_DEFINED +/* This code block is duplicated in glxext.h, so must be protected */ +#define GLEXT_64_TYPES_DEFINED +/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ +/* (as used in the GL_EXT_timer_query extension). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include #endif - -#ifndef GL_ARB_copy_buffer -#define GL_COPY_READ_BUFFER_BINDING 0x8F36 -#define GL_COPY_READ_BUFFER 0x8F36 -#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 -#define GL_COPY_WRITE_BUFFER 0x8F37 #endif - -#ifndef GL_ARB_shader_texture_lod -#endif - -#ifndef GL_ARB_depth_clamp +typedef uint64_t GLuint64; +typedef int64_t GLint64; +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 #define GL_DEPTH_CLAMP 0x864F -#endif - -#ifndef GL_ARB_draw_elements_base_vertex -#endif - -#ifndef GL_ARB_fragment_coord_conventions -#endif - -#ifndef GL_ARB_provoking_vertex #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_FIRST_VERTEX_CONVENTION 0x8E4D #define GL_LAST_VERTEX_CONVENTION 0x8E4E #define GL_PROVOKING_VERTEX 0x8E4F -#endif - -#ifndef GL_ARB_seamless_cube_map #define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F -#endif - -#ifndef GL_ARB_sync #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 #define GL_OBJECT_TYPE 0x9112 #define GL_SYNC_CONDITION 0x9113 @@ -2190,11 +1447,8 @@ extern "C" { #define GL_TIMEOUT_EXPIRED 0x911B #define GL_CONDITION_SATISFIED 0x911C #define GL_WAIT_FAILED 0x911D -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull -#endif - -#ifndef GL_ARB_texture_multisample +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_SAMPLE_POSITION 0x8E50 #define GL_SAMPLE_MASK 0x8E51 #define GL_SAMPLE_MASK_VALUE 0x8E52 @@ -2216,112 +1470,207 @@ extern "C" { #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_INTEGER_SAMPLES 0x9110 +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); #endif +#endif /* GL_VERSION_3_2 */ -#ifndef GL_ARB_vertex_array_bgra -/* reuse GL_BGRA */ -#endif - -#ifndef GL_ARB_draw_buffers_blend -#endif - -#ifndef GL_ARB_sample_shading -#define GL_SAMPLE_SHADING_ARB 0x8C36 -#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 -#endif - -#ifndef GL_ARB_texture_cube_map_array -#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B -#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C -#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D -#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E -#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F -#endif - -#ifndef GL_ARB_texture_gather -#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E -#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F -#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F -#endif - -#ifndef GL_ARB_texture_query_lod -#endif - -#ifndef GL_ARB_shading_language_include -#define GL_SHADER_INCLUDE_ARB 0x8DAE -#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 -#define GL_NAMED_STRING_TYPE_ARB 0x8DEA -#endif - -#ifndef GL_ARB_texture_compression_bptc -#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C -#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D -#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E -#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F -#endif - -#ifndef GL_ARB_blend_func_extended +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_SRC1_COLOR 0x88F9 -/* reuse GL_SRC1_ALPHA */ #define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_ONE_MINUS_SRC1_ALPHA 0x88FB #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC -#endif - -#ifndef GL_ARB_explicit_attrib_location -#endif - -#ifndef GL_ARB_occlusion_query2 #define GL_ANY_SAMPLES_PASSED 0x8C2F -#endif - -#ifndef GL_ARB_sampler_objects #define GL_SAMPLER_BINDING 0x8919 -#endif - -#ifndef GL_ARB_shader_bit_encoding -#endif - -#ifndef GL_ARB_texture_rgb10_a2ui #define GL_RGB10_A2UI 0x906F -#endif - -#ifndef GL_ARB_texture_swizzle #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_B 0x8E44 #define GL_TEXTURE_SWIZZLE_A 0x8E45 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 -#endif - -#ifndef GL_ARB_timer_query #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 -#endif - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -/* reuse GL_UNSIGNED_INT_2_10_10_10_REV */ #define GL_INT_2_10_10_10_REV 0x8D9F +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); #endif +#endif /* GL_VERSION_3_3 */ -#ifndef GL_ARB_draw_indirect +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F #define GL_DRAW_INDIRECT_BUFFER 0x8F3F #define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 -#endif - -#ifndef GL_ARB_gpu_shader5 #define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F #define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C #define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D -/* reuse GL_MAX_VERTEX_STREAMS */ -#endif - -#ifndef GL_ARB_gpu_shader_fp64 -/* reuse GL_DOUBLE */ +#define GL_MAX_VERTEX_STREAMS 0x8E71 #define GL_DOUBLE_VEC2 0x8FFC #define GL_DOUBLE_VEC3 0x8FFD #define GL_DOUBLE_VEC4 0x8FFE @@ -2334,9 +1683,6 @@ extern "C" { #define GL_DOUBLE_MAT3x4 0x8F4C #define GL_DOUBLE_MAT4x2 0x8F4D #define GL_DOUBLE_MAT4x3 0x8F4E -#endif - -#ifndef GL_ARB_shader_subroutine #define GL_ACTIVE_SUBROUTINES 0x8DE5 #define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 #define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 @@ -2346,11 +1692,6 @@ extern "C" { #define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 #define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_COMPATIBLE_SUBROUTINES 0x8E4B -/* reuse GL_UNIFORM_SIZE */ -/* reuse GL_UNIFORM_NAME_LENGTH */ -#endif - -#ifndef GL_ARB_tessellation_shader #define GL_PATCHES 0x000E #define GL_PATCH_VERTICES 0x8E72 #define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 @@ -2360,14 +1701,9 @@ extern "C" { #define GL_TESS_GEN_SPACING 0x8E77 #define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TESS_GEN_POINT_MODE 0x8E79 -/* reuse GL_TRIANGLES */ -/* reuse GL_QUADS */ #define GL_ISOLINES 0x8E7A -/* reuse GL_EQUAL */ #define GL_FRACTIONAL_ODD 0x8E7B #define GL_FRACTIONAL_EVEN 0x8E7C -/* reuse GL_CCW */ -/* reuse GL_CW */ #define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_TESS_GEN_LEVEL 0x8E7E #define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F @@ -2388,29 +1724,109 @@ extern "C" { #define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_TESS_CONTROL_SHADER 0x8E88 -#endif - -#ifndef GL_ARB_texture_buffer_object_rgb32 -/* reuse GL_RGB32F */ -/* reuse GL_RGB32UI */ -/* reuse GL_RGB32I */ -#endif - -#ifndef GL_ARB_transform_feedback2 #define GL_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 -#endif - -#ifndef GL_ARB_transform_feedback3 #define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 -#define GL_MAX_VERTEX_STREAMS 0x8E71 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLfloat value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); #endif +#endif /* GL_VERSION_4_0 */ -#ifndef GL_ARB_ES2_compatibility +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 #define GL_FIXED 0x140C #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B @@ -2427,16 +1843,10 @@ extern "C" { #define GL_MAX_VARYING_VECTORS 0x8DFC #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD #define GL_RGB565 0x8D62 -#endif - -#ifndef GL_ARB_get_program_binary #define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 #define GL_PROGRAM_BINARY_LENGTH 0x8741 #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE #define GL_PROGRAM_BINARY_FORMATS 0x87FF -#endif - -#ifndef GL_ARB_separate_shader_objects #define GL_VERTEX_SHADER_BIT 0x00000001 #define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_GEOMETRY_SHADER_BIT 0x00000004 @@ -2446,97 +1856,198 @@ extern "C" { #define GL_PROGRAM_SEPARABLE 0x8258 #define GL_ACTIVE_PROGRAM 0x8259 #define GL_PROGRAM_PIPELINE_BINDING 0x825A -#endif - -#ifndef GL_ARB_shader_precision -#endif - -#ifndef GL_ARB_vertex_attrib_64bit -/* reuse GL_RGB32I */ -/* reuse GL_DOUBLE_VEC2 */ -/* reuse GL_DOUBLE_VEC3 */ -/* reuse GL_DOUBLE_VEC4 */ -/* reuse GL_DOUBLE_MAT2 */ -/* reuse GL_DOUBLE_MAT3 */ -/* reuse GL_DOUBLE_MAT4 */ -/* reuse GL_DOUBLE_MAT2x3 */ -/* reuse GL_DOUBLE_MAT2x4 */ -/* reuse GL_DOUBLE_MAT3x2 */ -/* reuse GL_DOUBLE_MAT3x4 */ -/* reuse GL_DOUBLE_MAT4x2 */ -/* reuse GL_DOUBLE_MAT4x3 */ -#endif - -#ifndef GL_ARB_viewport_array -/* reuse GL_SCISSOR_BOX */ -/* reuse GL_VIEWPORT */ -/* reuse GL_DEPTH_RANGE */ -/* reuse GL_SCISSOR_TEST */ #define GL_MAX_VIEWPORTS 0x825B #define GL_VIEWPORT_SUBPIXEL_BITS 0x825C #define GL_VIEWPORT_BOUNDS_RANGE 0x825D #define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F #define GL_UNDEFINED_VERTEX 0x8260 -/* reuse GL_FIRST_VERTEX_CONVENTION */ -/* reuse GL_LAST_VERTEX_CONVENTION */ -/* reuse GL_PROVOKING_VERTEX */ +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const void *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GLAPI void APIENTRY glClearDepthf (GLfloat d); +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); #endif +#endif /* GL_VERSION_4_1 */ -#ifndef GL_ARB_cl_event -#define GL_SYNC_CL_EVENT_ARB 0x8240 -#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 -#endif - -#ifndef GL_ARB_debug_output -#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 -#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 -#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 -#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 -#define GL_DEBUG_SOURCE_API_ARB 0x8246 -#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 -#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 -#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 -#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A -#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B -#define GL_DEBUG_TYPE_ERROR_ARB 0x824C -#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D -#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E -#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F -#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 -#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 -#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 -#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 -#endif - -#ifndef GL_ARB_robustness -/* reuse GL_NO_ERROR */ -#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 -#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 -#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 -#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 -#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 -#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 -#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 -#endif - -#ifndef GL_ARB_shader_stencil_export -#endif - -#ifndef GL_ARB_base_instance -#endif - -#ifndef GL_ARB_shading_language_420pack -#endif - -#ifndef GL_ARB_transform_feedback_instanced -#endif - -#ifndef GL_ARB_compressed_texture_pixel_storage +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 #define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 @@ -2545,20 +2056,8 @@ extern "C" { #define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C #define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D #define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E -#endif - -#ifndef GL_ARB_conservative_depth -#endif - -#ifndef GL_ARB_internalformat_query #define GL_NUM_SAMPLE_COUNTS 0x9380 -#endif - -#ifndef GL_ARB_map_buffer_alignment #define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC -#endif - -#ifndef GL_ARB_shader_atomic_counters #define GL_ATOMIC_COUNTER_BUFFER 0x92C0 #define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 #define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 @@ -2588,9 +2087,6 @@ extern "C" { #define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA #define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB -#endif - -#ifndef GL_ARB_shader_image_load_store #define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_UNIFORM_BARRIER_BIT 0x00000004 @@ -2655,47 +2151,75 @@ extern "C" { #define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF -#endif - -#ifndef GL_ARB_shading_language_packing -#endif - -#ifndef GL_ARB_texture_storage +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); +GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); +GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); #endif +#endif /* GL_VERSION_4_2 */ -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 -#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 -#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 -#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 -#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 -#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 -#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 -#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 -#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 -#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 -#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA -#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB -#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC -#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC -#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD -#endif - -#ifndef GL_KHR_debug +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 @@ -2712,6 +2236,12 @@ extern "C" { #define GL_DEBUG_TYPE_PORTABILITY 0x824F #define GL_DEBUG_TYPE_PERFORMANCE 0x8250 #define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_DEBUG_TYPE_MARKER 0x8268 #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 #define GL_DEBUG_TYPE_POP_GROUP 0x826A @@ -2724,96 +2254,10 @@ extern "C" { #define GL_QUERY 0x82E3 #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_SAMPLER 0x82E6 -#define GL_DISPLAY_LIST 0x82E7 -/* DISPLAY_LIST used in compatibility profile only */ #define GL_MAX_LABEL_LENGTH 0x82E8 -#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES 0x9145 -#define GL_DEBUG_SEVERITY_HIGH 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 -#define GL_DEBUG_SEVERITY_LOW 0x9148 #define GL_DEBUG_OUTPUT 0x92E0 #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 -/* reuse GL_STACK_UNDERFLOW */ -/* reuse GL_STACK_OVERFLOW */ -#endif - -#ifndef GL_ARB_arrays_of_arrays -#endif - -#ifndef GL_ARB_clear_buffer_object -#endif - -#ifndef GL_ARB_compute_shader -#define GL_COMPUTE_SHADER 0x91B9 -#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB -#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC -#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD -#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 -#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 -#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 -#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 -#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 -#define GL_MAX_COMPUTE_LOCAL_INVOCATIONS 0x90EB -#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE -#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF -#define GL_COMPUTE_LOCAL_WORK_SIZE 0x8267 -#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC -#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED -#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE -#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF -#define GL_COMPUTE_SHADER_BIT 0x00000020 -#endif - -#ifndef GL_ARB_copy_image -#endif - -#ifndef GL_ARB_texture_view -#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB -#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC -#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD -#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#endif - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_VERTEX_ATTRIB_BINDING 0x82D4 -#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 -#define GL_VERTEX_BINDING_DIVISOR 0x82D6 -#define GL_VERTEX_BINDING_OFFSET 0x82D7 -#define GL_VERTEX_BINDING_STRIDE 0x82D8 -#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 -#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA -#endif - -#ifndef GL_ARB_robustness_isolation -#endif - -#ifndef GL_ARB_ES3_compatibility -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_SRGB8_ETC2 0x9275 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#endif - -#ifndef GL_ARB_explicit_uniform_location #define GL_MAX_UNIFORM_LOCATIONS 0x826E -#endif - -#ifndef GL_ARB_fragment_layer_viewport -#endif - -#ifndef GL_ARB_framebuffer_no_attachments #define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 #define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 @@ -2823,25 +2267,6 @@ extern "C" { #define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 #define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 #define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 -#endif - -#ifndef GL_ARB_internalformat_query2 -/* reuse GL_IMAGE_FORMAT_COMPATIBILITY_TYPE */ -/* reuse GL_NUM_SAMPLE_COUNTS */ -/* reuse GL_RENDERBUFFER */ -/* reuse GL_SAMPLES */ -/* reuse GL_TEXTURE_1D */ -/* reuse GL_TEXTURE_1D_ARRAY */ -/* reuse GL_TEXTURE_2D */ -/* reuse GL_TEXTURE_2D_ARRAY */ -/* reuse GL_TEXTURE_3D */ -/* reuse GL_TEXTURE_CUBE_MAP */ -/* reuse GL_TEXTURE_CUBE_MAP_ARRAY */ -/* reuse GL_TEXTURE_RECTANGLE */ -/* reuse GL_TEXTURE_BUFFER */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE */ -/* reuse GL_TEXTURE_2D_MULTISAMPLE_ARRAY */ -/* reuse GL_TEXTURE_COMPRESSED */ #define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INTERNALFORMAT_PREFERRED 0x8270 #define GL_INTERNALFORMAT_RED_SIZE 0x8271 @@ -2884,7 +2309,6 @@ extern "C" { #define GL_COLOR_ENCODING 0x8296 #define GL_SRGB_READ 0x8297 #define GL_SRGB_WRITE 0x8298 -#define GL_SRGB_DECODE_ARB 0x8299 #define GL_FILTER 0x829A #define GL_VERTEX_TEXTURE 0x829B #define GL_TESS_CONTROL_TEXTURE 0x829C @@ -2941,22 +2365,12 @@ extern "C" { #define GL_VIEW_CLASS_RGTC2_RG 0x82D1 #define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 #define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 -#endif - -#ifndef GL_ARB_invalidate_subdata -#endif - -#ifndef GL_ARB_multi_draw_indirect -#endif - -#ifndef GL_ARB_program_interface_query #define GL_UNIFORM 0x92E1 #define GL_UNIFORM_BLOCK 0x92E2 #define GL_PROGRAM_INPUT 0x92E3 #define GL_PROGRAM_OUTPUT 0x92E4 #define GL_BUFFER_VARIABLE 0x92E5 #define GL_SHADER_STORAGE_BLOCK 0x92E6 -/* reuse GL_ATOMIC_COUNTER_BUFFER */ #define GL_VERTEX_SUBROUTINE 0x92E8 #define GL_TESS_CONTROL_SUBROUTINE 0x92E9 #define GL_TESS_EVALUATION_SUBROUTINE 0x92EA @@ -2998,17 +2412,6 @@ extern "C" { #define GL_LOCATION 0x930E #define GL_LOCATION_INDEX 0x930F #define GL_IS_PER_PATCH 0x92E7 -/* reuse GL_NUM_COMPATIBLE_SUBROUTINES */ -/* reuse GL_COMPATIBLE_SUBROUTINES */ -#endif - -#ifndef GL_ARB_robust_buffer_access_behavior -#endif - -#ifndef GL_ARB_shader_image_size -#endif - -#ifndef GL_ARB_shader_storage_buffer_object #define GL_SHADER_STORAGE_BUFFER 0x90D2 #define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 #define GL_SHADER_STORAGE_BUFFER_START 0x90D4 @@ -3025,1485 +2428,3315 @@ extern "C" { #define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF #define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 #define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 -/* reuse GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS */ -#endif - -#ifndef GL_ARB_stencil_texturing #define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA -#endif - -#ifndef GL_ARB_texture_buffer_range #define GL_TEXTURE_BUFFER_OFFSET 0x919D #define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_DISPLAY_LIST 0x82E7 +typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); +GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); +GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); +GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); +GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); +GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GLAPI void APIENTRY glPopDebugGroup (void); +GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); #endif +#endif /* GL_VERSION_4_3 */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); +GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#endif +#endif /* GL_VERSION_4_4 */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 +#define GL_CONTEXT_LOST 0x0507 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA +#define GL_TEXTURE_BINDING 0x82EB +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); +typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizei size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, const void *data); +typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizei length); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizei size, void *data); +typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); +typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); +typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); +GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizei size); +GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); +GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizei size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizei size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, const void *data); +GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizei size); +GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizei size, GLenum format, GLenum type, const void *data); +GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); +GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length, GLbitfield access); +GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); +GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizei length); +GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizei size, void *data); +GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); +GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); +GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, const GLfloat depth, GLint stencil); +GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); +GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizei size); +GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); +GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); +GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); +GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); +GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); +GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); +GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); +GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); +GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); +GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glTextureBarrier (void); +#endif +#endif /* GL_VERSION_4_5 */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#endif /* GL_ARB_ES2_compatibility */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 +#endif /* GL_ARB_ES3_1_compatibility */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 +#endif /* GL_ARB_ES3_compatibility */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 +#endif /* GL_ARB_arrays_of_arrays */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 +#endif /* GL_ARB_base_instance */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 +typedef uint64_t GLuint64EXT; +#define GL_UNSIGNED_INT64_ARB 0x140F +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_ARB_bindless_texture */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#endif /* GL_ARB_blend_func_extended */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 +#endif /* GL_ARB_buffer_storage */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +struct _cl_context; +struct _cl_event; +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#endif +#endif /* GL_ARB_cl_event */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 +#endif /* GL_ARB_clear_buffer_object */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 +#endif /* GL_ARB_clear_texture */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 +#endif /* GL_ARB_clip_control */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); +#endif +#endif /* GL_ARB_color_buffer_float */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif /* GL_ARB_compatibility */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 +#endif /* GL_ARB_compute_shader */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#endif +#endif /* GL_ARB_compute_variable_group_size */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 +#endif /* GL_ARB_conditional_render_inverted */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 +#endif /* GL_ARB_conservative_depth */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#endif /* GL_ARB_copy_buffer */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 +#endif /* GL_ARB_copy_image */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 +#endif /* GL_ARB_cull_distance */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif +#endif /* GL_ARB_debug_output */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#endif /* GL_ARB_depth_buffer_float */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif /* GL_ARB_depth_clamp */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif /* GL_ARB_depth_texture */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 +#endif /* GL_ARB_derivative_control */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 +#endif /* GL_ARB_direct_state_access */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ARB_draw_buffers */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif +#endif /* GL_ARB_draw_buffers_blend */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#endif /* GL_ARB_draw_indirect */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_ARB_draw_instanced */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 +#endif /* GL_ARB_enhanced_layouts */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif /* GL_ARB_explicit_attrib_location */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 +#endif /* GL_ARB_explicit_uniform_location */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif /* GL_ARB_fragment_coord_conventions */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 +#endif /* GL_ARB_fragment_layer_viewport */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); +#endif +#endif /* GL_ARB_fragment_program */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif /* GL_ARB_fragment_program_shadow */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif /* GL_ARB_fragment_shader */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#endif /* GL_ARB_framebuffer_object */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#endif /* GL_ARB_framebuffer_sRGB */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_ARB_geometry_shader4 */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#endif /* GL_ARB_get_program_binary */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 +#endif /* GL_ARB_get_texture_sub_image */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif /* GL_ARB_gpu_shader5 */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +typedef unsigned short GLhalfARB; +#define GL_HALF_FLOAT_ARB 0x140B +#endif /* GL_ARB_half_float_pixel */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#endif /* GL_ARB_half_float_vertex */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_EQUATION 0x8009 +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif +#endif /* GL_ARB_imaging */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_ARB_indirect_parameters */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); +#endif +#endif /* GL_ARB_instanced_arrays */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 +#endif /* GL_ARB_internalformat_query */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 +#define GL_SRGB_DECODE_ARB 0x8299 +#endif /* GL_ARB_internalformat_query2 */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 +#endif /* GL_ARB_invalidate_subdata */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 +#endif /* GL_ARB_map_buffer_alignment */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#endif /* GL_ARB_map_buffer_range */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_ARB_matrix_palette */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 +#endif /* GL_ARB_multi_bind */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 +#endif /* GL_ARB_multi_draw_indirect */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); +#endif +#endif /* GL_ARB_multisample */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); +#endif +#endif /* GL_ARB_multitexture */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_ARB_occlusion_query */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif /* GL_ARB_occlusion_query2 */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#endif /* GL_ARB_pipeline_statistics_query */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif /* GL_ARB_pixel_buffer_object */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_ARB_point_parameters */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif /* GL_ARB_point_sprite */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 +#endif /* GL_ARB_program_interface_query */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#endif /* GL_ARB_provoking_vertex */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 +#endif /* GL_ARB_query_buffer_object */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 +#endif /* GL_ARB_robust_buffer_access_behavior */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#endif +#endif /* GL_ARB_robustness */ + +#ifndef GL_ARB_robustness_isolation +#define GL_ARB_robustness_isolation 1 +#endif /* GL_ARB_robustness_isolation */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); +#endif +#endif /* GL_ARB_sample_shading */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#endif /* GL_ARB_sampler_objects */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif /* GL_ARB_seamless_cube_map */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#endif /* GL_ARB_separate_shader_objects */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 +#endif /* GL_ARB_shader_atomic_counters */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 +#endif /* GL_ARB_shader_bit_encoding */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 +#endif /* GL_ARB_shader_draw_parameters */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 +#endif /* GL_ARB_shader_group_vote */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 +#endif /* GL_ARB_shader_image_load_store */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 +#endif /* GL_ARB_shader_image_size */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef char GLcharARB; +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif +#endif /* GL_ARB_shader_objects */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 +#endif /* GL_ARB_shader_precision */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif /* GL_ARB_shader_stencil_export */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#endif /* GL_ARB_shader_subroutine */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 +#endif /* GL_ARB_shader_texture_image_samples */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif /* GL_ARB_shader_texture_lod */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif /* GL_ARB_shading_language_100 */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 +#endif /* GL_ARB_shading_language_420pack */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif +#endif /* GL_ARB_shading_language_include */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 +#endif /* GL_ARB_shading_language_packing */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif /* GL_ARB_shadow */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif /* GL_ARB_shadow_ambient */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 +typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#endif +#endif /* GL_ARB_sparse_buffer */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +#endif +#endif /* GL_ARB_sparse_texture */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 +#endif /* GL_ARB_stencil_texturing */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#endif /* GL_ARB_sync */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#endif /* GL_ARB_tessellation_shader */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 +#endif /* GL_ARB_texture_barrier */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif /* GL_ARB_texture_border_clamp */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_ARB_texture_buffer_object */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 +#endif /* GL_ARB_texture_buffer_range */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); +#endif +#endif /* GL_ARB_texture_compression */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif /* GL_ARB_texture_compression_bptc */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#endif /* GL_ARB_texture_compression_rgtc */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif /* GL_ARB_texture_cube_map */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif /* GL_ARB_texture_cube_map_array */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif /* GL_ARB_texture_env_add */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif /* GL_ARB_texture_env_combine */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif /* GL_ARB_texture_env_crossbar */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif /* GL_ARB_texture_env_dot3 */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif /* GL_ARB_texture_float */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F +#endif /* GL_ARB_texture_gather */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif /* GL_ARB_texture_mirrored_repeat */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#endif /* GL_ARB_texture_multisample */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif /* GL_ARB_texture_non_power_of_two */ #ifndef GL_ARB_texture_query_levels -#endif +#define GL_ARB_texture_query_levels 1 +#endif /* GL_ARB_texture_query_levels */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif /* GL_ARB_texture_query_lod */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif /* GL_ARB_texture_rectangle */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#endif /* GL_ARB_texture_rg */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif /* GL_ARB_texture_rgb10_a2ui */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 +#endif /* GL_ARB_texture_stencil8 */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 +#endif /* GL_ARB_texture_storage */ #ifndef GL_ARB_texture_storage_multisample -#endif - -#ifndef GL_EXT_abgr -#define GL_ABGR_EXT 0x8000 -#endif - -#ifndef GL_EXT_blend_color -#define GL_CONSTANT_COLOR_EXT 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 -#define GL_CONSTANT_ALPHA_EXT 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 -#define GL_BLEND_COLOR_EXT 0x8005 -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_POLYGON_OFFSET_EXT 0x8037 -#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 -#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 -#endif - -#ifndef GL_EXT_texture -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 -#endif - -#ifndef GL_EXT_texture3D -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_FILTER4_SGIS 0x8146 -#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 -#endif - -#ifndef GL_EXT_subtexture -#endif - -#ifndef GL_EXT_copy_texture -#endif - -#ifndef GL_EXT_histogram -#define GL_HISTOGRAM_EXT 0x8024 -#define GL_PROXY_HISTOGRAM_EXT 0x8025 -#define GL_HISTOGRAM_WIDTH_EXT 0x8026 -#define GL_HISTOGRAM_FORMAT_EXT 0x8027 -#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C -#define GL_HISTOGRAM_SINK_EXT 0x802D -#define GL_MINMAX_EXT 0x802E -#define GL_MINMAX_FORMAT_EXT 0x802F -#define GL_MINMAX_SINK_EXT 0x8030 -#define GL_TABLE_TOO_LARGE_EXT 0x8031 -#endif - -#ifndef GL_EXT_convolution -#define GL_CONVOLUTION_1D_EXT 0x8010 -#define GL_CONVOLUTION_2D_EXT 0x8011 -#define GL_SEPARABLE_2D_EXT 0x8012 -#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 -#define GL_REDUCE_EXT 0x8016 -#define GL_CONVOLUTION_FORMAT_EXT 0x8017 -#define GL_CONVOLUTION_WIDTH_EXT 0x8018 -#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 -#endif - -#ifndef GL_SGI_color_matrix -#define GL_COLOR_MATRIX_SGI 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB -#endif - -#ifndef GL_SGI_color_table -#define GL_COLOR_TABLE_SGI 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 -#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 -#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 -#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 -#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 -#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF -#endif - -#ifndef GL_SGIS_pixel_texture -#define GL_PIXEL_TEXTURE_SGIS 0x8353 -#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 -#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 -#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_PIXEL_TEX_GEN_SGIX 0x8139 -#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B -#endif - -#ifndef GL_SGIS_texture4D -#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 -#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 -#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 -#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 -#define GL_TEXTURE_4D_SGIS 0x8134 -#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 -#define GL_TEXTURE_4DSIZE_SGIS 0x8136 -#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 -#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 -#define GL_TEXTURE_4D_BINDING_SGIS 0x814F -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC -#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD -#endif - -#ifndef GL_EXT_cmyka -#define GL_CMYK_EXT 0x800C -#define GL_CMYKA_EXT 0x800D -#define GL_PACK_CMYK_HINT_EXT 0x800E -#define GL_UNPACK_CMYK_HINT_EXT 0x800F -#endif - -#ifndef GL_EXT_texture_object -#define GL_TEXTURE_PRIORITY_EXT 0x8066 -#define GL_TEXTURE_RESIDENT_EXT 0x8067 -#define GL_TEXTURE_1D_BINDING_EXT 0x8068 -#define GL_TEXTURE_2D_BINDING_EXT 0x8069 -#define GL_TEXTURE_3D_BINDING_EXT 0x806A -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 -#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 -#define GL_LINEAR_DETAIL_SGIS 0x8097 -#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 -#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 -#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A -#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B -#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_LINEAR_SHARPEN_SGIS 0x80AD -#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE -#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF -#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 -#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 -#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 -#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_TEXTURE_MIN_LOD_SGIS 0x813A -#define GL_TEXTURE_MAX_LOD_SGIS 0x813B -#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C -#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D -#endif - -#ifndef GL_SGIS_multisample -#define GL_MULTISAMPLE_SGIS 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F -#define GL_SAMPLE_MASK_SGIS 0x80A0 -#define GL_1PASS_SGIS 0x80A1 -#define GL_2PASS_0_SGIS 0x80A2 -#define GL_2PASS_1_SGIS 0x80A3 -#define GL_4PASS_0_SGIS 0x80A4 -#define GL_4PASS_1_SGIS 0x80A5 -#define GL_4PASS_2_SGIS 0x80A6 -#define GL_4PASS_3_SGIS 0x80A7 -#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 -#define GL_SAMPLES_SGIS 0x80A9 -#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA -#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB -#define GL_SAMPLE_PATTERN_SGIS 0x80AC -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_RESCALE_NORMAL_EXT 0x803A -#endif - -#ifndef GL_EXT_vertex_array -#define GL_VERTEX_ARRAY_EXT 0x8074 -#define GL_NORMAL_ARRAY_EXT 0x8075 -#define GL_COLOR_ARRAY_EXT 0x8076 -#define GL_INDEX_ARRAY_EXT 0x8077 -#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 -#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 -#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A -#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B -#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C -#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D -#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E -#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F -#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 -#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 -#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 -#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 -#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 -#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 -#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 -#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 -#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A -#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B -#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C -#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D -#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E -#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F -#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 -#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 -#endif - -#ifndef GL_EXT_misc_attribute -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 -#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 -#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 -#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 -#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 -#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 -#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 -#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 -#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 -#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D -#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E -#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F -#endif - -#ifndef GL_SGIX_shadow -#define GL_TEXTURE_COMPARE_SGIX 0x819A -#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B -#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C -#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_CLAMP_TO_EDGE_SGIS 0x812F -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_CLAMP_TO_BORDER_SGIS 0x812D -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_FUNC_ADD_EXT 0x8006 -#define GL_MIN_EXT 0x8007 -#define GL_MAX_EXT 0x8008 -#define GL_BLEND_EQUATION_EXT 0x8009 -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_FUNC_SUBTRACT_EXT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B -#endif - -#ifndef GL_EXT_blend_logic_op -#endif - -#ifndef GL_SGIX_interlace -#define GL_INTERLACE_SGIX 0x8094 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E -#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F -#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 -#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 -#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 -#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 -#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 -#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_DUAL_ALPHA4_SGIS 0x8110 -#define GL_DUAL_ALPHA8_SGIS 0x8111 -#define GL_DUAL_ALPHA12_SGIS 0x8112 -#define GL_DUAL_ALPHA16_SGIS 0x8113 -#define GL_DUAL_LUMINANCE4_SGIS 0x8114 -#define GL_DUAL_LUMINANCE8_SGIS 0x8115 -#define GL_DUAL_LUMINANCE12_SGIS 0x8116 -#define GL_DUAL_LUMINANCE16_SGIS 0x8117 -#define GL_DUAL_INTENSITY4_SGIS 0x8118 -#define GL_DUAL_INTENSITY8_SGIS 0x8119 -#define GL_DUAL_INTENSITY12_SGIS 0x811A -#define GL_DUAL_INTENSITY16_SGIS 0x811B -#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C -#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D -#define GL_QUAD_ALPHA4_SGIS 0x811E -#define GL_QUAD_ALPHA8_SGIS 0x811F -#define GL_QUAD_LUMINANCE4_SGIS 0x8120 -#define GL_QUAD_LUMINANCE8_SGIS 0x8121 -#define GL_QUAD_INTENSITY4_SGIS 0x8122 -#define GL_QUAD_INTENSITY8_SGIS 0x8123 -#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 -#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 -#endif - -#ifndef GL_SGIX_sprite -#define GL_SPRITE_SGIX 0x8148 -#define GL_SPRITE_MODE_SGIX 0x8149 -#define GL_SPRITE_AXIS_SGIX 0x814A -#define GL_SPRITE_TRANSLATION_SGIX 0x814B -#define GL_SPRITE_AXIAL_SGIX 0x814C -#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D -#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E -#endif - -#ifndef GL_EXT_point_parameters -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 -#endif - -#ifndef GL_SGIS_point_parameters -#define GL_POINT_SIZE_MIN_SGIS 0x8126 -#define GL_POINT_SIZE_MAX_SGIS 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 -#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 -#endif - -#ifndef GL_SGIX_instruments -#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 -#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 -#endif - -#ifndef GL_SGIX_texture_scale_bias -#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 -#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A -#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B -#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C -#endif - -#ifndef GL_SGIX_framezoom -#define GL_FRAMEZOOM_SGIX 0x818B -#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C -#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D -#endif - -#ifndef GL_SGIX_tag_sample_buffer -#endif - -#ifndef GL_SGIX_polynomial_ffd -#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 -#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 -#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 -#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 -#define GL_DEFORMATIONS_MASK_SGIX 0x8196 -#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 -#endif - -#ifndef GL_SGIX_reference_plane -#define GL_REFERENCE_PLANE_SGIX 0x817D -#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E -#endif - -#ifndef GL_SGIX_flush_raster -#endif - -#ifndef GL_SGIX_depth_texture -#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 -#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 -#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 -#endif - -#ifndef GL_SGIS_fog_function -#define GL_FOG_FUNC_SGIS 0x812A -#define GL_FOG_FUNC_POINTS_SGIS 0x812B -#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_FOG_OFFSET_SGIX 0x8198 -#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 -#endif - -#ifndef GL_HP_image_transform -#define GL_IMAGE_SCALE_X_HP 0x8155 -#define GL_IMAGE_SCALE_Y_HP 0x8156 -#define GL_IMAGE_TRANSLATE_X_HP 0x8157 -#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 -#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 -#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A -#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B -#define GL_IMAGE_MAG_FILTER_HP 0x815C -#define GL_IMAGE_MIN_FILTER_HP 0x815D -#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E -#define GL_CUBIC_HP 0x815F -#define GL_AVERAGE_HP 0x8160 -#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 -#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 -#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_IGNORE_BORDER_HP 0x8150 -#define GL_CONSTANT_BORDER_HP 0x8151 -#define GL_REPLICATE_BORDER_HP 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 -#endif - -#ifndef GL_INGR_palette_buffer -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE -#endif - -#ifndef GL_EXT_color_subtable -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_VERTEX_DATA_HINT_PGI 0x1A22A -#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B -#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C -#define GL_MAX_VERTEX_HINT_PGI 0x1A22D -#define GL_VERTEX23_BIT_PGI 0x00000004 -#define GL_VERTEX4_BIT_PGI 0x00000008 -#define GL_COLOR3_BIT_PGI 0x00010000 -#define GL_COLOR4_BIT_PGI 0x00020000 -#define GL_EDGEFLAG_BIT_PGI 0x00040000 -#define GL_INDEX_BIT_PGI 0x00080000 -#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 -#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 -#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 -#define GL_MAT_EMISSION_BIT_PGI 0x00800000 -#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 -#define GL_MAT_SHININESS_BIT_PGI 0x02000000 -#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 -#define GL_NORMAL_BIT_PGI 0x08000000 -#define GL_TEXCOORD1_BIT_PGI 0x10000000 -#define GL_TEXCOORD2_BIT_PGI 0x20000000 -#define GL_TEXCOORD3_BIT_PGI 0x40000000 -#define GL_TEXCOORD4_BIT_PGI 0x80000000 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 -#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD -#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE -#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 -#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 -#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 -#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C -#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D -#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E -#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F -#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 -#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 -#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 -#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 -#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 -#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 -#define GL_CLIP_NEAR_HINT_PGI 0x1A220 -#define GL_CLIP_FAR_HINT_PGI 0x1A221 -#define GL_WIDE_LINE_HINT_PGI 0x1A222 -#define GL_BACK_NORMALS_HINT_PGI 0x1A223 -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_LIST_PRIORITY_SGIX 0x8182 -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_IR_INSTRUMENT1_SGIX 0x817F -#endif - -#ifndef GL_SGIX_calligraphic_fragment -#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 -#endif - -#ifndef GL_SGIX_texture_lod_bias -#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E -#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F -#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 -#endif - -#ifndef GL_SGIX_shadow_ambient -#define GL_SHADOW_AMBIENT_SGIX 0x80BF -#endif - -#ifndef GL_EXT_index_texture -#endif - -#ifndef GL_EXT_index_material -#define GL_INDEX_MATERIAL_EXT 0x81B8 -#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 -#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA -#endif - -#ifndef GL_EXT_index_func -#define GL_INDEX_TEST_EXT 0x81B5 -#define GL_INDEX_TEST_FUNC_EXT 0x81B6 -#define GL_INDEX_TEST_REF_EXT 0x81B7 -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_IUI_V2F_EXT 0x81AD -#define GL_IUI_V3F_EXT 0x81AE -#define GL_IUI_N3F_V2F_EXT 0x81AF -#define GL_IUI_N3F_V3F_EXT 0x81B0 -#define GL_T2F_IUI_V2F_EXT 0x81B1 -#define GL_T2F_IUI_V3F_EXT 0x81B2 -#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 -#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 -#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_CULL_VERTEX_EXT 0x81AA -#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB -#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_YCRCB_422_SGIX 0x81BB -#define GL_YCRCB_444_SGIX 0x81BC -#endif - -#ifndef GL_SGIX_fragment_lighting -#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 -#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 -#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 -#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 -#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 -#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 -#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 -#define GL_LIGHT_ENV_MODE_SGIX 0x8407 -#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 -#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 -#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A -#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B -#define GL_FRAGMENT_LIGHT0_SGIX 0x840C -#define GL_FRAGMENT_LIGHT1_SGIX 0x840D -#define GL_FRAGMENT_LIGHT2_SGIX 0x840E -#define GL_FRAGMENT_LIGHT3_SGIX 0x840F -#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 -#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 -#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 -#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 -#endif - -#ifndef GL_IBM_rasterpos_clip -#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 -#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 -#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 -#endif - -#ifndef GL_WIN_phong_shading -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB -#endif - -#ifndef GL_WIN_specular_fog -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC -#endif - -#ifndef GL_EXT_light_texture -#define GL_FRAGMENT_MATERIAL_EXT 0x8349 -#define GL_FRAGMENT_NORMAL_EXT 0x834A -#define GL_FRAGMENT_COLOR_EXT 0x834C -#define GL_ATTENUATION_EXT 0x834D -#define GL_SHADOW_ATTENUATION_EXT 0x834E -#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F -#define GL_TEXTURE_LIGHT_EXT 0x8350 -#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 -#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 -/* reuse GL_FRAGMENT_DEPTH_EXT */ -#endif - -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_ALPHA_MIN_SGIX 0x8320 -#define GL_ALPHA_MAX_SGIX 0x8321 -#endif - -#ifndef GL_EXT_bgra -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 -#endif - -#ifndef GL_SGIX_async -#define GL_ASYNC_MARKER_SGIX 0x8329 -#endif - -#ifndef GL_SGIX_async_pixel -#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C -#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D -#define GL_ASYNC_READ_PIXELS_SGIX 0x835E -#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F -#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 -#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 -#endif - -#ifndef GL_SGIX_async_histogram -#define GL_ASYNC_HISTOGRAM_SGIX 0x832C -#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D -#endif - -#ifndef GL_INTEL_texture_scissor -#endif - -#ifndef GL_INTEL_parallel_arrays -#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 -#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 -#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 -#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 -#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 -#endif - -#ifndef GL_HP_occlusion_test -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 -#define GL_PIXEL_MAG_FILTER_EXT 0x8331 -#define GL_PIXEL_MIN_FILTER_EXT 0x8332 -#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 -#define GL_CUBIC_EXT 0x8334 -#define GL_AVERAGE_EXT 0x8335 -#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 -#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 -#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 -#endif - -#ifndef GL_EXT_pixel_transform_color_table -#endif - -#ifndef GL_EXT_shared_texture_palette -#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 -#define GL_SINGLE_COLOR_EXT 0x81F9 -#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA -#endif - -#ifndef GL_EXT_secondary_color -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif - -#ifndef GL_EXT_texture_perturb_normal -#define GL_PERTURB_EXT 0x85AE -#define GL_TEXTURE_NORMAL_EXT 0x85AF -#endif - -#ifndef GL_EXT_multi_draw_arrays -#endif - -#ifndef GL_EXT_fog_coord -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif - -#ifndef GL_REND_screen_coordinates -#define GL_SCREEN_COORDINATES_REND 0x8490 -#define GL_INVERTED_SCREEN_W_REND 0x8491 -#endif - -#ifndef GL_EXT_coordinate_frame -#define GL_TANGENT_ARRAY_EXT 0x8439 -#define GL_BINORMAL_ARRAY_EXT 0x843A -#define GL_CURRENT_TANGENT_EXT 0x843B -#define GL_CURRENT_BINORMAL_EXT 0x843C -#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E -#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F -#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 -#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 -#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 -#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 -#define GL_MAP1_TANGENT_EXT 0x8444 -#define GL_MAP2_TANGENT_EXT 0x8445 -#define GL_MAP1_BINORMAL_EXT 0x8446 -#define GL_MAP2_BINORMAL_EXT 0x8447 -#endif - -#ifndef GL_EXT_texture_env_combine -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_TRANSFORM_HINT_APPLE 0x85B1 -#endif - -#ifndef GL_SUNX_constant_data -#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 -#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 -#endif - -#ifndef GL_SUN_global_alpha -#define GL_GLOBAL_ALPHA_SUN 0x81D9 -#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA -#endif - -#ifndef GL_SUN_triangle_list -#define GL_RESTART_SUN 0x0001 -#define GL_REPLACE_MIDDLE_SUN 0x0002 -#define GL_REPLACE_OLDEST_SUN 0x0003 -#define GL_TRIANGLE_LIST_SUN 0x81D7 -#define GL_REPLACEMENT_CODE_SUN 0x81D8 -#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 -#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 -#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 -#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 -#define GL_R1UI_V3F_SUN 0x85C4 -#define GL_R1UI_C4UB_V3F_SUN 0x85C5 -#define GL_R1UI_C3F_V3F_SUN 0x85C6 -#define GL_R1UI_N3F_V3F_SUN 0x85C7 -#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 -#define GL_R1UI_T2F_V3F_SUN 0x85C9 -#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA -#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB -#endif - -#ifndef GL_SUN_vertex -#endif - -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif - -#ifndef GL_INGR_color_clamp -#define GL_RED_MIN_CLAMP_INGR 0x8560 -#define GL_GREEN_MIN_CLAMP_INGR 0x8561 -#define GL_BLUE_MIN_CLAMP_INGR 0x8562 -#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 -#define GL_RED_MAX_CLAMP_INGR 0x8564 -#define GL_GREEN_MAX_CLAMP_INGR 0x8565 -#define GL_BLUE_MAX_CLAMP_INGR 0x8566 -#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INTERLACE_READ_INGR 0x8568 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_422_EXT 0x80CC -#define GL_422_REV_EXT 0x80CD -#define GL_422_AVERAGE_EXT 0x80CE -#define GL_422_REV_AVERAGE_EXT 0x80CF -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 -#endif - -#ifndef GL_EXT_texture_cube_map -#define GL_NORMAL_MAP_EXT 0x8511 -#define GL_REFLECTION_MAP_EXT 0x8512 -#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_WRAP_BORDER_SUN 0x81D4 -#endif - -#ifndef GL_EXT_texture_env_add -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 -#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 -#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 -#define GL_MODELVIEW1_MATRIX_EXT 0x8506 -#define GL_VERTEX_WEIGHTING_EXT 0x8509 -#define GL_MODELVIEW0_EXT 0x1700 -#define GL_MODELVIEW1_EXT 0x850A -#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B -#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C -#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D -#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E -#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F -#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_NV 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E -#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F -#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 -#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 -#endif - -#ifndef GL_NV_register_combiners -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 -/* reuse GL_TEXTURE0_ARB */ -/* reuse GL_TEXTURE1_ARB */ -/* reuse GL_ZERO */ -/* reuse GL_NONE */ -/* reuse GL_FOG */ -#endif - -#ifndef GL_NV_fog_distance -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C -/* reuse GL_EYE_PLANE */ -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_EMBOSS_LIGHT_NV 0x855D -#define GL_EMBOSS_CONSTANT_NV 0x855E -#define GL_EMBOSS_MAP_NV 0x855F -#endif - -#ifndef GL_NV_blend_square -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B -#endif - -#ifndef GL_MESA_resize_buffers -#endif - -#ifndef GL_MESA_window_pos -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_CULL_VERTEX_IBM 103050 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_VERTEX_ARRAY_LIST_IBM 103070 -#define GL_NORMAL_ARRAY_LIST_IBM 103071 -#define GL_COLOR_ARRAY_LIST_IBM 103072 -#define GL_INDEX_ARRAY_LIST_IBM 103073 -#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 -#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 -#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 -#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 -#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 -#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 -#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 -#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 -#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 -#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 -#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 -#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 -#endif - -#ifndef GL_SGIX_subsample -#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 -#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 -#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 -#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 -#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_YCRCB_SGIX 0x8318 -#define GL_YCRCBA_SGIX 0x8319 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 -#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 -#endif +#define GL_ARB_texture_storage_multisample 1 +#endif /* GL_ARB_texture_storage_multisample */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif /* GL_ARB_texture_swizzle */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 +#endif /* GL_ARB_texture_view */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#endif /* GL_ARB_timer_query */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#endif /* GL_ARB_transform_feedback2 */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#endif /* GL_ARB_transform_feedback3 */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED +#endif /* GL_ARB_transform_feedback_overflow_query */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); +#endif +#endif /* GL_ARB_transpose_matrix */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#endif /* GL_ARB_uniform_buffer_object */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif /* GL_ARB_vertex_array_bgra */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#endif /* GL_ARB_vertex_array_object */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 +#endif /* GL_ARB_vertex_attrib_binding */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); +#endif +#endif /* GL_ARB_vertex_blend */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +typedef ptrdiff_t GLsizeiptrARB; +typedef ptrdiff_t GLintptrARB; +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_ARB_vertex_buffer_object */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); +#endif +#endif /* GL_ARB_vertex_program */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); +#endif +#endif /* GL_ARB_vertex_shader */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +#endif /* GL_ARB_viewport_array */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); +#endif +#endif /* GL_ARB_window_pos */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendBarrierKHR (void); +#endif +#endif /* GL_KHR_blend_equation_advanced */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 +#endif /* GL_KHR_robust_buffer_access_behavior */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 +#endif /* GL_KHR_robustness */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); +typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y); +typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); +GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); +GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); +GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); +GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y); +GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z); +GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); +#endif +#endif /* GL_OES_byte_coordinates */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_fixed_point +#define GL_OES_fixed_point 1 +typedef GLint GLfixed; +#define GL_FIXED_OES 0x140C +typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); +typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); +typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); +typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); +typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); +typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); +typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); +typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); +typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); +typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); +typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); +typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); +typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); +typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); +typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); +typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); +typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); +typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); +typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); +GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); +GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); +GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); +GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); +GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLineWidthxOES (GLfixed width); +GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); +GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glPointSizexOES (GLfixed size); +GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); +GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert); +GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); +GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); +GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); +GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); +GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); +GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); +GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); +GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); +GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); +GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glIndexxOES (GLfixed component); +GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); +GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); +GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); +GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); +GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glPassThroughxOES (GLfixed token); +GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); +GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); +GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); +GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); +GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); +GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); +GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glVertex2xOES (GLfixed x); +GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); +#endif +#endif /* GL_OES_fixed_point */ + +#ifndef GL_OES_query_matrix +#define GL_OES_query_matrix 1 +typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); +#endif +#endif /* GL_OES_query_matrix */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif /* GL_OES_read_format */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); +typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); +GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); +GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); +GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); +GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#endif +#endif /* GL_OES_single_precision */ #ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 #define GL_MULTISAMPLE_3DFX 0x86B2 #define GL_SAMPLE_BUFFERS_3DFX 0x86B3 #define GL_SAMPLES_3DFX 0x86B4 #define GL_MULTISAMPLE_BIT_3DFX 0x20000000 -#endif +#endif /* GL_3DFX_multisample */ #ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); #endif +#endif /* GL_3DFX_tbuffer */ -#ifndef GL_EXT_multisample -#define GL_MULTISAMPLE_EXT 0x809D -#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F -#define GL_SAMPLE_MASK_EXT 0x80A0 -#define GL_1PASS_EXT 0x80A1 -#define GL_2PASS_0_EXT 0x80A2 -#define GL_2PASS_1_EXT 0x80A3 -#define GL_4PASS_0_EXT 0x80A4 -#define GL_4PASS_1_EXT 0x80A5 -#define GL_4PASS_2_EXT 0x80A6 -#define GL_4PASS_3_EXT 0x80A7 -#define GL_SAMPLE_BUFFERS_EXT 0x80A8 -#define GL_SAMPLES_EXT 0x80A9 -#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA -#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB -#define GL_SAMPLE_PATTERN_EXT 0x80AC -#define GL_MULTISAMPLE_BIT_EXT 0x20000000 -#endif +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif /* GL_3DFX_texture_compression_FXT1 */ -#ifndef GL_SGIX_vertex_preclip -#define GL_VERTEX_PRECLIP_SGIX 0x83EE -#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF -#endif +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_AMD_blend_minmax_factor */ -#ifndef GL_SGIX_convolution_accuracy -#define GL_CONVOLUTION_HINT_SGIX 0x8316 -#endif +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif /* GL_AMD_conservative_depth */ -#ifndef GL_SGIX_resample -#define GL_PACK_RESAMPLE_SGIX 0x842C -#define GL_UNPACK_RESAMPLE_SGIX 0x842D -#define GL_RESAMPLE_REPLICATE_SGIX 0x842E -#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F -#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); #endif +#endif /* GL_AMD_debug_output */ -#ifndef GL_SGIS_point_line_texgen -#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 -#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 -#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 -#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 -#define GL_EYE_POINT_SGIS 0x81F4 -#define GL_OBJECT_POINT_SGIS 0x81F5 -#define GL_EYE_LINE_SGIS 0x81F6 -#define GL_OBJECT_LINE_SGIS 0x81F7 -#endif +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F +#endif /* GL_AMD_depth_clamp_separate */ -#ifndef GL_SGIS_texture_color_mask -#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); #endif +#endif /* GL_AMD_draw_buffers_blend */ -#ifndef GL_EXT_texture_env_dot3 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 +#endif /* GL_AMD_gcn_shader */ -#ifndef GL_ATI_texture_mirror_once -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 +typedef int64_t GLint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); #endif +#endif /* GL_AMD_gpu_shader_int64 */ -#ifndef GL_NV_fence -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); #endif +#endif /* GL_AMD_interleaved_elements */ -#ifndef GL_IBM_static_data -#define GL_ALL_STATIC_DATA_IBM 103060 -#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); #endif +#endif /* GL_AMD_multi_draw_indirect */ -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_MIRRORED_REPEAT_IBM 0x8370 +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); #endif +#endif /* GL_AMD_name_gen_delete */ -#ifndef GL_NV_evaluators -#define GL_EVAL_2D_NV 0x86C0 -#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 -#define GL_MAP_TESSELLATION_NV 0x86C2 -#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 -#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 -#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 -#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 -#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 -#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 -#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 -#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA -#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB -#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC -#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD -#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE -#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF -#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 -#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 -#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 -#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 -#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 -#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 -#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 -#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); #endif +#endif /* GL_AMD_occlusion_query_event */ -#ifndef GL_NV_packed_depth_stencil -#define GL_DEPTH_STENCIL_NV 0x84F9 -#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); #endif +#endif /* GL_AMD_performance_monitor */ -#ifndef GL_NV_register_combiners2 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 -#endif +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 +#endif /* GL_AMD_pinned_memory */ -#ifndef GL_NV_texture_compression_vtc -#endif +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#endif /* GL_AMD_query_buffer_object */ -#ifndef GL_NV_texture_rectangle -#define GL_TEXTURE_RECTANGLE_NV 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); #endif +#endif /* GL_AMD_sample_positions */ -#ifndef GL_NV_texture_shader -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F -#endif +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif /* GL_AMD_seamless_cubemap_per_texture */ -#ifndef GL_NV_texture_shader2 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 +#endif /* GL_AMD_shader_atomic_counter_ops */ -#ifndef GL_NV_vertex_array_range2 -#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 -#endif +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif /* GL_AMD_shader_stencil_export */ -#ifndef GL_NV_vertex_program -#define GL_VERTEX_PROGRAM_NV 0x8620 -#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 -#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 -#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 -#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 -#define GL_CURRENT_ATTRIB_NV 0x8626 -#define GL_PROGRAM_LENGTH_NV 0x8627 -#define GL_PROGRAM_STRING_NV 0x8628 -#define GL_MODELVIEW_PROJECTION_NV 0x8629 -#define GL_IDENTITY_NV 0x862A -#define GL_INVERSE_NV 0x862B -#define GL_TRANSPOSE_NV 0x862C -#define GL_INVERSE_TRANSPOSE_NV 0x862D -#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E -#define GL_MAX_TRACK_MATRICES_NV 0x862F -#define GL_MATRIX0_NV 0x8630 -#define GL_MATRIX1_NV 0x8631 -#define GL_MATRIX2_NV 0x8632 -#define GL_MATRIX3_NV 0x8633 -#define GL_MATRIX4_NV 0x8634 -#define GL_MATRIX5_NV 0x8635 -#define GL_MATRIX6_NV 0x8636 -#define GL_MATRIX7_NV 0x8637 -#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 -#define GL_CURRENT_MATRIX_NV 0x8641 -#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 -#define GL_PROGRAM_PARAMETER_NV 0x8644 -#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 -#define GL_PROGRAM_TARGET_NV 0x8646 -#define GL_PROGRAM_RESIDENT_NV 0x8647 -#define GL_TRACK_MATRIX_NV 0x8648 -#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 -#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A -#define GL_PROGRAM_ERROR_POSITION_NV 0x864B -#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 -#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 -#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 -#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 -#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 -#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 -#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 -#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 -#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 -#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 -#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A -#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B -#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C -#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D -#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E -#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F -#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 -#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 -#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 -#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 -#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 -#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 -#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 -#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 -#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 -#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 -#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A -#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B -#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C -#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D -#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E -#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F -#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 -#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 -#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 -#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 -#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 -#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 -#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 -#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 -#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 -#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 -#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A -#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B -#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C -#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D -#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E -#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F -#endif +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 +#endif /* GL_AMD_shader_trinary_minmax */ -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 -#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A -#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); #endif +#endif /* GL_AMD_sparse_texture */ -#ifndef GL_SGIX_scalebias_hint -#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); #endif +#endif /* GL_AMD_stencil_operation_extended */ -#ifndef GL_OML_interlace -#define GL_INTERLACE_OML 0x8980 -#define GL_INTERLACE_READ_OML 0x8981 -#endif +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif /* GL_AMD_texture_texture4 */ -#ifndef GL_OML_subsample -#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 -#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 -#endif +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif /* GL_AMD_transform_feedback3_lines_triangles */ -#ifndef GL_OML_resample -#define GL_PACK_RESAMPLE_OML 0x8984 -#define GL_UNPACK_RESAMPLE_OML 0x8985 -#define GL_RESAMPLE_REPLICATE_OML 0x8986 -#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 -#define GL_RESAMPLE_AVERAGE_OML 0x8988 -#define GL_RESAMPLE_DECIMATE_OML 0x8989 -#endif +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 +#endif /* GL_AMD_transform_feedback4 */ -#ifndef GL_NV_copy_depth_to_color -#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E -#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 +#endif /* GL_AMD_vertex_shader_layer */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); #endif +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 +#endif /* GL_AMD_vertex_shader_viewport_index */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif /* GL_APPLE_aux_depth_stencil */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif /* GL_APPLE_client_storage */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif +#endif /* GL_APPLE_element_array */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); +#endif +#endif /* GL_APPLE_fence */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif /* GL_APPLE_float_pixels */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_APPLE_flush_buffer_range */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif +#endif /* GL_APPLE_object_purgeable */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif /* GL_APPLE_row_bytes */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif /* GL_APPLE_specular_vector */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_APPLE_texture_range */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif /* GL_APPLE_transform_hint */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); +#endif +#endif /* GL_APPLE_vertex_array_object */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); +#endif +#endif /* GL_APPLE_vertex_array_range */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define GL_YCBCR_422_APPLE 0x85B9 +#endif /* GL_APPLE_ycbcr_422 */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ATI_draw_buffers */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif +#endif /* GL_ATI_element_array */ #ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 #define GL_BUMP_ROT_MATRIX_ATI 0x8775 #define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 #define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 @@ -4512,9 +5745,20 @@ extern "C" { #define GL_DU8DV8_ATI 0x877A #define GL_BUMP_ENVMAP_ATI 0x877B #define GL_BUMP_TARGET_ATI 0x877C +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); #endif +#endif /* GL_ATI_envmap_bumpmap */ #ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 #define GL_FRAGMENT_SHADER_ATI 0x8920 #define GL_REG_0_ATI 0x8921 #define GL_REG_1_ATI 0x8922 @@ -4619,9 +5863,63 @@ extern "C" { #define GL_COMP_BIT_ATI 0x00000002 #define GL_NEGATE_BIT_ATI 0x00000004 #define GL_BIAS_BIT_ATI 0x00000008 +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); #endif +#endif /* GL_ATI_fragment_shader */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); +#endif +#endif /* GL_ATI_map_object_buffer */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif /* GL_ATI_meminfo */ + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif /* GL_ATI_pixel_format_float */ #ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 #define GL_PN_TRIANGLES_ATI 0x87F0 #define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 #define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 @@ -4631,9 +5929,64 @@ extern "C" { #define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 #define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 #define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); #endif +#endif /* GL_ATI_pn_triangles */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif +#endif /* GL_ATI_separate_stencil */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif /* GL_ATI_text_fragment_shader */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif /* GL_ATI_texture_env_combine3 */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif /* GL_ATI_texture_float */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif /* GL_ATI_texture_mirror_once */ #ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 #define GL_STATIC_ATI 0x8760 #define GL_DYNAMIC_ATI 0x8761 #define GL_PRESERVE_ATI 0x8762 @@ -4642,9 +5995,2238 @@ extern "C" { #define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 #define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 #define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); #endif +#endif /* GL_ATI_vertex_array_object */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_vertex_streams */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif /* GL_EXT_422_pixels */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#define GL_ABGR_EXT 0x8000 +#endif /* GL_EXT_abgr */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif /* GL_EXT_bgra */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); +#endif +#endif /* GL_EXT_bindable_uniform */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#endif +#endif /* GL_EXT_blend_color */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_EXT_blend_equation_separate */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_EXT_blend_func_separate */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif /* GL_EXT_blend_logic_op */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_BLEND_EQUATION_EXT 0x8009 +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); +#endif +#endif /* GL_EXT_blend_minmax */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif /* GL_EXT_blend_subtract */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif /* GL_EXT_clip_volume_hint */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif /* GL_EXT_cmyka */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif +#endif /* GL_EXT_color_subtable */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif +#endif /* GL_EXT_compiled_vertex_array */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#endif +#endif /* GL_EXT_convolution */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_coordinate_frame */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_copy_texture */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_cull_vertex */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_EXT_debug_label */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPopGroupMarkerEXT (void); +#endif +#endif /* GL_EXT_debug_marker */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); +#endif +#endif /* GL_EXT_depth_bounds_test */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); +typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); +GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); +GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident); +GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_direct_state_access */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#endif +#endif /* GL_EXT_draw_buffers2 */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_EXT_draw_instanced */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#endif +#endif /* GL_EXT_draw_range_elements */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_fog_coord */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_EXT_framebuffer_blit */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_framebuffer_multisample */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); +#endif +#endif /* GL_EXT_framebuffer_object */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif /* GL_EXT_framebuffer_sRGB */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +#endif +#endif /* GL_EXT_geometry_shader4 */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif +#endif /* GL_EXT_gpu_program_parameters */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +#endif +#endif /* GL_EXT_gpu_shader4 */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); +#endif +#endif /* GL_EXT_histogram */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif /* GL_EXT_index_array_formats */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); +#endif +#endif /* GL_EXT_index_func */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_index_material */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif /* GL_EXT_index_texture */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_light_texture */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif /* GL_EXT_misc_attribute */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#endif +#endif /* GL_EXT_multi_draw_arrays */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); +#endif +#endif /* GL_EXT_multisample */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif /* GL_EXT_packed_depth_stencil */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif /* GL_EXT_packed_float */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif /* GL_EXT_packed_pixels */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_paletted_texture */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif /* GL_EXT_pixel_buffer_object */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_pixel_transform */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif /* GL_EXT_pixel_transform_color_table */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_EXT_point_parameters */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); +#endif +#endif /* GL_EXT_polygon_offset */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); +#endif +#endif /* GL_EXT_polygon_offset_clamp */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 +#endif /* GL_EXT_post_depth_coverage */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif +#endif /* GL_EXT_provoking_vertex */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); +#endif +#endif /* GL_EXT_raster_multisample */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif /* GL_EXT_rescale_normal */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_secondary_color */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); +#endif +#endif /* GL_EXT_separate_shader_objects */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif /* GL_EXT_separate_specular_color */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 +#endif /* GL_EXT_shader_image_load_formatted */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); +#endif +#endif /* GL_EXT_shader_image_load_store */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif /* GL_EXT_shadow_funcs */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif /* GL_EXT_shared_texture_palette */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 +#endif /* GL_EXT_sparse_texture2 */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); +#endif +#endif /* GL_EXT_stencil_clear_tag */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); +#endif +#endif /* GL_EXT_stencil_two_side */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif /* GL_EXT_stencil_wrap */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_subtexture */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif /* GL_EXT_texture */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_texture3D */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#endif +#endif /* GL_EXT_texture_array */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_EXT_texture_buffer_object */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif /* GL_EXT_texture_compression_latc */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif /* GL_EXT_texture_cube_map */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif /* GL_EXT_texture_env_add */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif /* GL_EXT_texture_env_combine */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif /* GL_EXT_texture_env_dot3 */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 +#endif /* GL_EXT_texture_filter_minmax */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif +#endif /* GL_EXT_texture_integer */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif /* GL_EXT_texture_lod_bias */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif /* GL_EXT_texture_mirror_clamp */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif +#endif /* GL_EXT_texture_object */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); +#endif +#endif /* GL_EXT_texture_perturb_normal */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_sRGB */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif /* GL_EXT_texture_shared_exponent */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#endif /* GL_EXT_texture_snorm */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif /* GL_EXT_texture_swizzle */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#define GL_TIME_ELAPSED_EXT 0x88BF +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_EXT_timer_query */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackEXT (void); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#endif +#endif /* GL_EXT_transform_feedback */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#endif +#endif /* GL_EXT_vertex_array */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#endif /* GL_EXT_vertex_array_bgra */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +#endif +#endif /* GL_EXT_vertex_attrib_64bit */ #ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 #define GL_VERTEX_SHADER_EXT 0x8780 #define GL_VERTEX_SHADER_BINDING_EXT 0x8781 #define GL_OP_INDEX_EXT 0x8782 @@ -4755,183 +8337,785 @@ extern "C" { #define GL_INVARIANT_DATATYPE_EXT 0x87EB #define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC #define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); #endif +#endif /* GL_EXT_vertex_shader */ -#ifndef GL_ATI_vertex_streams -#define GL_MAX_VERTEX_STREAMS_ATI 0x876B -#define GL_VERTEX_STREAM0_ATI 0x876C -#define GL_VERTEX_STREAM1_ATI 0x876D -#define GL_VERTEX_STREAM2_ATI 0x876E -#define GL_VERTEX_STREAM3_ATI 0x876F -#define GL_VERTEX_STREAM4_ATI 0x8770 -#define GL_VERTEX_STREAM5_ATI 0x8771 -#define GL_VERTEX_STREAM6_ATI 0x8772 -#define GL_VERTEX_STREAM7_ATI 0x8773 -#define GL_VERTEX_SOURCE_ATI 0x8774 +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); #endif +#endif /* GL_EXT_vertex_weighting */ -#ifndef GL_ATI_element_array -#define GL_ELEMENT_ARRAY_ATI 0x8768 -#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 -#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); #endif +#endif /* GL_EXT_x11_sync_object */ -#ifndef GL_SUN_mesh_array -#define GL_QUAD_MESH_SUN 0x8614 -#define GL_TRIANGLE_MESH_SUN 0x8615 +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); #endif +#endif /* GL_GREMEDY_frame_terminator */ -#ifndef GL_SUN_slice_accum -#define GL_SLICE_ACCUM_SUN 0x85CC +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); #endif +#endif /* GL_GREMEDY_string_marker */ -#ifndef GL_NV_multisample_filter_hint -#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif /* GL_HP_convolution_border_modes */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); #endif +#endif /* GL_HP_image_transform */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif /* GL_HP_occlusion_test */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif /* GL_HP_texture_lighting */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#define GL_CULL_VERTEX_IBM 103050 +#endif /* GL_IBM_cull_vertex */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#endif +#endif /* GL_IBM_multimode_draw_arrays */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif /* GL_IBM_rasterpos_clip */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); +#endif +#endif /* GL_IBM_static_data */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif /* GL_IBM_texture_mirrored_repeat */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#endif +#endif /* GL_IBM_vertex_array_lists */ + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_INGR_blend_func_separate */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif /* GL_INGR_color_clamp */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#define GL_INTERLACE_READ_INGR 0x8568 +#endif /* GL_INGR_interlace_read */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 +#endif /* GL_INTEL_fragment_shader_ordering */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); +typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); +GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); +GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#endif +#endif /* GL_INTEL_map_texture */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); +#endif +#endif /* GL_INTEL_parallel_arrays */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, GLvoid *data, GLuint *bytesWritten); +GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif /* GL_MESAX_texture_stack */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#define GL_PACK_INVERT_MESA 0x8758 +#endif /* GL_MESA_pack_invert */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif +#endif /* GL_MESA_resize_buffers */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); +#endif +#endif /* GL_MESA_window_pos */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif /* GL_MESA_ycbcr_texture */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); +GLAPI void APIENTRY glEndConditionalRenderNVX (void); +#endif +#endif /* GL_NVX_conditional_render */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#endif /* GL_NVX_gpu_memory_info */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect */ + +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GLAPI void APIENTRY glBlendBarrierNV (void); +#endif +#endif /* GL_NV_blend_equation_advanced */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif /* GL_NV_blend_square */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#endif /* GL_NV_compute_program5 */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); +#endif +#endif /* GL_NV_conservative_raster */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif /* GL_NV_copy_depth_to_color */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_NV_copy_image */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 +#endif /* GL_NV_deep_texture3D */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); +#endif +#endif /* GL_NV_depth_buffer_float */ #ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 #define GL_DEPTH_CLAMP_NV 0x864F -#endif +#endif /* GL_NV_depth_clamp */ -#ifndef GL_NV_occlusion_query -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 +typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); #endif +#endif /* GL_NV_draw_texture */ -#ifndef GL_NV_point_sprite -#define GL_POINT_SPRITE_NV 0x8861 -#define GL_COORD_REPLACE_NV 0x8862 -#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); #endif +#endif /* GL_NV_evaluators */ -#ifndef GL_NV_texture_shader3 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); #endif +#endif /* GL_NV_explicit_multisample */ -#ifndef GL_NV_vertex_program1_1 +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); #endif +#endif /* GL_NV_fence */ -#ifndef GL_EXT_shadow_funcs -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif - -#ifndef GL_APPLE_element_array -#define GL_ELEMENT_ARRAY_APPLE 0x8A0C -#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D -#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E -#endif - -#ifndef GL_APPLE_fence -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D -#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E -#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F -#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 -#define GL_STORAGE_CLIENT_APPLE 0x85B4 -#define GL_STORAGE_CACHED_APPLE 0x85BE -#define GL_STORAGE_SHARED_APPLE 0x85BF -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_YCBCR_422_APPLE 0x85B9 -#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -#ifndef GL_S3_s3tc -#define GL_RGB_S3TC 0x83A0 -#define GL_RGB4_S3TC 0x83A1 -#define GL_RGBA_S3TC 0x83A2 -#define GL_RGBA4_S3TC 0x83A3 -#define GL_RGBA_DXT5_S3TC 0x83A4 -#define GL_RGBA4_DXT5_S3TC 0x83A5 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 -#define GL_DRAW_BUFFER0_ATI 0x8825 -#define GL_DRAW_BUFFER1_ATI 0x8826 -#define GL_DRAW_BUFFER2_ATI 0x8827 -#define GL_DRAW_BUFFER3_ATI 0x8828 -#define GL_DRAW_BUFFER4_ATI 0x8829 -#define GL_DRAW_BUFFER5_ATI 0x882A -#define GL_DRAW_BUFFER6_ATI 0x882B -#define GL_DRAW_BUFFER7_ATI 0x882C -#define GL_DRAW_BUFFER8_ATI 0x882D -#define GL_DRAW_BUFFER9_ATI 0x882E -#define GL_DRAW_BUFFER10_ATI 0x882F -#define GL_DRAW_BUFFER11_ATI 0x8830 -#define GL_DRAW_BUFFER12_ATI 0x8831 -#define GL_DRAW_BUFFER13_ATI 0x8832 -#define GL_DRAW_BUFFER14_ATI 0x8833 -#define GL_DRAW_BUFFER15_ATI 0x8834 -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_RGBA_FLOAT_MODE_ATI 0x8820 -#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -#endif - -#ifndef GL_ATI_texture_float -#define GL_RGBA_FLOAT32_ATI 0x8814 -#define GL_RGB_FLOAT32_ATI 0x8815 -#define GL_ALPHA_FLOAT32_ATI 0x8816 -#define GL_INTENSITY_FLOAT32_ATI 0x8817 -#define GL_LUMINANCE_FLOAT32_ATI 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 -#define GL_RGBA_FLOAT16_ATI 0x881A -#define GL_RGB_FLOAT16_ATI 0x881B -#define GL_ALPHA_FLOAT16_ATI 0x881C -#define GL_INTENSITY_FLOAT16_ATI 0x881D -#define GL_LUMINANCE_FLOAT16_ATI 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F -#endif +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 +#define GL_FILL_RECTANGLE_NV 0x933C +#endif /* GL_NV_fill_rectangle */ #ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 #define GL_FLOAT_R_NV 0x8880 #define GL_FLOAT_RG_NV 0x8881 #define GL_FLOAT_RGB_NV 0x8882 @@ -4947,262 +9131,127 @@ extern "C" { #define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C #define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D #define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif /* GL_NV_float_buffer */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#endif /* GL_NV_fog_distance */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); #endif +#endif /* GL_NV_fragment_coverage_to_color */ #ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 #define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 #define GL_FRAGMENT_PROGRAM_NV 0x8870 #define GL_MAX_TEXTURE_COORDS_NV 0x8871 #define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 #define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 #define GL_PROGRAM_ERROR_STRING_NV 0x8874 +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); #endif - -#ifndef GL_NV_half_float -#define GL_HALF_FLOAT_NV 0x140B -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 -#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 -#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A -#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B -#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C -#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D -#endif - -#ifndef GL_NV_primitive_restart -#define GL_PRIMITIVE_RESTART_NV 0x8558 -#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F -#endif - -#ifndef GL_NV_vertex_program2 -#endif - -#ifndef GL_ATI_map_object_buffer -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#endif - -#ifndef GL_OES_byte_coordinates -#endif - -#ifndef GL_OES_fixed_point -#define GL_FIXED_OES 0x140C -#endif - -#ifndef GL_OES_single_precision -#endif - -#ifndef GL_OES_compressed_paletted_texture -#define GL_PALETTE4_RGB8_OES 0x8B90 -#define GL_PALETTE4_RGBA8_OES 0x8B91 -#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 -#define GL_PALETTE4_RGBA4_OES 0x8B93 -#define GL_PALETTE4_RGB5_A1_OES 0x8B94 -#define GL_PALETTE8_RGB8_OES 0x8B95 -#define GL_PALETTE8_RGBA8_OES 0x8B96 -#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 -#define GL_PALETTE8_RGBA4_OES 0x8B98 -#define GL_PALETTE8_RGB5_A1_OES 0x8B99 -#endif - -#ifndef GL_OES_read_format -#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A -#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B -#endif - -#ifndef GL_OES_query_matrix -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 -#define GL_DEPTH_BOUNDS_EXT 0x8891 -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_MIRROR_CLAMP_EXT 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 -#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_BLEND_EQUATION_RGB_EXT 0x8009 -#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D -#endif - -#ifndef GL_MESA_pack_invert -#define GL_PACK_INVERT_MESA 0x8758 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA -#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB -#define GL_YCBCR_MESA 0x8757 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF -#endif - -#ifndef GL_NV_fragment_program_option -#endif +#endif /* GL_NV_fragment_program */ #ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 #define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 #define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 #define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 #define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 #define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 -#endif +#endif /* GL_NV_fragment_program2 */ -#ifndef GL_NV_vertex_program2_option -/* reuse GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */ -/* reuse GL_MAX_PROGRAM_CALL_DEPTH_NV */ -#endif +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 +#endif /* GL_NV_fragment_program4 */ -#ifndef GL_NV_vertex_program3 -/* reuse GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */ -#endif +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif /* GL_NV_fragment_program_option */ -#ifndef GL_EXT_framebuffer_object -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#endif +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 +#endif /* GL_NV_fragment_shader_interlock */ -#ifndef GL_GREMEDY_string_marker +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat *v); +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); +GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufsize, GLfloat *v); +GLAPI void APIENTRY glCoverageModulationNV (GLenum components); #endif +#endif /* GL_NV_framebuffer_mixed_samples */ -#ifndef GL_EXT_packed_depth_stencil -#define GL_DEPTH_STENCIL_EXT 0x84F9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84FA -#define GL_DEPTH24_STENCIL8_EXT 0x88F0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); #endif +#endif /* GL_NV_framebuffer_multisample_coverage */ -#ifndef GL_EXT_stencil_clear_tag -#define GL_STENCIL_TAG_BITS_EXT 0x88F2 -#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); #endif +#endif /* GL_NV_geometry_program4 */ -#ifndef GL_EXT_texture_sRGB -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#endif /* GL_NV_geometry_shader4 */ -#ifndef GL_EXT_framebuffer_blit -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA -#endif - -#ifndef GL_EXT_framebuffer_multisample -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 -#define GL_MAX_SAMPLES_EXT 0x8D57 -#endif - -#ifndef GL_MESAX_texture_stack -#define GL_TEXTURE_1D_STACK_MESAX 0x8759 -#define GL_TEXTURE_2D_STACK_MESAX 0x875A -#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B -#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C -#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D -#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E -#endif - -#ifndef GL_EXT_timer_query -#define GL_TIME_ELAPSED_EXT 0x88BF -#endif - -#ifndef GL_EXT_gpu_program_parameters -#endif - -#ifndef GL_APPLE_flush_buffer_range -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 -#endif +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 +#endif /* GL_NV_geometry_shader_passthrough */ #ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 #define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 #define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 #define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 @@ -5211,629 +9260,44 @@ extern "C" { #define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 #define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 #define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); #endif - -#ifndef GL_NV_geometry_program4 -#define GL_LINES_ADJACENCY_EXT 0x000A -#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B -#define GL_TRIANGLES_ADJACENCY_EXT 0x000C -#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D -#define GL_GEOMETRY_PROGRAM_NV 0x8C26 -#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 -#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 -#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA -#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB -#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 -#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 -#endif - -#ifndef GL_EXT_geometry_shader4 -#define GL_GEOMETRY_SHADER_EXT 0x8DD9 -/* reuse GL_GEOMETRY_VERTICES_OUT_EXT */ -/* reuse GL_GEOMETRY_INPUT_TYPE_EXT */ -/* reuse GL_GEOMETRY_OUTPUT_TYPE_EXT */ -/* reuse GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT */ -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD -#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE -#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 -/* reuse GL_LINES_ADJACENCY_EXT */ -/* reuse GL_LINE_STRIP_ADJACENCY_EXT */ -/* reuse GL_TRIANGLES_ADJACENCY_EXT */ -/* reuse GL_TRIANGLE_STRIP_ADJACENCY_EXT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT */ -/* reuse GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT */ -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ -/* reuse GL_PROGRAM_POINT_SIZE_EXT */ -#endif - -#ifndef GL_NV_vertex_program4 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD -#endif - -#ifndef GL_EXT_gpu_shader4 -#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 -#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 -#define GL_SAMPLER_BUFFER_EXT 0x8DC2 -#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 -#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 -#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 -#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 -#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 -#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 -#define GL_INT_SAMPLER_1D_EXT 0x8DC9 -#define GL_INT_SAMPLER_2D_EXT 0x8DCA -#define GL_INT_SAMPLER_3D_EXT 0x8DCB -#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC -#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD -#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE -#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF -#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 -#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 -#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 -#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 -#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 -#endif - -#ifndef GL_EXT_draw_instanced -#endif - -#ifndef GL_EXT_packed_float -#define GL_R11F_G11F_B10F_EXT 0x8C3A -#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B -#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C -#endif - -#ifndef GL_EXT_texture_array -#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 -#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 -#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A -#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B -#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C -#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D -#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF -#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E -/* reuse GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */ -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_TEXTURE_BUFFER_EXT 0x8C2A -#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B -#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C -#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D -#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 -#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 -#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 -#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_RGB9_E5_EXT 0x8C3D -#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E -#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F -#endif - -#ifndef GL_NV_depth_buffer_float -#define GL_DEPTH_COMPONENT32F_NV 0x8DAB -#define GL_DEPTH32F_STENCIL8_NV 0x8DAC -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD -#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF -#endif - -#ifndef GL_NV_fragment_program4 -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB -#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 -#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 -#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 -#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA -#endif - -#ifndef GL_NV_geometry_shader4 -#endif - -#ifndef GL_NV_parameter_buffer_object -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 -#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 -#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 -#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 -#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 -#endif - -#ifndef GL_EXT_draw_buffers2 -#endif - -#ifndef GL_NV_transform_feedback -#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 -#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 -#define GL_TEXTURE_COORD_NV 0x8C79 -#define GL_CLIP_DISTANCE_NV 0x8C7A -#define GL_VERTEX_ID_NV 0x8C7B -#define GL_PRIMITIVE_ID_NV 0x8C7C -#define GL_GENERIC_ATTRIB_NV 0x8C7D -#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 -#define GL_ACTIVE_VARYINGS_NV 0x8C81 -#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 -#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 -#define GL_PRIMITIVES_GENERATED_NV 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 -#define GL_RASTERIZER_DISCARD_NV 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B -#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C -#define GL_SEPARATE_ATTRIBS_NV 0x8C8D -#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F -#define GL_LAYER_NV 0x8DAA -#define GL_NEXT_BUFFER_NV -2 -#define GL_SKIP_COMPONENTS4_NV -3 -#define GL_SKIP_COMPONENTS3_NV -4 -#define GL_SKIP_COMPONENTS2_NV -5 -#define GL_SKIP_COMPONENTS1_NV -6 -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 -#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 -#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 -#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED -#define GL_UNIFORM_BUFFER_EXT 0x8DEE -#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF -#endif - -#ifndef GL_EXT_texture_integer -#define GL_RGBA32UI_EXT 0x8D70 -#define GL_RGB32UI_EXT 0x8D71 -#define GL_ALPHA32UI_EXT 0x8D72 -#define GL_INTENSITY32UI_EXT 0x8D73 -#define GL_LUMINANCE32UI_EXT 0x8D74 -#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 -#define GL_RGBA16UI_EXT 0x8D76 -#define GL_RGB16UI_EXT 0x8D77 -#define GL_ALPHA16UI_EXT 0x8D78 -#define GL_INTENSITY16UI_EXT 0x8D79 -#define GL_LUMINANCE16UI_EXT 0x8D7A -#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B -#define GL_RGBA8UI_EXT 0x8D7C -#define GL_RGB8UI_EXT 0x8D7D -#define GL_ALPHA8UI_EXT 0x8D7E -#define GL_INTENSITY8UI_EXT 0x8D7F -#define GL_LUMINANCE8UI_EXT 0x8D80 -#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 -#define GL_RGBA32I_EXT 0x8D82 -#define GL_RGB32I_EXT 0x8D83 -#define GL_ALPHA32I_EXT 0x8D84 -#define GL_INTENSITY32I_EXT 0x8D85 -#define GL_LUMINANCE32I_EXT 0x8D86 -#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 -#define GL_RGBA16I_EXT 0x8D88 -#define GL_RGB16I_EXT 0x8D89 -#define GL_ALPHA16I_EXT 0x8D8A -#define GL_INTENSITY16I_EXT 0x8D8B -#define GL_LUMINANCE16I_EXT 0x8D8C -#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D -#define GL_RGBA8I_EXT 0x8D8E -#define GL_RGB8I_EXT 0x8D8F -#define GL_ALPHA8I_EXT 0x8D90 -#define GL_INTENSITY8I_EXT 0x8D91 -#define GL_LUMINANCE8I_EXT 0x8D92 -#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 -#define GL_RED_INTEGER_EXT 0x8D94 -#define GL_GREEN_INTEGER_EXT 0x8D95 -#define GL_BLUE_INTEGER_EXT 0x8D96 -#define GL_ALPHA_INTEGER_EXT 0x8D97 -#define GL_RGB_INTEGER_EXT 0x8D98 -#define GL_RGBA_INTEGER_EXT 0x8D99 -#define GL_BGR_INTEGER_EXT 0x8D9A -#define GL_BGRA_INTEGER_EXT 0x8D9B -#define GL_LUMINANCE_INTEGER_EXT 0x8D9C -#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D -#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E -#endif - -#ifndef GL_GREMEDY_frame_terminator -#endif - -#ifndef GL_NV_conditional_render -#define GL_QUERY_WAIT_NV 0x8E13 -#define GL_QUERY_NO_WAIT_NV 0x8E14 -#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 -#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 -#endif - -#ifndef GL_NV_present_video -#define GL_FRAME_NV 0x8E26 -#define GL_FIELDS_NV 0x8E27 -#define GL_CURRENT_TIME_NV 0x8E28 -#define GL_NUM_FILL_STREAMS_NV 0x8E29 -#define GL_PRESENT_TIME_NV 0x8E2A -#define GL_PRESENT_DURATION_NV 0x8E2B -#endif - -#ifndef GL_EXT_transform_feedback -#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E -#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 -#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 -#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F -#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C -#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D -#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 -#define GL_RASTERIZER_DISCARD_EXT 0x8C89 -#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B -#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 -#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 -#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 -#endif - -#ifndef GL_EXT_direct_state_access -#define GL_PROGRAM_MATRIX_EXT 0x8E2D -#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E -#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F -#endif - -#ifndef GL_EXT_vertex_array_bgra -/* reuse GL_BGRA */ -#endif - -#ifndef GL_EXT_texture_swizzle -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 -#endif - -#ifndef GL_NV_explicit_multisample -#define GL_SAMPLE_POSITION_NV 0x8E50 -#define GL_SAMPLE_MASK_NV 0x8E51 -#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 -#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 -#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 -#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 -#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 -#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 -#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 -#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 -#endif - -#ifndef GL_NV_transform_feedback2 -#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 -#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 -#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 -#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 -#endif - -#ifndef GL_ATI_meminfo -#define GL_VBO_FREE_MEMORY_ATI 0x87FB -#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC -#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD -#endif - -#ifndef GL_AMD_performance_monitor -#define GL_COUNTER_TYPE_AMD 0x8BC0 -#define GL_COUNTER_RANGE_AMD 0x8BC1 -#define GL_UNSIGNED_INT64_AMD 0x8BC2 -#define GL_PERCENTAGE_AMD 0x8BC3 -#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 -#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 -#define GL_PERFMON_RESULT_AMD 0x8BC6 -#endif - -#ifndef GL_AMD_texture_texture4 -#endif - -#ifndef GL_AMD_vertex_shader_tessellator -#define GL_SAMPLER_BUFFER_AMD 0x9001 -#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 -#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 -#define GL_TESSELLATION_MODE_AMD 0x9004 -#define GL_TESSELLATION_FACTOR_AMD 0x9005 -#define GL_DISCRETE_AMD 0x9006 -#define GL_CONTINUOUS_AMD 0x9007 -#endif - -#ifndef GL_EXT_provoking_vertex -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C -#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D -#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E -#define GL_PROVOKING_VERTEX_EXT 0x8E4F -#endif - -#ifndef GL_EXT_texture_snorm -#define GL_ALPHA_SNORM 0x9010 -#define GL_LUMINANCE_SNORM 0x9011 -#define GL_LUMINANCE_ALPHA_SNORM 0x9012 -#define GL_INTENSITY_SNORM 0x9013 -#define GL_ALPHA8_SNORM 0x9014 -#define GL_LUMINANCE8_SNORM 0x9015 -#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 -#define GL_INTENSITY8_SNORM 0x9017 -#define GL_ALPHA16_SNORM 0x9018 -#define GL_LUMINANCE16_SNORM 0x9019 -#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A -#define GL_INTENSITY16_SNORM 0x901B -/* reuse GL_RED_SNORM */ -/* reuse GL_RG_SNORM */ -/* reuse GL_RGB_SNORM */ -/* reuse GL_RGBA_SNORM */ -/* reuse GL_R8_SNORM */ -/* reuse GL_RG8_SNORM */ -/* reuse GL_RGB8_SNORM */ -/* reuse GL_RGBA8_SNORM */ -/* reuse GL_R16_SNORM */ -/* reuse GL_RG16_SNORM */ -/* reuse GL_RGB16_SNORM */ -/* reuse GL_RGBA16_SNORM */ -/* reuse GL_SIGNED_NORMALIZED */ -#endif - -#ifndef GL_AMD_draw_buffers_blend -#endif - -#ifndef GL_APPLE_texture_range -#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 -#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 -#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC -#define GL_STORAGE_PRIVATE_APPLE 0x85BD -/* reuse GL_STORAGE_CACHED_APPLE */ -/* reuse GL_STORAGE_SHARED_APPLE */ -#endif - -#ifndef GL_APPLE_float_pixels -#define GL_HALF_APPLE 0x140B -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#define GL_COLOR_FLOAT_APPLE 0x8A0F -#endif - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 -#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 -#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 -#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 -#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 -#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 -#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 -#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 -#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 -#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 -#endif - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 -#endif - -#ifndef GL_APPLE_object_purgeable -#define GL_BUFFER_OBJECT_APPLE 0x85B3 -#define GL_RELEASED_APPLE 0x8A19 -#define GL_VOLATILE_APPLE 0x8A1A -#define GL_RETAINED_APPLE 0x8A1B -#define GL_UNDEFINED_APPLE 0x8A1C -#define GL_PURGEABLE_APPLE 0x8A1D -#endif - -#ifndef GL_APPLE_row_bytes -#define GL_PACK_ROW_BYTES_APPLE 0x8A15 -#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 -#endif - -#ifndef GL_APPLE_rgb_422 -#define GL_RGB_422_APPLE 0x8A1F -/* reuse GL_UNSIGNED_SHORT_8_8_APPLE */ -/* reuse GL_UNSIGNED_SHORT_8_8_REV_APPLE */ -#endif - -#ifndef GL_NV_video_capture -#define GL_VIDEO_BUFFER_NV 0x9020 -#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 -#define GL_FIELD_UPPER_NV 0x9022 -#define GL_FIELD_LOWER_NV 0x9023 -#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 -#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 -#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 -#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 -#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 -#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 -#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A -#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B -#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C -#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D -#define GL_PARTIAL_SUCCESS_NV 0x902E -#define GL_SUCCESS_NV 0x902F -#define GL_FAILURE_NV 0x9030 -#define GL_YCBYCR8_422_NV 0x9031 -#define GL_YCBAYCR8A_4224_NV 0x9032 -#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 -#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 -#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 -#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 -#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 -#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 -#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 -#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A -#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B -#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C -#endif - -#ifndef GL_NV_copy_image -#endif - -#ifndef GL_EXT_separate_shader_objects -#define GL_ACTIVE_PROGRAM_EXT 0x8B8D -#endif - -#ifndef GL_NV_parameter_buffer_object2 -#endif - -#ifndef GL_NV_shader_buffer_load -#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D -#define GL_GPU_ADDRESS_NV 0x8F34 -#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 -#endif - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E -#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F -#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 -#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 -#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 -#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 -#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 -#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 -#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 -#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 -#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 -#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 -#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A -#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B -#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C -#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D -#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E -#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F -#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 -#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 -#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 -#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 -#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 -#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 -#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 -#endif - -#ifndef GL_NV_texture_barrier -#endif - -#ifndef GL_AMD_shader_stencil_export -#endif - -#ifndef GL_AMD_seamless_cubemap_per_texture -/* reuse GL_TEXTURE_CUBE_MAP_SEAMLESS */ -#endif - -#ifndef GL_AMD_conservative_depth -#endif - -#ifndef GL_EXT_shader_image_load_store -#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 -#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 -#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A -#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B -#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C -#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D -#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E -#define GL_IMAGE_1D_EXT 0x904C -#define GL_IMAGE_2D_EXT 0x904D -#define GL_IMAGE_3D_EXT 0x904E -#define GL_IMAGE_2D_RECT_EXT 0x904F -#define GL_IMAGE_CUBE_EXT 0x9050 -#define GL_IMAGE_BUFFER_EXT 0x9051 -#define GL_IMAGE_1D_ARRAY_EXT 0x9052 -#define GL_IMAGE_2D_ARRAY_EXT 0x9053 -#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 -#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 -#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 -#define GL_INT_IMAGE_1D_EXT 0x9057 -#define GL_INT_IMAGE_2D_EXT 0x9058 -#define GL_INT_IMAGE_3D_EXT 0x9059 -#define GL_INT_IMAGE_2D_RECT_EXT 0x905A -#define GL_INT_IMAGE_CUBE_EXT 0x905B -#define GL_INT_IMAGE_BUFFER_EXT 0x905C -#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D -#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E -#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F -#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 -#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 -#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 -#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 -#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 -#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 -#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 -#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 -#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 -#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 -#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B -#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C -#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D -#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E -#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 -#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 -#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 -#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 -#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 -#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 -#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 -#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 -#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 -#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 -#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 -#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 -#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF -#endif - -#ifndef GL_EXT_vertex_attrib_64bit -/* reuse GL_DOUBLE */ -#define GL_DOUBLE_VEC2_EXT 0x8FFC -#define GL_DOUBLE_VEC3_EXT 0x8FFD -#define GL_DOUBLE_VEC4_EXT 0x8FFE -#define GL_DOUBLE_MAT2_EXT 0x8F46 -#define GL_DOUBLE_MAT3_EXT 0x8F47 -#define GL_DOUBLE_MAT4_EXT 0x8F48 -#define GL_DOUBLE_MAT2x3_EXT 0x8F49 -#define GL_DOUBLE_MAT2x4_EXT 0x8F4A -#define GL_DOUBLE_MAT3x2_EXT 0x8F4B -#define GL_DOUBLE_MAT3x4_EXT 0x8F4C -#define GL_DOUBLE_MAT4x2_EXT 0x8F4D -#define GL_DOUBLE_MAT4x3_EXT 0x8F4E -#endif +#endif /* GL_NV_gpu_program4 */ #ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 #define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A #define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B #define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C @@ -5842,137 +9306,202 @@ extern "C" { #define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F #define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 #define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); #endif +#endif /* GL_NV_gpu_program5 */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 +#endif /* GL_NV_gpu_program5_mem_extended */ #ifndef GL_NV_gpu_shader5 -#define GL_INT64_NV 0x140E -#define GL_UNSIGNED_INT64_NV 0x140F -#define GL_INT8_NV 0x8FE0 -#define GL_INT8_VEC2_NV 0x8FE1 -#define GL_INT8_VEC3_NV 0x8FE2 -#define GL_INT8_VEC4_NV 0x8FE3 -#define GL_INT16_NV 0x8FE4 -#define GL_INT16_VEC2_NV 0x8FE5 -#define GL_INT16_VEC3_NV 0x8FE6 -#define GL_INT16_VEC4_NV 0x8FE7 -#define GL_INT64_VEC2_NV 0x8FE9 -#define GL_INT64_VEC3_NV 0x8FEA -#define GL_INT64_VEC4_NV 0x8FEB -#define GL_UNSIGNED_INT8_NV 0x8FEC -#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED -#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE -#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF -#define GL_UNSIGNED_INT16_NV 0x8FF0 -#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 -#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 -#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 -#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 -#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 -#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 -#define GL_FLOAT16_NV 0x8FF8 -#define GL_FLOAT16_VEC2_NV 0x8FF9 -#define GL_FLOAT16_VEC3_NV 0x8FFA -#define GL_FLOAT16_VEC4_NV 0x8FFB -/* reuse GL_PATCHES */ -#endif +#define GL_NV_gpu_shader5 1 +#endif /* GL_NV_gpu_shader5 */ -#ifndef GL_NV_shader_buffer_store -#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 -/* reuse GL_READ_WRITE */ -/* reuse GL_WRITE_ONLY */ +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +typedef unsigned short GLhalfNV; +#define GL_HALF_FLOAT_NV 0x140B +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); #endif +#endif /* GL_NV_half_float */ -#ifndef GL_NV_tessellation_program5 -#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 -#define GL_TESS_CONTROL_PROGRAM_NV 0x891E -#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F -#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 -#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint *params); #endif +#endif /* GL_NV_internalformat_sample_query */ -#ifndef GL_NV_vertex_attrib_integer_64bit -/* reuse GL_INT64_NV */ -/* reuse GL_UNSIGNED_INT64_NV */ -#endif +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif /* GL_NV_light_max_exponent */ #ifndef GL_NV_multisample_coverage -#define GL_COLOR_SAMPLES_NV 0x8E20 -/* reuse GL_SAMPLES_ARB */ -#endif +#define GL_NV_multisample_coverage 1 +#endif /* GL_NV_multisample_coverage */ -#ifndef GL_AMD_name_gen_delete -#define GL_DATA_BUFFER_AMD 0x9151 -#define GL_PERFORMANCE_MONITOR_AMD 0x9152 -#define GL_QUERY_OBJECT_AMD 0x9153 -#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 -#define GL_SAMPLER_OBJECT_AMD 0x9155 -#endif +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif /* GL_NV_multisample_filter_hint */ -#ifndef GL_AMD_debug_output -#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 -#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 -#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 -#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 -#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 -#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 -#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 -#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A -#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B -#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C -#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D -#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E -#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F -#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); #endif +#endif /* GL_NV_occlusion_query */ -#ifndef GL_NV_vdpau_interop -#define GL_SURFACE_STATE_NV 0x86EB -#define GL_SURFACE_REGISTERED_NV 0x86FD -#define GL_SURFACE_MAPPED_NV 0x8700 -#define GL_WRITE_DISCARD_NV 0x88BE -#endif +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif /* GL_NV_packed_depth_stencil */ -#ifndef GL_AMD_transform_feedback3_lines_triangles +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); #endif +#endif /* GL_NV_parameter_buffer_object */ -#ifndef GL_AMD_depth_clamp_separate -#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E -#define GL_DEPTH_CLAMP_FAR_AMD 0x901F -#endif - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 -#define GL_DECODE_EXT 0x8A49 -#define GL_SKIP_DECODE_EXT 0x8A4A -#endif - -#ifndef GL_NV_texture_multisample -#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 -#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 -#endif - -#ifndef GL_AMD_blend_minmax_factor -#define GL_FACTOR_MIN_AMD 0x901C -#define GL_FACTOR_MAX_AMD 0x901D -#endif - -#ifndef GL_AMD_sample_positions -#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F -#endif - -#ifndef GL_EXT_x11_sync_object -#define GL_SYNC_X11_FENCE_EXT 0x90E1 -#endif - -#ifndef GL_AMD_multi_draw_indirect -#endif - -#ifndef GL_EXT_framebuffer_multisample_blit_scaled -#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA -#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB -#endif +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif /* GL_NV_parameter_buffer_object2 */ #ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 #define GL_PATH_FORMAT_SVG_NV 0x9070 #define GL_PATH_FORMAT_PS_NV 0x9071 #define GL_STANDARD_FONT_NAME_NV 0x9072 @@ -6100,2905 +9629,1364 @@ extern "C" { #define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 #define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 #define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 -/* reuse GL_PRIMARY_COLOR */ -/* reuse GL_PRIMARY_COLOR_NV */ -/* reuse GL_SECONDARY_COLOR_NV */ +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_2_BYTES_NV 0x1407 +#define GL_3_BYTES_NV 0x1408 +#define GL_4_BYTES_NV 0x1409 +#define GL_EYE_LINEAR_NV 0x2400 +#define GL_OBJECT_LINEAR_NV 0x2401 +#define GL_CONSTANT_NV 0x8576 +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D +typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); +typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); +GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); +GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); +GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); +GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); +GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLfloat *params); #endif +#endif /* GL_NV_path_rendering */ -#ifndef GL_AMD_pinned_memory -#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 -#endif +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 +#define GL_SHARED_EDGE_NV 0xC0 +#endif /* GL_NV_path_rendering_shared_edge */ -#ifndef GL_AMD_stencil_operation_extended -#define GL_SET_AMD 0x874A -#define GL_REPLACE_VALUE_AMD 0x874B -#define GL_STENCIL_OP_VALUE_AMD 0x874C -#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); #endif +#endif /* GL_NV_pixel_data_range */ -#ifndef GL_AMD_vertex_shader_viewport_index +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); #endif +#endif /* GL_NV_point_sprite */ -#ifndef GL_AMD_vertex_shader_layer +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); #endif +#endif /* GL_NV_present_video */ -#ifndef GL_NV_bindless_texture +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); #endif +#endif /* GL_NV_primitive_restart */ -#ifndef GL_NV_shader_atomic_float +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); #endif +#endif /* GL_NV_register_combiners */ -#ifndef GL_AMD_query_buffer_object -#define GL_QUERY_BUFFER_AMD 0x9192 -#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 -#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); #endif +#endif /* GL_NV_register_combiners2 */ -#ifndef GL_NV_compute_program5 -#define GL_COMPUTE_PROGRAM_NV 0x90FB -#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glResolveDepthValuesNV (void); #endif +#endif /* GL_NV_sample_locations */ -#ifndef GL_NV_shader_storage_buffer_object -#endif +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 +#endif /* GL_NV_sample_mask_override_coverage */ #ifndef GL_NV_shader_atomic_counters -#endif +#define GL_NV_shader_atomic_counters 1 +#endif /* GL_NV_shader_atomic_counters */ -#ifndef GL_NV_deep_texture3D -#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 -#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 -#endif +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 +#endif /* GL_NV_shader_atomic_float */ -#ifndef GL_NVX_conditional_render -#endif +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 +#endif /* GL_NV_shader_atomic_fp16_vector */ -#ifndef GL_AMD_sparse_texture -#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 -#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 -#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 -#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 -#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 -#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A -#define GL_MIN_SPARSE_LEVEL_AMD 0x919B -#define GL_MIN_LOD_WARNING_AMD 0x919C -#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 -#endif +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 +#endif /* GL_NV_shader_atomic_int64 */ -#ifndef GL_AMD_shader_trinary_minmax +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); #endif +#endif /* GL_NV_shader_buffer_load */ -#ifndef GL_INTEL_map_texture -#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF -#define GL_LAYOUT_DEFAULT_INTEL 0 -#define GL_LAYOUT_LINEAR_INTEL 1 -#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +#endif /* GL_NV_shader_buffer_store */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 +#endif /* GL_NV_shader_storage_buffer_object */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B +#endif /* GL_NV_shader_thread_group */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 +#endif /* GL_NV_shader_thread_shuffle */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif /* GL_NV_tessellation_program5 */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif /* GL_NV_texgen_emboss */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif /* GL_NV_texgen_reflection */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureBarrierNV (void); #endif +#endif /* GL_NV_texture_barrier */ -#ifndef GL_NV_draw_texture +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif /* GL_NV_texture_compression_vtc */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif /* GL_NV_texture_env_combine4 */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif /* GL_NV_texture_expand_normal */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); #endif +#endif /* GL_NV_texture_multisample */ +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif /* GL_NV_texture_rectangle */ -/*************************************************************/ +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif /* GL_NV_texture_shader */ -#include -#ifndef GL_VERSION_2_0 -/* GL type for program/shader text */ -typedef char GLchar; +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif /* GL_NV_texture_shader2 */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif /* GL_NV_texture_shader3 */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackNV (void); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); #endif +#endif /* GL_NV_transform_feedback */ -#ifndef GL_VERSION_1_5 -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptr; -typedef ptrdiff_t GLsizeiptr; +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedbackNV (void); +GLAPI void APIENTRY glResumeTransformFeedbackNV (void); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); #endif +#endif /* GL_NV_transform_feedback2 */ -#ifndef GL_ARB_vertex_buffer_object -/* GL types for handling large vertex buffer objects */ -typedef ptrdiff_t GLintptrARB; -typedef ptrdiff_t GLsizeiptrARB; -#endif - -#ifndef GL_ARB_shader_objects -/* GL types for program/shader text and shader object handles */ -typedef char GLcharARB; -typedef unsigned int GLhandleARB; -#endif - -/* GL type for "half" precision (s10e5) float data in host memory */ -#ifndef GL_ARB_half_float_pixel -typedef unsigned short GLhalfARB; -#endif - -#ifndef GL_NV_half_float -typedef unsigned short GLhalfNV; -#endif - -#ifndef GLEXT_64_TYPES_DEFINED -/* This code block is duplicated in glxext.h, so must be protected */ -#define GLEXT_64_TYPES_DEFINED -/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ -/* (as used in the GL_EXT_timer_query extension). */ -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -#include -#elif defined(__sun__) || defined(__digital__) -#include -#if defined(__STDC__) -#if defined(__arch64__) || defined(_LP64) -typedef long int int64_t; -typedef unsigned long int uint64_t; -#else -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#endif /* __arch64__ */ -#endif /* __STDC__ */ -#elif defined( __VMS ) || defined(__sgi) -#include -#elif defined(__SCO__) || defined(__USLC__) -#include -#elif defined(__UNIXOS2__) || defined(__SOL64__) -typedef long int int32_t; -typedef long long int int64_t; -typedef unsigned long long int uint64_t; -#elif defined(_WIN32) && defined(__GNUC__) -#include -#elif defined(_WIN32) -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -/* Fallback if nothing above works */ -#include -#endif -#endif - -#ifndef GL_EXT_timer_query -typedef int64_t GLint64EXT; -typedef uint64_t GLuint64EXT; -#endif - -#ifndef GL_ARB_sync -typedef int64_t GLint64; -typedef uint64_t GLuint64; -typedef struct __GLsync *GLsync; -#endif - -#ifndef GL_ARB_cl_event -/* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ -struct _cl_context; -struct _cl_event; -#endif - -#ifndef GL_ARB_debug_output -typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_AMD_debug_output -typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif - -#ifndef GL_KHR_debug -typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,GLvoid *userParam); -#endif +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 +#endif /* GL_NV_uniform_buffer_unified_memory */ #ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 typedef GLintptr GLvdpauSurfaceNV; -#endif - -#ifndef GL_OES_fixed_point -/* GLint must be 32 bits, a relatively safe assumption on modern CPUs */ -typedef GLint GLfixed; -#endif - -#ifndef GL_VERSION_1_2 -#define GL_VERSION_1_2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -GLAPI void APIENTRY glBlendEquation (GLenum mode); -GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, GLvoid *table); -GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, GLvoid *image); -GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogram (GLenum target); -GLAPI void APIENTRY glResetMinmax (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); -#endif - -#ifndef GL_VERSION_1_3 -#define GL_VERSION_1_3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTexture (GLenum texture); -GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); -GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, GLvoid *img); -GLAPI void APIENTRY glClientActiveTexture (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); -GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); -#endif - -#ifndef GL_VERSION_1_4 -#define GL_VERSION_1_4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount); -GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); -GLAPI void APIENTRY glFogCoordf (GLfloat coord); -GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); -GLAPI void APIENTRY glFogCoordd (GLdouble coord); -GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2iv (const GLint *v); -GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); -GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3iv (const GLint *v); -GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); -#endif - -#ifndef GL_VERSION_1_5 -#define GL_VERSION_1_5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQuery (GLuint id); -GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQuery (GLenum target); -GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); -GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); -GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -GLAPI GLvoid* APIENTRY glMapBuffer (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); -GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); -GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); -GLAPI void APIENTRY glCompileShader (GLuint shader); -GLAPI GLuint APIENTRY glCreateProgram (void); -GLAPI GLuint APIENTRY glCreateShader (GLenum type); -GLAPI void APIENTRY glDeleteProgram (GLuint program); -GLAPI void APIENTRY glDeleteShader (GLuint shader); -GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); -GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); -GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgram (GLuint program); -GLAPI GLboolean APIENTRY glIsShader (GLuint shader); -GLAPI void APIENTRY glLinkProgram (GLuint program); -GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length); -GLAPI void APIENTRY glUseProgram (GLuint program); -GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glValidateProgram (GLuint program); -GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); -typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); -typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length); -typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_VERSION_2_1 -#define GL_VERSION_2_1 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -#endif - -#ifndef GL_VERSION_3_0 -#define GL_VERSION_3_0 1 -/* OpenGL 3.0 also reuses entry points from these extensions: */ -/* ARB_framebuffer_object */ -/* ARB_map_buffer_range */ -/* ARB_vertex_array_object */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); -GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); -GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedback (void); -GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); -GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRender (void); -GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); -GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); -GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); -GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); -GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); -GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -GLAPI const GLubyte * APIENTRY glGetStringi (GLenum name, GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar* const *varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); -typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); -typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); -#endif - -#ifndef GL_VERSION_3_1 -#define GL_VERSION_3_1 1 -/* OpenGL 3.1 also reuses entry points from these extensions: */ -/* ARB_copy_buffer */ -/* ARB_uniform_buffer_object */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount); -GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount); -typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); -#endif - -#ifndef GL_VERSION_3_2 -#define GL_VERSION_3_2 1 -/* OpenGL 3.2 also reuses entry points from these extensions: */ -/* ARB_draw_elements_base_vertex */ -/* ARB_provoking_vertex */ -/* ARB_sync */ -/* ARB_texture_multisample */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); -GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -#endif - -#ifndef GL_VERSION_3_3 -#define GL_VERSION_3_3 1 -/* OpenGL 3.3 also reuses entry points from these extensions: */ -/* ARB_blend_func_extended */ -/* ARB_sampler_objects */ -/* ARB_explicit_attrib_location, but it has none */ -/* ARB_occlusion_query2 (no entry points) */ -/* ARB_shader_bit_encoding (no entry points) */ -/* ARB_texture_rgb10_a2ui (no entry points) */ -/* ARB_texture_swizzle (no entry points) */ -/* ARB_timer_query */ -/* ARB_vertex_type_2_10_10_10_rev */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); -#endif - -#ifndef GL_VERSION_4_0 -#define GL_VERSION_4_0 1 -/* OpenGL 4.0 also reuses entry points from these extensions: */ -/* ARB_texture_query_lod (no entry points) */ -/* ARB_draw_indirect */ -/* ARB_gpu_shader5 (no entry points) */ -/* ARB_gpu_shader_fp64 */ -/* ARB_shader_subroutine */ -/* ARB_tessellation_shader */ -/* ARB_texture_buffer_object_rgb32 (no entry points) */ -/* ARB_texture_cube_map_array (no entry points) */ -/* ARB_texture_gather (no entry points) */ -/* ARB_transform_feedback2 */ -/* ARB_transform_feedback3 */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShading (GLfloat value); -GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); -typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_VERSION_4_1 -#define GL_VERSION_4_1 1 -/* OpenGL 4.1 reuses entry points from these extensions: */ -/* ARB_ES2_compatibility */ -/* ARB_get_program_binary */ -/* ARB_separate_shader_objects */ -/* ARB_shader_precision (no entry points) */ -/* ARB_vertex_attrib_64bit */ -/* ARB_viewport_array */ -#endif - -#ifndef GL_VERSION_4_2 -#define GL_VERSION_4_2 1 -/* OpenGL 4.2 reuses entry points from these extensions: */ -/* ARB_base_instance */ -/* ARB_shading_language_420pack (no entry points) */ -/* ARB_transform_feedback_instanced */ -/* ARB_compressed_texture_pixel_storage (no entry points) */ -/* ARB_conservative_depth (no entry points) */ -/* ARB_internalformat_query */ -/* ARB_map_buffer_alignment (no entry points) */ -/* ARB_shader_atomic_counters */ -/* ARB_shader_image_load_store */ -/* ARB_shading_language_packing (no entry points) */ -/* ARB_texture_storage */ -#endif - -#ifndef GL_VERSION_4_3 -#define GL_VERSION_4_3 1 -/* OpenGL 4.3 reuses entry points from these extensions: */ -/* ARB_arrays_of_arrays (no entry points, GLSL only) */ -/* ARB_fragment_layer_viewport (no entry points, GLSL only) */ -/* ARB_shader_image_size (no entry points, GLSL only) */ -/* ARB_ES3_compatibility (no entry points) */ -/* ARB_clear_buffer_object */ -/* ARB_compute_shader */ -/* ARB_copy_image */ -/* KHR_debug (includes ARB_debug_output commands promoted to KHR without suffixes) */ -/* ARB_explicit_uniform_location (no entry points) */ -/* ARB_framebuffer_no_attachments */ -/* ARB_internalformat_query2 */ -/* ARB_invalidate_subdata */ -/* ARB_multi_draw_indirect */ -/* ARB_program_interface_query */ -/* ARB_robust_buffer_access_behavior (no entry points) */ -/* ARB_shader_storage_buffer_object */ -/* ARB_stencil_texturing (no entry points) */ -/* ARB_texture_buffer_range */ -/* ARB_texture_query_levels (no entry points) */ -/* ARB_texture_storage_multisample */ -/* ARB_texture_view */ -/* ARB_vertex_attrib_binding */ -#endif - -#ifndef GL_ARB_multitexture -#define GL_ARB_multitexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); -GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); -GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); -GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); -GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); -GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); -GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); -GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); -GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); -GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); -GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); -GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); -GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); -GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); -GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); -GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); -GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); -GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); -GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); -#endif - -#ifndef GL_ARB_transpose_matrix -#define GL_ARB_transpose_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); -GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); -GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); -#endif - -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); -#endif - -#ifndef GL_ARB_texture_env_add -#define GL_ARB_texture_env_add 1 -#endif - -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#endif - -#ifndef GL_ARB_texture_compression -#define GL_ARB_texture_compression 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, GLvoid *img); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, GLvoid *img); -#endif - -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#endif - -#ifndef GL_ARB_point_parameters -#define GL_ARB_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); -#endif - -#ifndef GL_ARB_vertex_blend -#define GL_ARB_vertex_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); -GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); -GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); -GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); -GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); -GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); -GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); -GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); -GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glVertexBlendARB (GLint count); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); -typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); -typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); -typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); -typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); -typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); -typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); -typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); -#endif - -#ifndef GL_ARB_matrix_palette -#define GL_ARB_matrix_palette 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); -GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); -GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); -GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); -GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); -typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); -typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_ARB_texture_env_combine -#define GL_ARB_texture_env_combine 1 -#endif - -#ifndef GL_ARB_texture_env_crossbar -#define GL_ARB_texture_env_crossbar 1 -#endif - -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#endif - -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#endif - -#ifndef GL_ARB_depth_texture -#define GL_ARB_depth_texture 1 -#endif - -#ifndef GL_ARB_shadow -#define GL_ARB_shadow 1 -#endif - -#ifndef GL_ARB_shadow_ambient -#define GL_ARB_shadow_ambient 1 -#endif - -#ifndef GL_ARB_window_pos -#define GL_ARB_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); -GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); -#endif - -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); -GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); -GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, GLvoid *string); -GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); -#endif - -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ -#endif - -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); -GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); -GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); -GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); -GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -GLAPI GLvoid* APIENTRY glMapBufferARB (GLenum target, GLenum access); -GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); -GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data); -typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); -GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); -GLAPI void APIENTRY glEndQueryARB (GLenum target); -GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); -GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); -GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); -GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); -GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); -GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); -GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); -GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); -GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); -GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); -GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); -GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); -GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); -GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -#endif - -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); -GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -#endif - -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#endif - -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#endif - -#ifndef GL_ARB_texture_non_power_of_two -#define GL_ARB_texture_non_power_of_two 1 -#endif - -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#endif - -#ifndef GL_ARB_fragment_program_shadow -#define GL_ARB_fragment_program_shadow 1 -#endif - -#ifndef GL_ARB_draw_buffers -#define GL_ARB_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle 1 -#endif - -#ifndef GL_ARB_color_buffer_float -#define GL_ARB_color_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); -#endif - -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel 1 -#endif - -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#endif - -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#endif - -#ifndef GL_ARB_depth_buffer_float -#define GL_ARB_depth_buffer_float 1 -#endif - -#ifndef GL_ARB_draw_instanced -#define GL_ARB_draw_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif - -#ifndef GL_ARB_framebuffer_object -#define GL_ARB_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmap (GLenum target); -GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -#endif - -#ifndef GL_ARB_framebuffer_sRGB -#define GL_ARB_framebuffer_sRGB 1 -#endif - -#ifndef GL_ARB_geometry_shader4 -#define GL_ARB_geometry_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); -GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif - -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex 1 -#endif - -#ifndef GL_ARB_instanced_arrays -#define GL_ARB_instanced_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); -#endif - -#ifndef GL_ARB_map_buffer_range -#define GL_ARB_map_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); -#endif - -#ifndef GL_ARB_texture_buffer_object -#define GL_ARB_texture_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#endif - -#ifndef GL_ARB_texture_compression_rgtc -#define GL_ARB_texture_compression_rgtc 1 -#endif - -#ifndef GL_ARB_texture_rg -#define GL_ARB_texture_rg 1 -#endif - -#ifndef GL_ARB_vertex_array_object -#define GL_ARB_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArray (GLuint array); -GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); -#endif - -#ifndef GL_ARB_uniform_buffer_object -#define GL_ARB_uniform_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices); -GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); -GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const *uniformNames, GLuint *uniformIndices); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); -typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); -typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); -#endif - -#ifndef GL_ARB_compatibility -#define GL_ARB_compatibility 1 -#endif - -#ifndef GL_ARB_copy_buffer -#define GL_ARB_copy_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -#endif - -#ifndef GL_ARB_shader_texture_lod -#define GL_ARB_shader_texture_lod 1 -#endif - -#ifndef GL_ARB_depth_clamp -#define GL_ARB_depth_clamp 1 -#endif - -#ifndef GL_ARB_draw_elements_base_vertex -#define GL_ARB_draw_elements_base_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex); -GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount, GLint basevertex); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei drawcount, const GLint *basevertex); -#endif - -#ifndef GL_ARB_fragment_coord_conventions -#define GL_ARB_fragment_coord_conventions 1 -#endif - -#ifndef GL_ARB_provoking_vertex -#define GL_ARB_provoking_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProvokingVertex (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); -#endif - -#ifndef GL_ARB_seamless_cube_map -#define GL_ARB_seamless_cube_map 1 -#endif - -#ifndef GL_ARB_sync -#define GL_ARB_sync 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); -GLAPI GLboolean APIENTRY glIsSync (GLsync sync); -GLAPI void APIENTRY glDeleteSync (GLsync sync); -GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); -GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); -typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); -typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); -typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -#endif - -#ifndef GL_ARB_texture_multisample -#define GL_ARB_texture_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaski (GLuint index, GLbitfield mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); -#endif - -#ifndef GL_ARB_vertex_array_bgra -#define GL_ARB_vertex_array_bgra 1 -#endif - -#ifndef GL_ARB_draw_buffers_blend -#define GL_ARB_draw_buffers_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -#endif - -#ifndef GL_ARB_sample_shading -#define GL_ARB_sample_shading 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); -#endif - -#ifndef GL_ARB_texture_cube_map_array -#define GL_ARB_texture_cube_map_array 1 -#endif - -#ifndef GL_ARB_texture_gather -#define GL_ARB_texture_gather 1 -#endif - -#ifndef GL_ARB_texture_query_lod -#define GL_ARB_texture_query_lod 1 -#endif - -#ifndef GL_ARB_shading_language_include -#define GL_ARB_shading_language_include 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); -GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); -typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* *path, const GLint *length); -typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); -typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_texture_compression_bptc -#define GL_ARB_texture_compression_bptc 1 -#endif - -#ifndef GL_ARB_blend_func_extended -#define GL_ARB_blend_func_extended 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); -#endif - -#ifndef GL_ARB_explicit_attrib_location -#define GL_ARB_explicit_attrib_location 1 -#endif - -#ifndef GL_ARB_occlusion_query2 -#define GL_ARB_occlusion_query2 1 -#endif - -#ifndef GL_ARB_sampler_objects -#define GL_ARB_sampler_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); -GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); -GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); -GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); -GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); -GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); -GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); -GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); -GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); -typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); -typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); -typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); -#endif - -#ifndef GL_ARB_shader_bit_encoding -#define GL_ARB_shader_bit_encoding 1 -#endif - -#ifndef GL_ARB_texture_rgb10_a2ui -#define GL_ARB_texture_rgb10_a2ui 1 -#endif - -#ifndef GL_ARB_texture_swizzle -#define GL_ARB_texture_swizzle 1 -#endif - -#ifndef GL_ARB_timer_query -#define GL_ARB_timer_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); -GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); -GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); -#endif - -#ifndef GL_ARB_vertex_type_2_10_10_10_rev -#define GL_ARB_vertex_type_2_10_10_10_rev 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); -GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); -GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); -GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); -GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); -GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); -GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); -GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); -GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); -GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); -GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); -typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); -typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); -typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); -typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); -#endif - -#ifndef GL_ARB_draw_indirect -#define GL_ARB_draw_indirect 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const GLvoid *indirect); -GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const GLvoid *indirect); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const GLvoid *indirect); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const GLvoid *indirect); -#endif - -#ifndef GL_ARB_gpu_shader5 -#define GL_ARB_gpu_shader5 1 -#endif - -#ifndef GL_ARB_gpu_shader_fp64 -#define GL_ARB_gpu_shader_fp64 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); -GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_subroutine -#define GL_ARB_shader_subroutine 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); -GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); -GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); -typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); -#endif - -#ifndef GL_ARB_tessellation_shader -#define GL_ARB_tessellation_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); -GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); -#endif - -#ifndef GL_ARB_texture_buffer_object_rgb32 -#define GL_ARB_texture_buffer_object_rgb32 1 -#endif - -#ifndef GL_ARB_transform_feedback2 -#define GL_ARB_transform_feedback2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedback (void); -GLAPI void APIENTRY glResumeTransformFeedback (void); -GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); -#endif - -#ifndef GL_ARB_transform_feedback3 -#define GL_ARB_transform_feedback3 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); -GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); -GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); -GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); -typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); -typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_ES2_compatibility -#define GL_ARB_ES2_compatibility 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReleaseShaderCompiler (void); -GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); -GLAPI void APIENTRY glClearDepthf (GLfloat d); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); -typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryformat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); -typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); -typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); -#endif - -#ifndef GL_ARB_get_program_binary -#define GL_ARB_get_program_binary 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary); -typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); -#endif - -#ifndef GL_ARB_separate_shader_objects -#define GL_ARB_separate_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); -GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar* const *strings); -GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); -GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); -GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); -GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); -GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); -GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); -GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); -typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar* const *strings); -typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); -typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); -typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -#endif - -#ifndef GL_ARB_vertex_attrib_64bit -#define GL_ARB_vertex_attrib_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); -#endif - -#ifndef GL_ARB_viewport_array -#define GL_ARB_viewport_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); -GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); -GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); -GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); -typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); -typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); -#endif - -#ifndef GL_ARB_cl_event -#define GL_ARB_cl_event 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context * context, struct _cl_event * event, GLbitfield flags); -#endif - -#ifndef GL_ARB_debug_output -#define GL_ARB_debug_output 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const GLvoid *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const GLvoid *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -#endif - -#ifndef GL_ARB_robustness -#define GL_ARB_robustness 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); -GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); -GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); -GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); -GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); -GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); -GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); -GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); -GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); -typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); -typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); -typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); -typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); -typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); -typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); -typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *table); -typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, GLvoid *image); -typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, GLvoid *row, GLsizei columnBufSize, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, GLvoid *values); -typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); -typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *img); -typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); -typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); -#endif - -#ifndef GL_ARB_shader_stencil_export -#define GL_ARB_shader_stencil_export 1 -#endif - -#ifndef GL_ARB_base_instance -#define GL_ARB_base_instance 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); -#endif - -#ifndef GL_ARB_shading_language_420pack -#define GL_ARB_shading_language_420pack 1 -#endif - -#ifndef GL_ARB_transform_feedback_instanced -#define GL_ARB_transform_feedback_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); -GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); -#endif - -#ifndef GL_ARB_compressed_texture_pixel_storage -#define GL_ARB_compressed_texture_pixel_storage 1 -#endif - -#ifndef GL_ARB_conservative_depth -#define GL_ARB_conservative_depth 1 -#endif - -#ifndef GL_ARB_internalformat_query -#define GL_ARB_internalformat_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); -#endif - -#ifndef GL_ARB_map_buffer_alignment -#define GL_ARB_map_buffer_alignment 1 -#endif - -#ifndef GL_ARB_shader_atomic_counters -#define GL_ARB_shader_atomic_counters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_shader_image_load_store -#define GL_ARB_shader_image_load_store 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); -typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); -#endif - -#ifndef GL_ARB_shading_language_packing -#define GL_ARB_shading_language_packing 1 -#endif - -#ifndef GL_ARB_texture_storage -#define GL_ARB_texture_storage 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -#endif - -#ifndef GL_KHR_texture_compression_astc_ldr -#define GL_KHR_texture_compression_astc_ldr 1 -#endif - -#ifndef GL_KHR_debug -#define GL_KHR_debug 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); -GLAPI void APIENTRY glPopDebugGroup (void); -GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); -GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufsize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); -typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); -typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); -typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); -typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); -typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); -#endif - -#ifndef GL_ARB_arrays_of_arrays -#define GL_ARB_arrays_of_arrays 1 -#endif - -#ifndef GL_ARB_clear_buffer_object -#define GL_ARB_clear_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); -typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void *data); -#endif - -#ifndef GL_ARB_compute_shader -#define GL_ARB_compute_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); -#endif - -#ifndef GL_ARB_copy_image -#define GL_ARB_copy_image 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); -#endif - -#ifndef GL_ARB_texture_view -#define GL_ARB_texture_view 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); -#endif - -#ifndef GL_ARB_vertex_attrib_binding -#define GL_ARB_vertex_attrib_binding 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); -GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); -typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); -#endif - -#ifndef GL_ARB_robustness_isolation -#define GL_ARB_robustness_isolation 1 -#endif - -#ifndef GL_ARB_ES3_compatibility -#define GL_ARB_ES3_compatibility 1 -#endif - -#ifndef GL_ARB_explicit_uniform_location -#define GL_ARB_explicit_uniform_location 1 -#endif - -#ifndef GL_ARB_fragment_layer_viewport -#define GL_ARB_fragment_layer_viewport 1 -#endif - -#ifndef GL_ARB_framebuffer_no_attachments -#define GL_ARB_framebuffer_no_attachments 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); -GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -#endif - -#ifndef GL_ARB_internalformat_query2 -#define GL_ARB_internalformat_query2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64 *params); -#endif - -#ifndef GL_ARB_invalidate_subdata -#define GL_ARB_invalidate_subdata 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); -GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); -GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); -GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); -typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); -typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_ARB_multi_draw_indirect -#define GL_ARB_multi_draw_indirect 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); -#endif - -#ifndef GL_ARB_program_interface_query -#define GL_ARB_program_interface_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); -GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); -typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); -typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei bufSize, GLsizei *length, GLint *params); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); -#endif - -#ifndef GL_ARB_robust_buffer_access_behavior -#define GL_ARB_robust_buffer_access_behavior 1 -#endif - -#ifndef GL_ARB_shader_image_size -#define GL_ARB_shader_image_size 1 -#endif - -#ifndef GL_ARB_shader_storage_buffer_object -#define GL_ARB_shader_storage_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); -#endif - -#ifndef GL_ARB_stencil_texturing -#define GL_ARB_stencil_texturing 1 -#endif - -#ifndef GL_ARB_texture_buffer_range -#define GL_ARB_texture_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); -#endif - -#ifndef GL_ARB_texture_query_levels -#define GL_ARB_texture_query_levels 1 -#endif - -#ifndef GL_ARB_texture_storage_multisample -#define GL_ARB_texture_storage_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); -typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); -#endif - -#ifndef GL_EXT_abgr -#define GL_EXT_abgr 1 -#endif - -#ifndef GL_EXT_blend_color -#define GL_EXT_blend_color 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -#endif - -#ifndef GL_EXT_polygon_offset -#define GL_EXT_polygon_offset 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); -#endif - -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#endif - -#ifndef GL_EXT_texture3D -#define GL_EXT_texture3D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGIS_texture_filter4 -#define GL_SGIS_texture_filter4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); -GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); -typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); -#endif - -#ifndef GL_EXT_subtexture -#define GL_EXT_subtexture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_EXT_copy_texture -#define GL_EXT_copy_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_histogram -#define GL_EXT_histogram 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); -GLAPI void APIENTRY glResetHistogramEXT (GLenum target); -GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); -typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); -#endif - -#ifndef GL_EXT_convolution -#define GL_EXT_convolution 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); -GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); -GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *image); -GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); -typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); -#endif - -#ifndef GL_SGI_color_matrix -#define GL_SGI_color_matrix 1 -#endif - -#ifndef GL_SGI_color_table -#define GL_SGI_color_table 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, GLvoid *table); -GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); -#endif - -#ifndef GL_SGIX_pixel_texture -#define GL_SGIX_pixel_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); -#endif +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif +#endif /* GL_NV_vdpau_interop */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); +#endif +#endif /* GL_NV_vertex_array_range */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif /* GL_NV_vertex_array_range2 */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); +#endif +#endif /* GL_NV_vertex_program */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif /* GL_NV_vertex_program1_1 */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif /* GL_NV_vertex_program2 */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif /* GL_NV_vertex_program2_option */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif /* GL_NV_vertex_program3 */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_vertex_program4 */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif +#endif /* GL_NV_video_capture */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif /* GL_OML_interlace */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif /* GL_OML_resample */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif /* GL_OML_subsample */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); +#endif +#endif /* GL_PGI_misc_hints */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif /* GL_PGI_vertex_hints */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif /* GL_REND_screen_coordinates */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 +#endif /* GL_S3_s3tc */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); +#endif +#endif /* GL_SGIS_detail_texture */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); +#endif +#endif /* GL_SGIS_fog_function */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif /* GL_SGIS_generate_mipmap */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); +#endif +#endif /* GL_SGIS_multisample */ #ifndef GL_SGIS_pixel_texture #define GL_SGIS_pixel_texture 1 +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); @@ -9006,444 +10994,266 @@ GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); #endif +#endif /* GL_SGIS_pixel_texture */ -#ifndef GL_SGIS_texture4D -#define GL_SGIS_texture4D 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const GLvoid *pixels); -#endif - -#ifndef GL_SGI_texture_color_table -#define GL_SGI_texture_color_table 1 -#endif - -#ifndef GL_EXT_cmyka -#define GL_EXT_cmyka 1 -#endif - -#ifndef GL_EXT_texture_object -#define GL_EXT_texture_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); -GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); -GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); -GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); -GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); -GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); -typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); -#endif - -#ifndef GL_SGIS_detail_texture -#define GL_SGIS_detail_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_SGIS_sharpen_texture -#define GL_SGIS_sharpen_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); -#endif - -#ifndef GL_EXT_packed_pixels -#define GL_EXT_packed_pixels 1 -#endif - -#ifndef GL_SGIS_texture_lod -#define GL_SGIS_texture_lod 1 -#endif - -#ifndef GL_SGIS_multisample -#define GL_SGIS_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); -#endif - -#ifndef GL_EXT_rescale_normal -#define GL_EXT_rescale_normal 1 -#endif - -#ifndef GL_EXT_vertex_array -#define GL_EXT_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glArrayElementEXT (GLint i); -GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); -GLAPI void APIENTRY glGetPointervEXT (GLenum pname, GLvoid* *params); -GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -#endif - -#ifndef GL_EXT_misc_attribute -#define GL_EXT_misc_attribute 1 -#endif - -#ifndef GL_SGIS_generate_mipmap -#define GL_SGIS_generate_mipmap 1 -#endif - -#ifndef GL_SGIX_clipmap -#define GL_SGIX_clipmap 1 -#endif - -#ifndef GL_SGIX_shadow -#define GL_SGIX_shadow 1 -#endif - -#ifndef GL_SGIS_texture_edge_clamp -#define GL_SGIS_texture_edge_clamp 1 -#endif - -#ifndef GL_SGIS_texture_border_clamp -#define GL_SGIS_texture_border_clamp 1 -#endif - -#ifndef GL_EXT_blend_minmax -#define GL_EXT_blend_minmax 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_blend_subtract -#define GL_EXT_blend_subtract 1 -#endif - -#ifndef GL_EXT_blend_logic_op -#define GL_EXT_blend_logic_op 1 -#endif - -#ifndef GL_SGIX_interlace -#define GL_SGIX_interlace 1 -#endif - -#ifndef GL_SGIX_pixel_tiles -#define GL_SGIX_pixel_tiles 1 -#endif - -#ifndef GL_SGIS_texture_select -#define GL_SGIS_texture_select 1 -/* This used to be SGIX prefix, which was an error in the header */ -#endif - -#ifndef GL_SGIX_sprite -#define GL_SGIX_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); -GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); -GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_texture_multi_buffer -#define GL_SGIX_texture_multi_buffer 1 -#endif - -#ifndef GL_EXT_point_parameters -#define GL_EXT_point_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); -GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); -#endif +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif /* GL_SGIS_point_line_texgen */ #ifndef GL_SGIS_point_parameters #define GL_SGIS_point_parameters 1 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); #endif +#endif /* GL_SGIS_point_parameters */ -#ifndef GL_SGIX_instruments -#define GL_SGIX_instruments 1 +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); #ifdef GL_GLEXT_PROTOTYPES -GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); -GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); -GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); -GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); -GLAPI void APIENTRY glStartInstrumentsSGIX (void); -GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); -typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); -typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); -typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); -typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); #endif +#endif /* GL_SGIS_sharpen_texture */ -#ifndef GL_SGIX_texture_scale_bias -#define GL_SGIX_texture_scale_bias 1 -#endif - -#ifndef GL_SGIX_framezoom -#define GL_SGIX_framezoom 1 +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); #endif +#endif /* GL_SGIS_texture4D */ -#ifndef GL_SGIX_tag_sample_buffer -#define GL_SGIX_tag_sample_buffer 1 +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif /* GL_SGIS_texture_border_clamp */ + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTagSampleBufferSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); #endif +#endif /* GL_SGIS_texture_color_mask */ -#ifndef GL_SGIX_polynomial_ffd -#define GL_SGIX_polynomial_ffd 1 +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif /* GL_SGIS_texture_edge_clamp */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); -GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); -typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); -typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); #endif +#endif /* GL_SGIS_texture_filter4 */ -#ifndef GL_SGIX_reference_plane -#define GL_SGIX_reference_plane 1 +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif /* GL_SGIS_texture_lod */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif /* GL_SGIS_texture_select */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#define GL_ASYNC_MARKER_SGIX 0x8329 +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); #endif +#endif /* GL_SGIX_async */ -#ifndef GL_SGIX_flush_raster -#define GL_SGIX_flush_raster 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushRasterSGIX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); -#endif +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif /* GL_SGIX_async_histogram */ -#ifndef GL_SGIX_depth_texture -#define GL_SGIX_depth_texture 1 -#endif +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif /* GL_SGIX_async_pixel */ -#ifndef GL_SGIS_fog_function -#define GL_SGIS_fog_function 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); -GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); -typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); -#endif - -#ifndef GL_SGIX_fog_offset -#define GL_SGIX_fog_offset 1 -#endif - -#ifndef GL_HP_image_transform -#define GL_HP_image_transform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_HP_convolution_border_modes -#define GL_HP_convolution_border_modes 1 -#endif - -#ifndef GL_SGIX_texture_add_env -#define GL_SGIX_texture_add_env 1 -#endif - -#ifndef GL_EXT_color_subtable -#define GL_EXT_color_subtable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); -typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); -#endif - -#ifndef GL_PGI_vertex_hints -#define GL_PGI_vertex_hints 1 -#endif - -#ifndef GL_PGI_misc_hints -#define GL_PGI_misc_hints 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); -#endif - -#ifndef GL_EXT_paletted_texture -#define GL_EXT_paletted_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, GLvoid *data); -GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); -typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_EXT_clip_volume_hint -#define GL_EXT_clip_volume_hint 1 -#endif - -#ifndef GL_SGIX_list_priority -#define GL_SGIX_list_priority 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); -GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); -GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); -GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); -#endif - -#ifndef GL_SGIX_ir_instrument1 -#define GL_SGIX_ir_instrument1 1 -#endif +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif /* GL_SGIX_blend_alpha_minmax */ #ifndef GL_SGIX_calligraphic_fragment #define GL_SGIX_calligraphic_fragment 1 -#endif +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif /* GL_SGIX_calligraphic_fragment */ -#ifndef GL_SGIX_texture_lod_bias -#define GL_SGIX_texture_lod_bias 1 -#endif +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif /* GL_SGIX_clipmap */ -#ifndef GL_SGIX_shadow_ambient -#define GL_SGIX_shadow_ambient 1 -#endif +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif /* GL_SGIX_convolution_accuracy */ -#ifndef GL_EXT_index_texture -#define GL_EXT_index_texture 1 -#endif +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif /* GL_SGIX_depth_pass_instrument */ -#ifndef GL_EXT_index_material -#define GL_EXT_index_material 1 +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif /* GL_SGIX_depth_texture */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +GLAPI void APIENTRY glFlushRasterSGIX (void); #endif +#endif /* GL_SGIX_flush_raster */ -#ifndef GL_EXT_index_func -#define GL_EXT_index_func 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); -#endif - -#ifndef GL_EXT_index_array_formats -#define GL_EXT_index_array_formats 1 -#endif - -#ifndef GL_EXT_compiled_vertex_array -#define GL_EXT_compiled_vertex_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); -GLAPI void APIENTRY glUnlockArraysEXT (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); -#endif - -#ifndef GL_EXT_cull_vertex -#define GL_EXT_cull_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); -GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); -#endif - -#ifndef GL_SGIX_ycrcb -#define GL_SGIX_ycrcb 1 -#endif +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif /* GL_SGIX_fog_offset */ #ifndef GL_SGIX_fragment_lighting #define GL_SGIX_fragment_lighting 1 +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); @@ -9463,299 +11273,332 @@ GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); #endif +#endif /* GL_SGIX_fragment_lighting */ -#ifndef GL_IBM_rasterpos_clip -#define GL_IBM_rasterpos_clip 1 -#endif - -#ifndef GL_HP_texture_lighting -#define GL_HP_texture_lighting 1 -#endif - -#ifndef GL_EXT_draw_range_elements -#define GL_EXT_draw_range_elements 1 +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); #endif +#endif /* GL_SGIX_framezoom */ -#ifndef GL_WIN_phong_shading -#define GL_WIN_phong_shading 1 -#endif - -#ifndef GL_WIN_specular_fog -#define GL_WIN_specular_fog 1 -#endif - -#ifndef GL_EXT_light_texture -#define GL_EXT_light_texture 1 +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); -GLAPI void APIENTRY glTextureLightEXT (GLenum pname); -GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); -typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); #endif +#endif /* GL_SGIX_igloo_interface */ -#ifndef GL_SGIX_blend_alpha_minmax -#define GL_SGIX_blend_alpha_minmax 1 -#endif - -#ifndef GL_EXT_bgra -#define GL_EXT_bgra 1 -#endif - -#ifndef GL_SGIX_async -#define GL_SGIX_async 1 +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); -GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); -GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); -GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); -GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); -GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); -typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); -typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); -typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); #endif +#endif /* GL_SGIX_instruments */ -#ifndef GL_SGIX_async_pixel -#define GL_SGIX_async_pixel 1 -#endif +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#define GL_INTERLACE_SGIX 0x8094 +#endif /* GL_SGIX_interlace */ -#ifndef GL_SGIX_async_histogram -#define GL_SGIX_async_histogram 1 -#endif +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif /* GL_SGIX_ir_instrument1 */ -#ifndef GL_INTEL_parallel_arrays -#define GL_INTEL_parallel_arrays 1 +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#define GL_LIST_PRIORITY_SGIX 0x8182 +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const GLvoid* *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const GLvoid* *pointer); +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); #endif +#endif /* GL_SGIX_list_priority */ -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#endif - -#ifndef GL_EXT_pixel_transform -#define GL_EXT_pixel_transform 1 +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); #endif +#endif /* GL_SGIX_pixel_texture */ -#ifndef GL_EXT_pixel_transform_color_table -#define GL_EXT_pixel_transform_color_table 1 -#endif +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif /* GL_SGIX_pixel_tiles */ -#ifndef GL_EXT_shared_texture_palette -#define GL_EXT_shared_texture_palette 1 -#endif - -#ifndef GL_EXT_separate_specular_color -#define GL_EXT_separate_specular_color 1 -#endif - -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); -GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); -GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); -GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); -GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); -GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); -GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); -GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); -GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); -GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); -GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); -GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); -GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); -GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); #endif +#endif /* GL_SGIX_polynomial_ffd */ -#ifndef GL_EXT_texture_perturb_normal -#define GL_EXT_texture_perturb_normal 1 +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); #endif +#endif /* GL_SGIX_reference_plane */ -#ifndef GL_EXT_multi_draw_arrays -#define GL_EXT_multi_draw_arrays 1 +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#define GL_PACK_RESAMPLE_SGIX 0x842C +#define GL_UNPACK_RESAMPLE_SGIX 0x842D +#define GL_RESAMPLE_REPLICATE_SGIX 0x842E +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif /* GL_SGIX_resample */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif /* GL_SGIX_scalebias_hint */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif /* GL_SGIX_shadow */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif /* GL_SGIX_shadow_ambient */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); #endif +#endif /* GL_SGIX_sprite */ -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif /* GL_SGIX_subsample */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); -GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); -GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); -GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); -GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glTagSampleBufferSGIX (void); #endif +#endif /* GL_SGIX_tag_sample_buffer */ -#ifndef GL_REND_screen_coordinates -#define GL_REND_screen_coordinates 1 -#endif +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif /* GL_SGIX_texture_add_env */ -#ifndef GL_EXT_coordinate_frame -#define GL_EXT_coordinate_frame 1 +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif /* GL_SGIX_texture_coordinate_clamp */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif /* GL_SGIX_texture_lod_bias */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif /* GL_SGIX_texture_multi_buffer */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif /* GL_SGIX_texture_scale_bias */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif /* GL_SGIX_vertex_preclip */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif /* GL_SGIX_ycrcb */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif /* GL_SGIX_ycrcb_subsample */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif /* GL_SGIX_ycrcba */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif /* GL_SGI_color_matrix */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); #ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); -GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); -GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); -GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); -GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); -GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); -GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); -GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); -GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); -GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); -GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); -GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); -GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); -GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); -GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); -GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); -GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); -GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); -typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); -typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); -typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); -typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); -typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); -typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); -typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); -typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); -typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); -typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); -typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); #endif +#endif /* GL_SGI_color_table */ -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#endif - -#ifndef GL_APPLE_specular_vector -#define GL_APPLE_specular_vector 1 -#endif - -#ifndef GL_APPLE_transform_hint -#define GL_APPLE_transform_hint 1 -#endif - -#ifndef GL_SGIX_fog_scale -#define GL_SGIX_fog_scale 1 -#endif +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif /* GL_SGI_texture_color_table */ #ifndef GL_SUNX_constant_data #define GL_SUNX_constant_data 1 +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glFinishTextureSUNX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); #endif +#endif /* GL_SUNX_constant_data */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif /* GL_SUN_convolution_border_modes */ #ifndef GL_SUN_global_alpha #define GL_SUN_global_alpha 1 +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); @@ -9765,19 +11608,50 @@ GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); -typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); #endif +#endif /* GL_SUN_global_alpha */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif +#endif /* GL_SUN_mesh_array */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif /* GL_SUN_slice_accum */ #ifndef GL_SUN_triangle_list #define GL_SUN_triangle_list 1 +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); @@ -9785,19 +11659,52 @@ GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); -GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const GLvoid* *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const GLvoid* *pointer); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); #endif +#endif /* GL_SUN_triangle_list */ #ifndef GL_SUN_vertex #define GL_SUN_vertex 1 +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #ifdef GL_GLEXT_PROTOTYPES GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); @@ -9839,3305 +11746,19 @@ GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); #endif +#endif /* GL_SUN_vertex */ -#ifndef GL_EXT_blend_func_separate -#define GL_EXT_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_blend_func_separate -#define GL_INGR_blend_func_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -#endif - -#ifndef GL_INGR_color_clamp -#define GL_INGR_color_clamp 1 -#endif - -#ifndef GL_INGR_interlace_read -#define GL_INGR_interlace_read 1 -#endif - -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#endif - -#ifndef GL_EXT_422_pixels -#define GL_EXT_422_pixels 1 -#endif - -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#endif - -#ifndef GL_SUN_convolution_border_modes -#define GL_SUN_convolution_border_modes 1 -#endif - -#ifndef GL_EXT_texture_env_add -#define GL_EXT_texture_env_add 1 -#endif - -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#endif - -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#endif - -#ifndef GL_EXT_vertex_weighting -#define GL_EXT_vertex_weighting 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); -GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); -GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -#endif - -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent 1 -#endif - -#ifndef GL_NV_vertex_array_range -#define GL_NV_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); -GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const GLvoid *pointer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const GLvoid *pointer); -#endif - -#ifndef GL_NV_register_combiners -#define GL_NV_register_combiners 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); -GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); -GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); -#endif - -#ifndef GL_NV_fog_distance -#define GL_NV_fog_distance 1 -#endif - -#ifndef GL_NV_texgen_emboss -#define GL_NV_texgen_emboss 1 -#endif - -#ifndef GL_NV_blend_square -#define GL_NV_blend_square 1 -#endif - -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#endif - -#ifndef GL_MESA_resize_buffers -#define GL_MESA_resize_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glResizeBuffersMESA (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); -#endif - -#ifndef GL_MESA_window_pos -#define GL_MESA_window_pos 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); -GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); -GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); -GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); -GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); -GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); -GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); -GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); -GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); -GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); -typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); -typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); -#endif - -#ifndef GL_EXT_texture_compression_s3tc -#define GL_EXT_texture_compression_s3tc 1 -#endif - -#ifndef GL_IBM_cull_vertex -#define GL_IBM_cull_vertex 1 -#endif - -#ifndef GL_IBM_multimode_draw_arrays -#define GL_IBM_multimode_draw_arrays 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); -typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const GLvoid* const *indices, GLsizei primcount, GLint modestride); -#endif - -#ifndef GL_IBM_vertex_array_lists -#define GL_IBM_vertex_array_lists 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean* *pointer, GLint ptrstride); -GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid* *pointer, GLint ptrstride); -#endif - -#ifndef GL_SGIX_subsample -#define GL_SGIX_subsample 1 -#endif - -#ifndef GL_SGIX_ycrcba -#define GL_SGIX_ycrcba 1 -#endif - -#ifndef GL_SGIX_ycrcb_subsample -#define GL_SGIX_ycrcb_subsample 1 -#endif - -#ifndef GL_SGIX_depth_pass_instrument -#define GL_SGIX_depth_pass_instrument 1 -#endif - -#ifndef GL_3DFX_texture_compression_FXT1 -#define GL_3DFX_texture_compression_FXT1 1 -#endif - -#ifndef GL_3DFX_multisample -#define GL_3DFX_multisample 1 -#endif - -#ifndef GL_3DFX_tbuffer -#define GL_3DFX_tbuffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); -#endif - -#ifndef GL_EXT_multisample -#define GL_EXT_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); -GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); -typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); -#endif - -#ifndef GL_SGIX_vertex_preclip -#define GL_SGIX_vertex_preclip 1 -#endif - -#ifndef GL_SGIX_convolution_accuracy -#define GL_SGIX_convolution_accuracy 1 -#endif - -#ifndef GL_SGIX_resample -#define GL_SGIX_resample 1 -#endif - -#ifndef GL_SGIS_point_line_texgen -#define GL_SGIS_point_line_texgen 1 -#endif - -#ifndef GL_SGIS_texture_color_mask -#define GL_SGIS_texture_color_mask 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -#endif - -#ifndef GL_SGIX_igloo_interface -#define GL_SGIX_igloo_interface 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const GLvoid *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const GLvoid *params); -#endif - -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#endif - -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#endif - -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); -GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); -GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); -GLAPI void APIENTRY glFinishFenceNV (GLuint fence); -GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); -typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); -#endif - -#ifndef GL_IBM_static_data -#define GL_IBM_static_data 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); -#endif - -#ifndef GL_IBM_texture_mirrored_repeat -#define GL_IBM_texture_mirrored_repeat 1 -#endif - -#ifndef GL_NV_evaluators -#define GL_NV_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const GLvoid *points); -typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, GLvoid *points); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); -#endif - -#ifndef GL_NV_packed_depth_stencil -#define GL_NV_packed_depth_stencil 1 -#endif - -#ifndef GL_NV_register_combiners2 -#define GL_NV_register_combiners2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); -#endif - -#ifndef GL_NV_texture_compression_vtc -#define GL_NV_texture_compression_vtc 1 -#endif - -#ifndef GL_NV_texture_rectangle -#define GL_NV_texture_rectangle 1 -#endif - -#ifndef GL_NV_texture_shader -#define GL_NV_texture_shader 1 -#endif - -#ifndef GL_NV_texture_shader2 -#define GL_NV_texture_shader2 1 -#endif - -#ifndef GL_NV_vertex_array_range2 -#define GL_NV_vertex_array_range2 1 -#endif - -#ifndef GL_NV_vertex_program -#define GL_NV_vertex_program 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); -GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); -GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); -GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); -GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, GLvoid* *pointer); -GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); -GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); -GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); -GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); -GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); -GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); -GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); -GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); -GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); -GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); -GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); -typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); -typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); -typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); -typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); -typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); -#endif - -#ifndef GL_SGIX_texture_coordinate_clamp -#define GL_SGIX_texture_coordinate_clamp 1 -#endif - -#ifndef GL_SGIX_scalebias_hint -#define GL_SGIX_scalebias_hint 1 -#endif - -#ifndef GL_OML_interlace -#define GL_OML_interlace 1 -#endif - -#ifndef GL_OML_subsample -#define GL_OML_subsample 1 -#endif - -#ifndef GL_OML_resample -#define GL_OML_resample 1 -#endif - -#ifndef GL_NV_copy_depth_to_color -#define GL_NV_copy_depth_to_color 1 -#endif - -#ifndef GL_ATI_envmap_bumpmap -#define GL_ATI_envmap_bumpmap 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); -GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); -GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); -GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); -typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); -typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); -#endif - -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); -GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); -GLAPI void APIENTRY glBeginFragmentShaderATI (void); -GLAPI void APIENTRY glEndFragmentShaderATI (void); -GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); -GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); -GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); -typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); -typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); -#endif - -#ifndef GL_ATI_pn_triangles -#define GL_ATI_pn_triangles 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); -GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_vertex_array_object -#define GL_ATI_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const GLvoid *pointer, GLenum usage); -GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); -GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const GLvoid *pointer, GLenum usage); -typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const GLvoid *pointer, GLenum preserve); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); -#endif - -#ifndef GL_EXT_vertex_shader -#define GL_EXT_vertex_shader 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVertexShaderEXT (void); -GLAPI void APIENTRY glEndVertexShaderEXT (void); -GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); -GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); -GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); -GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); -GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); -GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const GLvoid *addr); -GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const GLvoid *addr); -GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); -GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); -GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); -GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); -GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); -GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); -GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); -GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); -GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); -GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); -GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); -GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); -GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); -GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); -GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); -GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); -GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, GLvoid* *data); -GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); -GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); -GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); -typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); -typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); -typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); -typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); -typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); -typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); -typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const GLvoid *addr); -typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); -typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); -typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); -typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); -typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); -typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); -typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); -typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); -typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const GLvoid *addr); -typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); -typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); -typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); -typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); -typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid* *data); -typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); -typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); -#endif - -#ifndef GL_ATI_vertex_streams -#define GL_ATI_vertex_streams 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); -GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); -GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); -GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); -GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); -GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); -GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); -GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); -GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); -GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); -GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); -GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); -GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); -GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); -GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); -GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); -GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); -typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); -typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); -#endif - -#ifndef GL_ATI_element_array -#define GL_ATI_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerATI (GLenum type, const GLvoid *pointer); -GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); -#endif - -#ifndef GL_SUN_mesh_array -#define GL_SUN_mesh_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); -#endif - -#ifndef GL_SUN_slice_accum -#define GL_SUN_slice_accum 1 -#endif - -#ifndef GL_NV_multisample_filter_hint -#define GL_NV_multisample_filter_hint 1 -#endif - -#ifndef GL_NV_depth_clamp -#define GL_NV_depth_clamp 1 -#endif - -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); -GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); -GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); -GLAPI void APIENTRY glEndOcclusionQueryNV (void); -GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -#endif - -#ifndef GL_NV_point_sprite -#define GL_NV_point_sprite 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); -GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -#endif - -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#endif - -#ifndef GL_NV_vertex_program1_1 -#define GL_NV_vertex_program1_1 1 -#endif - -#ifndef GL_EXT_shadow_funcs -#define GL_EXT_shadow_funcs 1 -#endif - -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); -#endif - -#ifndef GL_ATI_text_fragment_shader -#define GL_ATI_text_fragment_shader 1 -#endif - -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#endif - -#ifndef GL_APPLE_element_array -#define GL_APPLE_element_array 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const GLvoid *pointer); -GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); -GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); -typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); -#endif - -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); -GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); -GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); -GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); -GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); -GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); -typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); -typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); -typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); -typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); -typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); -#endif - -#ifndef GL_APPLE_vertex_array_object -#define GL_APPLE_vertex_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); -GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); -GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); -GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); -typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); -typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); -typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); -#endif - -#ifndef GL_APPLE_vertex_array_range -#define GL_APPLE_vertex_array_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, GLvoid *pointer); -GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, GLvoid *pointer); -typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); -#endif - -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 1 -#endif - -#ifndef GL_S3_s3tc -#define GL_S3_s3tc 1 -#endif - -#ifndef GL_ATI_draw_buffers -#define GL_ATI_draw_buffers 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); -#endif - -#ifndef GL_ATI_pixel_format_float -#define GL_ATI_pixel_format_float 1 -/* This is really a WGL extension, but defines some associated GL enums. - * ATI does not export "GL_ATI_pixel_format_float" in the GL_EXTENSIONS string. - */ -#endif - -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#endif - -#ifndef GL_ATI_texture_float -#define GL_ATI_texture_float 1 -#endif - -#ifndef GL_NV_float_buffer -#define GL_NV_float_buffer 1 -#endif - -#ifndef GL_NV_fragment_program -#define GL_NV_fragment_program 1 -/* Some NV_fragment_program entry points are shared with ARB_vertex_program. */ -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); -typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); -#endif - -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); -GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); -GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); -GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); -GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); -GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); -GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); -GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); -GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); -GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); -GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); -GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -#endif - -#ifndef GL_NV_pixel_data_range -#define GL_NV_pixel_data_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const GLvoid *pointer); -GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); -#endif - -#ifndef GL_NV_primitive_restart -#define GL_NV_primitive_restart 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPrimitiveRestartNV (void); -GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); -typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); -#endif - -#ifndef GL_NV_texture_expand_normal -#define GL_NV_texture_expand_normal 1 -#endif - -#ifndef GL_NV_vertex_program2 -#define GL_NV_vertex_program2 1 -#endif - -#ifndef GL_ATI_map_object_buffer -#define GL_ATI_map_object_buffer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLvoid* APIENTRY glMapObjectBufferATI (GLuint buffer); -GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLvoid* (APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); -#endif - -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -#endif - -#ifndef GL_ATI_vertex_attrib_array_object -#define GL_ATI_vertex_attrib_array_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); -#endif - -#ifndef GL_OES_byte_coordinates -#define GL_OES_byte_coordinates 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); -GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); -GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); -GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); -GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); -GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); -GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); -GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); -GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); -GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); -GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); -GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); -GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); -GLAPI void APIENTRY glVertex2bOES (GLbyte x); -GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); -GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y); -GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); -GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z); -GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); -typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); -typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); -typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); -typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x); -typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y); -typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); -typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z); -typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); -#endif - -#ifndef GL_OES_fixed_point -#define GL_OES_fixed_point 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); -GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); -GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); -GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); -GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); -GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); -GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); -GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); -GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); -GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); -GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); -GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); -GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); -GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); -GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); -GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); -GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); -GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); -GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); -GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); -GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); -GLAPI void APIENTRY glIndexxOES (GLfixed component); -GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); -GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); -GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); -GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); -GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glLineWidthxOES (GLfixed width); -GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); -GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); -GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); -GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); -GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); -GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); -GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); -GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); -GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); -GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); -GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); -GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); -GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -GLAPI void APIENTRY glPassThroughxOES (GLfixed token); -GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); -GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); -GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); -GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); -GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glPointSizexOES (GLfixed size); -GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); -GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); -GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); -GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); -GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); -GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); -GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); -GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glSampleCoverageOES (GLfixed value, GLboolean invert); -GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); -GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); -GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); -GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); -GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); -GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); -GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); -GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); -GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); -GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glVertex2xOES (GLfixed x); -GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); -GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); -GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); -GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); -GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); -typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); -typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); -typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); -typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); -typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); -typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); -typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); -typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); -typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); -typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); -typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); -typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); -typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); -typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); -typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); -typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); -typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); -typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); -typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); -typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); -typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); -typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); -typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); -typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); -typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); -typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); -typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); -typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); -typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); -typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); -typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); -typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); -typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); -typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); -typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); -typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); -typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLSAMPLECOVERAGEOESPROC) (GLfixed value, GLboolean invert); -typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); -typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); -typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); -typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); -typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); -typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); -typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); -typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); -typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); -typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); -typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); -#endif - -#ifndef GL_OES_single_precision -#define GL_OES_single_precision 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); -GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); -GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); -GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); -typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); -typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); -typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); -#endif - -#ifndef GL_OES_compressed_paletted_texture -#define GL_OES_compressed_paletted_texture 1 -#endif - -#ifndef GL_OES_read_format -#define GL_OES_read_format 1 -#endif - -#ifndef GL_OES_query_matrix -#define GL_OES_query_matrix 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); -#endif - -#ifndef GL_EXT_depth_bounds_test -#define GL_EXT_depth_bounds_test 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); -#endif - -#ifndef GL_EXT_texture_mirror_clamp -#define GL_EXT_texture_mirror_clamp 1 -#endif - -#ifndef GL_EXT_blend_equation_separate -#define GL_EXT_blend_equation_separate 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_MESA_pack_invert -#define GL_MESA_pack_invert 1 -#endif - -#ifndef GL_MESA_ycbcr_texture -#define GL_MESA_ycbcr_texture 1 -#endif - -#ifndef GL_EXT_pixel_buffer_object -#define GL_EXT_pixel_buffer_object 1 -#endif - -#ifndef GL_NV_fragment_program_option -#define GL_NV_fragment_program_option 1 -#endif - -#ifndef GL_NV_fragment_program2 -#define GL_NV_fragment_program2 1 -#endif - -#ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option 1 -#endif - -#ifndef GL_NV_vertex_program3 -#define GL_NV_vertex_program3 1 -#endif - -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); -GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); -GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); -GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); -GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); -GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); -GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); -GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); -GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); -typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); -typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); -typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); -typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); -typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); -#endif - -#ifndef GL_GREMEDY_string_marker -#define GL_GREMEDY_string_marker 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const GLvoid *string); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const GLvoid *string); -#endif - -#ifndef GL_EXT_packed_depth_stencil -#define GL_EXT_packed_depth_stencil 1 -#endif - -#ifndef GL_EXT_stencil_clear_tag -#define GL_EXT_stencil_clear_tag 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); -#endif - -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 -#endif - -#ifndef GL_EXT_framebuffer_blit -#define GL_EXT_framebuffer_blit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -#endif - -#ifndef GL_EXT_framebuffer_multisample -#define GL_EXT_framebuffer_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_MESAX_texture_stack -#define GL_MESAX_texture_stack 1 -#endif - -#ifndef GL_EXT_timer_query -#define GL_EXT_timer_query 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64EXT *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); -#endif - -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); -#endif - -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); -#endif - -#ifndef GL_NV_gpu_program4 -#define GL_NV_gpu_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); -#endif - -#ifndef GL_NV_geometry_program4 -#define GL_NV_geometry_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); -GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); -#endif - -#ifndef GL_EXT_geometry_shader4 -#define GL_EXT_geometry_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); -#endif - -#ifndef GL_NV_vertex_program4 -#define GL_NV_vertex_program4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); -GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); -GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); -GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); -GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); -GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); -GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); -GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); -GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); -GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); -GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); -GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); -GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); -#endif - -#ifndef GL_EXT_gpu_shader4 -#define GL_EXT_gpu_shader4 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); -GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); -GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); -GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); -GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); -typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); -#endif - -#ifndef GL_EXT_draw_instanced -#define GL_EXT_draw_instanced 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); -typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif - -#ifndef GL_EXT_packed_float -#define GL_EXT_packed_float 1 -#endif - -#ifndef GL_EXT_texture_array -#define GL_EXT_texture_array 1 -#endif - -#ifndef GL_EXT_texture_buffer_object -#define GL_EXT_texture_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); -#endif - -#ifndef GL_EXT_texture_compression_latc -#define GL_EXT_texture_compression_latc 1 -#endif - -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc 1 -#endif - -#ifndef GL_EXT_texture_shared_exponent -#define GL_EXT_texture_shared_exponent 1 -#endif - -#ifndef GL_NV_depth_buffer_float -#define GL_NV_depth_buffer_float 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); -GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); -typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); -#endif - -#ifndef GL_NV_fragment_program4 -#define GL_NV_fragment_program4 1 -#endif - -#ifndef GL_NV_framebuffer_multisample_coverage -#define GL_NV_framebuffer_multisample_coverage 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -#endif - -#ifndef GL_EXT_framebuffer_sRGB -#define GL_EXT_framebuffer_sRGB 1 -#endif - -#ifndef GL_NV_geometry_shader4 -#define GL_NV_geometry_shader4 1 -#endif - -#ifndef GL_NV_parameter_buffer_object -#define GL_NV_parameter_buffer_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); -GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); -#endif - -#ifndef GL_EXT_draw_buffers2 -#define GL_EXT_draw_buffers2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); -GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); -GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); -GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); -GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); -typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); -typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); -typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); -typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); -#endif - -#ifndef GL_NV_transform_feedback -#define GL_NV_transform_feedback 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackNV (void); -GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLuint count, const GLint *attribs, GLenum bufferMode); -GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); -GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); -GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); -GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); -typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); -typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); -typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); -#endif - -#ifndef GL_EXT_bindable_uniform -#define GL_EXT_bindable_uniform 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); -GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); -GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); -typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); -typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); -#endif - -#ifndef GL_EXT_texture_integer -#define GL_EXT_texture_integer 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); -GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); -typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); -#endif - -#ifndef GL_GREMEDY_frame_terminator -#define GL_GREMEDY_frame_terminator 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); -#endif - -#ifndef GL_NV_conditional_render -#define GL_NV_conditional_render 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); -GLAPI void APIENTRY glEndConditionalRenderNV (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); -#endif - -#ifndef GL_NV_present_video -#define GL_NV_present_video 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); -GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); -typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); -typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); -#endif - -#ifndef GL_EXT_transform_feedback -#define GL_EXT_transform_feedback 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); -GLAPI void APIENTRY glEndTransformFeedbackEXT (void); -GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); -GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); -typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); -typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); -typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); -typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar* *varyings, GLenum bufferMode); -typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); -#endif - -#ifndef GL_EXT_direct_state_access -#define GL_EXT_direct_state_access 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); -GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); -GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); -GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); -GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); -GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); -GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); -GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); -GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); -GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); -GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); -GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, GLvoid* *data); -GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, GLvoid *img); -GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, GLvoid *img); -GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); -GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); -GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); -GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, GLvoid *string); -GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); -GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); -GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); -GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); -GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); -GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); -GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); -GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); -GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); -GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); -GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); -GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); -GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); -GLAPI GLvoid* APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); -GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); -GLAPI GLvoid* APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); -GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, GLvoid* *params); -GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); -GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); -GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); -GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); -GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); -GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); -GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); -GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); -GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); -GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); -GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); -typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); -typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); -typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); -typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); -typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); -typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); -typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); -typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); -typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); -typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid* *data); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, GLvoid *img); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *bits); -typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, GLvoid *img); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, GLvoid *string); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); -typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); -typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); -typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); -typedef GLvoid* (APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); -typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, GLvoid* *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); -typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); -typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); -typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); -typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); -typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); -#endif - -#ifndef GL_EXT_vertex_array_bgra -#define GL_EXT_vertex_array_bgra 1 -#endif - -#ifndef GL_EXT_texture_swizzle -#define GL_EXT_texture_swizzle 1 -#endif - -#ifndef GL_NV_explicit_multisample -#define GL_NV_explicit_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); -GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); -GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); -typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); -typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); -#endif - -#ifndef GL_NV_transform_feedback2 -#define GL_NV_transform_feedback2 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); -GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); -GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); -GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); -GLAPI void APIENTRY glPauseTransformFeedbackNV (void); -GLAPI void APIENTRY glResumeTransformFeedbackNV (void); -GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); -typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); -typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); -typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); -typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); -typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); -#endif - -#ifndef GL_ATI_meminfo -#define GL_ATI_meminfo 1 -#endif - -#ifndef GL_AMD_performance_monitor -#define GL_AMD_performance_monitor 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); -GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); -GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); -typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, GLvoid *data); -typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); -typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); -typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); -typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); -#endif - -#ifndef GL_AMD_texture_texture4 -#define GL_AMD_texture_texture4 1 -#endif - -#ifndef GL_AMD_vertex_shader_tessellator -#define GL_AMD_vertex_shader_tessellator 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); -GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); -typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_provoking_vertex -#define GL_EXT_provoking_vertex 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); -#endif - -#ifndef GL_EXT_texture_snorm -#define GL_EXT_texture_snorm 1 -#endif - -#ifndef GL_AMD_draw_buffers_blend -#define GL_AMD_draw_buffers_blend 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); -GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); -GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); -typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); -typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); -typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); -#endif - -#ifndef GL_APPLE_texture_range -#define GL_APPLE_texture_range 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const GLvoid *pointer); -GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, GLvoid* *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid* *params); -#endif - -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels 1 -#endif - -#ifndef GL_APPLE_vertex_program_evaluators -#define GL_APPLE_vertex_program_evaluators 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); -GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); -GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); -typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -#endif - -#ifndef GL_APPLE_aux_depth_stencil -#define GL_APPLE_aux_depth_stencil 1 -#endif - -#ifndef GL_APPLE_object_purgeable -#define GL_APPLE_object_purgeable 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); -GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); -typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); -#endif - -#ifndef GL_APPLE_row_bytes -#define GL_APPLE_row_bytes 1 -#endif - -#ifndef GL_APPLE_rgb_422 -#define GL_APPLE_rgb_422 1 -#endif - -#ifndef GL_NV_video_capture -#define GL_NV_video_capture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); -GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); -typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); -typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); -typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); -typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); -typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); -#endif - -#ifndef GL_NV_copy_image -#define GL_NV_copy_image 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); -#endif - -#ifndef GL_EXT_separate_shader_objects -#define GL_EXT_separate_shader_objects 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); -GLAPI void APIENTRY glActiveProgramEXT (GLuint program); -GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); -typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); -typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); -#endif - -#ifndef GL_NV_parameter_buffer_object2 -#define GL_NV_parameter_buffer_object2 1 -#endif - -#ifndef GL_NV_shader_buffer_load -#define GL_NV_shader_buffer_load 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); -GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); -GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); -GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); -GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); -GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); -GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); -GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); -GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); -GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); -GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); -typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); -typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); -typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); -typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); -typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); -typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif - -#ifndef GL_NV_vertex_buffer_unified_memory -#define GL_NV_vertex_buffer_unified_memory 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); -GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); -GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); -typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); -typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); -typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); -#endif - -#ifndef GL_NV_texture_barrier -#define GL_NV_texture_barrier 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTextureBarrierNV (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); -#endif - -#ifndef GL_AMD_shader_stencil_export -#define GL_AMD_shader_stencil_export 1 -#endif - -#ifndef GL_AMD_seamless_cubemap_per_texture -#define GL_AMD_seamless_cubemap_per_texture 1 -#endif - -#ifndef GL_AMD_conservative_depth -#define GL_AMD_conservative_depth 1 -#endif - -#ifndef GL_EXT_shader_image_load_store -#define GL_EXT_shader_image_load_store 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); -typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); -#endif - -#ifndef GL_EXT_vertex_attrib_64bit -#define GL_EXT_vertex_attrib_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); -GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); -GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); -GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); -GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); -GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); -#endif - -#ifndef GL_NV_gpu_program5 -#define GL_NV_gpu_program5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); -GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); -typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); -#endif - -#ifndef GL_NV_gpu_shader5 -#define GL_NV_gpu_shader5 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); -GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); -GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); -GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); -GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); -GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); -#endif - -#ifndef GL_NV_shader_buffer_store -#define GL_NV_shader_buffer_store 1 -#endif - -#ifndef GL_NV_tessellation_program5 -#define GL_NV_tessellation_program5 1 -#endif - -#ifndef GL_NV_vertex_attrib_integer_64bit -#define GL_NV_vertex_attrib_integer_64bit 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); -GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); -GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); -GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); -GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); -GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); -GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); -GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); -GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); -typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); -typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); -#endif - -#ifndef GL_NV_multisample_coverage -#define GL_NV_multisample_coverage 1 -#endif - -#ifndef GL_AMD_name_gen_delete -#define GL_AMD_name_gen_delete 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); -GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); -GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); -typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); -typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); -#endif - -#ifndef GL_AMD_debug_output -#define GL_AMD_debug_output 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, GLvoid *userParam); -GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); -typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); -typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, GLvoid *userParam); -typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); -#endif - -#ifndef GL_NV_vdpau_interop -#define GL_NV_vdpau_interop 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glVDPAUInitNV (const GLvoid *vdpDevice, const GLvoid *getProcAddress); -GLAPI void APIENTRY glVDPAUFiniNV (void); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -GLAPI void APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); -GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); -GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const GLvoid *vdpDevice, const GLvoid *getProcAddress); -typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); -typedef void (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); -typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); -typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); -typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); -typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); -#endif - -#ifndef GL_AMD_transform_feedback3_lines_triangles -#define GL_AMD_transform_feedback3_lines_triangles 1 -#endif - -#ifndef GL_AMD_depth_clamp_separate -#define GL_AMD_depth_clamp_separate 1 -#endif - -#ifndef GL_EXT_texture_sRGB_decode -#define GL_EXT_texture_sRGB_decode 1 -#endif - -#ifndef GL_NV_texture_multisample -#define GL_NV_texture_multisample 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); -typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); -#endif - -#ifndef GL_AMD_blend_minmax_factor -#define GL_AMD_blend_minmax_factor 1 -#endif - -#ifndef GL_AMD_sample_positions -#define GL_AMD_sample_positions 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); -#endif - -#ifndef GL_EXT_x11_sync_object -#define GL_EXT_x11_sync_object 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); -#endif - -#ifndef GL_AMD_multi_draw_indirect -#define GL_AMD_multi_draw_indirect 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride); -GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const GLvoid *indirect, GLsizei primcount, GLsizei stride); -typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const GLvoid *indirect, GLsizei primcount, GLsizei stride); -#endif - -#ifndef GL_EXT_framebuffer_multisample_blit_scaled -#define GL_EXT_framebuffer_multisample_blit_scaled 1 -#endif - -#ifndef GL_NV_path_rendering -#define GL_NV_path_rendering 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); -GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); -GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); -GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const GLvoid *pathString); -GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const GLvoid *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const GLvoid *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const GLvoid *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); -GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); -GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); -GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); -GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); -GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); -GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); -GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); -GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); -GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); -GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); -GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); -GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); -GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); -GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); -GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); -GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); -GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); -GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); -GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); -GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); -GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); -GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); -GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); -GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); -GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); -GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); -GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); -typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); -typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); -typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const GLvoid *coords); -typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const GLvoid *pathString); -typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const GLvoid *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const GLvoid *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const GLvoid *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); -typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); -typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); -typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); -typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); -typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); -typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); -typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); -typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); -typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); -typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); -typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); -typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); -typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); -typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); -typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); -typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); -typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); -typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); -typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); -typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); -typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); -typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); -typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); -typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); -typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const GLvoid *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); -typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); -typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); -typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); -typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); -typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); -typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); -typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); -typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); -#endif - -#ifndef GL_AMD_pinned_memory -#define GL_AMD_pinned_memory 1 -#endif - -#ifndef GL_AMD_stencil_operation_extended -#define GL_AMD_stencil_operation_extended 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); -#endif - -#ifndef GL_AMD_vertex_shader_viewport_index -#define GL_AMD_vertex_shader_viewport_index 1 -#endif - -#ifndef GL_AMD_vertex_shader_layer -#define GL_AMD_vertex_shader_layer 1 -#endif - -#ifndef GL_NV_bindless_texture -#define GL_NV_bindless_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); -GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); -GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); -GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); -GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); -GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); -GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); -GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); -GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); -GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); -GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); -typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); -typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); -typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); -typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); -typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); -#endif - -#ifndef GL_NV_shader_atomic_float -#define GL_NV_shader_atomic_float 1 -#endif - -#ifndef GL_AMD_query_buffer_object -#define GL_AMD_query_buffer_object 1 -#endif - -#ifndef GL_NV_compute_program5 -#define GL_NV_compute_program5 1 -#endif - -#ifndef GL_NV_shader_storage_buffer_object -#define GL_NV_shader_storage_buffer_object 1 -#endif - -#ifndef GL_NV_shader_atomic_counters -#define GL_NV_shader_atomic_counters 1 -#endif - -#ifndef GL_NV_deep_texture3D -#define GL_NV_deep_texture3D 1 -#endif - -#ifndef GL_NVX_conditional_render -#define GL_NVX_conditional_render 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); -GLAPI void APIENTRY glEndConditionalRenderNVX (void); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); -typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); -#endif - -#ifndef GL_AMD_sparse_texture -#define GL_AMD_sparse_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); -#endif - -#ifndef GL_AMD_shader_trinary_minmax -#define GL_AMD_shader_trinary_minmax 1 -#endif - -#ifndef GL_INTEL_map_texture -#define GL_INTEL_map_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); -GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); -GLAPI GLvoid* APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, const GLint *stride, const GLenum *layout); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); -typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); -typedef GLvoid* (APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, const GLint *stride, const GLenum *layout); -#endif - -#ifndef GL_NV_draw_texture -#define GL_NV_draw_texture 1 -#ifdef GL_GLEXT_PROTOTYPES -GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -#endif /* GL_GLEXT_PROTOTYPES */ -typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); -#endif +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif /* GL_WIN_phong_shading */ +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif /* GL_WIN_specular_fog */ #ifdef __cplusplus } diff --git a/README.md b/README.md index 9701937b1b..64a8c681b0 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ __Mac OSX__ ### Building To initialize the repository don't forget to execute `git submodule update --init` to pull the wxWidgets source. -* __Windows__: Install *Visual Studio 2013*. Then open the *.SLN* file, and press *Build* > *Rebuild Solution*. +* __Windows__: Install *Visual Studio 2013*, *Cmake*, *Python* and select *Add in the PATH variable* for both. Then open the *.SLN* file, and press *Build* > *Rebuild Solution*. * __Linux & Mac OSX__: `cd rpcs3 && cmake CMakeLists.txt && make && cd ../` Then run with `cd bin && ./rpcs3` diff --git a/Utilities/AutoPause.cpp b/Utilities/AutoPause.cpp index 9c3fc70edf..b1e4c3ed0a 100644 --- a/Utilities/AutoPause.cpp +++ b/Utilities/AutoPause.cpp @@ -69,12 +69,12 @@ void AutoPause::Reload(void) //Less than 1024 - be regarded as a system call. //emplace_back may not cause reductant move/copy operation. m_pause_syscall.emplace_back(num); - LOG_WARNING(HLE, "Auto Pause: Find System Call ID %x", num); + LOG_WARNING(HLE, "Auto Pause: Find System Call ID 0x%x", num); } else { m_pause_function.emplace_back(num); - LOG_WARNING(HLE, "Auto Pause: Find Function Call ID %x", num); + LOG_WARNING(HLE, "Auto Pause: Find Function Call ID 0x%x", num); } } list.Close(); @@ -103,7 +103,7 @@ void AutoPause::TryPause(u32 code) { if (code == m_pause_syscall[i]) { Emu.Pause(); - LOG_ERROR(HLE, "Auto Pause Triggered: System call %x", code); //Used Error + LOG_ERROR(HLE, "Auto Pause Triggered: System call 0x%x", code); // Used Error } } } @@ -121,7 +121,7 @@ void AutoPause::TryPause(u32 code) { if (code == m_pause_function[i]) { Emu.Pause(); - LOG_ERROR(HLE, "Auto Pause Triggered: Function call %x", code); //Used Error + LOG_ERROR(HLE, "Auto Pause Triggered: Function call 0x%x", code); // Used Error } } } diff --git a/Utilities/BEType.h b/Utilities/BEType.h index 3c6d0b74ec..768e25770c 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -1,20 +1,91 @@ #pragma once -#include - -union u128 +union _CRT_ALIGN(16) u128 { u64 _u64[2]; s64 _s64[2]; + + class u64_reversed_array_2 + { + u64 data[2]; + + public: + u64& operator [] (s32 index) + { + return data[1 - index]; + } + + const u64& operator [] (s32 index) const + { + return data[1 - index]; + } + + } u64r; + u32 _u32[4]; s32 _s32[4]; + + class u32_reversed_array_4 + { + u32 data[4]; + + public: + u32& operator [] (s32 index) + { + return data[3 - index]; + } + + const u32& operator [] (s32 index) const + { + return data[3 - index]; + } + + } u32r; + u16 _u16[8]; s16 _s16[8]; + + class u16_reversed_array_8 + { + u16 data[8]; + + public: + u16& operator [] (s32 index) + { + return data[7 - index]; + } + + const u16& operator [] (s32 index) const + { + return data[7 - index]; + } + + } u16r; + u8 _u8[16]; s8 _s8[16]; + + class u8_reversed_array_16 + { + u8 data[16]; + + public: + u8& operator [] (s32 index) + { + return data[15 - index]; + } + + const u8& operator [] (s32 index) const + { + return data[15 - index]; + } + + } u8r; + float _f[4]; double _d[2]; - __m128 xmm; + __m128 vf; + __m128i vi; class bit_array_128 { @@ -94,6 +165,11 @@ union u128 return ret; } + static u128 from64r(u64 _1, u64 _0 = 0) + { + return from64(_0, _1); + } + static u128 from32(u32 _0, u32 _1 = 0, u32 _2 = 0, u32 _3 = 0) { u128 ret; @@ -104,6 +180,25 @@ union u128 return ret; } + static u128 from32r(u32 _3, u32 _2 = 0, u32 _1 = 0, u32 _0 = 0) + { + return from32(_0, _1, _2, _3); + } + + static u128 from32p(u32 value) + { + u128 ret; + ret.vi = _mm_set1_epi32((int)value); + return ret; + } + + static u128 from8p(u8 value) + { + u128 ret; + ret.vi = _mm_set1_epi8((char)value); + return ret; + } + static u128 fromBit(u32 bit) { u128 ret = {}; @@ -111,9 +206,41 @@ union u128 return ret; } - void setBit(u32 bit) + static u128 fromV(__m128i value) { - _bit[bit] = true; + u128 ret; + ret.vi = value; + return ret; + } + + static __forceinline u128 add8(const u128& left, const u128& right) + { + return fromV(_mm_add_epi8(left.vi, right.vi)); + } + + static __forceinline u128 sub8(const u128& left, const u128& right) + { + return fromV(_mm_sub_epi8(left.vi, right.vi)); + } + + static __forceinline u128 minu8(const u128& left, const u128& right) + { + return fromV(_mm_min_epu8(left.vi, right.vi)); + } + + static __forceinline u128 eq8(const u128& left, const u128& right) + { + return fromV(_mm_cmpeq_epi8(left.vi, right.vi)); + } + + static __forceinline u128 gtu8(const u128& left, const u128& right) + { + return fromV(_mm_cmpgt_epu8(left.vi, right.vi)); + } + + static __forceinline u128 leu8(const u128& left, const u128& right) + { + return fromV(_mm_cmple_epu8(left.vi, right.vi)); } bool operator == (const u128& right) const @@ -126,19 +253,19 @@ union u128 return (_u64[0] != right._u64[0]) || (_u64[1] != right._u64[1]); } - u128 operator | (const u128& right) const + __forceinline u128 operator | (const u128& right) const { - return from64(_u64[0] | right._u64[0], _u64[1] | right._u64[1]); + return fromV(_mm_or_si128(vi, right.vi)); } - u128 operator & (const u128& right) const + __forceinline u128 operator & (const u128& right) const { - return from64(_u64[0] & right._u64[0], _u64[1] & right._u64[1]); + return fromV(_mm_and_si128(vi, right.vi)); } - u128 operator ^ (const u128& right) const + __forceinline u128 operator ^ (const u128& right) const { - return from64(_u64[0] ^ right._u64[0], _u64[1] ^ right._u64[1]); + return fromV(_mm_xor_si128(vi, right.vi)); } u128 operator ~ () const @@ -146,6 +273,12 @@ union u128 return from64(~_u64[0], ~_u64[1]); } + // result = (~left) & (right) + static __forceinline u128 andnot(const u128& left, const u128& right) + { + return fromV(_mm_andnot_si128(left.vi, right.vi)); + } + void clear() { _u64[1] = _u64[0] = 0; @@ -153,7 +286,7 @@ union u128 std::string to_hex() const { - return fmt::Format("%16llx%16llx", _u64[1], _u64[0]); + return fmt::Format("%016llx%016llx", _u64[1], _u64[0]); } std::string to_xyzw() const @@ -170,6 +303,72 @@ union u128 } }; +#ifndef InterlockedCompareExchange +static __forceinline u128 InterlockedCompareExchange(volatile u128* dest, u128 exch, u128 comp) +{ +#if defined(__GNUG__) + auto res = __sync_val_compare_and_swap((volatile __int128_t*)dest, (__int128_t&)comp, (__int128_t&)exch); + return (u128&)res; +#else + _InterlockedCompareExchange128((volatile long long*)dest, exch._u64[1], exch._u64[0], (long long*)&comp); + return comp; +#endif +} +#endif + +static __forceinline bool InterlockedCompareExchangeTest(volatile u128* dest, u128 exch, u128 comp) +{ +#if defined(__GNUG__) + return __sync_bool_compare_and_swap((volatile __int128_t*)dest, (__int128_t&)comp, (__int128_t&)exch); +#else + return _InterlockedCompareExchange128((volatile long long*)dest, exch._u64[1], exch._u64[0], (long long*)&comp) != 0; +#endif +} + +#ifndef InterlockedExchange +static __forceinline u128 InterlockedExchange(volatile u128* dest, u128 value) +{ + while (true) + { + const u128 old = *(u128*)dest; + if (InterlockedCompareExchangeTest(dest, value, old)) return old; + } +} +#endif + +#ifndef InterlockedOr +static __forceinline u128 InterlockedOr(volatile u128* dest, u128 value) +{ + while (true) + { + const u128 old = *(u128*)dest; + if (InterlockedCompareExchangeTest(dest, old | value, old)) return old; + } +} +#endif + +#ifndef InterlockedAnd +static __forceinline u128 InterlockedAnd(volatile u128* dest, u128 value) +{ + while (true) + { + const u128 old = *(u128*)dest; + if (InterlockedCompareExchangeTest(dest, old & value, old)) return old; + } +} +#endif + +#ifndef InterlockedXor +static __forceinline u128 InterlockedXor(volatile u128* dest, u128 value) +{ + while (true) + { + const u128 old = *(u128*)dest; + if (InterlockedCompareExchangeTest(dest, old ^ value, old)) return old; + } +} +#endif + #define re16(val) _byteswap_ushort(val) #define re32(val) _byteswap_ulong(val) #define re64(val) _byteswap_uint64(val) @@ -252,7 +451,13 @@ template class be_t { static_assert(sizeof(T2) == 1 || sizeof(T2) == 2 || sizeof(T2) == 4 || sizeof(T2) == 8, "Bad be_t type"); - T m_data; + +public: + typedef typename std::remove_cv::type type; + static const bool is_le_machine = true; + +private: + type m_data; template struct _convert @@ -283,59 +488,78 @@ class be_t return (be_t&)res; } }; + public: - typedef T type; - - const T& ToBE() const + const type& ToBE() const { return m_data; } - T ToLE() const + type ToLE() const { - return se_t::func(m_data); + return se_t::func(m_data); } - void FromBE(const T& value) + void FromBE(const type& value) { m_data = value; } - void FromLE(const T& value) + void FromLE(const type& value) { - m_data = se_t::func(value); + m_data = se_t::func(value); } - static be_t MakeFromLE(const T value) + static be_t MakeFromLE(const type value) { - T data = se_t::func(value); + type data = se_t::func(value); return (be_t&)data; } - static be_t MakeFromBE(const T value) + static be_t MakeFromBE(const type value) { return (be_t&)value; } - //template - operator const T() const + //make be_t from current machine byte ordering + static be_t make(const type value) { - return ToLE(); + return is_le_machine ? MakeFromLE(value) : MakeFromBE(value); } + //get value in current machine byte ordering + __forceinline type value() const + { + return is_le_machine ? ToLE() : ToBE(); + } + + //be_t() = default; + //be_t(const be_t& value) = default; + + //be_t(type value) + //{ + // m_data = se_t::func(value); + //} + be_t& operator = (const be_t& value) = default; - be_t& operator = (T value) + be_t& operator = (type value) { - m_data = se_t::func(value); + m_data = se_t::func(value); return *this; } + operator type() const + { + return value(); + } + template operator const be_t() const { - return _convert sizeof(T)) ? 1 : (sizeof(T1) < sizeof(T) ? 2 : 0))>::func(m_data); + return be_t::make(value()); + //return _convert sizeof(T)) ? 1 : (sizeof(T1) < sizeof(T) ? 2 : 0))>::func(m_data); } template be_t& operator += (T1 right) { return *this = T(*this) + right; } @@ -382,81 +606,6 @@ public: be_t& operator-- () { *this -= 1; return *this; } }; -template -class be_t -{ - static_assert(sizeof(T2) == 1 || sizeof(T2) == 2 || sizeof(T2) == 4 || sizeof(T2) == 8, "Bad be_t type"); - const T m_data; - -public: - typedef const T type; - - const T& ToBE() const - { - return m_data; - } - - const T ToLE() const - { - return se_t::func(m_data); - } - - static be_t MakeFromLE(const T value) - { - const T data = se_t::func(value); - return (be_t&)data; - } - - static be_t MakeFromBE(const T value) - { - return (be_t&)value; - } - - //template - operator const T() const - { - return ToLE(); - } - - template - operator const be_t() const - { - if (sizeof(T1) > sizeof(T) || std::is_floating_point::value || std::is_floating_point::value) - { - T1 res = se_t::func(ToLE()); - return (be_t&)res; - } - else if (sizeof(T1) < sizeof(T)) - { - T1 res = ToBE() >> ((sizeof(T) - sizeof(T1)) * 8); - return (be_t&)res; - } - else - { - T1 res = ToBE(); - return (be_t&)res; - } - } - - template be_t operator & (const be_t& right) const { const T res = ToBE() & right.ToBE(); return (be_t&)res; } - template be_t operator | (const be_t& right) const { const T res = ToBE() | right.ToBE(); return (be_t&)res; } - template be_t operator ^ (const be_t& right) const { const T res = ToBE() ^ right.ToBE(); return (be_t&)res; } - - template bool operator == (T1 right) const { return (T1)ToLE() == right; } - template bool operator != (T1 right) const { return !(*this == right); } - template bool operator > (T1 right) const { return (T1)ToLE() > right; } - template bool operator < (T1 right) const { return (T1)ToLE() < right; } - template bool operator >= (T1 right) const { return (T1)ToLE() >= right; } - template bool operator <= (T1 right) const { return (T1)ToLE() <= right; } - - template bool operator == (const be_t& right) const { return ToBE() == right.ToBE(); } - template bool operator != (const be_t& right) const { return !(*this == right); } - template bool operator > (const be_t& right) const { return (T1)ToLE() > right.ToLE(); } - template bool operator < (const be_t& right) const { return (T1)ToLE() < right.ToLE(); } - template bool operator >= (const be_t& right) const { return (T1)ToLE() >= right.ToLE(); } - template bool operator <= (const be_t& right) const { return (T1)ToLE() <= right.ToLE(); } -}; - template struct is_be_t : public std::integral_constant {}; @@ -496,6 +645,8 @@ public: //be_t if need swap endianes, T otherwise typedef typename _be_type_selector< T, T2, value >::type type; + + typedef typename _be_type_selector< T, T2, !is_be_t::value >::type forced_type; }; template @@ -623,3 +774,51 @@ template __forceinline static void Write64(T& f, const u64 data) { Write64LE(f, re64(data)); } + +template +struct convert_le_be_t +{ + static Tto func(Tfrom&& value) + { + return (Tto)value; + } +}; + +template +struct convert_le_be_t, Tfrom> +{ + static be_t func(Tfrom&& value) + { + return be_t::make(value); + } +}; + +template +struct convert_le_be_t, be_t> +{ + static be_t func(be_t&& value) + { + return value; + } +}; + +template +struct convert_le_be_t> +{ + static Tto func(be_t&& value) + { + return value.value(); + } +}; + +template +__forceinline Tto convert_le_be(Tfrom&& value) +{ + return convert_le_be_t::func(value); +} + +template +__forceinline void convert_le_be(Tto& dst, Tfrom&& src) +{ + dst = convert_le_be_t::func(src); +} \ No newline at end of file diff --git a/Utilities/GNU.h b/Utilities/GNU.h index 43b00feafc..91fc34ae50 100644 --- a/Utilities/GNU.h +++ b/Utilities/GNU.h @@ -1,5 +1,7 @@ #pragma once +#include + #ifdef _WIN32 #define thread_local __declspec(thread) #elif __APPLE__ @@ -13,13 +15,21 @@ #endif template -void strcpy_trunc(char (&dst)[size], const std::string& src) +void strcpy_trunc(char(&dst)[size], const std::string& src) { const size_t count = (src.size() >= size) ? size - 1 /* truncation */ : src.size(); memcpy(dst, src.c_str(), count); dst[count] = 0; } +template +void strcpy_trunc(char(&dst)[size], const char(&src)[rsize]) +{ + const size_t count = (rsize >= size) ? size - 1 /* truncation */ : rsize; + memcpy(dst, src, count); + dst[count] = 0; +} + #if defined(__GNUG__) #include #include @@ -36,20 +46,6 @@ void strcpy_trunc(char (&dst)[size], const std::string& src) #define _byteswap_uint64(x) __builtin_bswap64(x) #define INFINITE 0xFFFFFFFF #define _CRT_ALIGN(x) __attribute__((aligned(x))) -#define InterlockedCompareExchange(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val) -#define InterlockedCompareExchange64(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val) - -inline int64_t InterlockedOr64(volatile int64_t *dest, int64_t val) -{ - int64_t olderval; - int64_t oldval = *dest; - do - { - olderval = oldval; - oldval = InterlockedCompareExchange64(dest, olderval | val, olderval); - } while (olderval != oldval); - return oldval; -} inline uint64_t __umulh(uint64_t a, uint64_t b) { @@ -84,12 +80,257 @@ int clock_gettime(int foo, struct timespec *ts); #endif #ifndef InterlockedCompareExchange +static __forceinline uint8_t InterlockedCompareExchange(volatile uint8_t* dest, uint8_t exch, uint8_t comp) +{ +#if defined(__GNUG__) + return __sync_val_compare_and_swap(dest, comp, exch); +#else + return _InterlockedCompareExchange8((volatile char*)dest, exch, comp); +#endif +} +static __forceinline uint16_t InterlockedCompareExchange(volatile uint16_t* dest, uint16_t exch, uint16_t comp) +{ +#if defined(__GNUG__) + return __sync_val_compare_and_swap(dest, comp, exch); +#else + return _InterlockedCompareExchange16((volatile short*)dest, exch, comp); +#endif +} static __forceinline uint32_t InterlockedCompareExchange(volatile uint32_t* dest, uint32_t exch, uint32_t comp) { +#if defined(__GNUG__) + return __sync_val_compare_and_swap(dest, comp, exch); +#else return _InterlockedCompareExchange((volatile long*)dest, exch, comp); +#endif } static __forceinline uint64_t InterlockedCompareExchange(volatile uint64_t* dest, uint64_t exch, uint64_t comp) { +#if defined(__GNUG__) + return __sync_val_compare_and_swap(dest, comp, exch); +#else return _InterlockedCompareExchange64((volatile long long*)dest, exch, comp); +#endif +} +#endif + +static __forceinline bool InterlockedCompareExchangeTest(volatile uint8_t* dest, uint8_t exch, uint8_t comp) +{ +#if defined(__GNUG__) + return __sync_bool_compare_and_swap(dest, comp, exch); +#else + return (uint8_t)_InterlockedCompareExchange8((volatile char*)dest, exch, comp) == comp; +#endif +} +static __forceinline bool InterlockedCompareExchangeTest(volatile uint16_t* dest, uint16_t exch, uint16_t comp) +{ +#if defined(__GNUG__) + return __sync_bool_compare_and_swap(dest, comp, exch); +#else + return (uint16_t)_InterlockedCompareExchange16((volatile short*)dest, exch, comp) == comp; +#endif +} +static __forceinline bool InterlockedCompareExchangeTest(volatile uint32_t* dest, uint32_t exch, uint32_t comp) +{ +#if defined(__GNUG__) + return __sync_bool_compare_and_swap(dest, comp, exch); +#else + return (uint32_t)_InterlockedCompareExchange((volatile long*)dest, exch, comp) == comp; +#endif +} +static __forceinline bool InterlockedCompareExchangeTest(volatile uint64_t* dest, uint64_t exch, uint64_t comp) +{ +#if defined(__GNUG__) + return __sync_bool_compare_and_swap(dest, comp, exch); +#else + return (uint64_t)_InterlockedCompareExchange64((volatile long long*)dest, exch, comp) == comp; +#endif +} + +#ifndef InterlockedExchange +static __forceinline uint8_t InterlockedExchange(volatile uint8_t* dest, uint8_t value) +{ +#if defined(__GNUG__) + return __sync_lock_test_and_set(dest, value); +#else + return _InterlockedExchange8((volatile char*)dest, value); +#endif +} +static __forceinline uint16_t InterlockedExchange(volatile uint16_t* dest, uint16_t value) +{ +#if defined(__GNUG__) + return __sync_lock_test_and_set(dest, value); +#else + return _InterlockedExchange16((volatile short*)dest, value); +#endif +} +static __forceinline uint32_t InterlockedExchange(volatile uint32_t* dest, uint32_t value) +{ +#if defined(__GNUG__) + return __sync_lock_test_and_set(dest, value); +#else + return _InterlockedExchange((volatile long*)dest, value); +#endif +} +static __forceinline uint64_t InterlockedExchange(volatile uint64_t* dest, uint64_t value) +{ +#if defined(__GNUG__) + return __sync_lock_test_and_set(dest, value); +#else + return _InterlockedExchange64((volatile long long*)dest, value); +#endif +} +#endif + +#ifndef InterlockedOr +static __forceinline uint8_t InterlockedOr(volatile uint8_t* dest, uint8_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_or(dest, value); +#else + return _InterlockedOr8((volatile char*)dest, value); +#endif +} +static __forceinline uint16_t InterlockedOr(volatile uint16_t* dest, uint16_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_or(dest, value); +#else + return _InterlockedOr16((volatile short*)dest, value); +#endif +} +static __forceinline uint32_t InterlockedOr(volatile uint32_t* dest, uint32_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_or(dest, value); +#else + return _InterlockedOr((volatile long*)dest, value); +#endif +} +static __forceinline uint64_t InterlockedOr(volatile uint64_t* dest, uint64_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_or(dest, value); +#else + return _InterlockedOr64((volatile long long*)dest, value); +#endif +} +#endif + +#ifndef InterlockedAnd +static __forceinline uint8_t InterlockedAnd(volatile uint8_t* dest, uint8_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_and(dest, value); +#else + return _InterlockedAnd8((volatile char*)dest, value); +#endif +} +static __forceinline uint16_t InterlockedAnd(volatile uint16_t* dest, uint16_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_and(dest, value); +#else + return _InterlockedAnd16((volatile short*)dest, value); +#endif +} +static __forceinline uint32_t InterlockedAnd(volatile uint32_t* dest, uint32_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_and(dest, value); +#else + return _InterlockedAnd((volatile long*)dest, value); +#endif +} +static __forceinline uint64_t InterlockedAnd(volatile uint64_t* dest, uint64_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_and(dest, value); +#else + return _InterlockedAnd64((volatile long long*)dest, value); +#endif +} +#endif + +#ifndef InterlockedXor +static __forceinline uint8_t InterlockedXor(volatile uint8_t* dest, uint8_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_xor(dest, value); +#else + return _InterlockedXor8((volatile char*)dest, value); +#endif +} +static __forceinline uint16_t InterlockedXor(volatile uint16_t* dest, uint16_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_xor(dest, value); +#else + return _InterlockedXor16((volatile short*)dest, value); +#endif +} +static __forceinline uint32_t InterlockedXor(volatile uint32_t* dest, uint32_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_xor(dest, value); +#else + return _InterlockedXor((volatile long*)dest, value); +#endif +} +static __forceinline uint64_t InterlockedXor(volatile uint64_t* dest, uint64_t value) +{ +#if defined(__GNUG__) + return __sync_fetch_and_xor(dest, value); +#else + return _InterlockedXor64((volatile long long*)dest, value); +#endif +} +#endif + +static __forceinline uint32_t cntlz32(uint32_t arg) +{ +#if defined(__GNUG__) + return __builtin_clzl(arg); +#else + unsigned long res; + if (!_BitScanReverse(&res, arg)) + { + return 32; + } + else + { + return res ^ 31; + } +#endif +} + +static __forceinline uint64_t cntlz64(uint64_t arg) +{ +#if defined(__GNUG__) + return __builtin_clzll(arg); +#else + unsigned long res; + if (!_BitScanReverse64(&res, arg)) + { + return 64; + } + else + { + return res ^ 63; + } +#endif +} + +// compare 16 packed unsigned bytes (greater than) +static __forceinline __m128i _mm_cmpgt_epu8(__m128i A, __m128i B) +{ + // (A xor 0x80) > (B xor 0x80) + return _mm_cmpgt_epi8(_mm_xor_si128(A, _mm_set1_epi8(-128)), _mm_xor_si128(B, _mm_set1_epi8(-128))); +} + +// compare 16 packed unsigned bytes (less or equal) +static __forceinline __m128i _mm_cmple_epu8(__m128i A, __m128i B) +{ + // ((B xor 0x80) > (A xor 0x80)) || A == B + return _mm_or_si128(_mm_cmpgt_epu8(B, A), _mm_cmpeq_epi8(A, B)); } -#endif \ No newline at end of file diff --git a/Utilities/Log.h b/Utilities/Log.h index 8dbeb71e07..46fc604f5a 100644 --- a/Utilities/Log.h +++ b/Utilities/Log.h @@ -24,6 +24,7 @@ namespace Log HLE, PPU, SPU, + ARMv7, TTY, }; @@ -35,7 +36,7 @@ namespace Log }; //well I'd love make_array() but alas manually counting is not the end of the world - static const std::array gTypeNameTable = { { + static const std::array gTypeNameTable = { { { GENERAL, "G: " }, { LOADER, "LDR: " }, { MEMORY, "MEM: " }, @@ -43,6 +44,7 @@ namespace Log { HLE, "HLE: " }, { PPU, "PPU: " }, { SPU, "SPU: " }, + { ARMv7, "ARM: " }, { TTY, "TTY: " } } }; @@ -121,6 +123,7 @@ static struct { inline operator Log::LogType() { return Log::LogType::RSX; } } R static struct { inline operator Log::LogType() { return Log::LogType::HLE; } } HLE; static struct { inline operator Log::LogType() { return Log::LogType::PPU; } } PPU; static struct { inline operator Log::LogType() { return Log::LogType::SPU; } } SPU; +static struct { inline operator Log::LogType() { return Log::LogType::ARMv7; } } ARMv7; static struct { inline operator Log::LogType() { return Log::LogType::TTY; } } TTY; inline void log_message(Log::LogType type, Log::LogSeverity sev, const char* text) diff --git a/Utilities/SMutex.cpp b/Utilities/SMutex.cpp index 684429b60e..e10296bd68 100644 --- a/Utilities/SMutex.cpp +++ b/Utilities/SMutex.cpp @@ -8,15 +8,3 @@ bool SM_IsAborted() { return Emu.IsStopped(); } - -void SM_Sleep() -{ - if (NamedThreadBase* t = GetCurrentNamedThread()) - { - t->WaitForAnySignal(); - } - else - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } -} diff --git a/Utilities/SMutex.h b/Utilities/SMutex.h index 8acc971894..5d50fe18e1 100644 --- a/Utilities/SMutex.h +++ b/Utilities/SMutex.h @@ -1,7 +1,7 @@ #pragma once +#include "Emu/Memory/atomic_type.h" bool SM_IsAborted(); -void SM_Sleep(); enum SMutexResult { @@ -19,25 +19,25 @@ template < typename T, const u64 free_value = 0, - const u64 dead_value = 0xffffffffffffffffull, - void (*wait)() = SM_Sleep + const u64 dead_value = 0xffffffffffffffffull > class SMutexBase { - static_assert(sizeof(T) == sizeof(std::atomic), "Invalid SMutexBase type"); - std::atomic owner; + static_assert(sizeof(T) == sizeof(atomic_le_t), "Invalid SMutexBase type"); + T owner; + typedef atomic_le_t AT; public: static const T GetFreeValue() { static const u64 value = free_value; - return (const T&)value; + return (T&)value; } static const T GetDeadValue() { static const u64 value = dead_value; - return (const T&)value; + return (T&)value; } void initialize() @@ -45,11 +45,6 @@ public: owner = GetFreeValue(); } - SMutexBase() - { - initialize(); - } - void finalize() { owner = GetDeadValue(); @@ -66,9 +61,9 @@ public: { return SMR_ABORT; } - T old = GetFreeValue(); + T old = reinterpret_cast(owner).compare_and_swap(GetFreeValue(), tid); - if (!owner.compare_exchange_strong(old, tid)) + if (old != GetFreeValue()) { if (old == tid) { @@ -90,9 +85,9 @@ public: { return SMR_ABORT; } - T old = tid; + T old = reinterpret_cast(owner).compare_and_swap(tid, to); - if (!owner.compare_exchange_strong(old, to)) + if (old != tid) { if (old == GetFreeValue()) { @@ -121,7 +116,7 @@ public: default: return res; } - if (wait != nullptr) wait(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); if (timeout && counter++ > timeout) { @@ -131,5 +126,4 @@ public: } }; -typedef SMutexBase - SMutex; +typedef SMutexBase SMutex; diff --git a/Utilities/SQueue.h b/Utilities/SQueue.h index 83d7adc3dd..9310bea613 100644 --- a/Utilities/SQueue.h +++ b/Utilities/SQueue.h @@ -1,6 +1,6 @@ #pragma once -#include "Utilities/SMutex.h" +static const volatile bool sq_no_wait = true; template class SQueue @@ -22,18 +22,18 @@ public: return SQSize; } - bool Push(const T& data) + bool Push(const T& data, const volatile bool* do_exit) { while (true) { if (m_count >= SQSize) { - if (Emu.IsStopped()) + if (Emu.IsStopped() || (do_exit && *do_exit)) { return false; } - SM_Sleep(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; } @@ -49,18 +49,18 @@ public: } } - bool Pop(T& data) + bool Pop(T& data, const volatile bool* do_exit) { while (true) { if (!m_count) { - if (Emu.IsStopped()) + if (Emu.IsStopped() || (do_exit && *do_exit)) { return false; } - SM_Sleep(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; } @@ -78,41 +78,24 @@ public: } } - u32 GetCount() - { - std::lock_guard lock(m_mutex); - return m_count; - } - - u32 GetCountUnsafe() - { - return m_count; - } - - bool IsEmpty() - { - std::lock_guard lock(m_mutex); - return !m_count; - } - void Clear() { std::lock_guard lock(m_mutex); m_count = 0; } - T& Peek(u32 pos = 0) + bool Peek(T& data, const volatile bool* do_exit, u32 pos = 0) { while (true) { if (m_count <= pos) { - if (Emu.IsStopped()) + if (Emu.IsStopped() || (do_exit && *do_exit)) { - break; + return false; } - SM_Sleep(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; } @@ -124,21 +107,7 @@ public: } } } - return m_data[(m_pos + pos) % SQSize]; - } - - T& PeekIfExist(u32 pos = 0) - { - static T def_value; - - std::lock_guard lock(m_mutex); - if (m_count <= pos) - { - return def_value; - } - else - { - return m_data[(m_pos + pos) % SQSize]; - } + data = m_data[(m_pos + pos) % SQSize]; + return true; } }; diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index 9f1709c0bf..b9e3955888 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -102,4 +102,35 @@ std::vector fmt::rSplit(const std::string& source, const std::strin } } while (true); return ret; +} + +std::vector fmt::split(const std::string& source, std::initializer_list separators, bool is_skip_empty) +{ + std::vector result; + + size_t cursor_begin = 0; + + for (size_t cursor_end = 0; cursor_end < source.length(); ++cursor_end) + { + for (auto &separator : separators) + { + if (strncmp(source.c_str() + cursor_end, separator.c_str(), separator.length()) == 0) + { + std::string candidate = source.substr(cursor_begin, cursor_end - cursor_begin); + if (!is_skip_empty || !candidate.empty()) + result.push_back(candidate); + + cursor_begin = cursor_end + separator.length(); + cursor_end = cursor_begin - 1; + break; + } + } + } + + if (cursor_begin != source.length()) + { + result.push_back(source.substr(cursor_begin)); + } + + return std::move(result); } \ No newline at end of file diff --git a/Utilities/StrFmt.h b/Utilities/StrFmt.h index 1914cb26e0..20a5fdcfc2 100644 --- a/Utilities/StrFmt.h +++ b/Utilities/StrFmt.h @@ -192,4 +192,6 @@ namespace fmt{ void Replace(std::string &str, const std::string &searchterm, const std::string& replaceterm); std::vector rSplit(const std::string& source, const std::string& delim); + + std::vector split(const std::string& source, std::initializer_list separators, bool is_skip_empty = true); } diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index b24ad1036f..d45fe55fd8 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "Emu/System.h" #include "Log.h" #include "Thread.h" @@ -207,3 +208,61 @@ bool thread::joinable() const { return m_thr.joinable(); } + +bool waiter_map_t::is_stopped(u64 signal_id) +{ + if (Emu.IsStopped()) + { + LOG_WARNING(Log::HLE, "%s.waiter_op() aborted (signal_id=0x%llx)", m_name.c_str(), signal_id); + return true; + } + return false; +} + +void waiter_map_t::waiter_reg_t::init() +{ + if (thread) return; + + thread = GetCurrentNamedThread(); + + std::lock_guard lock(map.m_mutex); + + // add waiter + map.m_waiters.push_back({ signal_id, thread }); +} + +waiter_map_t::waiter_reg_t::~waiter_reg_t() +{ + if (!thread) return; + + std::lock_guard lock(map.m_mutex); + + // remove waiter + for (s64 i = map.m_waiters.size() - 1; i >= 0; i--) + { + if (map.m_waiters[i].signal_id == signal_id && map.m_waiters[i].thread == thread) + { + map.m_waiters.erase(map.m_waiters.begin() + i); + return; + } + } + + LOG_ERROR(HLE, "%s(): waiter not found (signal_id=0x%llx, map='%s')", __FUNCTION__, signal_id, map.m_name.c_str()); + Emu.Pause(); +} + +void waiter_map_t::notify(u64 signal_id) +{ + if (!m_waiters.size()) return; + + std::lock_guard lock(m_mutex); + + // find waiter and signal + for (auto& v : m_waiters) + { + if (v.signal_id == signal_id) + { + v.thread->Notify(); + } + } +} diff --git a/Utilities/Thread.h b/Utilities/Thread.h index 2566cdf43b..09334171dc 100644 --- a/Utilities/Thread.h +++ b/Utilities/Thread.h @@ -69,4 +69,107 @@ public: void detach(); void join(); bool joinable() const; -}; \ No newline at end of file +}; + +class s_mutex_t +{ + +}; + +class s_shared_mutex_t +{ + +}; + +class s_cond_var_t +{ + +//public: +// s_cond_var_t(); +// ~s_cond_var_t(); +// +// s_cond_var_t(s_cond_var_t& right) = delete; +// s_cond_var_t& operator = (s_cond_var_t& right) = delete; +// +// void wait(); +// void wait_for(); +// +// void notify(); +// void notify_all(); +}; + +class slw_mutex_t +{ + +}; + +class slw_recursive_mutex_t +{ + +}; + +class slw_shared_mutex_t +{ + +}; + +class waiter_map_t +{ + // TODO: optimize (use custom lightweight readers-writer lock) + std::mutex m_mutex; + + struct waiter_t + { + u64 signal_id; + NamedThreadBase* thread; + }; + + std::vector m_waiters; + + std::string m_name; + + struct waiter_reg_t + { + NamedThreadBase* thread; + const u64 signal_id; + waiter_map_t& map; + + waiter_reg_t(waiter_map_t& map, u64 signal_id) + : thread(nullptr) + , signal_id(signal_id) + , map(map) + { + } + + ~waiter_reg_t(); + + void init(); + }; + + bool is_stopped(u64 signal_id); + +public: + waiter_map_t(const char* name) + : m_name(name) + { + } + + // wait until waiter_func() returns true, signal_id is an arbitrary number + template __forceinline void wait_op(u64 signal_id, const WT waiter_func) + { + // register waiter + waiter_reg_t waiter(*this, signal_id); + + // check condition or if emulator is stopped + while (!waiter_func() && !is_stopped(signal_id)) + { + // initialize waiter (only first time) + waiter.init(); + // wait for 1 ms or until signal arrived + waiter.thread->WaitForAnySignal(1); + } + } + + // signal all threads waiting on waiter_op() with the same signal_id (signaling only hints those threads that corresponding conditions are *probably* met) + void notify(u64 signal_id); +}; diff --git a/Utilities/rFile.cpp b/Utilities/rFile.cpp index 554647c40b..912452ef89 100644 --- a/Utilities/rFile.cpp +++ b/Utilities/rFile.cpp @@ -21,6 +21,12 @@ std::wstring ConvertUTF8ToWString(const std::string &source) { } #endif +#ifdef _WIN32 +#define GET_API_ERROR GetLastError() +#else +#define GET_API_ERROR err +#endif + bool getFileInfo(const char *path, FileInfo *fileInfo) { // TODO: Expand relative paths? fileInfo->fullName = path; @@ -103,14 +109,15 @@ bool rMkpath(const std::string &path) bool rRmdir(const std::string &dir) { #ifdef _WIN32 - if (!RemoveDirectory(ConvertUTF8ToWString(dir).c_str())) { - LOG_ERROR(GENERAL, "Error deleting directory %s: %i", dir.c_str(), GetLastError()); + if (!RemoveDirectory(ConvertUTF8ToWString(dir).c_str())) +#else + if (int err = rmdir(dir.c_str())) +#endif + { + LOG_ERROR(GENERAL, "Error deleting directory %s: %i", dir.c_str(), GET_API_ERROR); return false; } return true; -#else - rmdir(dir.c_str()); -#endif } bool rRename(const std::string &from, const std::string &to) @@ -137,17 +144,14 @@ bool rExists(const std::string &file) bool rRemoveFile(const std::string &file) { #ifdef _WIN32 - if (!DeleteFile(ConvertUTF8ToWString(file).c_str())) { - LOG_ERROR(GENERAL, "Error deleting %s: %i", file.c_str(), GetLastError()); - return false; - } + if (!DeleteFile(ConvertUTF8ToWString(file).c_str())) #else - int err = unlink(file.c_str()); - if (err) { - LOG_ERROR(GENERAL, "Error unlinking %s: %i", file.c_str(), err); + if (int err = unlink(file.c_str())) +#endif + { + LOG_ERROR(GENERAL, "Error deleting %s: %i", file.c_str(), GET_API_ERROR); return false; } -#endif return true; } diff --git a/asmjit b/asmjit index 9ead0cfb4c..1318c9aff7 160000 --- a/asmjit +++ b/asmjit @@ -1 +1 @@ -Subproject commit 9ead0cfb4cb5eb1bcf8c12b4a1ea115e438c44fa +Subproject commit 1318c9aff7137b30aec7dee2ababb2b313ae0f06 diff --git a/bin/dev_hdd0/home/00000001/exdata/.gitignore b/bin/dev_hdd0/home/00000001/exdata/.gitignore new file mode 100644 index 0000000000..8f6c3111a2 --- /dev/null +++ b/bin/dev_hdd0/home/00000001/exdata/.gitignore @@ -0,0 +1,6 @@ +# Note: This folder has to exist. Once the User Account manager is implemented, make sure it creates this folder in case it's missing and delete this .gitignore file. + +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/llvm b/llvm new file mode 160000 index 0000000000..f55c17bc33 --- /dev/null +++ b/llvm @@ -0,0 +1 @@ +Subproject commit f55c17bc3395fa7fdbd997d751a55de5228ebd77 diff --git a/llvm_build/UpdateProjectFiles.bat b/llvm_build/UpdateProjectFiles.bat new file mode 100644 index 0000000000..4152991a5f --- /dev/null +++ b/llvm_build/UpdateProjectFiles.bat @@ -0,0 +1,30 @@ +REM You need cmake and python to update the project files +REM this script relies on CWD being the path that this script is in + +cmake -G "Visual Studio 12 Win64" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm + +RD /S /Q cmake +RD /S /Q CMakeFiles +RD /S /Q projects +RD /S /Q share +RD /S /Q tools +DEL ALL_BUILD.vcxproj +DEL ALL_BUILD.vcxproj.filters +DEL CMakeCache.txt +DEL cmake_install.cmake +DEL CPackConfig.cmake +DEL CPackSourceConfig.cmake +DEL DummyConfigureOutput +DEL INSTALL.vcxproj +DEL INSTALL.vcxproj.filters +DEL LLVM.sdf +DEL LLVM.sln +DEL LLVMBuild.cmake +DEL PACKAGE.vcxproj +DEL PACKAGE.vcxproj.filters +DEL ZERO_CHECK.vcxproj +DEL ZERO_CHECK.vcxproj.filters +DEL include\llvm\llvm_headers_do_not_build.vcxproj +DEL include\llvm\llvm_headers_do_not_build.vcxproj.filters +python make_paths_relative.py + diff --git a/llvm_build/llvm_build.vcxproj b/llvm_build/llvm_build.vcxproj new file mode 100644 index 0000000000..ceba2a711e --- /dev/null +++ b/llvm_build/llvm_build.vcxproj @@ -0,0 +1,68 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {8BC303AB-25BE-4276-8E57-73F171B2D672} + MakeFileProj + + + + Makefile + true + v120 + + + Makefile + false + v120 + + + + + + + + + + + + + + + cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm +msbuild.exe ALL_BUILD.vcxproj /t:build /p:Configuration=Debug + + cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm +msbuild.exe ALL_BUILD.vcxproj /t:rebuild /p:Configuration=Debug + + cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm +msbuild.exe ALL_BUILD.vcxproj /t:clean /p:Configuration=Debug + + + + + cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm +msbuild.exe ALL_BUILD.vcxproj /t:build /p:Configuration=Release + + cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm +msbuild.exe ALL_BUILD.vcxproj /t:rebuild /p:Configuration=Release + + cmake -G "Visual Studio 12 2013 Win64" -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_RUNTIME=OFF -DLLVM_BUILD_TOOLS=OFF -DLLVM_INCLUDE_DOCS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_TOOLS=OFF -DLLVM_INCLUDE_UTILS=OFF -DWITH_POLLY=OFF ../llvm +msbuild.exe ALL_BUILD.vcxproj /t:clean /p:Configuration=Release + + + + + + + + \ No newline at end of file diff --git a/llvm_build/llvm_build.vcxproj.filters b/llvm_build/llvm_build.vcxproj.filters new file mode 100644 index 0000000000..6a1782f7d7 --- /dev/null +++ b/llvm_build/llvm_build.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + \ No newline at end of file diff --git a/llvm_build/make_paths_relative.py b/llvm_build/make_paths_relative.py new file mode 100644 index 0000000000..8a03a7f7f4 --- /dev/null +++ b/llvm_build/make_paths_relative.py @@ -0,0 +1,164 @@ +import os +import shutil +import xml.etree.ElementTree as ET +import re + +RPCS3DIR = "" + +cmake_dirs = ["CMakeFiles",] + +cmake_files = ["INSTALL.vcxproj", + "INSTALL.vcxproj.filters", + "PACKAGE.vcxproj", + "PACKAGE.vcxproj.filters", + "cmake_install.cmake", + ] + +vcxproj_files_blacklist = ["llvm_build.vcxproj","llvm_build.vcxproj.filters"] + +vcxproj_files = ["lib\Analysis\LLVMAnalysis.vcxproj", + "lib\Analysis\IPA\LLVMipa.vcxproj", + "lib\AsmParser\LLVMAsmParser.vcxproj", + "lib\Bitcode\Reader\LLVMBitReader.vcxproj", + "lib\Bitcode\Writer\LLVMBitWriter.vcxproj", + "lib\CodeGen\LLVMCodeGen.vcxproj", + "lib\CodeGen\AsmPrinter\LLVMAsmPrinter.vcxproj", + "lib\CodeGen\SelectionDAG\LLVMSelectionDAG.vcxproj", + "lib\DebugInfo\LLVMDebugInfo.vcxproj", + "lib\ExecutionEngine\LLVMExecutionEngine.vcxproj", + "lib\ExecutionEngine\Interpreter\LLVMInterpreter.vcxproj", + "lib\ExecutionEngine\JIT\LLVMJIT.vcxproj", + "lib\ExecutionEngine\MCJIT\LLVMMCJIT.vcxproj", + "lib\ExecutionEngine\RuntimeDyld\LLVMRuntimeDyld.vcxproj", + "lib\IR\LLVMCore.vcxproj", + "lib\IRReader\LLVMIRReader.vcxproj", + "lib\LineEditor\LLVMLineEditor.vcxproj", + "lib\Linker\LLVMLinker.vcxproj", + "lib\LTO\LLVMLTO.vcxproj", + "lib\MC\LLVMMC.vcxproj", + "lib\MC\MCAnalysis\LLVMMCAnalysis.vcxproj", + "lib\MC\MCDisassembler\LLVMMCDisassembler.vcxproj", + "lib\MC\MCParser\LLVMMCParser.vcxproj", + "lib\Object\LLVMObject.vcxproj", + "lib\Option\LLVMOption.vcxproj", + "lib\ProfileData\LLVMProfileData.vcxproj", + "lib\Support\LLVMSupport.vcxproj", + "lib\TableGen\LLVMTableGen.vcxproj", + "lib\Target\LLVMTarget.vcxproj", + "lib\Target\X86\LLVMX86CodeGen.vcxproj", + "lib\Target\X86\X86CommonTableGen.vcxproj", + "lib\Target\X86\AsmParser\LLVMX86AsmParser.vcxproj", + "lib\Target\X86\Disassembler\LLVMX86Disassembler.vcxproj", + "lib\Target\X86\InstPrinter\LLVMX86AsmPrinter.vcxproj", + "lib\Target\X86\MCTargetDesc\LLVMX86Desc.vcxproj", + "lib\Target\X86\TargetInfo\LLVMX86Info.vcxproj", + "lib\Target\X86\Utils\LLVMX86Utils.vcxproj", + "lib\Transforms\Hello\LLVMHello.vcxproj", + "lib\Transforms\InstCombine\LLVMInstCombine.vcxproj", + "lib\Transforms\Instrumentation\LLVMInstrumentation.vcxproj", + "lib\Transforms\IPO\LLVMipo.vcxproj", + "lib\Transforms\ObjCARC\LLVMObjCARCOpts.vcxproj", + "lib\Transforms\Scalar\LLVMScalarOpts.vcxproj", + "lib\Transforms\Utils\LLVMTransformUtils.vcxproj", + "lib\Transforms\Vectorize\LLVMVectorize.vcxproj", + "include\llvm\IR\intrinsics_gen.vcxproj", + "utils\TableGen\llvm-tblgen.vcxproj", + ] + +def get_parent_dir(): + path = os.getcwd() + os.chdir("..") + rpcs3_dir = os.getcwd() + os.chdir(path) + return rpcs3_dir + +def rem_cmake_files(root_path): + for root, dirs, files in os.walk(root_path): + for directory in dirs: + if directory in cmake_dirs: + print("deleting: " + os.path.join(root,directory)) + shutil.rmtree(os.path.join(root,directory)) + dirs = [item for item in dirs if item not in cmake_dirs] + for file in files: + if file in cmake_files: + print("deleting: " + os.path.join(root,file)) + os.remove(os.path.join(root,file)) + +def repl_cmake_copy(match): + newtext = "copy /y " + files = match.group(1) + files = files.replace('/','\\') + return newtext+files + +def make_paths_relative(file): + global vcxproj_files + global vcxproj_files_blacklist + this_vcxproj = os.path.relpath(file,os.getcwd()) + if this_vcxproj in vcxproj_files_blacklist: + return + if (file.find('.vcxproj')!=len(file)-8) and (file.find('.vcxproj.filters')!=len(file)-16): + print('ERROR: File "'+file+'" is not vcxproj file') + return + proj_path = os.path.dirname(file) + if proj_path[1] != ':': + print('ERROR: Path "'+proj_path+'" is not in the Windows format') + return + #check if we expected this project file + if file[-8:] == '.vcxproj': + if this_vcxproj in vcxproj_files: + vcxproj_files.remove(this_vcxproj) + else: + print('ERROR: unexpected vcxproj file: "' + this_vcxproj +'" please update the script') + return + + #open the file and text-replace the absolute paths + with open(file,'r') as f: + file_cont = f.read() + rel_path = '$(ProjDir)'+os.path.relpath(RPCS3DIR,proj_path) + file_cont = file_cont.replace(RPCS3DIR,rel_path) + rpcs3_path_alt = RPCS3DIR.replace('\\','/') + rel_path_alt = rel_path.replace('\\','/') + file_cont = file_cont.replace(rpcs3_path_alt,rel_path_alt) + + #interpret the XML to remove the cmake commands from the "Command" tags + ET.register_namespace('','http://schemas.microsoft.com/developer/msbuild/2003') + tree = ET.fromstring(file_cont) + + for parent in tree.findall('.//{http://schemas.microsoft.com/developer/msbuild/2003}Command/..'): + for element in parent.findall('{http://schemas.microsoft.com/developer/msbuild/2003}Command'): + text = str(element.text) + rgx = re.compile(r'[^\r\n<>]+cmake.exe["]?\s+-E copy_if_different([^\r\n]+)') + text, num_rep = rgx.subn(repl_cmake_copy,text) + rgx = re.compile(r'[^\r\n<>]+cmake.exe([^\r\n]*)') + text, num_rep2 = rgx.subn(r'REM OMMITTED CMAKE COMMAND',text) + num_rep += num_rep2 + rgx = re.compile(r'[^\r\n<>]+ml64.exe"?([^\r\n]*)') + text, num_rep2 = rgx.subn(r'"$(VCInstallDir)bin\x86_amd64\ml64.exe" \1',text) + num_rep += num_rep2 + #if (text.find('cmake') != -1) or (text.find('python') != -1): + # parent.remove(element) + if num_rep > 0: + element.text = text + + #re-create the XML and save the file + file_cont = ET.tostring(tree,'utf-8') + with open(file,'w') as f: + f.write(file_cont) + + +def iterate_proj_file(root_path): + for root, dirs, files in os.walk(root_path): + for file in files: + if file.find('.vcxproj') != -1 : + make_paths_relative(os.path.join(root,file)) + +def main_func(): + global RPCS3DIR + RPCS3DIR = get_parent_dir() + rem_cmake_files(os.getcwd()) + iterate_proj_file(os.getcwd()) + for a in vcxproj_files: + print('ERROR: project file was not found "'+ a + '"') + +if __name__ == "__main__": + main_func() diff --git a/rpcs3.sln b/rpcs3.sln index 24c63c95cf..e594502b11 100644 --- a/rpcs3.sln +++ b/rpcs3.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3", "rpcs3\rpcs3.vcxproj", "{70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}" ProjectSection(ProjectDependencies) = postProject @@ -21,6 +21,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rpcs3", "rpcs3\rpcs3.vcxpro {7047EE97-7F80-A70D-6147-BC11102DB6F4} = {7047EE97-7F80-A70D-6147-BC11102DB6F4} {87B42A9C-3F5C-53D7-9017-2B1CAE39457D} = {87B42A9C-3F5C-53D7-9017-2B1CAE39457D} {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82} = {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82} + {8BC303AB-25BE-4276-8E57-73F171B2D672} = {8BC303AB-25BE-4276-8E57-73F171B2D672} {949C6DB8-E638-6EC6-AB31-BCCFD1379E01} = {949C6DB8-E638-6EC6-AB31-BCCFD1379E01} {74827EBD-93DC-5110-BA95-3F2AB029B6B0} = {74827EBD-93DC-5110-BA95-3F2AB029B6B0} {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2} = {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2} @@ -138,165 +139,281 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "asmjit", "asmjit", "{E2A982F2-4B1A-48B1-8D77-A17A589C58D7}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "emucore", "rpcs3\emucore.vcxproj", "{C4A10229-4712-4BD2-B63E-50D93C67A038}" + ProjectSection(ProjectDependencies) = postProject + {8BC303AB-25BE-4276-8E57-73F171B2D672} = {8BC303AB-25BE-4276-8E57-73F171B2D672} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "llvm", "llvm", "{C8068CE9-D626-4FEA-BEE7-893F06A25BF3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llvm_build", "llvm_build\llvm_build.vcxproj", "{8BC303AB-25BE-4276-8E57-73F171B2D672}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug - LLVM|x64 = Debug - LLVM|x64 Debug - MemLeak|x64 = Debug - MemLeak|x64 Debug|x64 = Debug|x64 + Release - LLVM|x64 = Release - LLVM|x64 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug - LLVM|x64.Build.0 = Debug|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug - MemLeak|x64.ActiveCfg = Debug - MemLeak|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug - MemLeak|x64.Build.0 = Debug - MemLeak|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.ActiveCfg = Debug|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Debug|x64.Build.0 = Debug|x64 + {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release - LLVM|x64.ActiveCfg = Release|x64 + {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release - LLVM|x64.Build.0 = Release|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|x64.ActiveCfg = Release|x64 {70CD65B0-91D6-4FAE-9A7B-4AF55D0D1B12}.Release|x64.Build.0 = Release|x64 + {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug - LLVM|x64.Build.0 = Debug|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug - MemLeak|x64.Build.0 = Debug|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.ActiveCfg = Debug|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Debug|x64.Build.0 = Debug|x64 + {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release - LLVM|x64.ActiveCfg = Release|x64 + {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release - LLVM|x64.Build.0 = Release|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|x64.ActiveCfg = Release|x64 {6FCB55A5-563F-4039-1D79-1EB6ED8AAB82}.Release|x64.Build.0 = Release|x64 + {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug - LLVM|x64.Build.0 = Debug|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug - MemLeak|x64.Build.0 = Debug|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.ActiveCfg = Debug|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Debug|x64.Build.0 = Debug|x64 + {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release - LLVM|x64.ActiveCfg = Release|x64 + {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release - LLVM|x64.Build.0 = Release|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|x64.ActiveCfg = Release|x64 {7047EE97-7F80-A70D-6147-BC11102DB6F4}.Release|x64.Build.0 = Release|x64 + {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug - LLVM|x64.Build.0 = Debug|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug - MemLeak|x64.Build.0 = Debug|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.ActiveCfg = Debug|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Debug|x64.Build.0 = Debug|x64 + {3111D679-7796-23C4-BA0C-271F1145DA24}.Release - LLVM|x64.ActiveCfg = Release|x64 + {3111D679-7796-23C4-BA0C-271F1145DA24}.Release - LLVM|x64.Build.0 = Release|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|x64.ActiveCfg = Release|x64 {3111D679-7796-23C4-BA0C-271F1145DA24}.Release|x64.Build.0 = Release|x64 + {067D9406-2A93-DACA-9449-93A2D356357D}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {067D9406-2A93-DACA-9449-93A2D356357D}.Debug - LLVM|x64.Build.0 = Debug|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug - MemLeak|x64.Build.0 = Debug|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.ActiveCfg = Debug|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Debug|x64.Build.0 = Debug|x64 + {067D9406-2A93-DACA-9449-93A2D356357D}.Release - LLVM|x64.ActiveCfg = Release|x64 + {067D9406-2A93-DACA-9449-93A2D356357D}.Release - LLVM|x64.Build.0 = Release|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|x64.ActiveCfg = Release|x64 {067D9406-2A93-DACA-9449-93A2D356357D}.Release|x64.Build.0 = Release|x64 + {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug - LLVM|x64.Build.0 = Debug|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug - MemLeak|x64.Build.0 = Debug|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.ActiveCfg = Debug|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Debug|x64.Build.0 = Debug|x64 + {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release - LLVM|x64.ActiveCfg = Release|x64 + {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release - LLVM|x64.Build.0 = Release|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|x64.ActiveCfg = Release|x64 {9ED1866B-D4AE-3440-24E4-7A9475B163B2}.Release|x64.Build.0 = Release|x64 + {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug - LLVM|x64.Build.0 = Debug|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug - MemLeak|x64.Build.0 = Debug|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.ActiveCfg = Debug|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Debug|x64.Build.0 = Debug|x64 + {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release - LLVM|x64.ActiveCfg = Release|x64 + {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release - LLVM|x64.Build.0 = Release|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|x64.ActiveCfg = Release|x64 {99C9EB95-DB4C-1996-490E-5212EFBF07C3}.Release|x64.Build.0 = Release|x64 + {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug - LLVM|x64.Build.0 = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug - MemLeak|x64.Build.0 = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug - MemLeak|x64.Deploy.0 = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.ActiveCfg = Debug|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Debug|x64.Build.0 = Debug|x64 + {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release - LLVM|x64.ActiveCfg = Release|x64 + {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release - LLVM|x64.Build.0 = Release|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|x64.ActiveCfg = Release|x64 {6EDC3B79-D217-F11A-406F-F11D856493F9}.Release|x64.Build.0 = Release|x64 + {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug - LLVM|x64.Build.0 = Debug|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug - MemLeak|x64.Build.0 = Debug|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.ActiveCfg = Debug|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Debug|x64.Build.0 = Debug|x64 + {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release - LLVM|x64.ActiveCfg = Release|x64 + {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release - LLVM|x64.Build.0 = Release|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|x64.ActiveCfg = Release|x64 {A9AC9CF5-8E6C-0BA2-0769-6E42EDB88E25}.Release|x64.Build.0 = Release|x64 + {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug - LLVM|x64.Build.0 = Debug|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug - MemLeak|x64.Build.0 = Debug|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.ActiveCfg = Debug|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Debug|x64.Build.0 = Debug|x64 + {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release - LLVM|x64.ActiveCfg = Release|x64 + {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release - LLVM|x64.Build.0 = Release|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|x64.ActiveCfg = Release|x64 {CD478F02-7550-58A5-E085-CE4BC0C0AD23}.Release|x64.Build.0 = Release|x64 + {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug - LLVM|x64.Build.0 = Debug|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug - MemLeak|x64.Build.0 = Debug|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.ActiveCfg = Debug|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Debug|x64.Build.0 = Debug|x64 + {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release - LLVM|x64.ActiveCfg = Release|x64 + {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release - LLVM|x64.Build.0 = Release|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|x64.ActiveCfg = Release|x64 {22B14659-C5B6-B775-868D-A49198FEAD4A}.Release|x64.Build.0 = Release|x64 + {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug - LLVM|x64.Build.0 = Debug|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug - MemLeak|x64.Build.0 = Debug|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.ActiveCfg = Debug|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Debug|x64.Build.0 = Debug|x64 + {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release - LLVM|x64.ActiveCfg = Release|x64 + {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release - LLVM|x64.Build.0 = Release|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|x64.ActiveCfg = Release|x64 {FAF0CB93-F7CE-A6B8-8342-19CE99BAF774}.Release|x64.Build.0 = Release|x64 + {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug - LLVM|x64.Build.0 = Debug|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug - MemLeak|x64.Build.0 = Debug|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.ActiveCfg = Debug|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Debug|x64.Build.0 = Debug|x64 + {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release - LLVM|x64.ActiveCfg = Release|x64 + {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release - LLVM|x64.Build.0 = Release|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|x64.ActiveCfg = Release|x64 {46333DC3-B4A5-3DCC-E8BF-A3F20ADC56D2}.Release|x64.Build.0 = Release|x64 + {5C363C34-4741-7036-861C-2E2279CF552E}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {5C363C34-4741-7036-861C-2E2279CF552E}.Debug - LLVM|x64.Build.0 = Debug|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug - MemLeak|x64.Build.0 = Debug|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.ActiveCfg = Debug|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Debug|x64.Build.0 = Debug|x64 + {5C363C34-4741-7036-861C-2E2279CF552E}.Release - LLVM|x64.ActiveCfg = Release|x64 + {5C363C34-4741-7036-861C-2E2279CF552E}.Release - LLVM|x64.Build.0 = Release|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|x64.ActiveCfg = Release|x64 {5C363C34-4741-7036-861C-2E2279CF552E}.Release|x64.Build.0 = Release|x64 + {76169FE8-0814-4F36-6409-699EF1A23001}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {76169FE8-0814-4F36-6409-699EF1A23001}.Debug - LLVM|x64.Build.0 = Debug|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug - MemLeak|x64.Build.0 = Debug|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.ActiveCfg = Debug|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Debug|x64.Build.0 = Debug|x64 + {76169FE8-0814-4F36-6409-699EF1A23001}.Release - LLVM|x64.ActiveCfg = Release|x64 + {76169FE8-0814-4F36-6409-699EF1A23001}.Release - LLVM|x64.Build.0 = Release|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|x64.ActiveCfg = Release|x64 {76169FE8-0814-4F36-6409-699EF1A23001}.Release|x64.Build.0 = Release|x64 + {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug - LLVM|x64.Build.0 = Debug|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug - MemLeak|x64.Build.0 = Debug|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.ActiveCfg = Debug|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Debug|x64.Build.0 = Debug|x64 + {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release - LLVM|x64.ActiveCfg = Release|x64 + {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release - LLVM|x64.Build.0 = Release|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|x64.ActiveCfg = Release|x64 {949C6DB8-E638-6EC6-AB31-BCCFD1379E01}.Release|x64.Build.0 = Release|x64 + {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug - LLVM|x64.Build.0 = Debug|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug - MemLeak|x64.Build.0 = Debug|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.ActiveCfg = Debug|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Debug|x64.Build.0 = Debug|x64 + {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release - LLVM|x64.ActiveCfg = Release|x64 + {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release - LLVM|x64.Build.0 = Release|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|x64.ActiveCfg = Release|x64 {B87216CD-6C64-1DB0-D900-BC6E745C1DF9}.Release|x64.Build.0 = Release|x64 + {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug - LLVM|x64.Build.0 = Debug|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug - MemLeak|x64.Build.0 = Debug|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.ActiveCfg = Debug|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Debug|x64.Build.0 = Debug|x64 + {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release - LLVM|x64.ActiveCfg = Release|x64 + {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release - LLVM|x64.Build.0 = Release|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|x64.ActiveCfg = Release|x64 {AFF2C68B-B867-DD50-6AC5-74B09D41F8EA}.Release|x64.Build.0 = Release|x64 + {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug - LLVM|x64.Build.0 = Debug|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug - MemLeak|x64.Build.0 = Debug|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.ActiveCfg = Debug|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Debug|x64.Build.0 = Debug|x64 + {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release - LLVM|x64.ActiveCfg = Release|x64 + {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release - LLVM|x64.Build.0 = Release|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|x64.ActiveCfg = Release|x64 {6FDC76D5-CB44-B9F8-5EF6-C59B020719DF}.Release|x64.Build.0 = Release|x64 + {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug - LLVM|x64.Build.0 = Debug|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug - MemLeak|x64.Build.0 = Debug|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.ActiveCfg = Debug|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Debug|x64.Build.0 = Debug|x64 + {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release - LLVM|x64.ActiveCfg = Release|x64 + {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release - LLVM|x64.Build.0 = Release|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|x64.ActiveCfg = Release|x64 {8BECCA95-C7D7-CFF8-FDB1-4950E9F8E8E6}.Release|x64.Build.0 = Release|x64 + {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug - LLVM|x64.Build.0 = Debug|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug - MemLeak|x64.Build.0 = Debug|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.ActiveCfg = Debug|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Debug|x64.Build.0 = Debug|x64 + {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release - LLVM|x64.ActiveCfg = Release|x64 + {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release - LLVM|x64.Build.0 = Release|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|x64.ActiveCfg = Release|x64 {87B42A9C-3F5C-53D7-9017-2B1CAE39457D}.Release|x64.Build.0 = Release|x64 + {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug - LLVM|x64.Build.0 = Debug|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug - MemLeak|x64.Build.0 = Debug|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.ActiveCfg = Debug|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Debug|x64.Build.0 = Debug|x64 + {23E1C437-A951-5943-8639-A17F3CF2E606}.Release - LLVM|x64.ActiveCfg = Release|x64 + {23E1C437-A951-5943-8639-A17F3CF2E606}.Release - LLVM|x64.Build.0 = Release|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|x64.ActiveCfg = Release|x64 {23E1C437-A951-5943-8639-A17F3CF2E606}.Release|x64.Build.0 = Release|x64 + {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug - LLVM|x64.Build.0 = Debug|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug - MemLeak|x64.Build.0 = Debug|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.ActiveCfg = Debug|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Debug|x64.Build.0 = Debug|x64 + {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release - LLVM|x64.ActiveCfg = Release|x64 + {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release - LLVM|x64.Build.0 = Release|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|x64.ActiveCfg = Release|x64 {74827EBD-93DC-5110-BA95-3F2AB029B6B0}.Release|x64.Build.0 = Release|x64 + {AC40FF01-426E-4838-A317-66354CEFAE88}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {AC40FF01-426E-4838-A317-66354CEFAE88}.Debug - LLVM|x64.Build.0 = Debug|x64 {AC40FF01-426E-4838-A317-66354CEFAE88}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 {AC40FF01-426E-4838-A317-66354CEFAE88}.Debug - MemLeak|x64.Build.0 = Debug|x64 {AC40FF01-426E-4838-A317-66354CEFAE88}.Debug|x64.ActiveCfg = Debug|x64 {AC40FF01-426E-4838-A317-66354CEFAE88}.Debug|x64.Build.0 = Debug|x64 + {AC40FF01-426E-4838-A317-66354CEFAE88}.Release - LLVM|x64.ActiveCfg = Release|x64 + {AC40FF01-426E-4838-A317-66354CEFAE88}.Release - LLVM|x64.Build.0 = Release|x64 {AC40FF01-426E-4838-A317-66354CEFAE88}.Release|x64.ActiveCfg = Release|x64 {AC40FF01-426E-4838-A317-66354CEFAE88}.Release|x64.Build.0 = Release|x64 + {C4A10229-4712-4BD2-B63E-50D93C67A038}.Debug - LLVM|x64.ActiveCfg = Debug - LLVM|x64 + {C4A10229-4712-4BD2-B63E-50D93C67A038}.Debug - LLVM|x64.Build.0 = Debug - LLVM|x64 {C4A10229-4712-4BD2-B63E-50D93C67A038}.Debug - MemLeak|x64.ActiveCfg = Debug - MemLeak|x64 {C4A10229-4712-4BD2-B63E-50D93C67A038}.Debug - MemLeak|x64.Build.0 = Debug - MemLeak|x64 {C4A10229-4712-4BD2-B63E-50D93C67A038}.Debug|x64.ActiveCfg = Debug|x64 {C4A10229-4712-4BD2-B63E-50D93C67A038}.Debug|x64.Build.0 = Debug|x64 + {C4A10229-4712-4BD2-B63E-50D93C67A038}.Release - LLVM|x64.ActiveCfg = Release - LLVM|x64 + {C4A10229-4712-4BD2-B63E-50D93C67A038}.Release - LLVM|x64.Build.0 = Release - LLVM|x64 {C4A10229-4712-4BD2-B63E-50D93C67A038}.Release|x64.ActiveCfg = Release|x64 {C4A10229-4712-4BD2-B63E-50D93C67A038}.Release|x64.Build.0 = Release|x64 + {8BC303AB-25BE-4276-8E57-73F171B2D672}.Debug - LLVM|x64.ActiveCfg = Debug|x64 + {8BC303AB-25BE-4276-8E57-73F171B2D672}.Debug - LLVM|x64.Build.0 = Debug|x64 + {8BC303AB-25BE-4276-8E57-73F171B2D672}.Debug - MemLeak|x64.ActiveCfg = Debug|x64 + {8BC303AB-25BE-4276-8E57-73F171B2D672}.Debug|x64.ActiveCfg = Debug|x64 + {8BC303AB-25BE-4276-8E57-73F171B2D672}.Release - LLVM|x64.ActiveCfg = Release|x64 + {8BC303AB-25BE-4276-8E57-73F171B2D672}.Release - LLVM|x64.Build.0 = Release|x64 + {8BC303AB-25BE-4276-8E57-73F171B2D672}.Release|x64.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -325,5 +442,6 @@ Global {23E1C437-A951-5943-8639-A17F3CF2E606} = {5812E712-6213-4372-B095-9EB9BAA1F2DF} {74827EBD-93DC-5110-BA95-3F2AB029B6B0} = {5812E712-6213-4372-B095-9EB9BAA1F2DF} {AC40FF01-426E-4838-A317-66354CEFAE88} = {E2A982F2-4B1A-48B1-8D77-A17A589C58D7} + {8BC303AB-25BE-4276-8E57-73F171B2D672} = {C8068CE9-D626-4FEA-BEE7-893F06A25BF3} EndGlobalSection EndGlobal diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 59f146c6dc..9245ac9125 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -55,6 +55,7 @@ find_package(GLEW REQUIRED) find_package(OpenGL REQUIRED) find_package(ZLIB REQUIRED) find_package(OpenAL REQUIRED) +find_package(LLVM REQUIRED CONFIG) include("${wxWidgets_USE_FILE}") @@ -69,6 +70,7 @@ endif() include_directories( ${wxWidgets_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIR} +${LLVM_INCLUDE_DIRS} "${RPCS3_SRC_DIR}/../ffmpeg/${PLATFORM_ARCH}/include" "${RPCS3_SRC_DIR}" "${RPCS3_SRC_DIR}/Loader" @@ -77,6 +79,14 @@ ${OPENAL_INCLUDE_DIR} "${RPCS3_SRC_DIR}/../asmjit/src/asmjit" ) +add_definitions(${LLVM_DEFINITIONS}) +add_definitions(-DLLVM_AVAILABLE) +if (CMAKE_BUILD_TYPE STREQUAL "Release") + llvm_map_components_to_libnames(LLVM_LIBS jit vectorize x86codegen x86disassembler) +else() + llvm_map_components_to_libnames(LLVM_LIBS jit vectorize x86codegen x86disassembler mcdisassembler) +endif() + link_directories("${RPCS3_SRC_DIR}/../ffmpeg/${PLATFORM_ARCH}/lib") get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) @@ -97,10 +107,13 @@ RPCS3_SRC "${RPCS3_SRC_DIR}/../Utilities/*" ) +list(REMOVE_ITEM RPCS3_SRC ${RPCS3_SRC_DIR}/../Utilities/simpleini/ConvertUTF.c) +set_source_files_properties(${RPCS3_SRC_DIR}/Emu/Cell/PPULLVMRecompiler.cpp PROPERTIES COMPILE_FLAGS -fno-rtti) + add_executable(rpcs3 ${RPCS3_SRC}) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_BINARY_DIR}/../asmjit/") #hack because the asmjit cmake file force fno exceptions -target_link_libraries(rpcs3 asmjit.a ${wxWidgets_LIBRARIES} ${OPENAL_LIBRARY} ${GLEW_LIBRARY} ${OPENGL_LIBRARIES} libavformat.a libavcodec.a libavutil.a libswresample.a libswscale.a ${ZLIB_LIBRARIES}) +target_link_libraries(rpcs3 asmjit.a ${wxWidgets_LIBRARIES} ${OPENAL_LIBRARY} ${GLEW_LIBRARY} ${OPENGL_LIBRARIES} libavformat.a libavcodec.a libavutil.a libswresample.a libswscale.a ${ZLIB_LIBRARIES} ${LLVM_LIBS}) set_target_properties(rpcs3 PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "${RPCS3_SRC_DIR}/stdafx.h") cotire(rpcs3) diff --git a/rpcs3/Crypto/ec.cpp b/rpcs3/Crypto/ec.cpp new file mode 100644 index 0000000000..1e8dd23b6e --- /dev/null +++ b/rpcs3/Crypto/ec.cpp @@ -0,0 +1,548 @@ +// Copyright 2007,2008,2010 Segher Boessenkool +// Licensed under the terms of the GNU GPL, version 2 +// http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt + +#include "stdafx.h" +#include "utils.h" + +void bn_print(char *name, u8 *a, u32 n) +{ + u32 i; + + printf("%s = ", name); + + for (i = 0; i < n; i++) + printf("%02x", a[i]); + + printf("\n"); +} + +static void bn_zero(u8 *d, u32 n) +{ + memset(d, 0, n); +} +void bn_copy(u8 *d, u8 *a, u32 n) +{ + memcpy(d, a, n); +} + +int bn_compare(u8 *a, u8 *b, u32 n) +{ + u32 i; + + for (i = 0; i < n; i++) { + if (a[i] < b[i]) + return -1; + if (a[i] > b[i]) + return 1; + } + + return 0; +} + +static u8 bn_add_1(u8 *d, u8 *a, u8 *b, u32 n) +{ + u32 i; + u32 dig; + u8 c; + + c = 0; + for (i = n - 1; i < n; i--) { + dig = a[i] + b[i] + c; + c = dig >> 8; + d[i] = dig; + } + + return c; +} + +static u8 bn_sub_1(u8 *d, u8 *a, u8 *b, u32 n) +{ + u32 i; + u32 dig; + u8 c; + + c = 1; + for (i = n - 1; i < n; i--) { + dig = a[i] + 255 - b[i] + c; + c = dig >> 8; + d[i] = dig; + } + + return 1 - c; +} + +void bn_reduce(u8 *d, u8 *N, u32 n) +{ + if (bn_compare(d, N, n) >= 0) + bn_sub_1(d, d, N, n); +} + +void bn_add(u8 *d, u8 *a, u8 *b, u8 *N, u32 n) +{ + if (bn_add_1(d, a, b, n)) + bn_sub_1(d, d, N, n); + + bn_reduce(d, N, n); +} + +void bn_sub(u8 *d, u8 *a, u8 *b, u8 *N, u32 n) +{ + if (bn_sub_1(d, a, b, n)) + bn_add_1(d, d, N, n); +} + +static const u8 inv256[0x80] = { + 0x01, 0xab, 0xcd, 0xb7, 0x39, 0xa3, 0xc5, 0xef, + 0xf1, 0x1b, 0x3d, 0xa7, 0x29, 0x13, 0x35, 0xdf, + 0xe1, 0x8b, 0xad, 0x97, 0x19, 0x83, 0xa5, 0xcf, + 0xd1, 0xfb, 0x1d, 0x87, 0x09, 0xf3, 0x15, 0xbf, + 0xc1, 0x6b, 0x8d, 0x77, 0xf9, 0x63, 0x85, 0xaf, + 0xb1, 0xdb, 0xfd, 0x67, 0xe9, 0xd3, 0xf5, 0x9f, + 0xa1, 0x4b, 0x6d, 0x57, 0xd9, 0x43, 0x65, 0x8f, + 0x91, 0xbb, 0xdd, 0x47, 0xc9, 0xb3, 0xd5, 0x7f, + 0x81, 0x2b, 0x4d, 0x37, 0xb9, 0x23, 0x45, 0x6f, + 0x71, 0x9b, 0xbd, 0x27, 0xa9, 0x93, 0xb5, 0x5f, + 0x61, 0x0b, 0x2d, 0x17, 0x99, 0x03, 0x25, 0x4f, + 0x51, 0x7b, 0x9d, 0x07, 0x89, 0x73, 0x95, 0x3f, + 0x41, 0xeb, 0x0d, 0xf7, 0x79, 0xe3, 0x05, 0x2f, + 0x31, 0x5b, 0x7d, 0xe7, 0x69, 0x53, 0x75, 0x1f, + 0x21, 0xcb, 0xed, 0xd7, 0x59, 0xc3, 0xe5, 0x0f, + 0x11, 0x3b, 0x5d, 0xc7, 0x49, 0x33, 0x55, 0xff, +}; + +static void bn_mon_muladd_dig(u8 *d, u8 *a, u8 b, u8 *N, u32 n) +{ + u32 dig; + u32 i; + + u8 z = -(d[n-1] + a[n-1]*b) * inv256[N[n-1]/2]; + + dig = d[n-1] + a[n-1]*b + N[n-1]*z; + dig >>= 8; + + for (i = n - 2; i < n; i--) { + dig += d[i] + a[i]*b + N[i]*z; + d[i+1] = dig; + dig >>= 8; + } + + d[0] = dig; + dig >>= 8; + + if (dig) + bn_sub_1(d, d, N, n); + + bn_reduce(d, N, n); +} + +void bn_mon_mul(u8 *d, u8 *a, u8 *b, u8 *N, u32 n) +{ + u8 t[512]; + u32 i; + + bn_zero(t, n); + + for (i = n - 1; i < n; i--) + bn_mon_muladd_dig(t, a, b[i], N, n); + + bn_copy(d, t, n); +} + +void bn_to_mon(u8 *d, u8 *N, u32 n) +{ + u32 i; + + for (i = 0; i < 8*n; i++) + bn_add(d, d, d, N, n); +} + +void bn_from_mon(u8 *d, u8 *N, u32 n) +{ + u8 t[512]; + + bn_zero(t, n); + t[n-1] = 1; + bn_mon_mul(d, d, t, N, n); +} + +static void bn_mon_exp(u8 *d, u8 *a, u8 *N, u32 n, u8 *e, u32 en) +{ + u8 t[512]; + u32 i; + u8 mask; + + bn_zero(d, n); + d[n-1] = 1; + bn_to_mon(d, N, n); + + for (i = 0; i < en; i++) + for (mask = 0x80; mask != 0; mask >>= 1) { + bn_mon_mul(t, d, d, N, n); + if ((e[i] & mask) != 0) + bn_mon_mul(d, t, a, N, n); + else + bn_copy(d, t, n); + } +} + +void bn_mon_inv(u8 *d, u8 *a, u8 *N, u32 n) +{ + u8 t[512], s[512]; + + bn_zero(s, n); + s[n-1] = 2; + bn_sub_1(t, N, s, n); + bn_mon_exp(d, a, N, n, t, n); +} + +void bn_copy(u8 *d, u8 *a, u32 n); +int bn_compare(u8 *a, u8 *b, u32 n); +void bn_reduce(u8 *d, u8 *N, u32 n); +void bn_add(u8 *d, u8 *a, u8 *b, u8 *N, u32 n); +void bn_sub(u8 *d, u8 *a, u8 *b, u8 *N, u32 n); +void bn_to_mon(u8 *d, u8 *N, u32 n); +void bn_from_mon(u8 *d, u8 *N, u32 n); +void bn_mon_mul(u8 *d, u8 *a, u8 *b, u8 *N, u32 n); +void bn_mon_inv(u8 *d, u8 *a, u8 *N, u32 n); + +struct point { + u8 x[20]; + u8 y[20]; +}; + +static u8 ec_p[20]; +static u8 ec_a[20]; // mon +static u8 ec_b[20]; // mon +static u8 ec_N[21]; +static struct point ec_G; // mon +static struct point ec_Q; // mon +static u8 ec_k[21]; + +static void elt_copy(u8 *d, u8 *a) +{ + memcpy(d, a, 20); +} + +static void elt_zero(u8 *d) +{ + memset(d, 0, 20); +} + +static int elt_is_zero(u8 *d) +{ + u32 i; + + for (i = 0; i < 20; i++) + if (d[i] != 0) + return 0; + + return 1; +} + +static void elt_add(u8 *d, u8 *a, u8 *b) +{ + bn_add(d, a, b, ec_p, 20); +} + +static void elt_sub(u8 *d, u8 *a, u8 *b) +{ + bn_sub(d, a, b, ec_p, 20); +} + +static void elt_mul(u8 *d, u8 *a, u8 *b) +{ + bn_mon_mul(d, a, b, ec_p, 20); +} + +static void elt_square(u8 *d, u8 *a) +{ + elt_mul(d, a, a); +} + +static void elt_inv(u8 *d, u8 *a) +{ + u8 s[20]; + elt_copy(s, a); + bn_mon_inv(d, s, ec_p, 20); +} + +static void point_to_mon(struct point *p) +{ + bn_to_mon(p->x, ec_p, 20); + bn_to_mon(p->y, ec_p, 20); +} + +static void point_from_mon(struct point *p) +{ + bn_from_mon(p->x, ec_p, 20); + bn_from_mon(p->y, ec_p, 20); +} + +#if 0 +static int point_is_on_curve(u8 *p) +{ + u8 s[20], t[20]; + u8 *x, *y; + + x = p; + y = p + 20; + + elt_square(t, x); + elt_mul(s, t, x); + + elt_mul(t, x, ec_a); + elt_add(s, s, t); + + elt_add(s, s, ec_b); + + elt_square(t, y); + elt_sub(s, s, t); + + return elt_is_zero(s); +} +#endif + +static void point_zero(struct point *p) +{ + elt_zero(p->x); + elt_zero(p->y); +} + +static int point_is_zero(struct point *p) +{ + return elt_is_zero(p->x) && elt_is_zero(p->y); +} + +static void point_double(struct point *r, struct point *p) +{ + u8 s[20], t[20]; + struct point pp; + u8 *px, *py, *rx, *ry; + + pp = *p; + + px = pp.x; + py = pp.y; + rx = r->x; + ry = r->y; + + if (elt_is_zero(py)) { + point_zero(r); + return; + } + + elt_square(t, px); // t = px*px + elt_add(s, t, t); // s = 2*px*px + elt_add(s, s, t); // s = 3*px*px + elt_add(s, s, ec_a); // s = 3*px*px + a + elt_add(t, py, py); // t = 2*py + elt_inv(t, t); // t = 1/(2*py) + elt_mul(s, s, t); // s = (3*px*px+a)/(2*py) + + elt_square(rx, s); // rx = s*s + elt_add(t, px, px); // t = 2*px + elt_sub(rx, rx, t); // rx = s*s - 2*px + + elt_sub(t, px, rx); // t = -(rx-px) + elt_mul(ry, s, t); // ry = -s*(rx-px) + elt_sub(ry, ry, py); // ry = -s*(rx-px) - py +} + +static void point_add(struct point *r, struct point *p, struct point *q) +{ + u8 s[20], t[20], u[20]; + u8 *px, *py, *qx, *qy, *rx, *ry; + struct point pp, qq; + + pp = *p; + qq = *q; + + px = pp.x; + py = pp.y; + qx = qq.x; + qy = qq.y; + rx = r->x; + ry = r->y; + + if (point_is_zero(&pp)) { + elt_copy(rx, qx); + elt_copy(ry, qy); + return; + } + + if (point_is_zero(&qq)) { + elt_copy(rx, px); + elt_copy(ry, py); + return; + } + + elt_sub(u, qx, px); + + if (elt_is_zero(u)) { + elt_sub(u, qy, py); + if (elt_is_zero(u)) + point_double(r, &pp); + else + point_zero(r); + + return; + } + + elt_inv(t, u); // t = 1/(qx-px) + elt_sub(u, qy, py); // u = qy-py + elt_mul(s, t, u); // s = (qy-py)/(qx-px) + + elt_square(rx, s); // rx = s*s + elt_add(t, px, qx); // t = px+qx + elt_sub(rx, rx, t); // rx = s*s - (px+qx) + + elt_sub(t, px, rx); // t = -(rx-px) + elt_mul(ry, s, t); // ry = -s*(rx-px) + elt_sub(ry, ry, py); // ry = -s*(rx-px) - py +} + +static void point_mul(struct point *d, u8 *a, struct point *b) // a is bignum +{ + u32 i; + u8 mask; + + point_zero(d); + + for (i = 0; i < 21; i++) + for (mask = 0x80; mask != 0; mask >>= 1) { + point_double(d, d); + if ((a[i] & mask) != 0) + point_add(d, d, b); + } +} + +static void generate_ecdsa(u8 *R, u8 *S, u8 *k, u8 *hash) +{ + u8 e[21]; + u8 kk[21]; + u8 m[21]; + u8 minv[21]; + struct point mG; + + e[0] = 0; + memcpy(e + 1, hash, 20); + bn_reduce(e, ec_N, 21); + +try_again: + prng(m, 21); + m[0] = 0; + if (bn_compare(m, ec_N, 21) >= 0) + goto try_again; + + // R = (mG).x + + point_mul(&mG, m, &ec_G); + point_from_mon(&mG); + R[0] = 0; + elt_copy(R+1, mG.x); + + // S = m**-1*(e + Rk) (mod N) + + bn_copy(kk, k, 21); + bn_reduce(kk, ec_N, 21); + bn_to_mon(m, ec_N, 21); + bn_to_mon(e, ec_N, 21); + bn_to_mon(R, ec_N, 21); + bn_to_mon(kk, ec_N, 21); + + bn_mon_mul(S, R, kk, ec_N, 21); + bn_add(kk, S, e, ec_N, 21); + bn_mon_inv(minv, m, ec_N, 21); + bn_mon_mul(S, minv, kk, ec_N, 21); + + bn_from_mon(R, ec_N, 21); + bn_from_mon(S, ec_N, 21); +} + +static int check_ecdsa(struct point *Q, u8 *R, u8 *S, u8 *hash) +{ + u8 Sinv[21]; + u8 e[21]; + u8 w1[21], w2[21]; + struct point r1, r2; + u8 rr[21]; + + e[0] = 0; + memcpy(e + 1, hash, 20); + bn_reduce(e, ec_N, 21); + + bn_to_mon(R, ec_N, 21); + bn_to_mon(S, ec_N, 21); + bn_to_mon(e, ec_N, 21); + + bn_mon_inv(Sinv, S, ec_N, 21); + + bn_mon_mul(w1, e, Sinv, ec_N, 21); + bn_mon_mul(w2, R, Sinv, ec_N, 21); + + bn_from_mon(w1, ec_N, 21); + bn_from_mon(w2, ec_N, 21); + + point_mul(&r1, w1, &ec_G); + point_mul(&r2, w2, Q); + + point_add(&r1, &r1, &r2); + + point_from_mon(&r1); + + rr[0] = 0; + memcpy(rr + 1, r1.x, 20); + bn_reduce(rr, ec_N, 21); + + bn_from_mon(R, ec_N, 21); + bn_from_mon(S, ec_N, 21); + + return (bn_compare(rr, R, 21) == 0); +} + +#if 0 +static void ec_priv_to_pub(u8 *k, u8 *Q) +{ + point_mul(Q, k, ec_G); +} +#endif + +int ecdsa_set_curve(u8* p, u8* a, u8* b, u8* N, u8* Gx, u8* Gy) +{ + memcpy(ec_p, p, 20); + memcpy(ec_a, a, 20); + memcpy(ec_b, b, 20); + memcpy(ec_N, N, 21); + memcpy(ec_G.x, Gx, 20); + memcpy(ec_G.y, Gy, 20); + + bn_to_mon(ec_a, ec_p, 20); + bn_to_mon(ec_b, ec_p, 20); + + point_to_mon(&ec_G); + + return 0; +} + +void ecdsa_set_pub(u8 *Q) +{ + memcpy(ec_Q.x, Q, 20); + memcpy(ec_Q.y, Q+20, 20); + point_to_mon(&ec_Q); +} + +void ecdsa_set_priv(u8 *k) +{ + memcpy(ec_k, k, sizeof ec_k); +} + +int ecdsa_verify(u8 *hash, u8 *R, u8 *S) +{ + return check_ecdsa(&ec_Q, R, S, hash); +} + +void ecdsa_sign(u8 *hash, u8 *R, u8 *S) +{ + generate_ecdsa(R, S, ec_k, hash); +} \ No newline at end of file diff --git a/rpcs3/Crypto/ec.h b/rpcs3/Crypto/ec.h new file mode 100644 index 0000000000..6b00f51971 --- /dev/null +++ b/rpcs3/Crypto/ec.h @@ -0,0 +1,14 @@ +#pragma once + +// Copyright (C) 2014 Hykem +// Licensed under the terms of the GNU GPL, version 3 +// http://www.gnu.org/licenses/gpl-3.0.txt + +#include +#include + +int ecdsa_set_curve(unsigned char *p, unsigned char *a, unsigned char *b, unsigned char *N, unsigned char *Gx, unsigned char *Gy); +void ecdsa_set_pub(unsigned char *Q); +void ecdsa_set_priv(unsigned char *k); +int ecdsa_verify(unsigned char *hash, unsigned char *R, unsigned char *S); +void ecdsa_sign(unsigned char *hash, unsigned char *R, unsigned char *S); diff --git a/rpcs3/Crypto/key_vault.cpp b/rpcs3/Crypto/key_vault.cpp index 5cbc04ac02..04a949c1be 100644 --- a/rpcs3/Crypto/key_vault.cpp +++ b/rpcs3/Crypto/key_vault.cpp @@ -8,10 +8,10 @@ SELF_KEY::SELF_KEY(u64 ver, u16 rev, u32 type, const std::string& e, const std:: version = ver; revision = rev; self_type = type; - hex_to_bytes(erk, e.c_str()); - hex_to_bytes(riv, r.c_str()); - hex_to_bytes(pub, pb.c_str()); - hex_to_bytes(priv, pr.c_str()); + hex_to_bytes(erk, e.c_str(), 0); + hex_to_bytes(riv, r.c_str(), 0); + hex_to_bytes(pub, pb.c_str(), 0); + hex_to_bytes(priv, pr.c_str(), 0); curve_type = ct; } diff --git a/rpcs3/Crypto/key_vault.h b/rpcs3/Crypto/key_vault.h index e57cfe5b90..293efeda9c 100644 --- a/rpcs3/Crypto/key_vault.h +++ b/rpcs3/Crypto/key_vault.h @@ -104,6 +104,35 @@ static u8 EDAT_IV[0x10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static u8 VSH_CURVE_P[0x14] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + +static u8 VSH_CURVE_A[0x14] = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC +}; + +static u8 VSH_CURVE_B[0x14] = { + 0xA6, 0x8B, 0xED, 0xC3, 0x34, 0x18, 0x02, 0x9C, 0x1D, 0x3C, 0xE3, 0x3B, 0x9A, 0x32, 0x1F, 0xCC, 0xBB, 0x9E, 0x0F, 0x0B +}; + +static u8 VSH_CURVE_N[0x15] = { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xB5, 0xAE, 0x3C, 0x52, 0x3E, 0x63, 0x94, 0x4F, 0x21, 0x27 +}; + +static u8 VSH_CURVE_GX[0x14] = { + 0x12, 0x8E, 0xC4, 0x25, 0x64, 0x87, 0xFD, 0x8F, 0xDF, 0x64, 0xE2, 0x43, 0x7B, 0xC0, 0xA1, 0xF6, 0xD5, 0xAF, 0xDE, 0x2C +}; + +static u8 VSH_CURVE_GY[0x14] = { + 0x59, 0x58, 0x55, 0x7E, 0xB1, 0xDB, 0x00, 0x12, 0x60, 0x42, 0x55, 0x24, 0xDB, 0xC3, 0x79, 0xD5, 0xAC, 0x5F, 0x4A, 0xDF +}; + +static u8 VSH_PUB[0x28] = { + 0x62, 0x27, 0xB0, 0x0A, 0x02, 0x85, 0x6F, 0xB0, 0x41, 0x08, 0x87, 0x67, 0x19, 0xE0, 0xA0, 0x18, 0x32, 0x91, 0xEE, 0xB9, + 0x6E, 0x73, 0x6A, 0xBF, 0x81, 0xF7, 0x0E, 0xE9, 0x16, 0x1B, 0x0D, 0xDE, 0xB0, 0x26, 0x76, 0x1A, 0xFF, 0x7B, 0xC8, 0x5B +}; + class KeyVault { std::vector sk_LV0_arr; diff --git a/rpcs3/Crypto/lz.cpp b/rpcs3/Crypto/lz.cpp index ec04981725..86d82d7161 100644 --- a/rpcs3/Crypto/lz.cpp +++ b/rpcs3/Crypto/lz.cpp @@ -4,26 +4,20 @@ #include "lz.h" -int decode_range(unsigned int *range, unsigned int *code, unsigned char **src) +void decode_range(unsigned int *range, unsigned int *code, unsigned char **src) { - if (!((*range) >> 24)) + if (!((*range) >> 24)) { (*range) <<= 8; *code = ((*code) << 8) + (*src)++[5]; - return 1; } - else - return 0; } int decode_bit(unsigned int *range, unsigned int *code, int *index, unsigned char **src, unsigned char *c) { - unsigned int val = *range; - - if (decode_range(range, code, src)) - val *= (*c); - else - val = (val >> 8) * (*c); + decode_range(range, code, src); + + unsigned int val = ((*range) >> 8) * (*c); *c -= ((*c) >> 3); if (index) (*index) <<= 1; @@ -47,12 +41,12 @@ int decode_number(unsigned char *ptr, int index, int *bit_flag, unsigned int *ra { int i = 1; - if (index >= 3) + if (index >= 3) { - decode_bit(range, code, &i, src, ptr + 0x18); // Offset 0x978 - if (index >= 4) + decode_bit(range, code, &i, src, ptr + 0x18); + if (index >= 4) { - decode_bit(range, code, &i, src, ptr + 0x18); // Offset 0x978 + decode_bit(range, code, &i, src, ptr + 0x18); if (index >= 5) { decode_range(range, code, src); @@ -60,8 +54,8 @@ int decode_number(unsigned char *ptr, int index, int *bit_flag, unsigned int *ra { i <<= 1; (*range) >>= 1; - if (*code < *range) - i++; + if (*code < *range) + i++; else (*code) -= *range; } @@ -69,16 +63,16 @@ int decode_number(unsigned char *ptr, int index, int *bit_flag, unsigned int *ra } } - *bit_flag = decode_bit(range, code, &i, src, ptr); // Offset 0x960 + *bit_flag = decode_bit(range, code, &i, src, ptr); - if (index >= 1) + if (index >= 1) { - decode_bit(range, code, &i, src, ptr + 0x8); // Offset 0x968 - if (index >= 2) + decode_bit(range, code, &i, src, ptr + 0x8); + if (index >= 2) { - decode_bit(range, code, &i, src, ptr + 0x10); // Offset 0x970 + decode_bit(range, code, &i, src, ptr + 0x10); } - } + } return i; } @@ -88,12 +82,12 @@ int decode_word(unsigned char *ptr, int index, int *bit_flag, unsigned int *rang int i = 1; index /= 8; - if (index >= 3) + if (index >= 3) { - decode_bit(range, code, &i, src, ptr); // Offset 0x8A8 - if (index >= 4) + decode_bit(range, code, &i, src, ptr + 4); + if (index >= 4) { - decode_bit(range, code, &i, src, ptr); // Offset 0x8A8 + decode_bit(range, code, &i, src, ptr + 4); if (index >= 5) { decode_range(range, code, src); @@ -101,8 +95,8 @@ int decode_word(unsigned char *ptr, int index, int *bit_flag, unsigned int *rang { i <<= 1; (*range) >>= 1; - if (*code < *range) - i++; + if (*code < *range) + i++; else (*code) -= *range; } @@ -110,16 +104,16 @@ int decode_word(unsigned char *ptr, int index, int *bit_flag, unsigned int *rang } } - *bit_flag = decode_bit(range, code, &i, src, ptr + 3); // Offset 0x8A8 + 3 + *bit_flag = decode_bit(range, code, &i, src, ptr); - if (index >= 1) + if (index >= 1) { - decode_bit(range, code, &i, src, ptr + 2); // Offset 0x8A8 + 2 - if (index >= 2) + decode_bit(range, code, &i, src, ptr + 1); + if (index >= 2) { - decode_bit(range, code, &i, src, ptr + 1); // Offset 0x8A8 + 1 + decode_bit(range, code, &i, src, ptr + 2); } - } + } return i; } @@ -128,7 +122,7 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size) { int result; - unsigned char *tmp = new unsigned char[0xA70]; + unsigned char *tmp = new unsigned char[0xCC8]; int offset = 0; int bit_flag = 0; @@ -159,11 +153,11 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size) else { // Set up a temporary buffer (sliding window). - memset(tmp, 0x80, 0xA60); + memset(tmp, 0x80, 0xCA8); while (1) { - // Start reading at 0x920. - tmp_sect1 = tmp + offset + 0x920; + // Start reading at 0xB68. + tmp_sect1 = tmp + offset + 0xB68; if (!decode_bit(&range, &code, 0, &in, tmp_sect1)) // Raw char. { // Adjust offset and check for stream end. @@ -189,57 +183,65 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size) int index = -1; // Identify the data length bit field. - do { - tmp_sect1 += 8; + do + { + tmp_sect1 += 8; bit_flag = decode_bit(&range, &code, 0, &in, tmp_sect1); index += bit_flag; } while ((bit_flag != 0) && (index < 6)); - // Default block size is 0x40. - int b_size = 0x40; + // Default block size is 0x160. + int b_size = 0x160; tmp_sect2 = tmp + index + 0x7F1; // If the data length was found, parse it as a number. - if ((index >= 0) || (bit_flag != 0)) + if ((index >= 0) || (bit_flag != 0)) { // Locate next section. - int sect = (index << 5) | (((((start - out)) << index) & 3) << 3) | (offset & 7); - tmp_sect1 = tmp + 0x960 + sect; + int sect = (index << 5) | (((((int)(start - out)) << index) & 3) << 3) | (offset & 7); + tmp_sect1 = tmp + 0xBA8 + sect; // Decode the data length (8 bit fields). data_length = decode_number(tmp_sect1, index, &bit_flag, &range, &code, &in); - - // If we got valid parameters, seek to find data offset. - if ((data_length != 3) && ((index > 0) || (bit_flag != 0))) { - tmp_sect2 += 0x38; - b_size = 0x80; // Block size is now 0x80. - } - } else { + if (data_length == 0xFF) return (start - out); // End of stream. + } + else + { // Assume one byte of advance. data_length = 1; } + // If we got valid parameters, seek to find data offset. + if ((data_length <= 2)) + { + tmp_sect2 += 0xF8; + b_size = 0x40; // Block size is now 0x40. + } + int diff = 0; int shift = 1; // Identify the data offset bit field. - do { + do + { diff = (shift << 4) - b_size; bit_flag = decode_bit(&range, &code, &shift, &in, tmp_sect2 + (shift << 3)); } while (diff < 0); // If the data offset was found, parse it as a number. - if ((diff > 0) || (bit_flag != 0)) + if ((diff > 0) || (bit_flag != 0)) { // Adjust diff if needed. if (bit_flag == 0) diff -= 8; // Locate section. - tmp_sect3 = tmp + 0x8A8 + diff; + tmp_sect3 = tmp + 0x928 + diff; // Decode the data offset (1 bit fields). data_offset = decode_word(tmp_sect3, diff, &bit_flag, &range, &code, &in); - } else { + } + else + { // Assume one byte of advance. data_offset = 1; } @@ -260,7 +262,8 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size) offset = ((((int)(buf_end - out)) + 1) & 1) + 6; // Copy data. - do { + do + { *start++ = *buf_start++; } while (start < buf_end); @@ -271,4 +274,4 @@ int decompress(unsigned char *out, unsigned char *in, unsigned int size) } delete[] tmp; return result; -} +} \ No newline at end of file diff --git a/rpcs3/Crypto/lz.h b/rpcs3/Crypto/lz.h index c27192624c..f84415623d 100644 --- a/rpcs3/Crypto/lz.h +++ b/rpcs3/Crypto/lz.h @@ -1,8 +1,15 @@ #pragma once + +// Copyright (C) 2014 Hykem +// Licensed under the terms of the GNU GPL, version 3 +// http://www.gnu.org/licenses/gpl-3.0.txt + +// Reverse-engineered custom Lempel–Ziv–Markov based compression. + #include -int decode_range(unsigned int *range, unsigned int *code, unsigned char **src); +void decode_range(unsigned int *range, unsigned int *code, unsigned char **src); int decode_bit(unsigned int *range, unsigned int *code, int *index, unsigned char **src, unsigned char *c); int decode_number(unsigned char *ptr, int index, int *bit_flag, unsigned int *range, unsigned int *code, unsigned char **src); int decode_word(unsigned char *ptr, int index, int *bit_flag, unsigned int *range, unsigned int *code, unsigned char **src); -int decompress(unsigned char *out, unsigned char *in, unsigned int size); +int decompress(unsigned char *out, unsigned char *in, unsigned int size); \ No newline at end of file diff --git a/rpcs3/Crypto/sha1.h b/rpcs3/Crypto/sha1.h index 84d4bd80d2..f616f468b8 100644 --- a/rpcs3/Crypto/sha1.h +++ b/rpcs3/Crypto/sha1.h @@ -1,4 +1,5 @@ #pragma once + /** * \file sha1.h * diff --git a/rpcs3/Crypto/unedat.cpp b/rpcs3/Crypto/unedat.cpp index 7cd9604ac6..27ddbffb6a 100644 --- a/rpcs3/Crypto/unedat.cpp +++ b/rpcs3/Crypto/unedat.cpp @@ -1,5 +1,4 @@ #include "stdafx.h" -#include "utils.h" #include "key_vault.h" #include "unedat.h" #include "Utilities/Log.h" @@ -7,7 +6,7 @@ void generate_key(int crypto_mode, int version, unsigned char *key_final, unsigned char *iv_final, unsigned char *key, unsigned char *iv) { - int mode = (int) (crypto_mode & 0xF0000000); + int mode = (int)(crypto_mode & 0xF0000000); switch (mode) { case 0x10000000: // Encrypted ERK. @@ -32,7 +31,7 @@ void generate_key(int crypto_mode, int version, unsigned char *key_final, unsign void generate_hash(int hash_mode, int version, unsigned char *hash_final, unsigned char *hash) { - int mode = (int) (hash_mode & 0xF0000000); + int mode = (int)(hash_mode & 0xF0000000); switch (mode) { case 0x10000000: // Encrypted HASH. @@ -52,7 +51,7 @@ void generate_hash(int hash_mode, int version, unsigned char *hash_final, unsign }; } -bool crypto(int hash_mode, int crypto_mode, int version, unsigned char *in, unsigned char *out, int length, unsigned char *key, unsigned char *iv, unsigned char *hash, unsigned char *test_hash) +bool decrypt(int hash_mode, int crypto_mode, int version, unsigned char *in, unsigned char *out, int length, unsigned char *key, unsigned char *iv, unsigned char *hash, unsigned char *test_hash) { // Setup buffers for key, iv and hash. unsigned char key_final[0x10] = {}; @@ -77,29 +76,30 @@ bool crypto(int hash_mode, int crypto_mode, int version, unsigned char *in, unsi } else { - LOG_ERROR(LOADER, "EDAT: Unknown crypto algorithm!\n"); + LOG_ERROR(LOADER, "EDAT: Unknown crypto algorithm!"); return false; } - + if ((hash_mode & 0xFF) == 0x01) // 0x14 SHA1-HMAC { - return hmac_hash_compare(hash_final_14, 0x14, in, length, test_hash); + return hmac_hash_compare(hash_final_14, 0x14, in, length, test_hash, 0x14); } else if ((hash_mode & 0xFF) == 0x02) // 0x10 AES-CMAC { - return cmac_hash_compare(hash_final_10, 0x10, in, length, test_hash); + return cmac_hash_compare(hash_final_10, 0x10, in, length, test_hash, 0x10); } else if ((hash_mode & 0xFF) == 0x04) //0x10 SHA1-HMAC { - return hmac_hash_compare(hash_final_10, 0x10, in, length, test_hash); + return hmac_hash_compare(hash_final_10, 0x10, in, length, test_hash, 0x10); } else { - LOG_ERROR(LOADER, "EDAT: Unknown hashing algorithm!\n"); + LOG_ERROR(LOADER, "EDAT: Unknown hashing algorithm!"); return false; } } +// EDAT/SDAT functions. unsigned char* dec_section(unsigned char* metadata) { unsigned char *dec = new unsigned char[0x10]; @@ -135,11 +135,11 @@ unsigned char* get_block_key(int block, NPD_HEADER *npd) return dest_key; } -// EDAT/SDAT functions. -int decrypt_data(rFile *in, rFile *out, EDAT_SDAT_HEADER *edat, NPD_HEADER *npd, unsigned char* crypt_key, bool verbose) +// EDAT/SDAT decryption. +int decrypt_data(rFile *in, rFile *out, EDAT_HEADER *edat, NPD_HEADER *npd, unsigned char* crypt_key, bool verbose) { // Get metadata info and setup buffers. - int block_num = (int) ((edat->file_size + edat->block_size - 1) / edat->block_size); + int block_num = (int)((edat->file_size + edat->block_size - 1) / edat->block_size); int metadata_section_size = ((edat->flags & EDAT_COMPRESSED_FLAG) != 0 || (edat->flags & EDAT_FLAG_0x20) != 0) ? 0x20 : 0x10; int metadata_offset = 0x100; @@ -148,78 +148,103 @@ int decrypt_data(rFile *in, rFile *out, EDAT_SDAT_HEADER *edat, NPD_HEADER *npd, unsigned char *b_key; unsigned char *iv; + unsigned char hash[0x10]; + unsigned char key_result[0x10]; + unsigned char hash_result[0x14]; + memset(hash, 0, 0x10); + memset(key_result, 0, 0x10); + memset(hash_result, 0, 0x14); + + unsigned long long offset = 0; + unsigned long long metadata_sec_offset = 0; + int length = 0; + int compression_end = 0; unsigned char empty_iv[0x10] = {}; // Decrypt the metadata. - for (int i = 0; i < block_num; i++) + int i; + for (i = 0; i < block_num; i++) { - in->Seek(metadata_offset + i * metadata_section_size); - unsigned char hash_result[0x10]; - long offset; - int length = 0; - int compression_end = 0; + memset(hash_result, 0, 0x14); - if ((edat->flags & EDAT_FLAG_0x04) != 0) - { - LOG_ERROR(LOADER, "EDAT: Flag 0x04 is not yet supported"); - return -1; - } - if ((edat->flags & EDAT_COMPRESSED_FLAG) != 0) { - unsigned char metadata[0x20]; - in->Read(metadata, 0x20); - - // If the data is compressed, decrypt the metadata. - unsigned char *result = dec_section(metadata); - offset = ((swap32(*(int*)&result[0]) << 4) | (swap32(*(int*)&result[4]))); - length = swap32(*(int*)&result[8]); - compression_end = swap32(*(int*)&result[12]); - delete[] result; + metadata_sec_offset = metadata_offset + (unsigned long long) i * metadata_section_size; + in->Seek(metadata_sec_offset); + unsigned char metadata[0x20]; + memset(metadata, 0, 0x20); + in->Read(metadata, 0x20); + + // If the data is compressed, decrypt the metadata. + // NOTE: For NPD version 1 the metadata is not encrypted. + if (npd->version <= 1) + { + offset = swap64(*(unsigned long long*)&metadata[0x10]); + length = swap32(*(int*)&metadata[0x18]); + compression_end = swap32(*(int*)&metadata[0x1C]); + } + else + { + unsigned char *result = dec_section(metadata); + offset = swap64(*(unsigned long long*)&result[0]); + length = swap32(*(int*)&result[8]); + compression_end = swap32(*(int*)&result[12]); + delete[] result; + } + memcpy(hash_result, metadata, 0x10); } else if ((edat->flags & EDAT_FLAG_0x20) != 0) { // If FLAG 0x20, the metadata precedes each data block. - in->Seek(metadata_offset + i * metadata_section_size + length); + metadata_sec_offset = metadata_offset + (unsigned long long) i * (metadata_section_size + length); + in->Seek(metadata_sec_offset); unsigned char metadata[0x20]; + memset(metadata, 0, 0x20); in->Read(metadata, 0x20); + memcpy(hash_result, metadata, 0x14); // If FLAG 0x20 is set, apply custom xor. - for (int j = 0; j < 0x10; j++) { - hash_result[j] = (unsigned char)(metadata[j] ^ metadata[j+0x10]); - } + int j; + for (j = 0; j < 0x10; j++) + hash_result[j] = (unsigned char)(metadata[j] ^ metadata[j + 0x10]); - offset = metadata_offset + i * edat->block_size + (i + 1) * metadata_section_size; + offset = metadata_sec_offset + 0x20; length = edat->block_size; if ((i == (block_num - 1)) && (edat->file_size % edat->block_size)) - length = (int) (edat->file_size % edat->block_size); + length = (int)(edat->file_size % edat->block_size); } else { + metadata_sec_offset = metadata_offset + (unsigned long long) i * metadata_section_size; + in->Seek(metadata_sec_offset); + in->Read(hash_result, 0x10); - offset = metadata_offset + i * edat->block_size + block_num * metadata_section_size; + offset = metadata_offset + (unsigned long long) i * edat->block_size + (unsigned long long) block_num * metadata_section_size; length = edat->block_size; - + if ((i == (block_num - 1)) && (edat->file_size % edat->block_size)) - length = (int) (edat->file_size % edat->block_size); + length = (int)(edat->file_size % edat->block_size); } // Locate the real data. int pad_length = length; - length = (int) ((pad_length + 0xF) & 0xFFFFFFF0); - in->Seek(offset); + length = (int)((pad_length + 0xF) & 0xFFFFFFF0); // Setup buffers for decryption and read the data. enc_data = new unsigned char[length]; dec_data = new unsigned char[length]; - unsigned char key_result[0x10]; - unsigned char hash[0x10]; + memset(enc_data, 0, length); + memset(dec_data, 0, length); + memset(hash, 0, 0x10); + memset(key_result, 0, 0x10); + + in->Seek(offset); in->Read(enc_data, length); - + // Generate a key for the current block. b_key = get_block_key(i, npd); @@ -247,7 +272,7 @@ int decrypt_data(rFile *in, rFile *out, EDAT_SDAT_HEADER *edat, NPD_HEADER *npd, hash_mode |= 0x10000000; } - if ((edat->flags & EDAT_DEBUG_DATA_FLAG) != 0) + if ((edat->flags & EDAT_DEBUG_DATA_FLAG) != 0) { // Reset the flags. crypto_mode |= 0x01000000; @@ -260,7 +285,13 @@ int decrypt_data(rFile *in, rFile *out, EDAT_SDAT_HEADER *edat, NPD_HEADER *npd, // IV is null if NPD version is 1 or 0. iv = (npd->version <= 1) ? empty_iv : npd->digest; // Call main crypto routine on this data block. - crypto(hash_mode, crypto_mode, (npd->version == 4), enc_data, dec_data, length, key_result, iv, hash, hash_result); + if (!decrypt(hash_mode, crypto_mode, (npd->version == 4), enc_data, dec_data, length, key_result, iv, hash, hash_result)) + { + if (verbose) + LOG_WARNING(LOADER, "EDAT: Block at offset 0x%llx has invalid hash!", offset); + + return 1; + } } // Apply additional compression if needed and write the decrypted data. @@ -271,28 +302,28 @@ int decrypt_data(rFile *in, rFile *out, EDAT_SDAT_HEADER *edat, NPD_HEADER *npd, memset(decomp_data, 0, decomp_size); if (verbose) - LOG_NOTICE(LOADER, "EDAT: Decompressing...\n"); - - int res = lz_decompress(decomp_data, dec_data, decomp_size); + LOG_NOTICE(LOADER, "EDAT: Decompressing data..."); + + int res = decompress(decomp_data, dec_data, decomp_size); out->Write(decomp_data, res); - + if (verbose) { - LOG_NOTICE(LOADER, "EDAT: Compressed block size: %d\n", pad_length); - LOG_NOTICE(LOADER, "EDAT: Decompressed block size: %d\n", res); + LOG_NOTICE(LOADER, "EDAT: Compressed block size: %d", pad_length); + LOG_NOTICE(LOADER, "EDAT: Decompressed block size: %d", res); } edat->file_size -= res; - if (edat->file_size == 0) + if (edat->file_size == 0) { if (res < 0) { - LOG_ERROR(LOADER, "EDAT: Decompression failed!\n"); + LOG_ERROR(LOADER, "EDAT: Decompression failed!"); return 1; } else - LOG_SUCCESS(LOADER, "EDAT: Data successfully decompressed!\n"); + LOG_NOTICE(LOADER, "EDAT: Successfully decompressed!"); } delete[] decomp_data; @@ -309,158 +340,262 @@ int decrypt_data(rFile *in, rFile *out, EDAT_SDAT_HEADER *edat, NPD_HEADER *npd, return 0; } -static bool check_flags(EDAT_SDAT_HEADER *edat, NPD_HEADER *npd) +int check_data(unsigned char *key, EDAT_HEADER *edat, NPD_HEADER *npd, rFile *f, bool verbose) { - if (edat == nullptr || npd == nullptr) - return false; + f->Seek(0); + unsigned char header[0xA0]; + unsigned char empty_header[0xA0]; + unsigned char header_hash[0x10]; + unsigned char metadata_hash[0x10]; + memset(header, 0, 0xA0); + memset(empty_header, 0, 0xA0); + memset(header_hash, 0, 0x10); + memset(metadata_hash, 0, 0x10); - if (npd->version == 0 || npd->version == 1) + // Check NPD version and flags. + if ((npd->version == 0) || (npd->version == 1)) { - if (edat->flags & 0x7EFFFFFE) + if (edat->flags & 0x7EFFFFFE) { - LOG_ERROR(LOADER, "EDAT: Bad header flags!\n"); - return false; + LOG_ERROR(LOADER, "EDAT: Bad header flags!"); + return 1; } } - else if (npd->version == 2) + else if (npd->version == 2) { - if (edat->flags & 0x7EFFFFE0) + if (edat->flags & 0x7EFFFFE0) { - LOG_ERROR(LOADER, "EDAT: Bad header flags!\n"); - return false; + LOG_ERROR(LOADER, "EDAT: Bad header flags!"); + return 1; } } - else if (npd->version == 3 || npd->version == 4) + else if ((npd->version == 3) || (npd->version == 4)) { if (edat->flags & 0x7EFFFFC0) { - LOG_ERROR(LOADER, "EDAT: Bad header flags!\n"); - return false; + LOG_ERROR(LOADER, "EDAT: Bad header flags!"); + return 1; } } - else if (npd->version > 4) + else { - LOG_ERROR(LOADER, "EDAT: Unknown version - %d\n", npd->version); - return false; - } - - return true; -} - -int check_data(unsigned char *key, EDAT_SDAT_HEADER *edat, NPD_HEADER *npd, rFile *f, bool verbose) -{ - f->Seek(0); - unsigned char *header = new unsigned char[0xA0]; - unsigned char *tmp = new unsigned char[0xA0]; - unsigned char *hash_result = new unsigned char[0x10]; - - // Check NPD version and EDAT flags. - if (!check_flags(edat, npd)) - { - delete[] header; - delete[] tmp; - delete[] hash_result; - + LOG_ERROR(LOADER, "EDAT: Unknown version!"); return 1; } // Read in the file header. f->Read(header, 0xA0); - f->Read(hash_result, 0x10); + + // Read in the header and metadata section hashes. + f->Seek(0x90); + f->Read(metadata_hash, 0x10); + f->Read(header_hash, 0x10); // Setup the hashing mode and the crypto mode used in the file. int crypto_mode = 0x1; int hash_mode = ((edat->flags & EDAT_ENCRYPTED_KEY_FLAG) == 0) ? 0x00000002 : 0x10000002; if ((edat->flags & EDAT_DEBUG_DATA_FLAG) != 0) { - LOG_ERROR(LOADER, "EDAT: DEBUG data detected!\n"); hash_mode |= 0x01000000; + + if (verbose) + LOG_WARNING(LOADER, "EDAT: DEBUG data detected!"); } // Setup header key and iv buffers. - unsigned char header_key[0x10] = {}; - unsigned char header_iv[0x10] = {}; + unsigned char header_key[0x10]; + unsigned char header_iv[0x10]; + memset(header_key, 0, 0x10); + memset(header_iv, 0, 0x10); // Test the header hash (located at offset 0xA0). - if (!crypto(hash_mode, crypto_mode, (npd->version == 4), header, tmp, 0xA0, header_key, header_iv, key, hash_result)) + if (!decrypt(hash_mode, crypto_mode, (npd->version == 4), header, empty_header, 0xA0, header_key, header_iv, key, header_hash)) { if (verbose) - LOG_WARNING(LOADER, "EDAT: Header hash is invalid!\n"); + LOG_WARNING(LOADER, "EDAT: Header hash is invalid!"); + + // If the header hash test fails and the data is not DEBUG, then RAP/RIF/KLIC key is invalid. + if ((edat->flags & EDAT_DEBUG_DATA_FLAG) != EDAT_DEBUG_DATA_FLAG) + { + LOG_ERROR(LOADER, "EDAT: RAP/RIF/KLIC key is invalid!"); + return 1; + } } // Parse the metadata info. - int metadata_section_size = 0x10; + int metadata_section_size = ((edat->flags & EDAT_COMPRESSED_FLAG) != 0 || (edat->flags & EDAT_FLAG_0x20) != 0) ? 0x20 : 0x10; if (((edat->flags & EDAT_COMPRESSED_FLAG) != 0)) { - LOG_WARNING(LOADER, "EDAT: COMPRESSED data detected!\n"); - metadata_section_size = 0x20; + if (verbose) + LOG_WARNING(LOADER, "EDAT: COMPRESSED data detected!"); } - int block_num = (int) ((edat->file_size + edat->block_size - 1) / edat->block_size); - int bytes_read = 0; + int block_num = (int)((edat->file_size + edat->block_size - 1) / edat->block_size); int metadata_offset = 0x100; + int metadata_size = metadata_section_size * block_num; + long long metadata_section_offset = metadata_offset; + + long bytes_read = 0; + long bytes_to_read = metadata_size; + unsigned char *metadata = new unsigned char[metadata_size]; + unsigned char *empty_metadata = new unsigned char[metadata_size]; - long bytes_to_read = metadata_section_size * block_num; while (bytes_to_read > 0) { // Locate the metadata blocks. - int block_size = (0x3C00 > bytes_to_read) ? (int) bytes_to_read : 0x3C00; // 0x3C00 is the maximum block size. - f->Seek(metadata_offset + bytes_read); - unsigned char *data = new unsigned char[block_size]; + f->Seek(metadata_section_offset); // Read in the metadata. - tmp = new unsigned char[block_size]; - f->Read(data, block_size); - - // Check the generated hash against the metadata hash located at offset 0x90 in the header. - memset(hash_result, 0, 0x10); - f->Seek(0x90); - f->Read(hash_result, 0x10); - - // Generate the hash for this block. - if (!crypto(hash_mode, crypto_mode, (npd->version == 4), data, tmp, block_size, header_key, header_iv, key, hash_result)) - { - if (verbose) - LOG_WARNING(LOADER, "EDAT: Metadata hash from block 0x%08x is invalid!\n", metadata_offset + bytes_read); - } + f->Read(metadata + bytes_read, metadata_section_size); // Adjust sizes. - bytes_read += block_size; - bytes_to_read -= block_size; + bytes_read += metadata_section_size; + bytes_to_read -= metadata_section_size; - delete[] data; + if (((edat->flags & EDAT_FLAG_0x20) != 0)) // Metadata block before each data block. + metadata_section_offset += (metadata_section_size + edat->block_size); + else + metadata_section_offset += metadata_section_size; + } + + // Test the metadata section hash (located at offset 0x90). + if (!decrypt(hash_mode, crypto_mode, (npd->version == 4), metadata, empty_metadata, metadata_size, header_key, header_iv, key, metadata_hash)) + { + if (verbose) + LOG_WARNING(LOADER, "EDAT: Metadata section hash is invalid!"); + } + + // Checking ECDSA signatures. + if ((edat->flags & EDAT_DEBUG_DATA_FLAG) == 0) + { + LOG_NOTICE(LOADER, "EDAT: Checking signatures..."); + + // Setup buffers. + unsigned char metadata_signature[0x28]; + unsigned char header_signature[0x28]; + unsigned char signature_hash[20]; + unsigned char signature_r[0x15]; + unsigned char signature_s[0x15]; + unsigned char zero_buf[0x15]; + memset(metadata_signature, 0, 0x28); + memset(header_signature, 0, 0x28); + memset(signature_hash, 0, 20); + memset(signature_r, 0, 0x15); + memset(signature_s, 0, 0x15); + memset(zero_buf, 0, 0x15); + + // Setup ECDSA curve and public key. + ecdsa_set_curve(VSH_CURVE_P, VSH_CURVE_A, VSH_CURVE_B, VSH_CURVE_N, VSH_CURVE_GX, VSH_CURVE_GY); + ecdsa_set_pub(VSH_PUB); + + + // Read in the metadata and header signatures. + f->Seek(0xB0); + f->Read(metadata_signature, 0x28); + f->Seek(0xD8); + f->Read(header_signature, 0x28); + + // Checking metadata signature. + // Setup signature r and s. + memcpy(signature_r + 01, metadata_signature, 0x14); + memcpy(signature_s + 01, metadata_signature + 0x14, 0x14); + if ((!memcmp(signature_r, zero_buf, 0x15)) || (!memcmp(signature_s, zero_buf, 0x15))) + LOG_WARNING(LOADER, "EDAT: Metadata signature is invalid!"); + else + { + // Setup signature hash. + if ((edat->flags & EDAT_FLAG_0x20) != 0) //Sony failed again, they used buffer from 0x100 with half size of real metadata. + { + int metadata_buf_size = block_num * 0x10; + unsigned char *metadata_buf = new unsigned char[metadata_buf_size]; + f->Seek(metadata_offset); + f->Read(metadata_buf, metadata_buf_size); + sha1(metadata_buf, metadata_buf_size, signature_hash); + delete[] metadata_buf; + } + else + sha1(metadata, metadata_size, signature_hash); + + if (!ecdsa_verify(signature_hash, signature_r, signature_s)) + { + LOG_WARNING(LOADER, "EDAT: Metadata signature is invalid!"); + if (((unsigned long long)edat->block_size * block_num) > 0x100000000) + LOG_WARNING(LOADER, "EDAT: *Due to large file size, metadata signature status may be incorrect!"); + } + else + LOG_NOTICE(LOADER, "EDAT: Metadata signature is valid!"); + } + + + // Checking header signature. + // Setup header signature r and s. + memset(signature_r, 0, 0x15); + memset(signature_s, 0, 0x15); + memcpy(signature_r + 01, header_signature, 0x14); + memcpy(signature_s + 01, header_signature + 0x14, 0x14); + + if ((!memcmp(signature_r, zero_buf, 0x15)) || (!memcmp(signature_s, zero_buf, 0x15))) + LOG_WARNING(LOADER, "EDAT: Header signature is invalid!"); + else + { + // Setup header signature hash. + memset(signature_hash, 0, 20); + unsigned char *header_buf = new unsigned char[0xD8]; + f->Seek(0x00); + f->Read(header_buf, 0xD8); + sha1(header_buf, 0xD8, signature_hash ); + delete[] header_buf; + + if (ecdsa_verify(signature_hash, signature_r, signature_s)) + LOG_NOTICE(LOADER, "EDAT: Header signature is valid!"); + else + LOG_WARNING(LOADER, "EDAT: Header signature is invalid!"); + } } // Cleanup. - delete[] header; - delete[] tmp; - delete[] hash_result; + delete[] metadata; + delete[] empty_metadata; return 0; } -void validate_data(const char* file_name, unsigned char *klicensee, NPD_HEADER *npd, bool verbose) +int validate_npd_hashes(const char* file_name, unsigned char *klicensee, NPD_HEADER *npd, bool verbose) { int title_hash_result = 0; int dev_hash_result = 0; - int file_name_length = (int)strlen(file_name); + int file_name_length = (int) strlen(file_name); unsigned char *buf = new unsigned char[0x30 + file_name_length]; + unsigned char dev[0x60]; unsigned char key[0x10]; + memset(dev, 0, 0x60); + memset(key, 0, 0x10); - // Build the buffer (content_id + file_name). + // Build the title buffer (content_id + file_name). memcpy(buf, npd->content_id, 0x30); memcpy(buf + 0x30, file_name, file_name_length); - // Hash with NP_OMAC_KEY_3 and compare with title_hash. - title_hash_result = cmac_hash_compare(NP_OMAC_KEY_3, 0x10, buf, 0x30 + file_name_length, npd->title_hash); + // Build the dev buffer (first 0x60 bytes of NPD header in big-endian). + memcpy(dev, npd, 0x60); + + // Fix endianness. + int version = swap32(npd->version); + int license = swap32(npd->license); + int type = swap32(npd->type); + memcpy(dev + 0x4, &version, 4); + memcpy(dev + 0x8, &license, 4); + memcpy(dev + 0xC, &type, 4); + + // Hash with NPDRM_OMAC_KEY_3 and compare with title_hash. + title_hash_result = cmac_hash_compare(NP_OMAC_KEY_3, 0x10, buf, 0x30 + file_name_length, npd->title_hash, 0x10); if (verbose) { if (title_hash_result) - LOG_SUCCESS(LOADER, "EDAT: NPD title hash is valid!\n"); - else - LOG_WARNING(LOADER, "EDAT: NPD title hash is invalid!\n"); + LOG_NOTICE(LOADER, "EDAT: NPD title hash is valid!"); + else + LOG_WARNING(LOADER, "EDAT: NPD title hash is invalid!"); } // Check for an empty dev_hash (can't validate if devklic is NULL); @@ -477,40 +612,45 @@ void validate_data(const char* file_name, unsigned char *klicensee, NPD_HEADER * if (isDevklicEmpty) { if (verbose) - LOG_WARNING(LOADER, "EDAT: NPD dev hash is empty!\n"); + LOG_WARNING(LOADER, "EDAT: NPD dev hash is empty!"); + + // Allow empty dev hash. + dev_hash_result = 1; } else { // Generate klicensee xor key. - xor_(key, klicensee, NP_OMAC_KEY_2, 0x10); + xor_key(key, klicensee, NP_OMAC_KEY_2, 0x10); // Hash with generated key and compare with dev_hash. - dev_hash_result = cmac_hash_compare(key, 0x10, (unsigned char *)npd, 0x60, npd->dev_hash); - + dev_hash_result = cmac_hash_compare(key, 0x10, dev, 0x60, npd->dev_hash, 0x10); + if (verbose) { if (dev_hash_result) - LOG_SUCCESS(LOADER, "EDAT: NPD dev hash is valid!\n"); - else - LOG_WARNING(LOADER, "EDAT: NPD dev hash is invalid!\n"); + LOG_NOTICE(LOADER, "EDAT: NPD dev hash is valid!"); + else + LOG_WARNING(LOADER, "EDAT: NPD dev hash is invalid!"); } } delete[] buf; + + return (title_hash_result && dev_hash_result); } bool extract_data(rFile *input, rFile *output, const char* input_file_name, unsigned char* devklic, unsigned char* rifkey, bool verbose) { // Setup NPD and EDAT/SDAT structs. NPD_HEADER *NPD = new NPD_HEADER(); - EDAT_SDAT_HEADER *EDAT = new EDAT_SDAT_HEADER(); + EDAT_HEADER *EDAT = new EDAT_HEADER(); // Read in the NPD and EDAT/SDAT headers. char npd_header[0x80]; char edat_header[0x10]; - input->Read(npd_header, 0x80); - input->Read(edat_header, 0x10); - + input->Read(npd_header, sizeof(npd_header)); + input->Read(edat_header, sizeof(edat_header)); + memcpy(NPD->magic, npd_header, 4); NPD->version = swap32(*(int*)&npd_header[4]); NPD->license = swap32(*(int*)&npd_header[8]); @@ -523,7 +663,7 @@ bool extract_data(rFile *input, rFile *output, const char* input_file_name, unsi NPD->unk2 = swap64(*(u64*)&npd_header[120]); unsigned char npd_magic[4] = {0x4E, 0x50, 0x44, 0x00}; //NPD0 - if(memcmp(NPD->magic, npd_magic, 4)) + if (memcmp(NPD->magic, npd_magic, 4)) { LOG_ERROR(LOADER, "EDAT: %s has invalid NPD header or already decrypted.", input_file_name); delete NPD; @@ -537,41 +677,65 @@ bool extract_data(rFile *input, rFile *output, const char* input_file_name, unsi if (verbose) { - LOG_NOTICE(LOADER, "NPD HEADER\n"); - LOG_NOTICE(LOADER, "NPD version: %d\n", NPD->version); - LOG_NOTICE(LOADER, "NPD license: %d\n", NPD->license); - LOG_NOTICE(LOADER, "NPD type: %d\n", NPD->type); - LOG_NOTICE(LOADER, "\n"); - LOG_NOTICE(LOADER, "EDAT HEADER\n"); - LOG_NOTICE(LOADER, "EDAT flags: 0x%08X\n", EDAT->flags); - LOG_NOTICE(LOADER, "EDAT block size: 0x%08X\n", EDAT->block_size); - LOG_NOTICE(LOADER, "EDAT file size: 0x%08X\n", EDAT->file_size); - LOG_NOTICE(LOADER, "\n"); + LOG_NOTICE(LOADER, "NPD HEADER"); + LOG_NOTICE(LOADER, "NPD version: %d", NPD->version); + LOG_NOTICE(LOADER, "NPD license: %d", NPD->license); + LOG_NOTICE(LOADER, "NPD type: %d", NPD->type); } // Set decryption key. unsigned char key[0x10]; memset(key, 0, 0x10); - if((EDAT->flags & SDAT_FLAG) == SDAT_FLAG) + // Check EDAT/SDAT flag. + if ((EDAT->flags & SDAT_FLAG) == SDAT_FLAG) { - LOG_WARNING(LOADER, "EDAT: SDAT detected!\n"); - xor_(key, NPD->dev_hash, SDAT_KEY, 0x10); + if (verbose) + { + LOG_NOTICE(LOADER, "SDAT HEADER"); + LOG_NOTICE(LOADER, "SDAT flags: 0x%08X", EDAT->flags); + LOG_NOTICE(LOADER, "SDAT block size: 0x%08X", EDAT->block_size); + LOG_NOTICE(LOADER, "SDAT file size: 0x%08X", EDAT->file_size); + } + + // Generate SDAT key. + xor_key(key, NPD->dev_hash, SDAT_KEY, 0x10); } else { - // Perform header validation (optional step). - validate_data(input_file_name, devklic, NPD, verbose); + if (verbose) + { + LOG_NOTICE(LOADER, "EDAT HEADER"); + LOG_NOTICE(LOADER, "EDAT flags: 0x%08X", EDAT->flags); + LOG_NOTICE(LOADER, "EDAT block size: 0x%08X", EDAT->block_size); + LOG_NOTICE(LOADER, "EDAT file size: 0x%08X", EDAT->file_size); + } - if ((NPD->license & 0x3) == 0x3) // Type 3: Use supplied devklic. + // Perform header validation (EDAT only). + char real_file_name[MAX_PATH]; + extract_file_name(input_file_name, real_file_name); + if (!validate_npd_hashes(real_file_name, devklic, NPD, verbose)) + { + // Ignore header validation in DEBUG data. + if ((EDAT->flags & EDAT_DEBUG_DATA_FLAG) != EDAT_DEBUG_DATA_FLAG) + { + LOG_ERROR(LOADER, "EDAT: NPD hash validation failed!"); + delete NPD; + delete EDAT; + return 1; + } + } + + // Select EDAT key. + if ((NPD->license & 0x3) == 0x3) // Type 3: Use supplied devklic. memcpy(key, devklic, 0x10); - else if ((NPD->license & 0x2) == 0x2) // Type 2: Use key from RAP file (RIF key). - { + else if ((NPD->license & 0x2) == 0x2) // Type 2: Use key from RAP file (RIF key). + { memcpy(key, rifkey, 0x10); // Make sure we don't have an empty RIF key. int i, test = 0; - for(i = 0; i < 0x10; i++) + for (i = 0; i < 0x10; i++) { if (key[i] != 0) { @@ -579,30 +743,65 @@ bool extract_data(rFile *input, rFile *output, const char* input_file_name, unsi break; } } - + if (!test) { - LOG_ERROR(LOADER, "EDAT: A valid RAP file is needed!"); + LOG_ERROR(LOADER, "EDAT: A valid RAP file is needed for this EDAT file!"); delete NPD; delete EDAT; return 1; } } + else if ((NPD->license & 0x1) == 0x1) // Type 1: Use network activation. + { + LOG_ERROR(LOADER, "EDAT: Network license not supported!"); + delete NPD; + delete EDAT; + return 1; + } + + if (verbose) + { + int i; + LOG_NOTICE(LOADER, "DEVKLIC: "); + for (i = 0; i < 0x10; i++) + LOG_NOTICE(LOADER, "%02X", devklic[i]); + + LOG_NOTICE(LOADER, "RIF KEY: "); + for (i = 0; i < 0x10; i++) + LOG_NOTICE(LOADER, "%02X", rifkey[i]); + } } - LOG_NOTICE(LOADER, "EDAT: Parsing data...\n"); + if (verbose) + { + int i; + LOG_NOTICE(LOADER, "DECRYPTION KEY: "); + for (i = 0; i < 0x10; i++) + LOG_NOTICE(LOADER, "%02X", key[i]); + } + + LOG_NOTICE(LOADER, "EDAT: Parsing data..."); if (check_data(key, EDAT, NPD, input, verbose)) - LOG_ERROR(LOADER, "EDAT: Data parsing failed!\n"); + { + LOG_ERROR(LOADER, "EDAT: Data parsing failed!"); + delete NPD; + delete EDAT; + return 1; + } else - LOG_SUCCESS(LOADER, "EDAT: Data successfully parsed!\n"); + LOG_NOTICE(LOADER, "EDAT: Data successfully parsed!"); - printf("\n"); - - LOG_NOTICE(LOADER, "EDAT: Decrypting data...\n"); + LOG_NOTICE(LOADER, "EDAT: Decrypting data..."); if (decrypt_data(input, output, EDAT, NPD, key, verbose)) + { LOG_ERROR(LOADER, "EDAT: Data decryption failed!"); + delete NPD; + delete EDAT; + return 1; + } else - LOG_SUCCESS(LOADER, "EDAT: Data successfully decrypted!"); + LOG_NOTICE(LOADER, "EDAT: Data successfully decrypted!"); delete NPD; delete EDAT; @@ -655,21 +854,21 @@ int DecryptEDAT(const std::string& input_file_name, const std::string& output_fi memcpy(devklic, custom_klic, 0x10); else { - LOG_ERROR(LOADER, "EDAT: Invalid custom klic!\n"); + LOG_ERROR(LOADER, "EDAT: Invalid custom klic!"); return -1; } break; } default: - LOG_ERROR(LOADER, "EDAT: Invalid mode!\n"); + LOG_ERROR(LOADER, "EDAT: Invalid mode!"); return -1; } // Check the input/output files. if (!input.IsOpened() || !output.IsOpened()) { - LOG_ERROR(LOADER, "EDAT: Failed to open files!\n"); + LOG_ERROR(LOADER, "EDAT: Failed to open files!"); return -1; } @@ -692,11 +891,11 @@ int DecryptEDAT(const std::string& input_file_name, const std::string& output_fi input.Close(); output.Close(); rRemoveFile(output_file_name); - return 0; + return -1; } // Cleanup. input.Close(); output.Close(); return 0; -} +} \ No newline at end of file diff --git a/rpcs3/Crypto/unedat.h b/rpcs3/Crypto/unedat.h index 7efc8b3808..f1a9f81ab5 100644 --- a/rpcs3/Crypto/unedat.h +++ b/rpcs3/Crypto/unedat.h @@ -1,9 +1,12 @@ #pragma once +#include +#include +#include "utils.h" + #define SDAT_FLAG 0x01000000 #define EDAT_COMPRESSED_FLAG 0x00000001 #define EDAT_FLAG_0x02 0x00000002 -#define EDAT_FLAG_0x04 0x00000004 #define EDAT_ENCRYPTED_KEY_FLAG 0x00000008 #define EDAT_FLAG_0x10 0x00000010 #define EDAT_FLAG_0x20 0x00000020 @@ -28,6 +31,6 @@ typedef struct int flags; int block_size; unsigned long long file_size; -} EDAT_SDAT_HEADER; +} EDAT_HEADER; -int DecryptEDAT(const std::string& input_file_name, const std::string& output_file_name, int mode, const std::string& rap_file_name, unsigned char *custom_klic, bool verbose); +int DecryptEDAT(const std::string& input_file_name, const std::string& output_file_name, int mode, const std::string& rap_file_name, unsigned char *custom_klic, bool verbose); \ No newline at end of file diff --git a/rpcs3/Crypto/unpkg.cpp b/rpcs3/Crypto/unpkg.cpp index caae7fb9f7..39f4bf99a8 100644 --- a/rpcs3/Crypto/unpkg.cpp +++ b/rpcs3/Crypto/unpkg.cpp @@ -120,8 +120,8 @@ int Decrypt(rFile& pkg_f, rFile& dec_pkg_f, PKGHeader* m_header) { aes_crypt_ecb(&c, AES_ENCRYPT, iv, ctr+j*HASH_LEN); - be_t hi = be_t::MakeFromBE(*(u64*)&iv[0]); - be_t lo = be_t::MakeFromBE(*(u64*)&iv[8]); + be_t hi = *(be_t*)&iv[0]; + be_t lo = *(be_t*)&iv[8]; lo++; if (lo == 0) diff --git a/rpcs3/Crypto/unself.cpp b/rpcs3/Crypto/unself.cpp index 61422f5328..28b464c100 100644 --- a/rpcs3/Crypto/unself.cpp +++ b/rpcs3/Crypto/unself.cpp @@ -10,6 +10,101 @@ #include #include + +void WriteEhdr(rFile& f, Elf64_Ehdr& ehdr) +{ +Write32(f, ehdr.e_magic); +Write8(f, ehdr.e_class); +Write8(f, ehdr.e_data); +Write8(f, ehdr.e_curver); +Write8(f, ehdr.e_os_abi); +Write64(f, ehdr.e_abi_ver); +Write16(f, ehdr.e_type); +Write16(f, ehdr.e_machine); +Write32(f, ehdr.e_version); +Write64(f, ehdr.e_entry); +Write64(f, ehdr.e_phoff); +Write64(f, ehdr.e_shoff); +Write32(f, ehdr.e_flags); +Write16(f, ehdr.e_ehsize); +Write16(f, ehdr.e_phentsize); +Write16(f, ehdr.e_phnum); +Write16(f, ehdr.e_shentsize); +Write16(f, ehdr.e_shnum); +Write16(f, ehdr.e_shstrndx); +} +void WritePhdr(rFile& f, Elf64_Phdr& phdr) +{ +Write32(f, phdr.p_type); +Write32(f, phdr.p_flags); +Write64(f, phdr.p_offset); +Write64(f, phdr.p_vaddr); +Write64(f, phdr.p_paddr); +Write64(f, phdr.p_filesz); +Write64(f, phdr.p_memsz); +Write64(f, phdr.p_align); +} +void WriteShdr(rFile& f, Elf64_Shdr& shdr) +{ +Write32(f, shdr.sh_name); +Write32(f, shdr.sh_type); +Write64(f, shdr.sh_flags); +Write64(f, shdr.sh_addr); +Write64(f, shdr.sh_offset); +Write64(f, shdr.sh_size); +Write32(f, shdr.sh_link); +Write32(f, shdr.sh_info); +Write64(f, shdr.sh_addralign); +Write64(f, shdr.sh_entsize); +} +void WriteEhdr(rFile& f, Elf32_Ehdr& ehdr) +{ + Write32(f, ehdr.e_magic); + Write8(f, ehdr.e_class); + Write8(f, ehdr.e_data); + Write8(f, ehdr.e_curver); + Write8(f, ehdr.e_os_abi); + Write64(f, ehdr.e_abi_ver); + Write16(f, ehdr.e_type); + Write16(f, ehdr.e_machine); + Write32(f, ehdr.e_version); + Write32(f, ehdr.e_entry); + Write32(f, ehdr.e_phoff); + Write32(f, ehdr.e_shoff); + Write32(f, ehdr.e_flags); + Write16(f, ehdr.e_ehsize); + Write16(f, ehdr.e_phentsize); + Write16(f, ehdr.e_phnum); + Write16(f, ehdr.e_shentsize); + Write16(f, ehdr.e_shnum); + Write16(f, ehdr.e_shstrndx); +} +void WritePhdr(rFile& f, Elf32_Phdr& phdr) +{ + Write32(f, phdr.p_type); + Write32(f, phdr.p_offset); + Write32(f, phdr.p_vaddr); + Write32(f, phdr.p_paddr); + Write32(f, phdr.p_filesz); + Write32(f, phdr.p_memsz); + Write32(f, phdr.p_flags); + Write32(f, phdr.p_align); +} +void WriteShdr(rFile& f, Elf32_Shdr& shdr) +{ + Write32(f, shdr.sh_name); + Write32(f, shdr.sh_type); + Write32(f, shdr.sh_flags); + Write32(f, shdr.sh_addr); + Write32(f, shdr.sh_offset); + Write32(f, shdr.sh_size); + Write32(f, shdr.sh_link); + Write32(f, shdr.sh_info); + Write32(f, shdr.sh_addralign); + Write32(f, shdr.sh_entsize); +} + + void AppInfo::Load(vfsStream& f) { authid = Read64(f); @@ -813,10 +908,10 @@ bool SELFDecrypter::GetKeyFromRap(u8 *content_id, u8 *npdrm_key) u8 rap_key[0x10]; memset(rap_key, 0, 0x10); - // Try to find a matching RAP file under dev_usb000. + // Try to find a matching RAP file under exdata folder. std::string ci_str((const char *)content_id); - // TODO: This shouldn't use current dir - std::string rap_path("./dev_usb000/" + ci_str + ".rap"); + std::string pf_str("00000001"); // TODO: Allow multiple profiles. Use default for now. + std::string rap_path("dev_hdd0/home/" + pf_str + "/exdata/" + ci_str + ".rap"); // Check if we have a valid RAP file. if (!rExists(rap_path)) diff --git a/rpcs3/Crypto/unself.h b/rpcs3/Crypto/unself.h index 53b34bee30..787fc00c7b 100644 --- a/rpcs3/Crypto/unself.h +++ b/rpcs3/Crypto/unself.h @@ -1,6 +1,5 @@ #pragma once -#include "Loader/SELF.h" #include "Loader/ELF64.h" #include "Loader/ELF32.h" #include "key_vault.h" @@ -142,7 +141,8 @@ struct MetadataSectionHeader void Show(); }; -struct SectionHash { +struct SectionHash +{ u8 sha1[20]; u8 padding[12]; u8 hmac_key[64]; @@ -183,6 +183,291 @@ struct SelfSection void Load(vfsStream& f); }; +struct Elf32_Ehdr +{ + u32 e_magic; + u8 e_class; + u8 e_data; + u8 e_curver; + u8 e_os_abi; + u64 e_abi_ver; + u16 e_type; + u16 e_machine; + u32 e_version; + u32 e_entry; + u32 e_phoff; + u32 e_shoff; + u32 e_flags; + u16 e_ehsize; + u16 e_phentsize; + u16 e_phnum; + u16 e_shentsize; + u16 e_shnum; + u16 e_shstrndx; + void Show() {} + bool IsLittleEndian() const + { + return e_data == 1; + } + + void Load(vfsStream& f) + { + e_magic = Read32(f); + e_class = Read8(f); + e_data = Read8(f); + e_curver = Read8(f); + e_os_abi = Read8(f); + + if (IsLittleEndian()) + { + e_abi_ver = Read64LE(f); + e_type = Read16LE(f); + e_machine = Read16LE(f); + e_version = Read32LE(f); + e_entry = Read32LE(f); + e_phoff = Read32LE(f); + e_shoff = Read32LE(f); + e_flags = Read32LE(f); + e_ehsize = Read16LE(f); + e_phentsize = Read16LE(f); + e_phnum = Read16LE(f); + e_shentsize = Read16LE(f); + e_shnum = Read16LE(f); + e_shstrndx = Read16LE(f); + } + else + { + e_abi_ver = Read64(f); + e_type = Read16(f); + e_machine = Read16(f); + e_version = Read32(f); + e_entry = Read32(f); + e_phoff = Read32(f); + e_shoff = Read32(f); + e_flags = Read32(f); + e_ehsize = Read16(f); + e_phentsize = Read16(f); + e_phnum = Read16(f); + e_shentsize = Read16(f); + e_shnum = Read16(f); + e_shstrndx = Read16(f); + } + } + bool CheckMagic() const { return e_magic == 0x7F454C46; } + u32 GetEntry() const { return e_entry; } +}; + +struct Elf32_Shdr +{ + u32 sh_name; + u32 sh_type; + u32 sh_flags; + u32 sh_addr; + u32 sh_offset; + u32 sh_size; + u32 sh_link; + u32 sh_info; + u32 sh_addralign; + u32 sh_entsize; + void Load(vfsStream& f) + { + sh_name = Read32(f); + sh_type = Read32(f); + sh_flags = Read32(f); + sh_addr = Read32(f); + sh_offset = Read32(f); + sh_size = Read32(f); + sh_link = Read32(f); + sh_info = Read32(f); + sh_addralign = Read32(f); + sh_entsize = Read32(f); + } + void LoadLE(vfsStream& f) + { + f.Read(this, sizeof(*this)); + } + void Show() {} +}; +struct Elf32_Phdr +{ + u32 p_type; + u32 p_offset; + u32 p_vaddr; + u32 p_paddr; + u32 p_filesz; + u32 p_memsz; + u32 p_flags; + u32 p_align; + void Load(vfsStream& f) + { + p_type = Read32(f); + p_offset = Read32(f); + p_vaddr = Read32(f); + p_paddr = Read32(f); + p_filesz = Read32(f); + p_memsz = Read32(f); + p_flags = Read32(f); + p_align = Read32(f); + } + void LoadLE(vfsStream& f) + { + f.Read(this, sizeof(*this)); + } + void Show() {} +}; + +struct Elf64_Ehdr +{ + u32 e_magic; + u8 e_class; + u8 e_data; + u8 e_curver; + u8 e_os_abi; + u64 e_abi_ver; + u16 e_type; + u16 e_machine; + u32 e_version; + u64 e_entry; + u64 e_phoff; + u64 e_shoff; + u32 e_flags; + u16 e_ehsize; + u16 e_phentsize; + u16 e_phnum; + u16 e_shentsize; + u16 e_shnum; + u16 e_shstrndx; + void Load(vfsStream& f) + { + e_magic = Read32(f); + e_class = Read8(f); + e_data = Read8(f); + e_curver = Read8(f); + e_os_abi = Read8(f); + e_abi_ver = Read64(f); + e_type = Read16(f); + e_machine = Read16(f); + e_version = Read32(f); + e_entry = Read64(f); + e_phoff = Read64(f); + e_shoff = Read64(f); + e_flags = Read32(f); + e_ehsize = Read16(f); + e_phentsize = Read16(f); + e_phnum = Read16(f); + e_shentsize = Read16(f); + e_shnum = Read16(f); + e_shstrndx = Read16(f); + } + void Show() {} + bool CheckMagic() const { return e_magic == 0x7F454C46; } + u64 GetEntry() const { return e_entry; } +}; + +struct Elf64_Shdr +{ + u32 sh_name; + u32 sh_type; + u64 sh_flags; + u64 sh_addr; + u64 sh_offset; + u64 sh_size; + u32 sh_link; + u32 sh_info; + u64 sh_addralign; + u64 sh_entsize; + void Load(vfsStream& f) + { + sh_name = Read32(f); + sh_type = Read32(f); + sh_flags = Read64(f); + sh_addr = Read64(f); + sh_offset = Read64(f); + sh_size = Read64(f); + sh_link = Read32(f); + sh_info = Read32(f); + sh_addralign = Read64(f); + sh_entsize = Read64(f); + } + void Show(){} +}; + +struct Elf64_Phdr +{ + u32 p_type; + u32 p_flags; + u64 p_offset; + u64 p_vaddr; + u64 p_paddr; + u64 p_filesz; + u64 p_memsz; + u64 p_align; + void Load(vfsStream& f) + { + p_type = Read32(f); + p_flags = Read32(f); + p_offset = Read64(f); + p_vaddr = Read64(f); + p_paddr = Read64(f); + p_filesz = Read64(f); + p_memsz = Read64(f); + p_align = Read64(f); + } + void Show(){} +}; + +struct SceHeader +{ + u32 se_magic; + u32 se_hver; + u16 se_flags; + u16 se_type; + u32 se_meta; + u64 se_hsize; + u64 se_esize; + void Load(vfsStream& f) + { + se_magic = Read32(f); + se_hver = Read32(f); + se_flags = Read16(f); + se_type = Read16(f); + se_meta = Read32(f); + se_hsize = Read64(f); + se_esize = Read64(f); + } + void Show(){} + bool CheckMagic() const { return se_magic == 0x53434500; } +}; + +struct SelfHeader +{ + u64 se_htype; + u64 se_appinfooff; + u64 se_elfoff; + u64 se_phdroff; + u64 se_shdroff; + u64 se_secinfoff; + u64 se_sceveroff; + u64 se_controloff; + u64 se_controlsize; + u64 pad; + void Load(vfsStream& f) + { + se_htype = Read64(f); + se_appinfooff = Read64(f); + se_elfoff = Read64(f); + se_phdroff = Read64(f); + se_shdroff = Read64(f); + se_secinfoff = Read64(f); + se_sceveroff = Read64(f); + se_controloff = Read64(f); + se_controlsize = Read64(f); + pad = Read64(f); + } + void Show(){} +}; + + class SELFDecrypter { // Main SELF file stream. diff --git a/rpcs3/Crypto/utils.cpp b/rpcs3/Crypto/utils.cpp index 45a71222e3..2cba01afb8 100644 --- a/rpcs3/Crypto/utils.cpp +++ b/rpcs3/Crypto/utils.cpp @@ -1,9 +1,13 @@ -#include "stdafx.h" -#include "aes.h" -#include "sha1.h" -#include "utils.h" +// Copyright (C) 2014 Hykem +// Licensed under the terms of the GNU GPL, version 3 +// http://www.gnu.org/licenses/gpl-3.0.txt -// Endian swap auxiliary functions. +#include "stdafx.h" +#include "utils.h" +#include +#include + +// Auxiliary functions (endian swap, xor and prng). u16 swap16(u16 i) { return ((i & 0xFF00) >> 8) | ((i & 0xFF) << 8); @@ -22,7 +26,7 @@ u64 swap64(u64 i) ((i & 0x00ff000000000000) >> 40) | ((i & 0xff00000000000000) >> 56); } -void xor_(unsigned char *dest, unsigned char *src1, unsigned char *src2, int size) +void xor_key(unsigned char *dest, unsigned char *src1, unsigned char *src2, int size) { int i; for(i = 0; i < size; i++) @@ -31,10 +35,24 @@ void xor_(unsigned char *dest, unsigned char *src1, unsigned char *src2, int siz } } +void prng(unsigned char *dest, int size) +{ + unsigned char *buffer = new unsigned char[size]; + srand((u32)time(0)); + + int i; + for(i = 0; i < size; i++) + buffer[i] = (unsigned char)(rand() & 0xFF); + + memcpy(dest, buffer, size); + + delete[] buffer; +} + // Hex string conversion auxiliary functions. u64 hex_to_u64(const char* hex_str) { - u32 length = (u32)strlen(hex_str); + u32 length = (u32) strlen(hex_str); u64 tmp = 0; u64 result = 0; char c; @@ -56,19 +74,19 @@ u64 hex_to_u64(const char* hex_str) return result; } -void hex_to_bytes(unsigned char *data, const char *hex_str) +void hex_to_bytes(unsigned char *data, const char *hex_str, unsigned int str_length) { - u32 str_length = (u32)strlen(hex_str); - u32 data_length = str_length / 2; + u32 strn_length = (str_length > 0) ? str_length : (u32) strlen(hex_str); + u32 data_length = strn_length / 2; char tmp_buf[3] = {0, 0, 0}; // Don't convert if the string length is odd. - if (!(str_length % 2)) + if (!(strn_length % 2)) { - u8 *out = (u8 *) malloc (str_length * sizeof(u8)); + u8 *out = (u8 *)malloc(strn_length * sizeof(u8)); u8 *pos = out; - while (str_length--) + while (strn_length--) { tmp_buf[0] = *hex_str++; tmp_buf[1] = *hex_str++; @@ -81,6 +99,23 @@ void hex_to_bytes(unsigned char *data, const char *hex_str) } } +bool is_hex(const char* hex_str, unsigned int str_length) +{ + static const char hex_chars[] = "0123456789abcdefABCDEF"; + + if (hex_str == NULL) + return false; + + unsigned int i; + for (i = 0; i < str_length; i++) + { + if (strchr(hex_chars, hex_str[i]) == 0) + return false; + } + + return true; +} + // Crypto functions (AES128-CBC, AES128-ECB, SHA1-HMAC and AES-CMAC). void aescbc128_decrypt(unsigned char *key, unsigned char *iv, unsigned char *in, unsigned char *out, int len) { @@ -92,6 +127,16 @@ void aescbc128_decrypt(unsigned char *key, unsigned char *iv, unsigned char *in, memset(iv, 0, 0x10); } +void aescbc128_encrypt(unsigned char *key, unsigned char *iv, unsigned char *in, unsigned char *out, int len) +{ + aes_context ctx; + aes_setkey_enc(&ctx, key, 128); + aes_crypt_cbc(&ctx, AES_ENCRYPT, len, iv, in, out); + + // Reset the IV. + memset(iv, 0, 0x10); +} + void aesecb128_encrypt(unsigned char *key, unsigned char *in, unsigned char *out) { aes_context ctx; @@ -99,13 +144,13 @@ void aesecb128_encrypt(unsigned char *key, unsigned char *in, unsigned char *out aes_crypt_ecb(&ctx, AES_ENCRYPT, in, out); } -bool hmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash) +bool hmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash, int hash_len) { unsigned char *out = new unsigned char[key_len]; sha1_hmac(key, key_len, in, in_len, out); - for (int i = 0; i < 0x10; i++) + for (int i = 0; i < hash_len; i++) { if (out[i] != hash[i]) { @@ -119,7 +164,12 @@ bool hmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int i return true; } -bool cmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash) +void hmac_hash_forge(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash) +{ + sha1_hmac(key, key_len, in, in_len, hash); +} + +bool cmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash, int hash_len) { unsigned char *out = new unsigned char[key_len]; @@ -127,7 +177,7 @@ bool cmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int i aes_setkey_enc(&ctx, key, 128); aes_cmac(&ctx, in_len, in, out); - for (int i = 0; i < key_len; i++) + for (int i = 0; i < hash_len; i++) { if (out[i] != hash[i]) { @@ -141,9 +191,20 @@ bool cmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int i return true; } -#include "lz.h" -// Reverse-engineered custom Lempel–Ziv–Markov based compression (unknown variant of LZRC). -int lz_decompress(unsigned char *out, unsigned char *in, unsigned int size) +void cmac_hash_forge(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash) { - return decompress(out,in,size); + aes_context ctx; + aes_setkey_enc(&ctx, key, 128); + aes_cmac(&ctx, in_len, in, hash); } + +char* extract_file_name(const char* file_path, char real_file_name[MAX_PATH]) +{ + size_t file_path_len = strlen(file_path); + const char* p = strrchr(file_path, '/'); + if (!p) p = strrchr(file_path, '\\'); + if (p) file_path_len = file_path + file_path_len - p - 1; + strncpy(real_file_name, p ? (p + 1) : file_path, file_path_len + 1); + + return real_file_name; +} \ No newline at end of file diff --git a/rpcs3/Crypto/utils.h b/rpcs3/Crypto/utils.h index 4ae1466607..1c27ddb182 100644 --- a/rpcs3/Crypto/utils.h +++ b/rpcs3/Crypto/utils.h @@ -1,20 +1,35 @@ #pragma once -// Auxiliary functions (endian swap and xor). +// Copyright (C) 2014 Hykem +// Licensed under the terms of the GNU GPL, version 3 +// http://www.gnu.org/licenses/gpl-3.0.txt + +#define MAX_PATH 4096 + +#include +#include "aes.h" +#include "sha1.h" +#include "lz.h" +#include "ec.h" + +// Auxiliary functions (endian swap, xor, prng and file name). u16 swap16(u16 i); u32 swap32(u32 i); u64 swap64(u64 i); -void xor_(unsigned char *dest, unsigned char *src1, unsigned char *src2, int size); +void xor_key(unsigned char *dest, unsigned char *src1, unsigned char *src2, int size); +void prng(unsigned char *dest, int size); +char* extract_file_name(const char* file_path, char real_file_name[MAX_PATH]); // Hex string conversion auxiliary functions. u64 hex_to_u64(const char* hex_str); -void hex_to_bytes(unsigned char *data, const char *hex_str); +void hex_to_bytes(unsigned char *data, const char *hex_str, unsigned int str_length); +bool is_hex(const char* hex_str, unsigned int str_length); // Crypto functions (AES128-CBC, AES128-ECB, SHA1-HMAC and AES-CMAC). void aescbc128_decrypt(unsigned char *key, unsigned char *iv, unsigned char *in, unsigned char *out, int len); +void aescbc128_encrypt(unsigned char *key, unsigned char *iv, unsigned char *in, unsigned char *out, int len); void aesecb128_encrypt(unsigned char *key, unsigned char *in, unsigned char *out); -bool hmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash); -bool cmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash); - -// Reverse-engineered custom Lempel–Ziv–Markov based compression (unknown variant of LZRC). -int lz_decompress(unsigned char *out, unsigned char *in, unsigned int size); +bool hmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash, int hash_len); +void hmac_hash_forge(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash); +bool cmac_hash_compare(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash, int hash_len); +void cmac_hash_forge(unsigned char *key, int key_len, unsigned char *in, int in_len, unsigned char *hash); \ No newline at end of file diff --git a/rpcs3/Emu/ARMv7/ARMv7Decoder.h b/rpcs3/Emu/ARMv7/ARMv7Decoder.h index 298a23be51..81b58e9939 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Decoder.h +++ b/rpcs3/Emu/ARMv7/ARMv7Decoder.h @@ -13,125 +13,23 @@ public: { } - u32 branchTarget(u32 imm) - { - return imm << 1; - } - virtual u8 DecodeMemory(const u32 address) { - using namespace ARMv7_opcodes; - const u16 code0 = vm::psv::read16(address); - const u16 code1 = vm::psv::read16(address + 2); + const u32 code0 = vm::psv::read16(address & ~1); + const u32 code1 = vm::psv::read16(address + 2 & ~1); + const u32 data = code0 << 16 | code1; + const u32 arg = address & 1 ? code1 << 16 | code0 : data; - switch(code0 >> 12) //15 - 12 + for (auto& opcode : ARMv7_opcode_table) { - case T1_CBZ: - switch((code0 >> 10) & 0x1) + if ((opcode.type < A1) == ((address & 1) == 0) && (arg & opcode.mask) == opcode.code) { - case 0: - switch((code0 >> 8) & 0x1) - { - case 1: - m_op.CBZ((code0 >> 11) & 0x1, branchTarget((((code0 >> 9) & 0x1) << 5) | ((code0 >> 3) & 0x1f)), code0 & 0x7, 2); - return 2; - } - break; - } - break; - - case T1_B: - m_op.B((code0 >> 8) & 0xf, branchTarget(code0 & 0xff), 2); - return 2; - } - - switch(code0 >> 11) //15 - 11 - { - case T2_B: - m_op.B(0xf, branchTarget(code0 & 0xfff), 2); - return 2; - - case T3_B: - { - u8 S = (code0 >> 10) & 0x1; - u8 J1 = (code1 >> 13) & 0x1; - u8 J2 = (code1 >> 11) & 0x1; - u8 I1 = 1 - (J1 ^ S); - u8 I2 = 1 - (J2 ^ S); - u16 imm11 = code1 & 0x7ff; - u32 imm32 = 0; - - switch(code1 >> 14) - { - case 2: //B - { - u8 cond; - switch((code1 >> 12) & 0x1) - { - case 0: - { - cond = (code0 >> 6) & 0xf; - u32 imm6 = code0 & 0x3f; - imm32 = sign<19, u32>((S << 19) | (I1 << 18) | (I2 << 17) | (imm6 << 11) | imm11); - } - break; - - case 1: - cond = 0xf; - u32 imm10 = code0 & 0x7ff; - imm32 = sign<23, u32>((S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11); - break; - } - - m_op.B(cond, branchTarget(imm32), 4); - } - return 4; - - case 3: //BL - switch((code1 >> 12) & 0x1) - { - case 0: - break; - - case 1: - u32 imm10 = code0 & 0x7ff; - imm32 = sign<23, u32>((S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11); - m_op.BL(branchTarget(imm32), 4); - return 4; - } - break; + (m_op.*opcode.func)(opcode.length == 2 ? code0 : arg, opcode.type); + return opcode.length; } } - break; - } - switch(code0 >> 9) - { - case T1_PUSH: - m_op.PUSH((((code0 >> 8) & 0x1) << 14) | (code0 & 0xff)); - return 2; - - case T1_POP: - m_op.POP((((code0 >> 8) & 0x1) << 15) | (code0 & 0xff)); - return 2; - } - - switch(code0) - { - case T2_PUSH: - m_op.PUSH(code1); - return 4; - - case T2_POP: - m_op.POP(code1); - return 4; - - case T1_NOP: - m_op.NOP(); - return 2; - } - - m_op.UNK(code0, code1); - return 2; + m_op.UNK(data); + return address & 1 ? 4 : 2; } }; diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp new file mode 100644 index 0000000000..ccb2582cad --- /dev/null +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.cpp @@ -0,0 +1,1122 @@ +#include "stdafx.h" +#include "ARMv7DisAsm.h" + +void ARMv7DisAsm::UNK(const u32 data) +{ + Write("Unknown/illegal opcode"); +} + +void ARMv7DisAsm::NULL_OP(const u32 data, const ARMv7_encoding type) +{ + Write("Illegal opcode (null)"); +} + +void ARMv7DisAsm::HACK(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADC_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ADD_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_SPI(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ADD_SPR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ADR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::AND_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::AND_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::AND_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ASR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ASR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::B(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //if ((cond & 0xe) == 0xe) + //{ + // Write(fmt::Format("b 0x%x", DisAsmBranchTarget(imm) + intstr_size)); + //} + //else + //{ + // Write(fmt::Format("b[%s] 0x%x", g_arm_cond_name[cond], DisAsmBranchTarget(imm) + intstr_size)); + //} +} + + +void ARMv7DisAsm::BFC(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::BFI(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::BIC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::BIC_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::BIC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::BKPT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::BL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); +} + +void ARMv7DisAsm::BLX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); +} + +void ARMv7DisAsm::BX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::CB_Z(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //Write(fmt::Format("cbz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); + //Write(fmt::Format("cbnz 0x%x,%s", DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); +} + + +void ARMv7DisAsm::CLZ(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::CMN_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::CMN_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::CMN_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::CMP_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::CMP_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::CMP_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::EOR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::EOR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::EOR_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::IT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDMDA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDMDB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDMIB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDR_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRB_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRD_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRD_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRD_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRH_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRH_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRH_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRSB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSB_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LDRSH_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSH_LIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LDRSH_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LSL_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LSL_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::LSR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::LSR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::MLA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MLS(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::MOV_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MOV_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MOVT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::MRS(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MSR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MSR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::MUL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::MVN_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MVN_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::MVN_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::NOP(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ORN_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ORN_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ORR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ORR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ORR_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::PKH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::POP(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //Write(fmt::Format("pop {%s}", GetRegsListString(regs_list).c_str())); +} + +void ARMv7DisAsm::PUSH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); + //Write(fmt::Format("push {%s}", GetRegsListString(regs_list).c_str())); +} + + +void ARMv7DisAsm::QADD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QDADD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QDSUB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSUB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::QSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RBIT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::REV(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::REV16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::REVSH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::ROR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::ROR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RRX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RSB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSB_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::RSC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSC_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::RSC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SBC_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SBC_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SBC_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SBFX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SDIV(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SEL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SHADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SHSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SMLA__(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAL__(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLALD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLAW_(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLSD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMLSLD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMMLA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMMLS(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMMUL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMUAD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMUL__(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMULL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMULW_(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SMUSD(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SSAT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSAT16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STMDA(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STMDB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STMIB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STR_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STR_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STRB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STRB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STRD_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STRD_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::STRH_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::STRH_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SUB_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_SPI(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SUB_SPR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SVC(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::SXTAB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTAB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTAH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::SXTH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::TB_(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::TEQ_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TEQ_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TEQ_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::TST_IMM(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TST_REG(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::TST_RSR(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + + +void ARMv7DisAsm::UADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UBFX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UDIV(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UHSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UMAAL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UMLAL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UMULL(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQADD16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQADD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQASX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQSAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQSUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UQSUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAD8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USADA8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAT(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAT16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USAX(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USUB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::USUB8(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTAB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTAB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTAH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTB(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTB16(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + +void ARMv7DisAsm::UXTH(const u32 data, const ARMv7_encoding type) +{ + Write(__FUNCTION__); +} + diff --git a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h index cf84835cd8..7eb712d24c 100644 --- a/rpcs3/Emu/ARMv7/ARMv7DisAsm.h +++ b/rpcs3/Emu/ARMv7/ARMv7DisAsm.h @@ -45,50 +45,276 @@ protected: return regs_str; } - void NULL_OP() - { - Write("null"); - } + virtual void UNK(const u32 data); - void PUSH(u16 regs_list) - { - Write(fmt::Format("push {%s}", GetRegsListString(regs_list).c_str())); - } + virtual void NULL_OP(const u32 data, const ARMv7_encoding type); - void POP(u16 regs_list) - { - Write(fmt::Format("pop {%s}", GetRegsListString(regs_list).c_str())); - } + virtual void HACK(const u32 data, const ARMv7_encoding type); - void NOP() - { - Write("nop"); - } + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADC_REG(const u32 data, const ARMv7_encoding type); + virtual void ADC_RSR(const u32 data, const ARMv7_encoding type); - void B(u8 cond, u32 imm, u8 intstr_size) - { - if((cond & 0xe) == 0xe) - { - Write(fmt::Format("b 0x%x", DisAsmBranchTarget(imm) + intstr_size)); - } - else - { - Write(fmt::Format("b[%s] 0x%x", g_arm_cond_name[cond], DisAsmBranchTarget(imm) + intstr_size)); - } - } + virtual void ADD_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADD_REG(const u32 data, const ARMv7_encoding type); + virtual void ADD_RSR(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPI(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPR(const u32 data, const ARMv7_encoding type); - virtual void CBZ(u8 op, u32 imm, u8 rn, u8 intstr_size) - { - Write(fmt::Format("cb%sz 0x%x,%s", (op ? "n" : ""), DisAsmBranchTarget(imm) + intstr_size, g_arm_reg_name[rn])); - } + virtual void ADR(const u32 data, const ARMv7_encoding type); - void BL(u32 imm, u8 intstr_size) - { - Write(fmt::Format("bl 0x%x", DisAsmBranchTarget(imm) + intstr_size)); - } + virtual void AND_IMM(const u32 data, const ARMv7_encoding type); + virtual void AND_REG(const u32 data, const ARMv7_encoding type); + virtual void AND_RSR(const u32 data, const ARMv7_encoding type); - void UNK(const u16 code0, const u16 code1) - { - Write(fmt::Format("Unknown/Illegal opcode! (0x%04x : 0x%04x)", code0, code1)); - } + virtual void ASR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ASR_REG(const u32 data, const ARMv7_encoding type); + + virtual void B(const u32 data, const ARMv7_encoding type); + + virtual void BFC(const u32 data, const ARMv7_encoding type); + virtual void BFI(const u32 data, const ARMv7_encoding type); + + virtual void BIC_IMM(const u32 data, const ARMv7_encoding type); + virtual void BIC_REG(const u32 data, const ARMv7_encoding type); + virtual void BIC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void BKPT(const u32 data, const ARMv7_encoding type); + + virtual void BL(const u32 data, const ARMv7_encoding type); + virtual void BLX(const u32 data, const ARMv7_encoding type); + virtual void BX(const u32 data, const ARMv7_encoding type); + + virtual void CB_Z(const u32 data, const ARMv7_encoding type); + + virtual void CLZ(const u32 data, const ARMv7_encoding type); + + virtual void CMN_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMN_REG(const u32 data, const ARMv7_encoding type); + virtual void CMN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void CMP_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMP_REG(const u32 data, const ARMv7_encoding type); + virtual void CMP_RSR(const u32 data, const ARMv7_encoding type); + + virtual void EOR_IMM(const u32 data, const ARMv7_encoding type); + virtual void EOR_REG(const u32 data, const ARMv7_encoding type); + virtual void EOR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void IT(const u32 data, const ARMv7_encoding type); + + virtual void LDM(const u32 data, const ARMv7_encoding type); + virtual void LDMDA(const u32 data, const ARMv7_encoding type); + virtual void LDMDB(const u32 data, const ARMv7_encoding type); + virtual void LDMIB(const u32 data, const ARMv7_encoding type); + + virtual void LDR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDR_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDR_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRD_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSL_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSL_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MLA(const u32 data, const ARMv7_encoding type); + virtual void MLS(const u32 data, const ARMv7_encoding type); + + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type); + virtual void MOV_REG(const u32 data, const ARMv7_encoding type); + virtual void MOVT(const u32 data, const ARMv7_encoding type); + + virtual void MRS(const u32 data, const ARMv7_encoding type); + virtual void MSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void MSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MUL(const u32 data, const ARMv7_encoding type); + + virtual void MVN_IMM(const u32 data, const ARMv7_encoding type); + virtual void MVN_REG(const u32 data, const ARMv7_encoding type); + virtual void MVN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void NOP(const u32 data, const ARMv7_encoding type); + + virtual void ORN_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORN_REG(const u32 data, const ARMv7_encoding type); + + virtual void ORR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORR_REG(const u32 data, const ARMv7_encoding type); + virtual void ORR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void PKH(const u32 data, const ARMv7_encoding type); + + virtual void POP(const u32 data, const ARMv7_encoding type); + virtual void PUSH(const u32 data, const ARMv7_encoding type); + + virtual void QADD(const u32 data, const ARMv7_encoding type); + virtual void QADD16(const u32 data, const ARMv7_encoding type); + virtual void QADD8(const u32 data, const ARMv7_encoding type); + virtual void QASX(const u32 data, const ARMv7_encoding type); + virtual void QDADD(const u32 data, const ARMv7_encoding type); + virtual void QDSUB(const u32 data, const ARMv7_encoding type); + virtual void QSAX(const u32 data, const ARMv7_encoding type); + virtual void QSUB(const u32 data, const ARMv7_encoding type); + virtual void QSUB16(const u32 data, const ARMv7_encoding type); + virtual void QSUB8(const u32 data, const ARMv7_encoding type); + + virtual void RBIT(const u32 data, const ARMv7_encoding type); + virtual void REV(const u32 data, const ARMv7_encoding type); + virtual void REV16(const u32 data, const ARMv7_encoding type); + virtual void REVSH(const u32 data, const ARMv7_encoding type); + + virtual void ROR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ROR_REG(const u32 data, const ARMv7_encoding type); + + virtual void RRX(const u32 data, const ARMv7_encoding type); + + virtual void RSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSB_REG(const u32 data, const ARMv7_encoding type); + virtual void RSB_RSR(const u32 data, const ARMv7_encoding type); + + virtual void RSC_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSC_REG(const u32 data, const ARMv7_encoding type); + virtual void RSC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SADD16(const u32 data, const ARMv7_encoding type); + virtual void SADD8(const u32 data, const ARMv7_encoding type); + virtual void SASX(const u32 data, const ARMv7_encoding type); + + virtual void SBC_IMM(const u32 data, const ARMv7_encoding type); + virtual void SBC_REG(const u32 data, const ARMv7_encoding type); + virtual void SBC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SBFX(const u32 data, const ARMv7_encoding type); + + virtual void SDIV(const u32 data, const ARMv7_encoding type); + + virtual void SEL(const u32 data, const ARMv7_encoding type); + + virtual void SHADD16(const u32 data, const ARMv7_encoding type); + virtual void SHADD8(const u32 data, const ARMv7_encoding type); + virtual void SHASX(const u32 data, const ARMv7_encoding type); + virtual void SHSAX(const u32 data, const ARMv7_encoding type); + virtual void SHSUB16(const u32 data, const ARMv7_encoding type); + virtual void SHSUB8(const u32 data, const ARMv7_encoding type); + + virtual void SMLA__(const u32 data, const ARMv7_encoding type); + virtual void SMLAD(const u32 data, const ARMv7_encoding type); + virtual void SMLAL(const u32 data, const ARMv7_encoding type); + virtual void SMLAL__(const u32 data, const ARMv7_encoding type); + virtual void SMLALD(const u32 data, const ARMv7_encoding type); + virtual void SMLAW_(const u32 data, const ARMv7_encoding type); + virtual void SMLSD(const u32 data, const ARMv7_encoding type); + virtual void SMLSLD(const u32 data, const ARMv7_encoding type); + virtual void SMMLA(const u32 data, const ARMv7_encoding type); + virtual void SMMLS(const u32 data, const ARMv7_encoding type); + virtual void SMMUL(const u32 data, const ARMv7_encoding type); + virtual void SMUAD(const u32 data, const ARMv7_encoding type); + virtual void SMUL__(const u32 data, const ARMv7_encoding type); + virtual void SMULL(const u32 data, const ARMv7_encoding type); + virtual void SMULW_(const u32 data, const ARMv7_encoding type); + virtual void SMUSD(const u32 data, const ARMv7_encoding type); + + virtual void SSAT(const u32 data, const ARMv7_encoding type); + virtual void SSAT16(const u32 data, const ARMv7_encoding type); + virtual void SSAX(const u32 data, const ARMv7_encoding type); + virtual void SSUB16(const u32 data, const ARMv7_encoding type); + virtual void SSUB8(const u32 data, const ARMv7_encoding type); + + virtual void STM(const u32 data, const ARMv7_encoding type); + virtual void STMDA(const u32 data, const ARMv7_encoding type); + virtual void STMDB(const u32 data, const ARMv7_encoding type); + virtual void STMIB(const u32 data, const ARMv7_encoding type); + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type); + virtual void STR_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRH_REG(const u32 data, const ARMv7_encoding type); + + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type); + virtual void SUB_REG(const u32 data, const ARMv7_encoding type); + virtual void SUB_RSR(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPI(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPR(const u32 data, const ARMv7_encoding type); + + virtual void SVC(const u32 data, const ARMv7_encoding type); + + virtual void SXTAB(const u32 data, const ARMv7_encoding type); + virtual void SXTAB16(const u32 data, const ARMv7_encoding type); + virtual void SXTAH(const u32 data, const ARMv7_encoding type); + virtual void SXTB(const u32 data, const ARMv7_encoding type); + virtual void SXTB16(const u32 data, const ARMv7_encoding type); + virtual void SXTH(const u32 data, const ARMv7_encoding type); + + virtual void TB_(const u32 data, const ARMv7_encoding type); + + virtual void TEQ_IMM(const u32 data, const ARMv7_encoding type); + virtual void TEQ_REG(const u32 data, const ARMv7_encoding type); + virtual void TEQ_RSR(const u32 data, const ARMv7_encoding type); + + virtual void TST_IMM(const u32 data, const ARMv7_encoding type); + virtual void TST_REG(const u32 data, const ARMv7_encoding type); + virtual void TST_RSR(const u32 data, const ARMv7_encoding type); + + virtual void UADD16(const u32 data, const ARMv7_encoding type); + virtual void UADD8(const u32 data, const ARMv7_encoding type); + virtual void UASX(const u32 data, const ARMv7_encoding type); + virtual void UBFX(const u32 data, const ARMv7_encoding type); + virtual void UDIV(const u32 data, const ARMv7_encoding type); + virtual void UHADD16(const u32 data, const ARMv7_encoding type); + virtual void UHADD8(const u32 data, const ARMv7_encoding type); + virtual void UHASX(const u32 data, const ARMv7_encoding type); + virtual void UHSAX(const u32 data, const ARMv7_encoding type); + virtual void UHSUB16(const u32 data, const ARMv7_encoding type); + virtual void UHSUB8(const u32 data, const ARMv7_encoding type); + virtual void UMAAL(const u32 data, const ARMv7_encoding type); + virtual void UMLAL(const u32 data, const ARMv7_encoding type); + virtual void UMULL(const u32 data, const ARMv7_encoding type); + virtual void UQADD16(const u32 data, const ARMv7_encoding type); + virtual void UQADD8(const u32 data, const ARMv7_encoding type); + virtual void UQASX(const u32 data, const ARMv7_encoding type); + virtual void UQSAX(const u32 data, const ARMv7_encoding type); + virtual void UQSUB16(const u32 data, const ARMv7_encoding type); + virtual void UQSUB8(const u32 data, const ARMv7_encoding type); + virtual void USAD8(const u32 data, const ARMv7_encoding type); + virtual void USADA8(const u32 data, const ARMv7_encoding type); + virtual void USAT(const u32 data, const ARMv7_encoding type); + virtual void USAT16(const u32 data, const ARMv7_encoding type); + virtual void USAX(const u32 data, const ARMv7_encoding type); + virtual void USUB16(const u32 data, const ARMv7_encoding type); + virtual void USUB8(const u32 data, const ARMv7_encoding type); + virtual void UXTAB(const u32 data, const ARMv7_encoding type); + virtual void UXTAB16(const u32 data, const ARMv7_encoding type); + virtual void UXTAH(const u32 data, const ARMv7_encoding type); + virtual void UXTB(const u32 data, const ARMv7_encoding type); + virtual void UXTB16(const u32 data, const ARMv7_encoding type); + virtual void UXTH(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp new file mode 100644 index 0000000000..0e4f3a55e8 --- /dev/null +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.cpp @@ -0,0 +1,2765 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/CPU/CPUDecoder.h" +#include "ARMv7Thread.h" +#include "PSVFuncList.h" +#include "ARMv7Interpreter.h" + +void ARMv7Interpreter::UNK(const u32 data) +{ + LOG_ERROR(HLE, "Unknown/illegal opcode! (0x%04x : 0x%04x)", data >> 16, data & 0xffff); + Emu.Pause(); +} + +void ARMv7Interpreter::NULL_OP(const u32 data, const ARMv7_encoding type) +{ + LOG_ERROR(HLE, "Null opcode found"); + Emu.Pause(); +} + +void ARMv7Interpreter::HACK(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 code = 0; + + switch (type) + { + case T1: + { + code = data & 0xffff; + break; + } + case A1: + { + cond = data >> 28; + code = (data & 0xfff00) >> 4 | (data & 0xf); + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + execute_psv_func_by_index(CPU, code); + } +} + +void ARMv7Interpreter::ADC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ADD_IMM(const u32 data, const ARMv7_encoding type) +{ + bool set_flags = !CPU.ITSTATE; + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 n = 0; + u32 imm32 = 0; + + switch (type) + { + case T1: + { + d = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x1c0) >> 6; + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + if (set_flags) + { + bool carry, overflow; + const u32 res = AddWithCarry(CPU.read_gpr(n), imm32, false, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.read_gpr(n) + imm32); + } + } +} + +void ARMv7Interpreter::ADD_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_SPI(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ADD_SPR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ADR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::AND_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::AND_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::AND_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ASR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ASR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::B(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 jump = 0; // jump = instr_size + imm32 ??? + + switch (type) + { + case T1: + { + cond = (data >> 8) & 0xf; + if (cond == 0xf) + { + throw "SVC"; + } + + jump = 4 + sign<9, u32>((data & 0xff) << 1); + break; + } + case T2: + { + jump = 4 + sign<12, u32>((data & 0x7ff) << 1); + break; + } + case T3: + { + cond = (data >> 6) & 0xf; + if (cond >= 0xe) + { + throw "B_T3: Related encodings"; + } + + u32 s = (data >> 26) & 0x1; + u32 j1 = (data >> 13) & 0x1; + u32 j2 = (data >> 11) & 0x1; + jump = 4 + sign<21, u32>(s << 20 | j2 << 19 | j1 << 18 | (data & 0x3f0000) >> 4 | (data & 0x7ff) << 1); + break; + } + case T4: + { + u32 s = (data >> 26) & 0x1; + u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; + u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; + jump = 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + break; + } + case A1: + { + cond = data >> 28; + jump = 1 + 4 + sign<26, u32>((data & 0xffffff) << 2); + break; + } + } + + if (ConditionPassed(cond)) + { + CPU.SetBranch(CPU.PC + jump); + } +} + + +void ARMv7Interpreter::BFC(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::BFI(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::BIC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::BIC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::BIC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::BKPT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::BL(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 newLR = CPU.PC; + u32 imm32 = 0; + + switch (type) + { + case T1: + { + u32 s = (data >> 26) & 0x1; + u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; + u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; + imm32 = 4 + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + newLR = (CPU.PC + 4) | 1; + break; + } + case A1: + { + cond = data >> 28; + imm32 = 4 + sign<26, u32>((data & 0xffffff) << 2); + newLR = (CPU.PC + 4) - 4; + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + CPU.LR = newLR; + CPU.SetBranch(CPU.PC + imm32); + } +} + +void ARMv7Interpreter::BLX(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 newLR = CPU.PC; + u32 target = 0; + + switch (type) + { + case T1: + { + target = CPU.read_gpr((data >> 3) & 0xf); + newLR = (CPU.PC + 2) | 1; // ??? + break; + } + case T2: + { + u32 s = (data >> 26) & 0x1; + u32 i1 = (data >> 13) & 0x1 ^ s ^ 1; + u32 i2 = (data >> 11) & 0x1 ^ s ^ 1; + target = (CPU.PC + 4 & ~3) + sign<25, u32>(s << 24 | i2 << 23 | i1 << 22 | (data & 0x3ff0000) >> 4 | (data & 0x7ff) << 1); + newLR = (CPU.PC + 4) | 1; + break; + } + case A1: + { + cond = data >> 28; + target = CPU.read_gpr(data & 0xf); + newLR = (CPU.PC + 4) - 4; + break; + } + case A2: + { + target = (CPU.PC + 4 | 1) + sign<25, u32>((data & 0xffffff) << 2 | (data & 0x1000000) >> 23); + newLR = (CPU.PC + 4) - 4; + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + CPU.LR = newLR; + if (target & 1) + { + CPU.ISET = Thumb; + CPU.SetBranch(target & ~1); + } + else + { + CPU.ISET = ARM; + CPU.SetBranch(target); + } + } +} + +void ARMv7Interpreter::BX(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 target = 0; + + switch (type) + { + case T1: + { + target = CPU.read_gpr((data >> 3) & 0xf); + break; + } + case A1: + { + cond = data >> 28; + target = CPU.read_gpr(data & 0xf); + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + if (target & 1) + { + CPU.ISET = Thumb; + CPU.SetBranch(target & ~1); + } + else + { + CPU.ISET = ARM; + CPU.SetBranch(target); + } + } +} + + +void ARMv7Interpreter::CB_Z(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case T1: break; + default: throw __FUNCTION__; + } + + if ((CPU.read_gpr(data & 0x7) == 0) ^ ((data & 0x800) != 0)) + { + CPU.SetBranch(CPU.PC + 2 + ((data & 0xf8) >> 2) + ((data & 0x200) >> 3)); + } +} + + +void ARMv7Interpreter::CLZ(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::CMN_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::CMN_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::CMN_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::CMP_IMM(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 n = 0; + u32 imm32 = 0; + + switch (type) + { + case T1: + { + n = (data & 0x700) >> 8; + imm32 = (data & 0xff); + break; + } + case T2: + { + n = (data & 0xf0000) >> 16; + imm32 = ThumbExpandImm((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff)); + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + bool carry, overflow; + const u32 res = AddWithCarry(CPU.read_gpr(n), ~imm32, true, carry, overflow); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } +} + +void ARMv7Interpreter::CMP_REG(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 n = 0; + u32 m = 0; + auto shift_t = SRType_LSL; + u32 shift_n = 0; + + switch (type) + { + case T1: + { + n = (data & 0x7); + m = (data & 0x38) >> 3; + break; + } + case T2: + { + n = (data & 0x80) >> 4 | (data & 0x7); + m = (data & 0x78) >> 3; + break; + } + case T3: + { + n = (data & 0xf0000) >> 16; + m = (data & 0xf); + shift_t = DecodeImmShift((data & 0x30) >> 4, (data & 0x7000) >> 10 | (data & 0xc0) >> 6, &shift_n); + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + bool carry, overflow; + const u32 shifted = Shift(CPU.read_gpr(m), shift_t, shift_n, true); + const u32 res = AddWithCarry(CPU.read_gpr(n), ~shifted, true, carry, overflow); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } +} + +void ARMv7Interpreter::CMP_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::EOR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::EOR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::EOR_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::IT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case T1: + { + if ((data & 0xf) == 0) + { + throw "IT_T1: Related encodings"; + } + + CPU.ITSTATE.IT = data & 0xff; + return; + } + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDMDA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDMDB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDMIB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDR_IMM(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 t = 0; + u32 n = 13; + u32 imm32 = 0; + bool index = true; + bool add = true; + bool wback = false; + + switch (type) + { + case T1: + { + t = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x7c0) >> 4; + break; + } + case T2: + { + t = (data & 0x700) >> 8; + imm32 = (data & 0xff) << 2; + break; + } + case T3: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xfff); + + if (n == 15) + { + throw "LDR (literal)"; + } + break; + } + case T4: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xff); + index = (data & 0x400); + add = (data & 0x200); + wback = (data & 0x100); + + if (n == 15) + { + throw "LDR (literal)"; + } + if (index && add && !wback) + { + throw "LDRT"; + } + if (n == 13 && !index && add && wback && imm32 == 4) + { + throw "POP"; + } + if (!index && !wback) + { + throw "LDR_IMM_T4: undefined"; + } + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + const u32 offset_addr = add ? CPU.read_gpr(n) + imm32 : CPU.read_gpr(n) - imm32; + const u32 addr = index ? offset_addr : CPU.read_gpr(n); + + if (wback) + { + CPU.write_gpr(n, offset_addr); + } + + CPU.write_gpr(t, vm::psv::read32(addr)); + } +} + +void ARMv7Interpreter::LDR_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRB_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRD_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRD_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRD_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRH_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRH_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRH_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRSB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSB_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LDRSH_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSH_LIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LDRSH_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LSL_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LSL_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::LSR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::LSR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::MLA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MLS(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::MOV_IMM(const u32 data, const ARMv7_encoding type) +{ + bool set_flags = !CPU.ITSTATE; + bool carry = CPU.APSR.C; + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 imm32 = 0; + + switch (type) + { + case T1: + { + d = (data >> 8) & 0x7; + imm32 = sign<8, u32>(data & 0xff); + break; + } + case T2: + { + set_flags = data & 0x100000; + d = (data >> 8) & 0xf; + imm32 = ThumbExpandImm_C((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff), carry, carry); + break; + } + case T3: + { + set_flags = false; + d = (data >> 8) & 0xf; + imm32 = (data & 0xf0000) >> 4 | (data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff); + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + CPU.write_gpr(d, imm32); + if (set_flags) + { + CPU.APSR.N = imm32 >> 31; + CPU.APSR.Z = imm32 == 0; + CPU.APSR.C = carry; + } + } +} + +void ARMv7Interpreter::MOV_REG(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 m = 0; + bool set_flags = false; + + switch (type) + { + case T1: + { + d = (data & 0x80) >> 4 | (data & 0x7); + m = (data & 0x78) >> 3; + break; + } + case T2: + { + d = (data & 0x7); + m = (data & 0x38) >> 3; + set_flags = true; + break; + } + case T3: + { + d = (data & 0xf00) >> 8; + m = (data & 0xf); + set_flags = (data & 0x100000); + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + const u32 res = CPU.read_gpr(m); + CPU.write_gpr(d, res); + if (set_flags) + { + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + //CPU.APSR.C = ? + } + } +} + +void ARMv7Interpreter::MOVT(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 imm16 = 0; + + switch (type) + { + case T1: + { + d = (data & 0xf00) >> 8; + imm16 = (data & 0xf0000) >> 4 | (data & 0x4000000) >> 14 | (data & 0x7000) >> 4 | (data & 0xff); + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + CPU.write_gpr(d, (CPU.read_gpr(d) & 0xffff) | (imm16 << 16)); + } +} + + +void ARMv7Interpreter::MRS(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MSR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MSR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::MUL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::MVN_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MVN_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::MVN_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::NOP(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + + switch (type) + { + case T1: + { + break; + } + case T2: + { + break; + } + case A1: + { + cond = data >> 28; + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + } +} + + +void ARMv7Interpreter::ORN_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ORN_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ORR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ORR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ORR_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::PKH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::POP(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u16 reg_list = 0; + + switch (type) + { + case T1: + { + reg_list = ((data & 0x100) << 7) | (data & 0xff); + break; + } + case T2: + { + reg_list = data & 0xdfff; + break; + } + case T3: + { + reg_list = 1 << (data >> 12); + break; + } + case A1: + { + cond = data >> 28; + reg_list = data & 0xffff; + if (BitCount(reg_list) < 2) + { + throw "LDM / LDMIA / LDMFD"; + } + break; + } + case A2: + { + cond = data >> 28; + reg_list = 1 << ((data >> 12) & 0xf); + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + for (u16 mask = 1, i = 0; mask; mask <<= 1, i++) + { + if (reg_list & mask) + { + CPU.write_gpr(i, vm::psv::read32(CPU.SP)); + CPU.SP += 4; + } + } + } +} + +void ARMv7Interpreter::PUSH(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u16 reg_list = 0; + + switch (type) + { + case T1: + { + reg_list = ((data & 0x100) << 6) | (data & 0xff); + break; + } + case T2: + { + reg_list = data & 0x5fff; + break; + } + case T3: + { + reg_list = 1 << (data >> 12); + break; + } + case A1: + { + cond = data >> 28; + reg_list = data & 0xffff; + if (BitCount(reg_list) < 2) + { + throw "STMDB / STMFD"; + } + break; + } + case A2: + { + cond = data >> 28; + reg_list = 1 << ((data >> 12) & 0xf); + break; + } + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + for (u16 mask = 1 << 15, i = 15; mask; mask >>= 1, i--) + { + if (reg_list & mask) + { + CPU.SP -= 4; + vm::psv::write32(CPU.SP, CPU.read_gpr(i)); + } + } + } +} + + +void ARMv7Interpreter::QADD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QDADD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QDSUB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSUB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::QSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RBIT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::REV(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::REV16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::REVSH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::ROR_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::ROR_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RRX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RSB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSB_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::RSC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::RSC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SBC_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SBC_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SBC_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SBFX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SDIV(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SEL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SHADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SHSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SMLA__(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAL__(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLALD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLAW_(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLSD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMLSLD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMMLA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMMLS(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMMUL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMUAD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMUL__(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMULL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMULW_(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SMUSD(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SSAT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSAT16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STMDA(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STMDB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STMIB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STR_IMM(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 t = 16; + u32 n = 13; + u32 imm32 = 0; + bool index = true; + bool add = true; + bool wback = false; + + switch (type) + { + case T1: + { + t = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x7c0) >> 4; + break; + } + case T2: + { + t = (data & 0x700) >> 8; + imm32 = (data & 0xff) << 2; + break; + } + case T3: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xfff); + + if (n == 0xf) + { + throw "STR_IMM_T3: undefined"; + } + break; + } + case T4: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + imm32 = (data & 0xff); + index = (data & 0x400); + add = (data & 0x200); + wback = (data & 0x100); + + if (index && add && !wback) + { + throw "STRT"; + } + if (n == 13 && index && !add && wback && imm32 == 4) + { + throw "PUSH"; + } + if (n == 15 || (!index && !wback)) + { + throw "STR_IMM_T4: undefined"; + } + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + const u32 offset_addr = add ? CPU.read_gpr(n) + imm32 : CPU.read_gpr(n) - imm32; + const u32 addr = index ? offset_addr : CPU.read_gpr(n); + + vm::psv::write32(addr, CPU.read_gpr(t)); + + if (wback) + { + CPU.write_gpr(n, offset_addr); + } + } +} + +void ARMv7Interpreter::STR_REG(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 t = 0; + u32 n = 0; + u32 m = 0; + bool index = true; + bool add = true; + bool wback = false; + auto shift_t = SRType_LSL; + u32 shift_n = 0; + + switch (type) + { + case T1: + { + t = (data & 0x7); + n = (data & 0x38) >> 3; + m = (data & 0x1c0) >> 6; + break; + } + case T2: + { + t = (data & 0xf000) >> 12; + n = (data & 0xf0000) >> 16; + m = (data & 0xf); + shift_n = (data & 0x30) >> 4; + + if (n == 15) + { + throw "STR_REG_T2: undefined"; + } + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + const u32 offset = Shift(CPU.read_gpr(m), shift_t, shift_n, CPU.APSR.C); + const u32 offset_addr = add ? CPU.read_gpr(n) + offset : CPU.read_gpr(n) - offset; + const u32 addr = index ? offset_addr : CPU.read_gpr(n); + + vm::psv::write32(addr, CPU.read_gpr(t)); + + if (wback) + { + CPU.write_gpr(n, offset_addr); + } + } +} + + +void ARMv7Interpreter::STRB_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STRB_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STRD_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STRD_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::STRH_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::STRH_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SUB_IMM(const u32 data, const ARMv7_encoding type) +{ + bool set_flags = !CPU.ITSTATE; + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 n = 0; + u32 imm32 = 0; + + switch (type) + { + case T1: + { + d = (data & 0x7); + n = (data & 0x38) >> 3; + imm32 = (data & 0x1c) >> 6; + break; + } + case T2: + { + d = n = (data & 0x700) >> 8; + imm32 = (data & 0xff); + break; + } + case T3: + { + d = (data & 0xf00) >> 8; + n = (data & 0xf0000) >> 16; + set_flags = (data & 0x100000); + imm32 = ThumbExpandImm((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff)); + + if (d == 15 && set_flags) + { + throw "CMP (immediate)"; + } + if (n == 13) + { + throw "SUB (SP minus immediate)"; + } + break; + } + case T4: + { + d = (data & 0xf00) >> 8; + n = (data & 0xf0000) >> 16; + set_flags = false; + imm32 = (data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff); + + if (d == 15) + { + throw "ADR"; + } + if (n == 13) + { + throw "SUB (SP minus immediate)"; + } + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + if (set_flags) + { + bool carry, overflow; + const u32 res = AddWithCarry(CPU.read_gpr(n), ~imm32, true, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.read_gpr(n) - imm32); + } + } +} + +void ARMv7Interpreter::SUB_REG(const u32 data, const ARMv7_encoding type) +{ + bool set_flags = !CPU.ITSTATE; + u32 cond = CPU.ITSTATE.advance(); + u32 d = 0; + u32 n = 0; + u32 m = 0; + auto shift_t = SRType_LSL; + u32 shift_n = 0; + + switch (type) + { + case T1: + { + d = (data & 0x7); + n = (data & 0x38) >> 3; + m = (data & 0x1c0) >> 6; + break; + } + case T2: + { + d = (data & 0xf00) >> 8; + n = (data & 0xf0000) >> 16; + m = (data & 0xf); + set_flags = (data & 0x100000); + shift_t = DecodeImmShift((data & 0x30) >> 4, (data & 0x7000) >> 10 | (data & 0xc0) >> 6, &shift_n); + + if (d == 15 && set_flags) + { + throw "CMP (register)"; + } + if (n == 13) + { + throw "SUB (SP minus register)"; + } + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + const u32 shifted = Shift(CPU.read_gpr(m), shift_t, shift_n, CPU.APSR.C); + if (set_flags) + { + bool carry, overflow; + const u32 res = AddWithCarry(CPU.read_gpr(n), ~shifted, true, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.read_gpr(n) - shifted); + } + } +} + +void ARMv7Interpreter::SUB_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SUB_SPI(const u32 data, const ARMv7_encoding type) +{ + u32 cond = CPU.ITSTATE.advance(); + u32 d = 13; + bool set_flags = false; + u32 imm32 = 0; + + switch (type) + { + case T1: + { + imm32 = (data & 0x7f) << 2; + break; + } + case T2: + { + d = (data & 0xf00) >> 8; + set_flags = (data & 0x100000); + imm32 = ThumbExpandImm((data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff)); + + if (d == 15 && set_flags) + { + throw "CMP (immediate)"; + } + break; + } + case T3: + { + d = (data & 0xf00) >> 8; + set_flags = false; + imm32 = (data & 0x4000000) >> 15 | (data & 0x7000) >> 4 | (data & 0xff); + break; + } + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } + + if (ConditionPassed(cond)) + { + if (set_flags) + { + bool carry, overflow; + const u32 res = AddWithCarry(CPU.SP, ~imm32, true, carry, overflow); + CPU.write_gpr(d, res); + CPU.APSR.N = res >> 31; + CPU.APSR.Z = res == 0; + CPU.APSR.C = carry; + CPU.APSR.V = overflow; + } + else + { + CPU.write_gpr(d, CPU.SP - imm32); + } + } +} + +void ARMv7Interpreter::SUB_SPR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SVC(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::SXTAB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTAB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTAH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::SXTH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::TB_(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::TEQ_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TEQ_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TEQ_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::TST_IMM(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TST_REG(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::TST_RSR(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + + +void ARMv7Interpreter::UADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UBFX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UDIV(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UHSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UMAAL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UMLAL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UMULL(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQADD16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQADD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQASX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQSAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQSUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UQSUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAD8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USADA8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAT(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAT16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USAX(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USUB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::USUB8(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTAB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTAB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTAH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTB(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTB16(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} + +void ARMv7Interpreter::UXTH(const u32 data, const ARMv7_encoding type) +{ + switch (type) + { + case A1: throw __FUNCTION__; + default: throw __FUNCTION__; + } +} diff --git a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h index eaac69aafa..e9678fe245 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Interpreter.h +++ b/rpcs3/Emu/ARMv7/ARMv7Interpreter.h @@ -10,7 +10,7 @@ public: { } - enum SRType + enum SRType : u32 { SRType_None, SRType_LSL, @@ -93,7 +93,7 @@ public: return len - 1 - HighestSetBit(x, len); } - SRType DecodeImmShift(u8 type, u8 imm5, uint* shift_n) + SRType DecodeImmShift(u32 type, u32 imm5, u32* shift_n) { SRType shift_t = SRType_None; @@ -217,7 +217,7 @@ public: return value; } - template T Shift(T value, SRType type, uint amount, bool carry_in) + template T Shift(T value, SRType type, u32 amount, bool carry_in) { bool carry_out; return Shift_C(value, type, amount, carry_in, carry_out); @@ -225,15 +225,50 @@ public: template T AddWithCarry(T x, T y, bool carry_in, bool& carry_out, bool& overflow) { - uint unsigned_sum = (uint)x + (uint)y + (uint)carry_in; - int signed_sum = (int)x + (int)y + (int)carry_in; - T result = unsigned_sum & ~(T(1) << (sizeof(T) - 1)); - carry_out = (uint)result != unsigned_sum; - overflow = (int)result != signed_sum; + const T sign_mask = (T)1 << (sizeof(T) - 1); + + T result = x + y; + carry_out = ((x & y) | ((x ^ y) & ~result)) & sign_mask; + overflow = (x ^ result) & (y ^ result) & sign_mask; + if (carry_in) + { + result += 1; + carry_out ^= (result == 0); + overflow ^= (result == sign_mask); + } return result; } - bool ConditionPassed(u8 cond) const + u32 ThumbExpandImm_C(u32 imm12, bool carry_in, bool& carry_out) + { + if ((imm12 & 0xc00) >> 10) + { + u32 unrotated_value = (imm12 & 0x7f) | 0x80; + + return ROR_C(unrotated_value, (imm12 & 0xf80) >> 7, carry_out); + } + else + { + carry_out = carry_in; + + u32 imm8 = imm12 & 0xff; + switch ((imm12 & 0x300) >> 8) + { + case 0: return imm8; + case 1: return imm8 << 16 | imm8; + case 2: return imm8 << 24 | imm8 << 8; + default: return imm8 << 24 | imm8 << 16 | imm8 << 8 | imm8; + } + } + } + + u32 ThumbExpandImm(u32 imm12) + { + bool carry = CPU.APSR.C; + return ThumbExpandImm_C(imm12, carry, carry); + } + + bool ConditionPassed(u32 cond) const { bool result = false; @@ -258,65 +293,276 @@ public: } protected: - void NULL_OP() - { - LOG_ERROR(HLE, "null"); - Emu.Pause(); - } + virtual void UNK(const u32 data); - void NOP() - { - } + virtual void NULL_OP(const u32 data, const ARMv7_encoding type); - void PUSH(u16 regs_list) - { - for(u16 mask=0x1, i=0; mask; mask <<= 1, i++) - { - if(regs_list & mask) - { - CPU.SP -= 4; - vm::psv::write32(CPU.SP, CPU.read_gpr(i)); - } - } - } + virtual void HACK(const u32 data, const ARMv7_encoding type); - void POP(u16 regs_list) - { - for(u16 mask=(0x1 << 15), i=15; mask; mask >>= 1, i--) - { - if(regs_list & mask) - { - CPU.write_gpr(i, vm::psv::read32(CPU.SP)); - CPU.SP += 4; - } - } - } + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADC_REG(const u32 data, const ARMv7_encoding type); + virtual void ADC_RSR(const u32 data, const ARMv7_encoding type); - void B(u8 cond, u32 imm, u8 intstr_size) - { - if(ConditionPassed(cond)) - { - CPU.SetBranch(CPU.PC + intstr_size + imm); - } - } + virtual void ADD_IMM(const u32 data, const ARMv7_encoding type); + virtual void ADD_REG(const u32 data, const ARMv7_encoding type); + virtual void ADD_RSR(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPI(const u32 data, const ARMv7_encoding type); + virtual void ADD_SPR(const u32 data, const ARMv7_encoding type); - void CBZ(u8 op, u32 imm, u8 rn, u8 intstr_size) - { - if((CPU.GPR[rn] == 0) ^ op) - { - CPU.SetBranch(CPU.PC + intstr_size + imm); - } - } + virtual void ADR(const u32 data, const ARMv7_encoding type); - void BL(u32 imm, u8 intstr_size) - { - CPU.LR = (CPU.PC + intstr_size) | 1; - CPU.SetBranch(CPU.PC + intstr_size + imm); - } + virtual void AND_IMM(const u32 data, const ARMv7_encoding type); + virtual void AND_REG(const u32 data, const ARMv7_encoding type); + virtual void AND_RSR(const u32 data, const ARMv7_encoding type); - void UNK(const u16 code0, const u16 code1) - { - LOG_ERROR(HLE, "Unknown/Illegal opcode! (0x%04x : 0x%04x)", code0, code1); - Emu.Pause(); - } + virtual void ASR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ASR_REG(const u32 data, const ARMv7_encoding type); + + virtual void B(const u32 data, const ARMv7_encoding type); + + virtual void BFC(const u32 data, const ARMv7_encoding type); + virtual void BFI(const u32 data, const ARMv7_encoding type); + + virtual void BIC_IMM(const u32 data, const ARMv7_encoding type); + virtual void BIC_REG(const u32 data, const ARMv7_encoding type); + virtual void BIC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void BKPT(const u32 data, const ARMv7_encoding type); + + virtual void BL(const u32 data, const ARMv7_encoding type); + virtual void BLX(const u32 data, const ARMv7_encoding type); + virtual void BX(const u32 data, const ARMv7_encoding type); + + virtual void CB_Z(const u32 data, const ARMv7_encoding type); + + virtual void CLZ(const u32 data, const ARMv7_encoding type); + + virtual void CMN_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMN_REG(const u32 data, const ARMv7_encoding type); + virtual void CMN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void CMP_IMM(const u32 data, const ARMv7_encoding type); + virtual void CMP_REG(const u32 data, const ARMv7_encoding type); + virtual void CMP_RSR(const u32 data, const ARMv7_encoding type); + + virtual void EOR_IMM(const u32 data, const ARMv7_encoding type); + virtual void EOR_REG(const u32 data, const ARMv7_encoding type); + virtual void EOR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void IT(const u32 data, const ARMv7_encoding type); + + virtual void LDM(const u32 data, const ARMv7_encoding type); + virtual void LDMDA(const u32 data, const ARMv7_encoding type); + virtual void LDMDB(const u32 data, const ARMv7_encoding type); + virtual void LDMIB(const u32 data, const ARMv7_encoding type); + + virtual void LDR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDR_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDR_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRD_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSB_REG(const u32 data, const ARMv7_encoding type); + + virtual void LDRSH_IMM(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_LIT(const u32 data, const ARMv7_encoding type); + virtual void LDRSH_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSL_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSL_REG(const u32 data, const ARMv7_encoding type); + + virtual void LSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void LSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MLA(const u32 data, const ARMv7_encoding type); + virtual void MLS(const u32 data, const ARMv7_encoding type); + + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type); + virtual void MOV_REG(const u32 data, const ARMv7_encoding type); + virtual void MOVT(const u32 data, const ARMv7_encoding type); + + virtual void MRS(const u32 data, const ARMv7_encoding type); + virtual void MSR_IMM(const u32 data, const ARMv7_encoding type); + virtual void MSR_REG(const u32 data, const ARMv7_encoding type); + + virtual void MUL(const u32 data, const ARMv7_encoding type); + + virtual void MVN_IMM(const u32 data, const ARMv7_encoding type); + virtual void MVN_REG(const u32 data, const ARMv7_encoding type); + virtual void MVN_RSR(const u32 data, const ARMv7_encoding type); + + virtual void NOP(const u32 data, const ARMv7_encoding type); + + virtual void ORN_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORN_REG(const u32 data, const ARMv7_encoding type); + + virtual void ORR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ORR_REG(const u32 data, const ARMv7_encoding type); + virtual void ORR_RSR(const u32 data, const ARMv7_encoding type); + + virtual void PKH(const u32 data, const ARMv7_encoding type); + + virtual void POP(const u32 data, const ARMv7_encoding type); + virtual void PUSH(const u32 data, const ARMv7_encoding type); + + virtual void QADD(const u32 data, const ARMv7_encoding type); + virtual void QADD16(const u32 data, const ARMv7_encoding type); + virtual void QADD8(const u32 data, const ARMv7_encoding type); + virtual void QASX(const u32 data, const ARMv7_encoding type); + virtual void QDADD(const u32 data, const ARMv7_encoding type); + virtual void QDSUB(const u32 data, const ARMv7_encoding type); + virtual void QSAX(const u32 data, const ARMv7_encoding type); + virtual void QSUB(const u32 data, const ARMv7_encoding type); + virtual void QSUB16(const u32 data, const ARMv7_encoding type); + virtual void QSUB8(const u32 data, const ARMv7_encoding type); + + virtual void RBIT(const u32 data, const ARMv7_encoding type); + virtual void REV(const u32 data, const ARMv7_encoding type); + virtual void REV16(const u32 data, const ARMv7_encoding type); + virtual void REVSH(const u32 data, const ARMv7_encoding type); + + virtual void ROR_IMM(const u32 data, const ARMv7_encoding type); + virtual void ROR_REG(const u32 data, const ARMv7_encoding type); + + virtual void RRX(const u32 data, const ARMv7_encoding type); + + virtual void RSB_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSB_REG(const u32 data, const ARMv7_encoding type); + virtual void RSB_RSR(const u32 data, const ARMv7_encoding type); + + virtual void RSC_IMM(const u32 data, const ARMv7_encoding type); + virtual void RSC_REG(const u32 data, const ARMv7_encoding type); + virtual void RSC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SADD16(const u32 data, const ARMv7_encoding type); + virtual void SADD8(const u32 data, const ARMv7_encoding type); + virtual void SASX(const u32 data, const ARMv7_encoding type); + + virtual void SBC_IMM(const u32 data, const ARMv7_encoding type); + virtual void SBC_REG(const u32 data, const ARMv7_encoding type); + virtual void SBC_RSR(const u32 data, const ARMv7_encoding type); + + virtual void SBFX(const u32 data, const ARMv7_encoding type); + + virtual void SDIV(const u32 data, const ARMv7_encoding type); + + virtual void SEL(const u32 data, const ARMv7_encoding type); + + virtual void SHADD16(const u32 data, const ARMv7_encoding type); + virtual void SHADD8(const u32 data, const ARMv7_encoding type); + virtual void SHASX(const u32 data, const ARMv7_encoding type); + virtual void SHSAX(const u32 data, const ARMv7_encoding type); + virtual void SHSUB16(const u32 data, const ARMv7_encoding type); + virtual void SHSUB8(const u32 data, const ARMv7_encoding type); + + virtual void SMLA__(const u32 data, const ARMv7_encoding type); + virtual void SMLAD(const u32 data, const ARMv7_encoding type); + virtual void SMLAL(const u32 data, const ARMv7_encoding type); + virtual void SMLAL__(const u32 data, const ARMv7_encoding type); + virtual void SMLALD(const u32 data, const ARMv7_encoding type); + virtual void SMLAW_(const u32 data, const ARMv7_encoding type); + virtual void SMLSD(const u32 data, const ARMv7_encoding type); + virtual void SMLSLD(const u32 data, const ARMv7_encoding type); + virtual void SMMLA(const u32 data, const ARMv7_encoding type); + virtual void SMMLS(const u32 data, const ARMv7_encoding type); + virtual void SMMUL(const u32 data, const ARMv7_encoding type); + virtual void SMUAD(const u32 data, const ARMv7_encoding type); + virtual void SMUL__(const u32 data, const ARMv7_encoding type); + virtual void SMULL(const u32 data, const ARMv7_encoding type); + virtual void SMULW_(const u32 data, const ARMv7_encoding type); + virtual void SMUSD(const u32 data, const ARMv7_encoding type); + + virtual void SSAT(const u32 data, const ARMv7_encoding type); + virtual void SSAT16(const u32 data, const ARMv7_encoding type); + virtual void SSAX(const u32 data, const ARMv7_encoding type); + virtual void SSUB16(const u32 data, const ARMv7_encoding type); + virtual void SSUB8(const u32 data, const ARMv7_encoding type); + + virtual void STM(const u32 data, const ARMv7_encoding type); + virtual void STMDA(const u32 data, const ARMv7_encoding type); + virtual void STMDB(const u32 data, const ARMv7_encoding type); + virtual void STMIB(const u32 data, const ARMv7_encoding type); + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type); + virtual void STR_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRB_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRB_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRD_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRD_REG(const u32 data, const ARMv7_encoding type); + + virtual void STRH_IMM(const u32 data, const ARMv7_encoding type); + virtual void STRH_REG(const u32 data, const ARMv7_encoding type); + + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type); + virtual void SUB_REG(const u32 data, const ARMv7_encoding type); + virtual void SUB_RSR(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPI(const u32 data, const ARMv7_encoding type); + virtual void SUB_SPR(const u32 data, const ARMv7_encoding type); + + virtual void SVC(const u32 data, const ARMv7_encoding type); + + virtual void SXTAB(const u32 data, const ARMv7_encoding type); + virtual void SXTAB16(const u32 data, const ARMv7_encoding type); + virtual void SXTAH(const u32 data, const ARMv7_encoding type); + virtual void SXTB(const u32 data, const ARMv7_encoding type); + virtual void SXTB16(const u32 data, const ARMv7_encoding type); + virtual void SXTH(const u32 data, const ARMv7_encoding type); + + virtual void TB_(const u32 data, const ARMv7_encoding type); + + virtual void TEQ_IMM(const u32 data, const ARMv7_encoding type); + virtual void TEQ_REG(const u32 data, const ARMv7_encoding type); + virtual void TEQ_RSR(const u32 data, const ARMv7_encoding type); + + virtual void TST_IMM(const u32 data, const ARMv7_encoding type); + virtual void TST_REG(const u32 data, const ARMv7_encoding type); + virtual void TST_RSR(const u32 data, const ARMv7_encoding type); + + virtual void UADD16(const u32 data, const ARMv7_encoding type); + virtual void UADD8(const u32 data, const ARMv7_encoding type); + virtual void UASX(const u32 data, const ARMv7_encoding type); + virtual void UBFX(const u32 data, const ARMv7_encoding type); + virtual void UDIV(const u32 data, const ARMv7_encoding type); + virtual void UHADD16(const u32 data, const ARMv7_encoding type); + virtual void UHADD8(const u32 data, const ARMv7_encoding type); + virtual void UHASX(const u32 data, const ARMv7_encoding type); + virtual void UHSAX(const u32 data, const ARMv7_encoding type); + virtual void UHSUB16(const u32 data, const ARMv7_encoding type); + virtual void UHSUB8(const u32 data, const ARMv7_encoding type); + virtual void UMAAL(const u32 data, const ARMv7_encoding type); + virtual void UMLAL(const u32 data, const ARMv7_encoding type); + virtual void UMULL(const u32 data, const ARMv7_encoding type); + virtual void UQADD16(const u32 data, const ARMv7_encoding type); + virtual void UQADD8(const u32 data, const ARMv7_encoding type); + virtual void UQASX(const u32 data, const ARMv7_encoding type); + virtual void UQSAX(const u32 data, const ARMv7_encoding type); + virtual void UQSUB16(const u32 data, const ARMv7_encoding type); + virtual void UQSUB8(const u32 data, const ARMv7_encoding type); + virtual void USAD8(const u32 data, const ARMv7_encoding type); + virtual void USADA8(const u32 data, const ARMv7_encoding type); + virtual void USAT(const u32 data, const ARMv7_encoding type); + virtual void USAT16(const u32 data, const ARMv7_encoding type); + virtual void USAX(const u32 data, const ARMv7_encoding type); + virtual void USUB16(const u32 data, const ARMv7_encoding type); + virtual void USUB8(const u32 data, const ARMv7_encoding type); + virtual void UXTAB(const u32 data, const ARMv7_encoding type); + virtual void UXTAB16(const u32 data, const ARMv7_encoding type); + virtual void UXTAH(const u32 data, const ARMv7_encoding type); + virtual void UXTB(const u32 data, const ARMv7_encoding type); + virtual void UXTB16(const u32 data, const ARMv7_encoding type); + virtual void UXTH(const u32 data, const ARMv7_encoding type); }; diff --git a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h index 35d3684c8e..fb46013f1b 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Opcodes.h +++ b/rpcs3/Emu/ARMv7/ARMv7Opcodes.h @@ -32,18 +32,686 @@ namespace ARMv7_opcodes }; } +enum ARMv7_encoding +{ + T1, + T2, + T3, + T4, + A1, + A2, +}; + class ARMv7Opcodes { public: - virtual void NULL_OP() = 0; - virtual void NOP() = 0; + virtual void UNK(const u32 data) = 0; - virtual void PUSH(u16 regs_list) = 0; - virtual void POP(u16 regs_list) = 0; + virtual void NULL_OP(const u32 data, const ARMv7_encoding type) = 0; - virtual void B(u8 cond, u32 imm, u8 intstr_size) = 0; - virtual void CBZ(u8 op, u32 imm, u8 rn, u8 intstr_size) = 0; - virtual void BL(u32 imm, u8 intstr_size)=0; + virtual void HACK(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ADC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ADD_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_RSR(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_SPI(const u32 data, const ARMv7_encoding type) = 0; + virtual void ADD_SPR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ADR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void AND_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void AND_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void AND_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ASR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ASR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void B(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BFC(const u32 data, const ARMv7_encoding type) = 0; + virtual void BFI(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BIC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void BIC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void BIC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BKPT(const u32 data, const ARMv7_encoding type) = 0; + + virtual void BL(const u32 data, const ARMv7_encoding type) = 0; + virtual void BLX(const u32 data, const ARMv7_encoding type) = 0; + virtual void BX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void CB_Z(const u32 data, const ARMv7_encoding type) = 0; + + virtual void CLZ(const u32 data, const ARMv7_encoding type) = 0; - virtual void UNK(const u16 code0, const u16 code1) = 0; + virtual void CMN_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMN_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMN_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void CMP_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMP_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void CMP_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void EOR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void EOR_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void EOR_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void IT(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDMDA(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDMDB(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDMIB(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDR_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRB_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRB_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRD_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRD_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRD_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRH_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRH_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRH_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRSB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSB_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSB_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LDRSH_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSH_LIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void LDRSH_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LSL_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LSL_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void LSR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void LSR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MLA(const u32 data, const ARMv7_encoding type) = 0; + virtual void MLS(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MOV_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void MOV_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void MOVT(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MRS(const u32 data, const ARMv7_encoding type) = 0; + virtual void MSR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void MSR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MUL(const u32 data, const ARMv7_encoding type) = 0; + + virtual void MVN_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void MVN_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void MVN_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void NOP(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ORN_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ORN_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ORR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ORR_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void ORR_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void PKH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void POP(const u32 data, const ARMv7_encoding type) = 0; + virtual void PUSH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void QADD(const u32 data, const ARMv7_encoding type) = 0; + virtual void QADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void QADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void QASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void QDADD(const u32 data, const ARMv7_encoding type) = 0; + virtual void QDSUB(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSUB(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void QSUB8(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RBIT(const u32 data, const ARMv7_encoding type) = 0; + virtual void REV(const u32 data, const ARMv7_encoding type) = 0; + virtual void REV16(const u32 data, const ARMv7_encoding type) = 0; + virtual void REVSH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void ROR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void ROR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RRX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RSB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSB_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSB_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void RSC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void RSC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void SASX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SBC_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void SBC_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void SBC_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SBFX(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SDIV(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SEL(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SHADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SHSUB8(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SMLA__(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAL(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAL__(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLALD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLAW_(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLSD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMLSLD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMMLA(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMMLS(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMMUL(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMUAD(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMUL__(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMULL(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMULW_(const u32 data, const ARMv7_encoding type) = 0; + virtual void SMUSD(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SSAT(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSAT16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SSUB8(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STMDA(const u32 data, const ARMv7_encoding type) = 0; + virtual void STMDB(const u32 data, const ARMv7_encoding type) = 0; + virtual void STMIB(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STR_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STR_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STRB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STRB_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STRD_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STRD_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void STRH_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void STRH_REG(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SUB_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_RSR(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_SPI(const u32 data, const ARMv7_encoding type) = 0; + virtual void SUB_SPR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SVC(const u32 data, const ARMv7_encoding type) = 0; + + virtual void SXTAB(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTAB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTAH(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTB(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void SXTH(const u32 data, const ARMv7_encoding type) = 0; + + virtual void TB_(const u32 data, const ARMv7_encoding type) = 0; + + virtual void TEQ_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void TEQ_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void TEQ_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void TST_IMM(const u32 data, const ARMv7_encoding type) = 0; + virtual void TST_REG(const u32 data, const ARMv7_encoding type) = 0; + virtual void TST_RSR(const u32 data, const ARMv7_encoding type) = 0; + + virtual void UADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UBFX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UDIV(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UHSUB8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UMAAL(const u32 data, const ARMv7_encoding type) = 0; + virtual void UMLAL(const u32 data, const ARMv7_encoding type) = 0; + virtual void UMULL(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQADD16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQADD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQASX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQSAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQSUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UQSUB8(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAD8(const u32 data, const ARMv7_encoding type) = 0; + virtual void USADA8(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAT(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAT16(const u32 data, const ARMv7_encoding type) = 0; + virtual void USAX(const u32 data, const ARMv7_encoding type) = 0; + virtual void USUB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void USUB8(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTAB(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTAB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTAH(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTB(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTB16(const u32 data, const ARMv7_encoding type) = 0; + virtual void UXTH(const u32 data, const ARMv7_encoding type) = 0; + + // TODO: vector ops + something }; + +struct ARMv7_opcode_t +{ + u32 mask; + u32 code; + u32 length; // 2 or 4 + const char* name; + ARMv7_encoding type; + void (ARMv7Opcodes::*func)(const u32 data, const ARMv7_encoding type); +}; + +// single 16-bit value +#define ARMv7_OP2(mask, code, type, name) { (u32)((mask) << 16), (u32)((code) << 16), 2, #name "_" #type, type, &ARMv7Opcodes::name } +// two 16-bit values +#define ARMv7_OP4(mask0, mask1, code0, code1, type, name) { (u32)((mask0) << 16) | (mask1), (u32)((code0) << 16) | (code1), 4, #name "_" #type, type, &ARMv7Opcodes::name } + +static const ARMv7_opcode_t ARMv7_opcode_table[] = +{ + ARMv7_OP2(0xffff, 0x0000, T1, NULL_OP), // ??? + + ARMv7_OP4(0xffff, 0x0000, 0xf870, 0x0000, T1, HACK), // "Undefined" Thumb opcode + ARMv7_OP4(0x0ff0, 0x00f0, 0x0070, 0x0090, A1, HACK), // "Undefined" ARM opcode + + ARMv7_OP4(0xfbe0, 0x8000, 0xf140, 0x0000, T1, ADC_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x02a0, 0x0000, A1, ADC_IMM), + ARMv7_OP2(0xffc0, 0x4040, T1, ADC_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeb40, 0x0000, T2, ADC_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x00a0, 0x0000, A1, ADC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x00a0, 0x0010, A1, ADC_RSR), + + ARMv7_OP2(0xfe00, 0x1c00, T1, ADD_IMM), + ARMv7_OP2(0xf800, 0x3000, T2, ADD_IMM), + ARMv7_OP4(0xfbe0, 0x8000, 0xf100, 0x0000, T3, ADD_IMM), + ARMv7_OP4(0xfbf0, 0x8000, 0xf200, 0x0000, T4, ADD_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0280, 0x0000, A1, ADD_IMM), + ARMv7_OP2(0xfe00, 0x1800, T1, ADD_REG), + ARMv7_OP2(0xff00, 0x4400, T2, ADD_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeb00, 0x0000, T3, ADD_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0080, 0x0000, A1, ADD_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0080, 0x0010, A1, ADD_RSR), + ARMv7_OP2(0xf800, 0xa800, T1, ADD_SPI), + ARMv7_OP2(0xff80, 0xb000, T2, ADD_SPI), + ARMv7_OP4(0xfbef, 0x8000, 0xf10d, 0x0000, T3, ADD_SPI), + ARMv7_OP4(0xfbff, 0x8000, 0xf20d, 0x0000, T4, ADD_SPI), + ARMv7_OP4(0x0fef, 0x0000, 0x028d, 0x0000, A1, ADD_SPI), + ARMv7_OP2(0xff78, 0x4468, T1, ADD_SPR), + ARMv7_OP2(0xff87, 0x4485, T2, ADD_SPR), + ARMv7_OP4(0xffef, 0x8000, 0xeb0d, 0x0000, T3, ADD_SPR), + ARMv7_OP4(0x0fef, 0x0010, 0x008d, 0x0000, A1, ADD_SPR), + + ARMv7_OP2(0xf800, 0xa000, T1, ADR), + ARMv7_OP4(0xfbff, 0x8000, 0xf2af, 0x0000, T2, ADR), + ARMv7_OP4(0xfbff, 0x8000, 0xf20f, 0x0000, T3, ADR), + ARMv7_OP4(0x0fff, 0x0000, 0x028f, 0x0000, A1, ADR), + ARMv7_OP4(0x0fff, 0x0000, 0x024f, 0x0000, A2, ADR), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf000, 0x0000, T1, AND_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0200, 0x0000, A1, AND_IMM), + ARMv7_OP2(0xffc0, 0x4000, T1, AND_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea00, 0x0000, T2, AND_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0000, 0x0000, A1, AND_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0000, 0x0010, A1, AND_RSR), + + ARMv7_OP2(0xf800, 0x1000, T1, ASR_IMM), + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0020, T2, ASR_IMM), + ARMv7_OP4(0x0fef, 0x0070, 0x01a0, 0x0040, A1, ASR_IMM), + ARMv7_OP2(0xffc0, 0x4100, T1, ASR_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa40, 0xf000, T2, ASR_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0050, A1, ASR_REG), + + ARMv7_OP2(0xf000, 0xd000, T1, B), + ARMv7_OP2(0xf800, 0xe000, T2, B), + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x8000, T3, B), + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0x9000, T4, B), + ARMv7_OP4(0x0f00, 0x0000, 0x0a00, 0x0000, A1, B), + + ARMv7_OP4(0xffff, 0x8020, 0xf36f, 0x0000, T1, BFC), + ARMv7_OP4(0x0fe0, 0x007f, 0x07c0, 0x001f, A1, BFC), + ARMv7_OP4(0xfff0, 0x8020, 0xf360, 0x0000, T1, BFI), + ARMv7_OP4(0x0fe0, 0x0070, 0x07c0, 0x0010, A1, BFI), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf020, 0x0000, T1, BIC_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x03c0, 0x0000, A1, BIC_IMM), + ARMv7_OP2(0xffc0, 0x4380, T1, BIC_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea20, 0x0000, T2, BIC_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x01c0, 0x0000, A1, BIC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x01c0, 0x0010, A1, BIC_RSR), + + ARMv7_OP2(0xff00, 0xbe00, T1, BKPT), + ARMv7_OP4(0x0ff0, 0x00f0, 0x0120, 0x0070, A1, BKPT), + + ARMv7_OP4(0xf800, 0xd000, 0xf000, 0xd000, T1, BL), + ARMv7_OP4(0x0f00, 0x0000, 0x0b00, 0x0000, A1, BL), + ARMv7_OP2(0xff80, 0x4780, T1, BLX), + ARMv7_OP4(0xf800, 0xc001, 0xf000, 0xc000, T2, BLX), + ARMv7_OP4(0x0fff, 0xfff0, 0x012f, 0xff30, A1, BLX), + ARMv7_OP4(0xfe00, 0x0000, 0xfa00, 0x0000, A2, BLX), + + ARMv7_OP2(0xff87, 0x4700, T1, BX), + ARMv7_OP4(0x0fff, 0xfff0, 0x012f, 0xff10, A1, BX), + + ARMv7_OP2(0xf500, 0xb100, T1, CB_Z), + + ARMv7_OP4(0xfff0, 0xf0f0, 0xfab0, 0xf080, T1, CLZ), + ARMv7_OP4(0x0fff, 0x0ff0, 0x016f, 0x0f10, A1, CLZ), + + ARMv7_OP4(0xfbf0, 0x8f00, 0xf110, 0x0f00, T1, CMN_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0370, 0x0000, A1, CMN_IMM), + ARMv7_OP2(0xffc0, 0x42c0, T1, CMN_REG), + ARMv7_OP4(0xfff0, 0x8f00, 0xeb10, 0x0f00, T2, CMN_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0170, 0x0000, A1, CMN_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0170, 0x0010, A1, CMN_RSR), + + ARMv7_OP2(0xf800, 0x2800, T1, CMP_IMM), + ARMv7_OP4(0xfbf0, 0x8f00, 0xf1b0, 0x0f00, T2, CMP_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0350, 0x0000, A1, CMP_IMM), + ARMv7_OP2(0xffc0, 0x4280, T1, CMP_REG), + ARMv7_OP2(0xff00, 0x4500, T2, CMP_REG), + ARMv7_OP4(0xfff0, 0x8f00, 0xebb0, 0x0f00, T3, CMP_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0150, 0x0000, A1, CMP_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0150, 0x0010, A1, CMP_RSR), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf080, 0x0000, T1, EOR_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0220, 0x0000, A1, EOR_IMM), + ARMv7_OP2(0xffc0, 0x4040, T1, EOR_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea80, 0x0000, T2, EOR_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0020, 0x0000, A1, EOR_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0020, 0x0010, A1, EOR_RSR), + + ARMv7_OP2(0xff00, 0xbf00, T1, IT), + + ARMv7_OP2(0xf800, 0xc800, T1, LDM), + ARMv7_OP4(0xffd0, 0x2000, 0xe890, 0x0000, T2, LDM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0890, 0x0000, A1, LDM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0810, 0x0000, A1, LDMDA), + ARMv7_OP4(0xffd0, 0x2000, 0xe910, 0x0000, T1, LDMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0910, 0x0000, A1, LDMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0990, 0x0000, A1, LDMIB), + + ARMv7_OP2(0xf800, 0x6800, T1, LDR_IMM), + ARMv7_OP2(0xf800, 0x9800, T2, LDR_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf8d0, 0x0000, T3, LDR_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf850, 0x0800, T4, LDR_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0410, 0x0000, A1, LDR_IMM), + ARMv7_OP2(0xf800, 0x4800, T1, LDR_LIT), + ARMv7_OP4(0xff7f, 0x0000, 0xf85f, 0x0000, T2, LDR_LIT), + ARMv7_OP4(0x0f7f, 0x0000, 0x051f, 0x0000, A1, LDR_LIT), + ARMv7_OP2(0xfe00, 0x5800, T1, LDR_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf850, 0x0000, T2, LDR_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0610, 0x0000, A1, LDR_REG), + + ARMv7_OP2(0xf800, 0x7800, T1, LDRB_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf890, 0x0000, T2, LDRB_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf810, 0x0800, T3, LDRB_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0450, 0x0000, A1, LDRB_IMM), + ARMv7_OP4(0xff7f, 0x0000, 0xf81f, 0x0000, T1, LDRB_LIT), + ARMv7_OP4(0x0f7f, 0x0000, 0x055f, 0x0000, A1, LDRB_LIT), + ARMv7_OP2(0xfe00, 0x5c00, T1, LDRB_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf810, 0x0000, T2, LDRB_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0650, 0x0000, A1, LDRB_REG), + + ARMv7_OP4(0xfe50, 0x0000, 0xe850, 0x0000, T1, LDRD_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0040, 0x00d0, A1, LDRD_IMM), + ARMv7_OP4(0xfe7f, 0x0000, 0xe85f, 0x0000, T1, LDRD_LIT), + ARMv7_OP4(0x0f7f, 0x00f0, 0x014f, 0x00d0, A1, LDRD_LIT), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0000, 0x00d0, A1, LDRD_REG), + + ARMv7_OP4(0xfff0, 0x0000, 0xf990, 0x0000, T1, LDRSB_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf910, 0x0800, T2, LDRSB_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0050, 0x00d0, A1, LDRSB_IMM), + ARMv7_OP4(0xff7f, 0x0000, 0xf91f, 0x0000, T1, LDRSB_LIT), + ARMv7_OP4(0x0f7f, 0x00f0, 0x015f, 0x00d0, A1, LDRSB_LIT), + ARMv7_OP2(0xfe00, 0x5600, T1, LDRSB_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf910, 0x0000, T2, LDRSB_REG), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0010, 0x00d0, A1, LDRSB_REG), + + ARMv7_OP4(0xfff0, 0x0000, 0xf9b0, 0x0000, T1, LDRSH_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf930, 0x0800, T2, LDRSH_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0050, 0x00f0, A1, LDRSH_IMM), + ARMv7_OP4(0xff7f, 0x0000, 0xf93f, 0x0000, T1, LDRSH_LIT), + ARMv7_OP4(0x0f7f, 0x00f0, 0x015f, 0x00f0, A1, LDRSH_LIT), + ARMv7_OP2(0xfe00, 0x5e00, T1, LDRSH_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf930, 0x0000, T2, LDRSH_REG), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0010, 0x00f0, A1, LDRSH_REG), + + ARMv7_OP2(0xf800, 0x0000, T1, LSL_IMM), + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0000, T2, LSL_IMM), + ARMv7_OP4(0x0fef, 0x0070, 0x01a0, 0x0000, A1, LSL_IMM), + ARMv7_OP2(0xffc0, 0x4080, T1, LSL_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa00, 0xf000, T2, LSL_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0010, A1, LSL_REG), + + ARMv7_OP2(0xf800, 0x0800, T1, LSR_IMM), + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0010, T2, LSR_IMM), + ARMv7_OP4(0x0fef, 0x0030, 0x01a0, 0x0020, A1, LSR_IMM), + ARMv7_OP2(0xffc0, 0x40c0, T1, LSR_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa20, 0xf000, T2, LSR_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0030, A1, LSR_REG), + + ARMv7_OP4(0xfff0, 0x00f0, 0xfb00, 0x0000, T1, MLA), + ARMv7_OP4(0x0fe0, 0x00f0, 0x0020, 0x0090, A1, MLA), + + ARMv7_OP4(0xfff0, 0x00f0, 0xfb00, 0x0010, T1, MLS), + ARMv7_OP4(0x0ff0, 0x00f0, 0x0060, 0x0090, A1, MLS), + + ARMv7_OP2(0xf800, 0x2000, T1, MOV_IMM), + ARMv7_OP4(0xfbef, 0x8000, 0xf04f, 0x0000, T2, MOV_IMM), + ARMv7_OP4(0xfbf0, 0x8000, 0xf240, 0x0000, T3, MOV_IMM), + ARMv7_OP4(0x0fef, 0x0000, 0x03a0, 0x0000, A1, MOV_IMM), + ARMv7_OP4(0x0ff0, 0x0000, 0x0300, 0x0000, A2, MOV_IMM), + ARMv7_OP2(0xff00, 0x4600, T1, MOV_REG), + ARMv7_OP2(0xffc0, 0x0000, T2, MOV_REG), + ARMv7_OP4(0xffef, 0xf0f0, 0xea4f, 0x0000, T3, MOV_REG), + ARMv7_OP4(0x0fef, 0x0ff0, 0x01a0, 0x0000, A1, MOV_REG), + ARMv7_OP4(0xfbf0, 0x8000, 0xf2c0, 0x0000, T1, MOVT), + ARMv7_OP4(0x0ff0, 0x0000, 0x0340, 0x0000, A1, MOVT), + + ARMv7_OP4(0xffff, 0xf0ff, 0xf3ef, 0x8000, T1, MRS), + ARMv7_OP4(0x0fff, 0x0fff, 0x010f, 0x0000, A1, MRS), + ARMv7_OP4(0x0ff3, 0xf000, 0x0320, 0xf000, A1, MSR_IMM), + ARMv7_OP4(0xfff0, 0xf3ff, 0xf380, 0x8000, T1, MSR_REG), + ARMv7_OP4(0x0ff3, 0xfff0, 0x0120, 0xf000, A1, MSR_REG), + + ARMv7_OP2(0xffc0, 0x4340, T1, MUL), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfb00, 0xf000, T2, MUL), + ARMv7_OP4(0x0fe0, 0xf0f0, 0x0000, 0x0090, A1, MUL), + + ARMv7_OP4(0xfbef, 0x8000, 0xf06f, 0x0000, T1, MVN_IMM), + ARMv7_OP4(0x0fef, 0x0000, 0x03e0, 0x0000, A1, MVN_IMM), + ARMv7_OP2(0xffc0, 0x43c0, T1, MVN_REG), + ARMv7_OP4(0xffef, 0x8000, 0xea6f, 0x0000, T2, MVN_REG), + ARMv7_OP4(0xffef, 0x0010, 0x01e0, 0x0000, A1, MVN_REG), + ARMv7_OP4(0x0fef, 0x0090, 0x01e0, 0x0010, A1, MVN_RSR), + + ARMv7_OP2(0xffff, 0xbf00, T1, NOP), + ARMv7_OP4(0xffff, 0xffff, 0xf3af, 0x8000, T2, NOP), + ARMv7_OP4(0x0fff, 0xffff, 0x0320, 0xf000, A1, NOP), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf060, 0x0000, T1, ORN_IMM), + ARMv7_OP4(0xffe0, 0x8000, 0xea60, 0x0000, T1, ORN_REG), + + ARMv7_OP4(0xfbe0, 0x8000, 0xf040, 0x0000, T1, ORR_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0380, 0x0000, A1, ORR_IMM), + ARMv7_OP2(0xffc0, 0x4300, T1, ORR_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xea40, 0x0000, T2, ORR_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0180, 0x0000, A1, ORR_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0180, 0x0010, A1, ORR_RSR), + + ARMv7_OP4(0xfff0, 0x8010, 0xeac0, 0x0000, T1, PKH), + ARMv7_OP4(0x0ff0, 0x0030, 0x0680, 0x0010, A1, PKH), + + ARMv7_OP2(0xfe00, 0xbc00, T1, POP), + ARMv7_OP4(0xffff, 0x0000, 0xe8bd, 0x0000, T2, POP), + ARMv7_OP4(0xffff, 0x0fff, 0xf85d, 0x0b04, T3, POP), + ARMv7_OP4(0x0fff, 0x0000, 0x08bd, 0x0000, A1, POP), + ARMv7_OP4(0x0fff, 0x0fff, 0x049d, 0x0004, A2, POP), + + ARMv7_OP2(0xfe00, 0xb400, T1, PUSH), + ARMv7_OP4(0xffff, 0x0000, 0xe92d, 0x0000, T2, PUSH), // had an error in arch ref + ARMv7_OP4(0xffff, 0x0fff, 0xf84d, 0x0d04, T3, PUSH), + ARMv7_OP4(0x0fff, 0x0000, 0x092d, 0x0000, A1, PUSH), + ARMv7_OP4(0x0fff, 0x0fff, 0x052d, 0x0004, A2, PUSH), + + // TODO (Q*...) + + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf0a0, T1, RBIT), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06ff, 0x0f30, A1, RBIT), + + ARMv7_OP2(0xffc0, 0xba00, T1, REV), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf080, T2, REV), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06bf, 0x0f30, A1, REV), + ARMv7_OP2(0xffc0, 0xba40, T1, REV16), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf090, T2, REV16), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06bf, 0x0fb0, A1, REV16), + ARMv7_OP2(0xffc0, 0xbac0, T1, REVSH), + ARMv7_OP4(0xfff0, 0xf0f0, 0xfa90, 0xf0b0, T2, REVSH), + ARMv7_OP4(0x0fff, 0x0ff0, 0x06ff, 0x0fb0, A1, REVSH), + + ARMv7_OP4(0xffef, 0x8030, 0xea4f, 0x0030, T1, ROR_IMM), + ARMv7_OP4(0x0fef, 0x0070, 0x01a0, 0x0060, A1, ROR_IMM), + ARMv7_OP2(0xffc0, 0x41c0, T1, ROR_REG), + ARMv7_OP4(0xffe0, 0xf0f0, 0xfa60, 0xf000, T2, ROR_REG), + ARMv7_OP4(0x0fef, 0x00f0, 0x01a0, 0x0070, A1, ROR_REG), + ARMv7_OP4(0xffef, 0xf0f0, 0xea4f, 0x0030, T1, RRX), + ARMv7_OP4(0x0fef, 0x0ff0, 0x01a0, 0x0060, A1, RRX), + + ARMv7_OP2(0xffc0, 0x4240, T1, RSB_IMM), + ARMv7_OP4(0xfbe0, 0x8000, 0xf1c0, 0x0000, T2, RSB_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0260, 0x0000, A1, RSB_IMM), + ARMv7_OP4(0xffe0, 0x8000, 0xebc0, 0x0000, T1, RSB_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0060, 0x0000, A1, RSB_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0060, 0x0010, A1, RSB_RSR), + + ARMv7_OP4(0x0fe0, 0x0000, 0x02e0, 0x0000, A1, RSC_IMM), + ARMv7_OP4(0x0fe0, 0x0010, 0x00e0, 0x0000, A1, RSC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x00e0, 0x0010, A1, RSC_RSR), + + // TODO (SADD16, SADD8, SASX) + + ARMv7_OP4(0xfbe0, 0x8000, 0xf160, 0x0000, T1, SBC_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x02c0, 0x0000, A1, SBC_IMM), + ARMv7_OP2(0xffc0, 0x4180, T1, SBC_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeb60, 0x0000, T2, SBC_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x00c0, 0x0000, A1, SBC_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x00c0, 0x0010, A1, SBC_RSR), + + ARMv7_OP4(0xfff0, 0x8020, 0xf340, 0x0000, T1, SBFX), + ARMv7_OP4(0x0fe0, 0x0070, 0x07a0, 0x0050, A1, SBFX), + + ARMv7_OP4(0xfff0, 0xf0f0, 0xfb90, 0xf0f0, T1, SDIV), // ??? + + ARMv7_OP4(0xfff0, 0xf0f0, 0xfaa0, 0xf080, T1, SEL), + ARMv7_OP4(0x0ff0, 0x0ff0, 0x0680, 0x0fb0, A1, SEL), + + // TODO (SH*, SM*, SS*) + + ARMv7_OP2(0xf800, 0xc000, T1, STM), + ARMv7_OP4(0xffd0, 0xa000, 0xe880, 0x0000, T2, STM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0880, 0x0000, A1, STM), + ARMv7_OP4(0x0fd0, 0x0000, 0x0800, 0x0000, A1, STMDA), + ARMv7_OP4(0xffd0, 0xa000, 0xe900, 0x0000, T1, STMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0900, 0x0000, A1, STMDB), + ARMv7_OP4(0x0fd0, 0x0000, 0x0980, 0x0000, A1, STMIB), + + ARMv7_OP2(0xf800, 0x6000, T1, STR_IMM), + ARMv7_OP2(0xf800, 0x9000, T2, STR_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf8c0, 0x0000, T3, STR_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf840, 0x0800, T4, STR_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0400, 0x0000, A1, STR_IMM), + ARMv7_OP2(0xfe00, 0x5000, T1, STR_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf840, 0x0000, T2, STR_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0600, 0x0000, A1, STR_REG), + + ARMv7_OP2(0xf800, 0x7000, T1, STRB_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf880, 0x0000, T2, STRB_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf800, 0x0800, T3, STRB_IMM), + ARMv7_OP4(0x0e50, 0x0000, 0x0440, 0x0000, A1, STRB_IMM), + ARMv7_OP2(0xfe00, 0x5400, T1, STRB_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf800, 0x0000, T2, STRB_REG), + ARMv7_OP4(0x0e50, 0x0010, 0x0640, 0x0000, A1, STRB_REG), + + ARMv7_OP4(0xfe50, 0x0000, 0xe840, 0x0000, T1, STRD_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0040, 0x00f0, A1, STRD_IMM), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0000, 0x00f0, A1, STRD_REG), + + ARMv7_OP2(0xf800, 0x8000, T1, STRH_IMM), + ARMv7_OP4(0xfff0, 0x0000, 0xf8a0, 0x0000, T2, STRH_IMM), + ARMv7_OP4(0xfff0, 0x0800, 0xf820, 0x0800, T3, STRH_IMM), + ARMv7_OP4(0x0e50, 0x00f0, 0x0040, 0x00b0, A1, STRH_IMM), + ARMv7_OP2(0xfe00, 0x5200, T1, STRH_REG), + ARMv7_OP4(0xfff0, 0x0fc0, 0xf820, 0x0000, T2, STRH_REG), + ARMv7_OP4(0x0e50, 0x0ff0, 0x0000, 0x00b0, A1, STRH_REG), + + ARMv7_OP2(0xff80, 0xb080, T1, SUB_SPI), + ARMv7_OP4(0xfbef, 0x8000, 0xf1ad, 0x0000, T2, SUB_SPI), + ARMv7_OP4(0xfbff, 0x8000, 0xf2ad, 0x0000, T3, SUB_SPI), + ARMv7_OP4(0x0fef, 0x0000, 0x024d, 0x0000, A1, SUB_SPI), + ARMv7_OP4(0xffef, 0x8000, 0xebad, 0x0000, T1, SUB_SPR), + ARMv7_OP4(0x0fef, 0x0010, 0x004d, 0x0000, A1, SUB_SPR), + ARMv7_OP2(0xfe00, 0x1e00, T1, SUB_IMM), + ARMv7_OP2(0xf800, 0x3800, T2, SUB_IMM), + ARMv7_OP4(0xfbe0, 0x8000, 0xf1a0, 0x0000, T3, SUB_IMM), + ARMv7_OP4(0xfbf0, 0x8000, 0xf2a0, 0x0000, T4, SUB_IMM), + ARMv7_OP4(0x0fe0, 0x0000, 0x0240, 0x0000, A1, SUB_IMM), + ARMv7_OP2(0xfe00, 0x1a00, T1, SUB_REG), + ARMv7_OP4(0xffe0, 0x8000, 0xeba0, 0x0000, T2, SUB_REG), + ARMv7_OP4(0x0fe0, 0x0010, 0x0040, 0x0000, A1, SUB_REG), + ARMv7_OP4(0x0fe0, 0x0090, 0x0040, 0x0010, A1, SUB_RSR), + + ARMv7_OP2(0xff00, 0xdf00, T1, SVC), + ARMv7_OP4(0x0f00, 0x0000, 0x0f00, 0x0000, A1, SVC), + + // TODO (SX*) + + ARMv7_OP4(0xfff0, 0xffe0, 0xe8d0, 0xf000, T1, TB_), + + ARMv7_OP4(0xfbf0, 0x8f00, 0xf090, 0x0f00, T1, TEQ_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0330, 0x0000, A1, TEQ_IMM), + ARMv7_OP4(0xfff0, 0x8f00, 0xea90, 0x0f00, T1, TEQ_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0130, 0x0000, A1, TEQ_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0130, 0x0010, A1, TEQ_RSR), + + ARMv7_OP4(0xfbf0, 0x8f00, 0xf010, 0x0f00, T1, TST_IMM), + ARMv7_OP4(0x0ff0, 0xf000, 0x0310, 0x0000, A1, TST_IMM), + ARMv7_OP2(0xffc0, 0x4200, T1, TST_REG), + ARMv7_OP4(0xfff0, 0x8f00, 0xea10, 0x0f00, T2, TST_REG), + ARMv7_OP4(0x0ff0, 0xf010, 0x0110, 0x0000, A1, TST_REG), + ARMv7_OP4(0x0ff0, 0xf090, 0x0110, 0x0010, A1, TST_RSR), + + // TODO (U*, V*) +}; + +#undef ARMv7_OP +#undef ARMv7_OPP + diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp index 3fe6595994..8c57c78485 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.cpp +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.cpp @@ -3,6 +3,7 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" +#include "Emu/CPU/CPUThreadManager.h" #include "ARMv7Thread.h" #include "ARMv7Decoder.h" @@ -18,6 +19,8 @@ void ARMv7Thread::InitRegs() memset(GPR, 0, sizeof(GPR[0]) * 15); APSR.APSR = 0; IPSR.IPSR = 0; + ISET = Thumb; + ITSTATE.IT = 0; SP = m_stack_addr + m_stack_size; } @@ -30,9 +33,9 @@ void ARMv7Thread::InitStack() } } -void ARMv7Thread::SetArg(const uint pos, const u64 arg) +u32 ARMv7Thread::GetStackArg(u32 pos) { - assert(0); + return vm::psv::read32(SP + sizeof(u32) * (pos - 5)); } std::string ARMv7Thread::RegsToString() @@ -98,3 +101,15 @@ void ARMv7Thread::DoStop() void ARMv7Thread::DoCode() { } + +arm7_thread::arm7_thread(u32 entry, const std::string& name, u32 stack_size, u32 prio) +{ + thread = &Emu.GetCPU().AddThread(CPU_THREAD_ARMv7); + + thread->SetName(name); + thread->SetEntry(entry); + thread->SetStackSize(stack_size ? stack_size : Emu.GetInfo().GetProcParam().primary_stacksize); + thread->SetPrio(prio ? prio : Emu.GetInfo().GetProcParam().primary_prio); + + argc = 0; +} \ No newline at end of file diff --git a/rpcs3/Emu/ARMv7/ARMv7Thread.h b/rpcs3/Emu/ARMv7/ARMv7Thread.h index e95e9b49ec..c657042e10 100644 --- a/rpcs3/Emu/ARMv7/ARMv7Thread.h +++ b/rpcs3/Emu/ARMv7/ARMv7Thread.h @@ -1,6 +1,14 @@ #pragma once #include "Emu/CPU/CPUThread.h" +enum ARMv7InstructionSet +{ + ARM, + Thumb, + Jazelle, + ThumbEE, +}; + class ARMv7Thread : public CPUThread { public: @@ -38,6 +46,7 @@ public: }; u32 APSR; + } APSR; union @@ -49,8 +58,41 @@ public: }; u32 IPSR; + } IPSR; + ARMv7InstructionSet ISET; + + union + { + struct + { + u8 cond : 3; + u8 state : 5; + }; + + u8 IT; + + u32 advance() + { + const u32 res = (state & 0xf) ? (cond << 1 | state >> 4) : 0xe /* true */; + + state <<= 1; + if ((state & 0xf) == 0) // if no d + { + IT = 0; // clear ITSTATE + } + + return res; + } + + operator bool() const + { + return (state & 0xf) != 0; + } + + } ITSTATE; + void write_gpr(u32 n, u32 value) { assert(n < 16); @@ -61,7 +103,7 @@ public: } else { - SetBranch(value); + SetBranch(value & ~1); } } @@ -80,7 +122,7 @@ public: public: virtual void InitRegs(); virtual void InitStack(); - virtual void SetArg(const uint pos, const u64 arg); + u32 GetStackArg(u32 pos); public: virtual std::string RegsToString(); @@ -95,4 +137,49 @@ protected: virtual void DoStop(); virtual void DoCode(); +}; +class arm7_thread : cpu_thread +{ + static const u32 stack_align = 0x10; + vm::ptr argv; + u32 argc; + vm::ptr envp; + +public: + arm7_thread(u32 entry, const std::string& name = "", u32 stack_size = 0, u32 prio = 0); + + cpu_thread& args(std::initializer_list values) override + { + if (!values.size()) + return *this; + + assert(argc == 0); + + envp.set(vm::alloc((u32)sizeof(envp), stack_align, vm::main)); + *envp = 0; + argv.set(vm::alloc(u32(sizeof(argv)* values.size()), stack_align, vm::main)); + + for (auto &arg : values) + { + u32 arg_size = align(u32(arg.size() + 1), stack_align); + u32 arg_addr = vm::alloc(arg_size, stack_align, vm::main); + + std::strcpy(vm::get_ptr(arg_addr), arg.c_str()); + + argv[argc++] = arg_addr; + } + + return *this; + } + + cpu_thread& run() override + { + thread->Run(); + + static_cast(thread)->GPR[3] = argc; + static_cast(thread)->GPR[4] = argv.addr(); + static_cast(thread)->GPR[5] = envp.addr(); + + return *this; + } }; \ No newline at end of file diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp new file mode 100644 index 0000000000..4f161201e8 --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp @@ -0,0 +1,401 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base sceLibKernel; + +typedef s32(*SceKernelThreadEntry)(u32 argSize, vm::psv::ptr pArgBlock); + +struct SceKernelThreadOptParam +{ + u32 size; + u32 attr; +}; + +s32 sceKernelCreateThread( + vm::psv::ptr pName, + vm::psv::ptr entry, + s32 initPriority, + u32 stackSize, + u32 attr, + s32 cpuAffinityMask, + vm::psv::ptr pOptParam) +{ + sceLibKernel.Todo("sceKernelCreateThread(pName_addr=0x%x ('%s'), entry_addr=0x%x, initPriority=%d, stackSize=0x%x, attr=0x%x, cpuAffinityMask=0x%x, pOptParam_addr=0x%x)", + pName.addr(), pName.get_ptr(), entry.addr(), initPriority, stackSize, attr, cpuAffinityMask, pOptParam.addr()); + + return SCE_OK; +} + +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibKernel, #name, &name) + +psv_log_base sceLibKernel = []() -> psv_log_base +{ + //REG_FUNC(0x23EAA62, sceKernelPuts); + //REG_FUNC(0xB0335388, sceClibToupper); + //REG_FUNC(0x4C5471BC, sceClibTolower); + //REG_FUNC(0xD8EBBB7E, sceClibLookCtypeTable); + //REG_FUNC(0x20EC3210, sceClibGetCtypeTable); + //REG_FUNC(0x407D6153, sceClibMemchr); + //REG_FUNC(0x9CC2BFDF, sceClibMemcmp); + //REG_FUNC(0x14E9DBD7, sceClibMemcpy); + //REG_FUNC(0x736753C8, sceClibMemmove); + //REG_FUNC(0x632980D7, sceClibMemset); + //REG_FUNC(0xFA26BC62, sceClibPrintf); + //REG_FUNC(0x5EA3B6CE, sceClibVprintf); + //REG_FUNC(0x8CBA03D5, sceClibSnprintf); + //REG_FUNC(0xFA6BE467, sceClibVsnprintf); + //REG_FUNC(0xA2FB4D9D, sceClibStrcmp); + //REG_FUNC(0x70CBC2D5, sceClibStrlcat); + //REG_FUNC(0x2CDFCD1C, sceClibStrlcpy); + //REG_FUNC(0xA37E6383, sceClibStrncat); + //REG_FUNC(0x660D1F6D, sceClibStrncmp); + //REG_FUNC(0xC458D60A, sceClibStrncpy); + //REG_FUNC(0xAC595E68, sceClibStrnlen); + //REG_FUNC(0x614076B7, sceClibStrchr); + //REG_FUNC(0x6E728AAE, sceClibStrrchr); + //REG_FUNC(0xE265498B, sceClibStrstr); + //REG_FUNC(0xB54C0BE4, sceClibStrncasecmp); + //REG_FUNC(0x2F2C6046, sceClibAbort); + //REG_FUNC(0x2E581B88, sceClibStrtoll); + //REG_FUNC(0x3B9E301A, sceClibMspaceCreate); + //REG_FUNC(0xAE1A21EC, sceClibMspaceDestroy); + //REG_FUNC(0x86EF7680, sceClibMspaceMalloc); + //REG_FUNC(0x9C56B4D1, sceClibMspaceFree); + //REG_FUNC(0x678374AD, sceClibMspaceCalloc); + //REG_FUNC(0x3C847D57, sceClibMspaceMemalign); + //REG_FUNC(0x774891D6, sceClibMspaceRealloc); + //REG_FUNC(0x586AC68D, sceClibMspaceReallocalign); + //REG_FUNC(0x46A02279, sceClibMspaceMallocUsableSize); + //REG_FUNC(0x8CC1D38E, sceClibMspaceMallocStats); + //REG_FUNC(0x738E0322, sceClibMspaceMallocStatsFast); + //REG_FUNC(0xD1D59701, sceClibMspaceIsHeapEmpty); + //REG_FUNC(0xE960FDA2, sceKernelAtomicSet8); + //REG_FUNC(0x450BFECF, sceKernelAtomicSet16); + //REG_FUNC(0xB69DA09B, sceKernelAtomicSet32); + //REG_FUNC(0xC8A4339C, sceKernelAtomicSet64); + //REG_FUNC(0x27A2AAFA, sceKernelAtomicGetAndAdd8); + //REG_FUNC(0x5674DB0C, sceKernelAtomicGetAndAdd16); + //REG_FUNC(0x2611CB0B, sceKernelAtomicGetAndAdd32); + //REG_FUNC(0x63DAF37D, sceKernelAtomicGetAndAdd64); + //REG_FUNC(0x8F7BD940, sceKernelAtomicAddAndGet8); + //REG_FUNC(0x495C52EC, sceKernelAtomicAddAndGet16); + //REG_FUNC(0x2E84A93B, sceKernelAtomicAddAndGet32); + //REG_FUNC(0xB6CE9B9A, sceKernelAtomicAddAndGet64); + //REG_FUNC(0xCDF5DF67, sceKernelAtomicGetAndSub8); + //REG_FUNC(0xAC51979C, sceKernelAtomicGetAndSub16); + //REG_FUNC(0x115C516F, sceKernelAtomicGetAndSub32); + //REG_FUNC(0x4AE9C8E6, sceKernelAtomicGetAndSub64); + //REG_FUNC(0x99E1796E, sceKernelAtomicSubAndGet8); + //REG_FUNC(0xC26BBBB1, sceKernelAtomicSubAndGet16); + //REG_FUNC(0x1C9CD92, sceKernelAtomicSubAndGet32); + //REG_FUNC(0x9BB4A94B, sceKernelAtomicSubAndGet64); + //REG_FUNC(0x53DCA02B, sceKernelAtomicGetAndAnd8); + //REG_FUNC(0x7A0CB056, sceKernelAtomicGetAndAnd16); + //REG_FUNC(0x8266595, sceKernelAtomicGetAndAnd32); + //REG_FUNC(0x4828BC43, sceKernelAtomicGetAndAnd64); + //REG_FUNC(0x86B9170F, sceKernelAtomicAndAndGet8); + //REG_FUNC(0xF9890F7E, sceKernelAtomicAndAndGet16); + //REG_FUNC(0x6709D30C, sceKernelAtomicAndAndGet32); + //REG_FUNC(0xAED2B370, sceKernelAtomicAndAndGet64); + //REG_FUNC(0x107A68DF, sceKernelAtomicGetAndOr8); + //REG_FUNC(0x31E49E73, sceKernelAtomicGetAndOr16); + //REG_FUNC(0x984AD276, sceKernelAtomicGetAndOr32); + //REG_FUNC(0xC39186CD, sceKernelAtomicGetAndOr64); + //REG_FUNC(0x51693931, sceKernelAtomicOrAndGet8); + //REG_FUNC(0x8E248EBD, sceKernelAtomicOrAndGet16); + //REG_FUNC(0xC3B2F7F8, sceKernelAtomicOrAndGet32); + //REG_FUNC(0x809BBC7D, sceKernelAtomicOrAndGet64); + //REG_FUNC(0x7350B2DF, sceKernelAtomicGetAndXor8); + //REG_FUNC(0x6E2D0B9E, sceKernelAtomicGetAndXor16); + //REG_FUNC(0x38739E2F, sceKernelAtomicGetAndXor32); + //REG_FUNC(0x6A19BBE9, sceKernelAtomicGetAndXor64); + //REG_FUNC(0x634AF062, sceKernelAtomicXorAndGet8); + //REG_FUNC(0x6F524195, sceKernelAtomicXorAndGet16); + //REG_FUNC(0x46940704, sceKernelAtomicXorAndGet32); + //REG_FUNC(0xDDC6866E, sceKernelAtomicXorAndGet64); + //REG_FUNC(0x327DB4C0, sceKernelAtomicCompareAndSet8); + //REG_FUNC(0xE8C01236, sceKernelAtomicCompareAndSet16); + //REG_FUNC(0x1124A1D4, sceKernelAtomicCompareAndSet32); + //REG_FUNC(0x1EBDFCCD, sceKernelAtomicCompareAndSet64); + //REG_FUNC(0xD7D49E36, sceKernelAtomicClearMask8); + //REG_FUNC(0x5FE7DFF8, sceKernelAtomicClearMask16); + //REG_FUNC(0xE3DF0CB3, sceKernelAtomicClearMask32); + //REG_FUNC(0x953D118A, sceKernelAtomicClearMask64); + //REG_FUNC(0x7FD94393, sceKernelAtomicAddUnless8); + //REG_FUNC(0x1CF4AA4B, sceKernelAtomicAddUnless16); + //REG_FUNC(0x4B33FD3C, sceKernelAtomicAddUnless32); + //REG_FUNC(0xFFCE7438, sceKernelAtomicAddUnless64); + //REG_FUNC(0x9DABE6C3, sceKernelAtomicDecIfPositive8); + //REG_FUNC(0x323718FB, sceKernelAtomicDecIfPositive16); + //REG_FUNC(0xCA3294F1, sceKernelAtomicDecIfPositive32); + //REG_FUNC(0x8BE2A007, sceKernelAtomicDecIfPositive64); + //REG_FUNC(0xBBE82155, sceKernelLoadModule); + //REG_FUNC(0x2DCC4AFA, sceKernelLoadStartModule); + //REG_FUNC(0x702425D5, sceKernelStartModule); + //REG_FUNC(0x3B2CBA09, sceKernelStopModule); + //REG_FUNC(0x1987920E, sceKernelUnloadModule); + //REG_FUNC(0x2415F8A4, sceKernelStopUnloadModule); + //REG_FUNC(0x15E2A45D, sceKernelCallModuleExit); + //REG_FUNC(0xD11A5103, sceKernelGetModuleInfoByAddr); + //REG_FUNC(0x4F2D8B15, sceKernelOpenModule); + //REG_FUNC(0x657FA50E, sceKernelCloseModule); + //REG_FUNC(0x7595D9AA, sceKernelExitProcess); + //REG_FUNC(0x4C7AD128, sceKernelPowerLock); + //REG_FUNC(0xAF8E9C11, sceKernelPowerUnlock); + //REG_FUNC(0xB295EB61, sceKernelGetTLSAddr); + //REG_FUNC(0xFB972F9, sceKernelGetThreadId); + //REG_FUNC(0xA37A6057, sceKernelGetCurrentThreadVfpException); + //REG_FUNC(0xCA71EA2, sceKernelSendMsgPipe); + //REG_FUNC(0xA5CA74AC, sceKernelSendMsgPipeCB); + //REG_FUNC(0xDFC670E0, sceKernelTrySendMsgPipe); + //REG_FUNC(0x4E81DD5C, sceKernelReceiveMsgPipe); + //REG_FUNC(0x33AF829B, sceKernelReceiveMsgPipeCB); + //REG_FUNC(0x5615B006, sceKernelTryReceiveMsgPipe); + //REG_FUNC(0xA7819967, sceKernelLockLwMutex); + //REG_FUNC(0x6F9C4CC1, sceKernelLockLwMutexCB); + //REG_FUNC(0x9EF798C1, sceKernelTryLockLwMutex); + //REG_FUNC(0x499EA781, sceKernelUnlockLwMutex); + //REG_FUNC(0xF7D8F1FC, sceKernelGetLwMutexInfo); + //REG_FUNC(0xDDB395A9, sceKernelWaitThreadEnd); + //REG_FUNC(0xC54941ED, sceKernelWaitThreadEndCB); + //REG_FUNC(0xD5DC26C4, sceKernelGetThreadExitStatus); + //REG_FUNC(0x4373B548, __sce_aeabi_idiv0); + //REG_FUNC(0xFB235848, __sce_aeabi_ldiv0); + //REG_FUNC(0xF08DE149, sceKernelStartThread); + //REG_FUNC(0x58DDAC4F, sceKernelDeleteThread); + //REG_FUNC(0x5150577B, sceKernelChangeThreadCpuAffinityMask); + //REG_FUNC(0x8C57AC2A, sceKernelGetThreadCpuAffinityMask); + //REG_FUNC(0xDF7E6EDA, sceKernelChangeThreadPriority); + //REG_FUNC(0xBCB63B66, sceKernelGetThreadStackFreeSize); + //REG_FUNC(0x8D9C5461, sceKernelGetThreadInfo); + //REG_FUNC(0xD6B01013, sceKernelGetThreadRunStatus); + //REG_FUNC(0xE0241FAA, sceKernelGetSystemInfo); + //REG_FUNC(0xF994FE65, sceKernelGetThreadmgrUIDClass); + //REG_FUNC(0xB4DE10C7, sceKernelGetActiveCpuMask); + //REG_FUNC(0x2C1321A3, sceKernelChangeThreadVfpException); + //REG_FUNC(0x3849359A, sceKernelCreateCallback); + //REG_FUNC(0x88DD1BC8, sceKernelGetCallbackInfo); + //REG_FUNC(0x464559D3, sceKernelDeleteCallback); + //REG_FUNC(0xBD9C8F2B, sceKernelNotifyCallback); + //REG_FUNC(0x3137A687, sceKernelCancelCallback); + //REG_FUNC(0x76A2EF81, sceKernelGetCallbackCount); + //REG_FUNC(0xD4F75281, sceKernelRegisterCallbackToEvent); + //REG_FUNC(0x8D3940DF, sceKernelUnregisterCallbackFromEvent); + //REG_FUNC(0x2BD1E682, sceKernelUnregisterCallbackFromEventAll); + //REG_FUNC(0x120F03AF, sceKernelWaitEvent); + //REG_FUNC(0xA0490795, sceKernelWaitEventCB); + //REG_FUNC(0x241F3634, sceKernelPollEvent); + //REG_FUNC(0x603AB770, sceKernelCancelEvent); + //REG_FUNC(0x10586418, sceKernelWaitMultipleEvents); + //REG_FUNC(0x4263DBC9, sceKernelWaitMultipleEventsCB); + //REG_FUNC(0x8516D040, sceKernelCreateEventFlag); + //REG_FUNC(0x11FE9B8B, sceKernelDeleteEventFlag); + //REG_FUNC(0xE04EC73A, sceKernelOpenEventFlag); + //REG_FUNC(0x9C0B8285, sceKernelCloseEventFlag); + //REG_FUNC(0x83C0E2AF, sceKernelWaitEventFlag); + //REG_FUNC(0xE737B1DF, sceKernelWaitEventFlagCB); + //REG_FUNC(0x1FBB0FE1, sceKernelPollEventFlag); + //REG_FUNC(0x2A12D9B7, sceKernelCancelEventFlag); + //REG_FUNC(0x8BA4C0C1, sceKernelGetEventFlagInfo); + //REG_FUNC(0x9EF9C0C5, sceKernelSetEventFlag); + //REG_FUNC(0xD018793F, sceKernelClearEventFlag); + //REG_FUNC(0x297AA2AE, sceKernelCreateSema); + //REG_FUNC(0xC08F5BC5, sceKernelDeleteSema); + //REG_FUNC(0xB028AB78, sceKernelOpenSema); + //REG_FUNC(0x817707AB, sceKernelCloseSema); + //REG_FUNC(0xC7B834B, sceKernelWaitSema); + //REG_FUNC(0x174692B4, sceKernelWaitSemaCB); + //REG_FUNC(0x66D6BF05, sceKernelCancelSema); + //REG_FUNC(0x595D3FA6, sceKernelGetSemaInfo); + //REG_FUNC(0x3012A9C6, sceKernelPollSema); + //REG_FUNC(0x2053A496, sceKernelSignalSema); + //REG_FUNC(0xED53334A, sceKernelCreateMutex); + //REG_FUNC(0x12D11F65, sceKernelDeleteMutex); + //REG_FUNC(0x16B85235, sceKernelOpenMutex); + //REG_FUNC(0x43DDC9CC, sceKernelCloseMutex); + //REG_FUNC(0x1D8D7945, sceKernelLockMutex); + //REG_FUNC(0x2BDAA524, sceKernelLockMutexCB); + //REG_FUNC(0x2144890D, sceKernelCancelMutex); + //REG_FUNC(0x9A6C43CA, sceKernelGetMutexInfo); + //REG_FUNC(0xE5901FF9, sceKernelTryLockMutex); + //REG_FUNC(0x34746309, sceKernelUnlockMutex); + //REG_FUNC(0x50572FDA, sceKernelCreateCond); + //REG_FUNC(0xFD295414, sceKernelDeleteCond); + //REG_FUNC(0xCB2A73A9, sceKernelOpenCond); + //REG_FUNC(0x4FB91A89, sceKernelCloseCond); + //REG_FUNC(0xC88D44AD, sceKernelWaitCond); + //REG_FUNC(0x4CE42CE2, sceKernelWaitCondCB); + //REG_FUNC(0x6864DCE2, sceKernelGetCondInfo); + //REG_FUNC(0x10A4976F, sceKernelSignalCond); + //REG_FUNC(0x2EB86929, sceKernelSignalCondAll); + //REG_FUNC(0x87629E6, sceKernelSignalCondTo); + //REG_FUNC(0xA10C1C8, sceKernelCreateMsgPipe); + //REG_FUNC(0x69F6575D, sceKernelDeleteMsgPipe); + //REG_FUNC(0x230691DA, sceKernelOpenMsgPipe); + //REG_FUNC(0x7E5C0C16, sceKernelCloseMsgPipe); + //REG_FUNC(0x94D506F7, sceKernelSendMsgPipeVector); + //REG_FUNC(0x9C6F7F79, sceKernelSendMsgPipeVectorCB); + //REG_FUNC(0x60DB346F, sceKernelTrySendMsgPipeVector); + //REG_FUNC(0x9F899087, sceKernelReceiveMsgPipeVector); + //REG_FUNC(0xBE5B3E27, sceKernelReceiveMsgPipeVectorCB); + //REG_FUNC(0x86ECC0FF, sceKernelTryReceiveMsgPipeVector); + //REG_FUNC(0xEF14BA37, sceKernelCancelMsgPipe); + //REG_FUNC(0x4046D16B, sceKernelGetMsgPipeInfo); + //REG_FUNC(0xDA6EC8EF, sceKernelCreateLwMutex); + //REG_FUNC(0x244E76D2, sceKernelDeleteLwMutex); + //REG_FUNC(0x4846613D, sceKernelGetLwMutexInfoById); + //REG_FUNC(0x48C7EAE6, sceKernelCreateLwCond); + //REG_FUNC(0x721F6CB3, sceKernelDeleteLwCond); + //REG_FUNC(0xE1878282, sceKernelWaitLwCond); + //REG_FUNC(0x8FA54B07, sceKernelWaitLwCondCB); + //REG_FUNC(0x3AC63B9A, sceKernelSignalLwCond); + //REG_FUNC(0xE5241A0C, sceKernelSignalLwCondAll); + //REG_FUNC(0xFC1A48EB, sceKernelSignalLwCondTo); + //REG_FUNC(0xE4DF36A0, sceKernelGetLwCondInfo); + //REG_FUNC(0x971F1DE8, sceKernelGetLwCondInfoById); + //REG_FUNC(0x2255B2A5, sceKernelCreateTimer); + //REG_FUNC(0x746F3290, sceKernelDeleteTimer); + //REG_FUNC(0x2F3D35A3, sceKernelOpenTimer); + //REG_FUNC(0x17283DE6, sceKernelCloseTimer); + //REG_FUNC(0x1478249B, sceKernelStartTimer); + //REG_FUNC(0x75B1329, sceKernelStopTimer); + //REG_FUNC(0x1F59E04D, sceKernelGetTimerBase); + //REG_FUNC(0x3223CCD1, sceKernelGetTimerBaseWide); + //REG_FUNC(0x381DC300, sceKernelGetTimerTime); + //REG_FUNC(0x53C5D833, sceKernelGetTimerTimeWide); + //REG_FUNC(0xFFAD717F, sceKernelSetTimerTime); + //REG_FUNC(0xAF67678B, sceKernelSetTimerTimeWide); + //REG_FUNC(0x621D293B, sceKernelSetTimerEvent); + //REG_FUNC(0x9CCF768C, sceKernelCancelTimer); + //REG_FUNC(0x7E35E10A, sceKernelGetTimerInfo); + //REG_FUNC(0x8667951D, sceKernelCreateRWLock); + //REG_FUNC(0x3D750204, sceKernelDeleteRWLock); + //REG_FUNC(0xBA4DAC9A, sceKernelOpenRWLock); + //REG_FUNC(0xA7F94E64, sceKernelCloseRWLock); + //REG_FUNC(0xFA670F0F, sceKernelLockReadRWLock); + //REG_FUNC(0x2D4A62B7, sceKernelLockReadRWLockCB); + //REG_FUNC(0x1B8586C0, sceKernelTryLockReadRWLock); + //REG_FUNC(0x675D10A8, sceKernelUnlockReadRWLock); + //REG_FUNC(0x67A187BB, sceKernelLockWriteRWLock); + //REG_FUNC(0xA4777082, sceKernelLockWriteRWLockCB); + //REG_FUNC(0x597D4607, sceKernelTryLockWriteRWLock); + //REG_FUNC(0xD9369DF2, sceKernelUnlockWriteRWLock); + //REG_FUNC(0x190CA94B, sceKernelCancelRWLock); + //REG_FUNC(0x79A573B, sceKernelGetRWLockInfo); + //REG_FUNC(0x8AF15B5F, sceKernelGetSystemTime); + //REG_FUNC(0x99B2BF15, sceKernelPMonThreadGetCounter); + //REG_FUNC(0x7C21C961, sceKernelPMonCpuGetCounter); + //REG_FUNC(0xADCA94E5, sceKernelWaitSignal); + //REG_FUNC(0x24460BB3, sceKernelWaitSignalCB); + //REG_FUNC(0x7BE9C4C8, sceKernelSendSignal); + REG_FUNC(0xC5C11EE7, sceKernelCreateThread); + //REG_FUNC(0x6C60AC61, sceIoOpen); + //REG_FUNC(0xF5C6F098, sceIoClose); + //REG_FUNC(0x713523E1, sceIoRead); + //REG_FUNC(0x11FED231, sceIoWrite); + //REG_FUNC(0x99BA173E, sceIoLseek); + //REG_FUNC(0x5CC983AC, sceIoLseek32); + //REG_FUNC(0xE20ED0F3, sceIoRemove); + //REG_FUNC(0xF737E369, sceIoRename); + //REG_FUNC(0x9670D39F, sceIoMkdir); + //REG_FUNC(0xE9F91EC8, sceIoRmdir); + //REG_FUNC(0xA9283DD0, sceIoDopen); + //REG_FUNC(0x9DFF9C59, sceIoDclose); + //REG_FUNC(0x9C8B6624, sceIoDread); + //REG_FUNC(0xBCA5B623, sceIoGetstat); + //REG_FUNC(0x29482F7F, sceIoChstat); + //REG_FUNC(0x98ACED6D, sceIoSync); + //REG_FUNC(0x4B30CB2, sceIoDevctl); + //REG_FUNC(0x54ABACFA, sceIoIoctl); + //REG_FUNC(0x6A7EA9FD, sceIoOpenAsync); + //REG_FUNC(0x84201C9B, sceIoCloseAsync); + //REG_FUNC(0x7B3BE857, sceIoReadAsync); + //REG_FUNC(0x21329B20, sceIoWriteAsync); + //REG_FUNC(0xCAC5D672, sceIoLseekAsync); + //REG_FUNC(0x99C54B9, sceIoIoctlAsync); + //REG_FUNC(0x446A60AC, sceIoRemoveAsync); + //REG_FUNC(0x73FC184B, sceIoDopenAsync); + //REG_FUNC(0x4D0597D7, sceIoDcloseAsync); + //REG_FUNC(0xCE32490D, sceIoDreadAsync); + //REG_FUNC(0x8E5FCBB1, sceIoMkdirAsync); + //REG_FUNC(0x9694D00F, sceIoRmdirAsync); + //REG_FUNC(0xEE9857CD, sceIoRenameAsync); + //REG_FUNC(0x9739A5E2, sceIoChstatAsync); + //REG_FUNC(0x82B20B41, sceIoGetstatAsync); + //REG_FUNC(0x950F78EB, sceIoDevctlAsync); + //REG_FUNC(0xF7C7FBFE, sceIoSyncAsync); + //REG_FUNC(0xEC96EA71, sceIoCancel); + //REG_FUNC(0x857E0C71, sceIoComplete); + //REG_FUNC(0x52315AD7, sceIoPread); + //REG_FUNC(0x8FFFF5A8, sceIoPwrite); + //REG_FUNC(0xA010141E, sceIoPreadAsync); + //REG_FUNC(0xED25BEEF, sceIoPwriteAsync); + //REG_FUNC(0xA792C404, sceIoCompleteMultiple); + //REG_FUNC(0x894037E8, sceKernelBacktrace); + //REG_FUNC(0x20E2D4B7, sceKernelPrintBacktrace); + //REG_FUNC(0x963F4A99, sceSblACMgrIsGameProgram); + //REG_FUNC(0x261E2C34, sceKernelGetOpenPsId); + + /* SceModulemgr */ + //REG_FUNC(0x36585DAF, sceKernelGetModuleInfo); + //REG_FUNC(0x2EF2581F, sceKernelGetModuleList); + //REG_FUNC(0xF5798C7C, sceKernelGetModuleIdByAddr); + + /* SceProcessmgr */ + //REG_FUNC(0xCD248267, sceKernelGetCurrentProcess); + //REG_FUNC(0x2252890C, sceKernelPowerTick); + //REG_FUNC(0x9E45DA09, sceKernelLibcClock); + //REG_FUNC(0x39BE45, sceKernelLibcTime); + //REG_FUNC(0x4B879059, sceKernelLibcGettimeofday); + //REG_FUNC(0xC1727F59, sceKernelGetStdin); + //REG_FUNC(0xE5AA625C, sceKernelGetStdout); + //REG_FUNC(0xFA5E3ADA, sceKernelGetStderr); + //REG_FUNC(0xE6E9FCA3, sceKernelGetRemoteProcessTime); + //REG_FUNC(0xD37A8437, sceKernelGetProcessTime); + //REG_FUNC(0xF5D0D4C6, sceKernelGetProcessTimeLow); + //REG_FUNC(0x89DA0967, sceKernelGetProcessTimeWide); + //REG_FUNC(0x2BE3E066, sceKernelGetProcessParam); + + /* SceStdio */ + //REG_FUNC(0x54237407, sceKernelStdin); + //REG_FUNC(0x9033E9BD, sceKernelStdout); + //REG_FUNC(0x35EE7CF5, sceKernelStderr); + + /* SceSysmem */ + //REG_FUNC(0xB9D5EBDE, sceKernelAllocMemBlock); + //REG_FUNC(0xA91E15EE, sceKernelFreeMemBlock); + //REG_FUNC(0xB8EF5818, sceKernelGetMemBlockBase); + //REG_FUNC(0x3B29E0F5, sceKernelRemapMemBlock); + //REG_FUNC(0xA33B99D1, sceKernelFindMemBlockByAddr); + //REG_FUNC(0x4010AD65, sceKernelGetMemBlockInfoByAddr); + + /* SceCpu */ + //REG_FUNC(0x2704CFEE, sceKernelCpuId); + + /* SceDipsw */ + //REG_FUNC(0x1C783FB2, sceKernelCheckDipsw); + //REG_FUNC(0x817053D4, sceKernelSetDipsw); + //REG_FUNC(0x800EDCC1, sceKernelClearDipsw); + + /* SceThreadmgr */ + //REG_FUNC(0xC8A38E1, sceKernelExitThread); + //REG_FUNC(0x1D17DECF, sceKernelExitDeleteThread); + //REG_FUNC(0x4B675D05, sceKernelDelayThread); + //REG_FUNC(0x9C0180E1, sceKernelDelayThreadCB); + //REG_FUNC(0x1173F8, sceKernelChangeActiveCpuMask); + //REG_FUNC(0x1414F0B, sceKernelGetThreadCurrentPriority); + //REG_FUNC(0x751C9B7A, sceKernelChangeCurrentThreadAttr); + //REG_FUNC(0xD9BD74EB, sceKernelCheckWaitableStatus); + //REG_FUNC(0x9DCB4B7A, sceKernelGetProcessId); + //REG_FUNC(0xE53E41F6, sceKernelCheckCallback); + //REG_FUNC(0xF4EE4FA9, sceKernelGetSystemTimeWide); + //REG_FUNC(0x47F6DE49, sceKernelGetSystemTimeLow); + //REG_FUNC(0xC0FAF6A3, sceKernelCreateThreadForUser); + + /* SceDebugLed */ + //REG_FUNC(0x78E702D3, sceKernelSetGPO); + + return psv_log_base("sceLibKernel"); +}(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp new file mode 100644 index 0000000000..bf6646c7fa --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibc.cpp @@ -0,0 +1,352 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base sceLibc; + +namespace sce_libc_func +{ + void __cxa_atexit() + { + sceLibc.Todo(__FUNCTION__); + Emu.Pause(); + } + + void exit() + { + sceLibc.Error("exit()"); + Emu.Pause(); + + sceLibc.Success("Process finished"); + CallAfter([]() + { + Emu.Stop(); + }); + } + + void printf(vm::psv::ptr fmt) + { + sceLibc.Error("printf(fmt_addr=0x%x)", fmt.addr()); + + LOG_NOTICE(TTY, "%s", fmt.get_ptr()); + } + + void __cxa_set_dso_handle_main() + { + sceLibc.Error("__cxa_set_dso_handle_main()"); + } + + void memcpy(vm::psv::ptr dst, vm::psv::ptr src, u32 size) + { + sceLibc.Error("memcpy(dst_addr=0x%x, src_addr=0x%x, size=0x%x)", dst.addr(), src.addr(), size); + + ::memcpy(dst.get_ptr(), src.get_ptr(), size); + } + + void _Assert() + { + sceLibc.Todo(__FUNCTION__); + Emu.Pause(); + } +} + +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibc, #name, &sce_libc_func::name) + +psv_log_base sceLibc = []() -> psv_log_base +{ + REG_FUNC(0xE4531F85, _Assert); + //REG_FUNC(0xE71C5CDE, _Stoul); + //REG_FUNC(0x7A5CA6A3, _Stoulx); + //REG_FUNC(0x6794B3C6, _Stoull); + //REG_FUNC(0xD00F68FD, _Stoullx); + //REG_FUNC(0xBF94193B, _Stod); + //REG_FUNC(0x6798AA28, _Stodx); + //REG_FUNC(0x784D8D95, _Stof); + //REG_FUNC(0x99A49A62, _Stofx); + //REG_FUNC(0x5AE9FFD8, _Stold); + //REG_FUNC(0x448A3CBE, _Stoldx); + //REG_FUNC(0x6B9E23FE, _Stoll); + //REG_FUNC(0x0D9E3B1C, _Stollx); + //REG_FUNC(0x52DDCDAF, _Stolx); + //REG_FUNC(0x76904D60, _Wctomb); + //REG_FUNC(0x5E56EA4E, _Mbtowc); + //REG_FUNC(0xDEC462AB, _FCbuild); + //REG_FUNC(0x9E248B76, _sceLibcErrnoLoc); + //REG_FUNC(0xA2F50E9E, _Fltrounds); + //REG_FUNC(0x7CC1B964, isalnum); + //REG_FUNC(0x94A89A00, isalpha); + //REG_FUNC(0xF894ECCB, isblank); + //REG_FUNC(0x13F4A8C8, iscntrl); + //REG_FUNC(0xEB93BC93, isdigit); + //REG_FUNC(0xDFEEFB1A, isgraph); + //REG_FUNC(0x465B93F1, islower); + //REG_FUNC(0xB7F87C4D, isprint); + //REG_FUNC(0x82C1E3FD, ispunct); + //REG_FUNC(0x18F2A715, isspace); + //REG_FUNC(0xF2012814, isupper); + //REG_FUNC(0x3B561695, isxdigit); + //REG_FUNC(0x83F73C88, tolower); + //REG_FUNC(0x1218642B, toupper); + //REG_FUNC(0x1118B49F, imaxabs); + //REG_FUNC(0x5766B4A8, imaxdiv); + //REG_FUNC(0xB45FD61E, strtoimax); + //REG_FUNC(0xB318952F, strtoumax); + //REG_FUNC(0x3F2D104F, wcstoimax); + //REG_FUNC(0xB9E511B4, wcstoumax); + //REG_FUNC(0xCEF7C575, mspace_create); + //REG_FUNC(0x30CBBC66, mspace_destroy); + //REG_FUNC(0xE080B96E, mspace_malloc); + //REG_FUNC(0x3CDFD2A3, mspace_free); + //REG_FUNC(0x30470BBA, mspace_calloc); + //REG_FUNC(0x52F780DD, mspace_memalign); + //REG_FUNC(0x4633134A, mspace_realloc); + //REG_FUNC(0x915DA59E, mspace_reallocalign); + //REG_FUNC(0x7AD7A737, mspace_malloc_usable_size); + //REG_FUNC(0x8D2A14C4, mspace_malloc_stats); + //REG_FUNC(0x2FF5D5BB, mspace_malloc_stats_fast); + //REG_FUNC(0xF355F381, mspace_is_heap_empty); + //REG_FUNC(0x50B326CE, setjmp); + //REG_FUNC(0x2D81C8C8, longjmp); + //REG_FUNC(0x72BA4468, clearerr); + //REG_FUNC(0xEC97321C, fclose); + //REG_FUNC(0xB2F318FE, fdopen); + //REG_FUNC(0xBF96AD71, feof); + //REG_FUNC(0xB724BFC1, ferror); + //REG_FUNC(0x5AAD2996, fflush); + //REG_FUNC(0x672C58E0, fgetc); + //REG_FUNC(0x3CDA3118, fgetpos); + //REG_FUNC(0xBA14322F, fgets); + //REG_FUNC(0xFEC1502E, fileno); + //REG_FUNC(0xFFFBE239, fopen); + //REG_FUNC(0xE0C79764, fprintf); + //REG_FUNC(0x7E6A6108, fputc); + //REG_FUNC(0xC8FF13E5, fputs); + //REG_FUNC(0xB31C73A9, fread); + //REG_FUNC(0x715C4395, freopen); + //REG_FUNC(0x505601C6, fscanf); + //REG_FUNC(0xC3A7CDE1, fseek); + //REG_FUNC(0xDC1BDBD7, fsetpos); + //REG_FUNC(0x41C2AF95, ftell); + //REG_FUNC(0x8BCDCC4E, fwrite); + //REG_FUNC(0x4BD5212E, getc); + //REG_FUNC(0x4790BF1E, getchar); + //REG_FUNC(0xF97B8CA3, gets); + //REG_FUNC(0x4696E7BE, perror); + REG_FUNC(0x9a004680, printf); + //REG_FUNC(0x995708A6, putc); + //REG_FUNC(0x7CDAC89C, putchar); + //REG_FUNC(0x59C3E171, puts); + //REG_FUNC(0x40293B75, remove); + //REG_FUNC(0x6FE983A3, rename); + //REG_FUNC(0x6CA5BAB9, rewind); + //REG_FUNC(0x9CB9D899, scanf); + //REG_FUNC(0x395490DA, setbuf); + //REG_FUNC(0x2CA980A0, setvbuf); + //REG_FUNC(0xA1BFF606, snprintf); + //REG_FUNC(0x7449B359, sprintf); + //REG_FUNC(0xEC585241, sscanf); + //REG_FUNC(0x2BCB3F01, ungetc); + //REG_FUNC(0xF7915685, vfprintf); + //REG_FUNC(0xF137771A, vfscanf); + //REG_FUNC(0xE7B5E23E, vprintf); + //REG_FUNC(0x0E9BD318, vscanf); + //REG_FUNC(0xFE83F2E4, vsnprintf); + //REG_FUNC(0x802FDDF9, vsprintf); + //REG_FUNC(0xA9889307, vsscanf); + //REG_FUNC(0x20FE0FFF, abort); + //REG_FUNC(0x8E5A06C5, abs); + //REG_FUNC(0xD500DE27, atof); + //REG_FUNC(0x21493BE7, atoi); + //REG_FUNC(0xA1DBEE9F, atol); + //REG_FUNC(0x875994F3, atoll); + //REG_FUNC(0xD1BC28E7, bsearch); + //REG_FUNC(0xE9F823C0, div); + REG_FUNC(0x826bbbaf, exit); + //REG_FUNC(0xB53B345B, _Exit); + //REG_FUNC(0xBCEA304B, labs); + //REG_FUNC(0x9D2D17CD, llabs); + //REG_FUNC(0xD63330DA, ldiv); + //REG_FUNC(0x3F887699, lldiv); + //REG_FUNC(0x3E347849, mblen); + //REG_FUNC(0x2F75CF9B, mbstowcs); + //REG_FUNC(0xD791A952, mbtowc); + //REG_FUNC(0xA7CBE4A6, qsort); + //REG_FUNC(0x6CA88B08, strtod); + //REG_FUNC(0x6CB8540E, strtof); + //REG_FUNC(0x181827ED, strtol); + //REG_FUNC(0x48C684B2, strtold); + //REG_FUNC(0x39B7E681, strtoll); + //REG_FUNC(0xF34AE312, strtoul); + //REG_FUNC(0xE0E12333, strtoull); + //REG_FUNC(0x9A8F7FC0, wcstombs); + //REG_FUNC(0x6489B5E4, wctomb); + //REG_FUNC(0xC0883865, rand); + //REG_FUNC(0x3AAD41B0, srand); + //REG_FUNC(0x962097AA, rand_r); + //REG_FUNC(0x775A0CB2, malloc); + //REG_FUNC(0xE7EC3D0B, calloc); + //REG_FUNC(0x006B54BA, realloc); + //REG_FUNC(0x5B9BB802, free); + //REG_FUNC(0xA9363E6B, memalign); + //REG_FUNC(0x608AC135, reallocalign); + //REG_FUNC(0x57A729DB, malloc_stats); + //REG_FUNC(0xB3D29DE1, malloc_stats_fast); + //REG_FUNC(0x54A54EB1, malloc_usable_size); + //REG_FUNC(0x2F3E5B16, memchr); + //REG_FUNC(0x7747F6D7, memcmp); + REG_FUNC(0x7205BFDB, memcpy); + //REG_FUNC(0xAF5C218D, memmove); + //REG_FUNC(0x6DC1F0D8, memset); + //REG_FUNC(0x1434FA46, strcat); + //REG_FUNC(0xB9336E16, strchr); + //REG_FUNC(0x1B58FA3B, strcmp); + //REG_FUNC(0x46AE2311, strcoll); + //REG_FUNC(0x85B924B7, strcpy); + //REG_FUNC(0x0E29D27A, strcspn); + //REG_FUNC(0x1E9D6335, strerror); + //REG_FUNC(0x8AECC873, strlen); + //REG_FUNC(0xFBA69BC2, strncat); + //REG_FUNC(0xE4299DCB, strncmp); + //REG_FUNC(0x9F87712D, strncpy); + //REG_FUNC(0x68C307B6, strpbrk); + //REG_FUNC(0xCEFDD143, strrchr); + //REG_FUNC(0x4203B663, strspn); + //REG_FUNC(0x0D5200CB, strstr); + //REG_FUNC(0x0289B8B3, strtok); + //REG_FUNC(0x4D023DE9, strxfrm); + //REG_FUNC(0xEB31926D, strtok_r); + //REG_FUNC(0xFF6F77C7, strdup); + //REG_FUNC(0x184C4B07, strcasecmp); + //REG_FUNC(0xAF1CA2F1, strncasecmp); + //REG_FUNC(0xC94AE948, asctime); + //REG_FUNC(0xC082CA03, clock); + //REG_FUNC(0x1EA1CA8D, ctime); + //REG_FUNC(0x33AD70A0, difftime); + //REG_FUNC(0xF283CFE3, gmtime); + //REG_FUNC(0xF4A2E0BF, localtime); + //REG_FUNC(0xD1A2DFC3, mktime); + //REG_FUNC(0xEEB76FED, strftime); + //REG_FUNC(0xDAE8D60F, time); + //REG_FUNC(0xEFB3BC61, btowc); + //REG_FUNC(0x1D1DA5AD, _Btowc); + //REG_FUNC(0x89541CA5, fgetwc); + //REG_FUNC(0x982AFA4D, fgetws); + //REG_FUNC(0xA597CDC8, fputwc); + //REG_FUNC(0xB755927C, fputws); + //REG_FUNC(0xA77327D2, fwide); + //REG_FUNC(0xE52278E8, fwprintf); + //REG_FUNC(0x7BFC75C6, fwscanf); + //REG_FUNC(0x23E0F442, getwc); + //REG_FUNC(0x55DB4E32, getwchar); + //REG_FUNC(0x1927CAE8, mbrlen); + //REG_FUNC(0x910664C3, mbrtowc); + //REG_FUNC(0x961D12F8, mbsinit); + //REG_FUNC(0x9C14D58E, mbsrtowcs); + //REG_FUNC(0x247C71A6, putwc); + //REG_FUNC(0x3E04AB1C, putwchar); + //REG_FUNC(0x1B581BEB, swprintf); + //REG_FUNC(0xE1D2AE42, swscanf); + //REG_FUNC(0x39334D9C, ungetwc); + //REG_FUNC(0x36BF1E06, vfwprintf); + //REG_FUNC(0x37A563BE, vfwscanf); + //REG_FUNC(0x572DAB57, vswprintf); + //REG_FUNC(0x9451EE20, vswscanf); + //REG_FUNC(0x0A451B11, vwprintf); + //REG_FUNC(0xAD0C43DC, vwscanf); + //REG_FUNC(0xD9FF289D, wcrtomb); + //REG_FUNC(0x2F990FF9, wcscat); + //REG_FUNC(0xC1587971, wcschr); + //REG_FUNC(0xF42128B9, wcscmp); + //REG_FUNC(0x8EC70609, wcscoll); + //REG_FUNC(0x8AAADD56, wcscpy); + //REG_FUNC(0x25F7E46A, wcscspn); + //REG_FUNC(0x74136BC1, wcsftime); + //REG_FUNC(0xA778A14B, wcslen); + //REG_FUNC(0x196AB9F2, wcsncat); + //REG_FUNC(0xAAA6AAA2, wcsncmp); + //REG_FUNC(0x62E9B2D5, wcsncpy); + //REG_FUNC(0x07F229DB, wcspbrk); + //REG_FUNC(0xDF806521, wcsrchr); + //REG_FUNC(0xD8889FC8, wcsrtombs); + //REG_FUNC(0x5F5AA692, wcsspn); + //REG_FUNC(0x5BE328EE, wcsstr); + //REG_FUNC(0x35D7F1B1, wcstod); + //REG_FUNC(0x322243A8, _WStod); + //REG_FUNC(0x64123137, wcstof); + //REG_FUNC(0x340AF0F7, _WStof); + //REG_FUNC(0xA17C24A3, wcstok); + //REG_FUNC(0xFBEB657E, wcstol); + //REG_FUNC(0x2D7C3A7A, wcstold); + //REG_FUNC(0x1EDA8F09, _WStold); + //REG_FUNC(0x6EEFB7D7, wcstoll); + //REG_FUNC(0xACF13D54, wcstoul); + //REG_FUNC(0x87C94271, _WStoul); + //REG_FUNC(0xCBFF8200, wcstoull); + //REG_FUNC(0xF6069AFD, wcsxfrm); + //REG_FUNC(0x704321CC, wctob); + //REG_FUNC(0x2F0C81A6, _Wctob); + //REG_FUNC(0x7A08BE70, wmemchr); + //REG_FUNC(0x9864C99F, wmemcmp); + //REG_FUNC(0xD9F9DDCD, wmemcpy); + //REG_FUNC(0x53F7EB4B, wmemmove); + //REG_FUNC(0x4D04A480, wmemset); + //REG_FUNC(0xBF2F5FCE, wprintf); + //REG_FUNC(0xADC32204, wscanf); + //REG_FUNC(0x7E811AF2, iswalnum); + //REG_FUNC(0xC5ECB7B6, iswalpha); + //REG_FUNC(0xC8FC4BBE, iswblank); + //REG_FUNC(0xC30AE3C7, iswcntrl); + //REG_FUNC(0x9E348712, iswctype); + //REG_FUNC(0xC37DB2C2, iswdigit); + //REG_FUNC(0x70632234, iswgraph); + //REG_FUNC(0x40F84B7D, iswlower); + //REG_FUNC(0xF52F9241, iswprint); + //REG_FUNC(0x3922B91A, iswpunct); + //REG_FUNC(0x2BDA4905, iswspace); + //REG_FUNC(0x9939E1AD, iswupper); + //REG_FUNC(0x82FCEFA4, iswxdigit); + //REG_FUNC(0x09C38DE4, towlower); + //REG_FUNC(0xCF77D465, towctrans); + //REG_FUNC(0xCACE34B9, towupper); + //REG_FUNC(0xE8270951, wctrans); + //REG_FUNC(0xA967B88D, wctype); + //REG_FUNC(0x9D885076, _Towctrans); + //REG_FUNC(0xE980110A, _Iswctype); + REG_FUNC(0x33b83b70, __cxa_atexit); + //REG_FUNC(0xEDC939E1, __aeabi_atexit); + //REG_FUNC(0xB538BF48, __cxa_finalize); + //REG_FUNC(0xD0310E31, __cxa_guard_acquire); + //REG_FUNC(0x4ED1056F, __cxa_guard_release); + //REG_FUNC(0xD18E461D, __cxa_guard_abort); + REG_FUNC(0xbfe02b3a, __cxa_set_dso_handle_main); + //REG_FUNC(0x64DA2C47, _Unlocksyslock); + //REG_FUNC(0x7DBC0575, _Locksyslock); + //REG_FUNC(0x5044FC32, _Lockfilelock); + //REG_FUNC(0xFD5DD98C, _Unlockfilelock); + //REG_FUNC(0x1EFFBAC2, __set_exidx_main); + //REG_FUNC(0x855FC605, _Files); + //REG_FUNC(0x66B7406C, _Stdin); + //REG_FUNC(0x5D8C1282, _Stdout); + //REG_FUNC(0xDDF9BB09, _Stderr); + //REG_FUNC(0x3CE6109D, _Ctype); + //REG_FUNC(0x36878958, _Touptab); + //REG_FUNC(0xD662E07C, _Tolotab); + //REG_FUNC(0xE5620A03, _Flt); + //REG_FUNC(0x338FE545, _Dbl); + //REG_FUNC(0x94CE931C, _Ldbl); + //REG_FUNC(0xF708906E, _Denorm); + //REG_FUNC(0x01B05132, _FDenorm); + //REG_FUNC(0x2C8DBEB7, _LDenorm); + //REG_FUNC(0x710B5F33, _Inf); + //REG_FUNC(0x8A0F308C, _FInf); + //REG_FUNC(0x5289BBC0, _LInf); + //REG_FUNC(0x116F3DA9, _Nan); + //REG_FUNC(0x415162DD, _FNan); + //REG_FUNC(0x036D0F07, _LNan); + //REG_FUNC(0x677CDE35, _Snan); + //REG_FUNC(0x7D35108B, _FSnan); + //REG_FUNC(0x48AEEF2A, _LSnan); + + return psv_log_base("SceLibc"); +}(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp new file mode 100644 index 0000000000..30fcde88cb --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibm.cpp @@ -0,0 +1,217 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base sceLibm; + +namespace sce_libm_func +{ + +} + +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibm, #name, &sce_libm_func::name) + +psv_log_base sceLibm = []() -> psv_log_base +{ + //REG_FUNC(0xC73FE76D, _Exp); + //REG_FUNC(0xFF4EAE04, _FExp); + //REG_FUNC(0xB363D7D4, _LExp); + //REG_FUNC(0xD72B5ACB, acos); + //REG_FUNC(0x27EAB8C1, acosf); + //REG_FUNC(0x1C053D0F, acosh); + //REG_FUNC(0x568ECFB0, acoshf); + //REG_FUNC(0xD3D6D36E, acoshl); + //REG_FUNC(0x3210F395, acosl); + //REG_FUNC(0x4016B2E6, asin); + //REG_FUNC(0x3A3E5424, asinf); + //REG_FUNC(0x7C93F1DD, asinh); + //REG_FUNC(0x285AEDEA, asinhf); + //REG_FUNC(0x9496E15E, asinhl); + //REG_FUNC(0x1724A81D, asinl); + //REG_FUNC(0x516D9970, atan); + //REG_FUNC(0xC9BE3F05, atan2); + //REG_FUNC(0x4E09DD53, atan2f); + //REG_FUNC(0xCE325597, atan2l); + //REG_FUNC(0xD78FC94E, atanf); + //REG_FUNC(0x434BCE01, atanh); + //REG_FUNC(0xC7B0AFBA, atanhf); + //REG_FUNC(0x6A6881A6, atanhl); + //REG_FUNC(0xD423A4AB, atanl); + //REG_FUNC(0xACC0DC5A, cbrt); + //REG_FUNC(0xD1699F4D, cbrtf); + //REG_FUNC(0x342F9501, cbrtl); + //REG_FUNC(0x63F05BD6, ceil); + //REG_FUNC(0x6BBFEC89, ceilf); + //REG_FUNC(0x48082D81, ceill); + //REG_FUNC(0xB918D13, copysign); + //REG_FUNC(0x16EB9E63, copysignf); + //REG_FUNC(0x19DFC0AA, copysignl); + //REG_FUNC(0x61D0244, cos); + //REG_FUNC(0x127F8302, cosf); + //REG_FUNC(0x89B9BE1F, cosl); + //REG_FUNC(0x110195E7, cosh); + //REG_FUNC(0x61DE0770, coshf); + //REG_FUNC(0x7EADDC5E, coshl); + //REG_FUNC(0x4B84C012, _Cosh); + //REG_FUNC(0x15993458, erf); + //REG_FUNC(0x524AEBFE, erfc); + //REG_FUNC(0x301F113, erfcf); + //REG_FUNC(0xD4C92471, erfcl); + //REG_FUNC(0x41DD1AB8, erff); + //REG_FUNC(0xFD431619, erfl); + //REG_FUNC(0xEB027358, exp); + //REG_FUNC(0x9B18F38F, exp2); + //REG_FUNC(0x79415BD3, exp2f); + //REG_FUNC(0x40053307, exp2l); + //REG_FUNC(0x56473BC7, expf); + //REG_FUNC(0xA71A81AA, expl); + //REG_FUNC(0x2A97A75F, expm1); + //REG_FUNC(0x64131D7B, expm1f); + //REG_FUNC(0x8BF1866C, expm1l); + //REG_FUNC(0x3E672BE3, fabs); + //REG_FUNC(0x75348906, fabsf); + //REG_FUNC(0x3ECA514, fabsl); + //REG_FUNC(0xA278B20D, _FCosh); + //REG_FUNC(0xD6FD5A2E, fdim); + //REG_FUNC(0x8B6CC137, fdimf); + //REG_FUNC(0xE6988B7B, fdiml); + //REG_FUNC(0xD5BD8D5C, _FLog); + //REG_FUNC(0x22BB8237, floor); + //REG_FUNC(0xCD7C05BD, floorf); + //REG_FUNC(0xFDFA4558, floorl); + //REG_FUNC(0x1EACA585, fma); + //REG_FUNC(0xB61672A7, fmaf); + //REG_FUNC(0xBCF6EA7C, fmal); + //REG_FUNC(0xBE30CC1E, fmax); + //REG_FUNC(0x7004FA75, fmaxf); + //REG_FUNC(0xBF5AF69E, fmaxl); + //REG_FUNC(0x2ABBDFF7, fmin); + //REG_FUNC(0x7673CC1E, fminf); + //REG_FUNC(0xE2F5A0F0, fminl); + //REG_FUNC(0x798587E4, fmod); + //REG_FUNC(0x1CD8F88E, fmodf); + //REG_FUNC(0x986011B4, fmodl); + //REG_FUNC(0x59197427, frexp); + //REG_FUNC(0xA6879AC, frexpf); + //REG_FUNC(0x6DC8D877, frexpl); + //REG_FUNC(0x4A496BC0, _FSin); + //REG_FUNC(0x7FBB4C55, _FSinh); + //REG_FUNC(0x2D2CD795, hypot); + //REG_FUNC(0xA397B929, hypotf); + //REG_FUNC(0x5BFBEE8, hypotl); + //REG_FUNC(0x667EE864, ilogb); + //REG_FUNC(0x80050A43, ilogbf); + //REG_FUNC(0x91298DCA, ilogbl); + //REG_FUNC(0x197C9D5, _LCosh); + //REG_FUNC(0x56061B, ldexp); + //REG_FUNC(0xE61E016, ldexpf); + //REG_FUNC(0x8280A7B1, ldexpl); + //REG_FUNC(0x2480AA54, lgamma); + //REG_FUNC(0x2D9556D5, lgammaf); + //REG_FUNC(0xADEBD201, lgammal); + //REG_FUNC(0x5B05329D, _LLog); + //REG_FUNC(0x7B41AC38, llrint); + //REG_FUNC(0xC1F6135B, llrintf); + //REG_FUNC(0x80558247, llrintl); + //REG_FUNC(0xD1251A18, llround); + //REG_FUNC(0x4595A04, llroundf); + //REG_FUNC(0x9AB5C7AF, llroundl); + //REG_FUNC(0x6037C48F, log); + //REG_FUNC(0x811ED68B, logf); + //REG_FUNC(0xC6FFBCD6, logl); + //REG_FUNC(0x67E99979, _Log); + //REG_FUNC(0x2CBE04D7, log1p); + //REG_FUNC(0xF1D7C851, log1pf); + //REG_FUNC(0x3359152C, log1pl); + //REG_FUNC(0xCF65F098, log10); + //REG_FUNC(0xFD2A3464, log10f); + //REG_FUNC(0x3D7E7201, log10l); + //REG_FUNC(0x73AFEE5F, log2); + //REG_FUNC(0x4095DBDB, log2f); + //REG_FUNC(0x720021A9, log2l); + //REG_FUNC(0x5EAE8AD4, logb); + //REG_FUNC(0x25F51CE, logbf); + //REG_FUNC(0x86C4B75F, logbl); + //REG_FUNC(0x207307D0, lrint); + //REG_FUNC(0xDA903135, lrintf); + //REG_FUNC(0xE8C1F6F8, lrintl); + //REG_FUNC(0xD35AFD56, lround); + //REG_FUNC(0xA24C6453, lroundf); + //REG_FUNC(0x8B3ACA4E, lroundl); + //REG_FUNC(0xB397FE83, _LSin); + //REG_FUNC(0xF247EE99, _LSinh); + //REG_FUNC(0x1167B5D2, modf); + //REG_FUNC(0x5D7A7EB2, modff); + //REG_FUNC(0xD41D68F2, modfl); + //REG_FUNC(0xC3FCA1FA, nan); + //REG_FUNC(0xB4761D24, nanf); + //REG_FUNC(0xBFA96D93, nanl); + //REG_FUNC(0x877187C4, nearbyint); + //REG_FUNC(0xD56E78F6, nearbyintf); + //REG_FUNC(0x8DD794DC, nearbyintl); + //REG_FUNC(0xE1A3D449, nextafter); + //REG_FUNC(0xC8A94A33, nextafterf); + //REG_FUNC(0xEAAB2055, nextafterl); + //REG_FUNC(0x39E605E6, nexttoward); + //REG_FUNC(0xDD652D4E, nexttowardf); + //REG_FUNC(0x41E6AEA4, nexttowardl); + //REG_FUNC(0x640DB443, pow); + //REG_FUNC(0x6DEA815A, powf); + //REG_FUNC(0x96328F3D, powl); + //REG_FUNC(0xE4D6117F, remainder); + //REG_FUNC(0xE6BB3DCF, remainderf); + //REG_FUNC(0x354E568E, remainderl); + //REG_FUNC(0x52337926, remquo); + //REG_FUNC(0xD8F6B5D3, remquof); + //REG_FUNC(0xBB353F24, remquol); + //REG_FUNC(0x943F218F, rint); + //REG_FUNC(0xCACE5A19, rintf); + //REG_FUNC(0xE3C097E0, rintl); + //REG_FUNC(0x64D37996, round); + //REG_FUNC(0xAAF31896, roundf); + //REG_FUNC(0x9AB1B1B1, roundl); + //REG_FUNC(0x8F8CF628, scalbln); + //REG_FUNC(0xDEB0A2D0, scalblnf); + //REG_FUNC(0x2113921E, scalblnl); + //REG_FUNC(0x569758D0, scalbn); + //REG_FUNC(0x78F70588, scalbnf); + //REG_FUNC(0x777C7463, scalbnl); + //REG_FUNC(0xB5519FF0, sin); + //REG_FUNC(0x7F00B590, sinf); + //REG_FUNC(0x3294447C, sinl); + //REG_FUNC(0xD92A7F85, _Sin); + //REG_FUNC(0xF2C0AF49, sinh); + //REG_FUNC(0xB5838E7D, sinhf); + //REG_FUNC(0x4B91F2E6, sinhl); + //REG_FUNC(0x40E42E8E, _Sinh); + //REG_FUNC(0xDA227FCC, sqrt); + //REG_FUNC(0xBA3F6937, sqrtf); + //REG_FUNC(0xC1343477, sqrtl); + //REG_FUNC(0x5BAE40B0, tan); + //REG_FUNC(0xA98E941B, tanf); + //REG_FUNC(0x26CD78CA, tanh); + //REG_FUNC(0xC4847578, tanhf); + //REG_FUNC(0x14F2BEA1, tanhl); + //REG_FUNC(0xDC742A5E, tanl); + //REG_FUNC(0x3A7FE686, tgamma); + //REG_FUNC(0xE6067AC0, tgammaf); + //REG_FUNC(0x2949109F, tgammal); + //REG_FUNC(0x212323E, trunc); + //REG_FUNC(0x90B899F, truncf); + //REG_FUNC(0xBC0F1B1A, truncl); + //REG_FUNC(0x98BBDAE0, _Dclass); + //REG_FUNC(0xBD8EF217, _FDclass); + //REG_FUNC(0x314CCE54, _LDclass); + //REG_FUNC(0xC5B9C8D8, _FDtest); + //REG_FUNC(0x27A55170, _Dtest); + //REG_FUNC(0x8DAE8767, _LDtest); + //REG_FUNC(0x622CBFEE, _Fpcomp); + //REG_FUNC(0x9CD4CEFE, _FFpcomp); + //REG_FUNC(0x18F43CD0, _LFpcomp); + //REG_FUNC(0x5BD0F71C, _Dsign); + //REG_FUNC(0xC4F7E42C, _FDsign); + //REG_FUNC(0x1DF73D2B, _LDsign); + + return psv_log_base("SceLibm"); +}(); diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp new file mode 100644 index 0000000000..7813c8b8a5 --- /dev/null +++ b/rpcs3/Emu/ARMv7/Modules/sceLibstdcxx.cpp @@ -0,0 +1,1933 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "Emu/Memory/Memory.h" +#include "Emu/ARMv7/PSVFuncList.h" + +extern psv_log_base sceLibstdcxx; + +namespace sce_libstdcxx_func +{ + void __aeabi_unwind_cpp_pr0() + { + sceLibstdcxx.Todo(__FUNCTION__); + Emu.Pause(); + } + + void __aeabi_unwind_cpp_pr1() + { + sceLibstdcxx.Todo(__FUNCTION__); + Emu.Pause(); + } + + void __aeabi_unwind_cpp_pr2() + { + sceLibstdcxx.Todo(__FUNCTION__); + Emu.Pause(); + } +} + +#define REG_FUNC(nid, name) reg_psv_func(nid, &sceLibstdcxx, #name, &sce_libstdcxx_func::name) + +psv_log_base sceLibstdcxx = []() -> psv_log_base +{ + //REG_FUNC(0x52B0C625, std::bad_typeid::what() const); + //REG_FUNC(0x64D7D074, std::bad_typeid::_Doraise() const); + //REG_FUNC(0x15FB88E2, std::logic_error::what() const); + //REG_FUNC(0x492D1209, std::logic_error::_Doraise() const); + //REG_FUNC(0xDBDFF9D0, std::range_error::_Doraise() const); + //REG_FUNC(0xE8D59AB5, std::_String_base::_Xlen() const); + //REG_FUNC(0x473DC636, std::_String_base::_Xran() const); + //REG_FUNC(0x481ECB76, std::domain_error::_Doraise() const); + //REG_FUNC(0xB03E909C, std::length_error::_Doraise() const); + //REG_FUNC(0x38CF41AC, std::out_of_range::_Doraise() const); + //REG_FUNC(0x55AE5502, std::_codecvt_base::do_encoding() const); + //REG_FUNC(0x5522293F, std::_codecvt_base::do_max_length() const); + //REG_FUNC(0xCF5643A9, std::_codecvt_base::do_always_noconv() const); + //REG_FUNC(0x51FCD56B, std::bad_exception::what() const); + //REG_FUNC(0x109E54C9, std::bad_exception::_Doraise() const); + //REG_FUNC(0xAE85C2EE, std::runtime_error::what() const); + //REG_FUNC(0x1D878503, std::runtime_error::_Doraise() const); + //REG_FUNC(0xEED101C6, std::overflow_error::_Doraise() const); + //REG_FUNC(0xB1AE6F9E, std::underflow_error::_Doraise() const); + //REG_FUNC(0x16F56E8D, std::invalid_argument::_Doraise() const); + //REG_FUNC(0x6C568D20, std::_ctype::do_tolower(char*, char const*) const); + //REG_FUNC(0xC334DE66, std::_ctype::do_tolower(char) const); + //REG_FUNC(0x2DD808E, std::_ctype::do_toupper(char*, char const*) const); + //REG_FUNC(0xF6AF33EA, std::_ctype::do_toupper(char) const); + //REG_FUNC(0x1B81D726, std::_ctype::do_widen(char const*, char const*, char*) const); + //REG_FUNC(0x6471CC01, std::_ctype::do_widen(char) const); + //REG_FUNC(0x9CFA56E5, std::_ctype::do_narrow(char const*, char const*, char, char*) const); + //REG_FUNC(0x718669AB, std::_ctype::do_narrow(char, char) const); + //REG_FUNC(0x759F105D, std::_ctype::do_scan_is(short, wchar_t const*, wchar_t const*) const); + //REG_FUNC(0x56443F, std::_ctype::do_tolower(wchar_t*, wchar_t const*) const); + //REG_FUNC(0x33E9ECDD, std::_ctype::do_tolower(wchar_t) const); + //REG_FUNC(0x1256E6A5, std::_ctype::do_toupper(wchar_t*, wchar_t const*) const); + //REG_FUNC(0x64072C2E, std::_ctype::do_toupper(wchar_t) const); + //REG_FUNC(0x339766BF, std::_ctype::do_scan_not(short, wchar_t const*, wchar_t const*) const); + //REG_FUNC(0xDA4E1651, std::_ctype::do_is(wchar_t const*, wchar_t const*, short*) const); + //REG_FUNC(0x5A06C0E8, std::_ctype::do_is(short, wchar_t) const); + //REG_FUNC(0x609036C7, std::_ctype::do_widen(char const*, char const*, wchar_t*) const); + //REG_FUNC(0xA2896AA8, std::_ctype::do_widen(char) const); + //REG_FUNC(0x631687B9, std::_ctype::do_narrow(wchar_t const*, wchar_t const*, char, char*) const); + //REG_FUNC(0xB4D8D2F0, std::_ctype::do_narrow(wchar_t, char) const); + //REG_FUNC(0xD9070137, std::_codecvt::do_unshift(std::_Mbstatet&, char*, char*, char*&) const); + //REG_FUNC(0xABA0412F, std::_codecvt::do_in(std::_Mbstatet&, char const*, char const*, char const*&, char*, char*, char*&) const); + //REG_FUNC(0x51052F04, std::_codecvt::do_out(std::_Mbstatet&, char const*, char const*, char const*&, char*, char*, char*&) const); + //REG_FUNC(0x39F062BE, std::_codecvt::do_length(std::_Mbstatet const&, char const*, char const*, unsigned int) const); + //REG_FUNC(0xF07CC89F, std::_codecvt::do_unshift(std::_Mbstatet&, char*, char*, char*&) const); + //REG_FUNC(0xF3A2E837, std::_codecvt::do_encoding() const); + //REG_FUNC(0x1F133D1E, std::_codecvt::do_max_length() const); + //REG_FUNC(0x27716D17, std::_codecvt::do_always_noconv() const); + //REG_FUNC(0x1C1AFE42, std::_codecvt::do_in(std::_Mbstatet&, char const*, char const*, char const*&, wchar_t*, wchar_t*, wchar_t*&) const); + //REG_FUNC(0xCBDE5500, std::_codecvt::do_out(std::_Mbstatet&, wchar_t const*, wchar_t const*, wchar_t const*&, char*, char*, char*&) const); + //REG_FUNC(0xF4D38990, std::_codecvt::do_length(std::_Mbstatet const&, char const*, char const*, unsigned int) const); + //REG_FUNC(0x46A9143F, std::bad_cast::what() const); + //REG_FUNC(0x8D129D3F, std::bad_cast::_Doraise() const); + //REG_FUNC(0xF877F51E, std::ios_base::failure::_Doraise() const); + //REG_FUNC(0x664750EE, std::bad_alloc::what() const); + //REG_FUNC(0xBA89FBE7, std::bad_alloc::_Doraise() const); + //REG_FUNC(0xC133E331, std::exception::what() const); + //REG_FUNC(0x656BE32, std::exception::_Raise() const); + //REG_FUNC(0x47A5CDA2, std::exception::_Doraise() const); + //REG_FUNC(0xBAE38DF9, std::type_info::name() const); + //REG_FUNC(0x1F260F10, std::type_info::before(std::type_info const&) const); + //REG_FUNC(0xDB15F0FC, std::type_info::operator==(std::type_info const&) const); + //REG_FUNC(0x9994F9FE, std::type_info::operator!=(std::type_info const&) const); + //REG_FUNC(0x2DA9FCEC, std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x6C2D3707, std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x9BA8786E, std::basic_istream >::~basic_istream()); + //REG_FUNC(0xD089A7C9, std::basic_istream >::~basic_istream()); + //REG_FUNC(0x3EE0611A, std::basic_ostream >::basic_ostream(std::basic_streambuf >*, bool)); + //REG_FUNC(0x6489E51D, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0xEF21C386, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x10D794D4, std::string::_Grow(unsigned int, bool)); + //REG_FUNC(0x846D0286, std::string::assign(std::string const&, unsigned int, unsigned int)); + //REG_FUNC(0x2AF7786D, std::basic_string, std::allocator >::basic_string(char const*)); + //REG_FUNC(0x92F661CF, std::basic_string, std::allocator >::basic_string(std::string const&)); + //REG_FUNC(0xECC3B9C2, std::bad_typeid::bad_typeid(std::bad_typeid const&)); + //REG_FUNC(0x9F4CD196, std::bad_typeid::bad_typeid()); + //REG_FUNC(0x7AE1631B, std::bad_typeid::bad_typeid(std::bad_typeid const&)); + //REG_FUNC(0x33377802, std::bad_typeid::bad_typeid()); + //REG_FUNC(0x2CE020C7, std::bad_typeid::~bad_typeid()); + //REG_FUNC(0x625460B9, std::bad_typeid::~bad_typeid()); + //REG_FUNC(0xB4F5C5A7, std::bad_typeid::~bad_typeid()); + //REG_FUNC(0x55AAD6A6, std::bad_typeid::operator=(std::bad_typeid const&)); + //REG_FUNC(0x9CF31703, std::istrstream::~istrstream()); + //REG_FUNC(0x71D13A36, std::istrstream::~istrstream()); + //REG_FUNC(0xAF5DF8C3, std::istrstream::~istrstream()); + //REG_FUNC(0xC1E7C7A, std::ostrstream::ostrstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0xC09B290, std::ostrstream::ostrstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0x4B8BA644, std::ostrstream::~ostrstream()); + //REG_FUNC(0xE463FB3, std::ostrstream::~ostrstream()); + //REG_FUNC(0xA0A34FEF, std::ostrstream::~ostrstream()); + //REG_FUNC(0xC9F632FF, std::logic_error::logic_error(std::logic_error const&)); + //REG_FUNC(0xE6356C5C, std::logic_error::logic_error(std::string const&)); + //REG_FUNC(0x6322FEB0, std::logic_error::~logic_error()); + //REG_FUNC(0x35ED9C5A, std::logic_error::~logic_error()); + //REG_FUNC(0x1FFC4420, std::logic_error::~logic_error()); + //REG_FUNC(0x6F6E3A52, std::range_error::range_error(std::range_error const&)); + //REG_FUNC(0xFD97D28A, std::range_error::~range_error()); + //REG_FUNC(0x1C86405F, std::range_error::~range_error()); + //REG_FUNC(0xEF754EBD, std::range_error::~range_error()); + //REG_FUNC(0x7D5412EF, std::domain_error::domain_error(std::domain_error const&)); + //REG_FUNC(0x803A7D3E, std::domain_error::~domain_error()); + //REG_FUNC(0xA6BCA2AD, std::domain_error::~domain_error()); + //REG_FUNC(0x36F9D2A, std::domain_error::~domain_error()); + //REG_FUNC(0x5F3428AD, std::length_error::length_error(std::length_error const&)); + //REG_FUNC(0xF6FB801D, std::length_error::length_error(std::string const&)); + //REG_FUNC(0xF83AA7DA, std::length_error::~length_error()); + //REG_FUNC(0xA873D7F9, std::length_error::~length_error()); + //REG_FUNC(0xBB12C75, std::length_error::~length_error()); + //REG_FUNC(0x299AA587, std::out_of_range::out_of_range(std::out_of_range const&)); + //REG_FUNC(0xC8BA5522, std::out_of_range::out_of_range(std::string const&)); + //REG_FUNC(0xA8C470A4, std::out_of_range::~out_of_range()); + //REG_FUNC(0x5FAE79BF, std::out_of_range::~out_of_range()); + //REG_FUNC(0x7908CBAB, std::out_of_range::~out_of_range()); + //REG_FUNC(0xDCCE6368, std::strstreambuf::_Init(int, char*, char*, int)); + //REG_FUNC(0xD85AE271, std::strstreambuf::_Tidy()); + //REG_FUNC(0xD189E6CC, std::strstreambuf::freeze(bool)); + //REG_FUNC(0xFA6BDF33, std::strstreambuf::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x97A9813A, std::strstreambuf::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xED2539E2, std::strstreambuf::overflow(int)); + //REG_FUNC(0xC725F896, std::strstreambuf::pbackfail(int)); + //REG_FUNC(0xA9F4FABF, std::strstreambuf::underflow()); + //REG_FUNC(0x1C887DDE, std::strstreambuf::~strstreambuf()); + //REG_FUNC(0x29E1E930, std::strstreambuf::~strstreambuf()); + //REG_FUNC(0xA140889, std::strstreambuf::~strstreambuf()); + //REG_FUNC(0xA8FE6FC4, std::_codecvt_base::~_codecvt_base()); + //REG_FUNC(0xB0E47AE4, std::_codecvt_base::~_codecvt_base()); + //REG_FUNC(0xB7EE9CC2, std::bad_exception::bad_exception(std::bad_exception const&)); + //REG_FUNC(0xD719280E, std::bad_exception::bad_exception()); + //REG_FUNC(0x37D2017F, std::bad_exception::bad_exception(std::bad_exception const&)); + //REG_FUNC(0x3DE54D83, std::bad_exception::bad_exception()); + //REG_FUNC(0xC7880D1A, std::bad_exception::~bad_exception()); + //REG_FUNC(0x486B59CE, std::bad_exception::~bad_exception()); + //REG_FUNC(0xD04E0BAB, std::bad_exception::~bad_exception()); + //REG_FUNC(0x792097AA, std::bad_exception::operator=(std::bad_exception const&)); + //REG_FUNC(0xCC369863, std::basic_filebuf >::sync()); + //REG_FUNC(0xC8BAB41E, std::basic_filebuf >::_Lock()); + //REG_FUNC(0xD5F03A74, std::basic_filebuf >::uflow()); + //REG_FUNC(0x413E813E, std::basic_filebuf >::setbuf(char*, int)); + //REG_FUNC(0x9D193B65, std::basic_filebuf >::_Unlock()); + //REG_FUNC(0x52E47FB5, std::basic_filebuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0xE119B37, std::basic_filebuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0x616754BC, std::basic_filebuf >::overflow(int)); + //REG_FUNC(0xCD5BD2E1, std::basic_filebuf >::_Endwrite()); + //REG_FUNC(0xFC1C7F3A, std::basic_filebuf >::pbackfail(int)); + //REG_FUNC(0x31693B42, std::basic_filebuf >::underflow()); + //REG_FUNC(0xC2F03DFD, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0x54A77A0D, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0x253888BD, std::basic_filebuf >::sync()); + //REG_FUNC(0x4EC524DC, std::basic_filebuf >::_Lock()); + //REG_FUNC(0xE777348C, std::basic_filebuf >::uflow()); + //REG_FUNC(0x1E1E8BBF, std::basic_filebuf >::setbuf(wchar_t*, int)); + //REG_FUNC(0x281D0191, std::basic_filebuf >::_Unlock()); + //REG_FUNC(0x9C87B03F, std::basic_filebuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x8021D69B, std::basic_filebuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xD8127E0A, std::basic_filebuf >::overflow(unsigned int)); + //REG_FUNC(0x99FDEB76, std::basic_filebuf >::_Endwrite()); + //REG_FUNC(0x950786D7, std::basic_filebuf >::pbackfail(unsigned int)); + //REG_FUNC(0x572A65D3, std::basic_filebuf >::underflow()); + //REG_FUNC(0x96D09EA4, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0xD434F085, std::basic_filebuf >::~basic_filebuf()); + //REG_FUNC(0xFFFA683E, std::basic_istream >::~basic_istream()); + //REG_FUNC(0xB58839C5, std::basic_istream >::~basic_istream()); + //REG_FUNC(0x9BF8855B, std::basic_ostream >::basic_ostream(std::basic_streambuf >*, bool)); + //REG_FUNC(0xD74F56E, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x9B831B60, std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x396337CE, std::runtime_error::runtime_error(std::runtime_error const&)); + //REG_FUNC(0xDAD26367, std::runtime_error::~runtime_error()); + //REG_FUNC(0x7F1FDAEA, std::runtime_error::~runtime_error()); + //REG_FUNC(0xECC19AEB, std::runtime_error::~runtime_error()); + //REG_FUNC(0xE67F3768, std::overflow_error::overflow_error(std::overflow_error const&)); + //REG_FUNC(0xF7C46A5D, std::overflow_error::~overflow_error()); + //REG_FUNC(0x5C666F7E, std::overflow_error::~overflow_error()); + //REG_FUNC(0x4E45F680, std::overflow_error::~overflow_error()); + //REG_FUNC(0x626515E3, std::basic_streambuf >::sync()); + //REG_FUNC(0x2E55F15A, std::basic_streambuf >::_Lock()); + //REG_FUNC(0xF8535AB, std::basic_streambuf >::uflow()); + //REG_FUNC(0xD7933D06, std::basic_streambuf >::setbuf(char*, int)); + //REG_FUNC(0xB8BCCC8D, std::basic_streambuf >::xsgetn(char*, int)); + //REG_FUNC(0x43E5D0F1, std::basic_streambuf >::xsputn(char const*, int)); + //REG_FUNC(0x149B193A, std::basic_streambuf >::_Unlock()); + //REG_FUNC(0x600998EC, std::basic_streambuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x1DEFFD6, std::basic_streambuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xF5F44352, std::basic_streambuf >::overflow(int)); + //REG_FUNC(0xCA79344F, std::basic_streambuf >::pbackfail(int)); + //REG_FUNC(0x441788B1, std::basic_streambuf >::showmanyc()); + //REG_FUNC(0x797DAE94, std::basic_streambuf >::underflow()); + //REG_FUNC(0x74AD52E, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0xE449E2BF, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0x9FAA0AA, std::basic_streambuf >::sync()); + //REG_FUNC(0xA596C88C, std::basic_streambuf >::_Lock()); + //REG_FUNC(0x373C2CD8, std::basic_streambuf >::uflow()); + //REG_FUNC(0x3F363796, std::basic_streambuf >::setbuf(wchar_t*, int)); + //REG_FUNC(0xABE96E40, std::basic_streambuf >::xsgetn(wchar_t*, int)); + //REG_FUNC(0x506D0DAE, std::basic_streambuf >::xsputn(wchar_t const*, int)); + //REG_FUNC(0xBD378207, std::basic_streambuf >::_Unlock()); + //REG_FUNC(0x924BD940, std::basic_streambuf >::seekoff(long, std::_Iosb::_Seekdir, std::_Iosb::_Openmode)); + //REG_FUNC(0x2CD1C1AF, std::basic_streambuf >::seekpos(std::fpos, std::_Iosb::_Openmode)); + //REG_FUNC(0xB0DD9881, std::basic_streambuf >::overflow(unsigned int)); + //REG_FUNC(0xDD04652F, std::basic_streambuf >::pbackfail(unsigned int)); + //REG_FUNC(0x9DCBD6A5, std::basic_streambuf >::showmanyc()); + //REG_FUNC(0xC3892DE5, std::basic_streambuf >::underflow()); + //REG_FUNC(0x8DFACE66, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0x868E865C, std::basic_streambuf >::~basic_streambuf()); + //REG_FUNC(0x9A59BC50, std::underflow_error::underflow_error(std::underflow_error const&)); + //REG_FUNC(0x47A589A4, std::underflow_error::~underflow_error()); + //REG_FUNC(0xCED74DE7, std::underflow_error::~underflow_error()); + //REG_FUNC(0xA76F038A, std::underflow_error::~underflow_error()); + //REG_FUNC(0x6332FA62, std::invalid_argument::invalid_argument(std::invalid_argument const&)); + //REG_FUNC(0x188D86CF, std::invalid_argument::~invalid_argument()); + //REG_FUNC(0x9982A4FC, std::invalid_argument::~invalid_argument()); + //REG_FUNC(0x1AB2B1AC, std::invalid_argument::~invalid_argument()); + //REG_FUNC(0xF9FAB558, std::_Mutex::_Lock()); + //REG_FUNC(0x402C9F8, std::_Mutex::_Unlock()); + //REG_FUNC(0x9DA92617, std::_Mutex::_Mutex(std::_Uninitialized)); + //REG_FUNC(0xA4F99AE7, std::_Mutex::_Mutex()); + //REG_FUNC(0x7B5A6B7F, std::_Mutex::_Mutex(std::_Uninitialized)); + //REG_FUNC(0x5C5CD6B9, std::_Mutex::_Mutex()); + //REG_FUNC(0x9B37CAD9, std::_Mutex::~_Mutex()); + //REG_FUNC(0x3E6A67FE, std::_Mutex::~_Mutex()); + //REG_FUNC(0xABB11CF9, std::_Winit::_Winit()); + //REG_FUNC(0x90DD73C3, std::_Winit::_Winit()); + //REG_FUNC(0x579C349B, std::_Winit::~_Winit()); + //REG_FUNC(0x3794ED15, std::_Winit::~_Winit()); + //REG_FUNC(0x24DA6258, std::_ctype::~_ctype()); + //REG_FUNC(0xF9C92C6A, std::_ctype::~_ctype()); + //REG_FUNC(0x554E4742, std::_ctype::~_ctype()); + //REG_FUNC(0xD4AEA4D3, std::_ctype::~_ctype()); + //REG_FUNC(0x5A7D89F0, std::_codecvt::~_codecvt()); + //REG_FUNC(0xB613F281, std::_codecvt::~_codecvt()); + //REG_FUNC(0x1E11185A, std::_codecvt::~_codecvt()); + //REG_FUNC(0x14125DF4, std::_codecvt::~_codecvt()); + //REG_FUNC(0xD2A4428D, std::bad_cast::bad_cast(std::bad_cast const&)); + //REG_FUNC(0x7922CC7C, std::bad_cast::bad_cast()); + //REG_FUNC(0x6DC64647, std::bad_cast::bad_cast(std::bad_cast const&)); + //REG_FUNC(0x596BA786, std::bad_cast::bad_cast()); + //REG_FUNC(0x5416699C, std::bad_cast::~bad_cast()); + //REG_FUNC(0x1D09710D, std::bad_cast::~bad_cast()); + //REG_FUNC(0x3C6B52E7, std::bad_cast::~bad_cast()); + //REG_FUNC(0x95966020, std::bad_cast::operator=(std::bad_cast const&)); + //REG_FUNC(0xF81D3B86, std::ios_base::register_callback(void (*)(std::ios_base::event, std::ios_base&, int), int)); + //REG_FUNC(0x5E60B2B3, std::ios_base::Init::Init()); + //REG_FUNC(0x5ED60DEE, std::ios_base::Init::Init()); + //REG_FUNC(0x65D88619, std::ios_base::Init::~Init()); + //REG_FUNC(0x3483E01D, std::ios_base::Init::~Init()); + //REG_FUNC(0x78CB190E, std::ios_base::_Init()); + //REG_FUNC(0x23B8BEE, std::ios_base::_Tidy()); + //REG_FUNC(0xC9DE8208, std::ios_base::clear(std::_Iosb::_Iostate, bool)); + //REG_FUNC(0xAA9171FB, std::ios_base::_Addstd()); + //REG_FUNC(0xFC58778, std::ios_base::copyfmt(std::ios_base const&)); + //REG_FUNC(0x2DF76755, std::ios_base::failure::failure(std::ios_base::failure const&)); + //REG_FUNC(0x94048F7, std::ios_base::failure::failure(std::string const&)); + //REG_FUNC(0x20AAAB95, std::ios_base::failure::~failure()); + //REG_FUNC(0x31D0197A, std::ios_base::failure::~failure()); + //REG_FUNC(0x7736E940, std::ios_base::_Callfns(std::ios_base::event)); + //REG_FUNC(0xE8C4640A, std::ios_base::_Findarr(int)); + //REG_FUNC(0xB8CFFB8D, std::ios_base::~ios_base()); + //REG_FUNC(0x40EA90D5, std::ios_base::~ios_base()); + //REG_FUNC(0xDCE89E71, std::ios_base::~ios_base()); + //REG_FUNC(0xE15EEC2A, std::bad_alloc::bad_alloc(std::bad_alloc const&)); + //REG_FUNC(0xEC3804D2, std::bad_alloc::bad_alloc()); + //REG_FUNC(0x6AF75467, std::bad_alloc::bad_alloc(std::bad_alloc const&)); + //REG_FUNC(0x57096162, std::bad_alloc::bad_alloc()); + //REG_FUNC(0xB2DAA408, std::bad_alloc::~bad_alloc()); + //REG_FUNC(0x7AEE736, std::bad_alloc::~bad_alloc()); + //REG_FUNC(0xA9E9B7B7, std::bad_alloc::~bad_alloc()); + //REG_FUNC(0x7853E8E5, std::bad_alloc::operator=(std::bad_alloc const&)); + //REG_FUNC(0xF78468EB, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x3150182, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x9654168A, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x8FFB8524, std::basic_ios >::~basic_ios()); + //REG_FUNC(0x7AF1BB16, std::exception::_Set_raise_handler(void (*)(std::exception const&))); + //REG_FUNC(0x8C5A4417, std::exception::exception(std::exception const&)); + //REG_FUNC(0xFC169D71, std::exception::exception()); + //REG_FUNC(0x59758E74, std::exception::exception(std::exception const&)); + //REG_FUNC(0xE08376, std::exception::exception()); + //REG_FUNC(0x82EEA67E, std::exception::~exception()); + //REG_FUNC(0x30405D88, std::exception::~exception()); + //REG_FUNC(0xAF7A7081, std::exception::~exception()); + //REG_FUNC(0x6CE63118, std::exception::operator=(std::exception const&)); + //REG_FUNC(0x911F5A80, std::strstream::strstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0x27166DDA, std::strstream::strstream(char*, int, std::_Iosb::_Openmode)); + //REG_FUNC(0xC4099868, std::strstream::~strstream()); + //REG_FUNC(0x98BD8AE1, std::strstream::~strstream()); + //REG_FUNC(0x7D8DFE43, std::strstream::~strstream()); + //REG_FUNC(0x8D4B1A13, std::type_info::~type_info()); + //REG_FUNC(0xBD786240, std::type_info::~type_info()); + //REG_FUNC(0xC04303, std::type_info::~type_info()); + //REG_FUNC(0x9983D8B9, std::unexpected()); + //REG_FUNC(0x385D19B2, std::setiosflags(std::_Iosb::_Fmtflags)); + //REG_FUNC(0xD8A78A61, std::setprecision(int)); + //REG_FUNC(0x994DDF94, std::resetiosflags(std::_Iosb::_Fmtflags)); + //REG_FUNC(0x13BAEE11, std::set_terminate(void (*)())); + //REG_FUNC(0x644CBAA2, std::_Debug_message(char const*, char const*)); + //REG_FUNC(0x9B2F0CA6, std::set_unexpected(void (*)())); + //REG_FUNC(0xC107B555, std::set_new_handler(void (*)())); + //REG_FUNC(0x11CEB00, std::uncaught_exception()); + //REG_FUNC(0x36282336, std::__gen_dummy_typeinfos()); + //REG_FUNC(0x3622003F, std::setw(int)); + //REG_FUNC(0x6CAFA8EF, std::_Throw(std::exception const&)); + //REG_FUNC(0xFD276300, std::_Fiopen(char const*, std::_Iosb::_Openmode, int)); + //REG_FUNC(0x1419E1DF, std::_Fiopen(wchar_t const*, std::_Iosb::_Openmode, int)); + //REG_FUNC(0x39587D21, std::setbase(int)); + //REG_FUNC(0x978EC4DC, std::terminate()); + //REG_FUNC(0x4A804953, non-virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0xABFBB0B4, non-virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x6577F8FA, non-virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0x77812119, non-virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0xE4BD5E6A, virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x1081224F, virtual thunk to std::basic_iostream >::~basic_iostream()); + //REG_FUNC(0x7CC8951D, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0xC46CA5C9, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0x699E7717, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x41DBA7E0, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x6FC84131, virtual thunk to std::istrstream::~istrstream()); + //REG_FUNC(0x7B4D8616, virtual thunk to std::istrstream::~istrstream()); + //REG_FUNC(0xD82D58BA, virtual thunk to std::ostrstream::~ostrstream()); + //REG_FUNC(0x5D4F7F7B, virtual thunk to std::ostrstream::~ostrstream()); + //REG_FUNC(0x10E7966F, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0xC3718A8D, virtual thunk to std::basic_istream >::~basic_istream()); + //REG_FUNC(0x159261D1, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0xB54EC1E5, virtual thunk to std::basic_ostream >::~basic_ostream()); + //REG_FUNC(0x2FB87ED7, virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0xECEDE119, virtual thunk to std::strstream::~strstream()); + //REG_FUNC(0x91B0DC47, operator delete[](void*)); + //REG_FUNC(0xA7241F09, operator delete[](void*, std::nothrow_t const&)); + //REG_FUNC(0x3688FFDA, operator delete[](void*, void*)); + //REG_FUNC(0x72293931, operator delete(void*)); + //REG_FUNC(0x87EF85FF, operator delete(void*, std::nothrow_t const&)); + //REG_FUNC(0x1EB89099, operator delete(void*, void*)); + //REG_FUNC(0xE7FB2BF4, operator new[](unsigned int)); + //REG_FUNC(0x31C62481, operator new[](unsigned int, std::nothrow_t const&)); + //REG_FUNC(0xF99ED5AC, operator new(unsigned int)); + //REG_FUNC(0xAE71DC3, operator new(unsigned int, std::nothrow_t const&)); + //REG_FUNC(0x1818C323, _SNC_get_global_vars); + //REG_FUNC(0x2CFA1F15, _SNC_get_tlocal_vars); + //REG_FUNC(0x7742D916, _Unwind_Backtrace); + //REG_FUNC(0x32748B78, _Unwind_Complete); + //REG_FUNC(0xF6EA5CDE, _Unwind_DeleteException); + //REG_FUNC(0xCCD903C4, _Unwind_RaiseException); + //REG_FUNC(0x13D5D5A1, _Unwind_Resume); + //REG_FUNC(0xE7889A5B, _Unwind_VRS_Get); + //REG_FUNC(0xF106D050, _Unwind_VRS_Pop); + //REG_FUNC(0x91CDA2F9, _Unwind_VRS_Set); + REG_FUNC(0x173E7421, __aeabi_unwind_cpp_pr0); + REG_FUNC(0x3C78DDE3, __aeabi_unwind_cpp_pr1); + REG_FUNC(0xF95BDD36, __aeabi_unwind_cpp_pr2); + //REG_FUNC(0x8C93EFDA, __cxa_allocate_exception); + //REG_FUNC(0x6165EE89, __cxa_begin_catch); + //REG_FUNC(0x5D74285C, __cxa_begin_cleanup); + //REG_FUNC(0x4E4CC399, __cxa_call_terminate); + //REG_FUNC(0x7C1A0217, __cxa_call_unexpected); + //REG_FUNC(0xF7BF277C, __cxa_current_exception_type); + //REG_FUNC(0x3438F773, __cxa_end_catch); + //REG_FUNC(0xD7C1E113, __cxa_end_cleanup); + //REG_FUNC(0x1FFD5FFF, __cxa_free_exception); + //REG_FUNC(0xBFFC0ED7, __cxa_get_exception_ptr); + //REG_FUNC(0x96656BBA, __cxa_get_globals); + //REG_FUNC(0x21D6C279, __cxa_rethrow); + //REG_FUNC(0xF87E6098, __cxa_throw); + //REG_FUNC(0x30D908F2, __cxa_type_match); + //REG_FUNC(0xAE42C1D5, __snc_personality_v0); + //REG_FUNC(0xDD200A6F, __cxxabiv1::__enum_type_info::~__enum_type_info()); + //REG_FUNC(0x436D61AD, __cxxabiv1::__enum_type_info::~__enum_type_info()); + //REG_FUNC(0x34854DA4, __cxxabiv1::__enum_type_info::~__enum_type_info()); + //REG_FUNC(0x9D5EDD21, __cxxabiv1::__array_type_info::~__array_type_info()); + //REG_FUNC(0xD6375908, __cxxabiv1::__array_type_info::~__array_type_info()); + //REG_FUNC(0xFDC450D4, __cxxabiv1::__array_type_info::~__array_type_info()); + //REG_FUNC(0x5CCFD0C0, __cxxabiv1::__class_type_info::~__class_type_info()); + //REG_FUNC(0xFBBFFF15, __cxxabiv1::__class_type_info::~__class_type_info()); + //REG_FUNC(0xA92DD3D2, __cxxabiv1::__class_type_info::~__class_type_info()); + //REG_FUNC(0x6C14868D, __cxxabiv1::__pbase_type_info::~__pbase_type_info()); + //REG_FUNC(0xC1869E57, __cxxabiv1::__pbase_type_info::~__pbase_type_info()); + //REG_FUNC(0x2DF92DB7, __cxxabiv1::__pbase_type_info::~__pbase_type_info()); + //REG_FUNC(0xA9654DFD, __cxxabiv1::__pointer_type_info::~__pointer_type_info()); + //REG_FUNC(0x703A2C05, __cxxabiv1::__pointer_type_info::~__pointer_type_info()); + //REG_FUNC(0x509AAD21, __cxxabiv1::__pointer_type_info::~__pointer_type_info()); + //REG_FUNC(0xB7DFB274, __cxxabiv1::__function_type_info::~__function_type_info()); + //REG_FUNC(0x19EA26FF, __cxxabiv1::__function_type_info::~__function_type_info()); + //REG_FUNC(0xF882187E, __cxxabiv1::__function_type_info::~__function_type_info()); + //REG_FUNC(0xE67722C3, __cxxabiv1::__si_class_type_info::~__si_class_type_info()); + //REG_FUNC(0xA7E25E3E, __cxxabiv1::__si_class_type_info::~__si_class_type_info()); + //REG_FUNC(0xACD6D901, __cxxabiv1::__si_class_type_info::~__si_class_type_info()); + //REG_FUNC(0x986F12C7, __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()); + //REG_FUNC(0x4B5BC979, __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()); + //REG_FUNC(0xA7B9AB93, __cxxabiv1::__vmi_class_type_info::~__vmi_class_type_info()); + //REG_FUNC(0x7436C981, __cxxabiv1::__fundamental_type_info::~__fundamental_type_info()); + //REG_FUNC(0x4EFBF43A, __cxxabiv1::__fundamental_type_info::~__fundamental_type_info()); + //REG_FUNC(0xF49AA0D3, __cxxabiv1::__fundamental_type_info::~__fundamental_type_info()); + //REG_FUNC(0x6199ACC9, __cxxabiv1::__pointer_to_member_type_info::~__pointer_to_member_type_info()); + //REG_FUNC(0xDD076510, __cxxabiv1::__pointer_to_member_type_info::~__pointer_to_member_type_info()); + //REG_FUNC(0xD4C11B17, __cxxabiv1::__pointer_to_member_type_info::~__pointer_to_member_type_info()); + //REG_FUNC(0xBF90A45A, _PJP_CPP_Copyright); + //REG_FUNC(0x3B6D9752, std::basic_string, std::allocator >::npos); + //REG_FUNC(0xA3498140, std::string::npos); + //REG_FUNC(0x5273EA3, std::_Num_int_base::is_bounded); + //REG_FUNC(0x8A0994F8, std::_Num_int_base::is_integer); + //REG_FUNC(0x401F1224, std::_Num_int_base::is_specialized); + //REG_FUNC(0xA65FE916, std::_Num_int_base::radix); + //REG_FUNC(0xF2AA872E, std::_Num_int_base::is_exact); + //REG_FUNC(0x8FE5A4F, std::_Num_int_base::is_modulo); + //REG_FUNC(0x7D4C55EC, std::numeric_limits::digits); + //REG_FUNC(0xA4E5BF5E, std::numeric_limits::digits10); + //REG_FUNC(0xD9938B84, std::numeric_limits::is_signed); + //REG_FUNC(0x56198D65, std::numeric_limits::digits); + //REG_FUNC(0xF52E5F76, std::numeric_limits::digits10); + //REG_FUNC(0x81B82E0E, std::numeric_limits::is_modulo); + //REG_FUNC(0x9E6D2025, std::numeric_limits::is_signed); + //REG_FUNC(0x810ED593, std::numeric_limits::digits); + //REG_FUNC(0xAC1A819, std::numeric_limits::digits10); + //REG_FUNC(0x660E14E1, std::numeric_limits::is_signed); + //REG_FUNC(0x3EEB3B23, std::numeric_limits::max_exponent); + //REG_FUNC(0x13B634BE, std::numeric_limits::min_exponent); + //REG_FUNC(0xDB4218A0, std::numeric_limits::max_exponent10); + //REG_FUNC(0x770B1CAC, std::numeric_limits::min_exponent10); + //REG_FUNC(0xD175A556, std::numeric_limits::digits); + //REG_FUNC(0xA5349445, std::numeric_limits::digits10); + //REG_FUNC(0x2F59E7FF, std::numeric_limits::max_exponent); + //REG_FUNC(0xC9C10644, std::numeric_limits::min_exponent); + //REG_FUNC(0xC80072AC, std::numeric_limits::max_exponent10); + //REG_FUNC(0xCA8B1B9E, std::numeric_limits::min_exponent10); + //REG_FUNC(0x7E9AFD39, std::numeric_limits::digits); + //REG_FUNC(0x6122F9BF, std::numeric_limits::digits10); + //REG_FUNC(0xA83B5FE2, std::numeric_limits::max_exponent); + //REG_FUNC(0x9347B146, std::numeric_limits::min_exponent); + //REG_FUNC(0x371BCFA6, std::numeric_limits::max_exponent10); + //REG_FUNC(0x6E6746EB, std::numeric_limits::min_exponent10); + //REG_FUNC(0xB102353D, std::numeric_limits::digits); + //REG_FUNC(0x781201BB, std::numeric_limits::digits10); + //REG_FUNC(0x26D618B8, std::numeric_limits::digits); + //REG_FUNC(0x8D593267, std::numeric_limits::digits10); + //REG_FUNC(0x96B86E89, std::numeric_limits::is_signed); + //REG_FUNC(0x9CDAA1F0, std::numeric_limits::digits); + //REG_FUNC(0xE8EB3133, std::numeric_limits::digits10); + //REG_FUNC(0x3AB38CDA, std::numeric_limits::is_signed); + //REG_FUNC(0xEEB7B642, std::numeric_limits::digits); + //REG_FUNC(0xBCDE68B3, std::numeric_limits::digits10); + //REG_FUNC(0xDA8EFB0, std::numeric_limits::is_signed); + //REG_FUNC(0x65DAD8D6, std::numeric_limits::digits); + //REG_FUNC(0xFB52BC0A, std::numeric_limits::digits10); + //REG_FUNC(0x63544FC, std::numeric_limits::is_signed); + //REG_FUNC(0x441D097A, std::numeric_limits::digits); + //REG_FUNC(0xB56F1B07, std::numeric_limits::digits10); + //REG_FUNC(0xA9799886, std::numeric_limits::is_signed); + //REG_FUNC(0x45C6A036, std::numeric_limits::digits); + //REG_FUNC(0xCDE02D9C, std::numeric_limits::digits10); + //REG_FUNC(0xB13AEAC3, std::numeric_limits::is_signed); + //REG_FUNC(0xBD813100, std::numeric_limits::digits); + //REG_FUNC(0x242C5313, std::numeric_limits::digits10); + //REG_FUNC(0x175A29B4, std::numeric_limits::is_signed); + //REG_FUNC(0x7E91BCD7, std::numeric_limits::digits); + //REG_FUNC(0x6B1CB79E, std::numeric_limits::digits10); + //REG_FUNC(0x9181475F, std::numeric_limits::is_signed); + //REG_FUNC(0x22F8FF46, std::numeric_limits::digits); + //REG_FUNC(0xF6E69A0D, std::numeric_limits::digits10); + //REG_FUNC(0xD01E5E34, std::numeric_limits::is_signed); + //REG_FUNC(0x4AB058B0, std::numeric_limits::digits); + //REG_FUNC(0x85F2F2D2, std::numeric_limits::digits10); + //REG_FUNC(0xDEDE9061, std::numeric_limits::is_signed); + //REG_FUNC(0x1CBE5DCB, std::_Num_float_base::has_denorm); + //REG_FUNC(0x616E0E6F, std::_Num_float_base::is_bounded); + //REG_FUNC(0xDFDE8E2C, std::_Num_float_base::is_integer); + //REG_FUNC(0x59668916, std::_Num_float_base::round_style); + //REG_FUNC(0x2FA7A240, std::_Num_float_base::has_infinity); + //REG_FUNC(0x4E98DCA0, std::_Num_float_base::has_quiet_NaN); + //REG_FUNC(0x87EB5304, std::_Num_float_base::is_specialized); + //REG_FUNC(0x1B36956D, std::_Num_float_base::has_denorm_loss); + //REG_FUNC(0xD3E2D87B, std::_Num_float_base::tinyness_before); + //REG_FUNC(0xBCEB9093, std::_Num_float_base::has_signaling_NaN); + //REG_FUNC(0x132F3288, std::_Num_float_base::radix); + //REG_FUNC(0xF8060433, std::_Num_float_base::traps); + //REG_FUNC(0x3C4A2891, std::_Num_float_base::is_exact); + //REG_FUNC(0xA3F55094, std::_Num_float_base::is_iec559); + //REG_FUNC(0xC8CB7207, std::_Num_float_base::is_modulo); + //REG_FUNC(0x1242E399, std::_Num_float_base::is_signed); + //REG_FUNC(0x762C3159, std::fpos::_Stz); + //REG_FUNC(0xFED4A09B, std::_Iosb::_Noreplace); + //REG_FUNC(0xE615A657, std::_Iosb::in); + //REG_FUNC(0x759FD02E, std::_Iosb::app); + //REG_FUNC(0x6F410A00, std::_Iosb::ate); + //REG_FUNC(0xD2A42D0C, std::_Iosb::beg); + //REG_FUNC(0x9B45C3B, std::_Iosb::cur); + //REG_FUNC(0x121A8952, std::_Iosb::dec); + //REG_FUNC(0x7CC027CD, std::_Iosb::end); + //REG_FUNC(0x6E2FF90B, std::_Iosb::hex); + //REG_FUNC(0xB4A55C29, std::_Iosb::oct); + //REG_FUNC(0x2CB2DC70, std::_Iosb::out); + //REG_FUNC(0x78E34A9, std::_Iosb::trunc); + //REG_FUNC(0xB5EFA1B3, std::_Iosb::badbit); + //REG_FUNC(0x5312A538, std::_Iosb::binary); + //REG_FUNC(0xD9D32526, std::_Iosb::skipws); + //REG_FUNC(0xAE6CA555, std::_Iosb::failbit); + //REG_FUNC(0x139E2D21, std::_Iosb::goodbit); + //REG_FUNC(0x7021DFF0, std::_Iosb::unitbuf); + //REG_FUNC(0x2AD61AAD, std::_Iosb::_Nocreate); + //REG_FUNC(0x60B16E4E, std::_Iosb::basefield); + //REG_FUNC(0x8137F8D7, std::_Winit::_Init_cnt); + //REG_FUNC(0x554B7625, std::ios_base::Init::_Init_cnt); + //REG_FUNC(0x57CF916C, std::ios_base::_Sync); + //REG_FUNC(0xF2D3416A, std::ios_base::_Index); + //REG_FUNC(0x3D219F98, std::_Num_base::has_denorm); + //REG_FUNC(0xD93E4A6C, std::_Num_base::is_bounded); + //REG_FUNC(0xB65169EF, std::_Num_base::is_integer); + //REG_FUNC(0x13B38354, std::_Num_base::round_style); + //REG_FUNC(0xB11D20E2, std::_Num_base::has_infinity); + //REG_FUNC(0x3E169F74, std::_Num_base::max_exponent); + //REG_FUNC(0xD7C041E0, std::_Num_base::min_exponent); + //REG_FUNC(0x2DA0D59, std::_Num_base::has_quiet_NaN); + //REG_FUNC(0xBE06BD79, std::_Num_base::is_specialized); + //REG_FUNC(0xEBBC4DDD, std::_Num_base::max_exponent10); + //REG_FUNC(0xFFCF7FC, std::_Num_base::min_exponent10); + //REG_FUNC(0xB317DDDF, std::_Num_base::has_denorm_loss); + //REG_FUNC(0x245D399E, std::_Num_base::tinyness_before); + //REG_FUNC(0xBD5F0B8A, std::_Num_base::has_signaling_NaN); + //REG_FUNC(0xE23BAE9E, std::_Num_base::radix); + //REG_FUNC(0x9237A154, std::_Num_base::traps); + //REG_FUNC(0xE8421A12, std::_Num_base::digits); + //REG_FUNC(0x80698934, std::_Num_base::digits10); + //REG_FUNC(0xB338C222, std::_Num_base::is_exact); + //REG_FUNC(0x1F5A7860, std::_Num_base::is_iec559); + //REG_FUNC(0x840107AA, std::_Num_base::is_modulo); + //REG_FUNC(0xABD7AE16, std::_Num_base::is_signed); + //REG_FUNC(0x4A1AB5B4, std::_Raise_handler); + //REG_FUNC(0x725EAC50, std::__dummy_typeinfo); + //REG_FUNC(0x768F2944, std::cin); + //REG_FUNC(0xD9478DCF, std::_Fpz); + //REG_FUNC(0x14B35A37, std::cerr); + //REG_FUNC(0xD361A52A, std::clog); + //REG_FUNC(0xB3867BB4, std::cout); + //REG_FUNC(0x8054BC8E, std::wcin); + //REG_FUNC(0x8B2001F7, std::wcerr); + //REG_FUNC(0x8E04C18C, std::wclog); + //REG_FUNC(0x4F726424, std::wcout); + //REG_FUNC(0x9C449444, std::_BADOFF); + //REG_FUNC(0xBFEF56B5, std::nothrow); + //REG_FUNC(0xDC18EF42, typeinfo for __simd64_int8_t); + //REG_FUNC(0x2207D305, typeinfo for __simd128_int8_t); + //REG_FUNC(0x869FEDA9, typeinfo for __simd64_int16_t); + //REG_FUNC(0x7CEF3DB5, typeinfo for __simd64_int32_t); + //REG_FUNC(0xFE09AD25, typeinfo for __simd64_poly8_t); + //REG_FUNC(0x14A3598E, typeinfo for __simd64_uint8_t); + //REG_FUNC(0xF4B098DD, typeinfo for __simd128_int16_t); + //REG_FUNC(0xAABF056C, typeinfo for __simd128_int32_t); + //REG_FUNC(0x305068B1, typeinfo for __simd128_poly8_t); + //REG_FUNC(0x74813D4D, typeinfo for __simd128_uint8_t); + //REG_FUNC(0xE118AB78, typeinfo for __simd64_poly16_t); + //REG_FUNC(0x67E05799, typeinfo for __simd64_uint16_t); + //REG_FUNC(0x1617E8CB, typeinfo for __simd64_uint32_t); + //REG_FUNC(0x2FACB1EF, typeinfo for __simd128_poly16_t); + //REG_FUNC(0xC089FED3, typeinfo for __simd128_uint16_t); + //REG_FUNC(0xFC00EC48, typeinfo for __simd128_uint32_t); + //REG_FUNC(0x237AF69B, typeinfo for __simd64_float16_t); + //REG_FUNC(0xF7FDBBED, typeinfo for __simd64_float32_t); + //REG_FUNC(0x525557F3, typeinfo for __simd128_float16_t); + //REG_FUNC(0xA4018B84, typeinfo for __simd128_float32_t); + //REG_FUNC(0xA1FE4058, typeinfo for half); + //REG_FUNC(0x5351829B, typeinfo for std::ios_base::failure); + //REG_FUNC(0xAC6C8F, typeinfo for __simd64_int8_t*); + //REG_FUNC(0xD5B056B8, typeinfo for __simd128_int8_t*); + //REG_FUNC(0x13975DAE, typeinfo for __simd64_int16_t*); + //REG_FUNC(0x963C04E3, typeinfo for __simd64_int32_t*); + //REG_FUNC(0x9F43A559, typeinfo for __simd64_poly8_t*); + //REG_FUNC(0xD8079FA9, typeinfo for __simd64_uint8_t*); + //REG_FUNC(0xEF53FE1F, typeinfo for __simd128_int16_t*); + //REG_FUNC(0xA5094302, typeinfo for __simd128_int32_t*); + //REG_FUNC(0x9CAF5E5A, typeinfo for __simd128_poly8_t*); + //REG_FUNC(0x264B0978, typeinfo for __simd128_uint8_t*); + //REG_FUNC(0x214A0488, typeinfo for __simd64_poly16_t*); + //REG_FUNC(0xA96D02B1, typeinfo for __simd64_uint16_t*); + //REG_FUNC(0xEE862280, typeinfo for __simd64_uint32_t*); + //REG_FUNC(0xB5CEC4FF, typeinfo for __simd128_poly16_t*); + //REG_FUNC(0x46124E82, typeinfo for __simd128_uint16_t*); + //REG_FUNC(0x7E6CC17, typeinfo for __simd128_uint32_t*); + //REG_FUNC(0x588EBCAD, typeinfo for __simd64_float16_t*); + //REG_FUNC(0xDFCB2417, typeinfo for __simd64_float32_t*); + //REG_FUNC(0x9502D3C0, typeinfo for __simd128_float16_t*); + //REG_FUNC(0xFB84796C, typeinfo for __simd128_float32_t*); + //REG_FUNC(0xA43ABF14, typeinfo for half*); + //REG_FUNC(0x37A74E46, typeinfo for __simd64_int8_t const*); + //REG_FUNC(0x60D7D920, typeinfo for __simd128_int8_t const*); + //REG_FUNC(0x52A04C47, typeinfo for __simd64_int16_t const*); + //REG_FUNC(0xBB64CCF1, typeinfo for __simd64_int32_t const*); + //REG_FUNC(0x7C9D0C33, typeinfo for __simd64_poly8_t const*); + //REG_FUNC(0x21A57A1, typeinfo for __simd64_uint8_t const*); + //REG_FUNC(0x21E3DD1, typeinfo for __simd128_int16_t const*); + //REG_FUNC(0xFF8DDBE7, typeinfo for __simd128_int32_t const*); + //REG_FUNC(0xB30AB3B5, typeinfo for __simd128_poly8_t const*); + //REG_FUNC(0xC8721E86, typeinfo for __simd128_uint8_t const*); + //REG_FUNC(0x610983B7, typeinfo for __simd64_poly16_t const*); + //REG_FUNC(0x486A3970, typeinfo for __simd64_uint16_t const*); + //REG_FUNC(0x9577D4FD, typeinfo for __simd64_uint32_t const*); + //REG_FUNC(0x192861D3, typeinfo for __simd128_poly16_t const*); + //REG_FUNC(0x9C721F27, typeinfo for __simd128_uint16_t const*); + //REG_FUNC(0xC0A37F8F, typeinfo for __simd128_uint32_t const*); + //REG_FUNC(0xF2FCDEFC, typeinfo for __simd64_float16_t const*); + //REG_FUNC(0x2D2B93F7, typeinfo for __simd64_float32_t const*); + //REG_FUNC(0x6B7DA1FD, typeinfo for __simd128_float16_t const*); + //REG_FUNC(0x15CA84E1, typeinfo for __simd128_float32_t const*); + //REG_FUNC(0x6195F016, typeinfo for half const*); + //REG_FUNC(0x2059F4C0, typeinfo for long long __vector const*); + //REG_FUNC(0xFCC4EE61, typeinfo for unsigned long long __vector const*); + //REG_FUNC(0x63E0CE97, typeinfo for signed char const*); + //REG_FUNC(0x47A13017, typeinfo for bool const*); + //REG_FUNC(0x8C375D81, typeinfo for char const*); + //REG_FUNC(0x841645BA, typeinfo for double const*); + //REG_FUNC(0x179015C1, typeinfo for long double const*); + //REG_FUNC(0xF7F85635, typeinfo for float const*); + //REG_FUNC(0x54CF62A4, typeinfo for unsigned char const*); + //REG_FUNC(0x33DAF949, typeinfo for int const*); + //REG_FUNC(0x703C1962, typeinfo for unsigned int const*); + //REG_FUNC(0xF353DAF3, typeinfo for long const*); + //REG_FUNC(0x67092852, typeinfo for unsigned long const*); + //REG_FUNC(0xDAAEEAD0, typeinfo for short const*); + //REG_FUNC(0x39790E0A, typeinfo for unsigned short const*); + //REG_FUNC(0xEE47C447, typeinfo for void const*); + //REG_FUNC(0xECDB6B05, typeinfo for wchar_t const*); + //REG_FUNC(0xC20CF55C, typeinfo for long long const*); + //REG_FUNC(0xA0F5E8F5, typeinfo for unsigned long long const*); + //REG_FUNC(0xA6C2A25C, typeinfo for long long __vector*); + //REG_FUNC(0x81B51915, typeinfo for unsigned long long __vector*); + //REG_FUNC(0xA7CB4EAA, typeinfo for signed char*); + //REG_FUNC(0x87B0FB6, typeinfo for bool*); + //REG_FUNC(0xE4D24E14, typeinfo for char*); + //REG_FUNC(0x6825FFE6, typeinfo for double*); + //REG_FUNC(0x926B9A3A, typeinfo for long double*); + //REG_FUNC(0x24072F3E, typeinfo for float*); + //REG_FUNC(0x8B5247B, typeinfo for unsigned char*); + //REG_FUNC(0x15C21CC8, typeinfo for int*); + //REG_FUNC(0xD234CF18, typeinfo for unsigned int*); + //REG_FUNC(0x50E25810, typeinfo for long*); + //REG_FUNC(0x9D0DBB1A, typeinfo for unsigned long*); + //REG_FUNC(0xDCB7CD94, typeinfo for short*); + //REG_FUNC(0x7FC4B19D, typeinfo for unsigned short*); + //REG_FUNC(0x4722F2AE, typeinfo for void*); + //REG_FUNC(0x2208C899, typeinfo for wchar_t*); + //REG_FUNC(0xE64F5994, typeinfo for long long*); + //REG_FUNC(0xC1C20AC0, typeinfo for unsigned long long*); + //REG_FUNC(0xD7A9284F, typeinfo for std::iostream); + //REG_FUNC(0xE302D51A, typeinfo for std::istream); + //REG_FUNC(0xF9426257, typeinfo for std::ostream); + //REG_FUNC(0x7242603B, typeinfo for std::bad_typeid); + //REG_FUNC(0x67B82DEF, typeinfo for std::istrstream); + //REG_FUNC(0x9F17589B, typeinfo for std::ostrstream); + //REG_FUNC(0xE0E3C75A, typeinfo for std::_ctype_base); + //REG_FUNC(0x87457513, typeinfo for std::logic_error); + //REG_FUNC(0x2B71045A, typeinfo for std::range_error); + //REG_FUNC(0x9A72EBFE, typeinfo for std::domain_error); + //REG_FUNC(0x15E6C91C, typeinfo for std::length_error); + //REG_FUNC(0xBAC29E4D, typeinfo for std::out_of_range); + //REG_FUNC(0x8257DFA2, typeinfo for std::strstreambuf); + //REG_FUNC(0x34455CAF, typeinfo for std::_codecvt_base); + //REG_FUNC(0xF4A5A537, typeinfo for std::bad_exception); + //REG_FUNC(0x33C19D3B, typeinfo for std::basic_filebuf >); + //REG_FUNC(0x83DB8917, typeinfo for std::basic_filebuf >); + //REG_FUNC(0x1582929A, typeinfo for std::basic_istream >); + //REG_FUNC(0xF4062B77, typeinfo for std::basic_ostream >); + //REG_FUNC(0x2451AF0A, typeinfo for std::runtime_error); + //REG_FUNC(0x3EE22853, typeinfo for std::overflow_error); + //REG_FUNC(0x758B452B, typeinfo for std::basic_streambuf >); + //REG_FUNC(0x52B5EC73, typeinfo for std::basic_streambuf >); + //REG_FUNC(0xCD0A98ED, typeinfo for std::underflow_error); + //REG_FUNC(0xA128D5A0, typeinfo for std::invalid_argument); + //REG_FUNC(0xE2AB6BF9, typeinfo for std::_Iosb); + //REG_FUNC(0x3FD78B17, typeinfo for std::_ctype); + //REG_FUNC(0xA8CD5D05, typeinfo for std::_ctype); + //REG_FUNC(0xAFB2B7FB, typeinfo for std::_codecvt); + //REG_FUNC(0xCA25D9BE, typeinfo for std::_codecvt); + //REG_FUNC(0xA7CA7C93, typeinfo for std::bad_cast); + //REG_FUNC(0xB93721C7, typeinfo for std::ios_base); + //REG_FUNC(0x35E135A0, typeinfo for std::bad_alloc); + //REG_FUNC(0x7BA61382, typeinfo for std::basic_ios >); + //REG_FUNC(0x905B8B0, typeinfo for std::basic_ios >); + //REG_FUNC(0x1E8C6100, typeinfo for std::exception); + //REG_FUNC(0x1CC15F54, typeinfo for std::strstream); + //REG_FUNC(0x8A026EAD, typeinfo for std::type_info); + //REG_FUNC(0xE128260C, typeinfo for long long __vector); + //REG_FUNC(0x44C2FA39, typeinfo for unsigned long long __vector); + //REG_FUNC(0x4F416B30, typeinfo for signed char); + //REG_FUNC(0x3081D959, typeinfo for bool); + //REG_FUNC(0x942D2342, typeinfo for char); + //REG_FUNC(0x685BA1E8, typeinfo for double); + //REG_FUNC(0xFCE46A43, typeinfo for long double); + //REG_FUNC(0x64AEB8AF, typeinfo for float); + //REG_FUNC(0x606676D4, typeinfo for unsigned char); + //REG_FUNC(0xA58E84A3, typeinfo for int); + //REG_FUNC(0x9B0CBEC0, typeinfo for unsigned int); + //REG_FUNC(0xD589E8AE, typeinfo for long); + //REG_FUNC(0xD39774A5, typeinfo for unsigned long); + //REG_FUNC(0xDC2C85B0, typeinfo for short); + //REG_FUNC(0xEA3FB57B, typeinfo for unsigned short); + //REG_FUNC(0x76C6BDCE, typeinfo for void); + //REG_FUNC(0x8BFC9260, typeinfo for wchar_t); + //REG_FUNC(0x90B0194C, typeinfo for long long); + //REG_FUNC(0x16DACFBF, typeinfo for unsigned long long); + //REG_FUNC(0x720678AD, typeinfo name for __simd64_int8_t); + //REG_FUNC(0x5B9F1D83, typeinfo name for __simd128_int8_t); + //REG_FUNC(0x953ECE43, typeinfo name for __simd64_int16_t); + //REG_FUNC(0xCE27612E, typeinfo name for __simd64_int32_t); + //REG_FUNC(0x72BC6CD9, typeinfo name for __simd64_poly8_t); + //REG_FUNC(0xCD2802B5, typeinfo name for __simd64_uint8_t); + //REG_FUNC(0xC3FA8530, typeinfo name for __simd128_int16_t); + //REG_FUNC(0x67A63A08, typeinfo name for __simd128_int32_t); + //REG_FUNC(0x6B26EFF8, typeinfo name for __simd128_poly8_t); + //REG_FUNC(0x8C4C69F, typeinfo name for __simd128_uint8_t); + //REG_FUNC(0x40BC2E0E, typeinfo name for __simd64_poly16_t); + //REG_FUNC(0x8D1AE4A7, typeinfo name for __simd64_uint16_t); + //REG_FUNC(0xC4096952, typeinfo name for __simd64_uint32_t); + //REG_FUNC(0x16D366F1, typeinfo name for __simd128_poly16_t); + //REG_FUNC(0x45552A1, typeinfo name for __simd128_uint16_t); + //REG_FUNC(0x7DBF4FFF, typeinfo name for __simd128_uint32_t); + //REG_FUNC(0xED26DE1, typeinfo name for __simd64_float16_t); + //REG_FUNC(0xAB0D789A, typeinfo name for __simd64_float32_t); + //REG_FUNC(0x3200DDB, typeinfo name for __simd128_float16_t); + //REG_FUNC(0xD54CBD7C, typeinfo name for __simd128_float32_t); + //REG_FUNC(0xA8E6842E, typeinfo name for half); + //REG_FUNC(0x5246E71E, typeinfo name for std::ios_base::failure); + //REG_FUNC(0xF98AAA03, typeinfo name for __simd64_int8_t*); + //REG_FUNC(0xAF5AA646, typeinfo name for __simd128_int8_t*); + //REG_FUNC(0x73874089, typeinfo name for __simd64_int16_t*); + //REG_FUNC(0xAD912141, typeinfo name for __simd64_int32_t*); + //REG_FUNC(0x67D1351B, typeinfo name for __simd64_poly8_t*); + //REG_FUNC(0x9FDDB92F, typeinfo name for __simd64_uint8_t*); + //REG_FUNC(0xA9B31841, typeinfo name for __simd128_int16_t*); + //REG_FUNC(0x244C742C, typeinfo name for __simd128_int32_t*); + //REG_FUNC(0x31AFE1A0, typeinfo name for __simd128_poly8_t*); + //REG_FUNC(0x5CF817B0, typeinfo name for __simd128_uint8_t*); + //REG_FUNC(0xB524B325, typeinfo name for __simd64_poly16_t*); + //REG_FUNC(0x51A1F225, typeinfo name for __simd64_uint16_t*); + //REG_FUNC(0x9C3431DD, typeinfo name for __simd64_uint32_t*); + //REG_FUNC(0x937A4F2F, typeinfo name for __simd128_poly16_t*); + //REG_FUNC(0x33549DB5, typeinfo name for __simd128_uint16_t*); + //REG_FUNC(0xFC19AC06, typeinfo name for __simd128_uint32_t*); + //REG_FUNC(0xD9A43D3A, typeinfo name for __simd64_float16_t*); + //REG_FUNC(0xFAB5D659, typeinfo name for __simd64_float32_t*); + //REG_FUNC(0x7E694471, typeinfo name for __simd128_float16_t*); + //REG_FUNC(0xA9AF9CE8, typeinfo name for __simd128_float32_t*); + //REG_FUNC(0xDAE584EC, typeinfo name for half*); + //REG_FUNC(0x2B017F22, typeinfo name for __simd64_int8_t const*); + //REG_FUNC(0x4A7149C9, typeinfo name for __simd128_int8_t const*); + //REG_FUNC(0xAC116166, typeinfo name for __simd64_int16_t const*); + //REG_FUNC(0x6A472A63, typeinfo name for __simd64_int32_t const*); + //REG_FUNC(0xC356ACF6, typeinfo name for __simd64_poly8_t const*); + //REG_FUNC(0x878C75F4, typeinfo name for __simd64_uint8_t const*); + //REG_FUNC(0x68B777E3, typeinfo name for __simd128_int16_t const*); + //REG_FUNC(0x61188BD, typeinfo name for __simd128_int32_t const*); + //REG_FUNC(0xC7733F13, typeinfo name for __simd128_poly8_t const*); + //REG_FUNC(0x3D8A69EC, typeinfo name for __simd128_uint8_t const*); + //REG_FUNC(0xCC081D58, typeinfo name for __simd64_poly16_t const*); + //REG_FUNC(0xEB50ABA7, typeinfo name for __simd64_uint16_t const*); + //REG_FUNC(0x25EC8CE5, typeinfo name for __simd64_uint32_t const*); + //REG_FUNC(0x5C61F109, typeinfo name for __simd128_poly16_t const*); + //REG_FUNC(0x9B085E3F, typeinfo name for __simd128_uint16_t const*); + //REG_FUNC(0x721902EF, typeinfo name for __simd128_uint32_t const*); + //REG_FUNC(0x1C618B7E, typeinfo name for __simd64_float16_t const*); + //REG_FUNC(0x89B6EDD3, typeinfo name for __simd64_float32_t const*); + //REG_FUNC(0x9BC380FF, typeinfo name for __simd128_float16_t const*); + //REG_FUNC(0xC951A9C5, typeinfo name for __simd128_float32_t const*); + //REG_FUNC(0x2796C952, typeinfo name for half const*); + //REG_FUNC(0xC33238AA, typeinfo name for long long __vector const*); + //REG_FUNC(0x208CEEA8, typeinfo name for unsigned long long __vector const*); + //REG_FUNC(0xBAD19257, typeinfo name for signed char const*); + //REG_FUNC(0x6CB2F5A4, typeinfo name for bool const*); + //REG_FUNC(0xE242CC59, typeinfo name for char const*); + //REG_FUNC(0xA0C8CCE9, typeinfo name for double const*); + //REG_FUNC(0x5C69903D, typeinfo name for long double const*); + //REG_FUNC(0xDBF8E0D1, typeinfo name for float const*); + //REG_FUNC(0x1BC277F5, typeinfo name for unsigned char const*); + //REG_FUNC(0xF09F6E45, typeinfo name for int const*); + //REG_FUNC(0x5C6D9EDD, typeinfo name for unsigned int const*); + //REG_FUNC(0x12416EBE, typeinfo name for long const*); + //REG_FUNC(0x199F6347, typeinfo name for unsigned long const*); + //REG_FUNC(0xA1D68767, typeinfo name for short const*); + //REG_FUNC(0xE6498BCD, typeinfo name for unsigned short const*); + //REG_FUNC(0xF0FF237E, typeinfo name for void const*); + //REG_FUNC(0xD255293A, typeinfo name for wchar_t const*); + //REG_FUNC(0x2EADF5EC, typeinfo name for long long const*); + //REG_FUNC(0xEC3461AB, typeinfo name for unsigned long long const*); + //REG_FUNC(0xB3EDCB7F, typeinfo name for long long __vector*); + //REG_FUNC(0x6D11C7D6, typeinfo name for unsigned long long __vector*); + //REG_FUNC(0xC5AC688C, typeinfo name for signed char*); + //REG_FUNC(0xE4EB3C43, typeinfo name for bool*); + //REG_FUNC(0xAEF69715, typeinfo name for char*); + //REG_FUNC(0x6F81469F, typeinfo name for double*); + //REG_FUNC(0xFD38BF3B, typeinfo name for long double*); + //REG_FUNC(0xFCB96733, typeinfo name for float*); + //REG_FUNC(0x5BFE19AB, typeinfo name for unsigned char*); + //REG_FUNC(0x187E3B47, typeinfo name for int*); + //REG_FUNC(0x2F4A5390, typeinfo name for unsigned int*); + //REG_FUNC(0x651D020E, typeinfo name for long*); + //REG_FUNC(0x6E4D412D, typeinfo name for unsigned long*); + //REG_FUNC(0x982D9703, typeinfo name for short*); + //REG_FUNC(0xE2A0B0A8, typeinfo name for unsigned short*); + //REG_FUNC(0xF7B6B02A, typeinfo name for void*); + //REG_FUNC(0xF1C9A755, typeinfo name for wchar_t*); + //REG_FUNC(0x968B212, typeinfo name for long long*); + //REG_FUNC(0x9787CAD, typeinfo name for unsigned long long*); + //REG_FUNC(0xF86F5756, typeinfo name for std::iostream); + //REG_FUNC(0x999300E0, typeinfo name for std::istream); + //REG_FUNC(0x591C25A3, typeinfo name for std::ostream); + //REG_FUNC(0xFC9D21B, typeinfo name for std::bad_typeid); + //REG_FUNC(0x867D109E, typeinfo name for std::istrstream); + //REG_FUNC(0x88BFC745, typeinfo name for std::ostrstream); + //REG_FUNC(0xB315CE7A, typeinfo name for std::_ctype_base); + //REG_FUNC(0xA65DACDF, typeinfo name for std::logic_error); + //REG_FUNC(0x1B8E7108, typeinfo name for std::range_error); + //REG_FUNC(0xBE23707A, typeinfo name for std::domain_error); + //REG_FUNC(0x9E317CE1, typeinfo name for std::length_error); + //REG_FUNC(0xD8DAD98D, typeinfo name for std::out_of_range); + //REG_FUNC(0x1C929309, typeinfo name for std::strstreambuf); + //REG_FUNC(0xE17E4D6, typeinfo name for std::_codecvt_base); + //REG_FUNC(0x918FE198, typeinfo name for std::bad_exception); + //REG_FUNC(0x227B4568, typeinfo name for std::basic_filebuf >); + //REG_FUNC(0xD34BAF59, typeinfo name for std::basic_filebuf >); + //REG_FUNC(0x4381D6B0, typeinfo name for std::basic_istream >); + //REG_FUNC(0x8D487027, typeinfo name for std::basic_ostream >); + //REG_FUNC(0xCAA9B21D, typeinfo name for std::runtime_error); + //REG_FUNC(0xA21B1185, typeinfo name for std::overflow_error); + //REG_FUNC(0x4A1A1314, typeinfo name for std::basic_streambuf >); + //REG_FUNC(0x26C1C38F, typeinfo name for std::basic_streambuf >); + //REG_FUNC(0x140AE4BB, typeinfo name for std::underflow_error); + //REG_FUNC(0xC3CD5E06, typeinfo name for std::invalid_argument); + //REG_FUNC(0xB07DF922, typeinfo name for std::_Iosb); + //REG_FUNC(0xED549839, typeinfo name for std::_ctype); + //REG_FUNC(0x89304937, typeinfo name for std::_ctype); + //REG_FUNC(0x17AAF611, typeinfo name for std::_codecvt); + //REG_FUNC(0xB4C66A72, typeinfo name for std::_codecvt); + //REG_FUNC(0x4C50F26D, typeinfo name for std::bad_cast); + //REG_FUNC(0xA263F3D5, typeinfo name for std::ios_base); + //REG_FUNC(0x8DA9C17C, typeinfo name for std::_numpunct); + //REG_FUNC(0xC4F9C216, typeinfo name for std::_numpunct); + //REG_FUNC(0xDF0FFCD2, typeinfo name for std::bad_alloc); + //REG_FUNC(0xB37BE412, typeinfo name for std::basic_ios >); + //REG_FUNC(0xCA50ACCA, typeinfo name for std::basic_ios >); + //REG_FUNC(0x45FD9715, typeinfo name for std::exception); + //REG_FUNC(0xE5C789D4, typeinfo name for std::strstream); + //REG_FUNC(0x2856DCD6, typeinfo name for std::type_info); + //REG_FUNC(0x75A1CED4, typeinfo name for long long __vector); + //REG_FUNC(0x508FF61E, typeinfo name for unsigned long long __vector); + //REG_FUNC(0x8E6A51A, typeinfo name for signed char); + //REG_FUNC(0x491DB7D3, typeinfo name for bool); + //REG_FUNC(0xD657B5A0, typeinfo name for char); + //REG_FUNC(0x322C7CB5, typeinfo name for double); + //REG_FUNC(0x596C02C7, typeinfo name for long double); + //REG_FUNC(0x2434A5DD, typeinfo name for float); + //REG_FUNC(0x890DE9E8, typeinfo name for unsigned char); + //REG_FUNC(0x4B9F21DF, typeinfo name for int); + //REG_FUNC(0x4C2D1984, typeinfo name for unsigned int); + //REG_FUNC(0x46E67574, typeinfo name for long); + //REG_FUNC(0xEE238074, typeinfo name for unsigned long); + //REG_FUNC(0x8C9CDB9C, typeinfo name for short); + //REG_FUNC(0xED2E996A, typeinfo name for unsigned short); + //REG_FUNC(0xD4744378, typeinfo name for void); + //REG_FUNC(0x2C50C827, typeinfo name for wchar_t); + //REG_FUNC(0x9574359B, typeinfo name for long long); + //REG_FUNC(0x402717E4, typeinfo name for unsigned long long); + //REG_FUNC(0x51B29810, VTT for std::iostream); + //REG_FUNC(0x52128B13, VTT for std::istream); + //REG_FUNC(0x3C508708, VTT for std::ostream); + //REG_FUNC(0x87753F6, VTT for std::istrstream); + //REG_FUNC(0xE3D7CB30, VTT for std::ostrstream); + //REG_FUNC(0xBC326B50, VTT for std::basic_istream >); + //REG_FUNC(0x16E32018, VTT for std::basic_ostream >); + //REG_FUNC(0xC91F7671, VTT for std::strstream); + //REG_FUNC(0x648213CC, vtable for std::ios_base::failure); + //REG_FUNC(0x796EA5C0, vtable for std::iostream); + //REG_FUNC(0xC5D326CB, _ZTVSd__St9strstream); + //REG_FUNC(0xB02CB03C, vtable for std::istream); + //REG_FUNC(0xF4400A94, _ZTVSiSd__St9strstream); + //REG_FUNC(0xF2A1132D, _ZTVSi__Sd); + //REG_FUNC(0xDFF04427, _ZTVSi__St10istrstream); + //REG_FUNC(0xD430E6D2, vtable for std::ostream); + //REG_FUNC(0x3CAA5F50, _ZTVSoSd__St9strstream); + //REG_FUNC(0x6D6BCA93, _ZTVSo__Sd); + //REG_FUNC(0xBA833AE3, _ZTVSo__Sd__St9strstream); + //REG_FUNC(0x65069CB5, _ZTVSo__St10ostrstream); + //REG_FUNC(0x76BDD7CC, vtable for std::bad_typeid); + //REG_FUNC(0xFBACB296, vtable for std::istrstream); + //REG_FUNC(0xA81AD21D, vtable for std::ostrstream); + //REG_FUNC(0x82A84E5E, vtable for std::logic_error); + //REG_FUNC(0x1D583475, vtable for std::range_error); + //REG_FUNC(0x80C77E16, vtable for std::domain_error); + //REG_FUNC(0x64ADA35, vtable for std::length_error); + //REG_FUNC(0xDDAE7CBE, vtable for std::out_of_range); + //REG_FUNC(0x11B2781A, vtable for std::strstreambuf); + //REG_FUNC(0x75D16BD0, vtable for std::_codecvt_base); + //REG_FUNC(0x4AA9C954, vtable for std::bad_exception); + //REG_FUNC(0xC3233C50, vtable for std::basic_filebuf >); + //REG_FUNC(0xF269A8EB, vtable for std::basic_filebuf >); + //REG_FUNC(0xB952752B, vtable for std::basic_istream >); + //REG_FUNC(0x48F3405B, vtable for std::basic_ostream >); + //REG_FUNC(0x53F02A18, vtable for std::runtime_error); + //REG_FUNC(0x177FCCDC, vtable for std::overflow_error); + //REG_FUNC(0x5548FF7, vtable for std::basic_streambuf >); + //REG_FUNC(0xE8A9F32E, vtable for std::basic_streambuf >); + //REG_FUNC(0x515AE097, vtable for std::underflow_error); + //REG_FUNC(0x23EEDAF0, vtable for std::invalid_argument); + //REG_FUNC(0x214E1395, vtable for std::_ctype); + //REG_FUNC(0x798E7C29, vtable for std::_ctype); + //REG_FUNC(0x9B3E5D29, vtable for std::_codecvt); + //REG_FUNC(0x95405266, vtable for std::_codecvt); + //REG_FUNC(0xAA09FD32, vtable for std::bad_cast); + //REG_FUNC(0xD58C5F52, vtable for std::ios_base); + //REG_FUNC(0xA27EFBA3, vtable for std::bad_alloc); + //REG_FUNC(0x147996ED, vtable for std::basic_ios >); + //REG_FUNC(0xDE4AFE9, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Sd__St9strstream); + //REG_FUNC(0x87D18300, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SiSd__St9strstream); + //REG_FUNC(0x3D6A38D3, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__Sd); + //REG_FUNC(0xA8E795AF, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__St10istrstream); + //REG_FUNC(0xB7CD4C0E, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SoSd__St9strstream); + //REG_FUNC(0x21FDA8D0, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__Sd); + //REG_FUNC(0xA8AAEABA, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__St10ostrstream); + //REG_FUNC(0xCC03F184, vtable for std::basic_ios >); + //REG_FUNC(0xBC97F7D6, vtable for std::exception); + //REG_FUNC(0xFD21E1F1, vtable for std::strstream); + //REG_FUNC(0x8E9879A7, vtable for std::type_info); + //REG_FUNC(0xE63750C1, std::basic_filebuf >::_Init(std::_Dnk_filet*, std::basic_filebuf >::_Initfl)::_Stinit); + //REG_FUNC(0x1D4E29BC, std::basic_filebuf >::_Init(std::_Dnk_filet*, std::basic_filebuf >::_Initfl)::_Stinit); + //REG_FUNC(0x8A37475, typeinfo for __cxxabiv1::__enum_type_info); + //REG_FUNC(0x66CC7DBB, typeinfo for __cxxabiv1::__array_type_info); + //REG_FUNC(0x81C44513, typeinfo for __cxxabiv1::__class_type_info); + //REG_FUNC(0xC35024DA, typeinfo for __cxxabiv1::__pbase_type_info); + //REG_FUNC(0x835E9E78, typeinfo for __cxxabiv1::__pointer_type_info); + //REG_FUNC(0x62941235, typeinfo for __cxxabiv1::__function_type_info); + //REG_FUNC(0x461E17F0, typeinfo for __cxxabiv1::__si_class_type_info); + //REG_FUNC(0xB80BFF06, typeinfo for __cxxabiv1::__vmi_class_type_info); + //REG_FUNC(0x7373F517, typeinfo for __cxxabiv1::__fundamental_type_info); + //REG_FUNC(0xDF23E7B5, typeinfo for __cxxabiv1::__pointer_to_member_type_info); + //REG_FUNC(0x74F19FF2, typeinfo name for __cxxabiv1::__enum_type_info); + //REG_FUNC(0x9BF7C72D, typeinfo name for __cxxabiv1::__array_type_info); + //REG_FUNC(0xCB5063F1, typeinfo name for __cxxabiv1::__class_type_info); + //REG_FUNC(0x4F5C24A6, typeinfo name for __cxxabiv1::__pbase_type_info); + //REG_FUNC(0x832019EE, typeinfo name for __cxxabiv1::__pointer_type_info); + //REG_FUNC(0xFB8956D8, typeinfo name for __cxxabiv1::__function_type_info); + //REG_FUNC(0xEAC164EC, typeinfo name for __cxxabiv1::__si_class_type_info); + //REG_FUNC(0x4106109E, typeinfo name for __cxxabiv1::__vmi_class_type_info); + //REG_FUNC(0x1FD93E3A, typeinfo name for __cxxabiv1::__fundamental_type_info); + //REG_FUNC(0xB64B4F55, typeinfo name for __cxxabiv1::__pointer_to_member_type_info); + //REG_FUNC(0x4937B673, vtable for __cxxabiv1::__enum_type_info); + //REG_FUNC(0x9383FBD6, vtable for __cxxabiv1::__array_type_info); + //REG_FUNC(0xF79AE8E1, vtable for __cxxabiv1::__class_type_info); + //REG_FUNC(0xFEAD4BDA, vtable for __cxxabiv1::__pbase_type_info); + //REG_FUNC(0xAA57484D, vtable for __cxxabiv1::__pointer_type_info); + //REG_FUNC(0x897B54E3, vtable for __cxxabiv1::__function_type_info); + //REG_FUNC(0x6BC74629, vtable for __cxxabiv1::__si_class_type_info); + //REG_FUNC(0x7321E731, vtable for __cxxabiv1::__vmi_class_type_info); + //REG_FUNC(0x33836375, vtable for __cxxabiv1::__fundamental_type_info); + //REG_FUNC(0x94664DEB, vtable for __cxxabiv1::__pointer_to_member_type_info); + + return psv_log_base("SceLibstdcxx"); +}(); + +/* +// original names + +REG_FUNC(0x173E7421, __aeabi_unwind_cpp_pr0); +REG_FUNC(0x52B0C625, _ZNKSt10bad_typeid4whatEv); +REG_FUNC(0x64D7D074, _ZNKSt10bad_typeid8_DoraiseEv); +REG_FUNC(0x15FB88E2, _ZNKSt11logic_error4whatEv); +REG_FUNC(0x492D1209, _ZNKSt11logic_error8_DoraiseEv); +REG_FUNC(0xDBDFF9D0, _ZNKSt11range_error8_DoraiseEv); +REG_FUNC(0xE8D59AB5, _ZNKSt12_String_base5_XlenEv); +REG_FUNC(0x473DC636, _ZNKSt12_String_base5_XranEv); +REG_FUNC(0x481ECB76, _ZNKSt12domain_error8_DoraiseEv); +REG_FUNC(0xB03E909C, _ZNKSt12length_error8_DoraiseEv); +REG_FUNC(0x38CF41AC, _ZNKSt12out_of_range8_DoraiseEv); +REG_FUNC(0x55AE5502, _ZNKSt13_codecvt_base11do_encodingEv); +REG_FUNC(0x5522293F, _ZNKSt13_codecvt_base13do_max_lengthEv); +REG_FUNC(0xCF5643A9, _ZNKSt13_codecvt_base16do_always_noconvEv); +REG_FUNC(0x51FCD56B, _ZNKSt13bad_exception4whatEv); +REG_FUNC(0x109E54C9, _ZNKSt13bad_exception8_DoraiseEv); +REG_FUNC(0xAE85C2EE, _ZNKSt13runtime_error4whatEv); +REG_FUNC(0x1D878503, _ZNKSt13runtime_error8_DoraiseEv); +REG_FUNC(0xEED101C6, _ZNKSt14overflow_error8_DoraiseEv); +REG_FUNC(0xB1AE6F9E, _ZNKSt15underflow_error8_DoraiseEv); +REG_FUNC(0x16F56E8D, _ZNKSt16invalid_argument8_DoraiseEv); +REG_FUNC(0x6C568D20, _ZNKSt6_ctypeIcE10do_tolowerEPcPKc); +REG_FUNC(0xC334DE66, _ZNKSt6_ctypeIcE10do_tolowerEc); +REG_FUNC(0x2DD808E, _ZNKSt6_ctypeIcE10do_toupperEPcPKc); +REG_FUNC(0xF6AF33EA, _ZNKSt6_ctypeIcE10do_toupperEc); +REG_FUNC(0x1B81D726, _ZNKSt6_ctypeIcE8do_widenEPKcS2_Pc); +REG_FUNC(0x6471CC01, _ZNKSt6_ctypeIcE8do_widenEc); +REG_FUNC(0x9CFA56E5, _ZNKSt6_ctypeIcE9do_narrowEPKcS2_cPc); +REG_FUNC(0x718669AB, _ZNKSt6_ctypeIcE9do_narrowEcc); +REG_FUNC(0x759F105D, _ZNKSt6_ctypeIwE10do_scan_isEsPKwS2_); +REG_FUNC(0x56443F, _ZNKSt6_ctypeIwE10do_tolowerEPwPKw); +REG_FUNC(0x33E9ECDD, _ZNKSt6_ctypeIwE10do_tolowerEw); +REG_FUNC(0x1256E6A5, _ZNKSt6_ctypeIwE10do_toupperEPwPKw); +REG_FUNC(0x64072C2E, _ZNKSt6_ctypeIwE10do_toupperEw); +REG_FUNC(0x339766BF, _ZNKSt6_ctypeIwE11do_scan_notEsPKwS2_); +REG_FUNC(0xDA4E1651, _ZNKSt6_ctypeIwE5do_isEPKwS2_Ps); +REG_FUNC(0x5A06C0E8, _ZNKSt6_ctypeIwE5do_isEsw); +REG_FUNC(0x609036C7, _ZNKSt6_ctypeIwE8do_widenEPKcS2_Pw); +REG_FUNC(0xA2896AA8, _ZNKSt6_ctypeIwE8do_widenEc); +REG_FUNC(0x631687B9, _ZNKSt6_ctypeIwE9do_narrowEPKwS2_cPc); +REG_FUNC(0xB4D8D2F0, _ZNKSt6_ctypeIwE9do_narrowEwc); +REG_FUNC(0xD9070137, _ZNKSt8_codecvtIccSt9_MbstatetE10do_unshiftERS0_PcS3_RS3_); +REG_FUNC(0xABA0412F, _ZNKSt8_codecvtIccSt9_MbstatetE5do_inERS0_PKcS4_RS4_PcS6_RS6_); +REG_FUNC(0x51052F04, _ZNKSt8_codecvtIccSt9_MbstatetE6do_outERS0_PKcS4_RS4_PcS6_RS6_); +REG_FUNC(0x39F062BE, _ZNKSt8_codecvtIccSt9_MbstatetE9do_lengthERKS0_PKcS5_j); +REG_FUNC(0xF07CC89F, _ZNKSt8_codecvtIwcSt9_MbstatetE10do_unshiftERS0_PcS3_RS3_); +REG_FUNC(0xF3A2E837, _ZNKSt8_codecvtIwcSt9_MbstatetE11do_encodingEv); +REG_FUNC(0x1F133D1E, _ZNKSt8_codecvtIwcSt9_MbstatetE13do_max_lengthEv); +REG_FUNC(0x27716D17, _ZNKSt8_codecvtIwcSt9_MbstatetE16do_always_noconvEv); +REG_FUNC(0x1C1AFE42, _ZNKSt8_codecvtIwcSt9_MbstatetE5do_inERS0_PKcS4_RS4_PwS6_RS6_); +REG_FUNC(0xCBDE5500, _ZNKSt8_codecvtIwcSt9_MbstatetE6do_outERS0_PKwS4_RS4_PcS6_RS6_); +REG_FUNC(0xF4D38990, _ZNKSt8_codecvtIwcSt9_MbstatetE9do_lengthERKS0_PKcS5_j); +REG_FUNC(0x46A9143F, _ZNKSt8bad_cast4whatEv); +REG_FUNC(0x8D129D3F, _ZNKSt8bad_cast8_DoraiseEv); +REG_FUNC(0xF877F51E, _ZNKSt8ios_base7failure8_DoraiseEv); +REG_FUNC(0x664750EE, _ZNKSt9bad_alloc4whatEv); +REG_FUNC(0xBA89FBE7, _ZNKSt9bad_alloc8_DoraiseEv); +REG_FUNC(0xC133E331, _ZNKSt9exception4whatEv); +REG_FUNC(0x656BE32, _ZNKSt9exception6_RaiseEv); +REG_FUNC(0x47A5CDA2, _ZNKSt9exception8_DoraiseEv); +REG_FUNC(0xBAE38DF9, _ZNKSt9type_info4nameEv); +REG_FUNC(0x1F260F10, _ZNKSt9type_info6beforeERKS_); +REG_FUNC(0xDB15F0FC, _ZNKSt9type_infoeqERKS_); +REG_FUNC(0x9994F9FE, _ZNKSt9type_infoneERKS_); +REG_FUNC(0x2DA9FCEC, _ZNSdD0Ev); +REG_FUNC(0x6C2D3707, _ZNSdD1Ev); +REG_FUNC(0x9BA8786E, _ZNSiD0Ev); +REG_FUNC(0xD089A7C9, _ZNSiD1Ev); +REG_FUNC(0x3EE0611A, _ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEEb); +REG_FUNC(0x6489E51D, _ZNSoD0Ev); +REG_FUNC(0xEF21C386, _ZNSoD1Ev); +REG_FUNC(0x10D794D4, _ZNSs5_GrowEjb); +REG_FUNC(0x846D0286, _ZNSs6assignERKSsjj); +REG_FUNC(0x2AF7786D, _ZNSsC1EPKc); +REG_FUNC(0x92F661CF, _ZNSsC1ERKSs); +REG_FUNC(0xECC3B9C2, _ZNSt10bad_typeidC1ERKS_); +REG_FUNC(0x9F4CD196, _ZNSt10bad_typeidC1Ev); +REG_FUNC(0x7AE1631B, _ZNSt10bad_typeidC2ERKS_); +REG_FUNC(0x33377802, _ZNSt10bad_typeidC2Ev); +REG_FUNC(0x2CE020C7, _ZNSt10bad_typeidD0Ev); +REG_FUNC(0x625460B9, _ZNSt10bad_typeidD1Ev); +REG_FUNC(0xB4F5C5A7, _ZNSt10bad_typeidD2Ev); +REG_FUNC(0x55AAD6A6, _ZNSt10bad_typeidaSERKS_); +REG_FUNC(0x9CF31703, _ZNSt10istrstreamD0Ev); +REG_FUNC(0x71D13A36, _ZNSt10istrstreamD1Ev); +REG_FUNC(0xAF5DF8C3, _ZNSt10istrstreamD2Ev); +REG_FUNC(0xC1E7C7A, _ZNSt10ostrstreamC1EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xC09B290, _ZNSt10ostrstreamC2EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0x4B8BA644, _ZNSt10ostrstreamD0Ev); +REG_FUNC(0xE463FB3, _ZNSt10ostrstreamD1Ev); +REG_FUNC(0xA0A34FEF, _ZNSt10ostrstreamD2Ev); +REG_FUNC(0xC9F632FF, _ZNSt11logic_errorC1ERKS_); +REG_FUNC(0xE6356C5C, _ZNSt11logic_errorC2ERKSs); +REG_FUNC(0x6322FEB0, _ZNSt11logic_errorD0Ev); +REG_FUNC(0x35ED9C5A, _ZNSt11logic_errorD1Ev); +REG_FUNC(0x1FFC4420, _ZNSt11logic_errorD2Ev); +REG_FUNC(0x6F6E3A52, _ZNSt11range_errorC1ERKS_); +REG_FUNC(0xFD97D28A, _ZNSt11range_errorD0Ev); +REG_FUNC(0x1C86405F, _ZNSt11range_errorD1Ev); +REG_FUNC(0xEF754EBD, _ZNSt11range_errorD2Ev); +REG_FUNC(0x7D5412EF, _ZNSt12domain_errorC1ERKS_); +REG_FUNC(0x803A7D3E, _ZNSt12domain_errorD0Ev); +REG_FUNC(0xA6BCA2AD, _ZNSt12domain_errorD1Ev); +REG_FUNC(0x36F9D2A, _ZNSt12domain_errorD2Ev); +REG_FUNC(0x5F3428AD, _ZNSt12length_errorC1ERKS_); +REG_FUNC(0xF6FB801D, _ZNSt12length_errorC1ERKSs); +REG_FUNC(0xF83AA7DA, _ZNSt12length_errorD0Ev); +REG_FUNC(0xA873D7F9, _ZNSt12length_errorD1Ev); +REG_FUNC(0xBB12C75, _ZNSt12length_errorD2Ev); +REG_FUNC(0x299AA587, _ZNSt12out_of_rangeC1ERKS_); +REG_FUNC(0xC8BA5522, _ZNSt12out_of_rangeC1ERKSs); +REG_FUNC(0xA8C470A4, _ZNSt12out_of_rangeD0Ev); +REG_FUNC(0x5FAE79BF, _ZNSt12out_of_rangeD1Ev); +REG_FUNC(0x7908CBAB, _ZNSt12out_of_rangeD2Ev); +REG_FUNC(0xDCCE6368, _ZNSt12strstreambuf5_InitEiPcS0_i); +REG_FUNC(0xD85AE271, _ZNSt12strstreambuf5_TidyEv); +REG_FUNC(0xD189E6CC, _ZNSt12strstreambuf6freezeEb); +REG_FUNC(0xFA6BDF33, _ZNSt12strstreambuf7seekoffElNSt5_IosbIiE8_SeekdirENS1_9_OpenmodeE); +REG_FUNC(0x97A9813A, _ZNSt12strstreambuf7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xED2539E2, _ZNSt12strstreambuf8overflowEi); +REG_FUNC(0xC725F896, _ZNSt12strstreambuf9pbackfailEi); +REG_FUNC(0xA9F4FABF, _ZNSt12strstreambuf9underflowEv); +REG_FUNC(0x1C887DDE, _ZNSt12strstreambufD0Ev); +REG_FUNC(0x29E1E930, _ZNSt12strstreambufD1Ev); +REG_FUNC(0xA140889, _ZNSt12strstreambufD2Ev); +REG_FUNC(0xA8FE6FC4, _ZNSt13_codecvt_baseD0Ev); +REG_FUNC(0xB0E47AE4, _ZNSt13_codecvt_baseD1Ev); +REG_FUNC(0xB7EE9CC2, _ZNSt13bad_exceptionC1ERKS_); +REG_FUNC(0xD719280E, _ZNSt13bad_exceptionC1Ev); +REG_FUNC(0x37D2017F, _ZNSt13bad_exceptionC2ERKS_); +REG_FUNC(0x3DE54D83, _ZNSt13bad_exceptionC2Ev); +REG_FUNC(0xC7880D1A, _ZNSt13bad_exceptionD0Ev); +REG_FUNC(0x486B59CE, _ZNSt13bad_exceptionD1Ev); +REG_FUNC(0xD04E0BAB, _ZNSt13bad_exceptionD2Ev); +REG_FUNC(0x792097AA, _ZNSt13bad_exceptionaSERKS_); +REG_FUNC(0xCC369863, _ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv); +REG_FUNC(0xC8BAB41E, _ZNSt13basic_filebufIcSt11char_traitsIcEE5_LockEv); +REG_FUNC(0xD5F03A74, _ZNSt13basic_filebufIcSt11char_traitsIcEE5uflowEv); +REG_FUNC(0x413E813E, _ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci); +REG_FUNC(0x9D193B65, _ZNSt13basic_filebufIcSt11char_traitsIcEE7_UnlockEv); +REG_FUNC(0x52E47FB5, _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0xE119B37, _ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0x616754BC, _ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi); +REG_FUNC(0xCD5BD2E1, _ZNSt13basic_filebufIcSt11char_traitsIcEE9_EndwriteEv); +REG_FUNC(0xFC1C7F3A, _ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi); +REG_FUNC(0x31693B42, _ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv); +REG_FUNC(0xC2F03DFD, _ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev); +REG_FUNC(0x54A77A0D, _ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev); +REG_FUNC(0x253888BD, _ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv); +REG_FUNC(0x4EC524DC, _ZNSt13basic_filebufIwSt11char_traitsIwEE5_LockEv); +REG_FUNC(0xE777348C, _ZNSt13basic_filebufIwSt11char_traitsIwEE5uflowEv); +REG_FUNC(0x1E1E8BBF, _ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi); +REG_FUNC(0x281D0191, _ZNSt13basic_filebufIwSt11char_traitsIwEE7_UnlockEv); +REG_FUNC(0x9C87B03F, _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0x8021D69B, _ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xD8127E0A, _ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj); +REG_FUNC(0x99FDEB76, _ZNSt13basic_filebufIwSt11char_traitsIwEE9_EndwriteEv); +REG_FUNC(0x950786D7, _ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj); +REG_FUNC(0x572A65D3, _ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv); +REG_FUNC(0x96D09EA4, _ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xD434F085, _ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev); +REG_FUNC(0xFFFA683E, _ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xB58839C5, _ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x9BF8855B, _ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_Eb); +REG_FUNC(0xD74F56E, _ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0x9B831B60, _ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x396337CE, _ZNSt13runtime_errorC1ERKS_); +REG_FUNC(0xDAD26367, _ZNSt13runtime_errorD0Ev); +REG_FUNC(0x7F1FDAEA, _ZNSt13runtime_errorD1Ev); +REG_FUNC(0xECC19AEB, _ZNSt13runtime_errorD2Ev); +REG_FUNC(0xE67F3768, _ZNSt14overflow_errorC1ERKS_); +REG_FUNC(0xF7C46A5D, _ZNSt14overflow_errorD0Ev); +REG_FUNC(0x5C666F7E, _ZNSt14overflow_errorD1Ev); +REG_FUNC(0x4E45F680, _ZNSt14overflow_errorD2Ev); +REG_FUNC(0x626515E3, _ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv); +REG_FUNC(0x2E55F15A, _ZNSt15basic_streambufIcSt11char_traitsIcEE5_LockEv); +REG_FUNC(0xF8535AB, _ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv); +REG_FUNC(0xD7933D06, _ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci); +REG_FUNC(0xB8BCCC8D, _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci); +REG_FUNC(0x43E5D0F1, _ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci); +REG_FUNC(0x149B193A, _ZNSt15basic_streambufIcSt11char_traitsIcEE7_UnlockEv); +REG_FUNC(0x600998EC, _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0x1DEFFD6, _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xF5F44352, _ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi); +REG_FUNC(0xCA79344F, _ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi); +REG_FUNC(0x441788B1, _ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv); +REG_FUNC(0x797DAE94, _ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv); +REG_FUNC(0x74AD52E, _ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev); +REG_FUNC(0xE449E2BF, _ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev); +REG_FUNC(0x9FAA0AA, _ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv); +REG_FUNC(0xA596C88C, _ZNSt15basic_streambufIwSt11char_traitsIwEE5_LockEv); +REG_FUNC(0x373C2CD8, _ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv); +REG_FUNC(0x3F363796, _ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi); +REG_FUNC(0xABE96E40, _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi); +REG_FUNC(0x506D0DAE, _ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi); +REG_FUNC(0xBD378207, _ZNSt15basic_streambufIwSt11char_traitsIwEE7_UnlockEv); +REG_FUNC(0x924BD940, _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffElNSt5_IosbIiE8_SeekdirENS4_9_OpenmodeE); +REG_FUNC(0x2CD1C1AF, _ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposISt9_MbstatetENSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xB0DD9881, _ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj); +REG_FUNC(0xDD04652F, _ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj); +REG_FUNC(0x9DCBD6A5, _ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv); +REG_FUNC(0xC3892DE5, _ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv); +REG_FUNC(0x8DFACE66, _ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev); +REG_FUNC(0x868E865C, _ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x9A59BC50, _ZNSt15underflow_errorC1ERKS_); +REG_FUNC(0x47A589A4, _ZNSt15underflow_errorD0Ev); +REG_FUNC(0xCED74DE7, _ZNSt15underflow_errorD1Ev); +REG_FUNC(0xA76F038A, _ZNSt15underflow_errorD2Ev); +REG_FUNC(0x6332FA62, _ZNSt16invalid_argumentC1ERKS_); +REG_FUNC(0x188D86CF, _ZNSt16invalid_argumentD0Ev); +REG_FUNC(0x9982A4FC, _ZNSt16invalid_argumentD1Ev); +REG_FUNC(0x1AB2B1AC, _ZNSt16invalid_argumentD2Ev); +REG_FUNC(0xF9FAB558, _ZNSt6_Mutex5_LockEv); +REG_FUNC(0x402C9F8, _ZNSt6_Mutex7_UnlockEv); +REG_FUNC(0x9DA92617, _ZNSt6_MutexC1ESt14_Uninitialized); +REG_FUNC(0xA4F99AE7, _ZNSt6_MutexC1Ev); +REG_FUNC(0x7B5A6B7F, _ZNSt6_MutexC2ESt14_Uninitialized); +REG_FUNC(0x5C5CD6B9, _ZNSt6_MutexC2Ev); +REG_FUNC(0x9B37CAD9, _ZNSt6_MutexD1Ev); +REG_FUNC(0x3E6A67FE, _ZNSt6_MutexD2Ev); +REG_FUNC(0xABB11CF9, _ZNSt6_WinitC1Ev); +REG_FUNC(0x90DD73C3, _ZNSt6_WinitC2Ev); +REG_FUNC(0x579C349B, _ZNSt6_WinitD1Ev); +REG_FUNC(0x3794ED15, _ZNSt6_WinitD2Ev); +REG_FUNC(0x24DA6258, _ZNSt6_ctypeIcED0Ev); +REG_FUNC(0xF9C92C6A, _ZNSt6_ctypeIcED1Ev); +REG_FUNC(0x554E4742, _ZNSt6_ctypeIwED0Ev); +REG_FUNC(0xD4AEA4D3, _ZNSt6_ctypeIwED1Ev); +REG_FUNC(0x5A7D89F0, _ZNSt8_codecvtIccSt9_MbstatetED0Ev); +REG_FUNC(0xB613F281, _ZNSt8_codecvtIccSt9_MbstatetED1Ev); +REG_FUNC(0x1E11185A, _ZNSt8_codecvtIwcSt9_MbstatetED0Ev); +REG_FUNC(0x14125DF4, _ZNSt8_codecvtIwcSt9_MbstatetED1Ev); +REG_FUNC(0xD2A4428D, _ZNSt8bad_castC1ERKS_); +REG_FUNC(0x7922CC7C, _ZNSt8bad_castC1Ev); +REG_FUNC(0x6DC64647, _ZNSt8bad_castC2ERKS_); +REG_FUNC(0x596BA786, _ZNSt8bad_castC2Ev); +REG_FUNC(0x5416699C, _ZNSt8bad_castD0Ev); +REG_FUNC(0x1D09710D, _ZNSt8bad_castD1Ev); +REG_FUNC(0x3C6B52E7, _ZNSt8bad_castD2Ev); +REG_FUNC(0x95966020, _ZNSt8bad_castaSERKS_); +REG_FUNC(0xF81D3B86, _ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi); +REG_FUNC(0x5E60B2B3, _ZNSt8ios_base4InitC1Ev); +REG_FUNC(0x5ED60DEE, _ZNSt8ios_base4InitC2Ev); +REG_FUNC(0x65D88619, _ZNSt8ios_base4InitD1Ev); +REG_FUNC(0x3483E01D, _ZNSt8ios_base4InitD2Ev); +REG_FUNC(0x78CB190E, _ZNSt8ios_base5_InitEv); +REG_FUNC(0x23B8BEE, _ZNSt8ios_base5_TidyEv); +REG_FUNC(0xC9DE8208, _ZNSt8ios_base5clearENSt5_IosbIiE8_IostateEb); +REG_FUNC(0xAA9171FB, _ZNSt8ios_base7_AddstdEv); +REG_FUNC(0xFC58778, _ZNSt8ios_base7copyfmtERKS_); +REG_FUNC(0x2DF76755, _ZNSt8ios_base7failureC1ERKS0_); +REG_FUNC(0x94048F7, _ZNSt8ios_base7failureC1ERKSs); +REG_FUNC(0x20AAAB95, _ZNSt8ios_base7failureD0Ev); +REG_FUNC(0x31D0197A, _ZNSt8ios_base7failureD1Ev); +REG_FUNC(0x7736E940, _ZNSt8ios_base8_CallfnsENS_5eventE); +REG_FUNC(0xE8C4640A, _ZNSt8ios_base8_FindarrEi); +REG_FUNC(0xB8CFFB8D, _ZNSt8ios_baseD0Ev); +REG_FUNC(0x40EA90D5, _ZNSt8ios_baseD1Ev); +REG_FUNC(0xDCE89E71, _ZNSt8ios_baseD2Ev); +REG_FUNC(0xE15EEC2A, _ZNSt9bad_allocC1ERKS_); +REG_FUNC(0xEC3804D2, _ZNSt9bad_allocC1Ev); +REG_FUNC(0x6AF75467, _ZNSt9bad_allocC2ERKS_); +REG_FUNC(0x57096162, _ZNSt9bad_allocC2Ev); +REG_FUNC(0xB2DAA408, _ZNSt9bad_allocD0Ev); +REG_FUNC(0x7AEE736, _ZNSt9bad_allocD1Ev); +REG_FUNC(0xA9E9B7B7, _ZNSt9bad_allocD2Ev); +REG_FUNC(0x7853E8E5, _ZNSt9bad_allocaSERKS_); +REG_FUNC(0xF78468EB, _ZNSt9basic_iosIcSt11char_traitsIcEED0Ev); +REG_FUNC(0x3150182, _ZNSt9basic_iosIcSt11char_traitsIcEED1Ev); +REG_FUNC(0x9654168A, _ZNSt9basic_iosIwSt11char_traitsIwEED0Ev); +REG_FUNC(0x8FFB8524, _ZNSt9basic_iosIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x7AF1BB16, _ZNSt9exception18_Set_raise_handlerEPFvRKS_E); +REG_FUNC(0x8C5A4417, _ZNSt9exceptionC1ERKS_); +REG_FUNC(0xFC169D71, _ZNSt9exceptionC1Ev); +REG_FUNC(0x59758E74, _ZNSt9exceptionC2ERKS_); +REG_FUNC(0xE08376, _ZNSt9exceptionC2Ev); +REG_FUNC(0x82EEA67E, _ZNSt9exceptionD0Ev); +REG_FUNC(0x30405D88, _ZNSt9exceptionD1Ev); +REG_FUNC(0xAF7A7081, _ZNSt9exceptionD2Ev); +REG_FUNC(0x6CE63118, _ZNSt9exceptionaSERKS_); +REG_FUNC(0x911F5A80, _ZNSt9strstreamC1EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0x27166DDA, _ZNSt9strstreamC2EPciNSt5_IosbIiE9_OpenmodeE); +REG_FUNC(0xC4099868, _ZNSt9strstreamD0Ev); +REG_FUNC(0x98BD8AE1, _ZNSt9strstreamD1Ev); +REG_FUNC(0x7D8DFE43, _ZNSt9strstreamD2Ev); +REG_FUNC(0x8D4B1A13, _ZNSt9type_infoD0Ev); +REG_FUNC(0xBD786240, _ZNSt9type_infoD1Ev); +REG_FUNC(0xC04303, _ZNSt9type_infoD2Ev); +REG_FUNC(0x9983D8B9, _ZSt10unexpectedv); +REG_FUNC(0x385D19B2, _ZSt11setiosflagsNSt5_IosbIiE9_FmtflagsE); +REG_FUNC(0xD8A78A61, _ZSt12setprecisioni); +REG_FUNC(0x994DDF94, _ZSt13resetiosflagsNSt5_IosbIiE9_FmtflagsE); +REG_FUNC(0x13BAEE11, _ZSt13set_terminatePFvvE); +REG_FUNC(0x644CBAA2, _ZSt14_Debug_messagePKcS0_); +REG_FUNC(0x9B2F0CA6, _ZSt14set_unexpectedPFvvE); +REG_FUNC(0xC107B555, _ZSt15set_new_handlerPFvvE); +REG_FUNC(0x11CEB00, _ZSt18uncaught_exceptionv); +REG_FUNC(0x36282336, _ZSt21__gen_dummy_typeinfosv); +REG_FUNC(0x3622003F, _ZSt4setwi); +REG_FUNC(0x6CAFA8EF, _ZSt6_ThrowRKSt9exception); +REG_FUNC(0xFD276300, _ZSt7_FiopenPKcNSt5_IosbIiE9_OpenmodeEi); +REG_FUNC(0x1419E1DF, _ZSt7_FiopenPKwNSt5_IosbIiE9_OpenmodeEi); +REG_FUNC(0x39587D21, _ZSt7setbasei); +REG_FUNC(0x978EC4DC, _ZSt9terminatev); +REG_FUNC(0x4A804953, _ZThn8_NSdD0Ev); +REG_FUNC(0xABFBB0B4, _ZThn8_NSdD1Ev); +REG_FUNC(0x6577F8FA, _ZThn8_NSt9strstreamD0Ev); +REG_FUNC(0x77812119, _ZThn8_NSt9strstreamD1Ev); +REG_FUNC(0xE4BD5E6A, _ZTv0_n12_NSdD0Ev); +REG_FUNC(0x1081224F, _ZTv0_n12_NSdD1Ev); +REG_FUNC(0x7CC8951D, _ZTv0_n12_NSiD0Ev); +REG_FUNC(0xC46CA5C9, _ZTv0_n12_NSiD1Ev); +REG_FUNC(0x699E7717, _ZTv0_n12_NSoD0Ev); +REG_FUNC(0x41DBA7E0, _ZTv0_n12_NSoD1Ev); +REG_FUNC(0x6FC84131, _ZTv0_n12_NSt10istrstreamD0Ev); +REG_FUNC(0x7B4D8616, _ZTv0_n12_NSt10istrstreamD1Ev); +REG_FUNC(0xD82D58BA, _ZTv0_n12_NSt10ostrstreamD0Ev); +REG_FUNC(0x5D4F7F7B, _ZTv0_n12_NSt10ostrstreamD1Ev); +REG_FUNC(0x10E7966F, _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xC3718A8D, _ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x159261D1, _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev); +REG_FUNC(0xB54EC1E5, _ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev); +REG_FUNC(0x2FB87ED7, _ZTv0_n12_NSt9strstreamD0Ev); +REG_FUNC(0xECEDE119, _ZTv0_n12_NSt9strstreamD1Ev); +REG_FUNC(0x91B0DC47, _ZdaPv); +REG_FUNC(0xA7241F09, _ZdaPvRKSt9nothrow_t); +REG_FUNC(0x3688FFDA, _ZdaPvS_); +REG_FUNC(0x72293931, _ZdlPv); +REG_FUNC(0x87EF85FF, _ZdlPvRKSt9nothrow_t); +REG_FUNC(0x1EB89099, _ZdlPvS_); +REG_FUNC(0xE7FB2BF4, _Znaj); +REG_FUNC(0x31C62481, _ZnajRKSt9nothrow_t); +REG_FUNC(0xF99ED5AC, _Znwj); +REG_FUNC(0xAE71DC3, _ZnwjRKSt9nothrow_t); +REG_FUNC(0x1818C323, _SNC_get_global_vars); +REG_FUNC(0x2CFA1F15, _SNC_get_tlocal_vars); +REG_FUNC(0x7742D916, _Unwind_Backtrace); +REG_FUNC(0x32748B78, _Unwind_Complete); +REG_FUNC(0xF6EA5CDE, _Unwind_DeleteException); +REG_FUNC(0xCCD903C4, _Unwind_RaiseException); +REG_FUNC(0x13D5D5A1, _Unwind_Resume); +REG_FUNC(0xE7889A5B, _Unwind_VRS_Get); +REG_FUNC(0xF106D050, _Unwind_VRS_Pop); +REG_FUNC(0x91CDA2F9, _Unwind_VRS_Set); +REG_FUNC(0x173E7421, __aeabi_unwind_cpp_pr0); +REG_FUNC(0x3C78DDE3, __aeabi_unwind_cpp_pr1); +REG_FUNC(0xF95BDD36, __aeabi_unwind_cpp_pr2); +REG_FUNC(0x8C93EFDA, __cxa_allocate_exception); +REG_FUNC(0x6165EE89, __cxa_begin_catch); +REG_FUNC(0x5D74285C, __cxa_begin_cleanup); +REG_FUNC(0x4E4CC399, __cxa_call_terminate); +REG_FUNC(0x7C1A0217, __cxa_call_unexpected); +REG_FUNC(0xF7BF277C, __cxa_current_exception_type); +REG_FUNC(0x3438F773, __cxa_end_catch); +REG_FUNC(0xD7C1E113, __cxa_end_cleanup); +REG_FUNC(0x1FFD5FFF, __cxa_free_exception); +REG_FUNC(0xBFFC0ED7, __cxa_get_exception_ptr); +REG_FUNC(0x96656BBA, __cxa_get_globals); +REG_FUNC(0x21D6C279, __cxa_rethrow); +REG_FUNC(0xF87E6098, __cxa_throw); +REG_FUNC(0x30D908F2, __cxa_type_match); +REG_FUNC(0xAE42C1D5, __snc_personality_v0); +REG_FUNC(0xDD200A6F, _ZN10__cxxabiv116__enum_type_infoD0Ev); +REG_FUNC(0x436D61AD, _ZN10__cxxabiv116__enum_type_infoD1Ev); +REG_FUNC(0x34854DA4, _ZN10__cxxabiv116__enum_type_infoD2Ev); +REG_FUNC(0x9D5EDD21, _ZN10__cxxabiv117__array_type_infoD0Ev); +REG_FUNC(0xD6375908, _ZN10__cxxabiv117__array_type_infoD1Ev); +REG_FUNC(0xFDC450D4, _ZN10__cxxabiv117__array_type_infoD2Ev); +REG_FUNC(0x5CCFD0C0, _ZN10__cxxabiv117__class_type_infoD0Ev); +REG_FUNC(0xFBBFFF15, _ZN10__cxxabiv117__class_type_infoD1Ev); +REG_FUNC(0xA92DD3D2, _ZN10__cxxabiv117__class_type_infoD2Ev); +REG_FUNC(0x6C14868D, _ZN10__cxxabiv117__pbase_type_infoD0Ev); +REG_FUNC(0xC1869E57, _ZN10__cxxabiv117__pbase_type_infoD1Ev); +REG_FUNC(0x2DF92DB7, _ZN10__cxxabiv117__pbase_type_infoD2Ev); +REG_FUNC(0xA9654DFD, _ZN10__cxxabiv119__pointer_type_infoD0Ev); +REG_FUNC(0x703A2C05, _ZN10__cxxabiv119__pointer_type_infoD1Ev); +REG_FUNC(0x509AAD21, _ZN10__cxxabiv119__pointer_type_infoD2Ev); +REG_FUNC(0xB7DFB274, _ZN10__cxxabiv120__function_type_infoD0Ev); +REG_FUNC(0x19EA26FF, _ZN10__cxxabiv120__function_type_infoD1Ev); +REG_FUNC(0xF882187E, _ZN10__cxxabiv120__function_type_infoD2Ev); +REG_FUNC(0xE67722C3, _ZN10__cxxabiv120__si_class_type_infoD0Ev); +REG_FUNC(0xA7E25E3E, _ZN10__cxxabiv120__si_class_type_infoD1Ev); +REG_FUNC(0xACD6D901, _ZN10__cxxabiv120__si_class_type_infoD2Ev); +REG_FUNC(0x986F12C7, _ZN10__cxxabiv121__vmi_class_type_infoD0Ev); +REG_FUNC(0x4B5BC979, _ZN10__cxxabiv121__vmi_class_type_infoD1Ev); +REG_FUNC(0xA7B9AB93, _ZN10__cxxabiv121__vmi_class_type_infoD2Ev); +REG_FUNC(0x7436C981, _ZN10__cxxabiv123__fundamental_type_infoD0Ev); +REG_FUNC(0x4EFBF43A, _ZN10__cxxabiv123__fundamental_type_infoD1Ev); +REG_FUNC(0xF49AA0D3, _ZN10__cxxabiv123__fundamental_type_infoD2Ev); +REG_FUNC(0x6199ACC9, _ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev); +REG_FUNC(0xDD076510, _ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev); +REG_FUNC(0xD4C11B17, _ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev); +REG_FUNC(0xBF90A45A, _PJP_CPP_Copyright); +REG_FUNC(0x3B6D9752, _ZNSbIwSt11char_traitsIwESaIwEE4nposE); +REG_FUNC(0xA3498140, _ZNSs4nposE); +REG_FUNC(0x5273EA3, _ZNSt13_Num_int_base10is_boundedE); +REG_FUNC(0x8A0994F8, _ZNSt13_Num_int_base10is_integerE); +REG_FUNC(0x401F1224, _ZNSt13_Num_int_base14is_specializedE); +REG_FUNC(0xA65FE916, _ZNSt13_Num_int_base5radixE); +REG_FUNC(0xF2AA872E, _ZNSt13_Num_int_base8is_exactE); +REG_FUNC(0x8FE5A4F, _ZNSt13_Num_int_base9is_moduloE); +REG_FUNC(0x7D4C55EC, _ZNSt14numeric_limitsIaE6digitsE); +REG_FUNC(0xA4E5BF5E, _ZNSt14numeric_limitsIaE8digits10E); +REG_FUNC(0xD9938B84, _ZNSt14numeric_limitsIaE9is_signedE); +REG_FUNC(0x56198D65, _ZNSt14numeric_limitsIbE6digitsE); +REG_FUNC(0xF52E5F76, _ZNSt14numeric_limitsIbE8digits10E); +REG_FUNC(0x81B82E0E, _ZNSt14numeric_limitsIbE9is_moduloE); +REG_FUNC(0x9E6D2025, _ZNSt14numeric_limitsIbE9is_signedE); +REG_FUNC(0x810ED593, _ZNSt14numeric_limitsIcE6digitsE); +REG_FUNC(0xAC1A819, _ZNSt14numeric_limitsIcE8digits10E); +REG_FUNC(0x660E14E1, _ZNSt14numeric_limitsIcE9is_signedE); +REG_FUNC(0x3EEB3B23, _ZNSt14numeric_limitsIdE12max_exponentE); +REG_FUNC(0x13B634BE, _ZNSt14numeric_limitsIdE12min_exponentE); +REG_FUNC(0xDB4218A0, _ZNSt14numeric_limitsIdE14max_exponent10E); +REG_FUNC(0x770B1CAC, _ZNSt14numeric_limitsIdE14min_exponent10E); +REG_FUNC(0xD175A556, _ZNSt14numeric_limitsIdE6digitsE); +REG_FUNC(0xA5349445, _ZNSt14numeric_limitsIdE8digits10E); +REG_FUNC(0x2F59E7FF, _ZNSt14numeric_limitsIeE12max_exponentE); +REG_FUNC(0xC9C10644, _ZNSt14numeric_limitsIeE12min_exponentE); +REG_FUNC(0xC80072AC, _ZNSt14numeric_limitsIeE14max_exponent10E); +REG_FUNC(0xCA8B1B9E, _ZNSt14numeric_limitsIeE14min_exponent10E); +REG_FUNC(0x7E9AFD39, _ZNSt14numeric_limitsIeE6digitsE); +REG_FUNC(0x6122F9BF, _ZNSt14numeric_limitsIeE8digits10E); +REG_FUNC(0xA83B5FE2, _ZNSt14numeric_limitsIfE12max_exponentE); +REG_FUNC(0x9347B146, _ZNSt14numeric_limitsIfE12min_exponentE); +REG_FUNC(0x371BCFA6, _ZNSt14numeric_limitsIfE14max_exponent10E); +REG_FUNC(0x6E6746EB, _ZNSt14numeric_limitsIfE14min_exponent10E); +REG_FUNC(0xB102353D, _ZNSt14numeric_limitsIfE6digitsE); +REG_FUNC(0x781201BB, _ZNSt14numeric_limitsIfE8digits10E); +REG_FUNC(0x26D618B8, _ZNSt14numeric_limitsIhE6digitsE); +REG_FUNC(0x8D593267, _ZNSt14numeric_limitsIhE8digits10E); +REG_FUNC(0x96B86E89, _ZNSt14numeric_limitsIhE9is_signedE); +REG_FUNC(0x9CDAA1F0, _ZNSt14numeric_limitsIiE6digitsE); +REG_FUNC(0xE8EB3133, _ZNSt14numeric_limitsIiE8digits10E); +REG_FUNC(0x3AB38CDA, _ZNSt14numeric_limitsIiE9is_signedE); +REG_FUNC(0xEEB7B642, _ZNSt14numeric_limitsIjE6digitsE); +REG_FUNC(0xBCDE68B3, _ZNSt14numeric_limitsIjE8digits10E); +REG_FUNC(0xDA8EFB0, _ZNSt14numeric_limitsIjE9is_signedE); +REG_FUNC(0x65DAD8D6, _ZNSt14numeric_limitsIlE6digitsE); +REG_FUNC(0xFB52BC0A, _ZNSt14numeric_limitsIlE8digits10E); +REG_FUNC(0x63544FC, _ZNSt14numeric_limitsIlE9is_signedE); +REG_FUNC(0x441D097A, _ZNSt14numeric_limitsImE6digitsE); +REG_FUNC(0xB56F1B07, _ZNSt14numeric_limitsImE8digits10E); +REG_FUNC(0xA9799886, _ZNSt14numeric_limitsImE9is_signedE); +REG_FUNC(0x45C6A036, _ZNSt14numeric_limitsIsE6digitsE); +REG_FUNC(0xCDE02D9C, _ZNSt14numeric_limitsIsE8digits10E); +REG_FUNC(0xB13AEAC3, _ZNSt14numeric_limitsIsE9is_signedE); +REG_FUNC(0xBD813100, _ZNSt14numeric_limitsItE6digitsE); +REG_FUNC(0x242C5313, _ZNSt14numeric_limitsItE8digits10E); +REG_FUNC(0x175A29B4, _ZNSt14numeric_limitsItE9is_signedE); +REG_FUNC(0x7E91BCD7, _ZNSt14numeric_limitsIwE6digitsE); +REG_FUNC(0x6B1CB79E, _ZNSt14numeric_limitsIwE8digits10E); +REG_FUNC(0x9181475F, _ZNSt14numeric_limitsIwE9is_signedE); +REG_FUNC(0x22F8FF46, _ZNSt14numeric_limitsIxE6digitsE); +REG_FUNC(0xF6E69A0D, _ZNSt14numeric_limitsIxE8digits10E); +REG_FUNC(0xD01E5E34, _ZNSt14numeric_limitsIxE9is_signedE); +REG_FUNC(0x4AB058B0, _ZNSt14numeric_limitsIyE6digitsE); +REG_FUNC(0x85F2F2D2, _ZNSt14numeric_limitsIyE8digits10E); +REG_FUNC(0xDEDE9061, _ZNSt14numeric_limitsIyE9is_signedE); +REG_FUNC(0x1CBE5DCB, _ZNSt15_Num_float_base10has_denormE); +REG_FUNC(0x616E0E6F, _ZNSt15_Num_float_base10is_boundedE); +REG_FUNC(0xDFDE8E2C, _ZNSt15_Num_float_base10is_integerE); +REG_FUNC(0x59668916, _ZNSt15_Num_float_base11round_styleE); +REG_FUNC(0x2FA7A240, _ZNSt15_Num_float_base12has_infinityE); +REG_FUNC(0x4E98DCA0, _ZNSt15_Num_float_base13has_quiet_NaNE); +REG_FUNC(0x87EB5304, _ZNSt15_Num_float_base14is_specializedE); +REG_FUNC(0x1B36956D, _ZNSt15_Num_float_base15has_denorm_lossE); +REG_FUNC(0xD3E2D87B, _ZNSt15_Num_float_base15tinyness_beforeE); +REG_FUNC(0xBCEB9093, _ZNSt15_Num_float_base17has_signaling_NaNE); +REG_FUNC(0x132F3288, _ZNSt15_Num_float_base5radixE); +REG_FUNC(0xF8060433, _ZNSt15_Num_float_base5trapsE); +REG_FUNC(0x3C4A2891, _ZNSt15_Num_float_base8is_exactE); +REG_FUNC(0xA3F55094, _ZNSt15_Num_float_base9is_iec559E); +REG_FUNC(0xC8CB7207, _ZNSt15_Num_float_base9is_moduloE); +REG_FUNC(0x1242E399, _ZNSt15_Num_float_base9is_signedE); +REG_FUNC(0x762C3159, _ZNSt4fposISt9_MbstatetE4_StzE); +REG_FUNC(0xFED4A09B, _ZNSt5_IosbIiE10_NoreplaceE); +REG_FUNC(0xE615A657, _ZNSt5_IosbIiE2inE); +REG_FUNC(0x759FD02E, _ZNSt5_IosbIiE3appE); +REG_FUNC(0x6F410A00, _ZNSt5_IosbIiE3ateE); +REG_FUNC(0xD2A42D0C, _ZNSt5_IosbIiE3begE); +REG_FUNC(0x9B45C3B, _ZNSt5_IosbIiE3curE); +REG_FUNC(0x121A8952, _ZNSt5_IosbIiE3decE); +REG_FUNC(0x7CC027CD, _ZNSt5_IosbIiE3endE); +REG_FUNC(0x6E2FF90B, _ZNSt5_IosbIiE3hexE); +REG_FUNC(0xB4A55C29, _ZNSt5_IosbIiE3octE); +REG_FUNC(0x2CB2DC70, _ZNSt5_IosbIiE3outE); +REG_FUNC(0x78E34A9, _ZNSt5_IosbIiE5truncE); +REG_FUNC(0xB5EFA1B3, _ZNSt5_IosbIiE6badbitE); +REG_FUNC(0x5312A538, _ZNSt5_IosbIiE6binaryE); +REG_FUNC(0xD9D32526, _ZNSt5_IosbIiE6skipwsE); +REG_FUNC(0xAE6CA555, _ZNSt5_IosbIiE7failbitE); +REG_FUNC(0x139E2D21, _ZNSt5_IosbIiE7goodbitE); +REG_FUNC(0x7021DFF0, _ZNSt5_IosbIiE7unitbufE); +REG_FUNC(0x2AD61AAD, _ZNSt5_IosbIiE9_NocreateE); +REG_FUNC(0x60B16E4E, _ZNSt5_IosbIiE9basefieldE); +REG_FUNC(0x8137F8D7, _ZNSt6_Winit9_Init_cntE); +REG_FUNC(0x554B7625, _ZNSt8ios_base4Init9_Init_cntE); +REG_FUNC(0x57CF916C, _ZNSt8ios_base5_SyncE); +REG_FUNC(0xF2D3416A, _ZNSt8ios_base6_IndexE); +REG_FUNC(0x3D219F98, _ZNSt9_Num_base10has_denormE); +REG_FUNC(0xD93E4A6C, _ZNSt9_Num_base10is_boundedE); +REG_FUNC(0xB65169EF, _ZNSt9_Num_base10is_integerE); +REG_FUNC(0x13B38354, _ZNSt9_Num_base11round_styleE); +REG_FUNC(0xB11D20E2, _ZNSt9_Num_base12has_infinityE); +REG_FUNC(0x3E169F74, _ZNSt9_Num_base12max_exponentE); +REG_FUNC(0xD7C041E0, _ZNSt9_Num_base12min_exponentE); +REG_FUNC(0x2DA0D59, _ZNSt9_Num_base13has_quiet_NaNE); +REG_FUNC(0xBE06BD79, _ZNSt9_Num_base14is_specializedE); +REG_FUNC(0xEBBC4DDD, _ZNSt9_Num_base14max_exponent10E); +REG_FUNC(0xFFCF7FC, _ZNSt9_Num_base14min_exponent10E); +REG_FUNC(0xB317DDDF, _ZNSt9_Num_base15has_denorm_lossE); +REG_FUNC(0x245D399E, _ZNSt9_Num_base15tinyness_beforeE); +REG_FUNC(0xBD5F0B8A, _ZNSt9_Num_base17has_signaling_NaNE); +REG_FUNC(0xE23BAE9E, _ZNSt9_Num_base5radixE); +REG_FUNC(0x9237A154, _ZNSt9_Num_base5trapsE); +REG_FUNC(0xE8421A12, _ZNSt9_Num_base6digitsE); +REG_FUNC(0x80698934, _ZNSt9_Num_base8digits10E); +REG_FUNC(0xB338C222, _ZNSt9_Num_base8is_exactE); +REG_FUNC(0x1F5A7860, _ZNSt9_Num_base9is_iec559E); +REG_FUNC(0x840107AA, _ZNSt9_Num_base9is_moduloE); +REG_FUNC(0xABD7AE16, _ZNSt9_Num_base9is_signedE); +REG_FUNC(0x4A1AB5B4, _ZSt14_Raise_handler); +REG_FUNC(0x725EAC50, _ZSt16__dummy_typeinfo); +REG_FUNC(0x768F2944, _ZSt3cin); +REG_FUNC(0xD9478DCF, _ZSt4_Fpz); +REG_FUNC(0x14B35A37, _ZSt4cerr); +REG_FUNC(0xD361A52A, _ZSt4clog); +REG_FUNC(0xB3867BB4, _ZSt4cout); +REG_FUNC(0x8054BC8E, _ZSt4wcin); +REG_FUNC(0x8B2001F7, _ZSt5wcerr); +REG_FUNC(0x8E04C18C, _ZSt5wclog); +REG_FUNC(0x4F726424, _ZSt5wcout); +REG_FUNC(0x9C449444, _ZSt7_BADOFF); +REG_FUNC(0xBFEF56B5, _ZSt7nothrow); +REG_FUNC(0xDC18EF42, _ZTI15__simd64_int8_t); +REG_FUNC(0x2207D305, _ZTI16__simd128_int8_t); +REG_FUNC(0x869FEDA9, _ZTI16__simd64_int16_t); +REG_FUNC(0x7CEF3DB5, _ZTI16__simd64_int32_t); +REG_FUNC(0xFE09AD25, _ZTI16__simd64_poly8_t); +REG_FUNC(0x14A3598E, _ZTI16__simd64_uint8_t); +REG_FUNC(0xF4B098DD, _ZTI17__simd128_int16_t); +REG_FUNC(0xAABF056C, _ZTI17__simd128_int32_t); +REG_FUNC(0x305068B1, _ZTI17__simd128_poly8_t); +REG_FUNC(0x74813D4D, _ZTI17__simd128_uint8_t); +REG_FUNC(0xE118AB78, _ZTI17__simd64_poly16_t); +REG_FUNC(0x67E05799, _ZTI17__simd64_uint16_t); +REG_FUNC(0x1617E8CB, _ZTI17__simd64_uint32_t); +REG_FUNC(0x2FACB1EF, _ZTI18__simd128_poly16_t); +REG_FUNC(0xC089FED3, _ZTI18__simd128_uint16_t); +REG_FUNC(0xFC00EC48, _ZTI18__simd128_uint32_t); +REG_FUNC(0x237AF69B, _ZTI18__simd64_float16_t); +REG_FUNC(0xF7FDBBED, _ZTI18__simd64_float32_t); +REG_FUNC(0x525557F3, _ZTI19__simd128_float16_t); +REG_FUNC(0xA4018B84, _ZTI19__simd128_float32_t); +REG_FUNC(0xA1FE4058, _ZTIDh); +REG_FUNC(0x5351829B, _ZTINSt8ios_base7failureE); +REG_FUNC(0xAC6C8F, _ZTIP15__simd64_int8_t); +REG_FUNC(0xD5B056B8, _ZTIP16__simd128_int8_t); +REG_FUNC(0x13975DAE, _ZTIP16__simd64_int16_t); +REG_FUNC(0x963C04E3, _ZTIP16__simd64_int32_t); +REG_FUNC(0x9F43A559, _ZTIP16__simd64_poly8_t); +REG_FUNC(0xD8079FA9, _ZTIP16__simd64_uint8_t); +REG_FUNC(0xEF53FE1F, _ZTIP17__simd128_int16_t); +REG_FUNC(0xA5094302, _ZTIP17__simd128_int32_t); +REG_FUNC(0x9CAF5E5A, _ZTIP17__simd128_poly8_t); +REG_FUNC(0x264B0978, _ZTIP17__simd128_uint8_t); +REG_FUNC(0x214A0488, _ZTIP17__simd64_poly16_t); +REG_FUNC(0xA96D02B1, _ZTIP17__simd64_uint16_t); +REG_FUNC(0xEE862280, _ZTIP17__simd64_uint32_t); +REG_FUNC(0xB5CEC4FF, _ZTIP18__simd128_poly16_t); +REG_FUNC(0x46124E82, _ZTIP18__simd128_uint16_t); +REG_FUNC(0x7E6CC17, _ZTIP18__simd128_uint32_t); +REG_FUNC(0x588EBCAD, _ZTIP18__simd64_float16_t); +REG_FUNC(0xDFCB2417, _ZTIP18__simd64_float32_t); +REG_FUNC(0x9502D3C0, _ZTIP19__simd128_float16_t); +REG_FUNC(0xFB84796C, _ZTIP19__simd128_float32_t); +REG_FUNC(0xA43ABF14, _ZTIPDh); +REG_FUNC(0x37A74E46, _ZTIPK15__simd64_int8_t); +REG_FUNC(0x60D7D920, _ZTIPK16__simd128_int8_t); +REG_FUNC(0x52A04C47, _ZTIPK16__simd64_int16_t); +REG_FUNC(0xBB64CCF1, _ZTIPK16__simd64_int32_t); +REG_FUNC(0x7C9D0C33, _ZTIPK16__simd64_poly8_t); +REG_FUNC(0x21A57A1, _ZTIPK16__simd64_uint8_t); +REG_FUNC(0x21E3DD1, _ZTIPK17__simd128_int16_t); +REG_FUNC(0xFF8DDBE7, _ZTIPK17__simd128_int32_t); +REG_FUNC(0xB30AB3B5, _ZTIPK17__simd128_poly8_t); +REG_FUNC(0xC8721E86, _ZTIPK17__simd128_uint8_t); +REG_FUNC(0x610983B7, _ZTIPK17__simd64_poly16_t); +REG_FUNC(0x486A3970, _ZTIPK17__simd64_uint16_t); +REG_FUNC(0x9577D4FD, _ZTIPK17__simd64_uint32_t); +REG_FUNC(0x192861D3, _ZTIPK18__simd128_poly16_t); +REG_FUNC(0x9C721F27, _ZTIPK18__simd128_uint16_t); +REG_FUNC(0xC0A37F8F, _ZTIPK18__simd128_uint32_t); +REG_FUNC(0xF2FCDEFC, _ZTIPK18__simd64_float16_t); +REG_FUNC(0x2D2B93F7, _ZTIPK18__simd64_float32_t); +REG_FUNC(0x6B7DA1FD, _ZTIPK19__simd128_float16_t); +REG_FUNC(0x15CA84E1, _ZTIPK19__simd128_float32_t); +REG_FUNC(0x6195F016, _ZTIPKDh); +REG_FUNC(0x2059F4C0, _ZTIPKU8__vectorx); +REG_FUNC(0xFCC4EE61, _ZTIPKU8__vectory); +REG_FUNC(0x63E0CE97, _ZTIPKa); +REG_FUNC(0x47A13017, _ZTIPKb); +REG_FUNC(0x8C375D81, _ZTIPKc); +REG_FUNC(0x841645BA, _ZTIPKd); +REG_FUNC(0x179015C1, _ZTIPKe); +REG_FUNC(0xF7F85635, _ZTIPKf); +REG_FUNC(0x54CF62A4, _ZTIPKh); +REG_FUNC(0x33DAF949, _ZTIPKi); +REG_FUNC(0x703C1962, _ZTIPKj); +REG_FUNC(0xF353DAF3, _ZTIPKl); +REG_FUNC(0x67092852, _ZTIPKm); +REG_FUNC(0xDAAEEAD0, _ZTIPKs); +REG_FUNC(0x39790E0A, _ZTIPKt); +REG_FUNC(0xEE47C447, _ZTIPKv); +REG_FUNC(0xECDB6B05, _ZTIPKw); +REG_FUNC(0xC20CF55C, _ZTIPKx); +REG_FUNC(0xA0F5E8F5, _ZTIPKy); +REG_FUNC(0xA6C2A25C, _ZTIPU8__vectorx); +REG_FUNC(0x81B51915, _ZTIPU8__vectory); +REG_FUNC(0xA7CB4EAA, _ZTIPa); +REG_FUNC(0x87B0FB6, _ZTIPb); +REG_FUNC(0xE4D24E14, _ZTIPc); +REG_FUNC(0x6825FFE6, _ZTIPd); +REG_FUNC(0x926B9A3A, _ZTIPe); +REG_FUNC(0x24072F3E, _ZTIPf); +REG_FUNC(0x8B5247B, _ZTIPh); +REG_FUNC(0x15C21CC8, _ZTIPi); +REG_FUNC(0xD234CF18, _ZTIPj); +REG_FUNC(0x50E25810, _ZTIPl); +REG_FUNC(0x9D0DBB1A, _ZTIPm); +REG_FUNC(0xDCB7CD94, _ZTIPs); +REG_FUNC(0x7FC4B19D, _ZTIPt); +REG_FUNC(0x4722F2AE, _ZTIPv); +REG_FUNC(0x2208C899, _ZTIPw); +REG_FUNC(0xE64F5994, _ZTIPx); +REG_FUNC(0xC1C20AC0, _ZTIPy); +REG_FUNC(0xD7A9284F, _ZTISd); +REG_FUNC(0xE302D51A, _ZTISi); +REG_FUNC(0xF9426257, _ZTISo); +REG_FUNC(0x7242603B, _ZTISt10bad_typeid); +REG_FUNC(0x67B82DEF, _ZTISt10istrstream); +REG_FUNC(0x9F17589B, _ZTISt10ostrstream); +REG_FUNC(0xE0E3C75A, _ZTISt11_ctype_base); +REG_FUNC(0x87457513, _ZTISt11logic_error); +REG_FUNC(0x2B71045A, _ZTISt11range_error); +REG_FUNC(0x9A72EBFE, _ZTISt12domain_error); +REG_FUNC(0x15E6C91C, _ZTISt12length_error); +REG_FUNC(0xBAC29E4D, _ZTISt12out_of_range); +REG_FUNC(0x8257DFA2, _ZTISt12strstreambuf); +REG_FUNC(0x34455CAF, _ZTISt13_codecvt_base); +REG_FUNC(0xF4A5A537, _ZTISt13bad_exception); +REG_FUNC(0x33C19D3B, _ZTISt13basic_filebufIcSt11char_traitsIcEE); +REG_FUNC(0x83DB8917, _ZTISt13basic_filebufIwSt11char_traitsIwEE); +REG_FUNC(0x1582929A, _ZTISt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0xF4062B77, _ZTISt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0x2451AF0A, _ZTISt13runtime_error); +REG_FUNC(0x3EE22853, _ZTISt14overflow_error); +REG_FUNC(0x758B452B, _ZTISt15basic_streambufIcSt11char_traitsIcEE); +REG_FUNC(0x52B5EC73, _ZTISt15basic_streambufIwSt11char_traitsIwEE); +REG_FUNC(0xCD0A98ED, _ZTISt15underflow_error); +REG_FUNC(0xA128D5A0, _ZTISt16invalid_argument); +REG_FUNC(0xE2AB6BF9, _ZTISt5_IosbIiE); +REG_FUNC(0x3FD78B17, _ZTISt6_ctypeIcE); +REG_FUNC(0xA8CD5D05, _ZTISt6_ctypeIwE); +REG_FUNC(0xAFB2B7FB, _ZTISt8_codecvtIccSt9_MbstatetE); +REG_FUNC(0xCA25D9BE, _ZTISt8_codecvtIwcSt9_MbstatetE); +REG_FUNC(0xA7CA7C93, _ZTISt8bad_cast); +REG_FUNC(0xB93721C7, _ZTISt8ios_base); +REG_FUNC(0x35E135A0, _ZTISt9bad_alloc); +REG_FUNC(0x7BA61382, _ZTISt9basic_iosIcSt11char_traitsIcEE); +REG_FUNC(0x905B8B0, _ZTISt9basic_iosIwSt11char_traitsIwEE); +REG_FUNC(0x1E8C6100, _ZTISt9exception); +REG_FUNC(0x1CC15F54, _ZTISt9strstream); +REG_FUNC(0x8A026EAD, _ZTISt9type_info); +REG_FUNC(0xE128260C, _ZTIU8__vectorx); +REG_FUNC(0x44C2FA39, _ZTIU8__vectory); +REG_FUNC(0x4F416B30, _ZTIa); +REG_FUNC(0x3081D959, _ZTIb); +REG_FUNC(0x942D2342, _ZTIc); +REG_FUNC(0x685BA1E8, _ZTId); +REG_FUNC(0xFCE46A43, _ZTIe); +REG_FUNC(0x64AEB8AF, _ZTIf); +REG_FUNC(0x606676D4, _ZTIh); +REG_FUNC(0xA58E84A3, _ZTIi); +REG_FUNC(0x9B0CBEC0, _ZTIj); +REG_FUNC(0xD589E8AE, _ZTIl); +REG_FUNC(0xD39774A5, _ZTIm); +REG_FUNC(0xDC2C85B0, _ZTIs); +REG_FUNC(0xEA3FB57B, _ZTIt); +REG_FUNC(0x76C6BDCE, _ZTIv); +REG_FUNC(0x8BFC9260, _ZTIw); +REG_FUNC(0x90B0194C, _ZTIx); +REG_FUNC(0x16DACFBF, _ZTIy); +REG_FUNC(0x720678AD, _ZTS15__simd64_int8_t); +REG_FUNC(0x5B9F1D83, _ZTS16__simd128_int8_t); +REG_FUNC(0x953ECE43, _ZTS16__simd64_int16_t); +REG_FUNC(0xCE27612E, _ZTS16__simd64_int32_t); +REG_FUNC(0x72BC6CD9, _ZTS16__simd64_poly8_t); +REG_FUNC(0xCD2802B5, _ZTS16__simd64_uint8_t); +REG_FUNC(0xC3FA8530, _ZTS17__simd128_int16_t); +REG_FUNC(0x67A63A08, _ZTS17__simd128_int32_t); +REG_FUNC(0x6B26EFF8, _ZTS17__simd128_poly8_t); +REG_FUNC(0x8C4C69F, _ZTS17__simd128_uint8_t); +REG_FUNC(0x40BC2E0E, _ZTS17__simd64_poly16_t); +REG_FUNC(0x8D1AE4A7, _ZTS17__simd64_uint16_t); +REG_FUNC(0xC4096952, _ZTS17__simd64_uint32_t); +REG_FUNC(0x16D366F1, _ZTS18__simd128_poly16_t); +REG_FUNC(0x45552A1, _ZTS18__simd128_uint16_t); +REG_FUNC(0x7DBF4FFF, _ZTS18__simd128_uint32_t); +REG_FUNC(0xED26DE1, _ZTS18__simd64_float16_t); +REG_FUNC(0xAB0D789A, _ZTS18__simd64_float32_t); +REG_FUNC(0x3200DDB, _ZTS19__simd128_float16_t); +REG_FUNC(0xD54CBD7C, _ZTS19__simd128_float32_t); +REG_FUNC(0xA8E6842E, _ZTSDh); +REG_FUNC(0x5246E71E, _ZTSNSt8ios_base7failureE); +REG_FUNC(0xF98AAA03, _ZTSP15__simd64_int8_t); +REG_FUNC(0xAF5AA646, _ZTSP16__simd128_int8_t); +REG_FUNC(0x73874089, _ZTSP16__simd64_int16_t); +REG_FUNC(0xAD912141, _ZTSP16__simd64_int32_t); +REG_FUNC(0x67D1351B, _ZTSP16__simd64_poly8_t); +REG_FUNC(0x9FDDB92F, _ZTSP16__simd64_uint8_t); +REG_FUNC(0xA9B31841, _ZTSP17__simd128_int16_t); +REG_FUNC(0x244C742C, _ZTSP17__simd128_int32_t); +REG_FUNC(0x31AFE1A0, _ZTSP17__simd128_poly8_t); +REG_FUNC(0x5CF817B0, _ZTSP17__simd128_uint8_t); +REG_FUNC(0xB524B325, _ZTSP17__simd64_poly16_t); +REG_FUNC(0x51A1F225, _ZTSP17__simd64_uint16_t); +REG_FUNC(0x9C3431DD, _ZTSP17__simd64_uint32_t); +REG_FUNC(0x937A4F2F, _ZTSP18__simd128_poly16_t); +REG_FUNC(0x33549DB5, _ZTSP18__simd128_uint16_t); +REG_FUNC(0xFC19AC06, _ZTSP18__simd128_uint32_t); +REG_FUNC(0xD9A43D3A, _ZTSP18__simd64_float16_t); +REG_FUNC(0xFAB5D659, _ZTSP18__simd64_float32_t); +REG_FUNC(0x7E694471, _ZTSP19__simd128_float16_t); +REG_FUNC(0xA9AF9CE8, _ZTSP19__simd128_float32_t); +REG_FUNC(0xDAE584EC, _ZTSPDh); +REG_FUNC(0x2B017F22, _ZTSPK15__simd64_int8_t); +REG_FUNC(0x4A7149C9, _ZTSPK16__simd128_int8_t); +REG_FUNC(0xAC116166, _ZTSPK16__simd64_int16_t); +REG_FUNC(0x6A472A63, _ZTSPK16__simd64_int32_t); +REG_FUNC(0xC356ACF6, _ZTSPK16__simd64_poly8_t); +REG_FUNC(0x878C75F4, _ZTSPK16__simd64_uint8_t); +REG_FUNC(0x68B777E3, _ZTSPK17__simd128_int16_t); +REG_FUNC(0x61188BD, _ZTSPK17__simd128_int32_t); +REG_FUNC(0xC7733F13, _ZTSPK17__simd128_poly8_t); +REG_FUNC(0x3D8A69EC, _ZTSPK17__simd128_uint8_t); +REG_FUNC(0xCC081D58, _ZTSPK17__simd64_poly16_t); +REG_FUNC(0xEB50ABA7, _ZTSPK17__simd64_uint16_t); +REG_FUNC(0x25EC8CE5, _ZTSPK17__simd64_uint32_t); +REG_FUNC(0x5C61F109, _ZTSPK18__simd128_poly16_t); +REG_FUNC(0x9B085E3F, _ZTSPK18__simd128_uint16_t); +REG_FUNC(0x721902EF, _ZTSPK18__simd128_uint32_t); +REG_FUNC(0x1C618B7E, _ZTSPK18__simd64_float16_t); +REG_FUNC(0x89B6EDD3, _ZTSPK18__simd64_float32_t); +REG_FUNC(0x9BC380FF, _ZTSPK19__simd128_float16_t); +REG_FUNC(0xC951A9C5, _ZTSPK19__simd128_float32_t); +REG_FUNC(0x2796C952, _ZTSPKDh); +REG_FUNC(0xC33238AA, _ZTSPKU8__vectorx); +REG_FUNC(0x208CEEA8, _ZTSPKU8__vectory); +REG_FUNC(0xBAD19257, _ZTSPKa); +REG_FUNC(0x6CB2F5A4, _ZTSPKb); +REG_FUNC(0xE242CC59, _ZTSPKc); +REG_FUNC(0xA0C8CCE9, _ZTSPKd); +REG_FUNC(0x5C69903D, _ZTSPKe); +REG_FUNC(0xDBF8E0D1, _ZTSPKf); +REG_FUNC(0x1BC277F5, _ZTSPKh); +REG_FUNC(0xF09F6E45, _ZTSPKi); +REG_FUNC(0x5C6D9EDD, _ZTSPKj); +REG_FUNC(0x12416EBE, _ZTSPKl); +REG_FUNC(0x199F6347, _ZTSPKm); +REG_FUNC(0xA1D68767, _ZTSPKs); +REG_FUNC(0xE6498BCD, _ZTSPKt); +REG_FUNC(0xF0FF237E, _ZTSPKv); +REG_FUNC(0xD255293A, _ZTSPKw); +REG_FUNC(0x2EADF5EC, _ZTSPKx); +REG_FUNC(0xEC3461AB, _ZTSPKy); +REG_FUNC(0xB3EDCB7F, _ZTSPU8__vectorx); +REG_FUNC(0x6D11C7D6, _ZTSPU8__vectory); +REG_FUNC(0xC5AC688C, _ZTSPa); +REG_FUNC(0xE4EB3C43, _ZTSPb); +REG_FUNC(0xAEF69715, _ZTSPc); +REG_FUNC(0x6F81469F, _ZTSPd); +REG_FUNC(0xFD38BF3B, _ZTSPe); +REG_FUNC(0xFCB96733, _ZTSPf); +REG_FUNC(0x5BFE19AB, _ZTSPh); +REG_FUNC(0x187E3B47, _ZTSPi); +REG_FUNC(0x2F4A5390, _ZTSPj); +REG_FUNC(0x651D020E, _ZTSPl); +REG_FUNC(0x6E4D412D, _ZTSPm); +REG_FUNC(0x982D9703, _ZTSPs); +REG_FUNC(0xE2A0B0A8, _ZTSPt); +REG_FUNC(0xF7B6B02A, _ZTSPv); +REG_FUNC(0xF1C9A755, _ZTSPw); +REG_FUNC(0x968B212, _ZTSPx); +REG_FUNC(0x9787CAD, _ZTSPy); +REG_FUNC(0xF86F5756, _ZTSSd); +REG_FUNC(0x999300E0, _ZTSSi); +REG_FUNC(0x591C25A3, _ZTSSo); +REG_FUNC(0xFC9D21B, _ZTSSt10bad_typeid); +REG_FUNC(0x867D109E, _ZTSSt10istrstream); +REG_FUNC(0x88BFC745, _ZTSSt10ostrstream); +REG_FUNC(0xB315CE7A, _ZTSSt11_ctype_base); +REG_FUNC(0xA65DACDF, _ZTSSt11logic_error); +REG_FUNC(0x1B8E7108, _ZTSSt11range_error); +REG_FUNC(0xBE23707A, _ZTSSt12domain_error); +REG_FUNC(0x9E317CE1, _ZTSSt12length_error); +REG_FUNC(0xD8DAD98D, _ZTSSt12out_of_range); +REG_FUNC(0x1C929309, _ZTSSt12strstreambuf); +REG_FUNC(0xE17E4D6, _ZTSSt13_codecvt_base); +REG_FUNC(0x918FE198, _ZTSSt13bad_exception); +REG_FUNC(0x227B4568, _ZTSSt13basic_filebufIcSt11char_traitsIcEE); +REG_FUNC(0xD34BAF59, _ZTSSt13basic_filebufIwSt11char_traitsIwEE); +REG_FUNC(0x4381D6B0, _ZTSSt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0x8D487027, _ZTSSt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0xCAA9B21D, _ZTSSt13runtime_error); +REG_FUNC(0xA21B1185, _ZTSSt14overflow_error); +REG_FUNC(0x4A1A1314, _ZTSSt15basic_streambufIcSt11char_traitsIcEE); +REG_FUNC(0x26C1C38F, _ZTSSt15basic_streambufIwSt11char_traitsIwEE); +REG_FUNC(0x140AE4BB, _ZTSSt15underflow_error); +REG_FUNC(0xC3CD5E06, _ZTSSt16invalid_argument); +REG_FUNC(0xB07DF922, _ZTSSt5_IosbIiE); +REG_FUNC(0xED549839, _ZTSSt6_ctypeIcE); +REG_FUNC(0x89304937, _ZTSSt6_ctypeIwE); +REG_FUNC(0x17AAF611, _ZTSSt8_codecvtIccSt9_MbstatetE); +REG_FUNC(0xB4C66A72, _ZTSSt8_codecvtIwcSt9_MbstatetE); +REG_FUNC(0x4C50F26D, _ZTSSt8bad_cast); +REG_FUNC(0xA263F3D5, _ZTSSt8ios_base); +REG_FUNC(0x8DA9C17C, _ZTSSt9_numpunctIcE); +REG_FUNC(0xC4F9C216, _ZTSSt9_numpunctIwE); +REG_FUNC(0xDF0FFCD2, _ZTSSt9bad_alloc); +REG_FUNC(0xB37BE412, _ZTSSt9basic_iosIcSt11char_traitsIcEE); +REG_FUNC(0xCA50ACCA, _ZTSSt9basic_iosIwSt11char_traitsIwEE); +REG_FUNC(0x45FD9715, _ZTSSt9exception); +REG_FUNC(0xE5C789D4, _ZTSSt9strstream); +REG_FUNC(0x2856DCD6, _ZTSSt9type_info); +REG_FUNC(0x75A1CED4, _ZTSU8__vectorx); +REG_FUNC(0x508FF61E, _ZTSU8__vectory); +REG_FUNC(0x8E6A51A, _ZTSa); +REG_FUNC(0x491DB7D3, _ZTSb); +REG_FUNC(0xD657B5A0, _ZTSc); +REG_FUNC(0x322C7CB5, _ZTSd); +REG_FUNC(0x596C02C7, _ZTSe); +REG_FUNC(0x2434A5DD, _ZTSf); +REG_FUNC(0x890DE9E8, _ZTSh); +REG_FUNC(0x4B9F21DF, _ZTSi); +REG_FUNC(0x4C2D1984, _ZTSj); +REG_FUNC(0x46E67574, _ZTSl); +REG_FUNC(0xEE238074, _ZTSm); +REG_FUNC(0x8C9CDB9C, _ZTSs); +REG_FUNC(0xED2E996A, _ZTSt); +REG_FUNC(0xD4744378, _ZTSv); +REG_FUNC(0x2C50C827, _ZTSw); +REG_FUNC(0x9574359B, _ZTSx); +REG_FUNC(0x402717E4, _ZTSy); +REG_FUNC(0x51B29810, _ZTTSd); +REG_FUNC(0x52128B13, _ZTTSi); +REG_FUNC(0x3C508708, _ZTTSo); +REG_FUNC(0x87753F6, _ZTTSt10istrstream); +REG_FUNC(0xE3D7CB30, _ZTTSt10ostrstream); +REG_FUNC(0xBC326B50, _ZTTSt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0x16E32018, _ZTTSt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0xC91F7671, _ZTTSt9strstream); +REG_FUNC(0x648213CC, _ZTVNSt8ios_base7failureE); +REG_FUNC(0x796EA5C0, _ZTVSd); +REG_FUNC(0xC5D326CB, _ZTVSd__St9strstream); +REG_FUNC(0xB02CB03C, _ZTVSi); +REG_FUNC(0xF4400A94, _ZTVSiSd__St9strstream); +REG_FUNC(0xF2A1132D, _ZTVSi__Sd); +REG_FUNC(0xDFF04427, _ZTVSi__St10istrstream); +REG_FUNC(0xD430E6D2, _ZTVSo); +REG_FUNC(0x3CAA5F50, _ZTVSoSd__St9strstream); +REG_FUNC(0x6D6BCA93, _ZTVSo__Sd); +REG_FUNC(0xBA833AE3, _ZTVSo__Sd__St9strstream); +REG_FUNC(0x65069CB5, _ZTVSo__St10ostrstream); +REG_FUNC(0x76BDD7CC, _ZTVSt10bad_typeid); +REG_FUNC(0xFBACB296, _ZTVSt10istrstream); +REG_FUNC(0xA81AD21D, _ZTVSt10ostrstream); +REG_FUNC(0x82A84E5E, _ZTVSt11logic_error); +REG_FUNC(0x1D583475, _ZTVSt11range_error); +REG_FUNC(0x80C77E16, _ZTVSt12domain_error); +REG_FUNC(0x64ADA35, _ZTVSt12length_error); +REG_FUNC(0xDDAE7CBE, _ZTVSt12out_of_range); +REG_FUNC(0x11B2781A, _ZTVSt12strstreambuf); +REG_FUNC(0x75D16BD0, _ZTVSt13_codecvt_base); +REG_FUNC(0x4AA9C954, _ZTVSt13bad_exception); +REG_FUNC(0xC3233C50, _ZTVSt13basic_filebufIcSt11char_traitsIcEE); +REG_FUNC(0xF269A8EB, _ZTVSt13basic_filebufIwSt11char_traitsIwEE); +REG_FUNC(0xB952752B, _ZTVSt13basic_istreamIwSt11char_traitsIwEE); +REG_FUNC(0x48F3405B, _ZTVSt13basic_ostreamIwSt11char_traitsIwEE); +REG_FUNC(0x53F02A18, _ZTVSt13runtime_error); +REG_FUNC(0x177FCCDC, _ZTVSt14overflow_error); +REG_FUNC(0x5548FF7, _ZTVSt15basic_streambufIcSt11char_traitsIcEE); +REG_FUNC(0xE8A9F32E, _ZTVSt15basic_streambufIwSt11char_traitsIwEE); +REG_FUNC(0x515AE097, _ZTVSt15underflow_error); +REG_FUNC(0x23EEDAF0, _ZTVSt16invalid_argument); +REG_FUNC(0x214E1395, _ZTVSt6_ctypeIcE); +REG_FUNC(0x798E7C29, _ZTVSt6_ctypeIwE); +REG_FUNC(0x9B3E5D29, _ZTVSt8_codecvtIccSt9_MbstatetE); +REG_FUNC(0x95405266, _ZTVSt8_codecvtIwcSt9_MbstatetE); +REG_FUNC(0xAA09FD32, _ZTVSt8bad_cast); +REG_FUNC(0xD58C5F52, _ZTVSt8ios_base); +REG_FUNC(0xA27EFBA3, _ZTVSt9bad_alloc); +REG_FUNC(0x147996ED, _ZTVSt9basic_iosIcSt11char_traitsIcEE); +REG_FUNC(0xDE4AFE9, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Sd__St9strstream); +REG_FUNC(0x87D18300, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SiSd__St9strstream); +REG_FUNC(0x3D6A38D3, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__Sd); +REG_FUNC(0xA8E795AF, _ZTVSt9basic_iosIcSt11char_traitsIcEE__Si__St10istrstream); +REG_FUNC(0xB7CD4C0E, _ZTVSt9basic_iosIcSt11char_traitsIcEE__SoSd__St9strstream); +REG_FUNC(0x21FDA8D0, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__Sd); +REG_FUNC(0xA8AAEABA, _ZTVSt9basic_iosIcSt11char_traitsIcEE__So__St10ostrstream); +REG_FUNC(0xCC03F184, _ZTVSt9basic_iosIwSt11char_traitsIwEE); +REG_FUNC(0xBC97F7D6, _ZTVSt9exception); +REG_FUNC(0xFD21E1F1, _ZTVSt9strstream); +REG_FUNC(0x8E9879A7, _ZTVSt9type_info); +REG_FUNC(0xE63750C1, _ZZNSt13basic_filebufIcSt11char_traitsIcEE5_InitEPSt10_Dnk_filetNS2_7_InitflEE7_Stinit); +REG_FUNC(0x1D4E29BC, _ZZNSt13basic_filebufIwSt11char_traitsIwEE5_InitEPSt10_Dnk_filetNS2_7_InitflEE7_Stinit); +REG_FUNC(0x8A37475, _ZTIN10__cxxabiv116__enum_type_infoE); +REG_FUNC(0x66CC7DBB, _ZTIN10__cxxabiv117__array_type_infoE); +REG_FUNC(0x81C44513, _ZTIN10__cxxabiv117__class_type_infoE); +REG_FUNC(0xC35024DA, _ZTIN10__cxxabiv117__pbase_type_infoE); +REG_FUNC(0x835E9E78, _ZTIN10__cxxabiv119__pointer_type_infoE); +REG_FUNC(0x62941235, _ZTIN10__cxxabiv120__function_type_infoE); +REG_FUNC(0x461E17F0, _ZTIN10__cxxabiv120__si_class_type_infoE); +REG_FUNC(0xB80BFF06, _ZTIN10__cxxabiv121__vmi_class_type_infoE); +REG_FUNC(0x7373F517, _ZTIN10__cxxabiv123__fundamental_type_infoE); +REG_FUNC(0xDF23E7B5, _ZTIN10__cxxabiv129__pointer_to_member_type_infoE); +REG_FUNC(0x74F19FF2, _ZTSN10__cxxabiv116__enum_type_infoE); +REG_FUNC(0x9BF7C72D, _ZTSN10__cxxabiv117__array_type_infoE); +REG_FUNC(0xCB5063F1, _ZTSN10__cxxabiv117__class_type_infoE); +REG_FUNC(0x4F5C24A6, _ZTSN10__cxxabiv117__pbase_type_infoE); +REG_FUNC(0x832019EE, _ZTSN10__cxxabiv119__pointer_type_infoE); +REG_FUNC(0xFB8956D8, _ZTSN10__cxxabiv120__function_type_infoE); +REG_FUNC(0xEAC164EC, _ZTSN10__cxxabiv120__si_class_type_infoE); +REG_FUNC(0x4106109E, _ZTSN10__cxxabiv121__vmi_class_type_infoE); +REG_FUNC(0x1FD93E3A, _ZTSN10__cxxabiv123__fundamental_type_infoE); +REG_FUNC(0xB64B4F55, _ZTSN10__cxxabiv129__pointer_to_member_type_infoE); +REG_FUNC(0x4937B673, _ZTVN10__cxxabiv116__enum_type_infoE); +REG_FUNC(0x9383FBD6, _ZTVN10__cxxabiv117__array_type_infoE); +REG_FUNC(0xF79AE8E1, _ZTVN10__cxxabiv117__class_type_infoE); +REG_FUNC(0xFEAD4BDA, _ZTVN10__cxxabiv117__pbase_type_infoE); +REG_FUNC(0xAA57484D, _ZTVN10__cxxabiv119__pointer_type_infoE); +REG_FUNC(0x897B54E3, _ZTVN10__cxxabiv120__function_type_infoE); +REG_FUNC(0x6BC74629, _ZTVN10__cxxabiv120__si_class_type_infoE); +REG_FUNC(0x7321E731, _ZTVN10__cxxabiv121__vmi_class_type_infoE); +REG_FUNC(0x33836375, _ZTVN10__cxxabiv123__fundamental_type_infoE); +REG_FUNC(0x94664DEB, _ZTVN10__cxxabiv129__pointer_to_member_type_infoE); +*/ diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.cpp b/rpcs3/Emu/ARMv7/PSVFuncList.cpp new file mode 100644 index 0000000000..bde15b0dc9 --- /dev/null +++ b/rpcs3/Emu/ARMv7/PSVFuncList.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" +#include "Emu/System.h" +#include "PSVFuncList.h" + +std::vector g_psv_func_list = []() -> std::vector +{ + std::vector v; + + psv_func f = + { + 0xdeadbeef, + "INVALID FUNCTION", + new psv_func_detail::func_binder([]() -> u32 + { + LOG_ERROR(HLE, "Unimplemented function found"); + Emu.Pause(); + + return 0xffffffffu; + }), + nullptr, + }; + v.push_back(f); + + return v; +}(); + +void add_psv_func(psv_func& data) +{ + g_psv_func_list.push_back(data); +} + +psv_func* get_psv_func_by_nid(u32 nid) +{ + for (auto& f : g_psv_func_list) + { + if (f.nid == nid) + { + return &f; + } + } + + return nullptr; +} + +u32 get_psv_func_index(psv_func* func) +{ + auto res = func - g_psv_func_list.data(); + + assert((size_t)res < g_psv_func_list.size()); + + return (u32)res; +} + +void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index) +{ + assert(index < g_psv_func_list.size()); + + (*g_psv_func_list[index].func)(CPU); +} + +extern psv_log_base sceLibc; +extern psv_log_base sceLibm; +extern psv_log_base sceLibstdcxx; +extern psv_log_base sceLibKernel; + +void list_known_psv_modules() +{ + sceLibc.Log(""); + sceLibm.Log(""); + sceLibstdcxx.Log(""); + sceLibKernel.Log(""); +} diff --git a/rpcs3/Emu/ARMv7/PSVFuncList.h b/rpcs3/Emu/ARMv7/PSVFuncList.h new file mode 100644 index 0000000000..8ae8282104 --- /dev/null +++ b/rpcs3/Emu/ARMv7/PSVFuncList.h @@ -0,0 +1,672 @@ +#pragma once +#include "ARMv7Thread.h" +#include "Emu/SysCalls/LogBase.h" + +class psv_log_base : public LogBase +{ + std::string m_name; + +public: + psv_log_base(const std::string& name) + : m_name(name) + { + } + + virtual const std::string& GetName() const override + { + return m_name; + } + +}; + +enum psv_error_codes +{ + SCE_OK = 0, + + SCE_ERROR_ERRNO_EPERM = 0x80010001, + SCE_ERROR_ERRNO_ENOENT = 0x80010002, + SCE_ERROR_ERRNO_ESRCH = 0x80010003, + SCE_ERROR_ERRNO_EINTR = 0x80010004, + SCE_ERROR_ERRNO_EIO = 0x80010005, + SCE_ERROR_ERRNO_ENXIO = 0x80010006, + SCE_ERROR_ERRNO_E2BIG = 0x80010007, + SCE_ERROR_ERRNO_ENOEXEC = 0x80010008, + SCE_ERROR_ERRNO_EBADF = 0x80010009, + SCE_ERROR_ERRNO_ECHILD = 0x8001000A, + SCE_ERROR_ERRNO_EAGAIN = 0x8001000B, + SCE_ERROR_ERRNO_ENOMEM = 0x8001000C, + SCE_ERROR_ERRNO_EACCES = 0x8001000D, + SCE_ERROR_ERRNO_EFAULT = 0x8001000E, + SCE_ERROR_ERRNO_ENOTBLK = 0x8001000F, + SCE_ERROR_ERRNO_EBUSY = 0x80010010, + SCE_ERROR_ERRNO_EEXIST = 0x80010011, + SCE_ERROR_ERRNO_EXDEV = 0x80010012, + SCE_ERROR_ERRNO_ENODEV = 0x80010013, + SCE_ERROR_ERRNO_ENOTDIR = 0x80010014, + SCE_ERROR_ERRNO_EISDIR = 0x80010015, + SCE_ERROR_ERRNO_EINVAL = 0x80010016, + SCE_ERROR_ERRNO_ENFILE = 0x80010017, + SCE_ERROR_ERRNO_EMFILE = 0x80010018, + SCE_ERROR_ERRNO_ENOTTY = 0x80010019, + SCE_ERROR_ERRNO_ETXTBSY = 0x8001001A, + SCE_ERROR_ERRNO_EFBIG = 0x8001001B, + SCE_ERROR_ERRNO_ENOSPC = 0x8001001C, + SCE_ERROR_ERRNO_ESPIPE = 0x8001001D, + SCE_ERROR_ERRNO_EROFS = 0x8001001E, + SCE_ERROR_ERRNO_EMLINK = 0x8001001F, + SCE_ERROR_ERRNO_EPIPE = 0x80010020, + SCE_ERROR_ERRNO_EDOM = 0x80010021, + SCE_ERROR_ERRNO_ERANGE = 0x80010022, + SCE_ERROR_ERRNO_ENOMSG = 0x80010023, + SCE_ERROR_ERRNO_EIDRM = 0x80010024, + SCE_ERROR_ERRNO_ECHRNG = 0x80010025, + SCE_ERROR_ERRNO_EL2NSYNC = 0x80010026, + SCE_ERROR_ERRNO_EL3HLT = 0x80010027, + SCE_ERROR_ERRNO_EL3RST = 0x80010028, + SCE_ERROR_ERRNO_ELNRNG = 0x80010029, + SCE_ERROR_ERRNO_EUNATCH = 0x8001002A, + SCE_ERROR_ERRNO_ENOCSI = 0x8001002B, + SCE_ERROR_ERRNO_EL2HLT = 0x8001002C, + SCE_ERROR_ERRNO_EDEADLK = 0x8001002D, + SCE_ERROR_ERRNO_ENOLCK = 0x8001002E, + SCE_ERROR_ERRNO_EFORMAT = 0x8001002F, + SCE_ERROR_ERRNO_EUNSUP = 0x80010030, + SCE_ERROR_ERRNO_EBADE = 0x80010032, + SCE_ERROR_ERRNO_EBADR = 0x80010033, + SCE_ERROR_ERRNO_EXFULL = 0x80010034, + SCE_ERROR_ERRNO_ENOANO = 0x80010035, + SCE_ERROR_ERRNO_EBADRQC = 0x80010036, + SCE_ERROR_ERRNO_EBADSLT = 0x80010037, + SCE_ERROR_ERRNO_EDEADLOCK = 0x80010038, + SCE_ERROR_ERRNO_EBFONT = 0x80010039, + SCE_ERROR_ERRNO_ENOSTR = 0x8001003C, + SCE_ERROR_ERRNO_ENODATA = 0x8001003D, + SCE_ERROR_ERRNO_ETIME = 0x8001003E, + SCE_ERROR_ERRNO_ENOSR = 0x8001003F, + SCE_ERROR_ERRNO_ENONET = 0x80010040, + SCE_ERROR_ERRNO_ENOPKG = 0x80010041, + SCE_ERROR_ERRNO_EREMOTE = 0x80010042, + SCE_ERROR_ERRNO_ENOLINK = 0x80010043, + SCE_ERROR_ERRNO_EADV = 0x80010044, + SCE_ERROR_ERRNO_ESRMNT = 0x80010045, + SCE_ERROR_ERRNO_ECOMM = 0x80010046, + SCE_ERROR_ERRNO_EPROTO = 0x80010047, + SCE_ERROR_ERRNO_EMULTIHOP = 0x8001004A, + SCE_ERROR_ERRNO_ELBIN = 0x8001004B, + SCE_ERROR_ERRNO_EDOTDOT = 0x8001004C, + SCE_ERROR_ERRNO_EBADMSG = 0x8001004D, + SCE_ERROR_ERRNO_EFTYPE = 0x8001004F, + SCE_ERROR_ERRNO_ENOTUNIQ = 0x80010050, + SCE_ERROR_ERRNO_EBADFD = 0x80010051, + SCE_ERROR_ERRNO_EREMCHG = 0x80010052, + SCE_ERROR_ERRNO_ELIBACC = 0x80010053, + SCE_ERROR_ERRNO_ELIBBAD = 0x80010054, + SCE_ERROR_ERRNO_ELIBSCN = 0x80010055, + SCE_ERROR_ERRNO_ELIBMAX = 0x80010056, + SCE_ERROR_ERRNO_ELIBEXEC = 0x80010057, + SCE_ERROR_ERRNO_ENOSYS = 0x80010058, + SCE_ERROR_ERRNO_ENMFILE = 0x80010059, + SCE_ERROR_ERRNO_ENOTEMPTY = 0x8001005A, + SCE_ERROR_ERRNO_ENAMETOOLONG = 0x8001005B, + SCE_ERROR_ERRNO_ELOOP = 0x8001005C, + SCE_ERROR_ERRNO_EOPNOTSUPP = 0x8001005F, + SCE_ERROR_ERRNO_EPFNOSUPPORT = 0x80010060, + SCE_ERROR_ERRNO_ECONNRESET = 0x80010068, + SCE_ERROR_ERRNO_ENOBUFS = 0x80010069, + SCE_ERROR_ERRNO_EAFNOSUPPORT = 0x8001006A, + SCE_ERROR_ERRNO_EPROTOTYPE = 0x8001006B, + SCE_ERROR_ERRNO_ENOTSOCK = 0x8001006C, + SCE_ERROR_ERRNO_ENOPROTOOPT = 0x8001006D, + SCE_ERROR_ERRNO_ESHUTDOWN = 0x8001006E, + SCE_ERROR_ERRNO_ECONNREFUSED = 0x8001006F, + SCE_ERROR_ERRNO_EADDRINUSE = 0x80010070, + SCE_ERROR_ERRNO_ECONNABORTED = 0x80010071, + SCE_ERROR_ERRNO_ENETUNREACH = 0x80010072, + SCE_ERROR_ERRNO_ENETDOWN = 0x80010073, + SCE_ERROR_ERRNO_ETIMEDOUT = 0x80010074, + SCE_ERROR_ERRNO_EHOSTDOWN = 0x80010075, + SCE_ERROR_ERRNO_EHOSTUNREACH = 0x80010076, + SCE_ERROR_ERRNO_EINPROGRESS = 0x80010077, + SCE_ERROR_ERRNO_EALREADY = 0x80010078, + SCE_ERROR_ERRNO_EDESTADDRREQ = 0x80010079, + SCE_ERROR_ERRNO_EMSGSIZE = 0x8001007A, + SCE_ERROR_ERRNO_EPROTONOSUPPORT = 0x8001007B, + SCE_ERROR_ERRNO_ESOCKTNOSUPPORT = 0x8001007C, + SCE_ERROR_ERRNO_EADDRNOTAVAIL = 0x8001007D, + SCE_ERROR_ERRNO_ENETRESET = 0x8001007E, + SCE_ERROR_ERRNO_EISCONN = 0x8001007F, + SCE_ERROR_ERRNO_ENOTCONN = 0x80010080, + SCE_ERROR_ERRNO_ETOOMANYREFS = 0x80010081, + SCE_ERROR_ERRNO_EPROCLIM = 0x80010082, + SCE_ERROR_ERRNO_EUSERS = 0x80010083, + SCE_ERROR_ERRNO_EDQUOT = 0x80010084, + SCE_ERROR_ERRNO_ESTALE = 0x80010085, + SCE_ERROR_ERRNO_ENOTSUP = 0x80010086, + SCE_ERROR_ERRNO_ENOMEDIUM = 0x80010087, + SCE_ERROR_ERRNO_ENOSHARE = 0x80010088, + SCE_ERROR_ERRNO_ECASECLASH = 0x80010089, + SCE_ERROR_ERRNO_EILSEQ = 0x8001008A, + SCE_ERROR_ERRNO_EOVERFLOW = 0x8001008B, + SCE_ERROR_ERRNO_ECANCELED = 0x8001008C, + SCE_ERROR_ERRNO_ENOTRECOVERABLE = 0x8001008D, + SCE_ERROR_ERRNO_EOWNERDEAD = 0x8001008E, + + SCE_KERNEL_ERROR_ERROR = 0x80020001, + SCE_KERNEL_ERROR_NOT_IMPLEMENTED = 0x80020002, + SCE_KERNEL_ERROR_INVALID_ARGUMENT = 0x80020003, + SCE_KERNEL_ERROR_INVALID_ARGUMENT_SIZE = 0x80020004, + SCE_KERNEL_ERROR_INVALID_FLAGS = 0x80020005, + SCE_KERNEL_ERROR_ILLEGAL_SIZE = 0x80020006, + SCE_KERNEL_ERROR_ILLEGAL_ADDR = 0x80020007, + SCE_KERNEL_ERROR_UNSUP = 0x80020008, + SCE_KERNEL_ERROR_ILLEGAL_MODE = 0x80020009, + SCE_KERNEL_ERROR_ILLEGAL_ALIGNMENT = 0x8002000A, + SCE_KERNEL_ERROR_NOSYS = 0x8002000B, + SCE_KERNEL_ERROR_DEBUG_ERROR = 0x80021000, + SCE_KERNEL_ERROR_ILLEGAL_DIPSW_NUMBER = 0x80021001, + SCE_KERNEL_ERROR_CPU_ERROR = 0x80022000, + SCE_KERNEL_ERROR_MMU_ILLEGAL_L1_TYPE = 0x80022001, + SCE_KERNEL_ERROR_MMU_L2_INDEX_OVERFLOW = 0x80022002, + SCE_KERNEL_ERROR_MMU_L2_SIZE_OVERFLOW = 0x80022003, + SCE_KERNEL_ERROR_INVALID_CPU_AFFINITY = 0x80022004, + SCE_KERNEL_ERROR_INVALID_MEMORY_ACCESS = 0x80022005, + SCE_KERNEL_ERROR_INVALID_MEMORY_ACCESS_PERMISSION = 0x80022006, + SCE_KERNEL_ERROR_VA2PA_FAULT = 0x80022007, + SCE_KERNEL_ERROR_VA2PA_MAPPED = 0x80022008, + SCE_KERNEL_ERROR_VALIDATION_CHECK_FAILED = 0x80022009, + SCE_KERNEL_ERROR_SYSMEM_ERROR = 0x80024000, + SCE_KERNEL_ERROR_INVALID_PROCESS_CONTEXT = 0x80024001, + SCE_KERNEL_ERROR_UID_NAME_TOO_LONG = 0x80024002, + SCE_KERNEL_ERROR_VARANGE_IS_NOT_PHYSICAL_CONTINUOUS = 0x80024003, + SCE_KERNEL_ERROR_PHYADDR_ERROR = 0x80024100, + SCE_KERNEL_ERROR_NO_PHYADDR = 0x80024101, + SCE_KERNEL_ERROR_PHYADDR_USED = 0x80024102, + SCE_KERNEL_ERROR_PHYADDR_NOT_USED = 0x80024103, + SCE_KERNEL_ERROR_NO_IOADDR = 0x80024104, + SCE_KERNEL_ERROR_PHYMEM_ERROR = 0x80024300, + SCE_KERNEL_ERROR_ILLEGAL_PHYPAGE_STATUS = 0x80024301, + SCE_KERNEL_ERROR_NO_FREE_PHYSICAL_PAGE = 0x80024302, + SCE_KERNEL_ERROR_NO_FREE_PHYSICAL_PAGE_UNIT = 0x80024303, + SCE_KERNEL_ERROR_PHYMEMPART_NOT_EMPTY = 0x80024304, + SCE_KERNEL_ERROR_NO_PHYMEMPART_LPDDR2 = 0x80024305, + SCE_KERNEL_ERROR_NO_PHYMEMPART_CDRAM = 0x80024306, + SCE_KERNEL_ERROR_FIXEDHEAP_ERROR = 0x80024400, + SCE_KERNEL_ERROR_FIXEDHEAP_ILLEGAL_SIZE = 0x80024401, + SCE_KERNEL_ERROR_FIXEDHEAP_ILLEGAL_INDEX = 0x80024402, + SCE_KERNEL_ERROR_FIXEDHEAP_INDEX_OVERFLOW = 0x80024403, + SCE_KERNEL_ERROR_FIXEDHEAP_NO_CHUNK = 0x80024404, + SCE_KERNEL_ERROR_UID_ERROR = 0x80024500, + SCE_KERNEL_ERROR_INVALID_UID = 0x80024501, + SCE_KERNEL_ERROR_SYSMEM_UID_INVALID_ARGUMENT = 0x80024502, + SCE_KERNEL_ERROR_SYSMEM_INVALID_UID_RANGE = 0x80024503, + SCE_KERNEL_ERROR_SYSMEM_NO_VALID_UID = 0x80024504, + SCE_KERNEL_ERROR_SYSMEM_CANNOT_ALLOCATE_UIDENTRY = 0x80024505, + SCE_KERNEL_ERROR_NOT_PROCESS_UID = 0x80024506, + SCE_KERNEL_ERROR_NOT_KERNEL_UID = 0x80024507, + SCE_KERNEL_ERROR_INVALID_UID_CLASS = 0x80024508, + SCE_KERNEL_ERROR_INVALID_UID_SUBCLASS = 0x80024509, + SCE_KERNEL_ERROR_UID_CANNOT_FIND_BY_NAME = 0x8002450A, + SCE_KERNEL_ERROR_VIRPAGE_ERROR = 0x80024600, + SCE_KERNEL_ERROR_ILLEGAL_VIRPAGE_TYPE = 0x80024601, + SCE_KERNEL_ERROR_BLOCK_ERROR = 0x80024700, + SCE_KERNEL_ERROR_ILLEGAL_BLOCK_ID = 0x80024701, + SCE_KERNEL_ERROR_ILLEGAL_BLOCK_TYPE = 0x80024702, + SCE_KERNEL_ERROR_BLOCK_IN_USE = 0x80024703, + SCE_KERNEL_ERROR_PARTITION_ERROR = 0x80024800, + SCE_KERNEL_ERROR_ILLEGAL_PARTITION_ID = 0x80024801, + SCE_KERNEL_ERROR_ILLEGAL_PARTITION_INDEX = 0x80024802, + SCE_KERNEL_ERROR_NO_L2PAGETABLE = 0x80024803, + SCE_KERNEL_ERROR_HEAPLIB_ERROR = 0x80024900, + SCE_KERNEL_ERROR_ILLEGAL_HEAP_ID = 0x80024901, + SCE_KERNEL_ERROR_OUT_OF_RANG = 0x80024902, + SCE_KERNEL_ERROR_HEAPLIB_NOMEM = 0x80024903, + SCE_KERNEL_ERROR_SYSMEM_ADDRESS_SPACE_ERROR = 0x80024A00, + SCE_KERNEL_ERROR_INVALID_ADDRESS_SPACE_ID = 0x80024A01, + SCE_KERNEL_ERROR_INVALID_PARTITION_INDEX = 0x80024A02, + SCE_KERNEL_ERROR_ADDRESS_SPACE_CANNOT_FIND_PARTITION_BY_ADDR = 0x80024A03, + SCE_KERNEL_ERROR_SYSMEM_MEMBLOCK_ERROR = 0x80024B00, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_TYPE = 0x80024B01, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_REMAP_TYPE = 0x80024B02, + SCE_KERNEL_ERROR_NOT_PHY_CONT_MEMBLOCK = 0x80024B03, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_CODE = 0x80024B04, + SCE_KERNEL_ERROR_ILLEGAL_MEMBLOCK_SIZE = 0x80024B05, + SCE_KERNEL_ERROR_ILLEGAL_USERMAP_SIZE = 0x80024B06, + SCE_KERNEL_ERROR_MEMBLOCK_TYPE_FOR_KERNEL_PROCESS = 0x80024B07, + SCE_KERNEL_ERROR_PROCESS_CANNOT_REMAP_MEMBLOCK = 0x80024B08, + SCE_KERNEL_ERROR_SYSMEM_PHYMEMLOW_ERROR = 0x80024C00, + SCE_KERNEL_ERROR_CANNOT_ALLOC_PHYMEMLOW = 0x80024C01, + SCE_KERNEL_ERROR_UNKNOWN_PHYMEMLOW_TYPE = 0x80024C02, + SCE_KERNEL_ERROR_SYSMEM_BITHEAP_ERROR = 0x80024D00, + SCE_KERNEL_ERROR_CANNOT_ALLOC_BITHEAP = 0x80024D01, + SCE_KERNEL_ERROR_LOADCORE_ERROR = 0x80025000, + SCE_KERNEL_ERROR_ILLEGAL_ELF_HEADER = 0x80025001, + SCE_KERNEL_ERROR_ILLEGAL_SELF_HEADER = 0x80025002, + SCE_KERNEL_ERROR_EXCPMGR_ERROR = 0x80027000, + SCE_KERNEL_ERROR_ILLEGAL_EXCPCODE = 0x80027001, + SCE_KERNEL_ERROR_ILLEGAL_EXCPHANDLER = 0x80027002, + SCE_KERNEL_ERROR_NOTFOUND_EXCPHANDLER = 0x80027003, + SCE_KERNEL_ERROR_CANNOT_RELEASE_EXCPHANDLER = 0x80027004, + SCE_KERNEL_ERROR_INTRMGR_ERROR = 0x80027100, + SCE_KERNEL_ERROR_ILLEGAL_CONTEXT = 0x80027101, + SCE_KERNEL_ERROR_ILLEGAL_INTRCODE = 0x80027102, + SCE_KERNEL_ERROR_ILLEGAL_INTRPARAM = 0x80027103, + SCE_KERNEL_ERROR_ILLEGAL_INTRPRIORITY = 0x80027104, + SCE_KERNEL_ERROR_ILLEGAL_TARGET_CPU = 0x80027105, + SCE_KERNEL_ERROR_ILLEGAL_INTRFILTER = 0x80027106, + SCE_KERNEL_ERROR_ILLEGAL_INTRTYPE = 0x80027107, + SCE_KERNEL_ERROR_ILLEGAL_HANDLER = 0x80027108, + SCE_KERNEL_ERROR_FOUND_HANDLER = 0x80027109, + SCE_KERNEL_ERROR_NOTFOUND_HANDLER = 0x8002710A, + SCE_KERNEL_ERROR_NO_MEMORY = 0x8002710B, + SCE_KERNEL_ERROR_DMACMGR_ERROR = 0x80027200, + SCE_KERNEL_ERROR_ALREADY_QUEUED = 0x80027201, + SCE_KERNEL_ERROR_NOT_QUEUED = 0x80027202, + SCE_KERNEL_ERROR_NOT_SETUP = 0x80027203, + SCE_KERNEL_ERROR_ON_TRANSFERRING = 0x80027204, + SCE_KERNEL_ERROR_NOT_INITIALIZED = 0x80027205, + SCE_KERNEL_ERROR_TRANSFERRED = 0x80027206, + SCE_KERNEL_ERROR_NOT_UNDER_CONTROL = 0x80027207, + SCE_KERNEL_ERROR_SYSTIMER_ERROR = 0x80027300, + SCE_KERNEL_ERROR_NO_FREE_TIMER = 0x80027301, + SCE_KERNEL_ERROR_TIMER_NOT_ALLOCATED = 0x80027302, + SCE_KERNEL_ERROR_TIMER_COUNTING = 0x80027303, + SCE_KERNEL_ERROR_TIMER_STOPPED = 0x80027304, + SCE_KERNEL_ERROR_THREADMGR_ERROR = 0x80028000, + SCE_KERNEL_ERROR_DORMANT = 0x80028001, + SCE_KERNEL_ERROR_NOT_DORMANT = 0x80028002, + SCE_KERNEL_ERROR_UNKNOWN_THID = 0x80028003, + SCE_KERNEL_ERROR_CAN_NOT_WAIT = 0x80028004, + SCE_KERNEL_ERROR_ILLEGAL_THID = 0x80028005, + SCE_KERNEL_ERROR_THREAD_TERMINATED = 0x80028006, + SCE_KERNEL_ERROR_DELETED = 0x80028007, + SCE_KERNEL_ERROR_WAIT_TIMEOUT = 0x80028008, + SCE_KERNEL_ERROR_NOTIFY_CALLBACK = 0x80028009, + SCE_KERNEL_ERROR_WAIT_DELETE = 0x8002800A, + SCE_KERNEL_ERROR_ILLEGAL_ATTR = 0x8002800B, + SCE_KERNEL_ERROR_EVF_MULTI = 0x8002800C, + SCE_KERNEL_ERROR_WAIT_CANCEL = 0x8002800D, + SCE_KERNEL_ERROR_EVF_COND = 0x8002800E, + SCE_KERNEL_ERROR_ILLEGAL_COUNT = 0x8002800F, + SCE_KERNEL_ERROR_ILLEGAL_PRIORITY = 0x80028010, + SCE_KERNEL_ERROR_MUTEX_RECURSIVE = 0x80028011, + SCE_KERNEL_ERROR_MUTEX_LOCK_OVF = 0x80028012, + SCE_KERNEL_ERROR_MUTEX_NOT_OWNED = 0x80028013, + SCE_KERNEL_ERROR_MUTEX_UNLOCK_UDF = 0x80028014, + SCE_KERNEL_ERROR_MUTEX_FAILED_TO_OWN = 0x80028015, + SCE_KERNEL_ERROR_FAST_MUTEX_RECURSIVE = 0x80028016, + SCE_KERNEL_ERROR_FAST_MUTEX_LOCK_OVF = 0x80028017, + SCE_KERNEL_ERROR_FAST_MUTEX_FAILED_TO_OWN = 0x80028018, + SCE_KERNEL_ERROR_FAST_MUTEX_NOT_OWNED = 0x80028019, + SCE_KERNEL_ERROR_FAST_MUTEX_OWNED = 0x8002801A, + SCE_KERNEL_ERROR_ALARM_CAN_NOT_CANCEL = 0x8002801B, + SCE_KERNEL_ERROR_INVALID_OBJECT_TYPE = 0x8002801C, + SCE_KERNEL_ERROR_KERNEL_TLS_FULL = 0x8002801D, + SCE_KERNEL_ERROR_ILLEGAL_KERNEL_TLS_INDEX = 0x8002801E, + SCE_KERNEL_ERROR_KERNEL_TLS_BUSY = 0x8002801F, + SCE_KERNEL_ERROR_DIFFERENT_UID_CLASS = 0x80028020, + SCE_KERNEL_ERROR_UNKNOWN_UID = 0x80028021, + SCE_KERNEL_ERROR_SEMA_ZERO = 0x80028022, + SCE_KERNEL_ERROR_SEMA_OVF = 0x80028023, + SCE_KERNEL_ERROR_PMON_NOT_THREAD_MODE = 0x80028024, + SCE_KERNEL_ERROR_PMON_NOT_CPU_MODE = 0x80028025, + SCE_KERNEL_ERROR_ALREADY_REGISTERED = 0x80028026, + SCE_KERNEL_ERROR_INVALID_THREAD_ID = 0x80028027, + SCE_KERNEL_ERROR_ALREADY_DEBUG_SUSPENDED = 0x80028028, + SCE_KERNEL_ERROR_NOT_DEBUG_SUSPENDED = 0x80028029, + SCE_KERNEL_ERROR_CAN_NOT_USE_VFP = 0x8002802A, + SCE_KERNEL_ERROR_RUNNING = 0x8002802B, + SCE_KERNEL_ERROR_EVENT_COND = 0x8002802C, + SCE_KERNEL_ERROR_MSG_PIPE_FULL = 0x8002802D, + SCE_KERNEL_ERROR_MSG_PIPE_EMPTY = 0x8002802E, + SCE_KERNEL_ERROR_ALREADY_SENT = 0x8002802F, + SCE_KERNEL_ERROR_CAN_NOT_SUSPEND = 0x80028030, + SCE_KERNEL_ERROR_FAST_MUTEX_ALREADY_INITIALIZED = 0x80028031, + SCE_KERNEL_ERROR_FAST_MUTEX_NOT_INITIALIZED = 0x80028032, + SCE_KERNEL_ERROR_THREAD_STOPPED = 0x80028033, + SCE_KERNEL_ERROR_THREAD_SUSPENDED = 0x80028034, + SCE_KERNEL_ERROR_NOT_SUSPENDED = 0x80028035, + SCE_KERNEL_ERROR_WAIT_DELETE_MUTEX = 0x80028036, + SCE_KERNEL_ERROR_WAIT_CANCEL_MUTEX = 0x80028037, + SCE_KERNEL_ERROR_WAIT_DELETE_COND = 0x80028038, + SCE_KERNEL_ERROR_WAIT_CANCEL_COND = 0x80028039, + SCE_KERNEL_ERROR_LW_MUTEX_NOT_OWNED = 0x8002803A, + SCE_KERNEL_ERROR_LW_MUTEX_LOCK_OVF = 0x8002803B, + SCE_KERNEL_ERROR_LW_MUTEX_UNLOCK_UDF = 0x8002803C, + SCE_KERNEL_ERROR_LW_MUTEX_RECURSIVE = 0x8002803D, + SCE_KERNEL_ERROR_LW_MUTEX_FAILED_TO_OWN = 0x8002803E, + SCE_KERNEL_ERROR_WAIT_DELETE_LW_MUTEX = 0x8002803F, + SCE_KERNEL_ERROR_ILLEGAL_STACK_SIZE = 0x80028040, + SCE_KERNEL_ERROR_RW_LOCK_RECURSIVE = 0x80028041, + SCE_KERNEL_ERROR_RW_LOCK_LOCK_OVF = 0x80028042, + SCE_KERNEL_ERROR_RW_LOCK_NOT_OWNED = 0x80028043, + SCE_KERNEL_ERROR_RW_LOCK_UNLOCK_UDF = 0x80028044, + SCE_KERNEL_ERROR_RW_LOCK_FAILED_TO_LOCK = 0x80028045, + SCE_KERNEL_ERROR_RW_LOCK_FAILED_TO_UNLOCK = 0x80028046, + + SCE_KERNEL_ERROR_PROCESSMGR_ERROR = 0x80029000, + SCE_KERNEL_ERROR_INVALID_PID = 0x80029001, + SCE_KERNEL_ERROR_INVALID_PROCESS_TYPE = 0x80029002, + SCE_KERNEL_ERROR_PLS_FULL = 0x80029003, + SCE_KERNEL_ERROR_INVALID_PROCESS_STATUS = 0x80029004, + SCE_KERNEL_ERROR_INVALID_BUDGET_ID = 0x80029005, + SCE_KERNEL_ERROR_INVALID_BUDGET_SIZE = 0x80029006, + SCE_KERNEL_ERROR_CP14_DISABLED = 0x80029007, + SCE_KERNEL_ERROR_EXCEEDED_MAX_PROCESSES = 0x80029008, + SCE_KERNEL_ERROR_PROCESS_REMAINING = 0x80029009, + SCE_KERNEL_ERROR_IOFILEMGR_ERROR = 0x8002A000, + SCE_KERNEL_ERROR_IO_NAME_TOO_LONG = 0x8002A001, + SCE_KERNEL_ERROR_IO_REG_DEV = 0x8002A002, + SCE_KERNEL_ERROR_IO_ALIAS_USED = 0x8002A003, + SCE_KERNEL_ERROR_IO_DEL_DEV = 0x8002A004, + SCE_KERNEL_ERROR_IO_WOULD_BLOCK = 0x8002A005, + SCE_KERNEL_ERROR_MODULEMGR_START_FAILED = 0x8002D000, + SCE_KERNEL_ERROR_MODULEMGR_STOP_FAIL = 0x8002D001, + SCE_KERNEL_ERROR_MODULEMGR_IN_USE = 0x8002D002, + SCE_KERNEL_ERROR_MODULEMGR_NO_LIB = 0x8002D003, + SCE_KERNEL_ERROR_MODULEMGR_SYSCALL_REG = 0x8002D004, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM_LIB = 0x8002D005, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM_STUB = 0x8002D006, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM_SELF = 0x8002D007, + SCE_KERNEL_ERROR_MODULEMGR_NOMEM = 0x8002D008, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_LIB = 0x8002D009, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_STUB = 0x8002D00A, + SCE_KERNEL_ERROR_MODULEMGR_NO_FUNC_NID = 0x8002D00B, + SCE_KERNEL_ERROR_MODULEMGR_NO_VAR_NID = 0x8002D00C, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_TYPE = 0x8002D00D, + SCE_KERNEL_ERROR_MODULEMGR_NO_MOD_ENTRY = 0x8002D00E, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_PROC_PARAM = 0x8002D00F, + SCE_KERNEL_ERROR_MODULEMGR_NO_MODOBJ = 0x8002D010, + SCE_KERNEL_ERROR_MODULEMGR_NO_MOD = 0x8002D011, + SCE_KERNEL_ERROR_MODULEMGR_NO_PROCESS = 0x8002D012, + SCE_KERNEL_ERROR_MODULEMGR_OLD_LIB = 0x8002D013, + SCE_KERNEL_ERROR_MODULEMGR_STARTED = 0x8002D014, + SCE_KERNEL_ERROR_MODULEMGR_NOT_STARTED = 0x8002D015, + SCE_KERNEL_ERROR_MODULEMGR_NOT_STOPPED = 0x8002D016, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_PROCESS_UID = 0x8002D017, + SCE_KERNEL_ERROR_MODULEMGR_CANNOT_EXPORT_LIB_TO_SHARED = 0x8002D018, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_REL_INFO = 0x8002D019, + SCE_KERNEL_ERROR_MODULEMGR_INVALID_REF_INFO = 0x8002D01A, + SCE_KERNEL_ERROR_MODULEMGR_ELINK = 0x8002D01B, + SCE_KERNEL_ERROR_MODULEMGR_NOENT = 0x8002D01C, + SCE_KERNEL_ERROR_MODULEMGR_BUSY = 0x8002D01D, + SCE_KERNEL_ERROR_MODULEMGR_NOEXEC = 0x8002D01E, + SCE_KERNEL_ERROR_MODULEMGR_NAMETOOLONG = 0x8002D01F, + SCE_KERNEL_ERROR_LIBRARYDB_NOENT = 0x8002D080, + SCE_KERNEL_ERROR_LIBRARYDB_NO_LIB = 0x8002D081, + SCE_KERNEL_ERROR_LIBRARYDB_NO_MOD = 0x8002D082, + SCE_KERNEL_ERROR_AUTHFAIL = 0x8002F000, + SCE_KERNEL_ERROR_NO_AUTH = 0x8002F001, +}; + +class psv_func_caller +{ +public: + virtual void operator()(ARMv7Thread& CPU) = 0; + virtual ~psv_func_caller(){}; +}; + +namespace psv_func_detail +{ + enum bind_arg_type + { + ARG_GENERAL, + ARG_FLOAT, + ARG_VECTOR, + ARG_STACK, + }; + + template + struct bind_arg; + + template + struct bind_arg + { + static_assert(sizeof(T) <= 4, "Invalid function argument type for ARG_GENERAL"); + + static __forceinline T func(ARMv7Thread& CPU) + { + return (T&)CPU.GPR[g_count - 1]; + } + }; + + template + struct bind_arg + { + static_assert(f_count <= 0, "TODO: Unsupported argument type (float)"); + static_assert(sizeof(T) <= 8, "Invalid function argument type for ARG_FLOAT"); + + static __forceinline T func(ARMv7Thread& CPU) + { + } + }; + + template + struct bind_arg + { + static_assert(v_count <= 0, "TODO: Unsupported argument type (vector)"); + static_assert(sizeof(T) == 16, "Invalid function argument type for ARG_VECTOR"); + + static __forceinline T func(ARMv7Thread& CPU) + { + } + }; + + template + struct bind_arg + { + static_assert(f_count <= 0, "TODO: Unsupported stack argument type (float)"); + static_assert(v_count <= 0, "TODO: Unsupported stack argument type (vector)"); + static_assert(sizeof(T) <= 4, "Invalid function argument type for ARG_STACK"); + + static __forceinline T func(ARMv7Thread& CPU) + { + const u32 res = CPU.GetStackArg(g_count); + return (T&)res; + } + }; + + template + struct bind_result + { + static_assert(type != ARG_FLOAT, "TODO: Unsupported funcion result type (float)"); + static_assert(type != ARG_VECTOR, "TODO: Unsupported funcion result type (vector)"); + static_assert(type == ARG_GENERAL, "Wrong use of bind_result template"); + static_assert(sizeof(T) <= 4, "Invalid function result type for ARG_GENERAL"); + + static __forceinline void func(ARMv7Thread& CPU, T result) + { + (T&)CPU.GPR[0] = result; + } + }; + + //template + //struct bind_result + //{ + // static_assert(sizeof(T) <= 8, "Invalid function result type for ARG_FLOAT"); + + // static __forceinline void func(ARMv7Thread& CPU, T result) + // { + // } + //}; + + //template + //struct bind_result + //{ + // static_assert(sizeof(T) == 16, "Invalid function result type for ARG_VECTOR"); + + // static __forceinline void func(ARMv7Thread& CPU, const T result) + // { + // } + //}; + + template + struct call_impl + { + static __forceinline RT call(F f, Tuple && t) + { + return call_impl::call(f, std::forward(t)); + } + }; + + template + struct call_impl + { + static __forceinline RT call(F f, Tuple && t) + { + return f(std::get(std::forward(t))...); + } + }; + + template + static __forceinline RT call(F f, Tuple && t) + { + typedef typename std::decay::type ttype; + return psv_func_detail::call_impl::value, std::tuple_size::value>::call(f, std::forward(t)); + } + + template + static __forceinline std::tuple<> iterate(ARMv7Thread& CPU) + { + // terminator + return std::tuple<>(); + } + + template + static __forceinline std::tuple iterate(ARMv7Thread& CPU) + { + static_assert(!std::is_pointer::value, "Invalid function argument type (pointer)"); + static_assert(!std::is_reference::value, "Invalid function argument type (reference)"); + // TODO: check calculations + const bool is_float = std::is_floating_point::value; + const bool is_vector = std::is_same::value; + const bind_arg_type t = is_float + ? ((f_count >= 4) ? ARG_STACK : ARG_FLOAT) + : (is_vector ? ((v_count >= 4) ? ARG_STACK : ARG_VECTOR) : ((g_count >= 4) ? ARG_STACK : ARG_GENERAL)); + const int g = g_count + (is_float || is_vector ? 0 : 1); + const int f = f_count + (is_float ? 1 : 0); + const int v = v_count + (is_vector ? 1 : 0); + + return std::tuple_cat(std::tuple(bind_arg::func(CPU)), iterate(CPU)); + } + + template + class func_binder; + + template + class func_binder : public psv_func_caller + { + typedef void(*func_t)(T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + call(m_call, iterate<0, 0, 0, T...>(CPU)); + } + }; + + template + class func_binder : public psv_func_caller + { + typedef void(*func_t)(ARMv7Thread&, T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + call(m_call, std::tuple_cat(std::tuple(CPU), iterate<0, 0, 0, T...>(CPU))); + } + }; + + template + class func_binder : public psv_func_caller + { + typedef RT(*func_t)(T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + static_assert(!std::is_pointer::value, "Invalid function result type (pointer)"); + static_assert(!std::is_reference::value, "Invalid function result type (reference)"); + const bool is_float = std::is_floating_point::value; + const bool is_vector = std::is_same::value; + const bind_arg_type t = is_float ? ARG_FLOAT : (is_vector ? ARG_VECTOR : ARG_GENERAL); + + bind_result::func(CPU, call(m_call, iterate<0, 0, 0, T...>(CPU))); + } + }; + + template + class func_binder : public psv_func_caller + { + typedef RT(*func_t)(ARMv7Thread&, T...); + const func_t m_call; + + public: + func_binder(func_t call) + : psv_func_caller() + , m_call(call) + { + } + + virtual void operator()(ARMv7Thread& CPU) + { + static_assert(!std::is_pointer::value, "Invalid function result type (pointer)"); + static_assert(!std::is_reference::value, "Invalid function result type (reference)"); + const bool is_float = std::is_floating_point::value; + const bool is_vector = std::is_same::value; + const bind_arg_type t = is_float ? ARG_FLOAT : (is_vector ? ARG_VECTOR : ARG_GENERAL); + + bind_result::func(CPU, call(m_call, std::tuple_cat(std::tuple(CPU), iterate<0, 0, 0, T...>(CPU)))); + } + }; +} + +struct psv_func +{ + const u32 nid; + const char* const name; + psv_func_caller* const func; + psv_log_base* const module; +}; + +void add_psv_func(psv_func& data); + +template +void reg_psv_func(u32 nid, psv_log_base* module, const char* name, RT(*func)(T...)) +{ + psv_func f = + { + nid, + name, + new psv_func_detail::func_binder(func), + module + }; + + add_psv_func(f); +} + +psv_func* get_psv_func_by_nid(u32 nid); +u32 get_psv_func_index(psv_func* func); + +void execute_psv_func_by_index(ARMv7Thread& CPU, u32 index); +void list_known_psv_modules(); diff --git a/rpcs3/Emu/CPU/CPUDecoder.h b/rpcs3/Emu/CPU/CPUDecoder.h index df28e54467..beb0027055 100644 --- a/rpcs3/Emu/CPU/CPUDecoder.h +++ b/rpcs3/Emu/CPU/CPUDecoder.h @@ -333,6 +333,17 @@ public: }); } + InstrBase(const InstrBase &source) + : InstrCaller(source) + , m_name(source.m_name) + , m_opcode(source.m_opcode) + , m_args_count(source.m_args_count) + , m_args(source.m_args_count ? new CodeFieldBase*[source.m_args_count] : nullptr) + { + for(uint i = 0; i < source.m_args_count; ++i) + m_args[i] = source.m_args[i]; + } + virtual ~InstrBase() { if (m_args) { diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index fac66da910..5990228a29 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -28,6 +28,8 @@ CPUThread::CPUThread(CPUThreadType type) , m_is_branch(false) , m_status(Stopped) , m_last_syscall(0) + , m_trace_enabled(false) + , m_trace_call_stack(true) { } @@ -154,7 +156,7 @@ void CPUThread::SetBranch(const u32 pc, bool record_branch) m_is_branch = true; nPC = pc; - if(record_branch) + if(m_trace_call_stack && record_branch) CallStackBranch(pc); } @@ -298,7 +300,7 @@ void _se_translator(unsigned int u, EXCEPTION_POINTERS* pExp) void CPUThread::Task() { - if (Ini.HLELogging.GetValue()) LOG_NOTICE(PPU, "%s enter", CPUThread::GetFName().c_str()); + if (Ini.HLELogging.GetValue()) LOG_NOTICE(GENERAL, "%s enter", CPUThread::GetFName().c_str()); const std::vector& bp = Emu.GetBreakPoints(); @@ -337,7 +339,7 @@ void CPUThread::Task() } Step(); - //if (PC - 0x13ED4 < 0x288) trace.push_back(PC); + //if (m_trace_enabled) trace.push_back(PC); NextPc(m_dec->DecodeMemory(PC + m_offset)); if (status == CPUThread_Step) @@ -373,7 +375,25 @@ void CPUThread::Task() // TODO: linux version #endif - for (auto& v : trace) LOG_NOTICE(PPU, "PC = 0x%x", v); + if (trace.size()) + { + LOG_NOTICE(GENERAL, "Trace begin (%d elements)", trace.size()); - if (Ini.HLELogging.GetValue()) LOG_NOTICE(PPU, "%s leave", CPUThread::GetFName().c_str()); + u32 start = trace[0], prev = trace[0] - 4; + + for (auto& v : trace) //LOG_NOTICE(GENERAL, "PC = 0x%x", v); + { + if (v - prev != 4) + { + LOG_NOTICE(GENERAL, "Trace: 0x%08x .. 0x%08x", start, prev); + start = v; + } + prev = v; + } + + LOG_NOTICE(GENERAL, "Trace end: 0x%08x .. 0x%08x", start, prev); + } + + + if (Ini.HLELogging.GetValue()) LOG_NOTICE(GENERAL, "%s leave", CPUThread::GetFName().c_str()); } diff --git a/rpcs3/Emu/CPU/CPUThread.h b/rpcs3/Emu/CPU/CPUThread.h index 65b5c7afdc..6bfbc0e8d4 100644 --- a/rpcs3/Emu/CPU/CPUThread.h +++ b/rpcs3/Emu/CPU/CPUThread.h @@ -43,6 +43,8 @@ protected: CPUDecoder* m_dec; + bool m_trace_call_stack; + public: virtual void InitRegs()=0; @@ -109,16 +111,19 @@ public: virtual std::string GetThreadName() const { - std::string temp = (GetFName() + fmt::Format("[0x%08llx]", PC)); + std::string temp = (GetFName() + fmt::Format("[0x%08x]", PC)); return temp; } + CPUDecoder * GetDecoder() { return m_dec; }; + public: u32 entry; u32 PC; u32 nPC; u64 cycle; bool m_is_branch; + bool m_trace_enabled; bool m_is_interrupt; bool m_has_interrupt; @@ -174,6 +179,8 @@ public: u32 GetId() const { return m_id; } CPUThreadType GetType() const { return m_type; } + void SetCallStackTracing(bool trace_call_stack) { m_trace_call_stack = trace_call_stack; } + void Reset(); void Close(); void Run(); @@ -221,13 +228,13 @@ public: m_call_stack.erase((res + 1).base(), m_call_stack.end()); return; } - + //add a new entry otherwise CallStackItem new_item; - + new_item.branch_pc = pc; new_item.pc = PC; - + m_call_stack.push_back(new_item); } @@ -249,3 +256,42 @@ protected: }; CPUThread* GetCurrentCPUThread(); + +class cpu_thread +{ +protected: + CPUThread* thread; + +public: + u32 get_entry() const + { + return thread->entry; + } + + virtual cpu_thread& args(std::initializer_list values) = 0; + + virtual cpu_thread& run() = 0; + + u64 join() + { + if (!joinable()) + throw "thread must be joinable for join"; + + thread->SetJoinable(false); + + while (thread->IsRunning()) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + + return thread->GetExitStatus(); + } + + bool joinable() const + { + return thread->IsJoinable(); + } + + u32 get_id() const + { + return thread->GetId(); + } +}; \ No newline at end of file diff --git a/rpcs3/Emu/CPU/CPUThreadManager.cpp b/rpcs3/Emu/CPU/CPUThreadManager.cpp index af9368f338..b745da0177 100644 --- a/rpcs3/Emu/CPU/CPUThreadManager.cpp +++ b/rpcs3/Emu/CPU/CPUThreadManager.cpp @@ -135,22 +135,6 @@ RawSPUThread* CPUThreadManager::GetRawSPUThread(u32 num) } } -void CPUThreadManager::NotifyThread(const u32 id) -{ - if (!id) return; - - std::lock_guard lock(m_mtx_thread); - - for (u32 i = 0; i < m_threads.size(); i++) - { - if (m_threads[i]->GetId() == id) - { - m_threads[i]->Notify(); - return; - } - } -} - void CPUThreadManager::Exec() { std::lock_guard lock(m_mtx_thread); diff --git a/rpcs3/Emu/CPU/CPUThreadManager.h b/rpcs3/Emu/CPU/CPUThreadManager.h index 480ef940f0..d43a7506c3 100644 --- a/rpcs3/Emu/CPU/CPUThreadManager.h +++ b/rpcs3/Emu/CPU/CPUThreadManager.h @@ -17,7 +17,6 @@ public: CPUThread& AddThread(CPUThreadType type); void RemoveThread(const u32 id); - void NotifyThread(const u32 id); std::vector& GetThreads() { return m_threads; } s32 GetThreadNumById(CPUThreadType type, u32 id); diff --git a/rpcs3/Emu/Cell/MFC.h b/rpcs3/Emu/Cell/MFC.h index 5669daabe9..a6c731d3da 100644 --- a/rpcs3/Emu/Cell/MFC.h +++ b/rpcs3/Emu/Cell/MFC.h @@ -61,5 +61,4 @@ enum struct DMAC { - u32 ls_offset; }; diff --git a/rpcs3/Emu/Cell/PPCThread.h b/rpcs3/Emu/Cell/PPCThread.h index f06cf4eaee..c7e5dab93c 100644 --- a/rpcs3/Emu/Cell/PPCThread.h +++ b/rpcs3/Emu/Cell/PPCThread.h @@ -9,7 +9,7 @@ public: virtual std::string GetThreadName() const { - return (GetFName() + fmt::Format("[0x%08llx]", PC)); + return (GetFName() + fmt::Format("[0x%08x]", PC)); } protected: diff --git a/rpcs3/Emu/Cell/PPUDisAsm.h b/rpcs3/Emu/Cell/PPUDisAsm.h index 34e51f7fb2..8a04164f2e 100644 --- a/rpcs3/Emu/Cell/PPUDisAsm.h +++ b/rpcs3/Emu/Cell/PPUDisAsm.h @@ -1037,7 +1037,7 @@ private: case 0x1: Write("HyperCall"); break; case 0x2: Write("sc"); break; case 0x22: Write("HyperCall LV1"); break; - default: Write(fmt::Format("Unknown sc: %x", sc_code)); + default: Write(fmt::Format("Unknown sc: 0x%x", sc_code)); } } void B(s32 ll, u32 aa, u32 lk) @@ -1600,7 +1600,10 @@ private: default: DisAsm_IMM_R1("mtspr", spr, rs); break; } } - /*0x1d6*///DCBI + void DCBI(u32 ra, u32 rb) + { + DisAsm_R2("dcbi", ra, rb); + } void NAND(u32 ra, u32 rs, u32 rb, bool rc) { DisAsm_R3_RC("nand", ra, rs, rb, rc); diff --git a/rpcs3/Emu/Cell/PPUInstrTable.h b/rpcs3/Emu/Cell/PPUInstrTable.h index 8962eb7376..676f32fa79 100644 --- a/rpcs3/Emu/Cell/PPUInstrTable.h +++ b/rpcs3/Emu/Cell/PPUInstrTable.h @@ -5,624 +5,656 @@ namespace PPU_instr { - //This field is used in rotate instructions to specify the first 1 bit of a 64-bit mask - static DoubleCodeField<21, 25, 26, 26, 5> mb; + namespace fields + { + //This field is used in rotate instructions to specify the first 1 bit of a 64-bit mask + static DoubleCodeField<21, 25, 26, 26, 5> mb; - //This field is used in rotate instructions to specify the last 1 bit of a 64-bit mask - static DoubleCodeField<21, 25, 26, 26, 5> me; + //This field is used in rotate instructions to specify the last 1 bit of a 64-bit mask + static DoubleCodeField<21, 25, 26, 26, 5> me; - //This field is used to specify a shift amount - static DoubleCodeField<16, 20, 30, 30, 5> sh; + //This field is used to specify a shift amount + static DoubleCodeField<16, 20, 30, 30, 5> sh; - //This field is used to specify a special-purpose register for the mtspr and mfspr instructions - static CodeField<11, 20> SPR; + //This field is used to specify a special-purpose register for the mtspr and mfspr instructions + static CodeField<11, 20> SPR; - // - static CodeField<6, 10> VS(FIELD_R_VPR); + // + static CodeField<6, 10> VS(FIELD_R_VPR); - // - static CodeField<6, 10> VD(FIELD_R_VPR); + // + static CodeField<6, 10> VD(FIELD_R_VPR); - // - static CodeField<11, 15> VA(FIELD_R_VPR); + // + static CodeField<11, 15> VA(FIELD_R_VPR); - // - static CodeField<16, 20> VB(FIELD_R_VPR); + // + static CodeField<16, 20> VB(FIELD_R_VPR); - // - static CodeField<21, 25> VC(FIELD_R_VPR); + // + static CodeField<21, 25> VC(FIELD_R_VPR); - // - static CodeField<11, 15> VUIMM; + // + static CodeField<11, 15> VUIMM; - // - static CodeFieldSigned<11, 15> VSIMM; + // + static CodeFieldSigned<11, 15> VSIMM; - // - static CodeField<22, 25> VSH; + // + static CodeField<22, 25> VSH; - //This field is used to specify a GPR to be used as a destination - static CodeField<6, 10> RD(FIELD_R_GPR); + //This field is used to specify a GPR to be used as a destination + static CodeField<6, 10> RD(FIELD_R_GPR); - //This field is used to specify a GPR to be used as a source - static CodeField<6, 10> RS(FIELD_R_GPR); + //This field is used to specify a GPR to be used as a source + static CodeField<6, 10> RS(FIELD_R_GPR); - //This field is used to specify a GPR to be used as a source or destination - static CodeField<11, 15> RA(FIELD_R_GPR); + //This field is used to specify a GPR to be used as a source or destination + static CodeField<11, 15> RA(FIELD_R_GPR); - //This field is used to specify a GPR to be used as a source - static CodeField<16, 20> RB(FIELD_R_GPR); + //This field is used to specify a GPR to be used as a source + static CodeField<16, 20> RB(FIELD_R_GPR); - //This field is used to specify the number of bytes to move in an immediate string load or store - static CodeField<16, 20> NB; + //This field is used to specify the number of bytes to move in an immediate string load or store + static CodeField<16, 20> NB; - //This field is used to specify one of the CR fields, or one of the FPSCR fields, as a destination - static CodeField<6, 8> CRFD(FIELD_R_CR); + //This field is used to specify one of the CR fields, or one of the FPSCR fields, as a destination + static CodeField<6, 8> CRFD(FIELD_R_CR); - //This field is used to specify one of the CR fields, or one of the FPSCR fields, as a source - static CodeField<11, 13> CRFS(FIELD_R_CR); + //This field is used to specify one of the CR fields, or one of the FPSCR fields, as a source + static CodeField<11, 13> CRFS(FIELD_R_CR); - //This field is used to specify a bit in the CR to be used as a source - static CodeField<11, 15> CRBA(FIELD_R_CR); + //This field is used to specify a bit in the CR to be used as a source + static CodeField<11, 15> CRBA(FIELD_R_CR); - //This field is used to specify a bit in the CR to be used as a source - static CodeField<16, 20> CRBB(FIELD_R_CR); + //This field is used to specify a bit in the CR to be used as a source + static CodeField<16, 20> CRBB(FIELD_R_CR); - //This field is used to specify a bit in the CR, or in the FPSCR, as the destination of the result of an instruction - static CodeField<6, 10> CRBD(FIELD_R_CR); + //This field is used to specify a bit in the CR, or in the FPSCR, as the destination of the result of an instruction + static CodeField<6, 10> CRBD(FIELD_R_CR); - //This field is used to specify options for the branch conditional instructions - static CodeField<6, 10> BO; + //This field is used to specify options for the branch conditional instructions + static CodeField<6, 10> BO; - //This field is used to specify a bit in the CR to be used as the condition of a branch conditional instruction - static CodeField<11, 15> BI; + //This field is used to specify a bit in the CR to be used as the condition of a branch conditional instruction + static CodeField<11, 15> BI; - //Immediate field specifying a 14-bit signed two's complement branch displacement that is concatenated on the - //right with '00' and sign-extended to 64 bits. - static CodeFieldSigned<16, 31> BD(FIELD_BRANCH); + //Immediate field specifying a 14-bit signed two's complement branch displacement that is concatenated on the + //right with '00' and sign-extended to 64 bits. + static CodeFieldSigned<16, 31> BD(FIELD_BRANCH); - // - static CodeField<19, 20> BH; + // + static CodeField<19, 20> BH; - // - static CodeField<11, 13> BFA; - - //Field used by the optional data stream variant of the dcbt instruction. - static CodeField<9, 10> TH; + // + static CodeField<11, 13> BFA; - //This field is used to specify the conditions on which to trap - static CodeField<6, 10> TO; + //Field used by the optional data stream variant of the dcbt instruction. + static CodeField<9, 10> TH; - // - static CodeField<21, 25> MB; + //This field is used to specify the conditions on which to trap + static CodeField<6, 10> TO; - // - static CodeField<26, 30> ME; + // + static CodeField<21, 25> MB; - //This field is used to specify a shift amount - static CodeField<16, 20> SH; + // + static CodeField<26, 30> ME; - /* - Absolute address bit. - 0 The immediate field represents an address relative to the current instruction address (CIA). (For more - information on the CIA, see Table 8-3.) The effective (logical) address of the branch is either the sum - of the LI field sign-extended to 64 bits and the address of the branch instruction or the sum of the BD - field sign-extended to 64 bits and the address of the branch instruction. - 1 The immediate field represents an absolute address. The effective address (EA) of the branch is the - LI field sign-extended to 64 bits or the BD field sign-extended to 64 bits. - */ - static CodeField<30> AA; + //This field is used to specify a shift amount + static CodeField<16, 20> SH; - static CodeFieldSignedOffset<6, 29, 2> LI(FIELD_BRANCH); - - // - static CodeFieldSignedOffset<6, 29, 2> LL(FIELD_BRANCH); - /* - Link bit. - 0 Does not update the link register (LR). - 1 Updates the LR. If the instruction is a branch instruction, the address of the instruction following the - branch instruction is placed into the LR. - */ - static CodeField<31> LK; - - //This field is used for extended arithmetic to enable setting OV and SO in the XER - static CodeField<21> OE; - - //Field used to specify whether an integer compare instruction is to compare 64-bit numbers or 32-bit numbers - static CodeField<10> L_10; - static CodeField<6> L_6; - static CodeField<9, 10> L_9_10; - static CodeField<11> L_11; - // - static CodeField<16, 19> I; - - // - static CodeField<16, 27> DQ; - - //This field is used to specify an FPR as the destination - static CodeField<6, 10> FRD; - - //This field is used to specify an FPR as a source - static CodeField<6, 10> FRS; - - // - static CodeField<7, 14> FM; - - //This field is used to specify an FPR as a source - static CodeField<11, 15> FRA(FIELD_R_FPR); - - //This field is used to specify an FPR as a source - static CodeField<16, 20> FRB(FIELD_R_FPR); - - //This field is used to specify an FPR as a source - static CodeField<21, 25> FRC(FIELD_R_FPR); - - //This field mask is used to identify the CR fields that are to be updated by the mtcrf instruction. - static CodeField<12, 19> CRM; - - // - static CodeField<6, 31> SYS; - - //Immediate field specifying a 16-bit signed two's complement integer that is sign-extended to 64 bits - static CodeFieldSigned<16, 31> D; - - // - static CodeFieldSignedOffset<16, 29, 2> DS; - - //This immediate field is used to specify a 16-bit signed integer - static CodeFieldSigned<16, 31> simm16; - - //This immediate field is used to specify a 16-bit unsigned integer - static CodeField<16, 31> uimm16; - - /* - Record bit. - 0 Does not update the condition register (CR). - 1 Updates the CR to reflect the result of the operation. - For integer instructions, CR bits [0-2] are set to reflect the result as a signed quantity and CR bit [3] - receives a copy of the summary overflow bit, XER[SO]. The result as an unsigned quantity or a bit - string can be deduced from the EQ bit. For floating-point instructions, CR bits [4-7] are set to reflect - floating-point exception, floating-point enabled exception, floating-point invalid operation exception, - and floating-point overflow exception. - */ - static CodeField<31> RC; - - //Primary opcode field - static CodeField<0, 5> OPCD; - - static CodeField<26, 31> GD_04; //0x3f - static CodeField<21, 31> GD_04_0;//0x7ff - static CodeField<21, 30> GD_13; //0x3ff - static CodeField<27, 29> GD_1e; //0x7 - static CodeField<21, 30> GD_1f; //0x3ff - static CodeField<30, 31> GD_3a; //0x3 - static CodeField<26, 30> GD_3b; //0x1f - static CodeField<30, 31> GD_3e; //0x3 - static CodeField<26, 30> GD_3f;//0x1f - static CodeField<21, 30> GD_3f_0; //0x3ff - - static CodeField<9, 10> STRM; - - //static auto main_list = new_list(OPCD, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, OPCD)); - static InstrList<1 << CodeField<0, 5>::size, ::PPUOpcodes> main_list_obj(OPCD, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, OPCD)); - static auto main_list = &main_list_obj; - static auto g04_list = new_list(main_list, PPU_opcodes::G_04, GD_04); - static auto g04_0_list = new_list(g04_list, GD_04_0, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_04_0)); - static auto g13_list = new_list(main_list, PPU_opcodes::G_13, GD_13, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_13)); - static auto g1e_list = new_list(main_list, PPU_opcodes::G_1e, GD_1e, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_1e)); - static auto g1f_list = new_list(main_list, PPU_opcodes::G_1f, GD_1f, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_1f)); - static auto g3a_list = new_list(main_list, PPU_opcodes::G_3a, GD_3a, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3a)); - static auto g3b_list = new_list(main_list, PPU_opcodes::G_3b, GD_3b, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3b)); - static auto g3e_list = new_list(main_list, PPU_opcodes::G_3e, GD_3e, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3e)); - static auto g3f_list = new_list(main_list, PPU_opcodes::G_3f, GD_3f); - static auto g3f_0_list = new_list(g3f_list, GD_3f_0, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3f_0)); - - #define bind_instr(list, name, ...) \ - static const auto& name = make_instr(list, #name, &PPUOpcodes::name, ##__VA_ARGS__) - - bind_instr(main_list, TDI, TO, RA, simm16); - bind_instr(main_list, TWI, TO, RA, simm16); - bind_instr(main_list, MULLI, RD, RA, simm16); - bind_instr(main_list, SUBFIC, RD, RA, simm16); - bind_instr(main_list, CMPLI, CRFD, L_10, RA, uimm16); - bind_instr(main_list, CMPI, CRFD, L_10, RA, simm16); - bind_instr(main_list, ADDIC, RD, RA, simm16); - bind_instr(main_list, ADDIC_, RD, RA, simm16); - bind_instr(main_list, ADDI, RD, RA, simm16); - bind_instr(main_list, ADDIS, RD, RA, simm16); - bind_instr(main_list, BC, BO, BI, BD, AA, LK); - bind_instr(main_list, SC, SYS); - bind_instr(main_list, B, LI, AA, LK); - bind_instr(main_list, RLWIMI, RA, RS, SH, MB, ME, RC); - bind_instr(main_list, RLWINM, RA, RS, SH, MB, ME, RC); - bind_instr(main_list, RLWNM, RA, RS, RB, MB, ME, RC); - bind_instr(main_list, ORI, RA, RS, uimm16); - bind_instr(main_list, ORIS, RA, RS, uimm16); - bind_instr(main_list, XORI, RA, RS, uimm16); - bind_instr(main_list, XORIS, RA, RS, uimm16); - bind_instr(main_list, ANDI_, RA, RS, uimm16); - bind_instr(main_list, ANDIS_, RA, RS, uimm16); - bind_instr(main_list, LWZ, RD, RA, D); - bind_instr(main_list, LWZU, RD, RA, D); - bind_instr(main_list, LBZ, RD, RA, D); - bind_instr(main_list, LBZU, RD, RA, D); - bind_instr(main_list, STW, RS, RA, D); - bind_instr(main_list, STWU, RS, RA, D); - bind_instr(main_list, STB, RS, RA, D); - bind_instr(main_list, STBU, RS, RA, D); - bind_instr(main_list, LHZ, RD, RA, D); - bind_instr(main_list, LHZU, RD, RA, D); - bind_instr(main_list, LHA, RD, RA, D); - bind_instr(main_list, LHAU, RD, RA, D); - bind_instr(main_list, STH, RS, RA, D); - bind_instr(main_list, STHU, RS, RA, D); - bind_instr(main_list, LMW, RD, RA, D); - bind_instr(main_list, STMW, RS, RA, D); - bind_instr(main_list, LFS, FRD, RA, D); - bind_instr(main_list, LFSU, FRD, RA, D); - bind_instr(main_list, LFD, FRD, RA, D); - bind_instr(main_list, LFDU, FRD, RA, D); - bind_instr(main_list, STFS, FRS, RA, D); - bind_instr(main_list, STFSU, FRS, RA, D); - bind_instr(main_list, STFD, FRS, RA, D); - bind_instr(main_list, STFDU, FRS, RA, D); - - bind_instr(g04_list, VMADDFP, VD, VA, VC, VB); - bind_instr(g04_list, VMHADDSHS, VD, VA, VB, VC); - bind_instr(g04_list, VMHRADDSHS, VD, VA, VB, VC); - bind_instr(g04_list, VMLADDUHM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMMBM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMSHM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMSHS, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMUBM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMUHM, VD, VA, VB, VC); - bind_instr(g04_list, VMSUMUHS, VD, VA, VB, VC); - bind_instr(g04_list, VNMSUBFP, VD, VA, VC, VB); - bind_instr(g04_list, VPERM, VD, VA, VB, VC); - bind_instr(g04_list, VSEL, VD, VA, VB, VC); - bind_instr(g04_list, VSLDOI, VD, VA, VB, VSH); - - bind_instr(g04_0_list, MFVSCR, VD); - bind_instr(g04_0_list, MTVSCR, VB); - bind_instr(g04_0_list, VADDCUW, VD, VA, VB); - bind_instr(g04_0_list, VADDFP, VD, VA, VB); - bind_instr(g04_0_list, VADDSBS, VD, VA, VB); - bind_instr(g04_0_list, VADDSHS, VD, VA, VB); - bind_instr(g04_0_list, VADDSWS, VD, VA, VB); - bind_instr(g04_0_list, VADDUBM, VD, VA, VB); - bind_instr(g04_0_list, VADDUBS, VD, VA, VB); - bind_instr(g04_0_list, VADDUHM, VD, VA, VB); - bind_instr(g04_0_list, VADDUHS, VD, VA, VB); - bind_instr(g04_0_list, VADDUWM, VD, VA, VB); - bind_instr(g04_0_list, VADDUWS, VD, VA, VB); - bind_instr(g04_0_list, VAND, VD, VA, VB); - bind_instr(g04_0_list, VANDC, VD, VA, VB); - bind_instr(g04_0_list, VAVGSB, VD, VA, VB); - bind_instr(g04_0_list, VAVGSH, VD, VA, VB); - bind_instr(g04_0_list, VAVGSW, VD, VA, VB); - bind_instr(g04_0_list, VAVGUB, VD, VA, VB); - bind_instr(g04_0_list, VAVGUH, VD, VA, VB); - bind_instr(g04_0_list, VAVGUW, VD, VA, VB); - bind_instr(g04_0_list, VCFSX, VD, VUIMM, VB); - bind_instr(g04_0_list, VCFUX, VD, VUIMM, VB); - bind_instr(g04_0_list, VCMPBFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPBFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUB, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUB_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUH, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUH_, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUW, VD, VA, VB); - bind_instr(g04_0_list, VCMPEQUW_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGEFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPGEFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTFP, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTFP_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSB, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSB_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSH, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSH_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSW, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTSW_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUB, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUB_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUH, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUH_, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUW, VD, VA, VB); - bind_instr(g04_0_list, VCMPGTUW_, VD, VA, VB); - bind_instr(g04_0_list, VCTSXS, VD, VUIMM, VB); - bind_instr(g04_0_list, VCTUXS, VD, VUIMM, VB); - bind_instr(g04_0_list, VEXPTEFP, VD, VB); - bind_instr(g04_0_list, VLOGEFP, VD, VB); - bind_instr(g04_0_list, VMAXFP, VD, VA, VB); - bind_instr(g04_0_list, VMAXSB, VD, VA, VB); - bind_instr(g04_0_list, VMAXSH, VD, VA, VB); - bind_instr(g04_0_list, VMAXSW, VD, VA, VB); - bind_instr(g04_0_list, VMAXUB, VD, VA, VB); - bind_instr(g04_0_list, VMAXUH, VD, VA, VB); - bind_instr(g04_0_list, VMAXUW, VD, VA, VB); - bind_instr(g04_0_list, VMINFP, VD, VA, VB); - bind_instr(g04_0_list, VMINSB, VD, VA, VB); - bind_instr(g04_0_list, VMINSH, VD, VA, VB); - bind_instr(g04_0_list, VMINSW, VD, VA, VB); - bind_instr(g04_0_list, VMINUB, VD, VA, VB); - bind_instr(g04_0_list, VMINUH, VD, VA, VB); - bind_instr(g04_0_list, VMINUW, VD, VA, VB); - bind_instr(g04_0_list, VMRGHB, VD, VA, VB); - bind_instr(g04_0_list, VMRGHH, VD, VA, VB); - bind_instr(g04_0_list, VMRGHW, VD, VA, VB); - bind_instr(g04_0_list, VMRGLB, VD, VA, VB); - bind_instr(g04_0_list, VMRGLH, VD, VA, VB); - bind_instr(g04_0_list, VMRGLW, VD, VA, VB); - bind_instr(g04_0_list, VMULESB, VD, VA, VB); - bind_instr(g04_0_list, VMULESH, VD, VA, VB); - bind_instr(g04_0_list, VMULEUB, VD, VA, VB); - bind_instr(g04_0_list, VMULEUH, VD, VA, VB); - bind_instr(g04_0_list, VMULOSB, VD, VA, VB); - bind_instr(g04_0_list, VMULOSH, VD, VA, VB); - bind_instr(g04_0_list, VMULOUB, VD, VA, VB); - bind_instr(g04_0_list, VMULOUH, VD, VA, VB); - bind_instr(g04_0_list, VNOR, VD, VA, VB); - bind_instr(g04_0_list, VOR, VD, VA, VB); - bind_instr(g04_0_list, VPKPX, VD, VA, VB); - bind_instr(g04_0_list, VPKSHSS, VD, VA, VB); - bind_instr(g04_0_list, VPKSHUS, VD, VA, VB); - bind_instr(g04_0_list, VPKSWSS, VD, VA, VB); - bind_instr(g04_0_list, VPKSWUS, VD, VA, VB); - bind_instr(g04_0_list, VPKUHUM, VD, VA, VB); - bind_instr(g04_0_list, VPKUHUS, VD, VA, VB); - bind_instr(g04_0_list, VPKUWUM, VD, VA, VB); - bind_instr(g04_0_list, VPKUWUS, VD, VA, VB); - bind_instr(g04_0_list, VREFP, VD, VB); - bind_instr(g04_0_list, VRFIM, VD, VB); - bind_instr(g04_0_list, VRFIN, VD, VB); - bind_instr(g04_0_list, VRFIP, VD, VB); - bind_instr(g04_0_list, VRFIZ, VD, VB); - bind_instr(g04_0_list, VRLB, VD, VA, VB); - bind_instr(g04_0_list, VRLH, VD, VA, VB); - bind_instr(g04_0_list, VRLW, VD, VA, VB); - bind_instr(g04_0_list, VRSQRTEFP, VD, VB); - bind_instr(g04_0_list, VSL, VD, VA, VB); - bind_instr(g04_0_list, VSLB, VD, VA, VB); - bind_instr(g04_0_list, VSLH, VD, VA, VB); - bind_instr(g04_0_list, VSLO, VD, VA, VB); - bind_instr(g04_0_list, VSLW, VD, VA, VB); - bind_instr(g04_0_list, VSPLTB, VD, VUIMM, VB); - bind_instr(g04_0_list, VSPLTH, VD, VUIMM, VB); - bind_instr(g04_0_list, VSPLTISB, VD, VSIMM); - bind_instr(g04_0_list, VSPLTISH, VD, VSIMM); - bind_instr(g04_0_list, VSPLTISW, VD, VSIMM); - bind_instr(g04_0_list, VSPLTW, VD, VUIMM, VB); - bind_instr(g04_0_list, VSR, VD, VA, VB); - bind_instr(g04_0_list, VSRAB, VD, VA, VB); - bind_instr(g04_0_list, VSRAH, VD, VA, VB); - bind_instr(g04_0_list, VSRAW, VD, VA, VB); - bind_instr(g04_0_list, VSRB, VD, VA, VB); - bind_instr(g04_0_list, VSRH, VD, VA, VB); - bind_instr(g04_0_list, VSRO, VD, VA, VB); - bind_instr(g04_0_list, VSRW, VD, VA, VB); - bind_instr(g04_0_list, VSUBCUW, VD, VA, VB); - bind_instr(g04_0_list, VSUBFP, VD, VA, VB); - bind_instr(g04_0_list, VSUBSBS, VD, VA, VB); - bind_instr(g04_0_list, VSUBSHS, VD, VA, VB); - bind_instr(g04_0_list, VSUBSWS, VD, VA, VB); - bind_instr(g04_0_list, VSUBUBM, VD, VA, VB); - bind_instr(g04_0_list, VSUBUBS, VD, VA, VB); - bind_instr(g04_0_list, VSUBUHM, VD, VA, VB); - bind_instr(g04_0_list, VSUBUHS, VD, VA, VB); - bind_instr(g04_0_list, VSUBUWM, VD, VA, VB); - bind_instr(g04_0_list, VSUBUWS, VD, VA, VB); - bind_instr(g04_0_list, VSUMSWS, VD, VA, VB); - bind_instr(g04_0_list, VSUM2SWS, VD, VA, VB); - bind_instr(g04_0_list, VSUM4SBS, VD, VA, VB); - bind_instr(g04_0_list, VSUM4SHS, VD, VA, VB); - bind_instr(g04_0_list, VSUM4UBS, VD, VA, VB); - bind_instr(g04_0_list, VUPKHPX, VD, VB); - bind_instr(g04_0_list, VUPKHSB, VD, VB); - bind_instr(g04_0_list, VUPKHSH, VD, VB); - bind_instr(g04_0_list, VUPKLPX, VD, VB); - bind_instr(g04_0_list, VUPKLSB, VD, VB); - bind_instr(g04_0_list, VUPKLSH, VD, VB); - bind_instr(g04_0_list, VXOR, VD, VA, VB); - - bind_instr(g13_list, MCRF, CRFD, CRFS); - bind_instr(g13_list, BCLR, BO, BI, BH, LK); - bind_instr(g13_list, CRNOR, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRANDC, CRBD, CRBA, CRBB); - bind_instr(g13_list, ISYNC); - bind_instr(g13_list, CRXOR, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRNAND, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRAND, CRBD, CRBA, CRBB); - bind_instr(g13_list, CREQV, CRBD, CRBA, CRBB); - bind_instr(g13_list, CRORC, CRBD, CRBA, CRBB); - bind_instr(g13_list, CROR, CRBD, CRBA, CRBB); - bind_instr(g13_list, BCCTR, BO, BI, BH, LK); - - bind_instr(g1e_list, RLDICL, RA, RS, sh, mb, RC); - bind_instr(g1e_list, RLDICR, RA, RS, sh, me, RC); - bind_instr(g1e_list, RLDIC, RA, RS, sh, mb, RC); - bind_instr(g1e_list, RLDIMI, RA, RS, sh, mb, RC); - bind_instr(g1e_list, RLDC_LR, RA, RS, RB, mb, AA, RC); - - /*0x000*/bind_instr(g1f_list, CMP, CRFD, L_10, RA, RB); - /*0x004*/bind_instr(g1f_list, TW, TO, RA, RB); - /*0x006*/bind_instr(g1f_list, LVSL, VD, RA, RB); - /*0x007*/bind_instr(g1f_list, LVEBX, VD, RA, RB); - /*0x008*/bind_instr(g1f_list, SUBFC, RD, RA, RB, OE, RC); - /*0x009*/bind_instr(g1f_list, MULHDU, RD, RA, RB, RC); - /*0x00a*/bind_instr(g1f_list, ADDC, RD, RA, RB, OE, RC); - /*0x00b*/bind_instr(g1f_list, MULHWU, RD, RA, RB, RC); - /*0x013*/bind_instr(g1f_list, MFOCRF, L_11, RD, CRM); - /*0x014*/bind_instr(g1f_list, LWARX, RD, RA, RB); - /*0x015*/bind_instr(g1f_list, LDX, RD, RA, RB); - /*0x017*/bind_instr(g1f_list, LWZX, RD, RA, RB); - /*0x018*/bind_instr(g1f_list, SLW, RA, RS, RB, RC); - /*0x01a*/bind_instr(g1f_list, CNTLZW, RA, RS, RC); - /*0x01b*/bind_instr(g1f_list, SLD, RA, RS, RB, RC); - /*0x01c*/bind_instr(g1f_list, AND, RA, RS, RB, RC); - /*0x020*/bind_instr(g1f_list, CMPL, CRFD, L_10, RA, RB); - /*0x026*/bind_instr(g1f_list, LVSR, VD, RA, RB); - /*0x027*/bind_instr(g1f_list, LVEHX, VD, RA, RB); - /*0x028*/bind_instr(g1f_list, SUBF, RD, RA, RB, OE, RC); - /*0x035*/bind_instr(g1f_list, LDUX, RD, RA, RB); - /*0x036*/bind_instr(g1f_list, DCBST, RA, RB); - /*0x037*/bind_instr(g1f_list, LWZUX, RD, RA, RB); - /*0x03a*/bind_instr(g1f_list, CNTLZD, RA, RS, RC); - /*0x03c*/bind_instr(g1f_list, ANDC, RA, RS, RB, RC); - /*0x03c*/bind_instr(g1f_list, TD, TO, RA, RB); - /*0x047*/bind_instr(g1f_list, LVEWX, VD, RA, RB); - /*0x049*/bind_instr(g1f_list, MULHD, RD, RA, RB, RC); - /*0x04b*/bind_instr(g1f_list, MULHW, RD, RA, RB, RC); - /*0x054*/bind_instr(g1f_list, LDARX, RD, RA, RB); - /*0x056*/bind_instr(g1f_list, DCBF, RA, RB); - /*0x057*/bind_instr(g1f_list, LBZX, RD, RA, RB); - /*0x067*/bind_instr(g1f_list, LVX, VD, RA, RB); - /*0x068*/bind_instr(g1f_list, NEG, RD, RA, OE, RC); - /*0x077*/bind_instr(g1f_list, LBZUX, RD, RA, RB); - /*0x07c*/bind_instr(g1f_list, NOR, RA, RS, RB, RC); - /*0x087*/bind_instr(g1f_list, STVEBX, VS, RA, RB); - /*0x088*/bind_instr(g1f_list, SUBFE, RD, RA, RB, OE, RC); - /*0x08a*/bind_instr(g1f_list, ADDE, RD, RA, RB, OE, RC); - /*0x090*/bind_instr(g1f_list, MTOCRF, L_11, CRM, RS); - /*0x095*/bind_instr(g1f_list, STDX, RS, RA, RB); - /*0x096*/bind_instr(g1f_list, STWCX_, RS, RA, RB); - /*0x097*/bind_instr(g1f_list, STWX, RS, RA, RB); - /*0x0a7*/bind_instr(g1f_list, STVEHX, VS, RA, RB); - /*0x0b5*/bind_instr(g1f_list, STDUX, RS, RA, RB); - /*0x0b7*/bind_instr(g1f_list, STWUX, RS, RA, RB); - /*0x0c7*/bind_instr(g1f_list, STVEWX, VS, RA, RB); - /*0x0c8*/bind_instr(g1f_list, SUBFZE, RD, RA, OE, RC); - /*0x0ca*/bind_instr(g1f_list, ADDZE, RD, RA, OE, RC); - /*0x0d6*/bind_instr(g1f_list, STDCX_, RS, RA, RB); - /*0x0d7*/bind_instr(g1f_list, STBX, RS, RA, RB); - /*0x0e7*/bind_instr(g1f_list, STVX, VS, RA, RB); - /*0x0e8*/bind_instr(g1f_list, SUBFME, RD, RA, OE, RC); - /*0x0e9*/bind_instr(g1f_list, MULLD, RD, RA, RB, OE, RC); - /*0x0ea*/bind_instr(g1f_list, ADDME, RD, RA, OE, RC); - /*0x0eb*/bind_instr(g1f_list, MULLW, RD, RA, RB, OE, RC); - /*0x0f6*/bind_instr(g1f_list, DCBTST, RA, RB, TH); - /*0x0f7*/bind_instr(g1f_list, STBUX, RS, RA, RB); - /*0x10a*/bind_instr(g1f_list, ADD, RD, RA, RB, OE, RC); - /*0x116*/bind_instr(g1f_list, DCBT, RA, RB, TH); - /*0x117*/bind_instr(g1f_list, LHZX, RD, RA, RB); - /*0x11c*/bind_instr(g1f_list, EQV, RA, RS, RB, RC); - /*0x136*/bind_instr(g1f_list, ECIWX, RD, RA, RB); - /*0x137*/bind_instr(g1f_list, LHZUX, RD, RA, RB); - /*0x13c*/bind_instr(g1f_list, XOR, RA, RS, RB, RC); - /*0x153*/bind_instr(g1f_list, MFSPR, RD, SPR); - /*0x155*/bind_instr(g1f_list, LWAX, RD, RA, RB); - /*0x156*/bind_instr(g1f_list, DST, RA, RB, STRM, L_6); - /*0x157*/bind_instr(g1f_list, LHAX, RD, RA, RB); - /*0x167*/bind_instr(g1f_list, LVXL, VD, RA, RB); - /*0x173*/bind_instr(g1f_list, MFTB, RD, SPR); - /*0x175*/bind_instr(g1f_list, LWAUX, RD, RA, RB); - /*0x176*/bind_instr(g1f_list, DSTST, RA, RB, STRM, L_6); - /*0x177*/bind_instr(g1f_list, LHAUX, RD, RA, RB); - /*0x197*/bind_instr(g1f_list, STHX, RS, RA, RB); - /*0x19c*/bind_instr(g1f_list, ORC, RA, RS, RB, RC); - /*0x1b6*/bind_instr(g1f_list, ECOWX, RS, RA, RB); - /*0x1b7*/bind_instr(g1f_list, STHUX, RS, RA, RB); - /*0x1bc*/bind_instr(g1f_list, OR, RA, RS, RB, RC); - /*0x1c9*/bind_instr(g1f_list, DIVDU, RD, RA, RB, OE, RC); - /*0x1cb*/bind_instr(g1f_list, DIVWU, RD, RA, RB, OE, RC); - /*0x1d3*/bind_instr(g1f_list, MTSPR, SPR, RS); - /*0x1d6*///DCBI - /*0x1dc*/bind_instr(g1f_list, NAND, RA, RS, RB, RC); - /*0x1e7*/bind_instr(g1f_list, STVXL, VS, RA, RB); - /*0x1e9*/bind_instr(g1f_list, DIVD, RD, RA, RB, OE, RC); - /*0x1eb*/bind_instr(g1f_list, DIVW, RD, RA, RB, OE, RC); - /*0x207*/bind_instr(g1f_list, LVLX, VD, RA, RB); - /*0x214*/bind_instr(g1f_list, LDBRX, RD, RA, RB); - /*0x215*/bind_instr(g1f_list, LSWX, RD, RA, RB); - /*0x216*/bind_instr(g1f_list, LWBRX, RD, RA, RB); - /*0x217*/bind_instr(g1f_list, LFSX, FRD, RA, RB); - /*0x218*/bind_instr(g1f_list, SRW, RA, RS, RB, RC); - /*0x21b*/bind_instr(g1f_list, SRD, RA, RS, RB, RC); - /*0x227*/bind_instr(g1f_list, LVRX, VD, RA, RB); - /*0x237*/bind_instr(g1f_list, LFSUX, FRD, RA, RB); - /*0x255*/bind_instr(g1f_list, LSWI, RD, RA, NB); - /*0x256*/bind_instr(g1f_list, SYNC, L_9_10); - /*0x257*/bind_instr(g1f_list, LFDX, FRD, RA, RB); - /*0x277*/bind_instr(g1f_list, LFDUX, FRD, RA, RB); - /*0x287*/bind_instr(g1f_list, STVLX, VS, RA, RB); - /*0x296*/bind_instr(g1f_list, STSWX, RS, RA, RB); - /*0x296*/bind_instr(g1f_list, STWBRX, RS, RA, RB); - /*0x297*/bind_instr(g1f_list, STFSX, FRS, RA, RB); - /*0x2a7*/bind_instr(g1f_list, STVRX, VS, RA, RB); - /*0x2b7*/bind_instr(g1f_list, STFSUX, FRS, RA, RB); - /*0x2d5*/bind_instr(g1f_list, STSWI, RS, RA, NB); - /*0x2d7*/bind_instr(g1f_list, STFDX, FRS, RA, RB); - /*0x2d7*/bind_instr(g1f_list, STFDUX, FRS, RA, RB); - /*0x307*/bind_instr(g1f_list, LVLXL, VD, RA, RB); - /*0x316*/bind_instr(g1f_list, LHBRX, RD, RA, RB); - /*0x318*/bind_instr(g1f_list, SRAW, RA, RS, RB, RC); - /*0x31a*/bind_instr(g1f_list, SRAD, RA, RS, RB, RC); - /*0x327*/bind_instr(g1f_list, LVRXL, VD, RA, RB); - /*0x336*/bind_instr(g1f_list, DSS, STRM, L_6); - /*0x338*/bind_instr(g1f_list, SRAWI, RA, RS, SH, RC); - /*0x33a*/bind_instr(g1f_list, SRADI1, RA, RS, sh, RC); - /*0x33b*/bind_instr(g1f_list, SRADI2, RA, RS, sh, RC); - /*0x356*/bind_instr(g1f_list, EIEIO); - /*0x387*/bind_instr(g1f_list, STVLXL, VS, RA, RB); - /*0x396*/bind_instr(g1f_list, STHBRX, RS, RA, RB); - /*0x39a*/bind_instr(g1f_list, EXTSH, RA, RS, RC); - /*0x387*/bind_instr(g1f_list, STVRXL, VS, RA, RB); - /*0x3ba*/bind_instr(g1f_list, EXTSB, RA, RS, RC); - /*0x3d7*/bind_instr(g1f_list, STFIWX, FRS, RA, RB); - /*0x3da*/bind_instr(g1f_list, EXTSW, RA, RS, RC); - /*0x3d6*/bind_instr(g1f_list, ICBI, RA, RB); - /*0x3f6*/bind_instr(g1f_list, DCBZ, RA, RB); - - bind_instr(g3a_list, LD, RD, RA, DS); - bind_instr(g3a_list, LDU, RD, RA, DS); - bind_instr(g3a_list, LWA, RD, RA, DS); - - bind_instr(g3b_list, FDIVS, FRD, FRA, FRB, RC); - bind_instr(g3b_list, FSUBS, FRD, FRA, FRB, RC); - bind_instr(g3b_list, FADDS, FRD, FRA, FRB, RC); - bind_instr(g3b_list, FSQRTS, FRD, FRB, RC); - bind_instr(g3b_list, FRES, FRD, FRB, RC); - bind_instr(g3b_list, FMULS, FRD, FRA, FRC, RC); - bind_instr(g3b_list, FMADDS, FRD, FRA, FRC, FRB, RC); - bind_instr(g3b_list, FMSUBS, FRD, FRA, FRC, FRB, RC); - bind_instr(g3b_list, FNMSUBS, FRD, FRA, FRC, FRB, RC); - bind_instr(g3b_list, FNMADDS, FRD, FRA, FRC, FRB, RC); - - bind_instr(g3e_list, STD, RS, RA, DS); - bind_instr(g3e_list, STDU, RS, RA, DS); - - bind_instr(g3f_list, FSEL, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FMUL, FRD, FRA, FRC, RC); - bind_instr(g3f_list, FMSUB, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FMADD, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FNMSUB, FRD, FRA, FRC, FRB, RC); - bind_instr(g3f_list, FNMADD, FRD, FRA, FRC, FRB, RC); - - bind_instr(g3f_0_list, FDIV, FRD, FRA, FRB, RC); - bind_instr(g3f_0_list, FSUB, FRD, FRA, FRB, RC); - bind_instr(g3f_0_list, FADD, FRD, FRA, FRB, RC); - bind_instr(g3f_0_list, FSQRT, FRD, FRB, RC); - bind_instr(g3f_0_list, FRSQRTE, FRD, FRB, RC); - bind_instr(g3f_0_list, FCMPU, CRFD, FRA, FRB); - bind_instr(g3f_0_list, FRSP, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTIW, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTIWZ, FRD, FRB, RC); - bind_instr(g3f_0_list, FCMPO, CRFD, FRA, FRB); - bind_instr(g3f_0_list, FNEG, FRD, FRB, RC); - bind_instr(g3f_0_list, FMR, FRD, FRB, RC); - bind_instr(g3f_0_list, FNABS, FRD, FRB, RC); - bind_instr(g3f_0_list, FABS, FRD, FRB, RC); - bind_instr(g3f_0_list, FCFID, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTID, FRD, FRB, RC); - bind_instr(g3f_0_list, FCTIDZ, FRD, FRB, RC); - - bind_instr(g3f_0_list, MTFSB1, CRBD, RC); - bind_instr(g3f_0_list, MCRFS, CRFD, CRFS); - bind_instr(g3f_0_list, MTFSB0, CRBD, RC); - bind_instr(g3f_0_list, MTFSFI, CRFD, I, RC); - bind_instr(g3f_0_list, MFFS, FRD, RC); - bind_instr(g3f_0_list, MTFSF, FM, FRB, RC); + /* + Absolute address bit. + 0 The immediate field represents an address relative to the current instruction address (CIA). (For more + information on the CIA, see Table 8-3.) The effective (logical) address of the branch is either the sum + of the LI field sign-extended to 64 bits and the address of the branch instruction or the sum of the BD + field sign-extended to 64 bits and the address of the branch instruction. + 1 The immediate field represents an absolute address. The effective address (EA) of the branch is the + LI field sign-extended to 64 bits or the BD field sign-extended to 64 bits. + */ + static CodeField<30> AA; + static CodeFieldSignedOffset<6, 29, 2> LI(FIELD_BRANCH); + + // + static CodeFieldSignedOffset<6, 29, 2> LL(FIELD_BRANCH); + /* + Link bit. + 0 Does not update the link register (LR). + 1 Updates the LR. If the instruction is a branch instruction, the address of the instruction following the + branch instruction is placed into the LR. + */ + static CodeField<31> LK; + + //This field is used for extended arithmetic to enable setting OV and SO in the XER + static CodeField<21> OE; + + //Field used to specify whether an integer compare instruction is to compare 64-bit numbers or 32-bit numbers + static CodeField<10> L_10; + static CodeField<6> L_6; + static CodeField<9, 10> L_9_10; + static CodeField<11> L_11; + // + static CodeField<16, 19> I; + + // + static CodeField<16, 27> DQ; + + //This field is used to specify an FPR as the destination + static CodeField<6, 10> FRD; + + //This field is used to specify an FPR as a source + static CodeField<6, 10> FRS; + + // + static CodeField<7, 14> FM; + + //This field is used to specify an FPR as a source + static CodeField<11, 15> FRA(FIELD_R_FPR); + + //This field is used to specify an FPR as a source + static CodeField<16, 20> FRB(FIELD_R_FPR); + + //This field is used to specify an FPR as a source + static CodeField<21, 25> FRC(FIELD_R_FPR); + + //This field mask is used to identify the CR fields that are to be updated by the mtcrf instruction. + static CodeField<12, 19> CRM; + + // + static CodeField<6, 31> SYS; + + //Immediate field specifying a 16-bit signed two's complement integer that is sign-extended to 64 bits + static CodeFieldSigned<16, 31> D; + + // + static CodeFieldSignedOffset<16, 29, 2> DS; + + //This immediate field is used to specify a 16-bit signed integer + static CodeFieldSigned<16, 31> simm16; + + //This immediate field is used to specify a 16-bit unsigned integer + static CodeField<16, 31> uimm16; + + /* + Record bit. + 0 Does not update the condition register (CR). + 1 Updates the CR to reflect the result of the operation. + For integer instructions, CR bits [0-2] are set to reflect the result as a signed quantity and CR bit [3] + receives a copy of the summary overflow bit, XER[SO]. The result as an unsigned quantity or a bit + string can be deduced from the EQ bit. For floating-point instructions, CR bits [4-7] are set to reflect + floating-point exception, floating-point enabled exception, floating-point invalid operation exception, + and floating-point overflow exception. + */ + static CodeField<31> RC; + + //Primary opcode field + static CodeField<0, 5> OPCD; + + static CodeField<26, 31> GD_04; //0x3f + static CodeField<21, 31> GD_04_0;//0x7ff + static CodeField<21, 30> GD_13; //0x3ff + static CodeField<27, 29> GD_1e; //0x7 + static CodeField<21, 30> GD_1f; //0x3ff + static CodeField<30, 31> GD_3a; //0x3 + static CodeField<26, 30> GD_3b; //0x1f + static CodeField<30, 31> GD_3e; //0x3 + static CodeField<26, 30> GD_3f;//0x1f + static CodeField<21, 30> GD_3f_0; //0x3ff + + static CodeField<9, 10> STRM; + } + + namespace lists + { + using namespace fields; + + //static auto main_list = new_list(OPCD, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, OPCD)); + static InstrList<1 << CodeField<0, 5>::size, ::PPUOpcodes> main_list_obj(OPCD, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, OPCD)); + static auto main_list = &main_list_obj; + static auto g04_list = new_list(main_list, PPU_opcodes::G_04, GD_04); + static auto g04_0_list = new_list(g04_list, GD_04_0, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_04_0)); + static auto g13_list = new_list(main_list, PPU_opcodes::G_13, GD_13, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_13)); + static auto g1e_list = new_list(main_list, PPU_opcodes::G_1e, GD_1e, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_1e)); + static auto g1f_list = new_list(main_list, PPU_opcodes::G_1f, GD_1f, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_1f)); + static auto g3a_list = new_list(main_list, PPU_opcodes::G_3a, GD_3a, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3a)); + static auto g3b_list = new_list(main_list, PPU_opcodes::G_3b, GD_3b, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3b)); + static auto g3e_list = new_list(main_list, PPU_opcodes::G_3e, GD_3e, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3e)); + static auto g3f_list = new_list(main_list, PPU_opcodes::G_3f, GD_3f); + static auto g3f_0_list = new_list(g3f_list, GD_3f_0, instr_bind(&PPUOpcodes::UNK, GetCode, OPCD, GD_3f_0)); + +#define bind_instr(list, name, ...) \ + static const auto& name = make_instr(list, #name, &PPUOpcodes::name, ##__VA_ARGS__) + + bind_instr(main_list, TDI, TO, RA, simm16); + bind_instr(main_list, TWI, TO, RA, simm16); + bind_instr(main_list, MULLI, RD, RA, simm16); + bind_instr(main_list, SUBFIC, RD, RA, simm16); + bind_instr(main_list, CMPLI, CRFD, L_10, RA, uimm16); + bind_instr(main_list, CMPI, CRFD, L_10, RA, simm16); + bind_instr(main_list, ADDIC, RD, RA, simm16); + bind_instr(main_list, ADDIC_, RD, RA, simm16); + bind_instr(main_list, ADDI, RD, RA, simm16); + bind_instr(main_list, ADDIS, RD, RA, simm16); + bind_instr(main_list, BC, BO, BI, BD, AA, LK); + bind_instr(main_list, SC, SYS); + bind_instr(main_list, B, LI, AA, LK); + bind_instr(main_list, RLWIMI, RA, RS, SH, MB, ME, RC); + bind_instr(main_list, RLWINM, RA, RS, SH, MB, ME, RC); + bind_instr(main_list, RLWNM, RA, RS, RB, MB, ME, RC); + bind_instr(main_list, ORI, RA, RS, uimm16); + bind_instr(main_list, ORIS, RA, RS, uimm16); + bind_instr(main_list, XORI, RA, RS, uimm16); + bind_instr(main_list, XORIS, RA, RS, uimm16); + bind_instr(main_list, ANDI_, RA, RS, uimm16); + bind_instr(main_list, ANDIS_, RA, RS, uimm16); + bind_instr(main_list, LWZ, RD, RA, D); + bind_instr(main_list, LWZU, RD, RA, D); + bind_instr(main_list, LBZ, RD, RA, D); + bind_instr(main_list, LBZU, RD, RA, D); + bind_instr(main_list, STW, RS, RA, D); + bind_instr(main_list, STWU, RS, RA, D); + bind_instr(main_list, STB, RS, RA, D); + bind_instr(main_list, STBU, RS, RA, D); + bind_instr(main_list, LHZ, RD, RA, D); + bind_instr(main_list, LHZU, RD, RA, D); + bind_instr(main_list, LHA, RD, RA, D); + bind_instr(main_list, LHAU, RD, RA, D); + bind_instr(main_list, STH, RS, RA, D); + bind_instr(main_list, STHU, RS, RA, D); + bind_instr(main_list, LMW, RD, RA, D); + bind_instr(main_list, STMW, RS, RA, D); + bind_instr(main_list, LFS, FRD, RA, D); + bind_instr(main_list, LFSU, FRD, RA, D); + bind_instr(main_list, LFD, FRD, RA, D); + bind_instr(main_list, LFDU, FRD, RA, D); + bind_instr(main_list, STFS, FRS, RA, D); + bind_instr(main_list, STFSU, FRS, RA, D); + bind_instr(main_list, STFD, FRS, RA, D); + bind_instr(main_list, STFDU, FRS, RA, D); + + bind_instr(g04_list, VMADDFP, VD, VA, VC, VB); + bind_instr(g04_list, VMHADDSHS, VD, VA, VB, VC); + bind_instr(g04_list, VMHRADDSHS, VD, VA, VB, VC); + bind_instr(g04_list, VMLADDUHM, VD, VA, VB, VC); + bind_instr(g04_list, VMSUMMBM, VD, VA, VB, VC); + bind_instr(g04_list, VMSUMSHM, VD, VA, VB, VC); + bind_instr(g04_list, VMSUMSHS, VD, VA, VB, VC); + bind_instr(g04_list, VMSUMUBM, VD, VA, VB, VC); + bind_instr(g04_list, VMSUMUHM, VD, VA, VB, VC); + bind_instr(g04_list, VMSUMUHS, VD, VA, VB, VC); + bind_instr(g04_list, VNMSUBFP, VD, VA, VC, VB); + bind_instr(g04_list, VPERM, VD, VA, VB, VC); + bind_instr(g04_list, VSEL, VD, VA, VB, VC); + bind_instr(g04_list, VSLDOI, VD, VA, VB, VSH); + + bind_instr(g04_0_list, MFVSCR, VD); + bind_instr(g04_0_list, MTVSCR, VB); + bind_instr(g04_0_list, VADDCUW, VD, VA, VB); + bind_instr(g04_0_list, VADDFP, VD, VA, VB); + bind_instr(g04_0_list, VADDSBS, VD, VA, VB); + bind_instr(g04_0_list, VADDSHS, VD, VA, VB); + bind_instr(g04_0_list, VADDSWS, VD, VA, VB); + bind_instr(g04_0_list, VADDUBM, VD, VA, VB); + bind_instr(g04_0_list, VADDUBS, VD, VA, VB); + bind_instr(g04_0_list, VADDUHM, VD, VA, VB); + bind_instr(g04_0_list, VADDUHS, VD, VA, VB); + bind_instr(g04_0_list, VADDUWM, VD, VA, VB); + bind_instr(g04_0_list, VADDUWS, VD, VA, VB); + bind_instr(g04_0_list, VAND, VD, VA, VB); + bind_instr(g04_0_list, VANDC, VD, VA, VB); + bind_instr(g04_0_list, VAVGSB, VD, VA, VB); + bind_instr(g04_0_list, VAVGSH, VD, VA, VB); + bind_instr(g04_0_list, VAVGSW, VD, VA, VB); + bind_instr(g04_0_list, VAVGUB, VD, VA, VB); + bind_instr(g04_0_list, VAVGUH, VD, VA, VB); + bind_instr(g04_0_list, VAVGUW, VD, VA, VB); + bind_instr(g04_0_list, VCFSX, VD, VUIMM, VB); + bind_instr(g04_0_list, VCFUX, VD, VUIMM, VB); + bind_instr(g04_0_list, VCMPBFP, VD, VA, VB); + bind_instr(g04_0_list, VCMPBFP_, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQFP, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQFP_, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQUB, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQUB_, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQUH, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQUH_, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQUW, VD, VA, VB); + bind_instr(g04_0_list, VCMPEQUW_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGEFP, VD, VA, VB); + bind_instr(g04_0_list, VCMPGEFP_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTFP, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTFP_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTSB, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTSB_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTSH, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTSH_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTSW, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTSW_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTUB, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTUB_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTUH, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTUH_, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTUW, VD, VA, VB); + bind_instr(g04_0_list, VCMPGTUW_, VD, VA, VB); + bind_instr(g04_0_list, VCTSXS, VD, VUIMM, VB); + bind_instr(g04_0_list, VCTUXS, VD, VUIMM, VB); + bind_instr(g04_0_list, VEXPTEFP, VD, VB); + bind_instr(g04_0_list, VLOGEFP, VD, VB); + bind_instr(g04_0_list, VMAXFP, VD, VA, VB); + bind_instr(g04_0_list, VMAXSB, VD, VA, VB); + bind_instr(g04_0_list, VMAXSH, VD, VA, VB); + bind_instr(g04_0_list, VMAXSW, VD, VA, VB); + bind_instr(g04_0_list, VMAXUB, VD, VA, VB); + bind_instr(g04_0_list, VMAXUH, VD, VA, VB); + bind_instr(g04_0_list, VMAXUW, VD, VA, VB); + bind_instr(g04_0_list, VMINFP, VD, VA, VB); + bind_instr(g04_0_list, VMINSB, VD, VA, VB); + bind_instr(g04_0_list, VMINSH, VD, VA, VB); + bind_instr(g04_0_list, VMINSW, VD, VA, VB); + bind_instr(g04_0_list, VMINUB, VD, VA, VB); + bind_instr(g04_0_list, VMINUH, VD, VA, VB); + bind_instr(g04_0_list, VMINUW, VD, VA, VB); + bind_instr(g04_0_list, VMRGHB, VD, VA, VB); + bind_instr(g04_0_list, VMRGHH, VD, VA, VB); + bind_instr(g04_0_list, VMRGHW, VD, VA, VB); + bind_instr(g04_0_list, VMRGLB, VD, VA, VB); + bind_instr(g04_0_list, VMRGLH, VD, VA, VB); + bind_instr(g04_0_list, VMRGLW, VD, VA, VB); + bind_instr(g04_0_list, VMULESB, VD, VA, VB); + bind_instr(g04_0_list, VMULESH, VD, VA, VB); + bind_instr(g04_0_list, VMULEUB, VD, VA, VB); + bind_instr(g04_0_list, VMULEUH, VD, VA, VB); + bind_instr(g04_0_list, VMULOSB, VD, VA, VB); + bind_instr(g04_0_list, VMULOSH, VD, VA, VB); + bind_instr(g04_0_list, VMULOUB, VD, VA, VB); + bind_instr(g04_0_list, VMULOUH, VD, VA, VB); + bind_instr(g04_0_list, VNOR, VD, VA, VB); + bind_instr(g04_0_list, VOR, VD, VA, VB); + bind_instr(g04_0_list, VPKPX, VD, VA, VB); + bind_instr(g04_0_list, VPKSHSS, VD, VA, VB); + bind_instr(g04_0_list, VPKSHUS, VD, VA, VB); + bind_instr(g04_0_list, VPKSWSS, VD, VA, VB); + bind_instr(g04_0_list, VPKSWUS, VD, VA, VB); + bind_instr(g04_0_list, VPKUHUM, VD, VA, VB); + bind_instr(g04_0_list, VPKUHUS, VD, VA, VB); + bind_instr(g04_0_list, VPKUWUM, VD, VA, VB); + bind_instr(g04_0_list, VPKUWUS, VD, VA, VB); + bind_instr(g04_0_list, VREFP, VD, VB); + bind_instr(g04_0_list, VRFIM, VD, VB); + bind_instr(g04_0_list, VRFIN, VD, VB); + bind_instr(g04_0_list, VRFIP, VD, VB); + bind_instr(g04_0_list, VRFIZ, VD, VB); + bind_instr(g04_0_list, VRLB, VD, VA, VB); + bind_instr(g04_0_list, VRLH, VD, VA, VB); + bind_instr(g04_0_list, VRLW, VD, VA, VB); + bind_instr(g04_0_list, VRSQRTEFP, VD, VB); + bind_instr(g04_0_list, VSL, VD, VA, VB); + bind_instr(g04_0_list, VSLB, VD, VA, VB); + bind_instr(g04_0_list, VSLH, VD, VA, VB); + bind_instr(g04_0_list, VSLO, VD, VA, VB); + bind_instr(g04_0_list, VSLW, VD, VA, VB); + bind_instr(g04_0_list, VSPLTB, VD, VUIMM, VB); + bind_instr(g04_0_list, VSPLTH, VD, VUIMM, VB); + bind_instr(g04_0_list, VSPLTISB, VD, VSIMM); + bind_instr(g04_0_list, VSPLTISH, VD, VSIMM); + bind_instr(g04_0_list, VSPLTISW, VD, VSIMM); + bind_instr(g04_0_list, VSPLTW, VD, VUIMM, VB); + bind_instr(g04_0_list, VSR, VD, VA, VB); + bind_instr(g04_0_list, VSRAB, VD, VA, VB); + bind_instr(g04_0_list, VSRAH, VD, VA, VB); + bind_instr(g04_0_list, VSRAW, VD, VA, VB); + bind_instr(g04_0_list, VSRB, VD, VA, VB); + bind_instr(g04_0_list, VSRH, VD, VA, VB); + bind_instr(g04_0_list, VSRO, VD, VA, VB); + bind_instr(g04_0_list, VSRW, VD, VA, VB); + bind_instr(g04_0_list, VSUBCUW, VD, VA, VB); + bind_instr(g04_0_list, VSUBFP, VD, VA, VB); + bind_instr(g04_0_list, VSUBSBS, VD, VA, VB); + bind_instr(g04_0_list, VSUBSHS, VD, VA, VB); + bind_instr(g04_0_list, VSUBSWS, VD, VA, VB); + bind_instr(g04_0_list, VSUBUBM, VD, VA, VB); + bind_instr(g04_0_list, VSUBUBS, VD, VA, VB); + bind_instr(g04_0_list, VSUBUHM, VD, VA, VB); + bind_instr(g04_0_list, VSUBUHS, VD, VA, VB); + bind_instr(g04_0_list, VSUBUWM, VD, VA, VB); + bind_instr(g04_0_list, VSUBUWS, VD, VA, VB); + bind_instr(g04_0_list, VSUMSWS, VD, VA, VB); + bind_instr(g04_0_list, VSUM2SWS, VD, VA, VB); + bind_instr(g04_0_list, VSUM4SBS, VD, VA, VB); + bind_instr(g04_0_list, VSUM4SHS, VD, VA, VB); + bind_instr(g04_0_list, VSUM4UBS, VD, VA, VB); + bind_instr(g04_0_list, VUPKHPX, VD, VB); + bind_instr(g04_0_list, VUPKHSB, VD, VB); + bind_instr(g04_0_list, VUPKHSH, VD, VB); + bind_instr(g04_0_list, VUPKLPX, VD, VB); + bind_instr(g04_0_list, VUPKLSB, VD, VB); + bind_instr(g04_0_list, VUPKLSH, VD, VB); + bind_instr(g04_0_list, VXOR, VD, VA, VB); + + bind_instr(g13_list, MCRF, CRFD, CRFS); + bind_instr(g13_list, BCLR, BO, BI, BH, LK); + bind_instr(g13_list, CRNOR, CRBD, CRBA, CRBB); + bind_instr(g13_list, CRANDC, CRBD, CRBA, CRBB); + bind_instr(g13_list, ISYNC); + bind_instr(g13_list, CRXOR, CRBD, CRBA, CRBB); + bind_instr(g13_list, CRNAND, CRBD, CRBA, CRBB); + bind_instr(g13_list, CRAND, CRBD, CRBA, CRBB); + bind_instr(g13_list, CREQV, CRBD, CRBA, CRBB); + bind_instr(g13_list, CRORC, CRBD, CRBA, CRBB); + bind_instr(g13_list, CROR, CRBD, CRBA, CRBB); + bind_instr(g13_list, BCCTR, BO, BI, BH, LK); + + bind_instr(g1e_list, RLDICL, RA, RS, sh, mb, RC); + bind_instr(g1e_list, RLDICR, RA, RS, sh, me, RC); + bind_instr(g1e_list, RLDIC, RA, RS, sh, mb, RC); + bind_instr(g1e_list, RLDIMI, RA, RS, sh, mb, RC); + bind_instr(g1e_list, RLDC_LR, RA, RS, RB, mb, AA, RC); + + /*0x000*/bind_instr(g1f_list, CMP, CRFD, L_10, RA, RB); + /*0x004*/bind_instr(g1f_list, TW, TO, RA, RB); + /*0x006*/bind_instr(g1f_list, LVSL, VD, RA, RB); + /*0x007*/bind_instr(g1f_list, LVEBX, VD, RA, RB); + /*0x008*/bind_instr(g1f_list, SUBFC, RD, RA, RB, OE, RC); + /*0x009*/bind_instr(g1f_list, MULHDU, RD, RA, RB, RC); + /*0x00a*/bind_instr(g1f_list, ADDC, RD, RA, RB, OE, RC); + /*0x00b*/bind_instr(g1f_list, MULHWU, RD, RA, RB, RC); + /*0x013*/bind_instr(g1f_list, MFOCRF, L_11, RD, CRM); + /*0x014*/bind_instr(g1f_list, LWARX, RD, RA, RB); + /*0x015*/bind_instr(g1f_list, LDX, RD, RA, RB); + /*0x017*/bind_instr(g1f_list, LWZX, RD, RA, RB); + /*0x018*/bind_instr(g1f_list, SLW, RA, RS, RB, RC); + /*0x01a*/bind_instr(g1f_list, CNTLZW, RA, RS, RC); + /*0x01b*/bind_instr(g1f_list, SLD, RA, RS, RB, RC); + /*0x01c*/bind_instr(g1f_list, AND, RA, RS, RB, RC); + /*0x020*/bind_instr(g1f_list, CMPL, CRFD, L_10, RA, RB); + /*0x026*/bind_instr(g1f_list, LVSR, VD, RA, RB); + /*0x027*/bind_instr(g1f_list, LVEHX, VD, RA, RB); + /*0x028*/bind_instr(g1f_list, SUBF, RD, RA, RB, OE, RC); + /*0x035*/bind_instr(g1f_list, LDUX, RD, RA, RB); + /*0x036*/bind_instr(g1f_list, DCBST, RA, RB); + /*0x037*/bind_instr(g1f_list, LWZUX, RD, RA, RB); + /*0x03a*/bind_instr(g1f_list, CNTLZD, RA, RS, RC); + /*0x03c*/bind_instr(g1f_list, ANDC, RA, RS, RB, RC); + /*0x03c*/bind_instr(g1f_list, TD, TO, RA, RB); + /*0x047*/bind_instr(g1f_list, LVEWX, VD, RA, RB); + /*0x049*/bind_instr(g1f_list, MULHD, RD, RA, RB, RC); + /*0x04b*/bind_instr(g1f_list, MULHW, RD, RA, RB, RC); + /*0x054*/bind_instr(g1f_list, LDARX, RD, RA, RB); + /*0x056*/bind_instr(g1f_list, DCBF, RA, RB); + /*0x057*/bind_instr(g1f_list, LBZX, RD, RA, RB); + /*0x067*/bind_instr(g1f_list, LVX, VD, RA, RB); + /*0x068*/bind_instr(g1f_list, NEG, RD, RA, OE, RC); + /*0x077*/bind_instr(g1f_list, LBZUX, RD, RA, RB); + /*0x07c*/bind_instr(g1f_list, NOR, RA, RS, RB, RC); + /*0x087*/bind_instr(g1f_list, STVEBX, VS, RA, RB); + /*0x088*/bind_instr(g1f_list, SUBFE, RD, RA, RB, OE, RC); + /*0x08a*/bind_instr(g1f_list, ADDE, RD, RA, RB, OE, RC); + /*0x090*/bind_instr(g1f_list, MTOCRF, L_11, CRM, RS); + /*0x095*/bind_instr(g1f_list, STDX, RS, RA, RB); + /*0x096*/bind_instr(g1f_list, STWCX_, RS, RA, RB); + /*0x097*/bind_instr(g1f_list, STWX, RS, RA, RB); + /*0x0a7*/bind_instr(g1f_list, STVEHX, VS, RA, RB); + /*0x0b5*/bind_instr(g1f_list, STDUX, RS, RA, RB); + /*0x0b7*/bind_instr(g1f_list, STWUX, RS, RA, RB); + /*0x0c7*/bind_instr(g1f_list, STVEWX, VS, RA, RB); + /*0x0c8*/bind_instr(g1f_list, SUBFZE, RD, RA, OE, RC); + /*0x0ca*/bind_instr(g1f_list, ADDZE, RD, RA, OE, RC); + /*0x0d6*/bind_instr(g1f_list, STDCX_, RS, RA, RB); + /*0x0d7*/bind_instr(g1f_list, STBX, RS, RA, RB); + /*0x0e7*/bind_instr(g1f_list, STVX, VS, RA, RB); + /*0x0e8*/bind_instr(g1f_list, SUBFME, RD, RA, OE, RC); + /*0x0e9*/bind_instr(g1f_list, MULLD, RD, RA, RB, OE, RC); + /*0x0ea*/bind_instr(g1f_list, ADDME, RD, RA, OE, RC); + /*0x0eb*/bind_instr(g1f_list, MULLW, RD, RA, RB, OE, RC); + /*0x0f6*/bind_instr(g1f_list, DCBTST, RA, RB, TH); + /*0x0f7*/bind_instr(g1f_list, STBUX, RS, RA, RB); + /*0x10a*/bind_instr(g1f_list, ADD, RD, RA, RB, OE, RC); + /*0x116*/bind_instr(g1f_list, DCBT, RA, RB, TH); + /*0x117*/bind_instr(g1f_list, LHZX, RD, RA, RB); + /*0x11c*/bind_instr(g1f_list, EQV, RA, RS, RB, RC); + /*0x136*/bind_instr(g1f_list, ECIWX, RD, RA, RB); + /*0x137*/bind_instr(g1f_list, LHZUX, RD, RA, RB); + /*0x13c*/bind_instr(g1f_list, XOR, RA, RS, RB, RC); + /*0x153*/bind_instr(g1f_list, MFSPR, RD, SPR); + /*0x155*/bind_instr(g1f_list, LWAX, RD, RA, RB); + /*0x156*/bind_instr(g1f_list, DST, RA, RB, STRM, L_6); + /*0x157*/bind_instr(g1f_list, LHAX, RD, RA, RB); + /*0x167*/bind_instr(g1f_list, LVXL, VD, RA, RB); + /*0x173*/bind_instr(g1f_list, MFTB, RD, SPR); + /*0x175*/bind_instr(g1f_list, LWAUX, RD, RA, RB); + /*0x176*/bind_instr(g1f_list, DSTST, RA, RB, STRM, L_6); + /*0x177*/bind_instr(g1f_list, LHAUX, RD, RA, RB); + /*0x197*/bind_instr(g1f_list, STHX, RS, RA, RB); + /*0x19c*/bind_instr(g1f_list, ORC, RA, RS, RB, RC); + /*0x1b6*/bind_instr(g1f_list, ECOWX, RS, RA, RB); + /*0x1b7*/bind_instr(g1f_list, STHUX, RS, RA, RB); + /*0x1bc*/bind_instr(g1f_list, OR, RA, RS, RB, RC); + /*0x1c9*/bind_instr(g1f_list, DIVDU, RD, RA, RB, OE, RC); + /*0x1cb*/bind_instr(g1f_list, DIVWU, RD, RA, RB, OE, RC); + /*0x1d3*/bind_instr(g1f_list, MTSPR, SPR, RS); + /*0x1d6*///DCBI + /*0x1dc*/bind_instr(g1f_list, NAND, RA, RS, RB, RC); + /*0x1e7*/bind_instr(g1f_list, STVXL, VS, RA, RB); + /*0x1e9*/bind_instr(g1f_list, DIVD, RD, RA, RB, OE, RC); + /*0x1eb*/bind_instr(g1f_list, DIVW, RD, RA, RB, OE, RC); + /*0x207*/bind_instr(g1f_list, LVLX, VD, RA, RB); + /*0x214*/bind_instr(g1f_list, LDBRX, RD, RA, RB); + /*0x215*/bind_instr(g1f_list, LSWX, RD, RA, RB); + /*0x216*/bind_instr(g1f_list, LWBRX, RD, RA, RB); + /*0x217*/bind_instr(g1f_list, LFSX, FRD, RA, RB); + /*0x218*/bind_instr(g1f_list, SRW, RA, RS, RB, RC); + /*0x21b*/bind_instr(g1f_list, SRD, RA, RS, RB, RC); + /*0x227*/bind_instr(g1f_list, LVRX, VD, RA, RB); + /*0x237*/bind_instr(g1f_list, LFSUX, FRD, RA, RB); + /*0x255*/bind_instr(g1f_list, LSWI, RD, RA, NB); + /*0x256*/bind_instr(g1f_list, SYNC, L_9_10); + /*0x257*/bind_instr(g1f_list, LFDX, FRD, RA, RB); + /*0x277*/bind_instr(g1f_list, LFDUX, FRD, RA, RB); + /*0x287*/bind_instr(g1f_list, STVLX, VS, RA, RB); + /*0x296*/bind_instr(g1f_list, STSWX, RS, RA, RB); + /*0x296*/bind_instr(g1f_list, STWBRX, RS, RA, RB); + /*0x297*/bind_instr(g1f_list, STFSX, FRS, RA, RB); + /*0x2a7*/bind_instr(g1f_list, STVRX, VS, RA, RB); + /*0x2b7*/bind_instr(g1f_list, STFSUX, FRS, RA, RB); + /*0x2d5*/bind_instr(g1f_list, STSWI, RS, RA, NB); + /*0x2d7*/bind_instr(g1f_list, STFDX, FRS, RA, RB); + /*0x2d7*/bind_instr(g1f_list, STFDUX, FRS, RA, RB); + /*0x307*/bind_instr(g1f_list, LVLXL, VD, RA, RB); + /*0x316*/bind_instr(g1f_list, LHBRX, RD, RA, RB); + /*0x318*/bind_instr(g1f_list, SRAW, RA, RS, RB, RC); + /*0x31a*/bind_instr(g1f_list, SRAD, RA, RS, RB, RC); + /*0x327*/bind_instr(g1f_list, LVRXL, VD, RA, RB); + /*0x336*/bind_instr(g1f_list, DSS, STRM, L_6); + /*0x338*/bind_instr(g1f_list, SRAWI, RA, RS, SH, RC); + /*0x33a*/bind_instr(g1f_list, SRADI1, RA, RS, sh, RC); + /*0x33b*/bind_instr(g1f_list, SRADI2, RA, RS, sh, RC); + /*0x356*/bind_instr(g1f_list, EIEIO); + /*0x387*/bind_instr(g1f_list, STVLXL, VS, RA, RB); + /*0x396*/bind_instr(g1f_list, STHBRX, RS, RA, RB); + /*0x39a*/bind_instr(g1f_list, EXTSH, RA, RS, RC); + /*0x387*/bind_instr(g1f_list, STVRXL, VS, RA, RB); + /*0x3ba*/bind_instr(g1f_list, EXTSB, RA, RS, RC); + /*0x3d7*/bind_instr(g1f_list, STFIWX, FRS, RA, RB); + /*0x3da*/bind_instr(g1f_list, EXTSW, RA, RS, RC); + /*0x3d6*/bind_instr(g1f_list, ICBI, RA, RB); + /*0x3f6*/bind_instr(g1f_list, DCBZ, RA, RB); + + bind_instr(g3a_list, LD, RD, RA, DS); + bind_instr(g3a_list, LDU, RD, RA, DS); + bind_instr(g3a_list, LWA, RD, RA, DS); + + bind_instr(g3b_list, FDIVS, FRD, FRA, FRB, RC); + bind_instr(g3b_list, FSUBS, FRD, FRA, FRB, RC); + bind_instr(g3b_list, FADDS, FRD, FRA, FRB, RC); + bind_instr(g3b_list, FSQRTS, FRD, FRB, RC); + bind_instr(g3b_list, FRES, FRD, FRB, RC); + bind_instr(g3b_list, FMULS, FRD, FRA, FRC, RC); + bind_instr(g3b_list, FMADDS, FRD, FRA, FRC, FRB, RC); + bind_instr(g3b_list, FMSUBS, FRD, FRA, FRC, FRB, RC); + bind_instr(g3b_list, FNMSUBS, FRD, FRA, FRC, FRB, RC); + bind_instr(g3b_list, FNMADDS, FRD, FRA, FRC, FRB, RC); + + bind_instr(g3e_list, STD, RS, RA, DS); + bind_instr(g3e_list, STDU, RS, RA, DS); + + bind_instr(g3f_list, FSEL, FRD, FRA, FRC, FRB, RC); + bind_instr(g3f_list, FMUL, FRD, FRA, FRC, RC); + bind_instr(g3f_list, FMSUB, FRD, FRA, FRC, FRB, RC); + bind_instr(g3f_list, FMADD, FRD, FRA, FRC, FRB, RC); + bind_instr(g3f_list, FNMSUB, FRD, FRA, FRC, FRB, RC); + bind_instr(g3f_list, FNMADD, FRD, FRA, FRC, FRB, RC); + + bind_instr(g3f_0_list, FDIV, FRD, FRA, FRB, RC); + bind_instr(g3f_0_list, FSUB, FRD, FRA, FRB, RC); + bind_instr(g3f_0_list, FADD, FRD, FRA, FRB, RC); + bind_instr(g3f_0_list, FSQRT, FRD, FRB, RC); + bind_instr(g3f_0_list, FRSQRTE, FRD, FRB, RC); + bind_instr(g3f_0_list, FCMPU, CRFD, FRA, FRB); + bind_instr(g3f_0_list, FRSP, FRD, FRB, RC); + bind_instr(g3f_0_list, FCTIW, FRD, FRB, RC); + bind_instr(g3f_0_list, FCTIWZ, FRD, FRB, RC); + bind_instr(g3f_0_list, FCMPO, CRFD, FRA, FRB); + bind_instr(g3f_0_list, FNEG, FRD, FRB, RC); + bind_instr(g3f_0_list, FMR, FRD, FRB, RC); + bind_instr(g3f_0_list, FNABS, FRD, FRB, RC); + bind_instr(g3f_0_list, FABS, FRD, FRB, RC); + bind_instr(g3f_0_list, FCFID, FRD, FRB, RC); + bind_instr(g3f_0_list, FCTID, FRD, FRB, RC); + bind_instr(g3f_0_list, FCTIDZ, FRD, FRB, RC); + + bind_instr(g3f_0_list, MTFSB1, CRBD, RC); + bind_instr(g3f_0_list, MCRFS, CRFD, CRFS); + bind_instr(g3f_0_list, MTFSB0, CRBD, RC); + bind_instr(g3f_0_list, MTFSFI, CRFD, I, RC); + bind_instr(g3f_0_list, MFFS, FRD, RC); + bind_instr(g3f_0_list, MTFSF, FM, FRB, RC); + + enum + { + r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, + r12, r13, r14, r15, r16, r17, r18, r19, r20, r21, + r22, r23, r24, r25, r26, r27, r28, r29, r30, r31 + }; + } + + namespace implicts + { + using namespace lists; + + //static auto LIS = std::bind(ADDIS, std::placeholders::_1, r0, std::placeholders::_2); + //static auto LI = std::bind(ADDI, std::placeholders::_1, r0, std::placeholders::_2); + static auto NOP = std::bind(ORI, r0, r0, 0); + static auto MR = std::bind(OR, std::placeholders::_1, std::placeholders::_2, std::placeholders::_2, false); + static auto BLR = std::bind(BCLR, 0x10 | 0x04, 0, 0, 0); + static auto BCTR = std::bind(BCCTR, 0x10 | 0x04, 0, 0, 0); + static auto BCTRL = std::bind(BCCTR, 0x10 | 0x04, 0, 0, 1); + static auto MTCTR = std::bind(MTSPR, (0x1 << 5) | 0x8, std::placeholders::_1); + } + + + using namespace lists; + using namespace implicts; #undef bind_instr }; \ No newline at end of file diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index 26352c1c4d..c24509ea0f 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -1,6 +1,13 @@ #pragma once #include "Emu/Cell/PPUOpcodes.h" +#include "Emu/SysCalls/SysCalls.h" +#include "rpcs3/Ini.h" +#include "Emu/System.h" +#include "Emu/SysCalls/Static.h" +#include "Emu/SysCalls/Modules.h" +#include "Emu/Memory/Memory.h" +#include "Emu/SysCalls/lv2/sys_time.h" #include #ifdef _MSC_VER @@ -48,8 +55,15 @@ u64 rotr64(const u64 x, const u8 n) { return (x >> n) | (x << (64 - n)); } #define rotl64 _rotl64 #define rotr64 _rotr64 +namespace ppu_recompiler_llvm { + class Compiler; +} + class PPUInterpreter : public PPUOpcodes { +#ifdef PPU_LLVM_RECOMPILER + friend class ppu_recompiler_llvm::Compiler; +#endif private: PPUThread& CPU; @@ -123,21 +137,73 @@ private: return ctr_ok && cond_ok; } - u64& GetRegBySPR(u32 spr) + u64 ReadSPR(u32 spr) { const u32 n = (spr >> 5) | ((spr & 0x1f) << 5); - switch(n) + switch (n) { case 0x001: return CPU.XER.XER; case 0x008: return CPU.LR; case 0x009: return CPU.CTR; - case 0x100: return CPU.USPRG0; + case 0x100: + case 0x101: + case 0x102: + case 0x103: + case 0x104: + case 0x105: + case 0x106: + case 0x107: return CPU.USPRG[n - 0x100]; + + case 0x10C: return get_time(); + + case 0x110: + case 0x111: + case 0x112: + case 0x113: + case 0x114: + case 0x115: + case 0x116: + case 0x117: return CPU.SPRG[n - 0x110]; } - UNK(fmt::Format("GetRegBySPR error: Unknown SPR 0x%x!", n)); + UNK(fmt::Format("ReadSPR error: Unknown SPR 0x%x!", n)); return CPU.XER.XER; } + + void WriteSPR(u32 spr, u64 value) + { + const u32 n = (spr >> 5) | ((spr & 0x1f) << 5); + + switch (n) + { + case 0x001: CPU.XER.XER = value; return; + case 0x008: CPU.LR = value; return; + case 0x009: CPU.CTR = value; return; + case 0x100: + case 0x101: + case 0x102: + case 0x103: + case 0x104: + case 0x105: + case 0x106: + case 0x107: CPU.USPRG[n - 0x100] = value; return; + + case 0x10C: UNK("WriteSPR: Write to time-based SPR. Report this to a developer!"); return; + + case 0x110: + case 0x111: + case 0x112: + case 0x113: + case 0x114: + case 0x115: + case 0x116: + case 0x117: CPU.SPRG[n - 0x110] = value; return; + } + + UNK(fmt::Format("WriteSPR error: Unknown SPR 0x%x!", n)); + return; + } void TDI(u32 to, u32 ra, s32 simm16) { @@ -149,7 +215,7 @@ private: ((u64)a < (u64)simm16 && (to & 0x2)) || ((u64)a > (u64)simm16 && (to & 0x1)) ) { - UNK(fmt::Format("Trap! (tdi %x, r%d, %x)", to, ra, simm16)); + UNK(fmt::Format("Trap! (tdi 0x%x, r%d, 0x%x)", to, ra, simm16)); } } @@ -163,7 +229,7 @@ private: ((u32)a < (u32)simm16 && (to & 0x2)) || ((u32)a > (u32)simm16 && (to & 0x1)) ) { - UNK(fmt::Format("Trap! (twi %x, r%d, %x)", to, ra, simm16)); + UNK(fmt::Format("Trap! (twi 0x%x, r%d, 0x%x)", to, ra, simm16)); } } @@ -425,6 +491,7 @@ private: } // Bit n°2 of CR6 + CPU.SetCR(6, 0); CPU.SetCRBit(6, 0x2, allInBounds); } void VCMPEQFP(u32 vd, u32 va, u32 vb) @@ -1524,29 +1591,10 @@ private: { u8 sh = CPU.VPR[vb]._u8[0] & 0x7; - u32 t = 1; - - for (uint b = 0; b < 16; b++) + CPU.VPR[vd]._u8[0] = CPU.VPR[va]._u8[0] << sh; + for (uint b = 1; b < 16; b++) { - t &= (CPU.VPR[vb]._u8[b] & 0x7) == sh; - } - - if(t) - { - CPU.VPR[vd]._u8[0] = CPU.VPR[va]._u8[0] << sh; - - for (uint b = 1; b < 16; b++) - { - CPU.VPR[vd]._u8[b] = (CPU.VPR[va]._u8[b] << sh) | (CPU.VPR[va]._u8[b-1] >> (8 - sh)); - } - } - else - { - //undefined - CPU.VPR[vd]._u32[0] = 0xCDCDCDCD; - CPU.VPR[vd]._u32[1] = 0xCDCDCDCD; - CPU.VPR[vd]._u32[2] = 0xCDCDCDCD; - CPU.VPR[vd]._u32[3] = 0xCDCDCDCD; + CPU.VPR[vd]._u8[b] = (CPU.VPR[va]._u8[b] << sh) | (CPU.VPR[va]._u8[b-1] >> (8 - sh)); } } void VSLB(u32 vd, u32 va, u32 vb) @@ -1647,29 +1695,11 @@ private: void VSR(u32 vd, u32 va, u32 vb) //nf { u8 sh = CPU.VPR[vb]._u8[0] & 0x7; - u32 t = 1; - for (uint b = 0; b < 16; b++) + CPU.VPR[vd]._u8[15] = CPU.VPR[va]._u8[15] >> sh; + for (uint b = 14; ~b; b--) { - t &= (CPU.VPR[vb]._u8[b] & 0x7) == sh; - } - - if(t) - { - CPU.VPR[vd]._u8[15] = CPU.VPR[va]._u8[15] >> sh; - - for (uint b = 14; ~b; b--) - { - CPU.VPR[vd]._u8[b] = (CPU.VPR[va]._u8[b] >> sh) | (CPU.VPR[va]._u8[b+1] << (8 - sh)); - } - } - else - { - //undefined - CPU.VPR[vd]._u32[0] = 0xCDCDCDCD; - CPU.VPR[vd]._u32[1] = 0xCDCDCDCD; - CPU.VPR[vd]._u32[2] = 0xCDCDCDCD; - CPU.VPR[vd]._u32[3] = 0xCDCDCDCD; + CPU.VPR[vd]._u8[b] = (CPU.VPR[va]._u8[b] >> sh) | (CPU.VPR[va]._u8[b+1] << (8 - sh)); } } void VSRAB(u32 vd, u32 va, u32 vb) //nf @@ -2102,7 +2132,7 @@ private: break; case 0x4: CPU.FastStop(); break; case 0x22: UNK("HyperCall LV1"); break; - default: UNK(fmt::Format("Unknown sc: %x", sc_code)); + default: UNK(fmt::Format("Unknown sc: 0x%x", sc_code)); } } void B(s32 ll, u32 aa, u32 lk) @@ -2199,7 +2229,7 @@ private: } void ORIS(u32 ra, u32 rs, u32 uimm16) { - CPU.GPR[ra] = CPU.GPR[rs] | (uimm16 << 16); + CPU.GPR[ra] = CPU.GPR[rs] | ((u64)uimm16 << 16); } void XORI(u32 ra, u32 rs, u32 uimm16) { @@ -2207,7 +2237,7 @@ private: } void XORIS(u32 ra, u32 rs, u32 uimm16) { - CPU.GPR[ra] = CPU.GPR[rs] ^ (uimm16 << 16); + CPU.GPR[ra] = CPU.GPR[rs] ^ ((u64)uimm16 << 16); } void ANDI_(u32 ra, u32 rs, u32 uimm16) { @@ -2216,7 +2246,7 @@ private: } void ANDIS_(u32 ra, u32 rs, u32 uimm16) { - CPU.GPR[ra] = CPU.GPR[rs] & (uimm16 << 16); + CPU.GPR[ra] = CPU.GPR[rs] & ((u64)uimm16 << 16); CPU.UpdateCR0(CPU.GPR[ra]); } void RLDICL(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) @@ -2244,11 +2274,11 @@ private: { if (is_r) // rldcr { - RLDICR(ra, rs, (u32)CPU.GPR[rb], m_eb, rc); + RLDICR(ra, rs, (u32)(CPU.GPR[rb] & 0x3F), m_eb, rc); } else // rldcl { - RLDICL(ra, rs, (u32)CPU.GPR[rb], m_eb, rc); + RLDICL(ra, rs, (u32)(CPU.GPR[rb] & 0x3F), m_eb, rc); } } void CMP(u32 crfd, u32 l, u32 ra, u32 rb) @@ -2266,7 +2296,7 @@ private: ((u32)a < (u32)b && (to & 0x2)) || ((u32)a > (u32)b && (to & 0x1)) ) { - UNK(fmt::Format("Trap! (tw %x, r%d, r%d)", to, ra, rb)); + UNK(fmt::Format("Trap! (tw 0x%x, r%d, r%d)", to, ra, rb)); } } void LVSL(u32 vd, u32 ra, u32 rb) @@ -2299,7 +2329,13 @@ private: void LVEBX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.VPR[vd]._u8[15 - (addr & 0xf)] = vm::read8(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.VPR[vd]._u8[15 - (addr & 0xf)] = vm::read8((u32)addr); // check LVEWX comments } void SUBFC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2365,16 +2401,36 @@ private: void LWARX(u32 rd, u32 ra, u32 rb) { CPU.R_ADDR = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.R_VALUE = vm::get_ref(CPU.R_ADDR); + if ((u32)CPU.R_ADDR != CPU.R_ADDR) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, CPU.R_ADDR); + Emu.Pause(); + return; + } + CPU.R_VALUE = vm::get_ref((u32)CPU.R_ADDR); CPU.GPR[rd] = re32((u32)CPU.R_VALUE); } void LDX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read64(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); } void LWZX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); } void SLW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2395,8 +2451,7 @@ private: } CPU.GPR[ra] = i; - - if(rc) CPU.SetCRBit(CR_LT, false); + if(rc) CPU.UpdateCR0(CPU.GPR[ra]); } void SLD(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2447,7 +2502,13 @@ private: void LVEHX(u32 vd, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; - CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.VPR[vd]._u16[7 - ((addr >> 1) & 0x7)] = vm::read16((u32)addr); // check LVEWX comments } void SUBF(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2459,18 +2520,28 @@ private: void LDUX(u32 rd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - CPU.GPR[rd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void DCBST(u32 ra, u32 rb) { - //UNK("dcbst", false); - _mm_mfence(); } void LWZUX(u32 rd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - CPU.GPR[rd] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); CPU.GPR[ra] = addr; } void CNTLZD(u32 ra, u32 rs, bool rc) @@ -2482,7 +2553,7 @@ private: } CPU.GPR[ra] = i; - if(rc) CPU.SetCRBit(CR_LT, false); + if(rc) CPU.UpdateCR0(CPU.GPR[ra]); } void ANDC(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2496,7 +2567,13 @@ private: void LVEWX(u32 vd, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; - CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.VPR[vd]._u32[3 - ((addr >> 2) & 0x3)] = vm::read32((u32)addr); // It's not very good idea to implement it using read128(), // because it can theoretically read RawSPU 32-bit MMIO register (read128() will fail) //CPU.VPR[vd] = vm::read128((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~0xfULL); @@ -2516,17 +2593,28 @@ private: void LDARX(u32 rd, u32 ra, u32 rb) { CPU.R_ADDR = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.R_VALUE = vm::get_ref(CPU.R_ADDR); + if ((u32)CPU.R_ADDR != CPU.R_ADDR) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, CPU.R_ADDR); + Emu.Pause(); + return; + } + CPU.R_VALUE = vm::get_ref((u32)CPU.R_ADDR); CPU.GPR[rd] = re64(CPU.R_VALUE); } void DCBF(u32 ra, u32 rb) { - //UNK("dcbf", false); - _mm_mfence(); } void LBZX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read8(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); } void LVX(u32 vd, u32 ra, u32 rb) { @@ -2543,7 +2631,13 @@ private: //if(ra == 0 || ra == rd) throw "Bad instruction [LBZUX]"; const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - CPU.GPR[rd] = vm::read8(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); CPU.GPR[ra] = addr; } void NOR(u32 ra, u32 rs, u32 rb, bool rc) @@ -2554,8 +2648,14 @@ private: void STVEBX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; - vm::write8(addr, CPU.VPR[vs]._u8[15 - eb]); + vm::write8((u32)addr, CPU.VPR[vs]._u8[15 - eb]); } void SUBFE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { @@ -2626,15 +2726,28 @@ private: } void STDX(u32 rs, u32 ra, u32 rb) { - vm::write64((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); } void STWCX_(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } if (CPU.R_ADDR == addr) { - CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr(addr), re32((u32)CPU.GPR[rs]), (u32)CPU.R_VALUE) == (u32)CPU.R_VALUE); + CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr((u32)CPU.R_ADDR), re32((u32)CPU.GPR[rs]), (u32)CPU.R_VALUE) == (u32)CPU.R_VALUE); CPU.R_ADDR = 0; } else @@ -2644,31 +2757,62 @@ private: } void STWX(u32 rs, u32 ra, u32 rb) { - vm::write32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb], (u32)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); } void STVEHX(u32 vs, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~1ULL; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = (addr & 0xf) >> 1; - vm::write16(addr, CPU.VPR[vs]._u16[7 - eb]); + vm::write16((u32)addr, CPU.VPR[vs]._u16[7 - eb]); } void STDUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write64(addr, CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STWUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write32(addr, (u32)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STVEWX(u32 vs, u32 ra, u32 rb) { const u64 addr = (ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) & ~3ULL; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = (addr & 0xf) >> 2; - vm::write32(addr, CPU.VPR[vs]._u32[3 - eb]); + vm::write32((u32)addr, CPU.VPR[vs]._u32[3 - eb]); } void ADDZE(u32 rd, u32 ra, u32 oe, bool rc) { @@ -2689,10 +2833,16 @@ private: void STDCX_(u32 rs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } if (CPU.R_ADDR == addr) { - CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr(addr), re64(CPU.GPR[rs]), CPU.R_VALUE) == CPU.R_VALUE); + CPU.SetCR_EQ(0, InterlockedCompareExchange(vm::get_ptr((u32)CPU.R_ADDR), re64(CPU.GPR[rs]), CPU.R_VALUE) == CPU.R_VALUE); CPU.R_ADDR = 0; } else @@ -2702,7 +2852,14 @@ private: } void STBX(u32 rs, u32 ra, u32 rb) { - vm::write8((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), (u8)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); } void STVX(u32 vs, u32 ra, u32 rb) { @@ -2739,13 +2896,17 @@ private: } void DCBTST(u32 ra, u32 rb, u32 th) { - //UNK("dcbtst", false); - _mm_mfence(); } void STBUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write8(addr, (u8)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void ADD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) @@ -2758,12 +2919,17 @@ private: } void DCBT(u32 ra, u32 rb, u32 th) { - //UNK("dcbt", false); - _mm_mfence(); } void LHZX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::read16(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); } void EQV(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2773,12 +2939,25 @@ private: void ECIWX(u32 rd, u32 ra, u32 rb) { //HACK! - CPU.GPR[rd] = vm::read32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); } void LHZUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.GPR[rd] = vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); CPU.GPR[ra] = addr; } void XOR(u32 ra, u32 rs, u32 rb, bool rc) @@ -2788,19 +2967,32 @@ private: } void MFSPR(u32 rd, u32 spr) { - CPU.GPR[rd] = GetRegBySPR(spr); + CPU.GPR[rd] = ReadSPR(spr); } void LWAX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = (s64)(s32)vm::read32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); } void DST(u32 ra, u32 rb, u32 strm, u32 t) { - _mm_mfence(); } void LHAX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = (s64)(s16)vm::read16(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); } void LVXL(u32 vd, u32 ra, u32 rb) { @@ -2810,6 +3002,7 @@ private: { const u32 n = (spr >> 5) | ((spr & 0x1f) << 5); + CPU.TB = get_time(); switch(n) { case 0x10C: CPU.GPR[rd] = CPU.TB; break; @@ -2820,22 +3013,40 @@ private: void LWAUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.GPR[rd] = (s64)(s32)vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); CPU.GPR[ra] = addr; } void DSTST(u32 ra, u32 rb, u32 strm, u32 t) { - _mm_mfence(); } void LHAUX(u32 rd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; - CPU.GPR[rd] = (s64)(s16)vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); CPU.GPR[ra] = addr; } void STHX(u32 rs, u32 ra, u32 rb) { - vm::write16(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb], (u16)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); } void ORC(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2845,12 +3056,25 @@ private: void ECOWX(u32 rs, u32 ra, u32 rb) { //HACK! - vm::write32((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), (u32)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); } void STHUX(u32 rs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write16(addr, (u16)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void OR(u32 ra, u32 rs, u32 rb, bool rc) @@ -2894,9 +3118,11 @@ private: } void MTSPR(u32 spr, u32 rs) { - GetRegBySPR(spr) = CPU.GPR[rs]; + WriteSPR(spr, CPU.GPR[rs]); + } + void DCBI(u32 ra, u32 rb) + { } - /*0x1d6*///DCBI void NAND(u32 ra, u32 rs, u32 rb, bool rc) { CPU.GPR[ra] = ~(CPU.GPR[rs] & CPU.GPR[rb]); @@ -2944,14 +3170,27 @@ private: void LVLX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i); + for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i); } void LDBRX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::get_ref((u32)addr); } void LSWX(u32 rd, u32 ra, u32 rb) { @@ -2959,11 +3198,25 @@ private: } void LWBRX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::get_ref((u32)addr); } void LFSX(u32 frd, u32 ra, u32 rb) { - CPU.FPR[frd] = vm::get_ref>(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]).ToLE(); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.FPR[frd] = vm::get_ref>((u32)addr).ToLE(); } void SRW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -2986,33 +3239,47 @@ private: void LVRX(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i - 16); + for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i - 16); } void LSWI(u32 rd, u32 ra, u32 nb) { - u64 EA = ra ? CPU.GPR[ra] : 0; + u64 addr = ra ? CPU.GPR[ra] : 0; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } u64 N = nb ? nb : 32; - u8 reg = (u8)CPU.GPR[rd]; + u8 reg = rd; while (N > 0) { if (N > 3) { - CPU.GPR[reg] = vm::read32(EA); - EA += 4; + CPU.GPR[reg] = vm::read32((u32)addr); + addr += 4; N -= 4; } else { u32 buf = 0; + u32 i = 3; while (N > 0) { N = N - 1; - buf |= vm::read8(EA) <<(N*8) ; - EA = EA + 1; + buf |= vm::read8((u32)addr) << (i * 8); + addr++; + i--; } CPU.GPR[reg] = buf; } @@ -3022,7 +3289,13 @@ private: void LFSUX(u32 frd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - (u64&)CPU.FPR[frd] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read32((u32)addr); CPU.FPR[frd] = (float&)CPU.FPR[frd]; CPU.GPR[ra] = addr; } @@ -3032,20 +3305,39 @@ private: } void LFDX(u32 frd, u32 ra, u32 rb) { - (u64&)CPU.FPR[frd] = vm::read64(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); } void LFDUX(u32 frd, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - (u64&)CPU.FPR[frd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void STVLX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; - for (u32 i = 0; i < 16u - eb; ++i) vm::write8(addr + i, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 0; i < 16u - eb; ++i) vm::write8((u32)addr + i, CPU.VPR[vs]._u8[15 - i]); } void STSWX(u32 rs, u32 ra, u32 rb) { @@ -3053,37 +3345,69 @@ private: } void STWBRX(u32 rs, u32 ra, u32 rb) { - vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) = (u32)CPU.GPR[rs]; + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::get_ref((u32)addr) = (u32)CPU.GPR[rs]; } void STFSX(u32 frs, u32 ra, u32 rb) { - vm::write32((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), CPU.FPR[frs].To32()); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); } void STVRX(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; - for (u32 i = 16 - eb; i < 16; ++i) vm::write8(addr + i - 16, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 16 - eb; i < 16; ++i) vm::write8((u32)addr + i - 16, CPU.VPR[vs]._u8[15 - i]); } void STFSUX(u32 frs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write32(addr, CPU.FPR[frs].To32()); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); CPU.GPR[ra] = addr; } void STSWI(u32 rd, u32 ra, u32 nb) { - u64 EA = ra ? CPU.GPR[ra] : 0; + u64 addr = ra ? CPU.GPR[ra] : 0; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } u64 N = nb ? nb : 32; - u8 reg = (u8)CPU.GPR[rd]; + u8 reg = rd; while (N > 0) { if (N > 3) { - vm::write32(EA, (u32)CPU.GPR[reg]); - EA += 4; + vm::write32((u32)addr, (u32)CPU.GPR[reg]); + addr += 4; N -= 4; } else @@ -3092,9 +3416,9 @@ private: while (N > 0) { N = N - 1; - vm::write8(EA, (0xFF000000 & buf) >> 24); + vm::write8((u32)addr, (0xFF000000 & buf) >> 24); buf <<= 8; - EA = EA + 1; + addr++; } } reg = (reg + 1) % 32; @@ -3102,25 +3426,51 @@ private: } void STFDX(u32 frs, u32 ra, u32 rb) { - vm::write64((ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]), (u64&)CPU.FPR[frs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); } void STFDUX(u32 frs, u32 ra, u32 rb) { const u64 addr = CPU.GPR[ra] + CPU.GPR[rb]; - vm::write64(addr, (u64&)CPU.FPR[frs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); CPU.GPR[ra] = addr; } void LVLXL(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i); + for (u32 i = 0; i < 16u - eb; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i); } void LHBRX(u32 rd, u32 ra, u32 rb) { - CPU.GPR[rd] = vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::get_ref((u32)addr); } void SRAW(u32 ra, u32 rs, u32 rb, bool rc) { @@ -3159,14 +3509,19 @@ private: void LVRXL(u32 vd, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; CPU.VPR[vd].clear(); - for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8(addr + i - 16); + for (u32 i = 16 - eb; i < 16; ++i) CPU.VPR[vd]._u8[15 - i] = vm::read8((u32)addr + i - 16); } void DSS(u32 strm, u32 a) { - _mm_mfence(); } void SRAWI(u32 ra, u32 rs, u32 sh, bool rc) { @@ -3195,13 +3550,26 @@ private: void STVLXL(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u32 eb = addr & 0xf; - for (u32 i = 0; i < 16u - eb; ++i) vm::write8(addr + i, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 0; i < 16u - eb; ++i) vm::write8((u32)addr + i, CPU.VPR[vs]._u8[15 - i]); } void STHBRX(u32 rs, u32 ra, u32 rb) { - vm::get_ref(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]) = (u16)CPU.GPR[rs]; + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::get_ref((u32)addr) = (u16)CPU.GPR[rs]; } void EXTSH(u32 ra, u32 rs, bool rc) { @@ -3211,9 +3579,15 @@ private: void STVRXL(u32 vs, u32 ra, u32 rb) { const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } const u8 eb = addr & 0xf; - for (u32 i = 16 - eb; i < 16; ++i) vm::write8(addr + i - 16, CPU.VPR[vs]._u8[15 - i]); + for (u32 i = 16 - eb; i < 16; ++i) vm::write8((u32)addr + i - 16, CPU.VPR[vs]._u8[15 - i]); } void EXTSB(u32 ra, u32 rs, bool rc) { @@ -3222,7 +3596,14 @@ private: } void STFIWX(u32 frs, u32 ra, u32 rb) { - vm::write32(ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb], (u32&)CPU.FPR[frs]); + const u64 addr = ra ? CPU.GPR[ra] + CPU.GPR[rb] : CPU.GPR[rb]; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32&)CPU.FPR[frs]); } void EXTSW(u32 ra, u32 rs, bool rc) { @@ -3239,150 +3620,324 @@ private: auto const cache_line = vm::get_ptr(addr & ~127); if (cache_line) memset(cache_line, 0, 128); - _mm_mfence(); } void LWZ(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = vm::read32(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); } void LWZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read32((u32)addr); CPU.GPR[ra] = addr; } void LBZ(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = vm::read8(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); } void LBZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = vm::read8(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read8((u32)addr); CPU.GPR[ra] = addr; } void STW(u32 rs, u32 ra, s32 d) { - vm::write32(ra ? CPU.GPR[ra] + d : d, (u32)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); } void STWU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write32(addr, (u32)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, (u32)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void STB(u32 rs, u32 ra, s32 d) { - vm::write8(ra ? CPU.GPR[ra] + d : d, (u8)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); } void STBU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write8(addr, (u8)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write8((u32)addr, (u8)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void LHZ(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = vm::read16(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); } void LHZU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read16((u32)addr); CPU.GPR[ra] = addr; } void LHA(u32 rd, u32 ra, s32 d) { - CPU.GPR[rd] = (s64)(s16)vm::read16(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); } void LHAU(u32 rd, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - CPU.GPR[rd] = (s64)(s16)vm::read16(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s16)vm::read16((u32)addr); CPU.GPR[ra] = addr; } void STH(u32 rs, u32 ra, s32 d) { - vm::write16(ra ? CPU.GPR[ra] + d : d, (u16)CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); } void STHU(u32 rs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write16(addr, (u16)CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write16((u32)addr, (u16)CPU.GPR[rs]); CPU.GPR[ra] = addr; } void LMW(u32 rd, u32 ra, s32 d) { u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } for(u32 i=rd; i<32; ++i, addr += 4) { - CPU.GPR[i] = vm::read32(addr); + CPU.GPR[i] = vm::read32((u32)addr); } } void STMW(u32 rs, u32 ra, s32 d) { u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } for(u32 i=rs; i<32; ++i, addr += 4) { - vm::write32(addr, (u32)CPU.GPR[i]); + vm::write32((u32)addr, (u32)CPU.GPR[i]); } } void LFS(u32 frd, u32 ra, s32 d) { - const u32 v = vm::read32(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + const u32 v = vm::read32((u32)addr); CPU.FPR[frd] = (float&)v; } void LFSU(u32 frd, u32 ra, s32 ds) { const u64 addr = CPU.GPR[ra] + ds; - const u32 v = vm::read32(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + const u32 v = vm::read32((u32)addr); CPU.FPR[frd] = (float&)v; CPU.GPR[ra] = addr; } void LFD(u32 frd, u32 ra, s32 d) { - (u64&)CPU.FPR[frd] = vm::read64(ra ? CPU.GPR[ra] + d : d); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); } void LFDU(u32 frd, u32 ra, s32 ds) { const u64 addr = CPU.GPR[ra] + ds; - (u64&)CPU.FPR[frd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + (u64&)CPU.FPR[frd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void STFS(u32 frs, u32 ra, s32 d) { - vm::write32(ra ? CPU.GPR[ra] + d : d, CPU.FPR[frs].To32()); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); } void STFSU(u32 frs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write32(addr, CPU.FPR[frs].To32()); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write32((u32)addr, CPU.FPR[frs].To32()); CPU.GPR[ra] = addr; } void STFD(u32 frs, u32 ra, s32 d) { - vm::write64(ra ? CPU.GPR[ra] + d : d, (u64&)CPU.FPR[frs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); } void STFDU(u32 frs, u32 ra, s32 d) { const u64 addr = CPU.GPR[ra] + d; - vm::write64(addr, (u64&)CPU.FPR[frs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, (u64&)CPU.FPR[frs]); CPU.GPR[ra] = addr; } void LD(u32 rd, u32 ra, s32 ds) { - CPU.GPR[rd] = vm::read64(ra ? CPU.GPR[ra] + ds : ds); + const u64 addr = ra ? CPU.GPR[ra] + ds : ds; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); } void LDU(u32 rd, u32 ra, s32 ds) { //if(ra == 0 || rt == ra) return; const u64 addr = CPU.GPR[ra] + ds; - CPU.GPR[rd] = vm::read64(addr); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = vm::read64((u32)addr); CPU.GPR[ra] = addr; } void LWA(u32 rd, u32 ra, s32 ds) { - CPU.GPR[rd] = (s64)(s32)vm::read32(ra ? CPU.GPR[ra] + ds : ds); + const u64 addr = ra ? CPU.GPR[ra] + ds : ds; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + CPU.GPR[rd] = (s64)(s32)vm::read32((u32)addr); } void FDIVS(u32 frd, u32 fra, u32 frb, bool rc) { @@ -3485,13 +4040,26 @@ private: } void STD(u32 rs, u32 ra, s32 d) { - vm::write64(ra ? CPU.GPR[ra] + d : d, CPU.GPR[rs]); + const u64 addr = ra ? CPU.GPR[ra] + d : d; + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); } void STDU(u32 rs, u32 ra, s32 ds) { //if(ra == 0 || rs == ra) return; const u64 addr = CPU.GPR[ra] + ds; - vm::write64(addr, CPU.GPR[rs]); + if ((u32)addr != addr) + { + LOG_ERROR(PPU, "%s(): invalid address (0x%llx)", __FUNCTION__, addr); + Emu.Pause(); + return; + } + vm::write64((u32)addr, CPU.GPR[rs]); CPU.GPR[ra] = addr; } void MTFSB1(u32 crbd, bool rc) diff --git a/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp b/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp new file mode 100644 index 0000000000..07354dd068 --- /dev/null +++ b/rpcs3/Emu/Cell/PPULLVMRecompiler.cpp @@ -0,0 +1,5367 @@ +#include "stdafx.h" +#include "Utilities/Log.h" +#include "Emu/Cell/PPULLVMRecompiler.h" +#include "Emu/Memory/Memory.h" +#include "llvm/Support/TargetSelect.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/CodeGen/MachineCodeInfo.h" +#include "llvm/ExecutionEngine/GenericValue.h" +#include "llvm/IR/Intrinsics.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Analysis/Passes.h" +#include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/Analysis/MemoryDependenceAnalysis.h" +#include "llvm/Analysis/LoopInfo.h" +#include "llvm/Analysis/ScalarEvolution.h" +#include "llvm/IR/Dominators.h" +#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Vectorize.h" +#include "llvm/MC/MCDisassembler.h" +#include "llvm/IR/Verifier.h" + +using namespace llvm; +using namespace ppu_recompiler_llvm; + +u64 Compiler::s_rotate_mask[64][64]; +bool Compiler::s_rotate_mask_inited = false; + +Compiler::Compiler(RecompilationEngine & recompilation_engine, const Executable execute_unknown_function, const Executable execute_unknown_block) + : m_recompilation_engine(recompilation_engine) { + InitializeNativeTarget(); + InitializeNativeTargetAsmPrinter(); + InitializeNativeTargetDisassembler(); + + m_llvm_context = new LLVMContext(); + m_ir_builder = new IRBuilder<>(*m_llvm_context); + m_module = new llvm::Module("Module", *m_llvm_context); + m_fpm = new FunctionPassManager(m_module); + + EngineBuilder engine_builder(m_module); + engine_builder.setMCPU(sys::getHostCPUName()); + engine_builder.setEngineKind(EngineKind::JIT); + engine_builder.setOptLevel(CodeGenOpt::Default); + m_execution_engine = engine_builder.create(); + + m_fpm->add(new DataLayoutPass(m_module)); + m_fpm->add(createNoAAPass()); + m_fpm->add(createBasicAliasAnalysisPass()); + m_fpm->add(createNoTargetTransformInfoPass()); + m_fpm->add(createEarlyCSEPass()); + m_fpm->add(createTailCallEliminationPass()); + m_fpm->add(createReassociatePass()); + m_fpm->add(createInstructionCombiningPass()); + m_fpm->add(new DominatorTreeWrapperPass()); + m_fpm->add(new MemoryDependenceAnalysis()); + m_fpm->add(createGVNPass()); + m_fpm->add(createInstructionCombiningPass()); + m_fpm->add(new MemoryDependenceAnalysis()); + m_fpm->add(createDeadStoreEliminationPass()); + m_fpm->add(new LoopInfo()); + m_fpm->add(new ScalarEvolution()); + m_fpm->add(createSLPVectorizerPass()); + m_fpm->add(createInstructionCombiningPass()); + m_fpm->add(createCFGSimplificationPass()); + m_fpm->doInitialization(); + + std::vector arg_types; + arg_types.push_back(m_ir_builder->getInt8PtrTy()); + arg_types.push_back(m_ir_builder->getInt8PtrTy()); + arg_types.push_back(m_ir_builder->getInt64Ty()); + m_compiled_function_type = FunctionType::get(m_ir_builder->getInt32Ty(), arg_types, false); + + m_execute_unknown_function = (Function *)m_module->getOrInsertFunction("execute_unknown_function", m_compiled_function_type); + m_execute_unknown_function->setCallingConv(CallingConv::X86_64_Win64); + m_execution_engine->addGlobalMapping(m_execute_unknown_function, (void *)execute_unknown_function); + + m_execute_unknown_block = (Function *)m_module->getOrInsertFunction("execute_unknown_block", m_compiled_function_type); + m_execute_unknown_block->setCallingConv(CallingConv::X86_64_Win64); + m_execution_engine->addGlobalMapping(m_execute_unknown_block, (void *)execute_unknown_block); + + if (!s_rotate_mask_inited) { + InitRotateMask(); + s_rotate_mask_inited = true; + } +} + +Compiler::~Compiler() { + delete m_execution_engine; + delete m_fpm; + delete m_ir_builder; + delete m_llvm_context; +} + +Executable Compiler::Compile(const std::string & name, const ControlFlowGraph & cfg, bool inline_all, bool generate_linkable_exits) { + auto compilation_start = std::chrono::high_resolution_clock::now(); + + m_state.cfg = &cfg; + m_state.inline_all = inline_all; + m_state.generate_linkable_exits = generate_linkable_exits; + + // Create the function + m_state.function = (Function *)m_module->getOrInsertFunction(name, m_compiled_function_type); + m_state.function->setCallingConv(CallingConv::X86_64_Win64); + auto arg_i = m_state.function->arg_begin(); + arg_i->setName("ppu_state"); + m_state.args[CompileTaskState::Args::State] = arg_i; + (++arg_i)->setName("interpreter"); + m_state.args[CompileTaskState::Args::Interpreter] = arg_i; + (++arg_i)->setName("context"); + m_state.args[CompileTaskState::Args::Context] = arg_i; + + // Create the entry block and add code to branch to the first instruction + m_ir_builder->SetInsertPoint(GetBasicBlockFromAddress(0)); + m_ir_builder->CreateBr(GetBasicBlockFromAddress(cfg.start_address)); + + // Convert each instruction in the CFG to LLVM IR + std::vector exit_instr_list; + for (auto instr_i = cfg.instruction_addresses.begin(); instr_i != cfg.instruction_addresses.end(); instr_i++) { + m_state.hit_branch_instruction = false; + m_state.current_instruction_address = *instr_i; + auto instr_bb = GetBasicBlockFromAddress(m_state.current_instruction_address); + m_ir_builder->SetInsertPoint(instr_bb); + + if (!inline_all && *instr_i != cfg.start_address) { + // Use an already compiled implementation of this block if available + auto ordinal = m_recompilation_engine.GetOrdinal(*instr_i); + if (ordinal != 0xFFFFFFFF) { + auto exit_instr_i32 = m_ir_builder->CreatePHI(m_ir_builder->getInt32Ty(), 0); + exit_instr_list.push_back(exit_instr_i32); + + auto context_i64 = m_ir_builder->CreateZExt(exit_instr_i32, m_ir_builder->getInt64Ty()); + context_i64 = m_ir_builder->CreateOr(context_i64, (u64)cfg.function_address << 32); + auto ret_i32 = IndirectCall(*instr_i, context_i64, false); + + auto switch_instr = m_ir_builder->CreateSwitch(ret_i32, GetBasicBlockFromAddress(0xFFFFFFFF)); + auto branch_i = cfg.branches.find(*instr_i); + if (branch_i != cfg.branches.end()) { + for (auto next_instr_i = branch_i->second.begin(); next_instr_i != branch_i->second.end(); next_instr_i++) { + switch_instr->addCase(m_ir_builder->getInt32(*next_instr_i), GetBasicBlockFromAddress(*next_instr_i)); + } + } + } + } + + if (instr_bb->empty()) { + u32 instr = re32(vm::get_ref(m_state.current_instruction_address)); + Decode(instr); + if (!m_state.hit_branch_instruction) { + m_ir_builder->CreateBr(GetBasicBlockFromAddress(m_state.current_instruction_address + 4)); + } + } + } + + // Generate exit logic for all empty blocks + auto default_exit_block_name = GetBasicBlockNameFromAddress(0xFFFFFFFF); + for (auto block_i = m_state.function->begin(); block_i != m_state.function->end(); block_i++) { + if (!block_i->getInstList().empty() || block_i->getName() == default_exit_block_name) { + continue; + } + + // Found an empty block + m_ir_builder->SetInsertPoint(block_i); + auto exit_instr_i32 = m_ir_builder->CreatePHI(m_ir_builder->getInt32Ty(), 0); + exit_instr_list.push_back(exit_instr_i32); + + auto instr_address = GetAddressFromBasicBlockName(block_i->getName()); + SetPc(m_ir_builder->getInt32(instr_address)); + + if (generate_linkable_exits) { + auto context_i64 = m_ir_builder->CreateZExt(exit_instr_i32, m_ir_builder->getInt64Ty()); + context_i64 = m_ir_builder->CreateOr(context_i64, (u64)cfg.function_address << 32); + auto ret_i32 = IndirectCall(instr_address, context_i64, false); + auto cmp_i1 = m_ir_builder->CreateICmpNE(ret_i32, m_ir_builder->getInt32(0)); + auto then_bb = GetBasicBlockFromAddress(instr_address, "then"); + auto merge_bb = GetBasicBlockFromAddress(instr_address, "merge"); + m_ir_builder->CreateCondBr(cmp_i1, then_bb, merge_bb); + + m_ir_builder->SetInsertPoint(then_bb); + context_i64 = m_ir_builder->CreateZExt(ret_i32, m_ir_builder->getInt64Ty()); + context_i64 = m_ir_builder->CreateOr(context_i64, (u64)cfg.function_address << 32); + m_ir_builder->CreateCall3(m_execute_unknown_block, m_state.args[CompileTaskState::Args::State], m_state.args[CompileTaskState::Args::Interpreter], context_i64); + m_ir_builder->CreateBr(merge_bb); + + m_ir_builder->SetInsertPoint(merge_bb); + m_ir_builder->CreateRet(m_ir_builder->getInt32(0)); + } else { + m_ir_builder->CreateRet(exit_instr_i32); + } + } + + // If the function has a default exit block then generate code for it + auto default_exit_bb = GetBasicBlockFromAddress(0xFFFFFFFF, "", false); + if (default_exit_bb) { + m_ir_builder->SetInsertPoint(default_exit_bb); + auto exit_instr_i32 = m_ir_builder->CreatePHI(m_ir_builder->getInt32Ty(), 0); + exit_instr_list.push_back(exit_instr_i32); + + if (generate_linkable_exits) { + auto cmp_i1 = m_ir_builder->CreateICmpNE(exit_instr_i32, m_ir_builder->getInt32(0)); + auto then_bb = GetBasicBlockFromAddress(0xFFFFFFFF, "then"); + auto merge_bb = GetBasicBlockFromAddress(0xFFFFFFFF, "merge"); + m_ir_builder->CreateCondBr(cmp_i1, then_bb, merge_bb); + + m_ir_builder->SetInsertPoint(then_bb); + auto context_i64 = m_ir_builder->CreateZExt(exit_instr_i32, m_ir_builder->getInt64Ty()); + context_i64 = m_ir_builder->CreateOr(context_i64, (u64)cfg.function_address << 32); + m_ir_builder->CreateCall3(m_execute_unknown_block, m_state.args[CompileTaskState::Args::State], m_state.args[CompileTaskState::Args::Interpreter], context_i64); + m_ir_builder->CreateBr(merge_bb); + + m_ir_builder->SetInsertPoint(merge_bb); + m_ir_builder->CreateRet(m_ir_builder->getInt32(0)); + } else { + m_ir_builder->CreateRet(exit_instr_i32); + } + } + + // Add incoming values for all exit instr PHI nodes + for (auto exit_instr_i = exit_instr_list.begin(); exit_instr_i != exit_instr_list.end(); exit_instr_i++) { + auto block = (*exit_instr_i)->getParent(); + for (auto pred_i = pred_begin(block); pred_i != pred_end(block); pred_i++) { + auto pred_address = GetAddressFromBasicBlockName((*pred_i)->getName()); + (*exit_instr_i)->addIncoming(m_ir_builder->getInt32(pred_address), *pred_i); + } + } + +#ifdef _DEBUG + m_recompilation_engine.Log() << *m_state.function; + + std::string verify; + raw_string_ostream verify_ostream(verify); + if (verifyFunction(*m_state.function, &verify_ostream)) { + m_recompilation_engine.Log() << "Verification failed: " << verify << "\n"; + } +#endif + + auto ir_build_end = std::chrono::high_resolution_clock::now(); + m_stats.ir_build_time += std::chrono::duration_cast(ir_build_end - compilation_start); + + // Optimize this function + m_fpm->run(*m_state.function); + auto optimize_end = std::chrono::high_resolution_clock::now(); + m_stats.optimization_time += std::chrono::duration_cast(optimize_end - ir_build_end); + + // Translate to machine code + MachineCodeInfo mci; + m_execution_engine->runJITOnFunction(m_state.function, &mci); + auto translate_end = std::chrono::high_resolution_clock::now(); + m_stats.translation_time += std::chrono::duration_cast(translate_end - optimize_end); + +#ifdef _DEBUG + m_recompilation_engine.Log() << "\nDisassembly:\n"; + auto disassembler = LLVMCreateDisasm(sys::getProcessTriple().c_str(), nullptr, 0, nullptr, nullptr); + for (size_t pc = 0; pc < mci.size();) { + char str[1024]; + + auto size = LLVMDisasmInstruction(disassembler, ((u8 *)mci.address()) + pc, mci.size() - pc, (uint64_t)(((u8 *)mci.address()) + pc), str, sizeof(str)); + m_recompilation_engine.Log() << fmt::Format("0x%08X: ", (u64)(((u8 *)mci.address()) + pc)) << str << '\n'; + pc += size; + } + + LLVMDisasmDispose(disassembler); +#endif + + auto compilation_end = std::chrono::high_resolution_clock::now(); + m_stats.total_time += std::chrono::duration_cast(compilation_end - compilation_start); + + return (Executable)mci.address(); +} + +void Compiler::FreeExecutable(const std::string & name) { + auto function = m_module->getFunction(name); + if (function) { + m_execution_engine->freeMachineCodeForFunction(function); + function->eraseFromParent(); + } +} + +Compiler::Stats Compiler::GetStats() { + return m_stats; +} + +void Compiler::Decode(const u32 code) { + (*PPU_instr::main_list)(this, code); +} + +void Compiler::NULL_OP() { + InterpreterCall("NULL_OP", &PPUInterpreter::NULL_OP); +} + +void Compiler::NOP() { + InterpreterCall("NOP", &PPUInterpreter::NOP); +} + +void Compiler::TDI(u32 to, u32 ra, s32 simm16) { + InterpreterCall("TDI", &PPUInterpreter::TDI, to, ra, simm16); +} + +void Compiler::TWI(u32 to, u32 ra, s32 simm16) { + InterpreterCall("TWI", &PPUInterpreter::TWI, to, ra, simm16); +} + +void Compiler::MFVSCR(u32 vd) { + auto vscr_i32 = GetVscr(); + auto vscr_i128 = m_ir_builder->CreateZExt(vscr_i32, m_ir_builder->getIntNTy(128)); + SetVr(vd, vscr_i128); +} + +void Compiler::MTVSCR(u32 vb) { + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto vscr_i32 = m_ir_builder->CreateExtractElement(vb_v4i32, m_ir_builder->getInt32(0)); + vscr_i32 = m_ir_builder->CreateAnd(vscr_i32, 0x00010001); + SetVscr(vscr_i32); +} + +void Compiler::VADDCUW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + + va_v4i32 = m_ir_builder->CreateNot(va_v4i32); + auto cmpv4i1 = m_ir_builder->CreateICmpULT(va_v4i32, vb_v4i32); + auto cmpv4i32 = m_ir_builder->CreateZExt(cmpv4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmpv4i32); +} + +void Compiler::VADDFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto sum_v4f32 = m_ir_builder->CreateFAdd(va_v4f32, vb_v4f32); + SetVr(vd, sum_v4f32); +} + +void Compiler::VADDSBS(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto sum_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_padds_b), va_v16i8, vb_v16i8); + SetVr(vd, sum_v16i8); + + // TODO: Set VSCR.SAT +} + +void Compiler::VADDSHS(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto sum_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_padds_w), va_v8i16, vb_v8i16); + SetVr(vd, sum_v8i16); + + // TODO: Set VSCR.SAT +} + +void Compiler::VADDSWS(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + + // It looks like x86 does not have an instruction to add 32 bit intergers with signed/unsigned saturation. + // To implement add with saturation, we first determine what the result would be if the operation were to cause + // an overflow. If two -ve numbers are being added and cause an overflow, the result would be 0x80000000. + // If two +ve numbers are being added and cause an overflow, the result would be 0x7FFFFFFF. Addition of a -ve + // number and a +ve number cannot cause overflow. So the result in case of an overflow is 0x7FFFFFFF + sign bit + // of any one of the operands. + auto tmp1_v4i32 = m_ir_builder->CreateLShr(va_v4i32, 31); + tmp1_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x7FFFFFFF))); + auto tmp1_v16i8 = m_ir_builder->CreateBitCast(tmp1_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + + // Next, we find if the addition can actually result in an overflow. Since an overflow can only happen if the operands + // have the same sign, we bitwise XOR both the operands. If the sign bit of the result is 0 then the operands have the + // same sign and so may cause an overflow. We invert the result so that the sign bit is 1 when the operands have the + // same sign. + auto tmp2_v4i32 = m_ir_builder->CreateXor(va_v4i32, vb_v4i32); + tmp2_v4i32 = m_ir_builder->CreateNot(tmp2_v4i32); + + // Perform the sum. + auto sum_v4i32 = m_ir_builder->CreateAdd(va_v4i32, vb_v4i32); + auto sum_v16i8 = m_ir_builder->CreateBitCast(sum_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + + // If an overflow occurs, then the sign of the sum will be different from the sign of the operands. So, we xor the + // result with one of the operands. The sign bit of the result will be 1 if the sign bit of the sum and the sign bit of the + // result is different. This result is again ANDed with tmp3 (the sign bit of tmp3 is 1 only if the operands have the same + // sign and so can cause an overflow). + auto tmp3_v4i32 = m_ir_builder->CreateXor(va_v4i32, sum_v4i32); + tmp3_v4i32 = m_ir_builder->CreateAnd(tmp2_v4i32, tmp3_v4i32); + tmp3_v4i32 = m_ir_builder->CreateAShr(tmp3_v4i32, 31); + auto tmp3_v16i8 = m_ir_builder->CreateBitCast(tmp3_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + + // tmp4 is equal to 0xFFFFFFFF if an overflow occured and 0x00000000 otherwise. + auto res_v16i8 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pblendvb), sum_v16i8, tmp1_v16i8, tmp3_v16i8); + SetVr(vd, res_v16i8); + + // TODO: Set SAT +} + +void Compiler::VADDUBM(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto sum_v16i8 = m_ir_builder->CreateAdd(va_v16i8, vb_v16i8); + SetVr(vd, sum_v16i8); +} + +void Compiler::VADDUBS(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto sum_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_paddus_b), va_v16i8, vb_v16i8); + SetVr(vd, sum_v16i8); + + // TODO: Set SAT +} + +void Compiler::VADDUHM(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto sum_v8i16 = m_ir_builder->CreateAdd(va_v8i16, vb_v8i16); + SetVr(vd, sum_v8i16); +} + +void Compiler::VADDUHS(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto sum_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_paddus_w), va_v8i16, vb_v8i16); + SetVr(vd, sum_v8i16); + + // TODO: Set SAT +} + +void Compiler::VADDUWM(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto sum_v4i32 = m_ir_builder->CreateAdd(va_v4i32, vb_v4i32); + SetVr(vd, sum_v4i32); +} + +void Compiler::VADDUWS(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto sum_v4i32 = m_ir_builder->CreateAdd(va_v4i32, vb_v4i32); + auto cmp_v4i1 = m_ir_builder->CreateICmpULT(sum_v4i32, va_v4i32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + auto res_v4i32 = m_ir_builder->CreateOr(sum_v4i32, cmp_v4i32); + SetVr(vd, res_v4i32); + + // TODO: Set SAT +} + +void Compiler::VAND(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto res_v4i32 = m_ir_builder->CreateAnd(va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VANDC(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + vb_v4i32 = m_ir_builder->CreateNot(vb_v4i32); + auto res_v4i32 = m_ir_builder->CreateAnd(va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VAVGSB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto va_v16i16 = m_ir_builder->CreateSExt(va_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); + auto vb_v16i16 = m_ir_builder->CreateSExt(vb_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); + auto sum_v16i16 = m_ir_builder->CreateAdd(va_v16i16, vb_v16i16); + sum_v16i16 = m_ir_builder->CreateAdd(sum_v16i16, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt16(1))); + auto avg_v16i16 = m_ir_builder->CreateAShr(sum_v16i16, 1); + auto avg_v16i8 = m_ir_builder->CreateTrunc(avg_v16i16, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + SetVr(vd, avg_v16i8); +} + +void Compiler::VAVGSH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto va_v8i32 = m_ir_builder->CreateSExt(va_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); + auto vb_v8i32 = m_ir_builder->CreateSExt(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); + auto sum_v8i32 = m_ir_builder->CreateAdd(va_v8i32, vb_v8i32); + sum_v8i32 = m_ir_builder->CreateAdd(sum_v8i32, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt32(1))); + auto avg_v8i32 = m_ir_builder->CreateAShr(sum_v8i32, 1); + auto avg_v8i16 = m_ir_builder->CreateTrunc(avg_v8i32, VectorType::get(m_ir_builder->getInt16Ty(), 8)); + SetVr(vd, avg_v8i16); +} + +void Compiler::VAVGSW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto va_v4i64 = m_ir_builder->CreateSExt(va_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); + auto vb_v4i64 = m_ir_builder->CreateSExt(vb_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); + auto sum_v4i64 = m_ir_builder->CreateAdd(va_v4i64, vb_v4i64); + sum_v4i64 = m_ir_builder->CreateAdd(sum_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(1))); + auto avg_v4i64 = m_ir_builder->CreateAShr(sum_v4i64, 1); + auto avg_v4i32 = m_ir_builder->CreateTrunc(avg_v4i64, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, avg_v4i32); +} + +void Compiler::VAVGUB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto avg_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pavg_b), va_v16i8, vb_v16i8); + SetVr(vd, avg_v16i8); +} + +void Compiler::VAVGUH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto avg_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pavg_w), va_v8i16, vb_v8i16); + SetVr(vd, avg_v8i16); +} + +void Compiler::VAVGUW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto va_v4i64 = m_ir_builder->CreateZExt(va_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); + auto vb_v4i64 = m_ir_builder->CreateZExt(vb_v4i32, VectorType::get(m_ir_builder->getInt64Ty(), 4)); + auto sum_v4i64 = m_ir_builder->CreateAdd(va_v4i64, vb_v4i64); + sum_v4i64 = m_ir_builder->CreateAdd(sum_v4i64, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt64(1))); + auto avg_v4i64 = m_ir_builder->CreateLShr(sum_v4i64, 1); + auto avg_v4i32 = m_ir_builder->CreateTrunc(avg_v4i64, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, avg_v4i32); +} + +void Compiler::VCFSX(u32 vd, u32 uimm5, u32 vb) { + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto res_v4f32 = m_ir_builder->CreateSIToFP(vb_v4i32, VectorType::get(m_ir_builder->getFloatTy(), 4)); + + if (uimm5) { + float scale = (float)((u64)1 << uimm5); + res_v4f32 = m_ir_builder->CreateFDiv(res_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), scale))); + } + + SetVr(vd, res_v4f32); +} + +void Compiler::VCFUX(u32 vd, u32 uimm5, u32 vb) { + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto res_v4f32 = m_ir_builder->CreateUIToFP(vb_v4i32, VectorType::get(m_ir_builder->getFloatTy(), 4)); + + if (uimm5) { + float scale = (float)((u64)1 << uimm5); + res_v4f32 = m_ir_builder->CreateFDiv(res_v4f32, m_ir_builder->CreateVectorSplat(4, ConstantFP::get(m_ir_builder->getFloatTy(), scale))); + } + + SetVr(vd, res_v4f32); +} + +void Compiler::VCMPBFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto cmp_gt_v4i1 = m_ir_builder->CreateFCmpOGT(va_v4f32, vb_v4f32); + vb_v4f32 = m_ir_builder->CreateFNeg(vb_v4f32); + auto cmp_lt_v4i1 = m_ir_builder->CreateFCmpOLT(va_v4f32, vb_v4f32); + auto cmp_gt_v4i32 = m_ir_builder->CreateZExt(cmp_gt_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + auto cmp_lt_v4i32 = m_ir_builder->CreateZExt(cmp_lt_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + cmp_gt_v4i32 = m_ir_builder->CreateShl(cmp_gt_v4i32, 31); + cmp_lt_v4i32 = m_ir_builder->CreateShl(cmp_lt_v4i32, 30); + auto res_v4i32 = m_ir_builder->CreateOr(cmp_gt_v4i32, cmp_lt_v4i32); + SetVr(vd, res_v4i32); + + // TODO: Implement NJ mode +} + +void Compiler::VCMPBFP_(u32 vd, u32 va, u32 vb) { + VCMPBFP(vd, va, vb); + + auto vd_v16i8 = GetVrAsIntVec(vd, 8); + u32 mask_v16i32[16] = {3, 7, 11, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + vd_v16i8 = m_ir_builder->CreateShuffleVector(vd_v16i8, UndefValue::get(VectorType::get(m_ir_builder->getInt8Ty(), 16)), ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); + auto vd_v4i32 = m_ir_builder->CreateBitCast(vd_v16i8, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + auto vd_mask_i32 = m_ir_builder->CreateExtractElement(vd_v4i32, m_ir_builder->getInt32(0)); + auto cmp_i1 = m_ir_builder->CreateICmpEQ(vd_mask_i32, m_ir_builder->getInt32(0)); + SetCrField(6, nullptr, nullptr, cmp_i1, nullptr); +} + +void Compiler::VCMPEQFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto cmp_v4i1 = m_ir_builder->CreateFCmpOEQ(va_v4f32, vb_v4f32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmp_v4i32); +} + +void Compiler::VCMPEQFP_(u32 vd, u32 va, u32 vb) { + VCMPEQFP(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPEQUB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto cmp_v16i1 = m_ir_builder->CreateICmpEQ(va_v16i8, vb_v16i8); + auto cmp_v16i8 = m_ir_builder->CreateSExt(cmp_v16i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + SetVr(vd, cmp_v16i8); +} + +void Compiler::VCMPEQUB_(u32 vd, u32 va, u32 vb) { + VCMPEQUB(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPEQUH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto cmp_v8i1 = m_ir_builder->CreateICmpEQ(va_v8i16, vb_v8i16); + auto cmp_v8i16 = m_ir_builder->CreateSExt(cmp_v8i1, VectorType::get(m_ir_builder->getInt16Ty(), 8)); + SetVr(vd, cmp_v8i16); +} + +void Compiler::VCMPEQUH_(u32 vd, u32 va, u32 vb) { + VCMPEQUH(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPEQUW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto cmp_v4i1 = m_ir_builder->CreateICmpEQ(va_v4i32, vb_v4i32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmp_v4i32); +} + +void Compiler::VCMPEQUW_(u32 vd, u32 va, u32 vb) { + VCMPEQUW(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGEFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto cmp_v4i1 = m_ir_builder->CreateFCmpOGE(va_v4f32, vb_v4f32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmp_v4i32); +} + +void Compiler::VCMPGEFP_(u32 vd, u32 va, u32 vb) { + VCMPGEFP(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGTFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto cmp_v4i1 = m_ir_builder->CreateFCmpOGT(va_v4f32, vb_v4f32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmp_v4i32); +} + +void Compiler::VCMPGTFP_(u32 vd, u32 va, u32 vb) { + VCMPGTFP(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGTSB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto cmp_v16i1 = m_ir_builder->CreateICmpSGT(va_v16i8, vb_v16i8); + auto cmp_v16i8 = m_ir_builder->CreateSExt(cmp_v16i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + SetVr(vd, cmp_v16i8); +} + +void Compiler::VCMPGTSB_(u32 vd, u32 va, u32 vb) { + VCMPGTSB(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGTSH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto cmp_v8i1 = m_ir_builder->CreateICmpSGT(va_v8i16, vb_v8i16); + auto cmp_v8i16 = m_ir_builder->CreateSExt(cmp_v8i1, VectorType::get(m_ir_builder->getInt16Ty(), 8)); + SetVr(vd, cmp_v8i16); +} + +void Compiler::VCMPGTSH_(u32 vd, u32 va, u32 vb) { + VCMPGTSH(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGTSW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto cmp_v4i1 = m_ir_builder->CreateICmpSGT(va_v4i32, vb_v4i32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmp_v4i32); +} + +void Compiler::VCMPGTSW_(u32 vd, u32 va, u32 vb) { + VCMPGTSW(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGTUB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto cmp_v16i1 = m_ir_builder->CreateICmpUGT(va_v16i8, vb_v16i8); + auto cmp_v16i8 = m_ir_builder->CreateSExt(cmp_v16i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + SetVr(vd, cmp_v16i8); +} + +void Compiler::VCMPGTUB_(u32 vd, u32 va, u32 vb) { + VCMPGTUB(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGTUH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto cmp_v8i1 = m_ir_builder->CreateICmpUGT(va_v8i16, vb_v8i16); + auto cmp_v8i16 = m_ir_builder->CreateSExt(cmp_v8i1, VectorType::get(m_ir_builder->getInt16Ty(), 8)); + SetVr(vd, cmp_v8i16); +} + +void Compiler::VCMPGTUH_(u32 vd, u32 va, u32 vb) { + VCMPGTUH(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCMPGTUW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto cmp_v4i1 = m_ir_builder->CreateICmpUGT(va_v4i32, vb_v4i32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmp_v4i32); +} + +void Compiler::VCMPGTUW_(u32 vd, u32 va, u32 vb) { + VCMPGTUW(vd, va, vb); + SetCr6AfterVectorCompare(vd); +} + +void Compiler::VCTSXS(u32 vd, u32 uimm5, u32 vb) { + InterpreterCall("VCTSXS", &PPUInterpreter::VCTSXS, vd, uimm5, vb); +} + +void Compiler::VCTUXS(u32 vd, u32 uimm5, u32 vb) { + InterpreterCall("VCTUXS", &PPUInterpreter::VCTUXS, vd, uimm5, vb); +} + +void Compiler::VEXPTEFP(u32 vd, u32 vb) { + InterpreterCall("VEXPTEFP", &PPUInterpreter::VEXPTEFP, vd, vb); +} + +void Compiler::VLOGEFP(u32 vd, u32 vb) { + InterpreterCall("VLOGEFP", &PPUInterpreter::VLOGEFP, vd, vb); +} + +void Compiler::VMADDFP(u32 vd, u32 va, u32 vc, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto vc_v4f32 = GetVrAsFloatVec(vc); + auto res_v4f32 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, VectorType::get(m_ir_builder->getFloatTy(), 4)), va_v4f32, vc_v4f32, vb_v4f32); + SetVr(vd, res_v4f32); +} + +void Compiler::VMAXFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto res_v4f32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_max_ps), va_v4f32, vb_v4f32); + SetVr(vd, res_v4f32); +} + +void Compiler::VMAXSB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxsb), va_v16i8, vb_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VMAXSH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmaxs_w), va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VMAXSW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxsd), va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VMAXUB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmaxu_b), va_v16i8, vb_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VMAXUH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxuw), va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VMAXUW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pmaxud), va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VMHADDSHS(u32 vd, u32 va, u32 vb, u32 vc) { + InterpreterCall("VMHADDSHS", &PPUInterpreter::VMHADDSHS, vd, va, vb, vc); +} + +void Compiler::VMHRADDSHS(u32 vd, u32 va, u32 vb, u32 vc) { + InterpreterCall("VMHRADDSHS", &PPUInterpreter::VMHRADDSHS, vd, va, vb, vc); +} + +void Compiler::VMINFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto res_v4f32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_min_ps), va_v4f32, vb_v4f32); + SetVr(vd, res_v4f32); +} + +void Compiler::VMINSB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminsb), va_v16i8, vb_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VMINSH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmins_w), va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VMINSW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminsd), va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VMINUB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto res_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pminu_b), va_v16i8, vb_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VMINUH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto res_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminuw), va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VMINUW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto res_v4i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pminud), va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VMLADDUHM(u32 vd, u32 va, u32 vb, u32 vc) { + InterpreterCall("VMLADDUHM", &PPUInterpreter::VMLADDUHM, vd, va, vb, vc); +} + +void Compiler::VMRGHB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + u32 mask_v16i32[16] = {24, 8, 25, 9, 26, 10, 27, 11, 28, 12, 29, 13, 30, 14, 31, 15}; + auto vd_v16i8 = m_ir_builder->CreateShuffleVector(va_v16i8, vb_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); + SetVr(vd, vd_v16i8); +} + +void Compiler::VMRGHH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + u32 mask_v8i32[8] = {12, 4, 13, 5, 14, 6, 15, 7}; + auto vd_v8i16 = m_ir_builder->CreateShuffleVector(va_v8i16, vb_v8i16, ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); + SetVr(vd, vd_v8i16); +} + +void Compiler::VMRGHW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + u32 mask_v4i32[4] = {6, 2, 7, 3}; + auto vd_v4i32 = m_ir_builder->CreateShuffleVector(va_v4i32, vb_v4i32, ConstantDataVector::get(m_ir_builder->getContext(), mask_v4i32)); + SetVr(vd, vd_v4i32); +} + +void Compiler::VMRGLB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + u32 mask_v16i32[16] = {16, 0, 17, 1, 18, 2, 19, 3, 20, 4, 21, 5, 22, 6, 23, 7}; + auto vd_v16i8 = m_ir_builder->CreateShuffleVector(va_v16i8, vb_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); + SetVr(vd, vd_v16i8); +} + +void Compiler::VMRGLH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + u32 mask_v8i32[8] = {8, 0, 9, 1, 10, 2, 11, 3}; + auto vd_v8i16 = m_ir_builder->CreateShuffleVector(va_v8i16, vb_v8i16, ConstantDataVector::get(m_ir_builder->getContext(), mask_v8i32)); + SetVr(vd, vd_v8i16); +} + +void Compiler::VMRGLW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + u32 mask_v4i32[4] = {4, 0, 5, 1}; + auto vd_v4i32 = m_ir_builder->CreateShuffleVector(va_v4i32, vb_v4i32, ConstantDataVector::get(m_ir_builder->getContext(), mask_v4i32)); + SetVr(vd, vd_v4i32); +} + +void Compiler::VMSUMMBM(u32 vd, u32 va, u32 vb, u32 vc) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto va_v16i16 = m_ir_builder->CreateSExt(va_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); + auto vb_v16i16 = m_ir_builder->CreateZExt(vb_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); + auto tmp_v16i16 = m_ir_builder->CreateMul(va_v16i16, vb_v16i16); + + auto undef_v16i16 = UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 16)); + u32 mask1_v4i32[4] = {0, 4, 8, 12}; + auto tmp1_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); + auto tmp1_v4i32 = m_ir_builder->CreateSExt(tmp1_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + u32 mask2_v4i32[4] = {1, 5, 9, 13}; + auto tmp2_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); + auto tmp2_v4i32 = m_ir_builder->CreateSExt(tmp2_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + u32 mask3_v4i32[4] = {2, 6, 10, 14}; + auto tmp3_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask3_v4i32)); + auto tmp3_v4i32 = m_ir_builder->CreateSExt(tmp3_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + u32 mask4_v4i32[4] = {3, 7, 11, 15}; + auto tmp4_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask4_v4i32)); + auto tmp4_v4i32 = m_ir_builder->CreateSExt(tmp4_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + + auto vc_v4i32 = GetVrAsIntVec(vc, 32); + auto res_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, tmp2_v4i32); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp3_v4i32); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp4_v4i32); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); + + SetVr(vd, res_v4i32); + + // TODO: Try to optimize with horizontal add +} + +void Compiler::VMSUMSHM(u32 vd, u32 va, u32 vb, u32 vc) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto vc_v4i32 = GetVrAsIntVec(vc, 32); + auto res_v4i32 = (Value *)m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmadd_wd), va_v8i16, vb_v8i16); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VMSUMSHS(u32 vd, u32 va, u32 vb, u32 vc) { + InterpreterCall("VMSUMSHS", &PPUInterpreter::VMSUMSHS, vd, va, vb, vc); +} + +void Compiler::VMSUMUBM(u32 vd, u32 va, u32 vb, u32 vc) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto va_v16i16 = m_ir_builder->CreateZExt(va_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); + auto vb_v16i16 = m_ir_builder->CreateZExt(vb_v16i8, VectorType::get(m_ir_builder->getInt16Ty(), 16)); + auto tmp_v16i16 = m_ir_builder->CreateMul(va_v16i16, vb_v16i16); + + auto undef_v16i16 = UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 16)); + u32 mask1_v4i32[4] = {0, 4, 8, 12}; + auto tmp1_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); + auto tmp1_v4i32 = m_ir_builder->CreateZExt(tmp1_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + u32 mask2_v4i32[4] = {1, 5, 9, 13}; + auto tmp2_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); + auto tmp2_v4i32 = m_ir_builder->CreateZExt(tmp2_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + u32 mask3_v4i32[4] = {2, 6, 10, 14}; + auto tmp3_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask3_v4i32)); + auto tmp3_v4i32 = m_ir_builder->CreateZExt(tmp3_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + u32 mask4_v4i32[4] = {3, 7, 11, 15}; + auto tmp4_v4i16 = m_ir_builder->CreateShuffleVector(tmp_v16i16, undef_v16i16, ConstantDataVector::get(m_ir_builder->getContext(), mask4_v4i32)); + auto tmp4_v4i32 = m_ir_builder->CreateZExt(tmp4_v4i16, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + + auto vc_v4i32 = GetVrAsIntVec(vc, 32); + auto res_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, tmp2_v4i32); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp3_v4i32); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, tmp4_v4i32); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); + + SetVr(vd, res_v4i32); + + // TODO: Try to optimize with horizontal add +} + +void Compiler::VMSUMUHM(u32 vd, u32 va, u32 vb, u32 vc) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto va_v8i32 = m_ir_builder->CreateZExt(va_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); + auto vb_v8i32 = m_ir_builder->CreateZExt(vb_v8i16, VectorType::get(m_ir_builder->getInt32Ty(), 8)); + auto tmp_v8i32 = m_ir_builder->CreateMul(va_v8i32, vb_v8i32); + + auto undef_v8i32 = UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 8)); + u32 mask1_v4i32[4] = {0, 2, 4, 6}; + auto tmp1_v4i32 = m_ir_builder->CreateShuffleVector(tmp_v8i32, undef_v8i32, ConstantDataVector::get(m_ir_builder->getContext(), mask1_v4i32)); + u32 mask2_v4i32[4] = {1, 3, 5, 7}; + auto tmp2_v4i32 = m_ir_builder->CreateShuffleVector(tmp_v8i32, undef_v8i32, ConstantDataVector::get(m_ir_builder->getContext(), mask2_v4i32)); + + auto vc_v4i32 = GetVrAsIntVec(vc, 32); + auto res_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, tmp2_v4i32); + res_v4i32 = m_ir_builder->CreateAdd(res_v4i32, vc_v4i32); + + SetVr(vd, res_v4i32); + + // TODO: Try to optimize with horizontal add +} + +void Compiler::VMSUMUHS(u32 vd, u32 va, u32 vb, u32 vc) { + InterpreterCall("VMSUMUHS", &PPUInterpreter::VMSUMUHS, vd, va, vb, vc); +} + +void Compiler::VMULESB(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULESB", &PPUInterpreter::VMULESB, vd, va, vb); +} + +void Compiler::VMULESH(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULESH", &PPUInterpreter::VMULESH, vd, va, vb); +} + +void Compiler::VMULEUB(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULEUB", &PPUInterpreter::VMULEUB, vd, va, vb); +} + +void Compiler::VMULEUH(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULEUH", &PPUInterpreter::VMULEUH, vd, va, vb); +} + +void Compiler::VMULOSB(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULOSB", &PPUInterpreter::VMULOSB, vd, va, vb); +} + +void Compiler::VMULOSH(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULOSH", &PPUInterpreter::VMULOSH, vd, va, vb); +} + +void Compiler::VMULOUB(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULOUB", &PPUInterpreter::VMULOUB, vd, va, vb); +} + +void Compiler::VMULOUH(u32 vd, u32 va, u32 vb) { + InterpreterCall("VMULOUH", &PPUInterpreter::VMULOUH, vd, va, vb); +} + +void Compiler::VNMSUBFP(u32 vd, u32 va, u32 vc, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto vc_v4f32 = GetVrAsFloatVec(vc); + vc_v4f32 = m_ir_builder->CreateFNeg(vc_v4f32); + auto res_v4f32 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, VectorType::get(m_ir_builder->getFloatTy(), 4)), va_v4f32, vc_v4f32, vb_v4f32); + SetVr(vd, res_v4f32); +} + +void Compiler::VNOR(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto res_v8i16 = m_ir_builder->CreateOr(va_v8i16, vb_v8i16); + res_v8i16 = m_ir_builder->CreateNot(res_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VOR(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto res_v8i16 = m_ir_builder->CreateOr(va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VPERM(u32 vd, u32 va, u32 vb, u32 vc) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto vc_v16i8 = GetVrAsIntVec(vc, 8); + + auto thrity_one_v16i8 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(31)); + vc_v16i8 = m_ir_builder->CreateAnd(vc_v16i8, thrity_one_v16i8); + + auto fifteen_v16i8 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(15)); + auto vc_le15_v16i8 = m_ir_builder->CreateSub(fifteen_v16i8, vc_v16i8); + auto res_va_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_ssse3_pshuf_b_128), va_v16i8, vc_le15_v16i8); + + auto vc_gt15_v16i8 = m_ir_builder->CreateSub(thrity_one_v16i8, vc_v16i8); + auto cmp_i1 = m_ir_builder->CreateICmpUGT(vc_gt15_v16i8, fifteen_v16i8); + auto cmp_i8 = m_ir_builder->CreateSExt(cmp_i1, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + vc_gt15_v16i8 = m_ir_builder->CreateOr(cmp_i8, vc_gt15_v16i8); + auto res_vb_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_ssse3_pshuf_b_128), vb_v16i8, vc_gt15_v16i8); + + auto res_v16i8 = m_ir_builder->CreateOr(res_vb_v16i8, res_va_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VPKPX(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKPX", &PPUInterpreter::VPKPX, vd, va, vb); +} + +void Compiler::VPKSHSS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKSHSS", &PPUInterpreter::VPKSHSS, vd, va, vb); +} + +void Compiler::VPKSHUS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKSHUS", &PPUInterpreter::VPKSHUS, vd, va, vb); +} + +void Compiler::VPKSWSS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKSWSS", &PPUInterpreter::VPKSWSS, vd, va, vb); +} + +void Compiler::VPKSWUS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKSWUS", &PPUInterpreter::VPKSWUS, vd, va, vb); +} + +void Compiler::VPKUHUM(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKUHUM", &PPUInterpreter::VPKUHUM, vd, va, vb); +} + +void Compiler::VPKUHUS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKUHUS", &PPUInterpreter::VPKUHUS, vd, va, vb); +} + +void Compiler::VPKUWUM(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKUWUM", &PPUInterpreter::VPKUWUM, vd, va, vb); +} + +void Compiler::VPKUWUS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VPKUWUS", &PPUInterpreter::VPKUWUS, vd, va, vb); +} + +void Compiler::VREFP(u32 vd, u32 vb) { + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto res_v4f32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse_rcp_ps), vb_v4f32); + SetVr(vd, res_v4f32); +} + +void Compiler::VRFIM(u32 vd, u32 vb) { + InterpreterCall("VRFIM", &PPUInterpreter::VRFIM, vd, vb); +} + +void Compiler::VRFIN(u32 vd, u32 vb) { + InterpreterCall("VRFIN", &PPUInterpreter::VRFIN, vd, vb); +} + +void Compiler::VRFIP(u32 vd, u32 vb) { + InterpreterCall("VRFIP", &PPUInterpreter::VRFIP, vd, vb); +} + +void Compiler::VRFIZ(u32 vd, u32 vb) { + InterpreterCall("VRFIZ", &PPUInterpreter::VRFIZ, vd, vb); +} + +void Compiler::VRLB(u32 vd, u32 va, u32 vb) { + InterpreterCall("VRLB", &PPUInterpreter::VRLB, vd, va, vb); +} + +void Compiler::VRLH(u32 vd, u32 va, u32 vb) { + InterpreterCall("VRLH", &PPUInterpreter::VRLH, vd, va, vb); +} + +void Compiler::VRLW(u32 vd, u32 va, u32 vb) { + InterpreterCall("VRLW", &PPUInterpreter::VRLW, vd, va, vb); +} + +void Compiler::VRSQRTEFP(u32 vd, u32 vb) { + InterpreterCall("VRSQRTEFP", &PPUInterpreter::VRSQRTEFP, vd, vb); +} + +void Compiler::VSEL(u32 vd, u32 va, u32 vb, u32 vc) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto vc_v4i32 = GetVrAsIntVec(vc, 32); + vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, vc_v4i32); + vc_v4i32 = m_ir_builder->CreateNot(vc_v4i32); + va_v4i32 = m_ir_builder->CreateAnd(va_v4i32, vc_v4i32); + auto vd_v4i32 = m_ir_builder->CreateOr(va_v4i32, vb_v4i32); + SetVr(vd, vd_v4i32); +} + +void Compiler::VSL(u32 vd, u32 va, u32 vb) { + auto va_i128 = GetVr(va); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); + sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x7); + auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); + va_i128 = m_ir_builder->CreateShl(va_i128, sh_i128); + SetVr(vd, va_i128); +} + +void Compiler::VSLB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + vb_v16i8 = m_ir_builder->CreateAnd(vb_v16i8, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(0x7))); + auto res_v16i8 = m_ir_builder->CreateShl(va_v16i8, vb_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VSLDOI(u32 vd, u32 va, u32 vb, u32 sh) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + sh = 16 - sh; + u32 mask_v16i32[16] = {sh, sh + 1, sh + 2, sh + 3, sh + 4, sh + 5, sh + 6, sh + 7, sh + 8, sh + 9, sh + 10, sh + 11, sh + 12, sh + 13, sh + 14, sh + 15}; + auto vd_v16i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, va_v16i8, ConstantDataVector::get(m_ir_builder->getContext(), mask_v16i32)); + SetVr(vd, vd_v16i8); +} + +void Compiler::VSLH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + vb_v8i16 = m_ir_builder->CreateAnd(vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xF))); + auto res_v8i16 = m_ir_builder->CreateShl(va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VSLO(u32 vd, u32 va, u32 vb) { + auto va_i128 = GetVr(va); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); + sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x78); + auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); + va_i128 = m_ir_builder->CreateShl(va_i128, sh_i128); + SetVr(vd, va_i128); +} + +void Compiler::VSLW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x1F))); + auto res_v4i32 = m_ir_builder->CreateShl(va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VSPLTB(u32 vd, u32 uimm5, u32 vb) { + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto undef_v16i8 = UndefValue::get(VectorType::get(m_ir_builder->getInt8Ty(), 16)); + auto mask_v16i32 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt32(15 - uimm5)); + auto res_v16i8 = m_ir_builder->CreateShuffleVector(vb_v16i8, undef_v16i8, mask_v16i32); + SetVr(vd, res_v16i8); +} + +void Compiler::VSPLTH(u32 vd, u32 uimm5, u32 vb) { + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto undef_v8i16 = UndefValue::get(VectorType::get(m_ir_builder->getInt16Ty(), 8)); + auto mask_v8i32 = m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt32(7 - uimm5)); + auto res_v8i16 = m_ir_builder->CreateShuffleVector(vb_v8i16, undef_v8i16, mask_v8i32); + SetVr(vd, res_v8i16); +} + +void Compiler::VSPLTISB(u32 vd, s32 simm5) { + auto vd_v16i8 = m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8((s8)simm5)); + SetVr(vd, vd_v16i8); +} + +void Compiler::VSPLTISH(u32 vd, s32 simm5) { + auto vd_v8i16 = m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16((s16)simm5)); + SetVr(vd, vd_v8i16); +} + +void Compiler::VSPLTISW(u32 vd, s32 simm5) { + auto vd_v4i32 = m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32((s32)simm5)); + SetVr(vd, vd_v4i32); +} + +void Compiler::VSPLTW(u32 vd, u32 uimm5, u32 vb) { + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto undef_v4i32 = UndefValue::get(VectorType::get(m_ir_builder->getInt32Ty(), 4)); + auto mask_v4i32 = m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(3 - uimm5)); + auto res_v4i32 = m_ir_builder->CreateShuffleVector(vb_v4i32, undef_v4i32, mask_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VSR(u32 vd, u32 va, u32 vb) { + auto va_i128 = GetVr(va); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); + sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x7); + auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); + va_i128 = m_ir_builder->CreateLShr(va_i128, sh_i128); + SetVr(vd, va_i128); +} + +void Compiler::VSRAB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + vb_v16i8 = m_ir_builder->CreateAnd(vb_v16i8, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(0x7))); + auto res_v16i8 = m_ir_builder->CreateAShr(va_v16i8, vb_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VSRAH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + vb_v8i16 = m_ir_builder->CreateAnd(vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xF))); + auto res_v8i16 = m_ir_builder->CreateAShr(va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VSRAW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x1F))); + auto res_v4i32 = m_ir_builder->CreateAShr(va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VSRB(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + vb_v16i8 = m_ir_builder->CreateAnd(vb_v16i8, m_ir_builder->CreateVectorSplat(16, m_ir_builder->getInt8(0x7))); + auto res_v16i8 = m_ir_builder->CreateLShr(va_v16i8, vb_v16i8); + SetVr(vd, res_v16i8); +} + +void Compiler::VSRH(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + vb_v8i16 = m_ir_builder->CreateAnd(vb_v8i16, m_ir_builder->CreateVectorSplat(8, m_ir_builder->getInt16(0xF))); + auto res_v8i16 = m_ir_builder->CreateLShr(va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::VSRO(u32 vd, u32 va, u32 vb) { + auto va_i128 = GetVr(va); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto sh_i8 = m_ir_builder->CreateExtractElement(vb_v16i8, m_ir_builder->getInt8(0)); + sh_i8 = m_ir_builder->CreateAnd(sh_i8, 0x78); + auto sh_i128 = m_ir_builder->CreateZExt(sh_i8, m_ir_builder->getIntNTy(128)); + va_i128 = m_ir_builder->CreateLShr(va_i128, sh_i128); + SetVr(vd, va_i128); +} + +void Compiler::VSRW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + vb_v4i32 = m_ir_builder->CreateAnd(vb_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x1F))); + auto res_v4i32 = m_ir_builder->CreateLShr(va_v4i32, vb_v4i32); + SetVr(vd, res_v4i32); +} + +void Compiler::VSUBCUW(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + + auto cmpv4i1 = m_ir_builder->CreateICmpUGE(va_v4i32, vb_v4i32); + auto cmpv4i32 = m_ir_builder->CreateZExt(cmpv4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + SetVr(vd, cmpv4i32); +} + +void Compiler::VSUBFP(u32 vd, u32 va, u32 vb) { + auto va_v4f32 = GetVrAsFloatVec(va); + auto vb_v4f32 = GetVrAsFloatVec(vb); + auto diff_v4f32 = m_ir_builder->CreateFSub(va_v4f32, vb_v4f32); + SetVr(vd, diff_v4f32); +} + +void Compiler::VSUBSBS(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto diff_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubs_b), va_v16i8, vb_v16i8); + SetVr(vd, diff_v16i8); + + // TODO: Set VSCR.SAT +} + +void Compiler::VSUBSHS(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto diff_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubs_w), va_v8i16, vb_v8i16); + SetVr(vd, diff_v8i16); + + // TODO: Set VSCR.SAT +} + +void Compiler::VSUBSWS(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + + // See the comments for VADDSWS for a detailed description of how this works + + // Find the result in case of an overflow + auto tmp1_v4i32 = m_ir_builder->CreateLShr(va_v4i32, 31); + tmp1_v4i32 = m_ir_builder->CreateAdd(tmp1_v4i32, m_ir_builder->CreateVectorSplat(4, m_ir_builder->getInt32(0x7FFFFFFF))); + auto tmp1_v16i8 = m_ir_builder->CreateBitCast(tmp1_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + + // Find the elements that can overflow (elements with opposite sign bits) + auto tmp2_v4i32 = m_ir_builder->CreateXor(va_v4i32, vb_v4i32); + + // Perform the sub + auto diff_v4i32 = m_ir_builder->CreateSub(va_v4i32, vb_v4i32); + auto diff_v16i8 = m_ir_builder->CreateBitCast(diff_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + + // Find the elements that overflowed + auto tmp3_v4i32 = m_ir_builder->CreateXor(va_v4i32, diff_v4i32); + tmp3_v4i32 = m_ir_builder->CreateAnd(tmp2_v4i32, tmp3_v4i32); + tmp3_v4i32 = m_ir_builder->CreateAShr(tmp3_v4i32, 31); + auto tmp3_v16i8 = m_ir_builder->CreateBitCast(tmp3_v4i32, VectorType::get(m_ir_builder->getInt8Ty(), 16)); + + // tmp4 is equal to 0xFFFFFFFF if an overflow occured and 0x00000000 otherwise. + auto res_v16i8 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse41_pblendvb), diff_v16i8, tmp1_v16i8, tmp3_v16i8); + SetVr(vd, res_v16i8); + + // TODO: Set SAT +} + +void Compiler::VSUBUBM(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto diff_v16i8 = m_ir_builder->CreateSub(va_v16i8, vb_v16i8); + SetVr(vd, diff_v16i8); +} + +void Compiler::VSUBUBS(u32 vd, u32 va, u32 vb) { + auto va_v16i8 = GetVrAsIntVec(va, 8); + auto vb_v16i8 = GetVrAsIntVec(vb, 8); + auto diff_v16i8 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubus_b), va_v16i8, vb_v16i8); + SetVr(vd, diff_v16i8); + + // TODO: Set SAT +} + +void Compiler::VSUBUHM(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto diff_v8i16 = m_ir_builder->CreateSub(va_v8i16, vb_v8i16); + SetVr(vd, diff_v8i16); +} + +void Compiler::VSUBUHS(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto diff_v8i16 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_psubus_w), va_v8i16, vb_v8i16); + SetVr(vd, diff_v8i16); + + // TODO: Set SAT +} + +void Compiler::VSUBUWM(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto diff_v4i32 = m_ir_builder->CreateSub(va_v4i32, vb_v4i32); + SetVr(vd, diff_v4i32); +} + +void Compiler::VSUBUWS(u32 vd, u32 va, u32 vb) { + auto va_v4i32 = GetVrAsIntVec(va, 32); + auto vb_v4i32 = GetVrAsIntVec(vb, 32); + auto diff_v4i32 = m_ir_builder->CreateSub(va_v4i32, vb_v4i32); + auto cmp_v4i1 = m_ir_builder->CreateICmpULE(diff_v4i32, va_v4i32); + auto cmp_v4i32 = m_ir_builder->CreateSExt(cmp_v4i1, VectorType::get(m_ir_builder->getInt32Ty(), 4)); + auto res_v4i32 = m_ir_builder->CreateAnd(diff_v4i32, cmp_v4i32); + SetVr(vd, res_v4i32); + + // TODO: Set SAT +} + +void Compiler::VSUMSWS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VSUMSWS", &PPUInterpreter::VSUMSWS, vd, va, vb); +} + +void Compiler::VSUM2SWS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VSUM2SWS", &PPUInterpreter::VSUM2SWS, vd, va, vb); +} + +void Compiler::VSUM4SBS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VSUM4SBS", &PPUInterpreter::VSUM4SBS, vd, va, vb); +} + +void Compiler::VSUM4SHS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VSUM4SHS", &PPUInterpreter::VSUM4SHS, vd, va, vb); +} + +void Compiler::VSUM4UBS(u32 vd, u32 va, u32 vb) { + InterpreterCall("VSUM4UBS", &PPUInterpreter::VSUM4UBS, vd, va, vb); +} + +void Compiler::VUPKHPX(u32 vd, u32 vb) { + InterpreterCall("VUPKHPX", &PPUInterpreter::VUPKHPX, vd, vb); +} + +void Compiler::VUPKHSB(u32 vd, u32 vb) { + InterpreterCall("VUPKHSB", &PPUInterpreter::VUPKHSB, vd, vb); +} + +void Compiler::VUPKHSH(u32 vd, u32 vb) { + InterpreterCall("VUPKHSH", &PPUInterpreter::VUPKHSH, vd, vb); +} + +void Compiler::VUPKLPX(u32 vd, u32 vb) { + InterpreterCall("VUPKLPX", &PPUInterpreter::VUPKLPX, vd, vb); +} + +void Compiler::VUPKLSB(u32 vd, u32 vb) { + InterpreterCall("VUPKLSB", &PPUInterpreter::VUPKLSB, vd, vb); +} + +void Compiler::VUPKLSH(u32 vd, u32 vb) { + InterpreterCall("VUPKLSH", &PPUInterpreter::VUPKLSH, vd, vb); +} + +void Compiler::VXOR(u32 vd, u32 va, u32 vb) { + auto va_v8i16 = GetVrAsIntVec(va, 16); + auto vb_v8i16 = GetVrAsIntVec(vb, 16); + auto res_v8i16 = m_ir_builder->CreateXor(va_v8i16, vb_v8i16); + SetVr(vd, res_v8i16); +} + +void Compiler::MULLI(u32 rd, u32 ra, s32 simm16) { + auto ra_i64 = GetGpr(ra); + auto res_i64 = m_ir_builder->CreateMul(ra_i64, m_ir_builder->getInt64((s64)simm16)); + SetGpr(rd, res_i64); + //InterpreterCall("MULLI", &PPUInterpreter::MULLI, rd, ra, simm16); +} + +void Compiler::SUBFIC(u32 rd, u32 ra, s32 simm16) { + auto ra_i64 = GetGpr(ra); + ra_i64 = m_ir_builder->CreateNeg(ra_i64); + auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, m_ir_builder->getInt64((s64)simm16)); + auto diff_i64 = m_ir_builder->CreateExtractValue(res_s, {0}); + auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, {1}); + SetGpr(rd, diff_i64); + SetXerCa(carry_i1); + //InterpreterCall("SUBFIC", &PPUInterpreter::SUBFIC, rd, ra, simm16); +} + +void Compiler::CMPLI(u32 crfd, u32 l, u32 ra, u32 uimm16) { + Value * ra_i64; + if (l == 0) { + ra_i64 = m_ir_builder->CreateZExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); + } else { + ra_i64 = GetGpr(ra); + } + + SetCrFieldUnsignedCmp(crfd, ra_i64, m_ir_builder->getInt64(uimm16)); + //InterpreterCall("CMPLI", &PPUInterpreter::CMPLI, crfd, l, ra, uimm16); +} + +void Compiler::CMPI(u32 crfd, u32 l, u32 ra, s32 simm16) { + Value * ra_i64; + if (l == 0) { + ra_i64 = m_ir_builder->CreateSExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); + } else { + ra_i64 = GetGpr(ra); + } + + SetCrFieldSignedCmp(crfd, ra_i64, m_ir_builder->getInt64((s64)simm16)); + //InterpreterCall("CMPI", &PPUInterpreter::CMPI, crfd, l, ra, simm16); +} + +void Compiler::ADDIC(u32 rd, u32 ra, s32 simm16) { + auto ra_i64 = GetGpr(ra); + auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), m_ir_builder->getInt64((s64)simm16), ra_i64); + auto sum_i64 = m_ir_builder->CreateExtractValue(res_s, {0}); + auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, {1}); + SetGpr(rd, sum_i64); + SetXerCa(carry_i1); + //InterpreterCall("ADDIC", &PPUInterpreter::ADDIC, rd, ra, simm16); +} + +void Compiler::ADDIC_(u32 rd, u32 ra, s32 simm16) { + ADDIC(rd, ra, simm16); + SetCrFieldSignedCmp(0, GetGpr(rd), m_ir_builder->getInt64(0)); + //InterpreterCall("ADDIC_", &PPUInterpreter::ADDIC_, rd, ra, simm16); +} + +void Compiler::ADDI(u32 rd, u32 ra, s32 simm16) { + if (ra == 0) { + SetGpr(rd, m_ir_builder->getInt64((s64)simm16)); + } else { + auto ra_i64 = GetGpr(ra); + auto sum_i64 = m_ir_builder->CreateAdd(ra_i64, m_ir_builder->getInt64((s64)simm16)); + SetGpr(rd, sum_i64); + } + //InterpreterCall("ADDI", &PPUInterpreter::ADDI, rd, ra, simm16); +} + +void Compiler::ADDIS(u32 rd, u32 ra, s32 simm16) { + if (ra == 0) { + SetGpr(rd, m_ir_builder->getInt64((s64)simm16 << 16)); + } else { + auto ra_i64 = GetGpr(ra); + auto sum_i64 = m_ir_builder->CreateAdd(ra_i64, m_ir_builder->getInt64((s64)simm16 << 16)); + SetGpr(rd, sum_i64); + } + //InterpreterCall("ADDIS", &PPUInterpreter::ADDIS, rd, ra, simm16); +} + +void Compiler::BC(u32 bo, u32 bi, s32 bd, u32 aa, u32 lk) { + auto target_i64 = m_ir_builder->getInt64(branchTarget(aa ? 0 : m_state.current_instruction_address, bd)); + auto target_i32 = m_ir_builder->CreateTrunc(target_i64, m_ir_builder->getInt32Ty()); + CreateBranch(CheckBranchCondition(bo, bi), target_i32, lk ? true : false); + //m_hit_branch_instruction = true; + //SetPc(m_ir_builder->getInt32(m_current_instruction_address)); + //InterpreterCall("BC", &PPUInterpreter::BC, bo, bi, bd, aa, lk); + //SetPc(m_ir_builder->getInt32(m_current_instruction_address + 4)); + //m_ir_builder->CreateRetVoid(); +} + +void Compiler::SC(u32 sc_code) { + InterpreterCall("SC", &PPUInterpreter::SC, sc_code); +} + +void Compiler::B(s32 ll, u32 aa, u32 lk) { + auto target_i64 = m_ir_builder->getInt64(branchTarget(aa ? 0 : m_state.current_instruction_address, ll)); + auto target_i32 = m_ir_builder->CreateTrunc(target_i64, m_ir_builder->getInt32Ty()); + CreateBranch(nullptr, target_i32, lk ? true : false); + //m_hit_branch_instruction = true; + //SetPc(m_ir_builder->getInt32(m_current_instruction_address)); + //InterpreterCall("B", &PPUInterpreter::B, ll, aa, lk); + //m_ir_builder->CreateRetVoid(); +} + +void Compiler::MCRF(u32 crfd, u32 crfs) { + if (crfd != crfs) { + auto cr_i32 = GetCr(); + auto crf_i32 = GetNibble(cr_i32, crfs); + cr_i32 = SetNibble(cr_i32, crfd, crf_i32); + SetCr(cr_i32); + } + //InterpreterCall("MCRF", &PPUInterpreter::MCRF, crfd, crfs); +} + +void Compiler::BCLR(u32 bo, u32 bi, u32 bh, u32 lk) { + auto lr_i64 = GetLr(); + lr_i64 = m_ir_builder->CreateAnd(lr_i64, ~0x3ULL); + auto lr_i32 = m_ir_builder->CreateTrunc(lr_i64, m_ir_builder->getInt32Ty()); + CreateBranch(CheckBranchCondition(bo, bi), lr_i32, lk ? true : false, true); + //m_hit_branch_instruction = true; + //SetPc(m_ir_builder->getInt32(m_current_instruction_address)); + //InterpreterCall("BCLR", &PPUInterpreter::BCLR, bo, bi, bh, lk); + //SetPc(m_ir_builder->getInt32(m_current_instruction_address + 4)); + //m_ir_builder->CreateRetVoid(); +} + +void Compiler::CRNOR(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateOr(ba_i32, bb_i32); + res_i32 = m_ir_builder->CreateXor(res_i32, 1); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CRNOR", &PPUInterpreter::CRNOR, crbd, crba, crbb); +} + +void Compiler::CRANDC(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateXor(bb_i32, 1); + res_i32 = m_ir_builder->CreateAnd(ba_i32, res_i32); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CRANDC", &PPUInterpreter::CRANDC, crbd, crba, crbb); +} + +void Compiler::ISYNC() { + m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_mfence)); + //InterpreterCall("ISYNC", &PPUInterpreter::ISYNC); +} + +void Compiler::CRXOR(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateXor(ba_i32, bb_i32); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CRXOR", &PPUInterpreter::CRXOR, crbd, crba, crbb); +} + +void Compiler::DCBI(u32 ra, u32 rb) { + InterpreterCall("DCBI", &PPUInterpreter::DCBI, ra, rb); +} + +void Compiler::CRNAND(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateAnd(ba_i32, bb_i32); + res_i32 = m_ir_builder->CreateXor(res_i32, 1); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CRNAND", &PPUInterpreter::CRNAND, crbd, crba, crbb); +} + +void Compiler::CRAND(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateAnd(ba_i32, bb_i32); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CRAND", &PPUInterpreter::CRAND, crbd, crba, crbb); +} + +void Compiler::CREQV(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateXor(ba_i32, bb_i32); + res_i32 = m_ir_builder->CreateXor(res_i32, 1); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CREQV", &PPUInterpreter::CREQV, crbd, crba, crbb); +} + +void Compiler::CRORC(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateXor(bb_i32, 1); + res_i32 = m_ir_builder->CreateOr(ba_i32, res_i32); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CRORC", &PPUInterpreter::CRORC, crbd, crba, crbb); +} + +void Compiler::CROR(u32 crbd, u32 crba, u32 crbb) { + auto cr_i32 = GetCr(); + auto ba_i32 = GetBit(cr_i32, crba); + auto bb_i32 = GetBit(cr_i32, crbb); + auto res_i32 = m_ir_builder->CreateOr(ba_i32, bb_i32); + cr_i32 = SetBit(cr_i32, crbd, res_i32); + SetCr(cr_i32); + //InterpreterCall("CROR", &PPUInterpreter::CROR, crbd, crba, crbb); +} + +void Compiler::BCCTR(u32 bo, u32 bi, u32 bh, u32 lk) { + auto ctr_i64 = GetCtr(); + ctr_i64 = m_ir_builder->CreateAnd(ctr_i64, ~0x3ULL); + auto ctr_i32 = m_ir_builder->CreateTrunc(ctr_i64, m_ir_builder->getInt32Ty()); + CreateBranch(CheckBranchCondition(bo, bi), ctr_i32, lk ? true : false); + //m_hit_branch_instruction = true; + //SetPc(m_ir_builder->getInt32(m_current_instruction_address)); + //InterpreterCall("BCCTR", &PPUInterpreter::BCCTR, bo, bi, bh, lk); + //SetPc(m_ir_builder->getInt32(m_current_instruction_address + 4)); + //m_ir_builder->CreateRetVoid(); +} + +void Compiler::RLWIMI(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); + auto rsh_i64 = m_ir_builder->CreateShl(rs_i64, 32); + rs_i64 = m_ir_builder->CreateOr(rs_i64, rsh_i64); + auto ra_i64 = GetGpr(ra); + auto res_i64 = rs_i64; + if (sh) { + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); + res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + } + + u64 mask = s_rotate_mask[32 + mb][32 + me]; + res_i64 = m_ir_builder->CreateAnd(res_i64, mask); + ra_i64 = m_ir_builder->CreateAnd(ra_i64, ~mask); + res_i64 = m_ir_builder->CreateOr(res_i64, ra_i64); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLWIMI", &PPUInterpreter::RLWIMI, ra, rs, sh, mb, me, rc); +} + +void Compiler::RLWINM(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); + auto rsh_i64 = m_ir_builder->CreateShl(rs_i64, 32); + rs_i64 = m_ir_builder->CreateOr(rs_i64, rsh_i64); + auto res_i64 = rs_i64; + if (sh) { + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); + res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + } + + res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[32 + mb][32 + me]); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLWINM", &PPUInterpreter::RLWINM, ra, rs, sh, mb, me, rc); +} + +void Compiler::RLWNM(u32 ra, u32 rs, u32 rb, u32 mb, u32 me, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); + auto rsh_i64 = m_ir_builder->CreateShl(rs_i64, 32); + rs_i64 = m_ir_builder->CreateOr(rs_i64, rsh_i64); + auto rb_i64 = GetGpr(rb); + auto shl_i64 = m_ir_builder->CreateAnd(rb_i64, 0x1F); + auto shr_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(32), shl_i64); + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, shr_i64); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, shl_i64); + auto res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[32 + mb][32 + me]); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLWNM", &PPUInterpreter::RLWNM, ra, rs, rb, mb, me, rc); +} + +void Compiler::ORI(u32 ra, u32 rs, u32 uimm16) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = m_ir_builder->CreateOr(rs_i64, uimm16); + SetGpr(ra, res_i64); + //InterpreterCall("ORI", &PPUInterpreter::ORI, ra, rs, uimm16); +} + +void Compiler::ORIS(u32 ra, u32 rs, u32 uimm16) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = m_ir_builder->CreateOr(rs_i64, (u64)uimm16 << 16); + SetGpr(ra, res_i64); + //InterpreterCall("ORIS", &PPUInterpreter::ORIS, ra, rs, uimm16); +} + +void Compiler::XORI(u32 ra, u32 rs, u32 uimm16) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = m_ir_builder->CreateXor(rs_i64, uimm16); + SetGpr(ra, res_i64); + //InterpreterCall("XORI", &PPUInterpreter::XORI, ra, rs, uimm16); +} + +void Compiler::XORIS(u32 ra, u32 rs, u32 uimm16) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = m_ir_builder->CreateXor(rs_i64, (u64)uimm16 << 16); + SetGpr(ra, res_i64); + //InterpreterCall("XORIS", &PPUInterpreter::XORIS, ra, rs, uimm16); +} + +void Compiler::ANDI_(u32 ra, u32 rs, u32 uimm16) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = m_ir_builder->CreateAnd(rs_i64, uimm16); + SetGpr(ra, res_i64); + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + //InterpreterCall("ANDI_", &PPUInterpreter::ANDI_, ra, rs, uimm16); +} + +void Compiler::ANDIS_(u32 ra, u32 rs, u32 uimm16) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = m_ir_builder->CreateAnd(rs_i64, (u64)uimm16 << 16); + SetGpr(ra, res_i64); + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + //InterpreterCall("ANDIS_", &PPUInterpreter::ANDIS_, ra, rs, uimm16); +} + +void Compiler::RLDICL(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = rs_i64; + if (sh) { + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); + res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + } + + res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[mb][63]); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLDICL", &PPUInterpreter::RLDICL, ra, rs, sh, mb, rc); +} + +void Compiler::RLDICR(u32 ra, u32 rs, u32 sh, u32 me, bool rc) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = rs_i64; + if (sh) { + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); + res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + } + + res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[0][me]); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLDICR", &PPUInterpreter::RLDICR, ra, rs, sh, me, rc); +} + +void Compiler::RLDIC(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = rs_i64; + if (sh) { + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); + res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + } + + res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[mb][63 - sh]); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLDIC", &PPUInterpreter::RLDIC, ra, rs, sh, mb, rc); +} + +void Compiler::RLDIMI(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto ra_i64 = GetGpr(ra); + auto res_i64 = rs_i64; + if (sh) { + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, 64 - sh); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, sh); + res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + } + + u64 mask = s_rotate_mask[mb][63 - sh]; + res_i64 = m_ir_builder->CreateAnd(res_i64, mask); + ra_i64 = m_ir_builder->CreateAnd(ra_i64, ~mask); + res_i64 = m_ir_builder->CreateOr(res_i64, ra_i64); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLDIMI", &PPUInterpreter::RLDIMI, ra, rs, sh, mb, rc); +} + +void Compiler::RLDC_LR(u32 ra, u32 rs, u32 rb, u32 m_eb, bool is_r, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rb_i64 = GetGpr(rb); + auto shl_i64 = m_ir_builder->CreateAnd(rb_i64, 0x3F); + auto shr_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(64), shl_i64); + auto resl_i64 = m_ir_builder->CreateLShr(rs_i64, shr_i64); + auto resh_i64 = m_ir_builder->CreateShl(rs_i64, shl_i64); + auto res_i64 = m_ir_builder->CreateOr(resh_i64, resl_i64); + + if (is_r) { + res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[0][m_eb]); + } else { + res_i64 = m_ir_builder->CreateAnd(res_i64, s_rotate_mask[m_eb][63]); + } + + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("RLDC_LR", &PPUInterpreter::RLDC_LR, ra, rs, rb, m_eb, is_r, rc); +} + +void Compiler::CMP(u32 crfd, u32 l, u32 ra, u32 rb) { + Value * ra_i64; + Value * rb_i64; + if (l == 0) { + ra_i64 = m_ir_builder->CreateSExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); + rb_i64 = m_ir_builder->CreateSExt(GetGpr(rb, 32), m_ir_builder->getInt64Ty()); + } else { + ra_i64 = GetGpr(ra); + rb_i64 = GetGpr(rb); + } + + SetCrFieldSignedCmp(crfd, ra_i64, rb_i64); + //InterpreterCall("CMP", &PPUInterpreter::CMP, crfd, l, ra, rb); +} + +void Compiler::TW(u32 to, u32 ra, u32 rb) { + InterpreterCall("TW", &PPUInterpreter::TW, to, ra, rb); +} + +void Compiler::LVSL(u32 vd, u32 ra, u32 rb) { + static const u128 s_lvsl_values[] = { + {0x08090A0B0C0D0E0F, 0x0001020304050607}, + {0x090A0B0C0D0E0F10, 0x0102030405060708}, + {0x0A0B0C0D0E0F1011, 0x0203040506070809}, + {0x0B0C0D0E0F101112, 0x030405060708090A}, + {0x0C0D0E0F10111213, 0x0405060708090A0B}, + {0x0D0E0F1011121314, 0x05060708090A0B0C}, + {0x0E0F101112131415, 0x060708090A0B0C0D}, + {0x0F10111213141516, 0x0708090A0B0C0D0E}, + {0x1011121314151617, 0x08090A0B0C0D0E0F}, + {0x1112131415161718, 0x090A0B0C0D0E0F10}, + {0x1213141516171819, 0x0A0B0C0D0E0F1011}, + {0x131415161718191A, 0x0B0C0D0E0F101112}, + {0x1415161718191A1B, 0x0C0D0E0F10111213}, + {0x15161718191A1B1C, 0x0D0E0F1011121314}, + {0x161718191A1B1C1D, 0x0E0F101112131415}, + {0x1718191A1B1C1D1E, 0x0F10111213141516}, + }; + + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xF); + auto lvsl_values_v16i8_ptr = m_ir_builder->CreateIntToPtr(m_ir_builder->getInt64((u64)s_lvsl_values), VectorType::get(m_ir_builder->getInt8Ty(), 16)->getPointerTo()); + lvsl_values_v16i8_ptr = m_ir_builder->CreateGEP(lvsl_values_v16i8_ptr, index_i64); + auto val_v16i8 = m_ir_builder->CreateAlignedLoad(lvsl_values_v16i8_ptr, 16); + SetVr(vd, val_v16i8); + + //InterpreterCall("LVSL", &PPUInterpreter::LVSL, vd, ra, rb); +} + +void Compiler::LVEBX(u32 vd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto val_i8 = ReadMemory(addr_i64, 8); + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); + index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(15), index_i64); + auto vd_v16i8 = GetVrAsIntVec(vd, 8); + vd_v16i8 = m_ir_builder->CreateInsertElement(vd_v16i8, val_i8, index_i64); + SetVr(vd, vd_v16i8); + + //InterpreterCall("LVEBX", &PPUInterpreter::LVEBX, vd, ra, rb); +} + +void Compiler::SUBFC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + ra_i64 = m_ir_builder->CreateNeg(ra_i64); + auto rb_i64 = GetGpr(rb); + auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, rb_i64); + auto diff_i64 = m_ir_builder->CreateExtractValue(res_s, {0}); + auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, {1}); + SetGpr(rd, diff_i64); + SetXerCa(carry_i1); + + if (rc) { + SetCrFieldSignedCmp(0, diff_i64, m_ir_builder->getInt64(0)); + } + + if (oe) { + // TODO: Implement this + } + //InterpreterCall("SUBFC", &PPUInterpreter::SUBFC, rd, ra, rb, oe, rc); +} + +void Compiler::ADDC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, rb_i64); + auto sum_i64 = m_ir_builder->CreateExtractValue(res_s, {0}); + auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, {1}); + SetGpr(rd, sum_i64); + SetXerCa(carry_i1); + + if (rc) { + SetCrFieldSignedCmp(0, sum_i64, m_ir_builder->getInt64(0)); + } + + if (oe) { + // TODO: Implement this + } + //InterpreterCall("ADDC", &PPUInterpreter::ADDC, rd, ra, rb, oe, rc); +} + +void Compiler::MULHDU(u32 rd, u32 ra, u32 rb, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto ra_i128 = m_ir_builder->CreateZExt(ra_i64, m_ir_builder->getIntNTy(128)); + auto rb_i128 = m_ir_builder->CreateZExt(rb_i64, m_ir_builder->getIntNTy(128)); + auto prod_i128 = m_ir_builder->CreateMul(ra_i128, rb_i128); + prod_i128 = m_ir_builder->CreateLShr(prod_i128, 64); + auto prod_i64 = m_ir_builder->CreateTrunc(prod_i128, m_ir_builder->getInt64Ty()); + SetGpr(rd, prod_i64); + + if (rc) { + SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("MULHDU", &PPUInterpreter::MULHDU, rd, ra, rb, rc); +} + +void Compiler::MULHWU(u32 rd, u32 ra, u32 rb, bool rc) { + auto ra_i32 = GetGpr(ra, 32); + auto rb_i32 = GetGpr(rb, 32); + auto ra_i64 = m_ir_builder->CreateZExt(ra_i32, m_ir_builder->getInt64Ty()); + auto rb_i64 = m_ir_builder->CreateZExt(rb_i32, m_ir_builder->getInt64Ty()); + auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); + prod_i64 = m_ir_builder->CreateLShr(prod_i64, 32); + SetGpr(rd, prod_i64); + + if (rc) { + SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("MULHWU", &PPUInterpreter::MULHWU, rd, ra, rb, rc); +} + +void Compiler::MFOCRF(u32 a, u32 rd, u32 crm) { + auto cr_i32 = GetCr(); + auto cr_i64 = m_ir_builder->CreateZExt(cr_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, cr_i64); + //InterpreterCall("MFOCRF", &PPUInterpreter::MFOCRF, a, rd, crm); +} + +void Compiler::LWARX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto resv_addr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, R_ADDR)); + auto resv_addr_i64_ptr = m_ir_builder->CreateBitCast(resv_addr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(addr_i64, resv_addr_i64_ptr, 8); + + auto resv_val_i32 = ReadMemory(addr_i64, 32, 4, false, false); + auto resv_val_i64 = m_ir_builder->CreateZExt(resv_val_i32, m_ir_builder->getInt64Ty()); + auto resv_val_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, R_VALUE)); + auto resv_val_i64_ptr = m_ir_builder->CreateBitCast(resv_val_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(resv_val_i64, resv_val_i64_ptr, 8); + + resv_val_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt32Ty()), resv_val_i32); + resv_val_i64 = m_ir_builder->CreateZExt(resv_val_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, resv_val_i64); + //InterpreterCall("LWARX", &PPUInterpreter::LWARX, rd, ra, rb); +} + +void Compiler::LDX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i64 = ReadMemory(addr_i64, 64); + SetGpr(rd, mem_i64); + //InterpreterCall("LDX", &PPUInterpreter::LDX, rd, ra, rb); +} + +void Compiler::LWZX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i32 = ReadMemory(addr_i64, 32); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LWZX", &PPUInterpreter::LWZX, rd, ra, rb); +} + +void Compiler::SLW(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); + auto rb_i8 = GetGpr(rb, 8); + rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x3F); + auto rb_i64 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getInt64Ty()); + auto res_i64 = m_ir_builder->CreateShl(rs_i64, rb_i64); + auto res_i32 = m_ir_builder->CreateTrunc(res_i64, m_ir_builder->getInt32Ty()); + res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SLW", &PPUInterpreter::SLW, ra, rs, rb, rc); +} + +void Compiler::CNTLZW(u32 ra, u32 rs, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto res_i32 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::ctlz, m_ir_builder->getInt32Ty()), rs_i32, m_ir_builder->getInt1(false)); + auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("CNTLZW", &PPUInterpreter::CNTLZW, ra, rs, rc); +} + +void Compiler::SLD(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); + auto rb_i8 = GetGpr(rb, 8); + rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x7F); + auto rb_i128 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getIntNTy(128)); + auto res_i128 = m_ir_builder->CreateShl(rs_i128, rb_i128); + auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SLD", &PPUInterpreter::SLD, ra, rs, rb, rc); +} + +void Compiler::AND(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rb_i64 = GetGpr(rb); + auto res_i64 = m_ir_builder->CreateAnd(rs_i64, rb_i64); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("AND", &PPUInterpreter::AND, ra, rs, rb, rc); +} + +void Compiler::CMPL(u32 crfd, u32 l, u32 ra, u32 rb) { + Value * ra_i64; + Value * rb_i64; + if (l == 0) { + ra_i64 = m_ir_builder->CreateZExt(GetGpr(ra, 32), m_ir_builder->getInt64Ty()); + rb_i64 = m_ir_builder->CreateZExt(GetGpr(rb, 32), m_ir_builder->getInt64Ty()); + } else { + ra_i64 = GetGpr(ra); + rb_i64 = GetGpr(rb); + } + + SetCrFieldUnsignedCmp(crfd, ra_i64, rb_i64); + //InterpreterCall("CMPL", &PPUInterpreter::CMPL, crfd, l, ra, rb); +} + +void Compiler::LVSR(u32 vd, u32 ra, u32 rb) { + static const u128 s_lvsr_values[] = { + {0x18191A1B1C1D1E1F, 0x1011121314151617}, + {0x1718191A1B1C1D1E, 0x0F10111213141516}, + {0x161718191A1B1C1D, 0x0E0F101112131415}, + {0x15161718191A1B1C, 0x0D0E0F1011121314}, + {0x1415161718191A1B, 0x0C0D0E0F10111213}, + {0x131415161718191A, 0x0B0C0D0E0F101112}, + {0x1213141516171819, 0x0A0B0C0D0E0F1011}, + {0x1112131415161718, 0x090A0B0C0D0E0F10}, + {0x1011121314151617, 0x08090A0B0C0D0E0F}, + {0x0F10111213141516, 0x0708090A0B0C0D0E}, + {0x0E0F101112131415, 0x060708090A0B0C0D}, + {0x0D0E0F1011121314, 0x05060708090A0B0C}, + {0x0C0D0E0F10111213, 0x0405060708090A0B}, + {0x0B0C0D0E0F101112, 0x030405060708090A}, + {0x0A0B0C0D0E0F1011, 0x0203040506070809}, + {0x090A0B0C0D0E0F10, 0x0102030405060708}, + }; + + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xF); + auto lvsr_values_v16i8_ptr = m_ir_builder->CreateIntToPtr(m_ir_builder->getInt64((u64)s_lvsr_values), VectorType::get(m_ir_builder->getInt8Ty(), 16)->getPointerTo()); + lvsr_values_v16i8_ptr = m_ir_builder->CreateGEP(lvsr_values_v16i8_ptr, index_i64); + auto val_v16i8 = m_ir_builder->CreateAlignedLoad(lvsr_values_v16i8_ptr, 16); + SetVr(vd, val_v16i8); + + //InterpreterCall("LVSR", &PPUInterpreter::LVSR, vd, ra, rb); +} + +void Compiler::LVEHX(u32 vd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFEULL); + auto val_i16 = ReadMemory(addr_i64, 16, 2); + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); + index_i64 = m_ir_builder->CreateLShr(index_i64, 1); + index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(7), index_i64); + auto vd_v8i16 = GetVrAsIntVec(vd, 16); + vd_v8i16 = m_ir_builder->CreateInsertElement(vd_v8i16, val_i16, index_i64); + SetVr(vd, vd_v8i16); + + //InterpreterCall("LVEHX", &PPUInterpreter::LVEHX, vd, ra, rb); +} + +void Compiler::SUBF(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto diff_i64 = m_ir_builder->CreateSub(rb_i64, ra_i64); + SetGpr(rd, diff_i64); + + if (rc) { + SetCrFieldSignedCmp(0, diff_i64, m_ir_builder->getInt64(0)); + } + + if (oe) { + // TODO: Implement this + } + //InterpreterCall("SUBF", &PPUInterpreter::SUBF, rd, ra, rb, oe, rc); +} + +void Compiler::LDUX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i64 = ReadMemory(addr_i64, 64); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LDUX", &PPUInterpreter::LDUX, rd, ra, rb); +} + +void Compiler::DCBST(u32 ra, u32 rb) { + // TODO: Implement this + m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); + //InterpreterCall("DCBST", &PPUInterpreter::DCBST, ra, rb); +} + +void Compiler::LWZUX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i32 = ReadMemory(addr_i64, 32); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LWZUX", &PPUInterpreter::LWZUX, rd, ra, rb); +} + +void Compiler::CNTLZD(u32 ra, u32 rs, bool rc) { + auto rs_i64 = GetGpr(rs); + auto res_i64 = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::ctlz, m_ir_builder->getInt64Ty()), rs_i64, m_ir_builder->getInt1(false)); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("CNTLZD", &PPUInterpreter::CNTLZD, ra, rs, rc); +} + +void Compiler::ANDC(u32 ra, u32 rs, u32 rb, bool rc) { + InterpreterCall("ANDC", &PPUInterpreter::ANDC, ra, rs, rb, rc); +} + +void Compiler::TD(u32 to, u32 ra, u32 rb) { + InterpreterCall("TD", &PPUInterpreter::TD, to, ra, rb); +} + +void Compiler::LVEWX(u32 vd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFCULL); + auto val_i32 = ReadMemory(addr_i64, 32, 4); + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); + index_i64 = m_ir_builder->CreateLShr(index_i64, 2); + index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(3), index_i64); + auto vd_v4i32 = GetVrAsIntVec(vd, 32); + vd_v4i32 = m_ir_builder->CreateInsertElement(vd_v4i32, val_i32, index_i64); + SetVr(vd, vd_v4i32); + + //InterpreterCall("LVEWX", &PPUInterpreter::LVEWX, vd, ra, rb); +} + +void Compiler::MULHD(u32 rd, u32 ra, u32 rb, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto ra_i128 = m_ir_builder->CreateSExt(ra_i64, m_ir_builder->getIntNTy(128)); + auto rb_i128 = m_ir_builder->CreateSExt(rb_i64, m_ir_builder->getIntNTy(128)); + auto prod_i128 = m_ir_builder->CreateMul(ra_i128, rb_i128); + prod_i128 = m_ir_builder->CreateLShr(prod_i128, 64); + auto prod_i64 = m_ir_builder->CreateTrunc(prod_i128, m_ir_builder->getInt64Ty()); + SetGpr(rd, prod_i64); + + if (rc) { + SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("MULHD", &PPUInterpreter::MULHD, rd, ra, rb, rc); +} + +void Compiler::MULHW(u32 rd, u32 ra, u32 rb, bool rc) { + auto ra_i32 = GetGpr(ra, 32); + auto rb_i32 = GetGpr(rb, 32); + auto ra_i64 = m_ir_builder->CreateSExt(ra_i32, m_ir_builder->getInt64Ty()); + auto rb_i64 = m_ir_builder->CreateSExt(rb_i32, m_ir_builder->getInt64Ty()); + auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); + prod_i64 = m_ir_builder->CreateAShr(prod_i64, 32); + SetGpr(rd, prod_i64); + + if (rc) { + SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("MULHW", &PPUInterpreter::MULHW, rd, ra, rb, rc); +} + +void Compiler::LDARX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto resv_addr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, R_ADDR)); + auto resv_addr_i64_ptr = m_ir_builder->CreateBitCast(resv_addr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(addr_i64, resv_addr_i64_ptr, 8); + + auto resv_val_i64 = ReadMemory(addr_i64, 64, 8, false); + auto resv_val_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, R_VALUE)); + auto resv_val_i64_ptr = m_ir_builder->CreateBitCast(resv_val_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(resv_val_i64, resv_val_i64_ptr, 8); + + resv_val_i64 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt64Ty()), resv_val_i64); + SetGpr(rd, resv_val_i64); + //InterpreterCall("LDARX", &PPUInterpreter::LDARX, rd, ra, rb); +} + +void Compiler::DCBF(u32 ra, u32 rb) { + // TODO: Implement this + m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); + //InterpreterCall("DCBF", &PPUInterpreter::DCBF, ra, rb); +} + +void Compiler::LBZX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i8 = ReadMemory(addr_i64, 8); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LBZX", &PPUInterpreter::LBZX, rd, ra, rb); +} + +void Compiler::LVX(u32 vd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); + auto mem_i128 = ReadMemory(addr_i64, 128, 16); + SetVr(vd, mem_i128); + //InterpreterCall("LVX", &PPUInterpreter::LVX, vd, ra, rb); +} + +void Compiler::NEG(u32 rd, u32 ra, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto diff_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(0), ra_i64); + SetGpr(rd, diff_i64); + + if (rc) { + SetCrFieldSignedCmp(0, diff_i64, m_ir_builder->getInt64(0)); + } + + if (oe) { + // TODO: Implement this + } + //InterpreterCall("NEG", &PPUInterpreter::NEG, rd, ra, oe, rc); +} + +void Compiler::LBZUX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i8 = ReadMemory(addr_i64, 8); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LBZUX", &PPUInterpreter::LBZUX, rd, ra, rb); +} + +void Compiler::NOR(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rb_i64 = GetGpr(rb); + auto res_i64 = m_ir_builder->CreateOr(rs_i64, rb_i64); + res_i64 = m_ir_builder->CreateXor(res_i64, (s64)-1); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("NOR", &PPUInterpreter::NOR, ra, rs, rb, rc); +} + +void Compiler::STVEBX(u32 vs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); + index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(15), index_i64); + auto vs_v16i8 = GetVrAsIntVec(vs, 8); + auto val_i8 = m_ir_builder->CreateExtractElement(vs_v16i8, index_i64); + WriteMemory(addr_i64, val_i8); + //InterpreterCall("STVEBX", &PPUInterpreter::STVEBX, vs, ra, rb); +} + +void Compiler::SUBFE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + InterpreterCall("SUBFE", &PPUInterpreter::SUBFE, rd, ra, rb, oe, rc); +} + +void Compiler::ADDE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + InterpreterCall("ADDE", &PPUInterpreter::ADDE, rd, ra, rb, oe, rc); +} + +void Compiler::MTOCRF(u32 l, u32 crm, u32 rs) { + auto rs_i32 = GetGpr(rs, 32); + auto cr_i32 = GetCr(); + u32 mask = 0; + + for (u32 i = 0; i < 8; i++) { + if (crm & (1 << i)) { + mask |= 0xF << ((7 - i) * 4); + if (l) { + break; + } + } + } + + cr_i32 = m_ir_builder->CreateAnd(cr_i32, ~mask); + rs_i32 = m_ir_builder->CreateAnd(rs_i32, ~mask); + cr_i32 = m_ir_builder->CreateOr(cr_i32, rs_i32); + SetCr(cr_i32); + //InterpreterCall("MTOCRF", &PPUInterpreter::MTOCRF, l, crm, rs); +} + +void Compiler::STDX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 64)); + //InterpreterCall("STDX", &PPUInterpreter::STDX, rs, ra, rb); +} + +void Compiler::STWCX_(u32 rs, u32 ra, u32 rb) { + InterpreterCall("STWCX_", &PPUInterpreter::STWCX_, rs, ra, rb); +} + +void Compiler::STWX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 32)); + //InterpreterCall("STWX", &PPUInterpreter::STWX, rs, ra, rb); +} + +void Compiler::STVEHX(u32 vs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFEULL); + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); + index_i64 = m_ir_builder->CreateLShr(index_i64, 1); + index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(7), index_i64); + auto vs_v8i16 = GetVrAsIntVec(vs, 16); + auto val_i16 = m_ir_builder->CreateExtractElement(vs_v8i16, index_i64); + WriteMemory(addr_i64, val_i16, 2); + //InterpreterCall("STVEHX", &PPUInterpreter::STVEHX, vs, ra, rb); +} + +void Compiler::STDUX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 64)); + SetGpr(ra, addr_i64); + //InterpreterCall("STDUX", &PPUInterpreter::STDUX, rs, ra, rb); +} + +void Compiler::STWUX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 32)); + SetGpr(ra, addr_i64); + //InterpreterCall("STWUX", &PPUInterpreter::STWUX, rs, ra, rb); +} + +void Compiler::STVEWX(u32 vs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFFCULL); + auto index_i64 = m_ir_builder->CreateAnd(addr_i64, 0xf); + index_i64 = m_ir_builder->CreateLShr(index_i64, 2); + index_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(3), index_i64); + auto vs_v4i32 = GetVrAsIntVec(vs, 32); + auto val_i32 = m_ir_builder->CreateExtractElement(vs_v4i32, index_i64); + WriteMemory(addr_i64, val_i32, 4); + //InterpreterCall("STVEWX", &PPUInterpreter::STVEWX, vs, ra, rb); +} + +void Compiler::ADDZE(u32 rd, u32 ra, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto ca_i64 = GetXerCa(); + auto res_s = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::uadd_with_overflow, m_ir_builder->getInt64Ty()), ra_i64, ca_i64); + auto sum_i64 = m_ir_builder->CreateExtractValue(res_s, {0}); + auto carry_i1 = m_ir_builder->CreateExtractValue(res_s, {1}); + SetGpr(rd, sum_i64); + SetXerCa(carry_i1); + + if (rc) { + SetCrFieldSignedCmp(0, sum_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("ADDZE", &PPUInterpreter::ADDZE, rd, ra, oe, rc); +} + +void Compiler::SUBFZE(u32 rd, u32 ra, u32 oe, bool rc) { + InterpreterCall("SUBFZE", &PPUInterpreter::SUBFZE, rd, ra, oe, rc); +} + +void Compiler::STDCX_(u32 rs, u32 ra, u32 rb) { + InterpreterCall("STDCX_", &PPUInterpreter::STDCX_, rs, ra, rb); +} + +void Compiler::STBX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 8)); + //InterpreterCall("STBX", &PPUInterpreter::STBX, rs, ra, rb); +} + +void Compiler::STVX(u32 vs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); + WriteMemory(addr_i64, GetVr(vs), 16); + //InterpreterCall("STVX", &PPUInterpreter::STVX, vs, ra, rb); +} + +void Compiler::SUBFME(u32 rd, u32 ra, u32 oe, bool rc) { + InterpreterCall("SUBFME", &PPUInterpreter::SUBFME, rd, ra, oe, rc); +} + +void Compiler::MULLD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); + SetGpr(rd, prod_i64); + + if (rc) { + SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); + } + + // TODO implement oe + //InterpreterCall("MULLD", &PPUInterpreter::MULLD, rd, ra, rb, oe, rc); +} + +void Compiler::ADDME(u32 rd, u32 ra, u32 oe, bool rc) { + InterpreterCall("ADDME", &PPUInterpreter::ADDME, rd, ra, oe, rc); +} + +void Compiler::MULLW(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i32 = GetGpr(ra, 32); + auto rb_i32 = GetGpr(rb, 32); + auto ra_i64 = m_ir_builder->CreateSExt(ra_i32, m_ir_builder->getInt64Ty()); + auto rb_i64 = m_ir_builder->CreateSExt(rb_i32, m_ir_builder->getInt64Ty()); + auto prod_i64 = m_ir_builder->CreateMul(ra_i64, rb_i64); + SetGpr(rd, prod_i64); + + if (rc) { + SetCrFieldSignedCmp(0, prod_i64, m_ir_builder->getInt64(0)); + } + + // TODO implement oe + //InterpreterCall("MULLW", &PPUInterpreter::MULLW, rd, ra, rb, oe, rc); +} + +void Compiler::DCBTST(u32 ra, u32 rb, u32 th) { + // TODO: Implement this + m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); + //InterpreterCall("DCBTST", &PPUInterpreter::DCBTST, ra, rb, th); +} + +void Compiler::STBUX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 8)); + SetGpr(ra, addr_i64); + //InterpreterCall("STBUX", &PPUInterpreter::STBUX, rs, ra, rb); +} + +void Compiler::ADD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto sum_i64 = m_ir_builder->CreateAdd(ra_i64, rb_i64); + SetGpr(rd, sum_i64); + + if (rc) { + SetCrFieldSignedCmp(0, sum_i64, m_ir_builder->getInt64(0)); + } + + if (oe) { + // TODO: Implement this + } + //InterpreterCall("ADD", &PPUInterpreter::ADD, rd, ra, rb, oe, rc); +} + +void Compiler::DCBT(u32 ra, u32 rb, u32 th) { + // TODO: Implement this using prefetch + m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::donothing)); + //InterpreterCall("DCBT", &PPUInterpreter::DCBT, ra, rb, th); +} + +void Compiler::LHZX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LHZX", &PPUInterpreter::LHZX, rd, ra, rb); +} + +void Compiler::EQV(u32 ra, u32 rs, u32 rb, bool rc) { + InterpreterCall("EQV", &PPUInterpreter::EQV, ra, rs, rb, rc); +} + +void Compiler::ECIWX(u32 rd, u32 ra, u32 rb) { + InterpreterCall("ECIWX", &PPUInterpreter::ECIWX, rd, ra, rb); +} + +void Compiler::LHZUX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LHZUX", &PPUInterpreter::LHZUX, rd, ra, rb); +} + +void Compiler::XOR(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rb_i64 = GetGpr(rb); + auto res_i64 = m_ir_builder->CreateXor(rs_i64, rb_i64); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("XOR", &PPUInterpreter::XOR, ra, rs, rb, rc); +} + +void Compiler::MFSPR(u32 rd, u32 spr) { + Value * rd_i64; + auto n = (spr >> 5) | ((spr & 0x1f) << 5); + + switch (n) { + case 0x001: + rd_i64 = GetXer(); + break; + case 0x008: + rd_i64 = GetLr(); + break; + case 0x009: + rd_i64 = GetCtr(); + break; + case 0x100: + rd_i64 = GetUsprg0(); + break; + default: + assert(0); + break; + } + + SetGpr(rd, rd_i64); + //InterpreterCall("MFSPR", &PPUInterpreter::MFSPR, rd, spr); +} + +void Compiler::LWAX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i32 = ReadMemory(addr_i64, 32); + auto mem_i64 = m_ir_builder->CreateSExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LWAX", &PPUInterpreter::LWAX, rd, ra, rb); +} + +void Compiler::DST(u32 ra, u32 rb, u32 strm, u32 t) { + InterpreterCall("DST", &PPUInterpreter::DST, ra, rb, strm, t); +} + +void Compiler::LHAX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LHAX", &PPUInterpreter::LHAX, rd, ra, rb); +} + +void Compiler::LVXL(u32 vd, u32 ra, u32 rb) { + LVX(vd, ra, rb); + //InterpreterCall("LVXL", &PPUInterpreter::LVXL, vd, ra, rb); +} + +void Compiler::MFTB(u32 rd, u32 spr) { + auto tb_i64 = Call("get_time", get_time); + + u32 n = (spr >> 5) | ((spr & 0x1f) << 5); + if (n == 0x10D) { + tb_i64 = m_ir_builder->CreateLShr(tb_i64, 32); + } + + SetGpr(rd, tb_i64); +} + +void Compiler::LWAUX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i32 = ReadMemory(addr_i64, 32); + auto mem_i64 = m_ir_builder->CreateSExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LWAUX", &PPUInterpreter::LWAUX, rd, ra, rb); +} + +void Compiler::DSTST(u32 ra, u32 rb, u32 strm, u32 t) { + InterpreterCall("DSTST", &PPUInterpreter::DSTST, ra, rb, strm, t); +} + +void Compiler::LHAUX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LHAUX", &PPUInterpreter::LHAUX, rd, ra, rb); +} + +void Compiler::STHX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 16)); + //InterpreterCall("STHX", &PPUInterpreter::STHX, rs, ra, rb); +} + +void Compiler::ORC(u32 ra, u32 rs, u32 rb, bool rc) { + InterpreterCall("ORC", &PPUInterpreter::ORC, ra, rs, rb, rc); +} + +void Compiler::ECOWX(u32 rs, u32 ra, u32 rb) { + InterpreterCall("ECOWX", &PPUInterpreter::ECOWX, rs, ra, rb); +} + +void Compiler::STHUX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 16)); + SetGpr(ra, addr_i64); + //InterpreterCall("STHUX", &PPUInterpreter::STHUX, rs, ra, rb); +} + +void Compiler::OR(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rb_i64 = GetGpr(rb); + auto res_i64 = m_ir_builder->CreateOr(rs_i64, rb_i64); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("OR", &PPUInterpreter::OR, ra, rs, rb, rc); +} + +void Compiler::DIVDU(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto res_i64 = m_ir_builder->CreateUDiv(ra_i64, rb_i64); + SetGpr(rd, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + // TODO implement oe + // TODO make sure an exception does not occur on divide by 0 and overflow + //InterpreterCall("DIVDU", &PPUInterpreter::DIVDU, rd, ra, rb, oe, rc); +} + +void Compiler::DIVWU(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i32 = GetGpr(ra, 32); + auto rb_i32 = GetGpr(rb, 32); + auto res_i32 = m_ir_builder->CreateUDiv(ra_i32, rb_i32); + auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + // TODO implement oe + // TODO make sure an exception does not occur on divide by 0 and overflow + //InterpreterCall("DIVWU", &PPUInterpreter::DIVWU, rd, ra, rb, oe, rc); +} + +void Compiler::MTSPR(u32 spr, u32 rs) { + auto rs_i64 = GetGpr(rs); + auto n = (spr >> 5) | ((spr & 0x1f) << 5); + + switch (n) { + case 0x001: + SetXer(rs_i64); + break; + case 0x008: + SetLr(rs_i64); + break; + case 0x009: + SetCtr(rs_i64); + break; + case 0x100: + SetUsprg0(rs_i64); + break; + default: + assert(0); + break; + } + + //InterpreterCall("MTSPR", &PPUInterpreter::MTSPR, spr, rs); +} + +void Compiler::NAND(u32 ra, u32 rs, u32 rb, bool rc) { + InterpreterCall("NAND", &PPUInterpreter::NAND, ra, rs, rb, rc); +} + +void Compiler::STVXL(u32 vs, u32 ra, u32 rb) { + STVX(vs, ra, rb); + //InterpreterCall("STVXL", &PPUInterpreter::STVXL, vs, ra, rb); +} + +void Compiler::DIVD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i64 = GetGpr(ra); + auto rb_i64 = GetGpr(rb); + auto res_i64 = m_ir_builder->CreateSDiv(ra_i64, rb_i64); + SetGpr(rd, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + // TODO implement oe + // TODO make sure an exception does not occur on divide by 0 and overflow + //InterpreterCall("DIVD", &PPUInterpreter::DIVD, rd, ra, rb, oe, rc); +} + +void Compiler::DIVW(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) { + auto ra_i32 = GetGpr(ra, 32); + auto rb_i32 = GetGpr(rb, 32); + auto res_i32 = m_ir_builder->CreateSDiv(ra_i32, rb_i32); + auto res_i64 = m_ir_builder->CreateZExt(res_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + // TODO implement oe + // TODO make sure an exception does not occur on divide by 0 and overflow + //InterpreterCall("DIVW", &PPUInterpreter::DIVW, rd, ra, rb, oe, rc); +} + +void Compiler::LVLX(u32 vd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto eb_i64 = m_ir_builder->CreateAnd(addr_i64, 0xF); + eb_i64 = m_ir_builder->CreateShl(eb_i64, 3); + auto eb_i128 = m_ir_builder->CreateZExt(eb_i64, m_ir_builder->getIntNTy(128)); + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); + auto mem_i128 = ReadMemory(addr_i64, 128, 16); + mem_i128 = m_ir_builder->CreateShl(mem_i128, eb_i128); + SetVr(vd, mem_i128); + //InterpreterCall("LVLX", &PPUInterpreter::LVLX, vd, ra, rb); +} + +void Compiler::LDBRX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i64 = ReadMemory(addr_i64, 64, 0, false); + SetGpr(rd, mem_i64); + //InterpreterCall("LDBRX", &PPUInterpreter::LDBRX, rd, ra, rb); +} + +void Compiler::LSWX(u32 rd, u32 ra, u32 rb) { + InterpreterCall("LSWX", &PPUInterpreter::LSWX, rd, ra, rb); +} + +void Compiler::LWBRX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i32 = ReadMemory(addr_i64, 32, 0, false); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LWBRX", &PPUInterpreter::LWBRX, rd, ra, rb); +} + +void Compiler::LFSX(u32 frd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i32 = ReadMemory(addr_i64, 32); + SetFpr(frd, mem_i32); + //InterpreterCall("LFSX", &PPUInterpreter::LFSX, frd, ra, rb); +} + +void Compiler::SRW(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); + auto rb_i8 = GetGpr(rb, 8); + rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x3F); + auto rb_i64 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getInt64Ty()); + auto res_i64 = m_ir_builder->CreateLShr(rs_i64, rb_i64); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SRW", &PPUInterpreter::SRW, ra, rs, rb, rc); +} + +void Compiler::SRD(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); + auto rb_i8 = GetGpr(rb, 8); + rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x7F); + auto rb_i128 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getIntNTy(128)); + auto res_i128 = m_ir_builder->CreateLShr(rs_i128, rb_i128); + auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); + SetGpr(ra, res_i64); + + if (rc) { + SetCrFieldSignedCmp(0, res_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SRD", &PPUInterpreter::SRD, ra, rs, rb, rc); +} + +void Compiler::LVRX(u32 vd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto eb_i64 = m_ir_builder->CreateSub(m_ir_builder->getInt64(16), addr_i64); + eb_i64 = m_ir_builder->CreateAnd(eb_i64, 0xF); + eb_i64 = m_ir_builder->CreateShl(eb_i64, 3); + auto eb_i128 = m_ir_builder->CreateZExt(eb_i64, m_ir_builder->getIntNTy(128)); + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFFFFFFFFF0ULL); + auto mem_i128 = ReadMemory(addr_i64, 128, 16); + mem_i128 = m_ir_builder->CreateLShr(mem_i128, eb_i128); + auto cmp_i1 = m_ir_builder->CreateICmpNE(eb_i64, m_ir_builder->getInt64(0)); + auto cmp_i128 = m_ir_builder->CreateSExt(cmp_i1, m_ir_builder->getIntNTy(128)); + mem_i128 = m_ir_builder->CreateAnd(mem_i128, cmp_i128); + SetVr(vd, mem_i128); + + //InterpreterCall("LVRX", &PPUInterpreter::LVRX, vd, ra, rb); +} + +void Compiler::LSWI(u32 rd, u32 ra, u32 nb) { + auto addr_i64 = ra ? GetGpr(ra) : m_ir_builder->getInt64(0); + + nb = nb ? nb : 32; + for (u32 i = 0; i < nb; i += 4) { + auto val_i32 = ReadMemory(addr_i64, 32, 0, true, false); + + if (i + 4 <= nb) { + addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); + } else { + u32 mask = 0xFFFFFFFF << ((4 - (nb - i)) * 8); + val_i32 = m_ir_builder->CreateAnd(val_i32, mask); + } + + auto val_i64 = m_ir_builder->CreateZExt(val_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, val_i64); + rd = (rd + 1) % 32; + } + + //InterpreterCall("LSWI", &PPUInterpreter::LSWI, rd, ra, nb); +} + +void Compiler::LFSUX(u32 frd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + auto mem_i32 = ReadMemory(addr_i64, 32); + SetFpr(frd, mem_i32); + SetGpr(ra, addr_i64); + //InterpreterCall("LFSUX", &PPUInterpreter::LFSUX, frd, ra, rb); +} + +void Compiler::SYNC(u32 l) { + m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_mfence)); + //InterpreterCall("SYNC", &PPUInterpreter::SYNC, l); +} + +void Compiler::LFDX(u32 frd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i64 = ReadMemory(addr_i64, 64); + SetFpr(frd, mem_i64); + //InterpreterCall("LFDX", &PPUInterpreter::LFDX, frd, ra, rb); +} + +void Compiler::LFDUX(u32 frd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + auto mem_i64 = ReadMemory(addr_i64, 64); + SetFpr(frd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LFDUX", &PPUInterpreter::LFDUX, frd, ra, rb); +} + +void Compiler::STVLX(u32 vs, u32 ra, u32 rb) { + InterpreterCall("STVLX", &PPUInterpreter::STVLX, vs, ra, rb); +} + +void Compiler::STSWX(u32 rs, u32 ra, u32 rb) { + InterpreterCall("STSWX", &PPUInterpreter::STSWX, rs, ra, rb); +} + +void Compiler::STWBRX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 32), 0, false); + //InterpreterCall("STWBRX", &PPUInterpreter::STWBRX, rs, ra, rb); +} + +void Compiler::STFSX(u32 frs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); + WriteMemory(addr_i64, frs_i32); + //InterpreterCall("STFSX", &PPUInterpreter::STFSX, frs, ra, rb); +} + +void Compiler::STVRX(u32 vs, u32 ra, u32 rb) { + InterpreterCall("STVRX", &PPUInterpreter::STVRX, vs, ra, rb); +} + +void Compiler::STFSUX(u32 frs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); + WriteMemory(addr_i64, frs_i32); + SetGpr(ra, addr_i64); + //InterpreterCall("STFSUX", &PPUInterpreter::STFSUX, frs, ra, rb); +} + +void Compiler::STSWI(u32 rd, u32 ra, u32 nb) { + auto addr_i64 = ra ? GetGpr(ra) : m_ir_builder->getInt64(0); + + nb = nb ? nb : 32; + for (u32 i = 0; i < nb; i += 4) { + auto val_i32 = GetGpr(rd, 32); + + if (i + 4 <= nb) { + WriteMemory(addr_i64, val_i32, 0, true, false); + addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); + rd = (rd + 1) % 32; + } else { + u32 n = nb - i; + if (n >= 2) { + auto val_i16 = m_ir_builder->CreateLShr(val_i32, 16); + val_i16 = m_ir_builder->CreateTrunc(val_i16, m_ir_builder->getInt16Ty()); + WriteMemory(addr_i64, val_i16); + + if (n == 3) { + auto val_i8 = m_ir_builder->CreateLShr(val_i32, 8); + val_i8 = m_ir_builder->CreateTrunc(val_i8, m_ir_builder->getInt8Ty()); + addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(2)); + WriteMemory(addr_i64, val_i8); + } + } else { + auto val_i8 = m_ir_builder->CreateLShr(val_i32, 24); + val_i8 = m_ir_builder->CreateTrunc(val_i8, m_ir_builder->getInt8Ty()); + WriteMemory(addr_i64, val_i8); + } + } + } + + //InterpreterCall("STSWI", &PPUInterpreter::STSWI, rd, ra, nb); +} + +void Compiler::STFDX(u32 frs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); + WriteMemory(addr_i64, frs_i64); + //InterpreterCall("STFDX", &PPUInterpreter::STFDX, frs, ra, rb); +} + +void Compiler::STFDUX(u32 frs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); + WriteMemory(addr_i64, frs_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("STFDUX", &PPUInterpreter::STFDUX, frs, ra, rb); +} + +void Compiler::LVLXL(u32 vd, u32 ra, u32 rb) { + LVLX(vd, ra, rb); + //InterpreterCall("LVLXL", &PPUInterpreter::LVLXL, vd, ra, rb); +} + +void Compiler::LHBRX(u32 rd, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i16 = ReadMemory(addr_i64, 16, 0, false); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LHBRX", &PPUInterpreter::LHBRX, rd, ra, rb); +} + +void Compiler::SRAW(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); + rs_i64 = m_ir_builder->CreateShl(rs_i64, 32); + auto rb_i8 = GetGpr(rb, 8); + rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x3F); + auto rb_i64 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getInt64Ty()); + auto res_i64 = m_ir_builder->CreateAShr(rs_i64, rb_i64); + auto ra_i64 = m_ir_builder->CreateAShr(res_i64, 32); + SetGpr(ra, ra_i64); + + auto res_i32 = m_ir_builder->CreateTrunc(res_i64, m_ir_builder->getInt32Ty()); + auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); + auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i32, m_ir_builder->getInt32(0)); + auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); + SetXerCa(ca_i1); + + if (rc) { + SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SRAW", &PPUInterpreter::SRAW, ra, rs, rb, rc); +} + +void Compiler::SRAD(u32 ra, u32 rs, u32 rb, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); + rs_i128 = m_ir_builder->CreateShl(rs_i128, 64); + auto rb_i8 = GetGpr(rb, 8); + rb_i8 = m_ir_builder->CreateAnd(rb_i8, 0x7F); + auto rb_i128 = m_ir_builder->CreateZExt(rb_i8, m_ir_builder->getIntNTy(128)); + auto res_i128 = m_ir_builder->CreateAShr(rs_i128, rb_i128); + auto ra_i128 = m_ir_builder->CreateAShr(res_i128, 64); + auto ra_i64 = m_ir_builder->CreateTrunc(ra_i128, m_ir_builder->getInt64Ty()); + SetGpr(ra, ra_i64); + + auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); + auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); + auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i64, m_ir_builder->getInt64(0)); + auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); + SetXerCa(ca_i1); + + if (rc) { + SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SRAD", &PPUInterpreter::SRAD, ra, rs, rb, rc); +} + +void Compiler::LVRXL(u32 vd, u32 ra, u32 rb) { + LVRX(vd, ra, rb); + //InterpreterCall("LVRXL", &PPUInterpreter::LVRXL, vd, ra, rb); +} + +void Compiler::DSS(u32 strm, u32 a) { + InterpreterCall("DSS", &PPUInterpreter::DSS, strm, a); +} + +void Compiler::SRAWI(u32 ra, u32 rs, u32 sh, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateZExt(rs_i32, m_ir_builder->getInt64Ty()); + rs_i64 = m_ir_builder->CreateShl(rs_i64, 32); + auto res_i64 = m_ir_builder->CreateAShr(rs_i64, sh); + auto ra_i64 = m_ir_builder->CreateAShr(res_i64, 32); + SetGpr(ra, ra_i64); + + auto res_i32 = m_ir_builder->CreateTrunc(res_i64, m_ir_builder->getInt32Ty()); + auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); + auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i32, m_ir_builder->getInt32(0)); + auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); + SetXerCa(ca_i1); + + if (rc) { + SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SRAWI", &PPUInterpreter::SRAWI, ra, rs, sh, rc); +} + +void Compiler::SRADI1(u32 ra, u32 rs, u32 sh, bool rc) { + auto rs_i64 = GetGpr(rs); + auto rs_i128 = m_ir_builder->CreateZExt(rs_i64, m_ir_builder->getIntNTy(128)); + rs_i128 = m_ir_builder->CreateShl(rs_i128, 64); + auto res_i128 = m_ir_builder->CreateAShr(rs_i128, sh); + auto ra_i128 = m_ir_builder->CreateAShr(res_i128, 64); + auto ra_i64 = m_ir_builder->CreateTrunc(ra_i128, m_ir_builder->getInt64Ty()); + SetGpr(ra, ra_i64); + + auto res_i64 = m_ir_builder->CreateTrunc(res_i128, m_ir_builder->getInt64Ty()); + auto ca1_i1 = m_ir_builder->CreateICmpSLT(ra_i64, m_ir_builder->getInt64(0)); + auto ca2_i1 = m_ir_builder->CreateICmpNE(res_i64, m_ir_builder->getInt64(0)); + auto ca_i1 = m_ir_builder->CreateAnd(ca1_i1, ca2_i1); + SetXerCa(ca_i1); + + if (rc) { + SetCrFieldSignedCmp(0, ra_i64, m_ir_builder->getInt64(0)); + } + + //InterpreterCall("SRADI1", &PPUInterpreter::SRADI1, ra, rs, sh, rc); +} + +void Compiler::SRADI2(u32 ra, u32 rs, u32 sh, bool rc) { + SRADI1(ra, rs, sh, rc); + //InterpreterCall("SRADI2", &PPUInterpreter::SRADI2, ra, rs, sh, rc); +} + +void Compiler::EIEIO() { + m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_mfence)); + //InterpreterCall("EIEIO", &PPUInterpreter::EIEIO); +} + +void Compiler::STVLXL(u32 vs, u32 ra, u32 rb) { + STVLX(vs, ra, rb); + //InterpreterCall("STVLXL", &PPUInterpreter::STVLXL, vs, ra, rb); +} + +void Compiler::STHBRX(u32 rs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 16), 0, false); + //InterpreterCall("STHBRX", &PPUInterpreter::STHBRX, rs, ra, rb); +} + +void Compiler::EXTSH(u32 ra, u32 rs, bool rc) { + auto rs_i16 = GetGpr(rs, 16); + auto rs_i64 = m_ir_builder->CreateSExt(rs_i16, m_ir_builder->getInt64Ty()); + SetGpr(ra, rs_i64); + + if (rc) { + SetCrFieldSignedCmp(0, rs_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("EXTSH", &PPUInterpreter::EXTSH, ra, rs, rc); +} + +void Compiler::STVRXL(u32 vs, u32 ra, u32 rb) { + STVRX(vs, ra, rb); + //InterpreterCall("STVRXL", &PPUInterpreter::STVRXL, vs, ra, rb); +} + +void Compiler::EXTSB(u32 ra, u32 rs, bool rc) { + auto rs_i8 = GetGpr(rs, 8); + auto rs_i64 = m_ir_builder->CreateSExt(rs_i8, m_ir_builder->getInt64Ty()); + SetGpr(ra, rs_i64); + + if (rc) { + SetCrFieldSignedCmp(0, rs_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("EXTSB", &PPUInterpreter::EXTSB, ra, rs, rc); +} + +void Compiler::STFIWX(u32 frs, u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); + auto frs_i32 = m_ir_builder->CreateTrunc(frs_i64, m_ir_builder->getInt32Ty()); + WriteMemory(addr_i64, frs_i32); + //InterpreterCall("STFIWX", &PPUInterpreter::STFIWX, frs, ra, rb); +} + +void Compiler::EXTSW(u32 ra, u32 rs, bool rc) { + auto rs_i32 = GetGpr(rs, 32); + auto rs_i64 = m_ir_builder->CreateSExt(rs_i32, m_ir_builder->getInt64Ty()); + SetGpr(ra, rs_i64); + + if (rc) { + SetCrFieldSignedCmp(0, rs_i64, m_ir_builder->getInt64(0)); + } + //InterpreterCall("EXTSW", &PPUInterpreter::EXTSW, ra, rs, rc); +} + +void Compiler::ICBI(u32 ra, u32 rs) { + InterpreterCall("ICBI", &PPUInterpreter::ICBI, ra, rs); +} + +void Compiler::DCBZ(u32 ra, u32 rb) { + auto addr_i64 = GetGpr(rb); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + addr_i64 = m_ir_builder->CreateAnd(addr_i64, ~(127ULL)); + addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::get_ptr(0))); + auto addr_i8_ptr = m_ir_builder->CreateIntToPtr(addr_i64, m_ir_builder->getInt8PtrTy()); + + std::vector types = {(Type *)m_ir_builder->getInt8PtrTy(), (Type *)m_ir_builder->getInt32Ty()}; + m_ir_builder->CreateCall5(Intrinsic::getDeclaration(m_module, Intrinsic::memset, types), + addr_i8_ptr, m_ir_builder->getInt8(0), m_ir_builder->getInt32(128), m_ir_builder->getInt32(128), m_ir_builder->getInt1(true)); + //InterpreterCall("DCBZ", &PPUInterpreter::DCBZ, ra, rb);L +} + +void Compiler::LWZ(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i32 = ReadMemory(addr_i64, 32); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LWZ", &PPUInterpreter::LWZ, rd, ra, d); +} + +void Compiler::LWZU(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i32 = ReadMemory(addr_i64, 32); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LWZU", &PPUInterpreter::LWZU, rd, ra, d); +} + +void Compiler::LBZ(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i8 = ReadMemory(addr_i64, 8); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LBZ", &PPUInterpreter::LBZ, rd, ra, d); +} + +void Compiler::LBZU(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i8 = ReadMemory(addr_i64, 8); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i8, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LBZU", &PPUInterpreter::LBZU, rd, ra, d); +} + +void Compiler::STW(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 32)); + //InterpreterCall("STW", &PPUInterpreter::STW, rs, ra, d); +} + +void Compiler::STWU(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 32)); + SetGpr(ra, addr_i64); + //InterpreterCall("STWU", &PPUInterpreter::STWU, rs, ra, d); +} + +void Compiler::STB(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 8)); + //InterpreterCall("STB", &PPUInterpreter::STB, rs, ra, d); +} + +void Compiler::STBU(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 8)); + SetGpr(ra, addr_i64); + //InterpreterCall("STBU", &PPUInterpreter::STBU, rs, ra, d); +} + +void Compiler::LHZ(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LHZ", &PPUInterpreter::LHZ, rd, ra, d); +} + +void Compiler::LHZU(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateZExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LHZU", &PPUInterpreter::LHZU, rd, ra, d); +} + +void Compiler::LHA(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LHA", &PPUInterpreter::LHA, rd, ra, d); +} + +void Compiler::LHAU(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i16 = ReadMemory(addr_i64, 16); + auto mem_i64 = m_ir_builder->CreateSExt(mem_i16, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LHAU", &PPUInterpreter::LHAU, rd, ra, d); +} + +void Compiler::STH(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 16)); + //InterpreterCall("STH", &PPUInterpreter::STH, rs, ra, d); +} + +void Compiler::STHU(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 16)); + SetGpr(ra, addr_i64); + //InterpreterCall("STHU", &PPUInterpreter::STHU, rs, ra, d); +} + +void Compiler::LMW(u32 rd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + addr_i64 = m_ir_builder->CreateAdd(addr_i64, GetGpr(ra)); + } + + for (u32 i = rd; i < 32; i++) { + auto val_i32 = ReadMemory(addr_i64, 32); + auto val_i64 = m_ir_builder->CreateZExt(val_i32, m_ir_builder->getInt64Ty()); + SetGpr(i, val_i64); + addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); + } + + //InterpreterCall("LMW", &PPUInterpreter::LMW, rd, ra, d); +} + +void Compiler::STMW(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + addr_i64 = m_ir_builder->CreateAdd(addr_i64, GetGpr(ra)); + } + + for (u32 i = rs; i < 32; i++) { + auto val_i32 = GetGpr(i, 32); + WriteMemory(addr_i64, val_i32); + addr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64(4)); + } + + //InterpreterCall("STMW", &PPUInterpreter::STMW, rs, ra, d); +} + +void Compiler::LFS(u32 frd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i32 = ReadMemory(addr_i64, 32); + SetFpr(frd, mem_i32); + //InterpreterCall("LFS", &PPUInterpreter::LFS, frd, ra, d); +} + +void Compiler::LFSU(u32 frd, u32 ra, s32 ds) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + auto mem_i32 = ReadMemory(addr_i64, 32); + SetFpr(frd, mem_i32); + SetGpr(ra, addr_i64); + //InterpreterCall("LFSU", &PPUInterpreter::LFSU, frd, ra, ds); +} + +void Compiler::LFD(u32 frd, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i64 = ReadMemory(addr_i64, 64); + SetFpr(frd, mem_i64); + //InterpreterCall("LFD", &PPUInterpreter::LFD, frd, ra, d); +} + +void Compiler::LFDU(u32 frd, u32 ra, s32 ds) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i64 = ReadMemory(addr_i64, 64); + SetFpr(frd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LFDU", &PPUInterpreter::LFDU, frd, ra, ds); +} + +void Compiler::STFS(u32 frs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); + WriteMemory(addr_i64, frs_i32); + //InterpreterCall("STFS", &PPUInterpreter::STFS, frs, ra, d); +} + +void Compiler::STFSU(u32 frs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto frs_i32 = m_ir_builder->CreateBitCast(GetFpr(frs, 32), m_ir_builder->getInt32Ty()); + WriteMemory(addr_i64, frs_i32); + SetGpr(ra, addr_i64); + //InterpreterCall("STFSU", &PPUInterpreter::STFSU, frs, ra, d); +} + +void Compiler::STFD(u32 frs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); + WriteMemory(addr_i64, frs_i64); + //InterpreterCall("STFD", &PPUInterpreter::STFD, frs, ra, d); +} + +void Compiler::STFDU(u32 frs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto frs_i64 = m_ir_builder->CreateBitCast(GetFpr(frs), m_ir_builder->getInt64Ty()); + WriteMemory(addr_i64, frs_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("STFDU", &PPUInterpreter::STFDU, frs, ra, d); +} + +void Compiler::LD(u32 rd, u32 ra, s32 ds) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i64 = ReadMemory(addr_i64, 64); + SetGpr(rd, mem_i64); + //InterpreterCall("LD", &PPUInterpreter::LD, rd, ra, ds); +} + +void Compiler::LDU(u32 rd, u32 ra, s32 ds) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + auto mem_i64 = ReadMemory(addr_i64, 64); + SetGpr(rd, mem_i64); + SetGpr(ra, addr_i64); + //InterpreterCall("LDU", &PPUInterpreter::LDU, rd, ra, ds); +} + +void Compiler::LWA(u32 rd, u32 ra, s32 ds) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + auto mem_i32 = ReadMemory(addr_i64, 32); + auto mem_i64 = m_ir_builder->CreateSExt(mem_i32, m_ir_builder->getInt64Ty()); + SetGpr(rd, mem_i64); + //InterpreterCall("LWA", &PPUInterpreter::LWA, rd, ra, ds); +} + +void Compiler::FDIVS(u32 frd, u32 fra, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto res_f64 = m_ir_builder->CreateFDiv(ra_f64, rb_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FDIVS", &PPUInterpreter::FDIVS, frd, fra, frb, rc); +} + +void Compiler::FSUBS(u32 frd, u32 fra, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto res_f64 = m_ir_builder->CreateFSub(ra_f64, rb_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FSUBS", &PPUInterpreter::FSUBS, frd, fra, frb, rc); +} + +void Compiler::FADDS(u32 frd, u32 fra, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto res_f64 = m_ir_builder->CreateFAdd(ra_f64, rb_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FADDS", &PPUInterpreter::FADDS, frd, fra, frb, rc); +} + +void Compiler::FSQRTS(u32 frd, u32 frb, bool rc) { + auto rb_f64 = GetFpr(frb); + auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::sqrt, m_ir_builder->getDoubleTy()), rb_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FSQRTS", &PPUInterpreter::FSQRTS, frd, frb, rc); +} + +void Compiler::FRES(u32 frd, u32 frb, bool rc) { + InterpreterCall("FRES", &PPUInterpreter::FRES, frd, frb, rc); +} + +void Compiler::FMULS(u32 frd, u32 fra, u32 frc, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rc_f64 = GetFpr(frc); + auto res_f64 = m_ir_builder->CreateFMul(ra_f64, rc_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FMULS", &PPUInterpreter::FMULS, frd, fra, frc, rc); +} + +void Compiler::FMADDS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FMADDS", &PPUInterpreter::FMADDS, frd, fra, frc, frb, rc); +} + +void Compiler::FMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + rb_f64 = m_ir_builder->CreateFNeg(rb_f64); + auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FMSUBS", &PPUInterpreter::FMSUBS, frd, fra, frc, frb, rc); +} + +void Compiler::FNMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + rb_f64 = m_ir_builder->CreateFNeg(rb_f64); + auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + res_f64 = m_ir_builder->CreateFNeg(res_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FNMSUBS", &PPUInterpreter::FNMSUBS, frd, fra, frc, frb, rc); +} + +void Compiler::FNMADDS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + res_f64 = m_ir_builder->CreateFNeg(res_f64); + auto res_f32 = m_ir_builder->CreateFPTrunc(res_f64, m_ir_builder->getFloatTy()); + res_f64 = m_ir_builder->CreateFPExt(res_f32, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FNMADDS", &PPUInterpreter::FNMADDS, frd, fra, frc, frb, rc); +} + +void Compiler::STD(u32 rs, u32 ra, s32 d) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)d); + if (ra) { + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + } + + WriteMemory(addr_i64, GetGpr(rs, 64)); + //InterpreterCall("STD", &PPUInterpreter::STD, rs, ra, d); +} + +void Compiler::STDU(u32 rs, u32 ra, s32 ds) { + auto addr_i64 = (Value *)m_ir_builder->getInt64((s64)ds); + auto ra_i64 = GetGpr(ra); + addr_i64 = m_ir_builder->CreateAdd(ra_i64, addr_i64); + + WriteMemory(addr_i64, GetGpr(rs, 64)); + SetGpr(ra, addr_i64); + //InterpreterCall("STDU", &PPUInterpreter::STDU, rs, ra, ds); +} + +void Compiler::MTFSB1(u32 crbd, bool rc) { + InterpreterCall("MTFSB1", &PPUInterpreter::MTFSB1, crbd, rc); +} + +void Compiler::MCRFS(u32 crbd, u32 crbs) { + InterpreterCall("MCRFS", &PPUInterpreter::MCRFS, crbd, crbs); +} + +void Compiler::MTFSB0(u32 crbd, bool rc) { + InterpreterCall("MTFSB0", &PPUInterpreter::MTFSB0, crbd, rc); +} + +void Compiler::MTFSFI(u32 crfd, u32 i, bool rc) { + InterpreterCall("MTFSFI", &PPUInterpreter::MTFSFI, crfd, i, rc); +} + +void Compiler::MFFS(u32 frd, bool rc) { + InterpreterCall("MFFS", &PPUInterpreter::MFFS, frd, rc); +} + +void Compiler::MTFSF(u32 flm, u32 frb, bool rc) { + InterpreterCall("MTFSF", &PPUInterpreter::MTFSF, flm, frb, rc); +} + +void Compiler::FCMPU(u32 crfd, u32 fra, u32 frb) { + InterpreterCall("FCMPU", &PPUInterpreter::FCMPU, crfd, fra, frb); +} + +void Compiler::FRSP(u32 frd, u32 frb, bool rc) { + InterpreterCall("FRSP", &PPUInterpreter::FRSP, frd, frb, rc); +} + +void Compiler::FCTIW(u32 frd, u32 frb, bool rc) { + auto rb_f64 = GetFpr(frb); + auto res_i32 = m_ir_builder->CreateFPToSI(rb_f64, m_ir_builder->getInt32Ty()); + SetFpr(frd, res_i32); + + // TODO: Set flags / Handle NaN / Implement Saturation + //InterpreterCall("FCTIW", &PPUInterpreter::FCTIW, frd, frb, rc); +} + +void Compiler::FCTIWZ(u32 frd, u32 frb, bool rc) { + InterpreterCall("FCTIWZ", &PPUInterpreter::FCTIWZ, frd, frb, rc); +} + +void Compiler::FDIV(u32 frd, u32 fra, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto res_f64 = m_ir_builder->CreateFDiv(ra_f64, rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FDIV", &PPUInterpreter::FDIV, frd, fra, frb, rc); +} + +void Compiler::FSUB(u32 frd, u32 fra, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto res_f64 = m_ir_builder->CreateFSub(ra_f64, rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FSUB", &PPUInterpreter::FSUB, frd, fra, frb, rc); +} + +void Compiler::FADD(u32 frd, u32 fra, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto res_f64 = m_ir_builder->CreateFAdd(ra_f64, rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FADD", &PPUInterpreter::FADD, frd, fra, frb, rc); +} + +void Compiler::FSQRT(u32 frd, u32 frb, bool rc) { + auto rb_f64 = GetFpr(frb); + auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::sqrt, m_ir_builder->getDoubleTy()), rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FSQRT", &PPUInterpreter::FSQRT, frd, frb, rc); +} + +void Compiler::FSEL(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + InterpreterCall("FSEL", &PPUInterpreter::FSEL, frd, fra, frc, frb, rc); +} + +void Compiler::FMUL(u32 frd, u32 fra, u32 frc, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rc_f64 = GetFpr(frc); + auto res_f64 = m_ir_builder->CreateFMul(ra_f64, rc_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FMUL", &PPUInterpreter::FMUL, frd, fra, frc, rc); +} + +void Compiler::FRSQRTE(u32 frd, u32 frb, bool rc) { + InterpreterCall("FRSQRTE", &PPUInterpreter::FRSQRTE, frd, frb, rc); +} + +void Compiler::FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + rb_f64 = m_ir_builder->CreateFNeg(rb_f64); + auto res_f64 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FMSUB", &PPUInterpreter::FMSUB, frd, fra, frc, frb, rc); +} + +void Compiler::FMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + auto res_f64 = m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FMADD", &PPUInterpreter::FMADD, frd, fra, frc, frb, rc); +} + +void Compiler::FNMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + rc_f64 = m_ir_builder->CreateFNeg(rc_f64); + auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FNMSUB", &PPUInterpreter::FNMSUB, frd, fra, frc, frb, rc); +} + +void Compiler::FNMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) { + auto ra_f64 = GetFpr(fra); + auto rb_f64 = GetFpr(frb); + auto rc_f64 = GetFpr(frc); + rb_f64 = m_ir_builder->CreateFNeg(rb_f64); + rc_f64 = m_ir_builder->CreateFNeg(rc_f64); + auto res_f64 = (Value *)m_ir_builder->CreateCall3(Intrinsic::getDeclaration(m_module, Intrinsic::fmuladd, m_ir_builder->getDoubleTy()), ra_f64, rc_f64, rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FNMADD", &PPUInterpreter::FNMADD, frd, fra, frc, frb, rc); +} + +void Compiler::FCMPO(u32 crfd, u32 fra, u32 frb) { + InterpreterCall("FCMPO", &PPUInterpreter::FCMPO, crfd, fra, frb); +} + +void Compiler::FNEG(u32 frd, u32 frb, bool rc) { + auto rb_f64 = GetFpr(frb); + rb_f64 = m_ir_builder->CreateFNeg(rb_f64); + SetFpr(frd, rb_f64); + + // TODO: Set flags + //InterpreterCall("FNEG", &PPUInterpreter::FNEG, frd, frb, rc); +} + +void Compiler::FMR(u32 frd, u32 frb, bool rc) { + SetFpr(frd, GetFpr(frb)); + // TODO: Set flags + //InterpreterCall("FMR", &PPUInterpreter::FMR, frd, frb, rc); +} + +void Compiler::FNABS(u32 frd, u32 frb, bool rc) { + auto rb_f64 = GetFpr(frb); + auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::fabs, m_ir_builder->getDoubleTy()), rb_f64); + res_f64 = m_ir_builder->CreateFNeg(res_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FNABS", &PPUInterpreter::FNABS, frd, frb, rc); +} + +void Compiler::FABS(u32 frd, u32 frb, bool rc) { + auto rb_f64 = GetFpr(frb); + auto res_f64 = (Value *)m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::fabs, m_ir_builder->getDoubleTy()), rb_f64); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FABS", &PPUInterpreter::FABS, frd, frb, rc); +} + +void Compiler::FCTID(u32 frd, u32 frb, bool rc) { + auto rb_f64 = GetFpr(frb); + auto res_i64 = m_ir_builder->CreateFPToSI(rb_f64, m_ir_builder->getInt64Ty()); + SetFpr(frd, res_i64); + + // TODO: Set flags / Handle NaN / Implement Saturation + //InterpreterCall("FCTID", &PPUInterpreter::FCTID, frd, frb, rc); +} + +void Compiler::FCTIDZ(u32 frd, u32 frb, bool rc) { + InterpreterCall("FCTIDZ", &PPUInterpreter::FCTIDZ, frd, frb, rc); +} + +void Compiler::FCFID(u32 frd, u32 frb, bool rc) { + auto rb_i64 = GetFpr(frb, 64, true); + auto res_f64 = m_ir_builder->CreateSIToFP(rb_i64, m_ir_builder->getDoubleTy()); + SetFpr(frd, res_f64); + + // TODO: Set flags + //InterpreterCall("FCFID", &PPUInterpreter::FCFID, frd, frb, rc); +} + +void Compiler::UNK(const u32 code, const u32 opcode, const u32 gcode) { + //InterpreterCall("UNK", &PPUInterpreter::UNK, code, opcode, gcode); +} + +std::string Compiler::GetBasicBlockNameFromAddress(u32 address, const std::string & suffix) const { + std::string name; + + if (address == 0) { + name = "entry"; + } else if (address == 0xFFFFFFFF) { + name = "default_exit"; + } else { + name = fmt::Format("instr_0x%08X", address); + } + + if (suffix != "") { + name += "_" + suffix; + } + + return name; +} + +u32 Compiler::GetAddressFromBasicBlockName(const std::string & name) const { + if (name.compare(0, 6, "instr_") == 0) { + return strtoul(name.c_str() + 6, nullptr, 0); + } else if (name == GetBasicBlockNameFromAddress(0)) { + return 0; + } else if (name == GetBasicBlockNameFromAddress(0xFFFFFFFF)) { + return 0xFFFFFFFF; + } + + return 0; +} + +BasicBlock * Compiler::GetBasicBlockFromAddress(u32 address, const std::string & suffix, bool create_if_not_exist) { + auto block_name = GetBasicBlockNameFromAddress(address, suffix); + BasicBlock * block = nullptr; + BasicBlock * next_block = nullptr; + for (auto i = m_state.function->begin(); i != m_state.function->end(); i++) { + if (i->getName() == block_name) { + block = &(*i); + break; + } + +#ifdef _DEBUG + auto block_address = GetAddressFromBasicBlockName(i->getName()); + if (block_address > address) { + next_block = &(*i); + break; + } +#endif + } + + if (!block && create_if_not_exist) { + block = BasicBlock::Create(m_ir_builder->getContext(), block_name, m_state.function, next_block); + } + + return block; +} + +Value * Compiler::GetBit(Value * val, u32 n) { + Value * bit; + +#ifdef PPU_LLVM_RECOMPILER_USE_BMI + if (val->getType()->isIntegerTy(32)) { + bit = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_32), val, m_ir_builder->getInt32(1 << (31- n))); + } else if (val->getType()->isIntegerTy(64)) { + bit = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_64), val, m_ir_builder->getInt64((u64)1 << (63 - n))); + } else { +#endif + if (val->getType()->getIntegerBitWidth() != (n + 1)) { + bit = m_ir_builder->CreateLShr(val, val->getType()->getIntegerBitWidth() - n - 1); + } + + bit = m_ir_builder->CreateAnd(bit, 1); +#ifdef PPU_LLVM_RECOMPILER_USE_BMI + } +#endif + + return bit; +} + +Value * Compiler::ClrBit(Value * val, u32 n) { + return m_ir_builder->CreateAnd(val, ~((u64)1 << (val->getType()->getIntegerBitWidth() - n - 1))); +} + +Value * Compiler::SetBit(Value * val, u32 n, Value * bit, bool doClear) { + if (doClear) { + val = ClrBit(val, n); + } + + if (bit->getType()->getIntegerBitWidth() < val->getType()->getIntegerBitWidth()) { + bit = m_ir_builder->CreateZExt(bit, val->getType()); + } else if (bit->getType()->getIntegerBitWidth() > val->getType()->getIntegerBitWidth()) { + bit = m_ir_builder->CreateTrunc(bit, val->getType()); + } + + if (val->getType()->getIntegerBitWidth() != (n + 1)) { + bit = m_ir_builder->CreateShl(bit, bit->getType()->getIntegerBitWidth() - n - 1); + } + + return m_ir_builder->CreateOr(val, bit); +} + +Value * Compiler::GetNibble(Value * val, u32 n) { + Value * nibble; + +#ifdef PPU_LLVM_RECOMPILER_USE_BMI + if (val->getType()->isIntegerTy(32)) { + nibble = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_32), val, m_ir_builder->getInt32((u64)0xF << ((7 - n) * 4))); + } else if (val->getType()->isIntegerTy(64)) { + nibble = m_ir_builder->CreateCall2(Intrinsic::getDeclaration(m_module, Intrinsic::x86_bmi_pext_64), val, m_ir_builder->getInt64((u64)0xF << ((15 - n) * 4))); + } else { +#endif + if ((val->getType()->getIntegerBitWidth() >> 2) != (n + 1)) { + val = m_ir_builder->CreateLShr(val, (((val->getType()->getIntegerBitWidth() >> 2) - 1) - n) * 4); + } + + nibble = m_ir_builder->CreateAnd(val, 0xF); +#ifdef PPU_LLVM_RECOMPILER_USE_BMI + } +#endif + + return nibble; +} + +Value * Compiler::ClrNibble(Value * val, u32 n) { + return m_ir_builder->CreateAnd(val, ~((u64)0xF << ((((val->getType()->getIntegerBitWidth() >> 2) - 1) - n) * 4))); +} + +Value * Compiler::SetNibble(Value * val, u32 n, Value * nibble, bool doClear) { + if (doClear) { + val = ClrNibble(val, n); + } + + if (nibble->getType()->getIntegerBitWidth() < val->getType()->getIntegerBitWidth()) { + nibble = m_ir_builder->CreateZExt(nibble, val->getType()); + } else if (nibble->getType()->getIntegerBitWidth() > val->getType()->getIntegerBitWidth()) { + nibble = m_ir_builder->CreateTrunc(nibble, val->getType()); + } + + if ((val->getType()->getIntegerBitWidth() >> 2) != (n + 1)) { + nibble = m_ir_builder->CreateShl(nibble, (((val->getType()->getIntegerBitWidth() >> 2) - 1) - n) * 4); + } + + return m_ir_builder->CreateOr(val, nibble); +} + +Value * Compiler::SetNibble(Value * val, u32 n, Value * b0, Value * b1, Value * b2, Value * b3, bool doClear) { + if (doClear) { + val = ClrNibble(val, n); + } + + if (b0) { + val = SetBit(val, n * 4, b0, false); + } + + if (b1) { + val = SetBit(val, (n * 4) + 1, b1, false); + } + + if (b2) { + val = SetBit(val, (n * 4) + 2, b2, false); + } + + if (b3) { + val = SetBit(val, (n * 4) + 3, b3, false); + } + + return val; +} + +Value * Compiler::GetPc() { + auto pc_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, PC)); + auto pc_i32_ptr = m_ir_builder->CreateBitCast(pc_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(pc_i32_ptr, 4); +} + +void Compiler::SetPc(Value * val_ix) { + auto pc_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, PC)); + auto pc_i32_ptr = m_ir_builder->CreateBitCast(pc_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); + auto val_i32 = m_ir_builder->CreateZExtOrTrunc(val_ix, m_ir_builder->getInt32Ty()); + m_ir_builder->CreateAlignedStore(val_i32, pc_i32_ptr, 4); +} + +Value * Compiler::GetGpr(u32 r, u32 num_bits) { + auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, GPR[r])); + auto r_ix_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getIntNTy(num_bits)->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(r_ix_ptr, 8); +} + +void Compiler::SetGpr(u32 r, Value * val_x64) { + auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, GPR[r])); + auto r_i64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); + m_ir_builder->CreateAlignedStore(val_i64, r_i64_ptr, 8); +} + +Value * Compiler::GetCr() { + auto cr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, CR)); + auto cr_i32_ptr = m_ir_builder->CreateBitCast(cr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(cr_i32_ptr, 4); +} + +Value * Compiler::GetCrField(u32 n) { + return GetNibble(GetCr(), n); +} + +void Compiler::SetCr(Value * val_x32) { + auto val_i32 = m_ir_builder->CreateBitCast(val_x32, m_ir_builder->getInt32Ty()); + auto cr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, CR)); + auto cr_i32_ptr = m_ir_builder->CreateBitCast(cr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_i32, cr_i32_ptr, 4); +} + +void Compiler::SetCrField(u32 n, Value * field) { + SetCr(SetNibble(GetCr(), n, field)); +} + +void Compiler::SetCrField(u32 n, Value * b0, Value * b1, Value * b2, Value * b3) { + SetCr(SetNibble(GetCr(), n, b0, b1, b2, b3)); +} + +void Compiler::SetCrFieldSignedCmp(u32 n, Value * a, Value * b) { + auto lt_i1 = m_ir_builder->CreateICmpSLT(a, b); + auto gt_i1 = m_ir_builder->CreateICmpSGT(a, b); + auto eq_i1 = m_ir_builder->CreateICmpEQ(a, b); + auto cr_i32 = GetCr(); + cr_i32 = SetNibble(cr_i32, n, lt_i1, gt_i1, eq_i1, GetXerSo()); + SetCr(cr_i32); +} + +void Compiler::SetCrFieldUnsignedCmp(u32 n, Value * a, Value * b) { + auto lt_i1 = m_ir_builder->CreateICmpULT(a, b); + auto gt_i1 = m_ir_builder->CreateICmpUGT(a, b); + auto eq_i1 = m_ir_builder->CreateICmpEQ(a, b); + auto cr_i32 = GetCr(); + cr_i32 = SetNibble(cr_i32, n, lt_i1, gt_i1, eq_i1, GetXerSo()); + SetCr(cr_i32); +} + +void Compiler::SetCr6AfterVectorCompare(u32 vr) { + auto vr_v16i8 = GetVrAsIntVec(vr, 8); + auto vr_mask_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::x86_sse2_pmovmskb_128), vr_v16i8); + auto cmp0_i1 = m_ir_builder->CreateICmpEQ(vr_mask_i32, m_ir_builder->getInt32(0)); + auto cmp1_i1 = m_ir_builder->CreateICmpEQ(vr_mask_i32, m_ir_builder->getInt32(0xFFFF)); + auto cr_i32 = GetCr(); + cr_i32 = SetNibble(cr_i32, 6, cmp1_i1, nullptr, cmp0_i1, nullptr); + SetCr(cr_i32); +} + +Value * Compiler::GetLr() { + auto lr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, LR)); + auto lr_i64_ptr = m_ir_builder->CreateBitCast(lr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(lr_i64_ptr, 8); +} + +void Compiler::SetLr(Value * val_x64) { + auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); + auto lr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, LR)); + auto lr_i64_ptr = m_ir_builder->CreateBitCast(lr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_i64, lr_i64_ptr, 8); +} + +Value * Compiler::GetCtr() { + auto ctr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, CTR)); + auto ctr_i64_ptr = m_ir_builder->CreateBitCast(ctr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(ctr_i64_ptr, 8); +} + +void Compiler::SetCtr(Value * val_x64) { + auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); + auto ctr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, CTR)); + auto ctr_i64_ptr = m_ir_builder->CreateBitCast(ctr_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_i64, ctr_i64_ptr, 8); +} + +Value * Compiler::GetXer() { + auto xer_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, XER)); + auto xer_i64_ptr = m_ir_builder->CreateBitCast(xer_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(xer_i64_ptr, 8); +} + +Value * Compiler::GetXerCa() { + return GetBit(GetXer(), 34); +} + +Value * Compiler::GetXerSo() { + return GetBit(GetXer(), 32); +} + +void Compiler::SetXer(Value * val_x64) { + auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); + auto xer_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, XER)); + auto xer_i64_ptr = m_ir_builder->CreateBitCast(xer_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_i64, xer_i64_ptr, 8); +} + +void Compiler::SetXerCa(Value * ca) { + auto xer_i64 = GetXer(); + xer_i64 = SetBit(xer_i64, 34, ca); + SetXer(xer_i64); +} + +void Compiler::SetXerSo(Value * so) { + auto xer_i64 = GetXer(); + xer_i64 = SetBit(xer_i64, 32, so); + SetXer(xer_i64); +} + +Value * Compiler::GetUsprg0() { + auto usrpg0_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, USPRG)); + auto usprg0_i64_ptr = m_ir_builder->CreateBitCast(usrpg0_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(usprg0_i64_ptr, 8); +} + +void Compiler::SetUsprg0(Value * val_x64) { + auto val_i64 = m_ir_builder->CreateBitCast(val_x64, m_ir_builder->getInt64Ty()); + auto usprg0_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, USPRG)); + auto usprg0_i64_ptr = m_ir_builder->CreateBitCast(usprg0_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_i64, usprg0_i64_ptr, 8); +} + +Value * Compiler::GetFpr(u32 r, u32 bits, bool as_int) { + auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, FPR[r])); + if (!as_int) { + auto r_f64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getDoubleTy()->getPointerTo()); + auto r_f64 = m_ir_builder->CreateAlignedLoad(r_f64_ptr, 8); + if (bits == 32) { + return m_ir_builder->CreateFPTrunc(r_f64, m_ir_builder->getFloatTy()); + } else { + return r_f64; + } + } else { + auto r_i64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getInt64Ty()->getPointerTo()); + auto r_i64 = m_ir_builder->CreateAlignedLoad(r_i64_ptr, 8); + if (bits == 32) { + return m_ir_builder->CreateTrunc(r_i64, m_ir_builder->getInt32Ty()); + } else { + return r_i64; + } + } +} + +void Compiler::SetFpr(u32 r, Value * val) { + auto r_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, FPR[r])); + auto r_f64_ptr = m_ir_builder->CreateBitCast(r_i8_ptr, m_ir_builder->getDoubleTy()->getPointerTo()); + + Value* val_f64; + if (val->getType()->isDoubleTy() || val->getType()->isIntegerTy(64)) { + val_f64 = m_ir_builder->CreateBitCast(val, m_ir_builder->getDoubleTy()); + } else if (val->getType()->isFloatTy() || val->getType()->isIntegerTy(32)) { + auto val_f32 = m_ir_builder->CreateBitCast(val, m_ir_builder->getFloatTy()); + val_f64 = m_ir_builder->CreateFPExt(val_f32, m_ir_builder->getDoubleTy()); + } else { + assert(0); + } + + m_ir_builder->CreateAlignedStore(val_f64, r_f64_ptr, 8); +} + +Value * Compiler::GetVscr() { + auto vscr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, VSCR)); + auto vscr_i32_ptr = m_ir_builder->CreateBitCast(vscr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(vscr_i32_ptr, 4); +} + +void Compiler::SetVscr(Value * val_x32) { + auto val_i32 = m_ir_builder->CreateBitCast(val_x32, m_ir_builder->getInt32Ty()); + auto vscr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, VSCR)); + auto vscr_i32_ptr = m_ir_builder->CreateBitCast(vscr_i8_ptr, m_ir_builder->getInt32Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_i32, vscr_i32_ptr, 4); +} + +Value * Compiler::GetVr(u32 vr) { + auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, VPR[vr])); + auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(vr_i128_ptr, 16); +} + +Value * Compiler::GetVrAsIntVec(u32 vr, u32 vec_elt_num_bits) { + auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, VPR[vr])); + auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); + auto vr_vec_ptr = m_ir_builder->CreateBitCast(vr_i128_ptr, VectorType::get(m_ir_builder->getIntNTy(vec_elt_num_bits), 128 / vec_elt_num_bits)->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(vr_vec_ptr, 16); +} + +Value * Compiler::GetVrAsFloatVec(u32 vr) { + auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, VPR[vr])); + auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); + auto vr_v4f32_ptr = m_ir_builder->CreateBitCast(vr_i128_ptr, VectorType::get(m_ir_builder->getFloatTy(), 4)->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(vr_v4f32_ptr, 16); +} + +Value * Compiler::GetVrAsDoubleVec(u32 vr) { + auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, VPR[vr])); + auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); + auto vr_v2f64_ptr = m_ir_builder->CreateBitCast(vr_i128_ptr, VectorType::get(m_ir_builder->getDoubleTy(), 2)->getPointerTo()); + return m_ir_builder->CreateAlignedLoad(vr_v2f64_ptr, 16); +} + +void Compiler::SetVr(u32 vr, Value * val_x128) { + auto vr_i8_ptr = m_ir_builder->CreateConstGEP1_32(m_state.args[CompileTaskState::Args::State], (unsigned int)offsetof(PPUThread, VPR[vr])); + auto vr_i128_ptr = m_ir_builder->CreateBitCast(vr_i8_ptr, m_ir_builder->getIntNTy(128)->getPointerTo()); + auto val_i128 = m_ir_builder->CreateBitCast(val_x128, m_ir_builder->getIntNTy(128)); + m_ir_builder->CreateAlignedStore(val_i128, vr_i128_ptr, 16); +} + +Value * Compiler::CheckBranchCondition(u32 bo, u32 bi) { + bool bo0 = bo & 0x10 ? true : false; + bool bo1 = bo & 0x08 ? true : false; + bool bo2 = bo & 0x04 ? true : false; + bool bo3 = bo & 0x02 ? true : false; + + auto ctr_i64 = GetCtr(); + if (!bo2) { + ctr_i64 = m_ir_builder->CreateSub(ctr_i64, m_ir_builder->getInt64(1)); + SetCtr(ctr_i64); + } + + Value * ctr_ok_i1 = nullptr; + if (!bo2) { + // TODO: Check if we should compare all bits or just the lower 32 bits. This depends on MSR[SF]. Not sure what it is for PS3. + ctr_ok_i1 = m_ir_builder->CreateICmpNE(ctr_i64, m_ir_builder->getInt64(0)); + if (bo3) { + ctr_ok_i1 = m_ir_builder->CreateXor(ctr_ok_i1, m_ir_builder->getInt1(bo3)); + } + } + + Value * cond_ok_i1 = nullptr; + if (!bo0) { + auto cr_bi_i32 = GetBit(GetCr(), bi); + cond_ok_i1 = m_ir_builder->CreateTrunc(cr_bi_i32, m_ir_builder->getInt1Ty()); + if (!bo1) { + cond_ok_i1 = m_ir_builder->CreateXor(cond_ok_i1, m_ir_builder->getInt1(!bo1)); + } + } + + Value * cmp_i1 = nullptr; + if (ctr_ok_i1 && cond_ok_i1) { + cmp_i1 = m_ir_builder->CreateAnd(ctr_ok_i1, cond_ok_i1); + } else if (ctr_ok_i1) { + cmp_i1 = ctr_ok_i1; + } else if (cond_ok_i1) { + cmp_i1 = cond_ok_i1; + } + + return cmp_i1; +} + +void Compiler::CreateBranch(llvm::Value * cmp_i1, llvm::Value * target_i32, bool lk, bool target_is_lr) { + if (lk) { + SetLr(m_ir_builder->getInt64(m_state.current_instruction_address + 4)); + } + + auto current_block = m_ir_builder->GetInsertBlock(); + + BasicBlock * target_block = nullptr; + if (dyn_cast(target_i32)) { + // Target address is an immediate value. + u32 target_address = (u32)(dyn_cast(target_i32)->getLimitedValue()); + if (lk) { + // Function call + if (cmp_i1) { // There is no need to create a new block for an unconditional jump + target_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "target"); + m_ir_builder->SetInsertPoint(target_block); + } + + SetPc(target_i32); + IndirectCall(target_address, m_ir_builder->getInt64(0), true); + m_ir_builder->CreateBr(GetBasicBlockFromAddress(m_state.current_instruction_address + 4)); + } else { + // Local branch + target_block = GetBasicBlockFromAddress(target_address); + } + } else { + // Target address is in a register + if (cmp_i1) { // There is no need to create a new block for an unconditional jump + target_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "target"); + m_ir_builder->SetInsertPoint(target_block); + } + + SetPc(target_i32); + if (target_is_lr && !lk) { + // Return from this function + m_ir_builder->CreateRet(m_ir_builder->getInt32(0)); + } else if (lk) { + auto next_block = GetBasicBlockFromAddress(m_state.current_instruction_address + 4); + auto unknown_function_block = GetBasicBlockFromAddress(m_state.current_instruction_address, "unknown_function"); + + auto switch_instr = m_ir_builder->CreateSwitch(target_i32, unknown_function_block); + m_ir_builder->SetInsertPoint(unknown_function_block); + m_ir_builder->CreateCall3(m_execute_unknown_function, m_state.args[CompileTaskState::Args::State], m_state.args[CompileTaskState::Args::Interpreter], m_ir_builder->getInt64(0)); + m_ir_builder->CreateBr(next_block); + + auto call_i = m_state.cfg->calls.find(m_state.current_instruction_address); + if (call_i != m_state.cfg->calls.end()) { + for (auto function_i = call_i->second.begin(); function_i != call_i->second.end(); function_i++) { + auto block = GetBasicBlockFromAddress(m_state.current_instruction_address, fmt::Format("0x%08X", *function_i)); + m_ir_builder->SetInsertPoint(block); + IndirectCall(*function_i, m_ir_builder->getInt64(0), true); + m_ir_builder->CreateBr(next_block); + switch_instr->addCase(m_ir_builder->getInt32(*function_i), block); + } + } + } else { + auto switch_instr = m_ir_builder->CreateSwitch(target_i32, GetBasicBlockFromAddress(0xFFFFFFFF)); + auto branch_i = m_state.cfg->branches.find(m_state.current_instruction_address); + if (branch_i != m_state.cfg->branches.end()) { + for (auto next_instr_i = branch_i->second.begin(); next_instr_i != branch_i->second.end(); next_instr_i++) { + switch_instr->addCase(m_ir_builder->getInt32(*next_instr_i), GetBasicBlockFromAddress(*next_instr_i)); + } + } + } + } + + if (cmp_i1) { + // Conditional branch + auto next_block = GetBasicBlockFromAddress(m_state.current_instruction_address + 4); + m_ir_builder->SetInsertPoint(current_block); + m_ir_builder->CreateCondBr(cmp_i1, target_block, next_block); + } else { + // Unconditional branch + if (target_block) { + m_ir_builder->SetInsertPoint(current_block); + m_ir_builder->CreateBr(target_block); + } + } + + m_state.hit_branch_instruction = true; +} + +Value * Compiler::ReadMemory(Value * addr_i64, u32 bits, u32 alignment, bool bswap, bool could_be_mmio) { + if (bits != 32 || could_be_mmio == false) { + auto eaddr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::get_ptr(0))); + auto eaddr_ix_ptr = m_ir_builder->CreateIntToPtr(eaddr_i64, m_ir_builder->getIntNTy(bits)->getPointerTo()); + auto val_ix = (Value *)m_ir_builder->CreateLoad(eaddr_ix_ptr, alignment); + if (bits > 8 && bswap) { + val_ix = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getIntNTy(bits)), val_ix); + } + + return val_ix; + } else { + auto cmp_i1 = m_ir_builder->CreateICmpULT(addr_i64, m_ir_builder->getInt64(RAW_SPU_BASE_ADDR)); + auto then_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "then"); + auto else_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "else"); + auto merge_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "merge"); + m_ir_builder->CreateCondBr(cmp_i1, then_bb, else_bb); + + m_ir_builder->SetInsertPoint(then_bb); + auto eaddr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::get_ptr(0))); + auto eaddr_i32_ptr = m_ir_builder->CreateIntToPtr(eaddr_i64, m_ir_builder->getInt32Ty()->getPointerTo()); + auto val_then_i32 = (Value *)m_ir_builder->CreateAlignedLoad(eaddr_i32_ptr, alignment); + if (bswap) { + val_then_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt32Ty()), val_then_i32); + } + + m_ir_builder->CreateBr(merge_bb); + + m_ir_builder->SetInsertPoint(else_bb); + auto val_else_i32 = Call("vm.read32", (u32(*)(u64))vm::read32, addr_i64); + if (!bswap) { + val_else_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt32Ty()), val_else_i32); + } + m_ir_builder->CreateBr(merge_bb); + + m_ir_builder->SetInsertPoint(merge_bb); + auto phi = m_ir_builder->CreatePHI(m_ir_builder->getInt32Ty(), 2); + phi->addIncoming(val_then_i32, then_bb); + phi->addIncoming(val_else_i32, else_bb); + return phi; + } +} + +void Compiler::WriteMemory(Value * addr_i64, Value * val_ix, u32 alignment, bool bswap, bool could_be_mmio) { + addr_i64 = m_ir_builder->CreateAnd(addr_i64, 0xFFFFFFFF); + if (val_ix->getType()->getIntegerBitWidth() != 32 || could_be_mmio == false) { + if (val_ix->getType()->getIntegerBitWidth() > 8 && bswap) { + val_ix = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, val_ix->getType()), val_ix); + } + + auto eaddr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::get_ptr(0))); + auto eaddr_ix_ptr = m_ir_builder->CreateIntToPtr(eaddr_i64, val_ix->getType()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_ix, eaddr_ix_ptr, alignment); + } else { + auto cmp_i1 = m_ir_builder->CreateICmpULT(addr_i64, m_ir_builder->getInt64(RAW_SPU_BASE_ADDR)); + auto then_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "then"); + auto else_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "else"); + auto merge_bb = GetBasicBlockFromAddress(m_state.current_instruction_address, "merge"); + m_ir_builder->CreateCondBr(cmp_i1, then_bb, else_bb); + + m_ir_builder->SetInsertPoint(then_bb); + Value * val_then_i32 = val_ix; + if (bswap) { + val_then_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt32Ty()), val_then_i32); + } + + auto eaddr_i64 = m_ir_builder->CreateAdd(addr_i64, m_ir_builder->getInt64((u64)vm::get_ptr(0))); + auto eaddr_i32_ptr = m_ir_builder->CreateIntToPtr(eaddr_i64, m_ir_builder->getInt32Ty()->getPointerTo()); + m_ir_builder->CreateAlignedStore(val_then_i32, eaddr_i32_ptr, alignment); + m_ir_builder->CreateBr(merge_bb); + + m_ir_builder->SetInsertPoint(else_bb); + Value * val_else_i32 = val_ix; + if (!bswap) { + val_else_i32 = m_ir_builder->CreateCall(Intrinsic::getDeclaration(m_module, Intrinsic::bswap, m_ir_builder->getInt32Ty()), val_else_i32); + } + + Call("vm.write32", (void(*)(u32, u32))vm::write32, addr_i64, val_else_i32); + m_ir_builder->CreateBr(merge_bb); + + m_ir_builder->SetInsertPoint(merge_bb); + } +} + +template +Value * Compiler::InterpreterCall(const char * name, Func function, Args... args) { + auto i = m_stats.interpreter_fallback_stats.find(name); + if (i == m_stats.interpreter_fallback_stats.end()) { + i = m_stats.interpreter_fallback_stats.insert(m_stats.interpreter_fallback_stats.end(), std::make_pair(name, 0)); + } + + i->second++; + + return Call(name, function, m_state.args[CompileTaskState::Args::Interpreter], m_ir_builder->getInt32(args)...); +} + +template +Type * Compiler::CppToLlvmType() { + if (std::is_void::value) { + return m_ir_builder->getVoidTy(); + } else if (std::is_same::value || std::is_same::value) { + return m_ir_builder->getInt64Ty(); + } else if (std::is_same::value || std::is_same::value) { + return m_ir_builder->getInt32Ty(); + } else if (std::is_same::value || std::is_same::value) { + return m_ir_builder->getInt16Ty(); + } else if (std::is_same::value || std::is_same::value) { + return m_ir_builder->getInt8Ty(); + } else if (std::is_same::value) { + return m_ir_builder->getFloatTy(); + } else if (std::is_same::value) { + return m_ir_builder->getDoubleTy(); + } else if (std::is_pointer::value) { + return m_ir_builder->getInt8PtrTy(); + } else { + assert(0); + } + + return nullptr; +} + +template +Value * Compiler::Call(const char * name, Func function, Args... args) { + auto fn = m_module->getFunction(name); + if (!fn) { + std::vector fn_args_type = {args->getType()...}; + auto fn_type = FunctionType::get(CppToLlvmType(), fn_args_type, false); + fn = cast(m_module->getOrInsertFunction(name, fn_type)); + fn->setCallingConv(CallingConv::X86_64_Win64); + m_execution_engine->addGlobalMapping(fn, (void *&)function); + } + + std::vector fn_args = {args...}; + return m_ir_builder->CreateCall(fn, fn_args); +} + +llvm::Value * Compiler::IndirectCall(u32 address, Value * context_i64, bool is_function) { + auto ordinal = m_recompilation_engine.AllocateOrdinal(address, is_function); + auto location_i64 = m_ir_builder->getInt64(m_recompilation_engine.GetAddressOfExecutableLookup() + (ordinal * sizeof(u64))); + auto location_i64_ptr = m_ir_builder->CreateIntToPtr(location_i64, m_ir_builder->getInt64Ty()->getPointerTo()); + auto executable_i64 = m_ir_builder->CreateLoad(location_i64_ptr); + auto executable_ptr = m_ir_builder->CreateIntToPtr(executable_i64, m_compiled_function_type->getPointerTo()); + return m_ir_builder->CreateCall3(executable_ptr, m_state.args[CompileTaskState::Args::State], m_state.args[CompileTaskState::Args::Interpreter], context_i64); +} + +void Compiler::InitRotateMask() { + for (u32 mb = 0; mb < 64; mb++) { + for (u32 me = 0; me < 64; me++) { + u64 mask = ((u64)-1 >> mb) ^ ((me >= 63) ? 0 : (u64)-1 >> (me + 1)); + s_rotate_mask[mb][me] = mb > me ? ~mask : mask; + } + } +} + +std::mutex RecompilationEngine::s_mutex; +std::shared_ptr RecompilationEngine::s_the_instance = nullptr; + +RecompilationEngine::RecompilationEngine() + : ThreadBase("PPU Recompilation Engine") + , m_next_ordinal(0) + , m_compiler(*this, ExecutionEngine::ExecuteFunction, ExecutionEngine::ExecuteTillReturn) { + std::string error; + m_log = new raw_fd_ostream("PPULLVMRecompiler.log", error, sys::fs::F_Text); + m_log->SetUnbuffered(); +} + +RecompilationEngine::~RecompilationEngine() { + Stop(); +} + +u32 RecompilationEngine::AllocateOrdinal(u32 address, bool is_function) { + std::lock_guard lock(m_address_to_ordinal_lock); + + auto i = m_address_to_ordinal.find(address); + if (i == m_address_to_ordinal.end()) { + assert(m_next_ordinal < (sizeof(m_executable_lookup) / sizeof(m_executable_lookup[0]))); + + m_executable_lookup[m_next_ordinal] = is_function ? ExecutionEngine::ExecuteFunction : ExecutionEngine::ExecuteTillReturn; + std::atomic_thread_fence(std::memory_order_release); + i = m_address_to_ordinal.insert(m_address_to_ordinal.end(), std::make_pair(address, m_next_ordinal++)); + } + + return i->second; +} + +u32 RecompilationEngine::GetOrdinal(u32 address) const { + std::lock_guard lock(m_address_to_ordinal_lock); + + auto i = m_address_to_ordinal.find(address); + if (i != m_address_to_ordinal.end()) { + return i->second; + } else { + return 0xFFFFFFFF; + } +} + +const Executable RecompilationEngine::GetExecutable(u32 ordinal) const { + std::atomic_thread_fence(std::memory_order_acquire); + return m_executable_lookup[ordinal]; +} + +u64 RecompilationEngine::GetAddressOfExecutableLookup() const { + return (u64)m_executable_lookup; +} + +void RecompilationEngine::NotifyTrace(ExecutionTrace * execution_trace) { + { + std::lock_guard lock(m_pending_execution_traces_lock); + m_pending_execution_traces.push_back(execution_trace); + } + + if (!IsAlive()) { + Start(); + } + + Notify(); + // TODO: Increase the priority of the recompilation engine thread +} + +raw_fd_ostream & RecompilationEngine::Log() { + return *m_log; +} + +void RecompilationEngine::Task() { + bool work_done_this_iteration = false; + bool work_done_last_iteration = false; + std::chrono::nanoseconds idling_time(0); + std::chrono::nanoseconds recompiling_time(0); + + auto start = std::chrono::high_resolution_clock::now(); + while (!TestDestroy() && !Emu.IsStopped()) { + work_done_last_iteration = work_done_this_iteration; + work_done_this_iteration = false; + ExecutionTrace * execution_trace = nullptr; + + { + std::lock_guard lock(m_pending_execution_traces_lock); + + auto i = m_pending_execution_traces.begin(); + if (i != m_pending_execution_traces.end()) { + execution_trace = *i; + m_pending_execution_traces.erase(i); + } + } + + if (execution_trace) { + ProcessExecutionTrace(*execution_trace); + delete execution_trace; + work_done_this_iteration = true; + } + + if (!work_done_this_iteration) { + // TODO: Reduce the priority of the recompilation engine thread if its set to high priority + } + + if (!work_done_this_iteration && !work_done_last_iteration) { + auto recompiling_start = std::chrono::high_resolution_clock::now(); + + // Recompile the function with the most number of compiled fragments + auto candidate = m_function_table.end(); + for (auto function_i = m_function_table.begin(); function_i != m_function_table.end(); function_i++) { + if ((*function_i)->num_compiled_fragments && (*function_i)->blocks.front()->IsFunction() && (*function_i)->blocks.front()->is_compiled) { + if (candidate != m_function_table.end()) { + if ((*function_i)->num_compiled_fragments > (*candidate)->num_compiled_fragments) { + candidate = function_i; + } + } else { + candidate = function_i; + } + } + } + + if (candidate != m_function_table.end()) { + Log() << "Recompiling: " << (*candidate)->ToString() << "\n"; + CompileBlock(*(*candidate), *((*candidate)->blocks.front())); + work_done_this_iteration = true; + } + + auto recompiling_end = std::chrono::high_resolution_clock::now(); + recompiling_time += std::chrono::duration_cast(recompiling_end - recompiling_start); + } + + if (!work_done_this_iteration) { + // Wait a few ms for something to happen + auto idling_start = std::chrono::high_resolution_clock::now(); + WaitForAnySignal(250); + auto idling_end = std::chrono::high_resolution_clock::now(); + idling_time += std::chrono::duration_cast(idling_end - idling_start); + } + } + + std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now(); + auto total_time = std::chrono::duration_cast(end - start); + auto compiler_stats = m_compiler.GetStats(); + + Log() << "Total time = " << total_time.count() / 1000000 << "ms\n"; + Log() << " Time spent compiling = " << compiler_stats.total_time.count() / 1000000 << "ms\n"; + Log() << " Time spent building IR = " << compiler_stats.ir_build_time.count() / 1000000 << "ms\n"; + Log() << " Time spent optimizing = " << compiler_stats.optimization_time.count() / 1000000 << "ms\n"; + Log() << " Time spent translating = " << compiler_stats.translation_time.count() / 1000000 << "ms\n"; + Log() << " Time spent recompiling = " << recompiling_time.count() / 1000000 << "ms\n"; + Log() << " Time spent idling = " << idling_time.count() / 1000000 << "ms\n"; + Log() << " Time spent doing misc tasks = " << (total_time.count() - idling_time.count() - compiler_stats.total_time.count()) / 1000000 << "ms\n"; + Log() << "Ordinals allocated = " << m_next_ordinal << "\n"; + Log() << "\nInterpreter fallback stats:\n"; + for (auto i = compiler_stats.interpreter_fallback_stats.begin(); i != compiler_stats.interpreter_fallback_stats.end(); i++) { + Log() << i->first << " = " << i->second << "\n"; + } + + LOG_NOTICE(PPU, "PPU LLVM Recompilation thread exiting."); + s_the_instance = nullptr; // Can cause deadlock if this is the last instance. Need to fix this. +} + +void RecompilationEngine::ProcessExecutionTrace(const ExecutionTrace & execution_trace) { + auto function_i = m_function_table.end(); + + auto execution_trace_id = execution_trace.GetId(); + auto processed_execution_trace_i = m_processed_execution_traces.find(execution_trace_id); + if (processed_execution_trace_i == m_processed_execution_traces.end()) { +#ifdef _DEBUG + Log() << "Trace: " << execution_trace.ToString() << "\n"; +#endif + + std::vector tmp_block_list; + + auto split_trace = false; + auto block_i = m_block_table.end(); + for (auto trace_i = execution_trace.entries.begin(); trace_i != execution_trace.entries.end(); trace_i++) { + if (trace_i->type == ExecutionTraceEntry::Type::CompiledBlock) { + block_i = m_block_table.end(); + split_trace = true; + } + + if (block_i == m_block_table.end()) { + BlockEntry key(trace_i->GetPrimaryAddress(), execution_trace.function_address); + + block_i = m_block_table.find(&key); + if (block_i == m_block_table.end()) { + block_i = m_block_table.insert(m_block_table.end(), new BlockEntry(key.cfg.start_address, key.cfg.function_address)); + + if (function_i == m_function_table.end()) { + FunctionEntry key(execution_trace.function_address); + function_i = m_function_table.find(&key); + if (function_i == m_function_table.end()) { + function_i = m_function_table.insert(m_function_table.end(), new FunctionEntry(key.address)); + } + } + + // Update the function table + (*function_i)->AddBlock(*block_i); + } + + tmp_block_list.push_back(*block_i); + } + + const ExecutionTraceEntry * next_trace = nullptr; + if (trace_i + 1 != execution_trace.entries.end()) { + next_trace = &(*(trace_i + 1)); + } else if (!split_trace && execution_trace.type == ExecutionTrace::Type::Loop) { + next_trace = &(*(execution_trace.entries.begin())); + } + + UpdateControlFlowGraph((*block_i)->cfg, *trace_i, next_trace); + } + + processed_execution_trace_i = m_processed_execution_traces.insert(m_processed_execution_traces.end(), std::make_pair(execution_trace_id, std::move(tmp_block_list))); + } + + for (auto i = processed_execution_trace_i->second.begin(); i != processed_execution_trace_i->second.end(); i++) { + if (!(*i)->is_compiled) { + (*i)->num_hits++; + if ((*i)->num_hits >= 1000) { // TODO: Make this configurable + if (function_i == m_function_table.end()) { + FunctionEntry key(execution_trace.function_address); + function_i = m_function_table.find(&key); + } + + CompileBlock(*(*function_i), *(*i)); + (*i)->is_compiled = true; + } + } + } + + std::remove_if(processed_execution_trace_i->second.begin(), processed_execution_trace_i->second.end(), [](const BlockEntry * b)->bool { return b->is_compiled; }); +} + +void RecompilationEngine::UpdateControlFlowGraph(ControlFlowGraph & cfg, const ExecutionTraceEntry & this_entry, const ExecutionTraceEntry * next_entry) { + if (this_entry.type == ExecutionTraceEntry::Type::Instruction) { + cfg.instruction_addresses.insert(this_entry.GetPrimaryAddress()); + + if (next_entry) { + if (next_entry->type == ExecutionTraceEntry::Type::Instruction || next_entry->type == ExecutionTraceEntry::Type::CompiledBlock) { + if (next_entry->GetPrimaryAddress() != (this_entry.GetPrimaryAddress() + 4)) { + cfg.branches[this_entry.GetPrimaryAddress()].insert(next_entry->GetPrimaryAddress()); + } + } else if (next_entry->type == ExecutionTraceEntry::Type::FunctionCall) { + cfg.calls[this_entry.data.instruction.address].insert(next_entry->GetPrimaryAddress()); + } + } + } else if (this_entry.type == ExecutionTraceEntry::Type::CompiledBlock) { + if (next_entry) { + if (next_entry->type == ExecutionTraceEntry::Type::Instruction || next_entry->type == ExecutionTraceEntry::Type::CompiledBlock) { + cfg.branches[this_entry.data.compiled_block.exit_address].insert(next_entry->GetPrimaryAddress()); + } else if (next_entry->type == ExecutionTraceEntry::Type::FunctionCall) { + cfg.calls[this_entry.data.compiled_block.exit_address].insert(next_entry->GetPrimaryAddress()); + } + } + } +} + +void RecompilationEngine::CompileBlock(FunctionEntry & function_entry, BlockEntry & block_entry) { +#ifdef _DEBUG + Log() << "Compile: " << block_entry.ToString() << "\n"; +#endif + + ControlFlowGraph temp_cfg(block_entry.cfg.start_address, block_entry.cfg.function_address); + ControlFlowGraph * cfg; + if (block_entry.IsFunction()) { + // Form a CFG by merging all the blocks in this function + for (auto block_i = function_entry.blocks.begin(); block_i != function_entry.blocks.end(); block_i++) { + temp_cfg += (*block_i)->cfg; + } + + cfg = &temp_cfg; + } else { + cfg = &block_entry.cfg; + } + +#ifdef _DEBUG + Log() << "CFG: " << cfg->ToString() << "\n"; +#endif + + auto ordinal = AllocateOrdinal(block_entry.cfg.start_address, block_entry.IsFunction()); + auto executable = m_compiler.Compile(fmt::Format("fn_0x%08X_%u", block_entry.cfg.start_address, block_entry.revision++), *cfg, true, + block_entry.IsFunction() ? true : false /*generate_linkable_exits*/); + m_executable_lookup[ordinal] = executable; + + if (block_entry.IsFunction()) { + function_entry.num_compiled_fragments = 0; + } else { + function_entry.num_compiled_fragments++; + } +} + +std::shared_ptr RecompilationEngine::GetInstance() { + std::lock_guard lock(s_mutex); + + if (s_the_instance == nullptr) { + s_the_instance = std::shared_ptr(new RecompilationEngine()); + } + + return s_the_instance; +} + +Tracer::Tracer() + : m_recompilation_engine(RecompilationEngine::GetInstance()) { + m_stack.reserve(100); +} + +Tracer::~Tracer() { + Terminate(); +} + +void Tracer::Trace(TraceType trace_type, u32 arg1, u32 arg2) { + ExecutionTrace * execution_trace = nullptr; + + switch (trace_type) { + case TraceType::CallFunction: + // arg1 is address of the function + m_stack.back()->entries.push_back(ExecutionTraceEntry(ExecutionTraceEntry::Type::FunctionCall, arg1)); + break; + case TraceType::EnterFunction: + // arg1 is address of the function + m_stack.push_back(new ExecutionTrace(arg1)); + break; + case TraceType::ExitFromCompiledFunction: + // arg1 is address of function. + // arg2 is the address of the exit instruction. + if (arg2) { + m_stack.push_back(new ExecutionTrace(arg1)); + m_stack.back()->entries.push_back(ExecutionTraceEntry(ExecutionTraceEntry::Type::CompiledBlock, arg1, arg2)); + } + break; + case TraceType::Return: + // No args used + execution_trace = m_stack.back(); + execution_trace->type = ExecutionTrace::Type::Linear; + m_stack.pop_back(); + break; + case TraceType::Instruction: + // arg1 is the address of the instruction + for (int i = (int)m_stack.back()->entries.size() - 1; i >= 0; i--) { + if ((m_stack.back()->entries[i].type == ExecutionTraceEntry::Type::Instruction && m_stack.back()->entries[i].data.instruction.address == arg1) || + (m_stack.back()->entries[i].type == ExecutionTraceEntry::Type::CompiledBlock && m_stack.back()->entries[i].data.compiled_block.entry_address == arg1)) { + // Found a loop + execution_trace = new ExecutionTrace(m_stack.back()->function_address); + execution_trace->type = ExecutionTrace::Type::Loop; + std::copy(m_stack.back()->entries.begin() + i, m_stack.back()->entries.end(), std::back_inserter(execution_trace->entries)); + m_stack.back()->entries.erase(m_stack.back()->entries.begin() + i + 1, m_stack.back()->entries.end()); + break; + } + } + + if (!execution_trace) { + // A loop was not found + m_stack.back()->entries.push_back(ExecutionTraceEntry(ExecutionTraceEntry::Type::Instruction, arg1)); + } + break; + case TraceType::ExitFromCompiledBlock: + // arg1 is address of the compiled block. + // arg2 is the address of the exit instruction. + m_stack.back()->entries.push_back(ExecutionTraceEntry(ExecutionTraceEntry::Type::CompiledBlock, arg1, arg2)); + + if (arg2 == 0) { + // Return from function + execution_trace = m_stack.back(); + execution_trace->type = ExecutionTrace::Type::Linear; + m_stack.pop_back(); + } + break; + default: + assert(0); + break; + } + + if (execution_trace) { + m_recompilation_engine->NotifyTrace(execution_trace); + } +} + +void Tracer::Terminate() { + // TODO: Notify recompilation engine +} + +ppu_recompiler_llvm::ExecutionEngine::ExecutionEngine(PPUThread & ppu) + : m_ppu(ppu) + , m_interpreter(new PPUInterpreter(ppu)) + , m_decoder(m_interpreter) + , m_last_cache_clear_time(std::chrono::high_resolution_clock::now()) + , m_recompilation_engine(RecompilationEngine::GetInstance()) { +} + +ppu_recompiler_llvm::ExecutionEngine::~ExecutionEngine() { + +} + +u8 ppu_recompiler_llvm::ExecutionEngine::DecodeMemory(const u32 address) { + ExecuteFunction(&m_ppu, m_interpreter, 0); + return 0; +} + +void ppu_recompiler_llvm::ExecutionEngine::RemoveUnusedEntriesFromCache() const { + auto now = std::chrono::high_resolution_clock::now(); + if (std::chrono::duration_cast(now - m_last_cache_clear_time).count() > 10000) { + for (auto i = m_address_to_ordinal.begin(); i != m_address_to_ordinal.end();) { + auto tmp = i; + i++; + if (tmp->second.second == 0) { + m_address_to_ordinal.erase(tmp); + } else { + tmp->second.second = 0; + } + } + + m_last_cache_clear_time = now; + } +} + +Executable ppu_recompiler_llvm::ExecutionEngine::GetExecutable(u32 address, Executable default_executable) const { + // Find the ordinal for the specified address and insert it to the cache + auto i = m_address_to_ordinal.find(address); + if (i == m_address_to_ordinal.end()) { + auto ordinal = m_recompilation_engine->GetOrdinal(address); + if (ordinal != 0xFFFFFFFF) { + i = m_address_to_ordinal.insert(m_address_to_ordinal.end(), std::make_pair(address, std::make_pair(ordinal, 0))); + } + } + + Executable executable = default_executable; + if (i != m_address_to_ordinal.end()) { + i->second.second++; + executable = m_recompilation_engine->GetExecutable(i->second.first); + } + + RemoveUnusedEntriesFromCache(); + return executable; +} + +u32 ppu_recompiler_llvm::ExecutionEngine::ExecuteFunction(PPUThread * ppu_state, PPUInterpreter * interpreter, u64 context) { + auto execution_engine = (ExecutionEngine *)ppu_state->GetDecoder(); + execution_engine->m_tracer.Trace(Tracer::TraceType::EnterFunction, ppu_state->PC, 0); + return ExecuteTillReturn(ppu_state, interpreter, 0); +} + +u32 ppu_recompiler_llvm::ExecutionEngine::ExecuteTillReturn(PPUThread * ppu_state, PPUInterpreter * interpreter, u64 context) { + auto execution_engine = (ExecutionEngine *)ppu_state->GetDecoder(); + auto terminate = false; + auto branch_type = BranchType::NonBranch; + + if (context) { + execution_engine->m_tracer.Trace(Tracer::TraceType::ExitFromCompiledFunction, context >> 32, context & 0xFFFFFFFF); + } + + while (!terminate && !Emu.IsStopped()) { + if (Emu.IsPaused()) { + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + continue; + } + + auto executable = execution_engine->GetExecutable(ppu_state->PC, ExecuteTillReturn); + if (executable != ExecuteTillReturn && executable != ExecuteFunction) { + auto entry = ppu_state->PC; + auto exit = (u32)executable(ppu_state, interpreter, 0); + execution_engine->m_tracer.Trace(Tracer::TraceType::ExitFromCompiledBlock, entry, exit); + if (exit == 0) { + terminate = true; + } + } else { + execution_engine->m_tracer.Trace(Tracer::TraceType::Instruction, ppu_state->PC, 0); + auto instruction = re32(vm::get_ref(ppu_state->PC)); + execution_engine->m_decoder.Decode(instruction); + branch_type = ppu_state->m_is_branch ? GetBranchTypeFromInstruction(instruction) : BranchType::NonBranch; + ppu_state->NextPc(4); + + switch (branch_type) { + case BranchType::Return: + execution_engine->m_tracer.Trace(Tracer::TraceType::Return, 0, 0); + terminate = true; + break; + case BranchType::FunctionCall: + execution_engine->m_tracer.Trace(Tracer::TraceType::CallFunction, ppu_state->PC, 0); + executable = execution_engine->GetExecutable(ppu_state->PC, ExecuteFunction); + executable(ppu_state, interpreter, 0); + break; + case BranchType::LocalBranch: + break; + case BranchType::NonBranch: + break; + default: + assert(0); + break; + } + } + } + + return 0; +} + +BranchType ppu_recompiler_llvm::GetBranchTypeFromInstruction(u32 instruction) { + auto type = BranchType::NonBranch; + auto field1 = instruction >> 26; + auto lk = instruction & 1; + + if (field1 == 16 || field1 == 18) { + type = lk ? BranchType::FunctionCall : BranchType::LocalBranch; + } else if (field1 == 19) { + u32 field2 = (instruction >> 1) & 0x3FF; + if (field2 == 16) { + type = lk ? BranchType::FunctionCall : BranchType::Return; + } else if (field2 == 528) { + type = lk ? BranchType::FunctionCall : BranchType::LocalBranch; + } + } + + return type; +} diff --git a/rpcs3/Emu/Cell/PPULLVMRecompiler.h b/rpcs3/Emu/Cell/PPULLVMRecompiler.h new file mode 100644 index 0000000000..0da0c1835e --- /dev/null +++ b/rpcs3/Emu/Cell/PPULLVMRecompiler.h @@ -0,0 +1,1213 @@ +#ifndef PPU_LLVM_RECOMPILER_H +#define PPU_LLVM_RECOMPILER_H + +#ifdef LLVM_AVAILABLE +#define PPU_LLVM_RECOMPILER 1 + +#include "Emu/Cell/PPUDecoder.h" +#include "Emu/Cell/PPUThread.h" +#include "Emu/Cell/PPUInterpreter.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/GlobalVariable.h" +#include "llvm/ExecutionEngine/JIT.h" +#include "llvm/PassManager.h" + +namespace ppu_recompiler_llvm { + class Compiler; + class RecompilationEngine; + class Tracer; + class ExecutionEngine; + struct PPUState; + + /// An entry in an execution trace + struct ExecutionTraceEntry { + /// Data associated with the entry. This is discriminated by type. + union { + struct Instruction { + u32 address; + } instruction; + + struct FunctionCall { + u32 address; + } function_call; + + struct CompiledBlock { + u32 entry_address; + u32 exit_address; + } compiled_block; + } data; + + /// The type of the entry + enum class Type { + FunctionCall, + Instruction, + CompiledBlock, + } type; + + ExecutionTraceEntry(Type type, u32 arg1, u32 arg2 = 0) + : type(type) { + switch (type) { + case Type::Instruction: + data.instruction.address = arg1; + break; + case Type::FunctionCall: + data.function_call.address = arg1; + break; + case Type::CompiledBlock: + data.compiled_block.entry_address = arg1; + data.compiled_block.exit_address = arg2; + break; + default: + assert(0); + break; + } + } + + u32 GetPrimaryAddress() const { + switch (type) { + case Type::Instruction: + return data.instruction.address; + case Type::FunctionCall: + return data.function_call.address; + case Type::CompiledBlock: + return data.compiled_block.entry_address; + default: + assert(0); + return 0; + } + } + + std::string ToString() const { + switch (type) { + case Type::Instruction: + return fmt::Format("I:0x%08X", data.instruction.address); + case Type::FunctionCall: + return fmt::Format("F:0x%08X", data.function_call.address); + case Type::CompiledBlock: + return fmt::Format("C:0x%08X-0x%08X", data.compiled_block.entry_address, data.compiled_block.exit_address); + default: + assert(0); + return ""; + } + } + + u64 hash() const { + u64 hash = ((u64)type << 32); + switch (type) { + case Type::Instruction: + hash |= data.instruction.address; + break; + case Type::FunctionCall: + hash |= data.function_call.address; + break; + case Type::CompiledBlock: + hash = data.compiled_block.exit_address; + hash <<= 32; + hash |= data.compiled_block.entry_address; + break; + default: + assert(0); + break; + } + + return hash; + } + }; + + /// An execution trace. + struct ExecutionTrace { + /// Unique id of an execution trace; + typedef u64 Id; + + /// The function to which this trace belongs + u32 function_address; + + /// Execution trace type + enum class Type { + Linear, + Loop, + } type; + + /// entries in the trace + std::vector entries; + + ExecutionTrace(u32 address) + : function_address(address) { + } + + std::string ToString() const { + auto s = fmt::Format("0x%08X %s ->", function_address, type == ExecutionTrace::Type::Loop ? "Loop" : "Linear"); + for (auto i = 0; i < entries.size(); i++) { + s += " " + entries[i].ToString(); + } + + return s; + } + + Id GetId() const { + Id id = 0; + + for (auto i = entries.begin(); i != entries.end(); i++) { + id ^= i->hash(); + id <<= 1; + } + + return id; + } + }; + + /// A control flow graph + struct ControlFlowGraph { + /// Address of the first instruction + u32 start_address; + + /// Address of the function to which this CFG belongs to + u32 function_address; + + /// Set of addresses of the instructions in the CFG + std::set instruction_addresses; + + /// Branches in the CFG. + /// Key is the address of an instruction + /// Data is the set of all instructions to which this instruction branches to. + std::map> branches; + + /// Function calls in the CFG + /// Key is the address of an instruction + /// Data is the set of all functions which this instruction invokes. + std::map> calls; + + ControlFlowGraph(u32 start_address, u32 function_address) + : start_address(start_address) + , function_address(function_address) { + } + + void operator += (const ControlFlowGraph & other) { + for (auto i = other.instruction_addresses.begin(); i != other.instruction_addresses.end(); i++) { + instruction_addresses.insert(*i); + } + + for (auto i = other.branches.begin(); i != other.branches.end(); i++) { + auto j = branches.find(i->first); + if (j == branches.end()) { + j = branches.insert(branches.begin(), std::make_pair(i->first, std::set())); + } + + for (auto k = i->second.begin(); k != i->second.end(); k++) { + j->second.insert(*k); + } + } + + for (auto i = other.calls.begin(); i != other.calls.end(); i++) { + auto j = calls.find(i->first); + if (j == calls.end()) { + j = calls.insert(calls.begin(), std::make_pair(i->first, std::set())); + } + + for (auto k = i->second.begin(); k != i->second.end(); k++) { + j->second.insert(*k); + } + } + } + + std::string ToString() const { + auto s = fmt::Format("0x%08X (0x%08X):", start_address, function_address); + for (auto i = instruction_addresses.begin(); i != instruction_addresses.end(); i++) { + s += fmt::Format(" 0x%08X", *i); + } + + s += "\nBranches:"; + for (auto i = branches.begin(); i != branches.end(); i++) { + s += fmt::Format("\n0x%08X ->", i->first); + for (auto j = i->second.begin(); j != i->second.end(); j++) { + s += fmt::Format(" 0x%08X", *j); + } + } + + s += "\nCalls:"; + for (auto i = calls.begin(); i != calls.end(); i++) { + s += fmt::Format("\n0x%08X ->", i->first); + for (auto j = i->second.begin(); j != i->second.end(); j++) { + s += fmt::Format(" 0x%08X", *j); + } + } + + return s; + } + }; + + enum class BranchType { + NonBranch, + LocalBranch, + FunctionCall, + Return, + }; + + /// Pointer to an executable + typedef u32(*Executable)(PPUThread * ppu_state, PPUInterpreter * interpreter, u64 context); + + /// PPU compiler that uses LLVM for code generation and optimization + class Compiler : protected PPUOpcodes, protected PPCDecoder { + public: + struct Stats { + /// Time spent building the LLVM IR + std::chrono::nanoseconds ir_build_time; + + /// Time spent optimizing + std::chrono::nanoseconds optimization_time; + + /// Time spent translating LLVM IR to machine code + std::chrono::nanoseconds translation_time; + + /// Total time + std::chrono::nanoseconds total_time; + + /// Contains the number of times interpreter fallback was used + std::map interpreter_fallback_stats; + }; + + Compiler(RecompilationEngine & recompilation_engine, const Executable execute_unknown_function, const Executable execute_unknown_block); + + Compiler(const Compiler & other) = delete; + Compiler(Compiler && other) = delete; + + virtual ~Compiler(); + + Compiler & operator = (const Compiler & other) = delete; + Compiler & operator = (Compiler && other) = delete; + + /// Compile a code fragment described by a cfg and return an executable + Executable Compile(const std::string & name, const ControlFlowGraph & cfg, bool inline_all_blocks, bool generate_linkable_exits); + + /// Free an executable earilier obtained via a call to Compile + void FreeExecutable(const std::string & name); + + /// Retrieve compiler stats + Stats GetStats(); + + /// Execute all tests + void RunAllTests(PPUThread * ppu_state, PPUInterpreter * interpreter); + + protected: + void Decode(const u32 code) override; + + void NULL_OP() override; + void NOP() override; + + void TDI(u32 to, u32 ra, s32 simm16) override; + void TWI(u32 to, u32 ra, s32 simm16) override; + + void MFVSCR(u32 vd) override; + void MTVSCR(u32 vb) override; + void VADDCUW(u32 vd, u32 va, u32 vb) override; + void VADDFP(u32 vd, u32 va, u32 vb) override; + void VADDSBS(u32 vd, u32 va, u32 vb) override; + void VADDSHS(u32 vd, u32 va, u32 vb) override; + void VADDSWS(u32 vd, u32 va, u32 vb) override; + void VADDUBM(u32 vd, u32 va, u32 vb) override; + void VADDUBS(u32 vd, u32 va, u32 vb) override; + void VADDUHM(u32 vd, u32 va, u32 vb) override; + void VADDUHS(u32 vd, u32 va, u32 vb) override; + void VADDUWM(u32 vd, u32 va, u32 vb) override; + void VADDUWS(u32 vd, u32 va, u32 vb) override; + void VAND(u32 vd, u32 va, u32 vb) override; + void VANDC(u32 vd, u32 va, u32 vb) override; + void VAVGSB(u32 vd, u32 va, u32 vb) override; + void VAVGSH(u32 vd, u32 va, u32 vb) override; + void VAVGSW(u32 vd, u32 va, u32 vb) override; + void VAVGUB(u32 vd, u32 va, u32 vb) override; + void VAVGUH(u32 vd, u32 va, u32 vb) override; + void VAVGUW(u32 vd, u32 va, u32 vb) override; + void VCFSX(u32 vd, u32 uimm5, u32 vb) override; + void VCFUX(u32 vd, u32 uimm5, u32 vb) override; + void VCMPBFP(u32 vd, u32 va, u32 vb) override; + void VCMPBFP_(u32 vd, u32 va, u32 vb) override; + void VCMPEQFP(u32 vd, u32 va, u32 vb) override; + void VCMPEQFP_(u32 vd, u32 va, u32 vb) override; + void VCMPEQUB(u32 vd, u32 va, u32 vb) override; + void VCMPEQUB_(u32 vd, u32 va, u32 vb) override; + void VCMPEQUH(u32 vd, u32 va, u32 vb) override; + void VCMPEQUH_(u32 vd, u32 va, u32 vb) override; + void VCMPEQUW(u32 vd, u32 va, u32 vb) override; + void VCMPEQUW_(u32 vd, u32 va, u32 vb) override; + void VCMPGEFP(u32 vd, u32 va, u32 vb) override; + void VCMPGEFP_(u32 vd, u32 va, u32 vb) override; + void VCMPGTFP(u32 vd, u32 va, u32 vb) override; + void VCMPGTFP_(u32 vd, u32 va, u32 vb) override; + void VCMPGTSB(u32 vd, u32 va, u32 vb) override; + void VCMPGTSB_(u32 vd, u32 va, u32 vb) override; + void VCMPGTSH(u32 vd, u32 va, u32 vb) override; + void VCMPGTSH_(u32 vd, u32 va, u32 vb) override; + void VCMPGTSW(u32 vd, u32 va, u32 vb) override; + void VCMPGTSW_(u32 vd, u32 va, u32 vb) override; + void VCMPGTUB(u32 vd, u32 va, u32 vb) override; + void VCMPGTUB_(u32 vd, u32 va, u32 vb) override; + void VCMPGTUH(u32 vd, u32 va, u32 vb) override; + void VCMPGTUH_(u32 vd, u32 va, u32 vb) override; + void VCMPGTUW(u32 vd, u32 va, u32 vb) override; + void VCMPGTUW_(u32 vd, u32 va, u32 vb) override; + void VCTSXS(u32 vd, u32 uimm5, u32 vb) override; + void VCTUXS(u32 vd, u32 uimm5, u32 vb) override; + void VEXPTEFP(u32 vd, u32 vb) override; + void VLOGEFP(u32 vd, u32 vb) override; + void VMADDFP(u32 vd, u32 va, u32 vc, u32 vb) override; + void VMAXFP(u32 vd, u32 va, u32 vb) override; + void VMAXSB(u32 vd, u32 va, u32 vb) override; + void VMAXSH(u32 vd, u32 va, u32 vb) override; + void VMAXSW(u32 vd, u32 va, u32 vb) override; + void VMAXUB(u32 vd, u32 va, u32 vb) override; + void VMAXUH(u32 vd, u32 va, u32 vb) override; + void VMAXUW(u32 vd, u32 va, u32 vb) override; + void VMHADDSHS(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMHRADDSHS(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMINFP(u32 vd, u32 va, u32 vb) override; + void VMINSB(u32 vd, u32 va, u32 vb) override; + void VMINSH(u32 vd, u32 va, u32 vb) override; + void VMINSW(u32 vd, u32 va, u32 vb) override; + void VMINUB(u32 vd, u32 va, u32 vb) override; + void VMINUH(u32 vd, u32 va, u32 vb) override; + void VMINUW(u32 vd, u32 va, u32 vb) override; + void VMLADDUHM(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMRGHB(u32 vd, u32 va, u32 vb) override; + void VMRGHH(u32 vd, u32 va, u32 vb) override; + void VMRGHW(u32 vd, u32 va, u32 vb) override; + void VMRGLB(u32 vd, u32 va, u32 vb) override; + void VMRGLH(u32 vd, u32 va, u32 vb) override; + void VMRGLW(u32 vd, u32 va, u32 vb) override; + void VMSUMMBM(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMSUMSHM(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMSUMSHS(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMSUMUBM(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMSUMUHM(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMSUMUHS(u32 vd, u32 va, u32 vb, u32 vc) override; + void VMULESB(u32 vd, u32 va, u32 vb) override; + void VMULESH(u32 vd, u32 va, u32 vb) override; + void VMULEUB(u32 vd, u32 va, u32 vb) override; + void VMULEUH(u32 vd, u32 va, u32 vb) override; + void VMULOSB(u32 vd, u32 va, u32 vb) override; + void VMULOSH(u32 vd, u32 va, u32 vb) override; + void VMULOUB(u32 vd, u32 va, u32 vb) override; + void VMULOUH(u32 vd, u32 va, u32 vb) override; + void VNMSUBFP(u32 vd, u32 va, u32 vc, u32 vb) override; + void VNOR(u32 vd, u32 va, u32 vb) override; + void VOR(u32 vd, u32 va, u32 vb) override; + void VPERM(u32 vd, u32 va, u32 vb, u32 vc) override; + void VPKPX(u32 vd, u32 va, u32 vb) override; + void VPKSHSS(u32 vd, u32 va, u32 vb) override; + void VPKSHUS(u32 vd, u32 va, u32 vb) override; + void VPKSWSS(u32 vd, u32 va, u32 vb) override; + void VPKSWUS(u32 vd, u32 va, u32 vb) override; + void VPKUHUM(u32 vd, u32 va, u32 vb) override; + void VPKUHUS(u32 vd, u32 va, u32 vb) override; + void VPKUWUM(u32 vd, u32 va, u32 vb) override; + void VPKUWUS(u32 vd, u32 va, u32 vb) override; + void VREFP(u32 vd, u32 vb) override; + void VRFIM(u32 vd, u32 vb) override; + void VRFIN(u32 vd, u32 vb) override; + void VRFIP(u32 vd, u32 vb) override; + void VRFIZ(u32 vd, u32 vb) override; + void VRLB(u32 vd, u32 va, u32 vb) override; + void VRLH(u32 vd, u32 va, u32 vb) override; + void VRLW(u32 vd, u32 va, u32 vb) override; + void VRSQRTEFP(u32 vd, u32 vb) override; + void VSEL(u32 vd, u32 va, u32 vb, u32 vc) override; + void VSL(u32 vd, u32 va, u32 vb) override; + void VSLB(u32 vd, u32 va, u32 vb) override; + void VSLDOI(u32 vd, u32 va, u32 vb, u32 sh) override; + void VSLH(u32 vd, u32 va, u32 vb) override; + void VSLO(u32 vd, u32 va, u32 vb) override; + void VSLW(u32 vd, u32 va, u32 vb) override; + void VSPLTB(u32 vd, u32 uimm5, u32 vb) override; + void VSPLTH(u32 vd, u32 uimm5, u32 vb) override; + void VSPLTISB(u32 vd, s32 simm5) override; + void VSPLTISH(u32 vd, s32 simm5) override; + void VSPLTISW(u32 vd, s32 simm5) override; + void VSPLTW(u32 vd, u32 uimm5, u32 vb) override; + void VSR(u32 vd, u32 va, u32 vb) override; + void VSRAB(u32 vd, u32 va, u32 vb) override; + void VSRAH(u32 vd, u32 va, u32 vb) override; + void VSRAW(u32 vd, u32 va, u32 vb) override; + void VSRB(u32 vd, u32 va, u32 vb) override; + void VSRH(u32 vd, u32 va, u32 vb) override; + void VSRO(u32 vd, u32 va, u32 vb) override; + void VSRW(u32 vd, u32 va, u32 vb) override; + void VSUBCUW(u32 vd, u32 va, u32 vb) override; + void VSUBFP(u32 vd, u32 va, u32 vb) override; + void VSUBSBS(u32 vd, u32 va, u32 vb) override; + void VSUBSHS(u32 vd, u32 va, u32 vb) override; + void VSUBSWS(u32 vd, u32 va, u32 vb) override; + void VSUBUBM(u32 vd, u32 va, u32 vb) override; + void VSUBUBS(u32 vd, u32 va, u32 vb) override; + void VSUBUHM(u32 vd, u32 va, u32 vb) override; + void VSUBUHS(u32 vd, u32 va, u32 vb) override; + void VSUBUWM(u32 vd, u32 va, u32 vb) override; + void VSUBUWS(u32 vd, u32 va, u32 vb) override; + void VSUMSWS(u32 vd, u32 va, u32 vb) override; + void VSUM2SWS(u32 vd, u32 va, u32 vb) override; + void VSUM4SBS(u32 vd, u32 va, u32 vb) override; + void VSUM4SHS(u32 vd, u32 va, u32 vb) override; + void VSUM4UBS(u32 vd, u32 va, u32 vb) override; + void VUPKHPX(u32 vd, u32 vb) override; + void VUPKHSB(u32 vd, u32 vb) override; + void VUPKHSH(u32 vd, u32 vb) override; + void VUPKLPX(u32 vd, u32 vb) override; + void VUPKLSB(u32 vd, u32 vb) override; + void VUPKLSH(u32 vd, u32 vb) override; + void VXOR(u32 vd, u32 va, u32 vb) override; + void MULLI(u32 rd, u32 ra, s32 simm16) override; + void SUBFIC(u32 rd, u32 ra, s32 simm16) override; + void CMPLI(u32 bf, u32 l, u32 ra, u32 uimm16) override; + void CMPI(u32 bf, u32 l, u32 ra, s32 simm16) override; + void ADDIC(u32 rd, u32 ra, s32 simm16) override; + void ADDIC_(u32 rd, u32 ra, s32 simm16) override; + void ADDI(u32 rd, u32 ra, s32 simm16) override; + void ADDIS(u32 rd, u32 ra, s32 simm16) override; + void BC(u32 bo, u32 bi, s32 bd, u32 aa, u32 lk) override; + void SC(u32 sc_code) override; + void B(s32 ll, u32 aa, u32 lk) override; + void MCRF(u32 crfd, u32 crfs) override; + void BCLR(u32 bo, u32 bi, u32 bh, u32 lk) override; + void CRNOR(u32 bt, u32 ba, u32 bb) override; + void CRANDC(u32 bt, u32 ba, u32 bb) override; + void ISYNC() override; + void CRXOR(u32 bt, u32 ba, u32 bb) override; + void CRNAND(u32 bt, u32 ba, u32 bb) override; + void CRAND(u32 bt, u32 ba, u32 bb) override; + void CREQV(u32 bt, u32 ba, u32 bb) override; + void CRORC(u32 bt, u32 ba, u32 bb) override; + void CROR(u32 bt, u32 ba, u32 bb) override; + void BCCTR(u32 bo, u32 bi, u32 bh, u32 lk) override; + void RLWIMI(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, bool rc) override; + void RLWINM(u32 ra, u32 rs, u32 sh, u32 mb, u32 me, bool rc) override; + void RLWNM(u32 ra, u32 rs, u32 rb, u32 MB, u32 ME, bool rc) override; + void ORI(u32 rs, u32 ra, u32 uimm16) override; + void ORIS(u32 rs, u32 ra, u32 uimm16) override; + void XORI(u32 ra, u32 rs, u32 uimm16) override; + void XORIS(u32 ra, u32 rs, u32 uimm16) override; + void ANDI_(u32 ra, u32 rs, u32 uimm16) override; + void ANDIS_(u32 ra, u32 rs, u32 uimm16) override; + void RLDICL(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) override; + void RLDICR(u32 ra, u32 rs, u32 sh, u32 me, bool rc) override; + void RLDIC(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) override; + void RLDIMI(u32 ra, u32 rs, u32 sh, u32 mb, bool rc) override; + void RLDC_LR(u32 ra, u32 rs, u32 rb, u32 m_eb, bool is_r, bool rc) override; + void CMP(u32 crfd, u32 l, u32 ra, u32 rb) override; + void TW(u32 to, u32 ra, u32 rb) override; + void LVSL(u32 vd, u32 ra, u32 rb) override; + void LVEBX(u32 vd, u32 ra, u32 rb) override; + void SUBFC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void MULHDU(u32 rd, u32 ra, u32 rb, bool rc) override; + void ADDC(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void MULHWU(u32 rd, u32 ra, u32 rb, bool rc) override; + void MFOCRF(u32 a, u32 rd, u32 crm) override; + void LWARX(u32 rd, u32 ra, u32 rb) override; + void LDX(u32 ra, u32 rs, u32 rb) override; + void LWZX(u32 rd, u32 ra, u32 rb) override; + void SLW(u32 ra, u32 rs, u32 rb, bool rc) override; + void CNTLZW(u32 ra, u32 rs, bool rc) override; + void SLD(u32 ra, u32 rs, u32 rb, bool rc) override; + void AND(u32 ra, u32 rs, u32 rb, bool rc) override; + void CMPL(u32 bf, u32 l, u32 ra, u32 rb) override; + void LVSR(u32 vd, u32 ra, u32 rb) override; + void LVEHX(u32 vd, u32 ra, u32 rb) override; + void SUBF(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void LDUX(u32 rd, u32 ra, u32 rb) override; + void DCBST(u32 ra, u32 rb) override; + void LWZUX(u32 rd, u32 ra, u32 rb) override; + void CNTLZD(u32 ra, u32 rs, bool rc) override; + void ANDC(u32 ra, u32 rs, u32 rb, bool rc) override; + void TD(u32 to, u32 ra, u32 rb) override; + void LVEWX(u32 vd, u32 ra, u32 rb) override; + void MULHD(u32 rd, u32 ra, u32 rb, bool rc) override; + void MULHW(u32 rd, u32 ra, u32 rb, bool rc) override; + void LDARX(u32 rd, u32 ra, u32 rb) override; + void DCBF(u32 ra, u32 rb) override; + void LBZX(u32 rd, u32 ra, u32 rb) override; + void LVX(u32 vd, u32 ra, u32 rb) override; + void NEG(u32 rd, u32 ra, u32 oe, bool rc) override; + void LBZUX(u32 rd, u32 ra, u32 rb) override; + void NOR(u32 ra, u32 rs, u32 rb, bool rc) override; + void STVEBX(u32 vs, u32 ra, u32 rb) override; + void SUBFE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void ADDE(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void MTOCRF(u32 l, u32 crm, u32 rs) override; + void STDX(u32 rs, u32 ra, u32 rb) override; + void STWCX_(u32 rs, u32 ra, u32 rb) override; + void STWX(u32 rs, u32 ra, u32 rb) override; + void STVEHX(u32 vs, u32 ra, u32 rb) override; + void STDUX(u32 rs, u32 ra, u32 rb) override; + void STWUX(u32 rs, u32 ra, u32 rb) override; + void STVEWX(u32 vs, u32 ra, u32 rb) override; + void SUBFZE(u32 rd, u32 ra, u32 oe, bool rc) override; + void ADDZE(u32 rd, u32 ra, u32 oe, bool rc) override; + void STDCX_(u32 rs, u32 ra, u32 rb) override; + void STBX(u32 rs, u32 ra, u32 rb) override; + void STVX(u32 vs, u32 ra, u32 rb) override; + void MULLD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void SUBFME(u32 rd, u32 ra, u32 oe, bool rc) override; + void ADDME(u32 rd, u32 ra, u32 oe, bool rc) override; + void MULLW(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void DCBTST(u32 ra, u32 rb, u32 th) override; + void STBUX(u32 rs, u32 ra, u32 rb) override; + void ADD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void DCBT(u32 ra, u32 rb, u32 th) override; + void LHZX(u32 rd, u32 ra, u32 rb) override; + void EQV(u32 ra, u32 rs, u32 rb, bool rc) override; + void ECIWX(u32 rd, u32 ra, u32 rb) override; + void LHZUX(u32 rd, u32 ra, u32 rb) override; + void XOR(u32 rs, u32 ra, u32 rb, bool rc) override; + void MFSPR(u32 rd, u32 spr) override; + void LWAX(u32 rd, u32 ra, u32 rb) override; + void DST(u32 ra, u32 rb, u32 strm, u32 t) override; + void LHAX(u32 rd, u32 ra, u32 rb) override; + void LVXL(u32 vd, u32 ra, u32 rb) override; + void MFTB(u32 rd, u32 spr) override; + void LWAUX(u32 rd, u32 ra, u32 rb) override; + void DSTST(u32 ra, u32 rb, u32 strm, u32 t) override; + void LHAUX(u32 rd, u32 ra, u32 rb) override; + void STHX(u32 rs, u32 ra, u32 rb) override; + void ORC(u32 rs, u32 ra, u32 rb, bool rc) override; + void ECOWX(u32 rs, u32 ra, u32 rb) override; + void STHUX(u32 rs, u32 ra, u32 rb) override; + void OR(u32 ra, u32 rs, u32 rb, bool rc) override; + void DIVDU(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void DIVWU(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void MTSPR(u32 spr, u32 rs) override; + void DCBI(u32 ra, u32 rb) override; + void NAND(u32 ra, u32 rs, u32 rb, bool rc) override; + void STVXL(u32 vs, u32 ra, u32 rb) override; + void DIVD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void DIVW(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) override; + void LVLX(u32 vd, u32 ra, u32 rb) override; + void LDBRX(u32 rd, u32 ra, u32 rb) override; + void LSWX(u32 rd, u32 ra, u32 rb) override; + void LWBRX(u32 rd, u32 ra, u32 rb) override; + void LFSX(u32 frd, u32 ra, u32 rb) override; + void SRW(u32 ra, u32 rs, u32 rb, bool rc) override; + void SRD(u32 ra, u32 rs, u32 rb, bool rc) override; + void LVRX(u32 vd, u32 ra, u32 rb) override; + void LSWI(u32 rd, u32 ra, u32 nb) override; + void LFSUX(u32 frd, u32 ra, u32 rb) override; + void SYNC(u32 l) override; + void LFDX(u32 frd, u32 ra, u32 rb) override; + void LFDUX(u32 frd, u32 ra, u32 rb) override; + void STVLX(u32 vs, u32 ra, u32 rb) override; + void STSWX(u32 rs, u32 ra, u32 rb) override; + void STWBRX(u32 rs, u32 ra, u32 rb) override; + void STFSX(u32 frs, u32 ra, u32 rb) override; + void STVRX(u32 vs, u32 ra, u32 rb) override; + void STFSUX(u32 frs, u32 ra, u32 rb) override; + void STSWI(u32 rd, u32 ra, u32 nb) override; + void STFDX(u32 frs, u32 ra, u32 rb) override; + void STFDUX(u32 frs, u32 ra, u32 rb) override; + void LVLXL(u32 vd, u32 ra, u32 rb) override; + void LHBRX(u32 rd, u32 ra, u32 rb) override; + void SRAW(u32 ra, u32 rs, u32 rb, bool rc) override; + void SRAD(u32 ra, u32 rs, u32 rb, bool rc) override; + void LVRXL(u32 vd, u32 ra, u32 rb) override; + void DSS(u32 strm, u32 a) override; + void SRAWI(u32 ra, u32 rs, u32 sh, bool rc) override; + void SRADI1(u32 ra, u32 rs, u32 sh, bool rc) override; + void SRADI2(u32 ra, u32 rs, u32 sh, bool rc) override; + void EIEIO() override; + void STVLXL(u32 vs, u32 ra, u32 rb) override; + void STHBRX(u32 rs, u32 ra, u32 rb) override; + void EXTSH(u32 ra, u32 rs, bool rc) override; + void STVRXL(u32 sd, u32 ra, u32 rb) override; + void EXTSB(u32 ra, u32 rs, bool rc) override; + void STFIWX(u32 frs, u32 ra, u32 rb) override; + void EXTSW(u32 ra, u32 rs, bool rc) override; + void ICBI(u32 ra, u32 rb) override; + void DCBZ(u32 ra, u32 rb) override; + void LWZ(u32 rd, u32 ra, s32 d) override; + void LWZU(u32 rd, u32 ra, s32 d) override; + void LBZ(u32 rd, u32 ra, s32 d) override; + void LBZU(u32 rd, u32 ra, s32 d) override; + void STW(u32 rs, u32 ra, s32 d) override; + void STWU(u32 rs, u32 ra, s32 d) override; + void STB(u32 rs, u32 ra, s32 d) override; + void STBU(u32 rs, u32 ra, s32 d) override; + void LHZ(u32 rd, u32 ra, s32 d) override; + void LHZU(u32 rd, u32 ra, s32 d) override; + void LHA(u32 rs, u32 ra, s32 d) override; + void LHAU(u32 rs, u32 ra, s32 d) override; + void STH(u32 rs, u32 ra, s32 d) override; + void STHU(u32 rs, u32 ra, s32 d) override; + void LMW(u32 rd, u32 ra, s32 d) override; + void STMW(u32 rs, u32 ra, s32 d) override; + void LFS(u32 frd, u32 ra, s32 d) override; + void LFSU(u32 frd, u32 ra, s32 d) override; + void LFD(u32 frd, u32 ra, s32 d) override; + void LFDU(u32 frd, u32 ra, s32 d) override; + void STFS(u32 frs, u32 ra, s32 d) override; + void STFSU(u32 frs, u32 ra, s32 d) override; + void STFD(u32 frs, u32 ra, s32 d) override; + void STFDU(u32 frs, u32 ra, s32 d) override; + void LD(u32 rd, u32 ra, s32 ds) override; + void LDU(u32 rd, u32 ra, s32 ds) override; + void LWA(u32 rd, u32 ra, s32 ds) override; + void FDIVS(u32 frd, u32 fra, u32 frb, bool rc) override; + void FSUBS(u32 frd, u32 fra, u32 frb, bool rc) override; + void FADDS(u32 frd, u32 fra, u32 frb, bool rc) override; + void FSQRTS(u32 frd, u32 frb, bool rc) override; + void FRES(u32 frd, u32 frb, bool rc) override; + void FMULS(u32 frd, u32 fra, u32 frc, bool rc) override; + void FMADDS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FNMSUBS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FNMADDS(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void STD(u32 rs, u32 ra, s32 ds) override; + void STDU(u32 rs, u32 ra, s32 ds) override; + void MTFSB1(u32 bt, bool rc) override; + void MCRFS(u32 bf, u32 bfa) override; + void MTFSB0(u32 bt, bool rc) override; + void MTFSFI(u32 crfd, u32 i, bool rc) override; + void MFFS(u32 frd, bool rc) override; + void MTFSF(u32 flm, u32 frb, bool rc) override; + + void FCMPU(u32 bf, u32 fra, u32 frb) override; + void FRSP(u32 frd, u32 frb, bool rc) override; + void FCTIW(u32 frd, u32 frb, bool rc) override; + void FCTIWZ(u32 frd, u32 frb, bool rc) override; + void FDIV(u32 frd, u32 fra, u32 frb, bool rc) override; + void FSUB(u32 frd, u32 fra, u32 frb, bool rc) override; + void FADD(u32 frd, u32 fra, u32 frb, bool rc) override; + void FSQRT(u32 frd, u32 frb, bool rc) override; + void FSEL(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FMUL(u32 frd, u32 fra, u32 frc, bool rc) override; + void FRSQRTE(u32 frd, u32 frb, bool rc) override; + void FMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FNMSUB(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FNMADD(u32 frd, u32 fra, u32 frc, u32 frb, bool rc) override; + void FCMPO(u32 crfd, u32 fra, u32 frb) override; + void FNEG(u32 frd, u32 frb, bool rc) override; + void FMR(u32 frd, u32 frb, bool rc) override; + void FNABS(u32 frd, u32 frb, bool rc) override; + void FABS(u32 frd, u32 frb, bool rc) override; + void FCTID(u32 frd, u32 frb, bool rc) override; + void FCTIDZ(u32 frd, u32 frb, bool rc) override; + void FCFID(u32 frd, u32 frb, bool rc) override; + + void UNK(const u32 code, const u32 opcode, const u32 gcode) override; + + private: + /// State of a compilation task + struct CompileTaskState { + enum Args { + State, + Interpreter, + Context, + MaxArgs, + }; + + /// The LLVM function for the compilation task + llvm::Function * function; + + /// Args of the LLVM function + llvm::Value * args[MaxArgs]; + + /// The CFG being compiled + const ControlFlowGraph * cfg; + + /// Address of the current instruction being compiled + u32 current_instruction_address; + + /// A flag used to detect branch instructions. + /// This is set to false at the start of compilation of an instruction. + /// If a branch instruction is encountered, this is set to true by the decode function. + bool hit_branch_instruction; + + /// Indicates whether a block should be inlined even if an already compiled version of the block exists + bool inline_all; + + /// Create code such that exit points can be linked to other blocks + bool generate_linkable_exits; + }; + + /// Recompilation engine + RecompilationEngine & m_recompilation_engine; + + /// The function that will be called to execute unknown functions + llvm::Function * m_execute_unknown_function; + + /// The executable that will be called to execute unknown blocks + llvm::Function * m_execute_unknown_block; + + /// LLVM context + llvm::LLVMContext * m_llvm_context; + + /// LLVM IR builder + llvm::IRBuilder<> * m_ir_builder; + + /// Module to which all generated code is output to + llvm::Module * m_module; + + /// JIT execution engine + llvm::ExecutionEngine * m_execution_engine; + + /// Function pass manager + llvm::FunctionPassManager * m_fpm; + + /// LLVM type of the functions genreated by the compiler + llvm::FunctionType * m_compiled_function_type; + + /// State of the current compilation task + CompileTaskState m_state; + + /// Compiler stats + Stats m_stats; + + /// Get the name of the basic block for the specified address + std::string GetBasicBlockNameFromAddress(u32 address, const std::string & suffix = "") const; + + /// Get the address of a basic block from its name + u32 GetAddressFromBasicBlockName(const std::string & name) const; + + /// Get the basic block in for the specified address. + llvm::BasicBlock * GetBasicBlockFromAddress(u32 address, const std::string & suffix = "", bool create_if_not_exist = true); + + /// Get a bit + llvm::Value * GetBit(llvm::Value * val, u32 n); + + /// Clear a bit + llvm::Value * ClrBit(llvm::Value * val, u32 n); + + /// Set a bit + llvm::Value * SetBit(llvm::Value * val, u32 n, llvm::Value * bit, bool doClear = true); + + /// Get a nibble + llvm::Value * GetNibble(llvm::Value * val, u32 n); + + /// Clear a nibble + llvm::Value * ClrNibble(llvm::Value * val, u32 n); + + /// Set a nibble + llvm::Value * SetNibble(llvm::Value * val, u32 n, llvm::Value * nibble, bool doClear = true); + + /// Set a nibble + llvm::Value * SetNibble(llvm::Value * val, u32 n, llvm::Value * b0, llvm::Value * b1, llvm::Value * b2, llvm::Value * b3, bool doClear = true); + + /// Load PC + llvm::Value * GetPc(); + + /// Set PC + void SetPc(llvm::Value * val_ix); + + /// Load GPR + llvm::Value * GetGpr(u32 r, u32 num_bits = 64); + + /// Set GPR + void SetGpr(u32 r, llvm::Value * val_x64); + + /// Load CR + llvm::Value * GetCr(); + + /// Load CR and get field CRn + llvm::Value * GetCrField(u32 n); + + /// Set CR + void SetCr(llvm::Value * val_x32); + + /// Set CR field + void SetCrField(u32 n, llvm::Value * field); + + /// Set CR field + void SetCrField(u32 n, llvm::Value * b0, llvm::Value * b1, llvm::Value * b2, llvm::Value * b3); + + /// Set CR field based on signed comparison + void SetCrFieldSignedCmp(u32 n, llvm::Value * a, llvm::Value * b); + + /// Set CR field based on unsigned comparison + void SetCrFieldUnsignedCmp(u32 n, llvm::Value * a, llvm::Value * b); + + /// Set CR6 based on the result of the vector compare instruction + void SetCr6AfterVectorCompare(u32 vr); + + /// Get LR + llvm::Value * GetLr(); + + /// Set LR + void SetLr(llvm::Value * val_x64); + + /// Get CTR + llvm::Value * GetCtr(); + + /// Set CTR + void SetCtr(llvm::Value * val_x64); + + /// Load XER and convert it to an i64 + llvm::Value * GetXer(); + + /// Load XER and return the CA bit + llvm::Value * GetXerCa(); + + /// Load XER and return the SO bit + llvm::Value * GetXerSo(); + + /// Set XER + void SetXer(llvm::Value * val_x64); + + /// Set the CA bit of XER + void SetXerCa(llvm::Value * ca); + + /// Set the SO bit of XER + void SetXerSo(llvm::Value * so); + + /// Get USPRG0 + llvm::Value * GetUsprg0(); + + /// Set USPRG0 + void SetUsprg0(llvm::Value * val_x64); + + /// Get FPR + llvm::Value * GetFpr(u32 r, u32 bits = 64, bool as_int = false); + + /// Set FPR + void SetFpr(u32 r, llvm::Value * val); + + /// Load VSCR + llvm::Value * GetVscr(); + + /// Set VSCR + void SetVscr(llvm::Value * val_x32); + + /// Load VR + llvm::Value * GetVr(u32 vr); + + /// Load VR and convert it to an integer vector + llvm::Value * GetVrAsIntVec(u32 vr, u32 vec_elt_num_bits); + + /// Load VR and convert it to a float vector with 4 elements + llvm::Value * GetVrAsFloatVec(u32 vr); + + /// Load VR and convert it to a double vector with 2 elements + llvm::Value * GetVrAsDoubleVec(u32 vr); + + /// Set VR to the specified value + void SetVr(u32 vr, llvm::Value * val_x128); + + /// Check condition for branch instructions + llvm::Value * CheckBranchCondition(u32 bo, u32 bi); + + /// Create IR for a branch instruction + void CreateBranch(llvm::Value * cmp_i1, llvm::Value * target_i32, bool lk, bool target_is_lr = false); + + /// Read from memory + llvm::Value * ReadMemory(llvm::Value * addr_i64, u32 bits, u32 alignment = 0, bool bswap = true, bool could_be_mmio = true); + + /// Write to memory + void WriteMemory(llvm::Value * addr_i64, llvm::Value * val_ix, u32 alignment = 0, bool bswap = true, bool could_be_mmio = true); + + /// Call an interpreter function + template + llvm::Value * InterpreterCall(const char * name, Func function, Args... args); + + /// Convert a C++ type to an LLVM type + template + llvm::Type * CppToLlvmType(); + + /// Call a function + template + llvm::Value * Call(const char * name, Func function, Args... args); + + /// Indirect call + llvm::Value * IndirectCall(u32 address, llvm::Value * context_i64, bool is_function); + + /// Test an instruction against the interpreter + template + void VerifyInstructionAgainstInterpreter(const char * name, PPULLVMRecompilerFn recomp_fn, PPUInterpreterFn interp_fn, PPUState & input_state, Args... args); + + /// Excute a test + void RunTest(const char * name, std::function test_case, std::function input, std::function check_result); + + /// A mask used in rotate instructions + static u64 s_rotate_mask[64][64]; + + /// A flag indicating whether s_rotate_mask has been initialised or not + static bool s_rotate_mask_inited; + + /// Initialse s_rotate_mask + static void InitRotateMask(); + }; + + class RecompilationEngine : public ThreadBase { + public: + virtual ~RecompilationEngine(); + + /// Allocate an ordinal + u32 AllocateOrdinal(u32 address, bool is_function); + + /// Get the ordinal for the specified address + u32 GetOrdinal(u32 address) const; + + /// Get the executable specified by the ordinal + const Executable GetExecutable(u32 ordinal) const; + + /// Get the address of the executable lookup + u64 GetAddressOfExecutableLookup() const; + + /// Notify the recompilation engine about a newly detected trace. It takes ownership of the trace. + void NotifyTrace(ExecutionTrace * execution_trace); + + /// Log + llvm::raw_fd_ostream & Log(); + + void Task() override; + + /// Get a pointer to the instance of this class + static std::shared_ptr GetInstance(); + + private: + /// An entry in the block table + struct BlockEntry { + /// Number of times this block was hit + u32 num_hits; + + /// The current revision number of this function + u32 revision; + + /// The CFG for this block + ControlFlowGraph cfg; + + /// Indicates whether the block has been compiled or not + bool is_compiled; + + BlockEntry(u32 start_address, u32 function_address) + : num_hits(0) + , revision(0) + , is_compiled(false) + , cfg(start_address, function_address) { + } + + std::string ToString() const { + return fmt::Format("0x%08X (0x%08X): NumHits=%u, Revision=%u, IsCompiled=%c", + cfg.start_address, cfg.function_address, num_hits, revision, is_compiled ? 'Y' : 'N'); + } + + bool operator == (const BlockEntry & other) const { + return cfg.start_address == other.cfg.start_address; + } + + bool IsFunction() const { + return cfg.function_address == cfg.start_address; + } + + struct hash { + size_t operator()(const BlockEntry * e) const { + return e->cfg.start_address; + } + }; + + struct equal_to { + bool operator()(const BlockEntry * lhs, const BlockEntry * rhs) const { + return *lhs == *rhs; + } + }; + }; + + /// An entry in the function table + struct FunctionEntry { + /// Address of the function + u32 address; + + /// Number of compiled fragments + u32 num_compiled_fragments; + + /// Blocks in the function + std::list blocks; + + FunctionEntry(u32 address) + : address(address) + , num_compiled_fragments(0) { + } + + void AddBlock(BlockEntry * block_entry) { + auto i = std::find(blocks.begin(), blocks.end(), block_entry); + if (i == blocks.end()) { + if (block_entry->IsFunction()) { + // The first block must be the starting block of the function + blocks.push_front(block_entry); + } else { + blocks.push_back(block_entry); + } + } + } + + std::string ToString() const { + return fmt::Format("0x%08X: NumCompiledFragments=%u, NumBlocks=%u", address, num_compiled_fragments, blocks.size()); + } + + bool operator == (const FunctionEntry & other) const { + return address == other.address; + } + + struct hash { + size_t operator()(const FunctionEntry * f) const { + return f->address; + } + }; + + struct equal_to { + bool operator()(const FunctionEntry * lhs, const FunctionEntry * rhs) const { + return *lhs == *rhs; + } + }; + }; + + /// Lock for accessing m_pending_execution_traces. TODO: Eliminate this and use a lock-free queue. + std::mutex m_pending_execution_traces_lock; + + /// Queue of execution traces pending processing + std::list m_pending_execution_traces; + + /// Block table + std::unordered_set m_block_table; + + /// Function table + std::unordered_set m_function_table; + + /// Execution traces that have been already encountered. Data is the list of all blocks that this trace includes. + std::unordered_map> m_processed_execution_traces; + + /// Lock for accessing m_address_to_ordinal. + // TODO: Make this a RW lock + mutable std::mutex m_address_to_ordinal_lock; + + /// Mapping from address to ordinal + std::unordered_map m_address_to_ordinal; + + /// Next ordinal to allocate + u32 m_next_ordinal; + + /// PPU Compiler + Compiler m_compiler; + + /// Log + llvm::raw_fd_ostream * m_log; + + /// Executable lookup table + Executable m_executable_lookup[10000]; // TODO: Adjust size + + RecompilationEngine(); + + RecompilationEngine(const RecompilationEngine & other) = delete; + RecompilationEngine(RecompilationEngine && other) = delete; + + RecompilationEngine & operator = (const RecompilationEngine & other) = delete; + RecompilationEngine & operator = (RecompilationEngine && other) = delete; + + /// Process an execution trace. + void ProcessExecutionTrace(const ExecutionTrace & execution_trace); + + /// Update a CFG + void UpdateControlFlowGraph(ControlFlowGraph & cfg, const ExecutionTraceEntry & this_entry, const ExecutionTraceEntry * next_entry); + + /// Compile a block + void CompileBlock(FunctionEntry & function_entry, BlockEntry & block_entry); + + /// Mutex used to prevent multiple creation + static std::mutex s_mutex; + + /// The instance + static std::shared_ptr s_the_instance; + }; + + /// Finds interesting execution sequences + class Tracer { + public: + /// Trace type + enum class TraceType : u32 { + CallFunction, + EnterFunction, + ExitFromCompiledFunction, + Return, + Instruction, + ExitFromCompiledBlock, + }; + + Tracer(); + + Tracer(const Tracer & other) = delete; + Tracer(Tracer && other) = delete; + + virtual ~Tracer(); + + Tracer & operator = (const Tracer & other) = delete; + Tracer & operator = (Tracer && other) = delete; + + /// Notify the tracer + void Trace(TraceType trace_type, u32 arg1, u32 arg2); + + /// Notify the tracer that the execution sequence is being terminated. + void Terminate(); + + private: + /// Call stack + std::vector m_stack; + + /// Recompilation engine + std::shared_ptr m_recompilation_engine; + }; + + /// PPU execution engine + class ExecutionEngine : public CPUDecoder { + friend class RecompilationEngine; + public: + ExecutionEngine(PPUThread & ppu); + ExecutionEngine() = delete; + + ExecutionEngine(const ExecutionEngine & other) = delete; + ExecutionEngine(ExecutionEngine && other) = delete; + + virtual ~ExecutionEngine(); + + ExecutionEngine & operator = (const ExecutionEngine & other) = delete; + ExecutionEngine & operator = (ExecutionEngine && other) = delete; + + u8 DecodeMemory(const u32 address) override; + + private: + /// PPU processor context + PPUThread & m_ppu; + + /// PPU Interpreter + PPUInterpreter * m_interpreter; + + /// PPU instruction Decoder + PPUDecoder m_decoder; + + /// Execution tracer + Tracer m_tracer; + + /// The time at which the m_address_to_ordinal cache was last cleared + mutable std::chrono::high_resolution_clock::time_point m_last_cache_clear_time; + + /// Address to ordinal cahce. Key is address. Data is the pair (ordinal, times hit). + mutable std::unordered_map> m_address_to_ordinal; + + /// Recompilation engine + std::shared_ptr m_recompilation_engine; + + /// Remove unused entries from the m_address_to_ordinal cache + void RemoveUnusedEntriesFromCache() const; + + /// Get the executable for the specified address + Executable GetExecutable(u32 address, Executable default_executable) const; + + /// Execute a function + static u32 ExecuteFunction(PPUThread * ppu_state, PPUInterpreter * interpreter, u64 context); + + /// Execute till the current function returns + static u32 ExecuteTillReturn(PPUThread * ppu_state, PPUInterpreter * interpreter, u64 context); + }; + + /// Get the branch type from a branch instruction + BranchType GetBranchTypeFromInstruction(u32 instruction); +} + +#endif // LLVM_AVAILABLE +#endif // PPU_LLVM_RECOMPILER_H diff --git a/rpcs3/Emu/Cell/PPULLVMRecompilerTests.cpp b/rpcs3/Emu/Cell/PPULLVMRecompilerTests.cpp new file mode 100644 index 0000000000..1a1ee9c68a --- /dev/null +++ b/rpcs3/Emu/Cell/PPULLVMRecompilerTests.cpp @@ -0,0 +1,772 @@ +#include "stdafx.h" +#include "Utilities/Log.h" +#include "Emu/Cell/PPULLVMRecompiler.h" +#include "llvm/Support/Host.h" +#include "llvm/IR/Verifier.h" +#include "llvm/CodeGen/MachineCodeInfo.h" +#include "llvm/ExecutionEngine/GenericValue.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/MC/MCDisassembler.h" + +//#define PPU_LLVM_RECOMPILER_UNIT_TESTS 1 + +using namespace llvm; +using namespace ppu_recompiler_llvm; + +#define VERIFY_INSTRUCTION_AGAINST_INTERPRETER(fn, tc, input, ...) \ +VerifyInstructionAgainstInterpreter(fmt::Format("%s.%d", #fn, tc).c_str(), &Compiler::fn, &PPUInterpreter::fn, input, __VA_ARGS__) + +#define VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(fn, s, n, ...) { \ + PPUState input; \ + for (int i = s; i < (n + s); i++) { \ + input.SetRandom(0x10000); \ + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(fn, i, input, __VA_ARGS__); \ + } \ +} + +/// Register state of a PPU + struct ppu_recompiler_llvm::PPUState { + /// Floating point registers + PPCdouble FPR[32]; + + ///Floating point status and control register + FPSCRhdr FPSCR; + + /// General purpose reggisters + u64 GPR[32]; + + /// Vector purpose registers + u128 VPR[32]; + + /// Condition register + CRhdr CR; + + /// Fixed point exception register + XERhdr XER; + + /// Vector status and control register + VSCRhdr VSCR; + + /// Link register + u64 LR; + + /// Count register + u64 CTR; + + /// SPR general purpose registers + u64 SPRG[8]; + + /// Time base register + u64 TB; + + /// Reservations + u64 R_ADDR; + u64 R_VALUE; + + /// Mmeory block + u32 address; + u64 mem_block[64]; + + void Load(PPUThread & ppu, u32 addr) { + for (int i = 0; i < 32; i++) { + FPR[i] = ppu.FPR[i]; + GPR[i] = ppu.GPR[i]; + VPR[i] = ppu.VPR[i]; + + if (i < 8) { + SPRG[i] = ppu.SPRG[i]; + } + } + + FPSCR = ppu.FPSCR; + CR = ppu.CR; + XER = ppu.XER; + VSCR = ppu.VSCR; + LR = ppu.LR; + CTR = ppu.CTR; + TB = ppu.TB; + + R_ADDR = ppu.R_ADDR; + R_VALUE = ppu.R_VALUE; + + address = addr; + for (int i = 0; i < (sizeof(mem_block) / 8); i++) { + mem_block[i] = vm::read64(address + (i * 8)); + } + } + + void Store(PPUThread & ppu) { + for (int i = 0; i < 32; i++) { + ppu.FPR[i] = FPR[i]; + ppu.GPR[i] = GPR[i]; + ppu.VPR[i] = VPR[i]; + + if (i < 8) { + ppu.SPRG[i] = SPRG[i]; + } + } + + ppu.FPSCR = FPSCR; + ppu.CR = CR; + ppu.XER = XER; + ppu.VSCR = VSCR; + ppu.LR = LR; + ppu.CTR = CTR; + ppu.TB = TB; + + ppu.R_ADDR = R_ADDR; + ppu.R_VALUE = R_VALUE; + + for (int i = 0; i < (sizeof(mem_block) / 8); i++) { + vm::write64(address + (i * 8), mem_block[i]); + } + } + + void SetRandom(u32 addr) { + std::mt19937_64 rng; + + rng.seed((u32)std::chrono::high_resolution_clock::now().time_since_epoch().count()); + for (int i = 0; i < 32; i++) { + FPR[i] = (double)rng(); + GPR[i] = rng(); + VPR[i]._f[0] = (float)rng(); + VPR[i]._f[1] = (float)rng(); + VPR[i]._f[2] = (float)rng(); + VPR[i]._f[3] = (float)rng(); + + if (i < 8) { + SPRG[i] = rng(); + } + } + + FPSCR.FPSCR = (u32)rng(); + CR.CR = (u32)rng(); + XER.XER = 0; + XER.CA = (u32)rng(); + XER.SO = (u32)rng(); + XER.OV = (u32)rng(); + VSCR.VSCR = (u32)rng(); + VSCR.X = 0; + VSCR.Y = 0; + LR = rng(); + CTR = rng(); + TB = rng(); + R_ADDR = rng(); + R_VALUE = rng(); + + address = addr; + for (int i = 0; i < (sizeof(mem_block) / 8); i++) { + mem_block[i] = rng(); + } + } + + std::string ToString() const { + std::string ret; + + for (int i = 0; i < 32; i++) { + ret += fmt::Format("GPR[%02d] = 0x%016llx FPR[%02d] = %16g VPR[%02d] = 0x%s [%s]\n", i, GPR[i], i, FPR[i]._double, i, VPR[i].to_hex().c_str(), VPR[i].to_xyzw().c_str()); + } + + for (int i = 0; i < 8; i++) { + ret += fmt::Format("SPRG[%d] = 0x%016llx\n", i, SPRG[i]); + } + + ret += fmt::Format("CR = 0x%08x LR = 0x%016llx CTR = 0x%016llx TB=0x%016llx\n", CR.CR, LR, CTR, TB); + ret += fmt::Format("XER = 0x%016llx [CA=%d | OV=%d | SO=%d]\n", XER.XER, fmt::by_value(XER.CA), fmt::by_value(XER.OV), fmt::by_value(XER.SO)); + //ret += fmt::Format("FPSCR = 0x%08x " // TODO: Uncomment after implementing FPSCR + // "[RN=%d | NI=%d | XE=%d | ZE=%d | UE=%d | OE=%d | VE=%d | " + // "VXCVI=%d | VXSQRT=%d | VXSOFT=%d | FPRF=%d | " + // "FI=%d | FR=%d | VXVC=%d | VXIMZ=%d | " + // "VXZDZ=%d | VXIDI=%d | VXISI=%d | VXSNAN=%d | " + // "XX=%d | ZX=%d | UX=%d | OX=%d | VX=%d | FEX=%d | FX=%d]\n", + // FPSCR.FPSCR, + // fmt::by_value(FPSCR.RN), + // fmt::by_value(FPSCR.NI), fmt::by_value(FPSCR.XE), fmt::by_value(FPSCR.ZE), fmt::by_value(FPSCR.UE), fmt::by_value(FPSCR.OE), fmt::by_value(FPSCR.VE), + // fmt::by_value(FPSCR.VXCVI), fmt::by_value(FPSCR.VXSQRT), fmt::by_value(FPSCR.VXSOFT), fmt::by_value(FPSCR.FPRF), + // fmt::by_value(FPSCR.FI), fmt::by_value(FPSCR.FR), fmt::by_value(FPSCR.VXVC), fmt::by_value(FPSCR.VXIMZ), + // fmt::by_value(FPSCR.VXZDZ), fmt::by_value(FPSCR.VXIDI), fmt::by_value(FPSCR.VXISI), fmt::by_value(FPSCR.VXSNAN), + // fmt::by_value(FPSCR.XX), fmt::by_value(FPSCR.ZX), fmt::by_value(FPSCR.UX), fmt::by_value(FPSCR.OX), fmt::by_value(FPSCR.VX), fmt::by_value(FPSCR.FEX), fmt::by_value(FPSCR.FX)); + //ret += fmt::Format("VSCR = 0x%08x [NJ=%d | SAT=%d]\n", VSCR.VSCR, fmt::by_value(VSCR.NJ), fmt::by_value(VSCR.SAT)); // TODO: Uncomment after implementing VSCR.SAT + ret += fmt::Format("R_ADDR = 0x%016llx R_VALUE = 0x%016llx\n", R_ADDR, R_VALUE); + + for (int i = 0; i < (sizeof(mem_block) / 8); i += 2) { + ret += fmt::Format("mem_block[%d] = 0x%016llx mem_block[%d] = 0x%016llx\n", i, mem_block[i], i + 1, mem_block[i + 1]); + } + + return ret; + } +}; + +#ifdef PPU_LLVM_RECOMPILER_UNIT_TESTS +static PPUThread * s_ppu_state = nullptr; +static PPUInterpreter * s_interpreter = nullptr; +#endif // PPU_LLVM_RECOMPILER_UNIT_TESTS + +template +void Compiler::VerifyInstructionAgainstInterpreter(const char * name, CompilerFn recomp_fn, PPUInterpreterFn interp_fn, PPUState & input_state, Args... args) { +#ifdef PPU_LLVM_RECOMPILER_UNIT_TESTS + auto test_case = [&]() { + (this->*recomp_fn)(args...); + }; + auto input = [&]() { + input_state.Store(*s_ppu_state); + }; + auto check_result = [&](std::string & msg) { + PPUState recomp_output_state; + PPUState interp_output_state; + + recomp_output_state.Load(*s_ppu_state, input_state.address); + input_state.Store(*s_ppu_state); + (s_interpreter->*interp_fn)(args...); + interp_output_state.Load(*s_ppu_state, input_state.address); + + if (interp_output_state.ToString() != recomp_output_state.ToString()) { + msg = std::string("Input state:\n") + input_state.ToString() + + std::string("\nOutput state:\n") + recomp_output_state.ToString() + + std::string("\nInterpreter output state:\n") + interp_output_state.ToString(); + return false; + } + + return true; + }; + RunTest(name, test_case, input, check_result); +#endif // PPU_LLVM_RECOMPILER_UNIT_TESTS +} + +void Compiler::RunTest(const char * name, std::function test_case, std::function input, std::function check_result) { +#ifdef PPU_LLVM_RECOMPILER_UNIT_TESTS + // Create the unit test function + m_current_function = (Function *)m_module->getOrInsertFunction(name, m_ir_builder->getVoidTy(), + m_ir_builder->getInt8PtrTy() /*ppu_state*/, + m_ir_builder->getInt64Ty() /*base_addres*/, + m_ir_builder->getInt8PtrTy() /*interpreter*/, nullptr); + m_current_function->setCallingConv(CallingConv::X86_64_Win64); + auto arg_i = m_current_function->arg_begin(); + arg_i->setName("ppu_state"); + (++arg_i)->setName("base_address"); + (++arg_i)->setName("interpreter"); + + auto block = BasicBlock::Create(*m_llvm_context, "start", m_current_function); + m_ir_builder->SetInsertPoint(block); + + test_case(); + + m_ir_builder->CreateRetVoid(); + + // Print the IR + std::string ir; + raw_string_ostream ir_ostream(ir); + m_current_function->print(ir_ostream); + LOG_NOTICE(PPU, "[UT %s] LLVM IR:%s", name, ir.c_str()); + + std::string verify; + raw_string_ostream verify_ostream(verify); + if (verifyFunction(*m_current_function, &verify_ostream)) { + LOG_ERROR(PPU, "[UT %s] Verification Failed:%s", name, verify.c_str()); + return; + } + + // Optimize + m_fpm->run(*m_current_function); + + // Print the optimized IR + ir = ""; + m_current_function->print(ir_ostream); + LOG_NOTICE(PPU, "[UT %s] Optimized LLVM IR:%s", name, ir.c_str()); + + // Generate the function + MachineCodeInfo mci; + m_execution_engine->runJITOnFunction(m_current_function, &mci); + + // Disassemble the generated function + auto disassembler = LLVMCreateDisasm(sys::getProcessTriple().c_str(), nullptr, 0, nullptr, nullptr); + + LOG_NOTICE(PPU, "[UT %s] Disassembly:", name); + for (uint64_t pc = 0; pc < mci.size();) { + char str[1024]; + + auto size = LLVMDisasmInstruction(disassembler, (uint8_t *)mci.address() + pc, mci.size() - pc, (uint64_t)((uint8_t *)mci.address() + pc), str, sizeof(str)); + LOG_NOTICE(PPU, "[UT %s] %p: %s.", name, (uint8_t *)mci.address() + pc, str); + pc += size; + } + + LLVMDisasmDispose(disassembler); + + // Run the test + input(); + std::vector args; + args.push_back(GenericValue(s_ppu_state)); + args.push_back(GenericValue(s_interpreter)); + m_execution_engine->runFunction(m_current_function, args); + + // Verify results + std::string msg; + bool pass = check_result(msg); + if (pass) { + LOG_NOTICE(PPU, "[UT %s] Test passed. %s", name, msg.c_str()); + } else { + LOG_ERROR(PPU, "[UT %s] Test failed. %s", name, msg.c_str()); + } + + m_execution_engine->freeMachineCodeForFunction(m_current_function); +#endif // PPU_LLVM_RECOMPILER_UNIT_TESTS +} + +void Compiler::RunAllTests(PPUThread * ppu_state, PPUInterpreter * interpreter) { +#ifdef PPU_LLVM_RECOMPILER_UNIT_TESTS + s_ppu_state = ppu_state; + s_interpreter = interpreter; + + PPUState initial_state; + initial_state.Load(*ppu_state, 0x10000); + + LOG_NOTICE(PPU, "Running Unit Tests"); + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MFVSCR, 0, 5, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MTVSCR, 0, 5, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDCUW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDSBS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDSHS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDSWS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDUBM, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDUBS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDUHM, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDUHS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDUWM, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VADDUWS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VAND, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VANDC, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VAVGSB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VAVGSH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VAVGSW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VAVGUB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VAVGUH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VAVGUW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCFSX, 0, 5, 0, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCFSX, 5, 5, 0, 3, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCFUX, 0, 5, 0, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCFUX, 5, 5, 0, 2, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPBFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPBFP, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPBFP_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPBFP_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQFP, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQFP_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQFP_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUB, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUB_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUB_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUH, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUH_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUH_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUW, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUW_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPEQUW_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGEFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGEFP, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGEFP_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGEFP_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTFP, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTFP_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTFP_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSB, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSB_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSB_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSH, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSH_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSH_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSW, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSW_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTSW_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUB, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUB_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUB_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUH, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUH_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUH_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUW, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUW_, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VCMPGTUW_, 5, 5, 0, 1, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMADDFP, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMAXFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMAXSB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMAXSH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMAXSW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMAXUB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMAXUH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMAXUW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMINFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMINSB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMINSH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMINSW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMINUB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMINUH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMINUW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMRGHB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMRGHH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMRGHW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMRGLB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMRGLH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMRGLW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMSUMMBM, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMSUMSHM, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMSUMUBM, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VMSUMUHM, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VNMSUBFP, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VNOR, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VOR, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VPERM, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VREFP, 0, 5, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSEL, 0, 5, 0, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSL, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSLB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSLDOI, 0, 5, 0, 1, 2, 6); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSLH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSLO, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSLW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSPLTB, 0, 5, 0, 3, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSPLTH, 0, 5, 0, 3, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSPLTISB, 0, 5, 0, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSPLTISH, 0, 5, 0, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSPLTISW, 0, 5, 0, -12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSPLTW, 0, 5, 0, 3, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSR, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSRAB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSRAH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSRAW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSRB, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSRH, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSRO, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSRW, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBFP, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBSBS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBSHS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBSWS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBUBM, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBUBS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBUHM, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBUHS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBUWM, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VSUBUWS, 0, 5, 0, 1, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(VXOR, 0, 5, 0, 1, 2); + // TODO: Rest of the vector instructions + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULLI, 0, 5, 1, 2, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SUBFIC, 0, 5, 1, 2, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMPLI, 0, 5, 1, 0, 7, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMPLI, 5, 5, 1, 1, 7, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMPI, 0, 5, 5, 0, 7, -12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMPI, 5, 5, 5, 1, 7, -12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDIC, 0, 5, 1, 2, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDIC_, 0, 5, 1, 2, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDI, 0, 5, 1, 2, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDI, 5, 5, 0, 2, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDIS, 0, 5, 1, 2, -12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDIS, 5, 5, 0, 2, -12345); + // TODO: BC + // TODO: SC + // TODO: B + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MCRF, 0, 5, 0, 7); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MCRF, 5, 5, 6, 2); + // TODO: BCLR + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CRNOR, 0, 5, 0, 7, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CRANDC, 0, 5, 5, 6, 7); + // TODO: ISYNC + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CRXOR, 0, 5, 7, 7, 7); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CRNAND, 0, 5, 3, 4, 5); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CRAND, 0, 5, 1, 2, 3); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CREQV, 0, 5, 2, 1, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CRORC, 0, 5, 3, 4, 5); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CROR, 0, 5, 6, 7, 0); + // TODO: BCCTR + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLWIMI, 0, 5, 7, 8, 9, 12, 25, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLWIMI, 5, 5, 21, 22, 21, 18, 24, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLWINM, 0, 5, 7, 8, 9, 12, 25, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLWINM, 5, 5, 21, 22, 21, 18, 24, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLWNM, 0, 5, 7, 8, 9, 12, 25, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLWNM, 5, 5, 21, 22, 21, 18, 24, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ORI, 0, 5, 25, 29, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ORIS, 0, 5, 7, 31, -12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(XORI, 0, 5, 0, 19, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(XORIS, 0, 5, 3, 14, -12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ANDI_, 0, 5, 16, 7, 12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ANDIS_, 0, 5, 23, 21, -12345); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDICL, 0, 5, 7, 8, 9, 12, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDICL, 5, 5, 21, 22, 43, 43, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDICR, 0, 5, 7, 8, 0, 12, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDICR, 5, 5, 21, 22, 63, 43, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDIC, 0, 5, 7, 8, 9, 12, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDIC, 5, 5, 21, 22, 23, 43, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDIMI, 0, 5, 7, 8, 9, 12, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDIMI, 5, 5, 21, 22, 23, 43, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDC_LR, 0, 5, 7, 8, 9, 12, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(RLDC_LR, 5, 5, 21, 22, 23, 43, 1, 1); + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADD, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADD, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SUBF, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SUBF, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(NEG, 0, 5, 7, 8, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(NEG, 5, 5, 21, 22, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHDU, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHDU, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHWU, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHWU, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHD, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHD, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHW, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULHW, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULLD, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULLD, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULLW, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MULLW, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVD, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVD, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVDU, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVDU, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVW, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVW, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVWU, 0, 5, 7, 8, 9, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(DIVWU, 5, 5, 21, 22, 23, 0, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(AND, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(AND, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(OR, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(OR, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(XOR, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(XOR, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(NOR, 0, 5, 7, 8, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(NOR, 5, 5, 21, 22, 23, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMP, 0, 5, 3, 0, 9, 31); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMP, 5, 5, 6, 1, 23, 14); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMPL, 0, 5, 3, 0, 9, 31); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CMPL, 5, 5, 6, 1, 23, 14); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDC, 0, 5, 0, 1, 2, 0, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ADDC, 5, 5, 0, 1, 2, 0, true); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SUBFC, 0, 5, 0, 1, 2, 0, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SUBFC, 5, 5, 0, 1, 2, 0, true); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(EXTSB, 0, 5, 3, 5, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(EXTSB, 5, 5, 3, 5, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(EXTSH, 0, 5, 6, 9, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(EXTSH, 5, 5, 6, 9, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(EXTSW, 0, 5, 25, 29, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(EXTSW, 5, 5, 25, 29, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MTSPR, 0, 5, 0x20, 5); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MTSPR, 5, 5, 0x100, 5); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MTSPR, 10, 5, 0x120, 5); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MTSPR, 15, 5, 0x8, 5); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MFSPR, 0, 5, 5, 0x20); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MFSPR, 5, 5, 5, 0x100); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MFSPR, 10, 5, 5, 0x120); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(MFSPR, 15, 5, 5, 0x8); + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAWI, 0, 5, 5, 6, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAWI, 5, 5, 5, 6, 12, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAWI, 10, 5, 5, 6, 22, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAWI, 15, 5, 5, 6, 31, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAW, 0, 5, 5, 6, 7, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAW, 5, 5, 5, 6, 7, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRADI1, 0, 5, 5, 6, 0, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRADI1, 5, 5, 5, 6, 12, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRADI1, 10, 5, 5, 6, 48, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRADI1, 15, 5, 5, 6, 63, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAD, 0, 5, 5, 6, 7, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRAD, 5, 5, 5, 6, 7, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SLW, 0, 5, 5, 6, 7, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SLW, 5, 5, 5, 6, 7, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRW, 0, 5, 5, 6, 7, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRW, 5, 5, 5, 6, 7, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SLD, 0, 5, 5, 6, 7, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SLD, 5, 5, 5, 6, 7, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRD, 0, 5, 5, 6, 7, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(SRD, 5, 5, 5, 6, 7, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CNTLZW, 0, 5, 5, 6, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CNTLZW, 5, 5, 5, 6, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CNTLZD, 0, 5, 5, 6, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(CNTLZD, 5, 5, 5, 6, 1); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(ISYNC, 0, 5); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(EIEIO, 0, 5); + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FSQRT, 0, 5, 0, 1, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FSQRTS, 0, 5, 0, 1, false); + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FDIV, 0, 5, 0, 1, 2, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FSUB, 0, 5, 0, 1, 2, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FADD, 0, 5, 0, 1, 2, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FMUL, 0, 5, 0, 1, 2, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FMSUB, 0, 5, 0, 1, 2, 3, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FMADD, 0, 5, 0, 1, 2, 3, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FNMSUB, 0, 5, 0, 1, 2, 3, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FNMADD, 0, 5, 0, 1, 2, 3, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FNEG, 0, 5, 0, 1, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FMR, 0, 5, 0, 1, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FNABS, 0, 5, 0, 1, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FABS, 0, 5, 0, 1, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FCFID, 0, 5, 0, 1, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FCTID, 0, 5, 0, 1, false); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER_USING_RANDOM_INPUT(FCTIW, 0, 5, 0, 1, false); + + PPUState input; + input.SetRandom(0x10000); + input.GPR[14] = 10; + input.GPR[21] = 15; + input.GPR[23] = 0x10000; + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LBZ, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LBZ, 1, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LBZU, 0, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LBZX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LBZX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LBZUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHZ, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHZ, 1, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHZU, 0, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHZX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHZX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHZUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHA, 0, input, 5, 0, 0x100F0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHA, 1, input, 5, 14, 0x100F0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHAU, 0, input, 5, 14, 0x100F0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHAX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHAX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHAUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LHBRX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWZ, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWZ, 1, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWZU, 0, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWZX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWZX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWZUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWA, 0, input, 5, 0, 0x100F0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWA, 1, input, 5, 14, 0x100F0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWAX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWAX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWAUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWBRX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LD, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LD, 1, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LDU, 0, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LDX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LDX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LDUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LDBRX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFS, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFS, 1, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFSU, 0, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFSX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFSX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFSUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFD, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFD, 1, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFDU, 0, input, 5, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFDX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFDX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LFDUX, 0, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWARX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LWARX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LDARX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LDARX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LSWI, 0, input, 5, 23, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LSWI, 1, input, 5, 23, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LSWI, 2, input, 5, 23, 7); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LSWI, 3, input, 5, 23, 25); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LMW, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LMW, 1, input, 16, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVXL, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVXL, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVSL, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVSL, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVSL, 2, input, 5, 21, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVSR, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVSR, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVSR, 2, input, 5, 21, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEBX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEBX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEBX, 2, input, 5, 21, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEHX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEHX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEHX, 2, input, 5, 21, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEWX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEWX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVEWX, 2, input, 5, 21, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVLX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVLX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVLX, 2, input, 5, 21, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVRX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVRX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(LVRX, 2, input, 5, 21, 23); + + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STB, 0, input, 3, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STB, 1, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STBU, 0, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STBX, 0, input, 3, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STBX, 1, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STBUX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STH, 0, input, 3, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STH, 1, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STHU, 0, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STHX, 0, input, 3, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STHX, 1, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STHUX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STHBRX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STW, 0, input, 3, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STW, 1, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STWU, 0, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STWX, 0, input, 3, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STWX, 1, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STWUX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STWBRX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STD, 0, input, 3, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STD, 1, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STDU, 0, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STDX, 0, input, 3, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STDX, 1, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STDUX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFS, 0, input, 3, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFS, 1, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFSU, 0, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFSX, 0, input, 3, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFSX, 1, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFSUX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFD, 0, input, 3, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFD, 1, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFDU, 0, input, 3, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFDX, 0, input, 3, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFDX, 1, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFDUX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STFIWX, 0, input, 3, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVXL, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVXL, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVEBX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVEBX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVEHX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVEHX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVEWX, 0, input, 5, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STVEWX, 1, input, 5, 14, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STMW, 0, input, 5, 0, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STMW, 1, input, 16, 14, 0x10000); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STSWI, 0, input, 5, 23, 0); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STSWI, 1, input, 5, 23, 2); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STSWI, 2, input, 5, 23, 7); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(STSWI, 3, input, 5, 23, 25); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(DCBZ, 0, input, 0, 23); + VERIFY_INSTRUCTION_AGAINST_INTERPRETER(DCBZ, 1, input, 14, 23); + + initial_state.Store(*ppu_state); +#endif // PPU_LLVM_RECOMPILER_UNIT_TESTS +} diff --git a/rpcs3/Emu/Cell/PPUOpcodes.h b/rpcs3/Emu/Cell/PPUOpcodes.h index 150275ae9c..9fbe5e8d79 100644 --- a/rpcs3/Emu/Cell/PPUOpcodes.h +++ b/rpcs3/Emu/Cell/PPUOpcodes.h @@ -276,7 +276,7 @@ namespace PPU_opcodes LVEHX = 0x027, //Load Vector Element Halfword Indexed SUBF = 0x028, LDUX = 0x035, //Load Doubleword with Update Indexed - DCBST = 0x036, + DCBST = 0x036, //Data Cache Block Store LWZUX = 0x037, CNTLZD = 0x03a, ANDC = 0x03c, @@ -285,7 +285,7 @@ namespace PPU_opcodes MULHD = 0x049, MULHW = 0x04b, LDARX = 0x054, - DCBF = 0x056, + DCBF = 0x056, //Data Cache Block Flush LBZX = 0x057, LVX = 0x067, //Load Vector Indexed NEG = 0x068, @@ -311,11 +311,11 @@ namespace PPU_opcodes MULLD = 0x0e9, ADDME = 0x0ea, MULLW = 0x0eb, - DCBTST = 0x0f6, + DCBTST = 0x0f6, //Data Cache Block Touch for Store STBUX = 0x0f7, DOZ = 0x108, ADD = 0x10a, - DCBT = 0x116, + DCBT = 0x116, //Data Cache Block Touch LHZX = 0x117, EQV = 0x11c, ECIWX = 0x136, @@ -338,7 +338,7 @@ namespace PPU_opcodes DIVDU = 0x1c9, DIVWU = 0x1cb, MTSPR = 0x1d3, - DCBI = 0x1d6, + DCBI = 0x1d6, //Data Cache Block Invalidate NAND = 0x1dc, STVXL = 0x1e7, //Store Vector Indexed Last DIVD = 0x1e9, @@ -382,8 +382,8 @@ namespace PPU_opcodes EXTSB = 0x3ba, STFIWX = 0x3d7, EXTSW = 0x3da, - ICBI = 0x3d6, - DCBZ = 0x3f6, + ICBI = 0x3d6, //Instruction Cache Block Invalidate + DCBZ = 0x3f6, //Data Cache Block Set to Zero }; enum G_3aOpcodes //Field 30 - 31 @@ -738,7 +738,7 @@ public: virtual void DIVDU(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) = 0; virtual void DIVWU(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) = 0; virtual void MTSPR(u32 spr, u32 rs) = 0; - //DCBI + virtual void DCBI(u32 ra, u32 rb) = 0; virtual void NAND(u32 ra, u32 rs, u32 rb, bool rc) = 0; virtual void STVXL(u32 vs, u32 ra, u32 rb) = 0; virtual void DIVD(u32 rd, u32 ra, u32 rb, u32 oe, bool rc) = 0; diff --git a/rpcs3/Emu/Cell/PPUProgramCompiler.cpp b/rpcs3/Emu/Cell/PPUProgramCompiler.cpp index 9c3b760ea7..532b26d36a 100644 --- a/rpcs3/Emu/Cell/PPUProgramCompiler.cpp +++ b/rpcs3/Emu/Cell/PPUProgramCompiler.cpp @@ -1,7 +1,7 @@ #include "stdafx_gui.h" #include "PPUProgramCompiler.h" #include "Utilities/rFile.h" - +/* using namespace PPU_instr; template @@ -78,10 +78,10 @@ SectionInfo::SectionInfo(const std::string& _name) section_name_offs += name.length() + 1; } -void SectionInfo::SetDataSize(u32 size, u32 align) +void SectionInfo::SetDataSize(u32 size, u32 addralign) { - if(align) shdr.sh_addralign = align; - if(shdr.sh_addralign) size = AlignAddr(size, shdr.sh_addralign); + if (addralign) shdr.sh_addralign = addralign; + if (shdr.sh_addralign) size = align(size, shdr.sh_addralign); if(!code.empty()) { @@ -985,7 +985,7 @@ void CompilePPUProgram::Compile() elf_info.e_shnum = 15; elf_info.e_shstrndx = elf_info.e_shnum - 1; elf_info.e_phoff = elf_info.e_ehsize; - u32 section_offset = AlignAddr(elf_info.e_phoff + elf_info.e_phnum * elf_info.e_phentsize, 0x100); + u32 section_offset = align(elf_info.e_phoff + elf_info.e_phnum * elf_info.e_phentsize, 0x100); static const u32 sceStub_text_block = 8 * 4; @@ -1143,7 +1143,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_sceStub_text; memset(&s_sceStub_text, 0, sizeof(Elf64_Shdr)); s_sceStub_text.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_sceStub_text.sh_addralign); + section_offset = align(section_offset, s_sceStub_text.sh_addralign); s_sceStub_text.sh_type = 1; s_sceStub_text.sh_offset = section_offset; s_sceStub_text.sh_addr = section_offset + 0x10000; @@ -1167,7 +1167,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_lib_stub_top; memset(&s_lib_stub_top, 0, sizeof(Elf64_Shdr)); s_lib_stub_top.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_lib_stub_top.sh_addralign); + section_offset = align(section_offset, s_lib_stub_top.sh_addralign); s_lib_stub_top.sh_type = 1; s_lib_stub_top.sh_name = section_name_offset; s_lib_stub_top.sh_offset = section_offset; @@ -1186,7 +1186,7 @@ void CompilePPUProgram::Compile() s_lib_stub.sh_offset = section_offset; s_lib_stub.sh_addr = section_offset + 0x10000; s_lib_stub.sh_flags = 2; - s_lib_stub.sh_size = sizeof(Elf64_StubHeader) * modules.size(); + s_lib_stub.sh_size = sizeof(sys_stub) * modules.size(); sections_names.push_back(".lib.stub"); section_name_offset += std::string(".lib.stub").length() + 1; section_offset += s_lib_stub.sh_size; @@ -1207,7 +1207,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_rodata_sceFNID; memset(&s_rodata_sceFNID, 0, sizeof(Elf64_Shdr)); s_rodata_sceFNID.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_rodata_sceFNID.sh_addralign); + section_offset = align(section_offset, s_rodata_sceFNID.sh_addralign); s_rodata_sceFNID.sh_type = 1; s_rodata_sceFNID.sh_name = section_name_offset; s_rodata_sceFNID.sh_offset = section_offset; @@ -1221,7 +1221,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_rodata_sceResident; memset(&s_rodata_sceResident, 0, sizeof(Elf64_Shdr)); s_rodata_sceResident.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_rodata_sceResident.sh_addralign); + section_offset = align(section_offset, s_rodata_sceResident.sh_addralign); s_rodata_sceResident.sh_type = 1; s_rodata_sceResident.sh_name = section_name_offset; s_rodata_sceResident.sh_offset = section_offset; @@ -1232,7 +1232,7 @@ void CompilePPUProgram::Compile() { s_rodata_sceResident.sh_size += module.m_name.length() + 1; } - s_rodata_sceResident.sh_size = AlignAddr(s_rodata_sceResident.sh_size, s_rodata_sceResident.sh_addralign); + s_rodata_sceResident.sh_size = align(s_rodata_sceResident.sh_size, s_rodata_sceResident.sh_addralign); sections_names.push_back(".rodata.sceResident"); section_name_offset += std::string(".rodata.sceResident").length() + 1; section_offset += s_rodata_sceResident.sh_size; @@ -1240,7 +1240,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_lib_ent_top; memset(&s_lib_ent_top, 0, sizeof(Elf64_Shdr)); s_lib_ent_top.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_lib_ent_top.sh_addralign); + section_offset = align(section_offset, s_lib_ent_top.sh_addralign); s_lib_ent_top.sh_size = 4; s_lib_ent_top.sh_flags = 2; s_lib_ent_top.sh_type = 1; @@ -1267,7 +1267,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_sys_proc_prx_param; memset(&s_sys_proc_prx_param, 0, sizeof(Elf64_Shdr)); s_sys_proc_prx_param.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_sys_proc_prx_param.sh_addralign); + section_offset = align(section_offset, s_sys_proc_prx_param.sh_addralign); s_sys_proc_prx_param.sh_type = 1; s_sys_proc_prx_param.sh_size = sizeof(sys_proc_prx_param); s_sys_proc_prx_param.sh_name = section_name_offset; @@ -1280,14 +1280,14 @@ void CompilePPUProgram::Compile() const u32 prog_load_0_end = section_offset; - section_offset = AlignAddr(section_offset + 0x10000, 0x10000); + section_offset = align(section_offset + 0x10000, 0x10000); const u32 prog_load_1_start = section_offset; Elf64_Shdr s_data_sceFStub; memset(&s_data_sceFStub, 0, sizeof(Elf64_Shdr)); s_data_sceFStub.sh_name = section_name_offset; s_data_sceFStub.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_data_sceFStub.sh_addralign); + section_offset = align(section_offset, s_data_sceFStub.sh_addralign); s_data_sceFStub.sh_flags = 3; s_data_sceFStub.sh_type = 1; s_data_sceFStub.sh_offset = section_offset; @@ -1300,7 +1300,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_tbss; memset(&s_tbss, 0, sizeof(Elf64_Shdr)); s_tbss.sh_addralign = 4; - section_offset = AlignAddr(section_offset, s_tbss.sh_addralign); + section_offset = align(section_offset, s_tbss.sh_addralign); s_tbss.sh_size = 4; s_tbss.sh_flags = 0x403; s_tbss.sh_type = 8; @@ -1314,7 +1314,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_opd; memset(&s_opd, 0, sizeof(Elf64_Shdr)); s_opd.sh_addralign = 8; - section_offset = AlignAddr(section_offset, s_opd.sh_addralign); + section_offset = align(section_offset, s_opd.sh_addralign); s_opd.sh_size = 2*4; s_opd.sh_type = 1; s_opd.sh_offset = section_offset; @@ -1475,7 +1475,7 @@ void CompilePPUProgram::Compile() if(!m_file_path.empty() && !m_analyze && !m_error) { - s_opd.sh_size = AlignAddr(s_opd.sh_size, s_opd.sh_addralign); + s_opd.sh_size = align(s_opd.sh_size, s_opd.sh_addralign); section_offset += s_opd.sh_size; const u32 prog_load_1_end = section_offset; @@ -1483,7 +1483,7 @@ void CompilePPUProgram::Compile() Elf64_Shdr s_shstrtab; memset(&s_shstrtab, 0, sizeof(Elf64_Shdr)); s_shstrtab.sh_addralign = 1; - section_offset = AlignAddr(section_offset, s_shstrtab.sh_addralign); + section_offset = align(section_offset, s_shstrtab.sh_addralign); s_shstrtab.sh_name = section_name_offset; s_shstrtab.sh_type = 3; s_shstrtab.sh_offset = section_offset; @@ -1505,7 +1505,7 @@ void CompilePPUProgram::Compile() elf_info.e_machine = MACHINE_PPC64; //PowerPC64 elf_info.e_version = 1; //ver 1 elf_info.e_flags = 0x0; - elf_info.e_shoff = AlignAddr(section_offset, 4); + elf_info.e_shoff = align(section_offset, 4); u8* opd_data = new u8[s_opd.sh_size]; u32 entry_point = s_text.sh_addr; @@ -1523,14 +1523,14 @@ void CompilePPUProgram::Compile() sys_proc_prx_param prx_param; memset(&prx_param, 0, sizeof(sys_proc_prx_param)); - prx_param.size = re32(0x40); - prx_param.magic = re32(0x1b434cec); - prx_param.version = re32(0x4); - prx_param.libentstart = re32(s_lib_ent_top.sh_addr + s_lib_ent_top.sh_size); - prx_param.libentend = re32(s_lib_ent_btm.sh_addr); - prx_param.libstubstart = re32(s_lib_stub_top.sh_addr + s_lib_stub_top.sh_size); - prx_param.libstubend = re32(s_lib_stub_btm.sh_addr); - prx_param.ver = re16(0x101); + prx_param.size = 0x40; + prx_param.magic = 0x1b434cec; + prx_param.version = 0x4; + prx_param.libentstart = s_lib_ent_top.sh_addr + s_lib_ent_top.sh_size; + prx_param.libentend = s_lib_ent_btm.sh_addr; + prx_param.libstubstart = vm::bptr::make(s_lib_stub_top.sh_addr + s_lib_stub_top.sh_size); + prx_param.libstubend = vm::bptr::make(s_lib_stub_btm.sh_addr); + prx_param.ver = 0x101; elf_info.e_entry = s_opd.sh_addr; @@ -1588,20 +1588,20 @@ void CompilePPUProgram::Compile() f.Seek(s_lib_stub.sh_offset); for(u32 i=0, nameoffs=4, dataoffs=0; i::make(s_rodata_sceResident.sh_addr + nameoffs); + stub.s_nid = vm::bptr::make(s_rodata_sceFNID.sh_addr + dataoffs); + stub.s_text = vm::bptr::make(s_data_sceFStub.sh_addr + dataoffs); + stub.s_imports = modules[i].m_imports.size(); dataoffs += modules[i].m_imports.size() * 4; - f.Write(&stub, sizeof(Elf64_StubHeader)); + f.Write(&stub, sizeof(sys_stub)); nameoffs += modules[i].m_name.length() + 1; } @@ -1732,3 +1732,4 @@ void CompilePPUProgram::Compile() system("make_fself.cmd"); } } +*/ \ No newline at end of file diff --git a/rpcs3/Emu/Cell/PPUProgramCompiler.h b/rpcs3/Emu/Cell/PPUProgramCompiler.h index 608fbc4c1e..5070c34516 100644 --- a/rpcs3/Emu/Cell/PPUProgramCompiler.h +++ b/rpcs3/Emu/Cell/PPUProgramCompiler.h @@ -1,7 +1,7 @@ #pragma once #include "PPUInstrTable.h" #include "Loader/ELF64.h" - +/* enum ArgType { ARG_ERR = 0, @@ -189,3 +189,4 @@ protected: public: void Compile(); }; +*/ \ No newline at end of file diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 03e49b8aa0..06b2c8b926 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -9,6 +9,9 @@ #include "Emu/SysCalls/Static.h" #include "Emu/Cell/PPUDecoder.h" #include "Emu/Cell/PPUInterpreter.h" +#include "Emu/Cell/PPULLVMRecompiler.h" +//#include "Emu/Cell/PPURecompiler.h" +#include "Emu/CPU/CPUThreadManager.h" PPUThread& GetCurrentPPUThread() { @@ -38,11 +41,11 @@ void PPUThread::DoReset() memset(FPR, 0, sizeof(FPR)); memset(GPR, 0, sizeof(GPR)); memset(SPRG, 0, sizeof(SPRG)); + memset(USPRG, 0, sizeof(USPRG)); CR.CR = 0; LR = 0; CTR = 0; - USPRG0 = 0; TB = 0; XER.XER = 0; FPSCR.FPSCR = 0; @@ -83,8 +86,10 @@ void PPUThread::InitRegs() } */ - GPR[1] = AlignAddr(m_stack_addr + m_stack_size, 0x200) - 0x200; + GPR[1] = align(m_stack_addr + m_stack_size, 0x200) - 0x200; GPR[2] = rtoc; + //GPR[11] = entry; + //GPR[12] = Emu.GetMallocPageSize(); GPR[13] = Memory.PRXMem.GetStartAddr() + 0x7060; LR = Emu.GetPPUThreadExit(); @@ -103,13 +108,26 @@ void PPUThread::DoRun() break; case 1: - case 2: { auto ppui = new PPUInterpreter(*this); m_dec = new PPUDecoder(ppui); } break; + case 2: +#ifdef PPU_LLVM_RECOMPILER + SetCallStackTracing(false); + if (!m_dec) { + m_dec = new ppu_recompiler_llvm::ExecutionEngine(*this); + } +#else + LOG_ERROR(PPU, "This image does not include PPU JIT (LLVM)"); + Emu.Pause(); +#endif + break; + + //case 3: m_dec = new PPURecompiler(*this); break; + default: LOG_ERROR(PPU, "Invalid CPU decoder mode: %d", Ini.CPUDecoderMode.GetValue()); Emu.Pause(); @@ -187,7 +205,7 @@ u64 PPUThread::FastCall2(u32 addr, u32 rtoc) LR = Emu.m_ppu_thr_stop; SetCurrentNamedThread(this); - Task(); + CPUThread::Task(); m_status = old_status; PC = old_PC; @@ -202,4 +220,72 @@ u64 PPUThread::FastCall2(u32 addr, u32 rtoc) void PPUThread::FastStop() { m_status = Stopped; +} + +void PPUThread::Task() +{ + if (custom_task) + { + custom_task(*this); + } + else + { + CPUThread::Task(); + } +} + +ppu_thread::ppu_thread(u32 entry, const std::string& name, u32 stack_size, u32 prio) +{ + thread = &Emu.GetCPU().AddThread(CPU_THREAD_PPU); + + thread->SetName(name); + thread->SetEntry(entry); + thread->SetStackSize(stack_size ? stack_size : Emu.GetInfo().GetProcParam().primary_stacksize); + thread->SetPrio(prio ? prio : Emu.GetInfo().GetProcParam().primary_prio); + + argc = 0; +} + +cpu_thread& ppu_thread::args(std::initializer_list values) +{ + if (!values.size()) + return *this; + + assert(argc == 0); + + envp.set(vm::alloc(align((u32)sizeof(*envp), stack_align), vm::main)); + *envp = 0; + argv.set(vm::alloc(sizeof(*argv) * values.size(), vm::main)); + + for (auto &arg : values) + { + u32 arg_size = align(u32(arg.size() + 1), stack_align); + u32 arg_addr = vm::alloc(arg_size, vm::main); + + std::strcpy(vm::get_ptr(arg_addr), arg.c_str()); + + argv[argc++] = arg_addr; + } + + return *this; +} + +cpu_thread& ppu_thread::run() +{ + thread->Run(); + + gpr(3, argc); + gpr(4, argv.addr()); + gpr(5, envp.addr()); + + return *this; +} + +ppu_thread& ppu_thread::gpr(uint index, u64 value) +{ + assert(index < 32); + + static_cast(thread)->GPR[index] = value; + + return *this; } \ No newline at end of file diff --git a/rpcs3/Emu/Cell/PPUThread.h b/rpcs3/Emu/Cell/PPUThread.h index 0fb4e2867b..717dd151f1 100644 --- a/rpcs3/Emu/Cell/PPUThread.h +++ b/rpcs3/Emu/Cell/PPUThread.h @@ -1,5 +1,6 @@ #pragma once #include "Emu/Cell/PPCThread.h" +#include "Emu/Memory/vm.h" enum { @@ -470,9 +471,6 @@ struct FPRdouble class PPUThread : public PPCThread { -public: - u32 owned_mutexes; - public: PPCdouble FPR[32]; //Floating Point Register FPSCRhdr FPSCR; //Floating Point Status and Control Register @@ -533,11 +531,8 @@ public: u64 LR; //SPR 0x008 : Link Register u64 CTR; //SPR 0x009 : Count Register - union - { - u64 USPRG0; //SPR 0x100 : User-SPR General-Purpose Register 0 - u64 SPRG[8]; //SPR 0x100 - 0x107 : SPR General-Purpose Registers - }; + u64 USPRG[8]; //SPR 0x100 - 0x107: User-SPR General-Purpose Registers + u64 SPRG[8]; //SPR 0x110 - 0x117 : SPR General-Purpose Registers //TBR : Time-Base Registers union @@ -556,6 +551,9 @@ public: u64 R_ADDR; // reservation address u64 R_VALUE; // reservation value (BE) + u32 owned_mutexes; + std::function custom_task; + public: PPUThread(); virtual ~PPUThread(); @@ -785,25 +783,32 @@ public: public: virtual void InitRegs(); + virtual void Task(); u64 GetStackArg(s32 i); u64 FastCall2(u32 addr, u32 rtoc); void FastStop(); - - virtual void DoReset() override; virtual void DoRun() override; + +protected: + virtual void DoReset() override; virtual void DoPause() override; virtual void DoResume() override; virtual void DoStop() override; - -protected: - virtual void Step() override - { - //if(++cycle > 20) - { - TB++; - //cycle = 0; - } - } }; PPUThread& GetCurrentPPUThread(); + +class ppu_thread : cpu_thread +{ + static const u32 stack_align = 0x10; + vm::ptr argv; + u32 argc; + vm::ptr envp; + +public: + ppu_thread(u32 entry, const std::string& name = "", u32 stack_size = 0, u32 prio = 0); + + cpu_thread& args(std::initializer_list values) override; + cpu_thread& run() override; + ppu_thread& gpr(uint index, u64 value); +}; \ No newline at end of file diff --git a/rpcs3/Emu/Cell/RawSPUThread.cpp b/rpcs3/Emu/Cell/RawSPUThread.cpp index 0a8270e670..92e0425628 100644 --- a/rpcs3/Emu/Cell/RawSPUThread.cpp +++ b/rpcs3/Emu/Cell/RawSPUThread.cpp @@ -190,7 +190,7 @@ bool RawSPUThread::Write32(const u64 addr, const u32 value) void RawSPUThread::InitRegs() { - dmac.ls_offset = m_offset = (u32)GetStartAddr() + RAW_SPU_LS_OFFSET; + ls_offset = m_offset = (u32)GetStartAddr() + RAW_SPU_LS_OFFSET; SPUThread::InitRegs(); } diff --git a/rpcs3/Emu/Cell/SPUInterpreter.h b/rpcs3/Emu/Cell/SPUInterpreter.h index ac6e5df820..4d8125575f 100644 --- a/rpcs3/Emu/Cell/SPUInterpreter.h +++ b/rpcs3/Emu/Cell/SPUInterpreter.h @@ -3,7 +3,7 @@ #define UNIMPLEMENTED() UNK(__FUNCTION__) #define MEM_AND_REG_HASH() \ - unsigned char mem_h[20]; sha1(vm::get_ptr(CPU.dmac.ls_offset), 256*1024, mem_h); \ + unsigned char mem_h[20]; sha1(vm::get_ptr(CPU.ls_offset), 256*1024, mem_h); \ unsigned char reg_h[20]; sha1((const unsigned char*)CPU.GPR, sizeof(CPU.GPR), reg_h); \ LOG_NOTICE(Log::SPU, "Mem hash: 0x%llx, reg hash: 0x%llx", *(u64*)mem_h, *(u64*)reg_h); @@ -251,10 +251,12 @@ private: } void BIZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } u32 target = branchTarget(CPU.GPR[ra]._u32[3], 0); @@ -270,10 +272,12 @@ private: } void BINZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } u32 target = branchTarget(CPU.GPR[ra]._u32[3], 0); @@ -289,10 +293,12 @@ private: } void BIHZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } u32 target = branchTarget(CPU.GPR[ra]._u32[3], 0); @@ -308,10 +314,12 @@ private: } void BIHNZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } u32 target = branchTarget(CPU.GPR[ra]._u32[3], 0); @@ -337,10 +345,12 @@ private: } void BI(u32 intr, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } u32 target = branchTarget(CPU.GPR[ra]._u32[3], 0); @@ -349,10 +359,12 @@ private: } void BISL(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } u32 target = branchTarget(CPU.GPR[ra]._u32[3], 0); @@ -432,9 +444,7 @@ private: } void LQX(u32 rt, u32 ra, u32 rb) { - u32 a = CPU.GPR[ra]._u32[3], b = CPU.GPR[rb]._u32[3]; - - u32 lsa = (a + b) & 0x3fff0; + u32 lsa = (CPU.GPR[ra]._u32[3] + CPU.GPR[rb]._u32[3]) & 0x3fff0; CPU.GPR[rt] = CPU.ReadLS128(lsa); } @@ -465,6 +475,12 @@ private: { const u32 t = (CPU.GPR[rb]._u32[3] + CPU.GPR[ra]._u32[3]) & 0xF; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u8[15 - t] = 0x03; @@ -473,6 +489,12 @@ private: { const u32 t = (CPU.GPR[rb]._u32[3] + CPU.GPR[ra]._u32[3]) & 0xE; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u16[7 - (t >> 1)] = 0x0203; @@ -480,6 +502,12 @@ private: void CWX(u32 rt, u32 ra, u32 rb) { const u32 t = (CPU.GPR[ra]._u32[3] + CPU.GPR[rb]._u32[3]) & 0xC; + + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; @@ -489,6 +517,12 @@ private: { const u32 t = (CPU.GPR[rb]._u32[3] + CPU.GPR[ra]._u32[3]) & 0x8; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u64[1 - (t >> 3)] = (u64)0x0001020304050607; @@ -574,6 +608,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0xF; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u8[15 - t] = 0x03; @@ -582,6 +622,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0xE; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u16[7 - (t >> 1)] = 0x0203; @@ -590,6 +636,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0xC; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u32[3 - (t >> 2)] = 0x00010203; @@ -598,6 +650,12 @@ private: { const int t = (CPU.GPR[ra]._u32[3] + i7) & 0x8; + if (ra == 1 && (CPU.GPR[ra]._u32[3] & 0xF)) + { + LOG_ERROR(SPU, "%s(): SP = 0x%x", __FUNCTION__, CPU.GPR[ra]._u32[3]); + Emu.Pause(); + } + CPU.GPR[rt]._u64[0] = (u64)0x18191A1B1C1D1E1F; CPU.GPR[rt]._u64[1] = (u64)0x1011121314151617; CPU.GPR[rt]._u64[1 - (t >> 3)] = (u64)0x0001020304050607; @@ -1088,6 +1146,7 @@ private: for (int i = 0; i < 4; i++) { CPU.GPR[rt]._f[i] = (float)CPU.GPR[ra]._u32[i]; + u32 exp = ((CPU.GPR[rt]._u32[i] >> 23) & 0xff) - scale; if (exp > 255) //< 0 diff --git a/rpcs3/Emu/Cell/SPURecompiler.h b/rpcs3/Emu/Cell/SPURecompiler.h index 390db51594..437ebbcd97 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.h +++ b/rpcs3/Emu/Cell/SPURecompiler.h @@ -9,64 +9,6 @@ using namespace asmjit::host; #define UNIMPLEMENTED() UNK(__FUNCTION__) -#define mmToU64Ptr(x) ((u64*)(&x)) -#define mmToU32Ptr(x) ((u32*)(&x)) -#define mmToU16Ptr(x) ((u16*)(&x)) -#define mmToU8Ptr(x) ((u8*)(&x)) - -struct g_imm_table_struct -{ - //u16 cntb_table[65536]; - - __m128i fsmb_table[65536]; - __m128i fsmh_table[256]; - __m128i fsm_table[16]; - - __m128i sldq_pshufb[32]; - __m128i srdq_pshufb[32]; - __m128i rldq_pshufb[16]; - - g_imm_table_struct() - { - /*static_assert(offsetof(g_imm_table_struct, cntb_table) == 0, "offsetof(cntb_table) != 0"); - for (u32 i = 0; i < sizeof(cntb_table) / sizeof(cntb_table[0]); i++) - { - u32 cnt_low = 0, cnt_high = 0; - for (u32 j = 0; j < 8; j++) - { - cnt_low += (i >> j) & 1; - cnt_high += (i >> (j + 8)) & 1; - } - cntb_table[i] = (cnt_high << 8) | cnt_low; - }*/ - for (u32 i = 0; i < sizeof(fsm_table) / sizeof(fsm_table[0]); i++) - { - - for (u32 j = 0; j < 4; j++) mmToU32Ptr(fsm_table[i])[j] = (i & (1 << j)) ? ~0 : 0; - } - for (u32 i = 0; i < sizeof(fsmh_table) / sizeof(fsmh_table[0]); i++) - { - for (u32 j = 0; j < 8; j++) mmToU16Ptr(fsmh_table[i])[j] = (i & (1 << j)) ? ~0 : 0; - } - for (u32 i = 0; i < sizeof(fsmb_table) / sizeof(fsmb_table[0]); i++) - { - for (u32 j = 0; j < 16; j++) mmToU8Ptr(fsmb_table[i])[j] = (i & (1 << j)) ? ~0 : 0; - } - for (u32 i = 0; i < sizeof(sldq_pshufb) / sizeof(sldq_pshufb[0]); i++) - { - for (u32 j = 0; j < 16; j++) mmToU8Ptr(sldq_pshufb[i])[j] = (u8)(j - i); - } - for (u32 i = 0; i < sizeof(srdq_pshufb) / sizeof(srdq_pshufb[0]); i++) - { - for (u32 j = 0; j < 16; j++) mmToU8Ptr(srdq_pshufb[i])[j] = (j + i > 15) ? 0xff : (u8)(j + i); - } - for (u32 i = 0; i < sizeof(rldq_pshufb) / sizeof(rldq_pshufb[0]); i++) - { - for (u32 j = 0; j < 16; j++) mmToU8Ptr(rldq_pshufb[i])[j] = (u8)(j - i) & 0xf; - } - } -}; - class SPURecompiler; class SPURecompilerCore : public CPUDecoder @@ -78,6 +20,7 @@ public: SPUInterpreter* inter; JitRuntime runtime; bool first; + bool need_check; struct SPURecEntry { @@ -457,7 +400,7 @@ private: c.mov(cpu_dword(PC), CPU.PC); // This instruction must be used following a store instruction that modifies the instruction stream. c.mfence(); - c.mov(*pos_var, (CPU.PC >> 2) + 1); + c.mov(*pos_var, (CPU.PC >> 2) + 1 + 0x2000000); do_finalize = true; LOG_OPCODE(); } @@ -688,7 +631,7 @@ private: } LOG_OPCODE(); } - void ROTH(u32 rt, u32 ra, u32 rb) + void ROTH(u32 rt, u32 ra, u32 rb) //nf { XmmInvalidate(rt); for (u32 i = 0; i < 8; i++) @@ -1131,10 +1074,12 @@ private: } void BIZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } c.mov(cpu_dword(PC), CPU.PC); @@ -1142,6 +1087,7 @@ private: c.mov(*addr, CPU.PC + 4); c.mov(*pos_var, cpu_dword(GPR[ra]._u32[3])); + if (ra) c.or_(*pos_var, 0x2000000 << 2); // rude (check if not LR) c.cmp(cpu_dword(GPR[rt]._u32[3]), 0); c.cmovne(*pos_var, *addr); c.shr(*pos_var, 2); @@ -1149,10 +1095,12 @@ private: } void BINZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } c.mov(cpu_dword(PC), CPU.PC); @@ -1160,6 +1108,7 @@ private: c.mov(*addr, CPU.PC + 4); c.mov(*pos_var, cpu_dword(GPR[ra]._u32[3])); + if (ra) c.or_(*pos_var, 0x2000000 << 2); // rude (check if not LR) c.cmp(cpu_dword(GPR[rt]._u32[3]), 0); c.cmove(*pos_var, *addr); c.shr(*pos_var, 2); @@ -1167,10 +1116,12 @@ private: } void BIHZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } c.mov(cpu_dword(PC), CPU.PC); @@ -1178,6 +1129,7 @@ private: c.mov(*addr, CPU.PC + 4); c.mov(*pos_var, cpu_dword(GPR[ra]._u32[3])); + if (ra) c.or_(*pos_var, 0x2000000 << 2); // rude (check if not LR) c.cmp(cpu_word(GPR[rt]._u16[6]), 0); c.cmovne(*pos_var, *addr); c.shr(*pos_var, 2); @@ -1185,10 +1137,12 @@ private: } void BIHNZ(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } c.mov(cpu_dword(PC), CPU.PC); @@ -1196,6 +1150,7 @@ private: c.mov(*addr, CPU.PC + 4); c.mov(*pos_var, cpu_dword(GPR[ra]._u32[3])); + if (ra) c.or_(*pos_var, 0x2000000 << 2); // rude (check if not LR) c.cmp(cpu_word(GPR[rt]._u16[6]), 0); c.cmove(*pos_var, *addr); c.shr(*pos_var, 2); @@ -1234,25 +1189,30 @@ private: } void BI(u32 intr, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } c.mov(cpu_dword(PC), CPU.PC); do_finalize = true; c.mov(*pos_var, cpu_dword(GPR[ra]._u32[3])); + if (ra) c.or_(*pos_var, 0x2000000 << 2); // rude (check if not LR) c.shr(*pos_var, 2); LOG_OPCODE(); } void BISL(u32 intr, u32 rt, u32 ra) { - if (intr) + switch (intr) { - UNIMPLEMENTED(); - return; + case 0: break; + case 0x10: break; // enable interrupts + case 0x20: break; // disable interrupts + default: UNIMPLEMENTED(); return; } XmmInvalidate(rt); @@ -1267,6 +1227,7 @@ private: c.mov(*pos_var, cpu_dword(GPR[ra]._u32[3])); c.mov(cpu_dword(GPR[rt]._u32[3]), CPU.PC + 4); c.shr(*pos_var, 2); + c.or_(*pos_var, 0x2000000); LOG_OPCODE(); } void IRET(u32 ra) @@ -1423,18 +1384,21 @@ private: } void CBX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0xf); - c.neg(*addr); - c.add(*addr, 0xf); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1444,18 +1408,21 @@ private: } void CHX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0xe); - c.neg(*addr); - c.add(*addr, 0xe); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1465,18 +1432,21 @@ private: } void CWX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0xc); - c.neg(*addr); - c.add(*addr, 0xc); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1486,18 +1456,21 @@ private: } void CDX(u32 rt, u32 ra, u32 rb) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - if (ra == rb) + c.mov(*addr, cpu_dword(GPR[rb]._u32[3])); + if (ra == 1) + { + // assuming that SP % 16 is always zero + } + else if (ra == rb) { c.add(*addr, *addr); } else { - c.add(*addr, cpu_dword(GPR[rb]._u32[3])); + c.add(*addr, cpu_dword(GPR[ra]._u32[3])); } + c.not_(*addr); c.and_(*addr, 0x8); - c.neg(*addr); - c.add(*addr, 0x8); const XmmLink& vr = XmmAlloc(rt); c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); XmmFinalize(vr, rt); @@ -1594,59 +1567,103 @@ private: } void CBD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0xf); - c.neg(*addr); - c.add(*addr, 0xf); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(byte_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u8[0])), 0x03); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u8r[i7 & 0xf] = 0x03; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0xf); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(byte_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u8[0])), 0x03); + } LOG_OPCODE(); } void CHD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0xe); - c.neg(*addr); - c.add(*addr, 0xe); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(word_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u16[0])), 0x0203); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u16r[(i7 >> 1) & 0x7] = 0x0203; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0xe); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(word_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u16[0])), 0x0203); + } LOG_OPCODE(); } void CWD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0xc); - c.neg(*addr); - c.add(*addr, 0xc); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x00010203); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u32r[(i7 >> 2) & 0x3] = 0x00010203; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0xc); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x00010203); + } LOG_OPCODE(); } void CDD(u32 rt, u32 ra, s32 i7) { - c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); - c.add(*addr, i7); - c.and_(*addr, 0x8); - c.neg(*addr); - c.add(*addr, 0x8); - const XmmLink& vr = XmmAlloc(rt); - c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); - XmmFinalize(vr, rt); - XmmInvalidate(rt); - c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x04050607); - c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[1])), 0x00010203); + if (ra == 1) + { + // assuming that SP % 16 is always zero + const XmmLink& vr = XmmAlloc(rt); + u128 value = u128::fromV(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f)); + value.u64r[(i7 >> 3) & 0x1] = 0x0001020304050607ull; + c.movdqa(vr.get(), XmmConst(value.vi)); + XmmFinalize(vr, rt); + } + else + { + c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); + c.add(*addr, i7); + c.not_(*addr); + c.and_(*addr, 0x8); + const XmmLink& vr = XmmAlloc(rt); + c.movdqa(vr.get(), XmmConst(_mm_set_epi32(0x10111213, 0x14151617, 0x18191a1b, 0x1c1d1e1f))); + XmmFinalize(vr, rt); + XmmInvalidate(rt); + c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[0])), 0x04050607); + c.mov(dword_ptr(*cpu_var, *addr, 0, (s32)offsetof(SPUThread, GPR[rt]._u32[1])), 0x00010203); + } LOG_OPCODE(); } void ROTQBII(u32 rt, u32 ra, s32 i7) @@ -1947,23 +1964,22 @@ private: { c.mov(*addr, cpu_dword(GPR[ra]._s32[3])); c.cmp(*addr, cpu_dword(GPR[rb]._s32[3])); - c.mov(*addr, 0); c.setg(addr->r8()); - c.neg(*addr); + c.shl(*addr, 24); c.mov(*pos_var, (CPU.PC >> 2) + 1); - c.xor_(*pos_var, *addr); + c.or_(*pos_var, *addr); do_finalize = true; LOG_OPCODE(); } void CLZ(u32 rt, u32 ra) { XmmInvalidate(rt); + c.mov(*qw0, 32 + 31); for (u32 i = 0; i < 4; i++) { c.bsr(*addr, cpu_dword(GPR[ra]._u32[i])); - c.cmovz(*addr, dword_ptr(*g_imm_var, (s32)offsetof(g_imm_table_struct, fsmb_table[0xffff]))); // load 0xffffffff - c.neg(*addr); - c.add(*addr, 31); + c.cmovz(*addr, qw0->r32()); + c.xor_(*addr, 31); c.mov(cpu_dword(GPR[rt]._u32[i]), *addr); } LOG_OPCODE(); @@ -2308,11 +2324,10 @@ private: { c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); c.cmp(*addr, cpu_dword(GPR[rb]._u32[3])); - c.mov(*addr, 0); c.seta(addr->r8()); - c.neg(*addr); + c.shl(*addr, 24); c.mov(*pos_var, (CPU.PC >> 2) + 1); - c.xor_(*pos_var, *addr); + c.or_(*pos_var, *addr); do_finalize = true; LOG_OPCODE(); } @@ -2662,11 +2677,10 @@ private: { c.mov(*addr, cpu_dword(GPR[ra]._s32[3])); c.cmp(*addr, cpu_dword(GPR[rb]._s32[3])); - c.mov(*addr, 0); c.sete(addr->r8()); - c.neg(*addr); + c.shl(*addr, 24); c.mov(*pos_var, (CPU.PC >> 2) + 1); - c.xor_(*pos_var, *addr); + c.or_(*pos_var, *addr); do_finalize = true; LOG_OPCODE(); } @@ -3324,11 +3338,10 @@ private: { c.mov(*addr, cpu_dword(GPR[ra]._s32[3])); c.cmp(*addr, i10); - c.mov(*addr, 0); c.setg(addr->r8()); - c.neg(*addr); + c.shl(*addr, 24); c.mov(*pos_var, (CPU.PC >> 2) + 1); - c.xor_(*pos_var, *addr); + c.or_(*pos_var, *addr); do_finalize = true; LOG_OPCODE(); } @@ -3390,11 +3403,10 @@ private: { c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); c.cmp(*addr, i10); - c.mov(*addr, 0); c.seta(addr->r8()); - c.neg(*addr); + c.shl(*addr, 24); c.mov(*pos_var, (CPU.PC >> 2) + 1); - c.xor_(*pos_var, *addr); + c.or_(*pos_var, *addr); do_finalize = true; LOG_OPCODE(); } @@ -3441,11 +3453,10 @@ private: { c.mov(*addr, cpu_dword(GPR[ra]._u32[3])); c.cmp(*addr, i10); - c.mov(*addr, 0); c.sete(addr->r8()); - c.neg(*addr); + c.shl(*addr, 24); c.mov(*pos_var, (CPU.PC >> 2) + 1); - c.xor_(*pos_var, *addr); + c.or_(*pos_var, *addr); do_finalize = true; LOG_OPCODE(); } @@ -3517,6 +3528,16 @@ private: } WRAPPER_END(rc, rt, ra, rb);*/ + // hypothetical AVX-512 implementation: + // VPXORD mask, rc, [byte:0x0f] // 15 - rc (only for index bits) + // VPSHUFB res {k0}, ra, mask + // VPTESTMB k1 {k0}, rc, [byte:0x10] + // VPSHUFB res {k1}, rb, mask + // VPCMPNLTUB k1 {k0}, mask, [byte:0xc0] + // VPADDB res {k1}, res, [byte:0xff] + // VPCMPNLTUB k1 {k1}, mask, [byte:0xe0] + // VPSUBB res {k1}, res, [byte:0x7f] + const XmmLink& v0 = XmmGet(rc); // v0 = mask const XmmLink& v1 = XmmAlloc(); const XmmLink& v2 = XmmCopy(v0); // v2 = mask diff --git a/rpcs3/Emu/Cell/SPURecompilerCore.cpp b/rpcs3/Emu/Cell/SPURecompilerCore.cpp index 0427e8effb..c5edf35a7b 100644 --- a/rpcs3/Emu/Cell/SPURecompilerCore.cpp +++ b/rpcs3/Emu/Cell/SPURecompilerCore.cpp @@ -13,13 +13,14 @@ #include "SPUInterpreter.h" #include "SPURecompiler.h" -static const g_imm_table_struct g_imm_table; +const g_imm_table_struct g_imm_table; SPURecompilerCore::SPURecompilerCore(SPUThread& cpu) : m_enc(new SPURecompiler(cpu, *this)) , inter(new SPUInterpreter(cpu)) , CPU(cpu) , first(true) + , need_check(false) { memset(entry, 0, sizeof(entry)); X86CpuInfo inf; @@ -48,7 +49,7 @@ void SPURecompilerCore::Compile(u16 pos) u64 time0 = 0; SPUDisAsm dis_asm(CPUDisAsm_InterpreterMode); - dis_asm.offset = vm::get_ptr(CPU.dmac.ls_offset); + dis_asm.offset = vm::get_ptr(CPU.ls_offset); StringLogger stringLogger; stringLogger.setOption(kLoggerOptionBinaryForm, true); @@ -102,7 +103,7 @@ void SPURecompilerCore::Compile(u16 pos) while (true) { - const u32 opcode = vm::read32(CPU.dmac.ls_offset + pos * 4); + const u32 opcode = vm::read32(CPU.ls_offset + pos * 4); m_enc->do_finalize = false; if (opcode) { @@ -181,8 +182,8 @@ void SPURecompilerCore::Compile(u16 pos) u8 SPURecompilerCore::DecodeMemory(const u32 address) { - assert(CPU.dmac.ls_offset == address - CPU.PC); - const u32 m_offset = CPU.dmac.ls_offset; + assert(CPU.ls_offset == address - CPU.PC); + const u32 m_offset = CPU.ls_offset; const u16 pos = (u16)(CPU.PC >> 2); //ConLog.Write("DecodeMemory: pos=%d", pos); @@ -192,20 +193,26 @@ u8 SPURecompilerCore::DecodeMemory(const u32 address) { // check data (hard way) bool is_valid = true; - //for (u32 i = pos; i < (u32)(entry[pos].count + pos); i++) - //{ - // if (entry[i].valid != ls[i]) - // { - // is_valid = false; - // break; - // } - //} + if (need_check) + { + for (u32 i = 0; i < 0x10000; i++) + { + if (entry[i].valid && entry[i].valid != ls[i]) + { + is_valid = false; + break; + } + } + need_check = false; + } // invalidate if necessary if (!is_valid) { for (u32 i = 0; i < 0x10000; i++) { - if (entry[i].pointer && + if (!entry[i].pointer) continue; + + if (!entry[i].valid || entry[i].valid != ls[i] || i + (u32)entry[i].count > (u32)pos && i < (u32)pos + (u32)entry[pos].count) { @@ -214,6 +221,11 @@ u8 SPURecompilerCore::DecodeMemory(const u32 address) //RtlDeleteFunctionTable(&entry[i].info); #endif entry[i].pointer = nullptr; + for (u32 j = i; j < i + (u32)entry[i].count; j++) + { + entry[j].valid = 0; + } + //need_check = true; } } //LOG_ERROR(Log::SPU, "SPURecompilerCore::DecodeMemory(ls_addr=0x%x): code has changed", pos * sizeof(u32)); @@ -254,11 +266,17 @@ u8 SPURecompilerCore::DecodeMemory(const u32 address) u32 res = pos; res = func(cpu, vm::get_ptr(m_offset), imm_table.data(), &g_imm_table); - if (res > 0xffff) + if (res & 0x1000000) { CPU.SPU.Status.SetValue(SPU_STATUS_STOPPED_BY_HALT); CPU.Stop(); - res = ~res; + res &= ~0x1000000; + } + + if (res & 0x2000000) + { + need_check = true; + res &= ~0x2000000; } if (did_compile) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index f7dc30ca73..719cdc8cab 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -50,7 +50,15 @@ void SPUThread::Task() const int round = std::fegetround(); std::fesetround(FE_TOWARDZERO); - CPUThread::Task(); + if (m_custom_task) + { + m_custom_task(*this); + } + else + { + CPUThread::Task(); + } + if (std::fegetround() != FE_TOWARDZERO) { LOG_ERROR(Log::SPU, "Rounding mode has changed(%d)", std::fegetround()); @@ -68,11 +76,11 @@ void SPUThread::DoReset() void SPUThread::InitRegs() { - GPR[1]._u32[3] = 0x40000 - 120; + GPR[1]._u32[3] = 0x3FFF0; // initial stack frame pointer cfg.Reset(); - dmac.ls_offset = m_offset; + ls_offset = m_offset; SPU.Status.SetValue(SPU_STATUS_STOPPED); @@ -138,6 +146,31 @@ void SPUThread::DoClose() } } +void SPUThread::FastCall(u32 ls_addr) +{ + // can't be called from another thread (because it doesn't make sense) + WriteLS32(0x0, 2); + + auto old_PC = PC; + auto old_LR = GPR[0]._u32[3]; + auto old_stack = GPR[1]._u32[3]; // only saved and restored (may be wrong) + + m_status = Running; + PC = ls_addr; + GPR[0]._u32[3] = 0x0; + + CPUThread::Task(); + + PC = old_PC; + GPR[0]._u32[3] = old_LR; + GPR[1]._u32[3] = old_stack; +} + +void SPUThread::FastStop() +{ + m_status = Stopped; +} + void SPUThread::WriteSNR(bool number, u32 value) { if (cfg.value & ((u64)1 << (u64)number)) @@ -181,11 +214,11 @@ void SPUThread::ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size) if ((addr <= 0x3ffff) && (addr + size <= 0x40000)) { // LS access - ea = spu->dmac.ls_offset + addr; + ea = spu->ls_offset + addr; } else if ((cmd & MFC_PUT_CMD) && size == 4 && (addr == SYS_SPU_THREAD_SNR1 || addr == SYS_SPU_THREAD_SNR2)) { - spu->WriteSNR(SYS_SPU_THREAD_SNR2 == addr, vm::read32(dmac.ls_offset + lsa)); + spu->WriteSNR(SYS_SPU_THREAD_SNR2 == addr, vm::read32(ls_offset + lsa)); return; } else @@ -208,13 +241,13 @@ void SPUThread::ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size) { case MFC_PUT_CMD: { - vm::write32(ea, ReadLS32(lsa)); + vm::write32((u32)ea, ReadLS32(lsa)); return; } case MFC_GET_CMD: { - WriteLS32(lsa, vm::read32(ea)); + WriteLS32(lsa, vm::read32((u32)ea)); return; } @@ -231,13 +264,13 @@ void SPUThread::ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size) { case MFC_PUT_CMD: { - memcpy(vm::get_ptr(ea), vm::get_ptr(dmac.ls_offset + lsa), size); + memcpy(vm::get_ptr((u32)ea), vm::get_ptr(ls_offset + lsa), size); return; } case MFC_GET_CMD: { - memcpy(vm::get_ptr(dmac.ls_offset + lsa), vm::get_ptr(ea), size); + memcpy(vm::get_ptr(ls_offset + lsa), vm::get_ptr((u32)ea), size); return; } @@ -269,10 +302,10 @@ void SPUThread::ListCmd(u32 lsa, u64 ea, u16 tag, u16 size, u32 cmd, MFCReg& MFC for (u32 i = 0; i < list_size; i++) { - auto rec = vm::ptr::make(dmac.ls_offset + list_addr + i * 8); + auto rec = vm::ptr::make(ls_offset + list_addr + i * 8); u32 size = rec->ts; - if (size < 16 && size != 1 && size != 2 && size != 4 && size != 8) + if (!(rec->s.ToBE() & se16(0x8000)) && size < 16 && size != 1 && size != 2 && size != 4 && size != 8) { LOG_ERROR(Log::SPU, "DMA List: invalid transfer size(%d)", size); result = MFC_PPU_DMA_CMD_SEQUENCE_ERROR; @@ -280,13 +313,16 @@ void SPUThread::ListCmd(u32 lsa, u64 ea, u16 tag, u16 size, u32 cmd, MFCReg& MFC } u32 addr = rec->ea; - ProcessCmd(cmd, tag, lsa | (addr & 0xf), addr, size); - if (Ini.HLELogging.GetValue() || rec->s) + if (size) + ProcessCmd(cmd, tag, lsa | (addr & 0xf), addr, size); + + if (Ini.HLELogging.GetValue() || rec->s.ToBE()) LOG_NOTICE(Log::SPU, "*** list element(%d/%d): s = 0x%x, ts = 0x%x, low ea = 0x%x (lsa = 0x%x)", i, list_size, (u16)rec->s, (u16)rec->ts, (u32)rec->ea, lsa | (addr & 0xf)); - lsa += std::max(size, (u32)16); + if (size) + lsa += std::max(size, (u32)16); if (rec->s.ToBE() & se16(0x8000)) { @@ -366,6 +402,17 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) op == MFC_PUTLLUC_CMD ? "PUTLLUC" : "PUTQLLUC"), lsa, ea, tag, size, cmd); + if ((u32)ea != ea) + { + LOG_ERROR(Log::SPU, "DMA %s: Invalid external address (0x%llx)", + (op == MFC_GETLLAR_CMD ? "GETLLAR" : + op == MFC_PUTLLC_CMD ? "PUTLLC" : + op == MFC_PUTLLUC_CMD ? "PUTLLUC" : "PUTQLLUC"), + ea); + Emu.Pause(); + return; + } + if (op == MFC_GETLLAR_CMD) // get reservation { if (R_ADDR) @@ -376,8 +423,8 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) R_ADDR = ea; for (u32 i = 0; i < 16; i++) { - R_DATA[i] = vm::get_ptr(R_ADDR)[i]; - vm::get_ptr(dmac.ls_offset + lsa)[i] = R_DATA[i]; + R_DATA[i] = vm::get_ptr((u32)R_ADDR)[i]; + vm::get_ptr(ls_offset + lsa)[i] = R_DATA[i]; } MFCArgs.AtomicStat.PushUncond(MFC_GETLLAR_SUCCESS); } @@ -391,12 +438,12 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) u64 buf[16]; for (u32 i = 0; i < 16; i++) { - buf[i] = vm::get_ptr(dmac.ls_offset + lsa)[i]; + buf[i] = vm::get_ptr(ls_offset + lsa)[i]; if (buf[i] != R_DATA[i]) { changed++; mask |= (0x3 << (i * 2)); - if (vm::get_ptr(R_ADDR)[i] != R_DATA[i]) + if (vm::get_ptr((u32)R_ADDR)[i] != R_DATA[i]) { m_events |= SPU_EVENT_LR; MFCArgs.AtomicStat.PushUncond(MFC_PUTLLC_FAILURE); @@ -410,7 +457,7 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) { if (buf[i] != R_DATA[i]) { - if (InterlockedCompareExchange(&vm::get_ptr(ea)[i], buf[i], R_DATA[i]) != R_DATA[i]) + if (InterlockedCompareExchange(&vm::get_ptr((u32)R_ADDR)[i], buf[i], R_DATA[i]) != R_DATA[i]) { m_events |= SPU_EVENT_LR; MFCArgs.AtomicStat.PushUncond(MFC_PUTLLC_FAILURE); @@ -436,8 +483,8 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) for (s32 i = (s32)PC; i < (s32)PC + 4 * 7; i += 4) { dis_asm.dump_pc = i; - dis_asm.offset = vm::get_ptr(dmac.ls_offset); - const u32 opcode = vm::read32(i + dmac.ls_offset); + dis_asm.offset = vm::get_ptr(ls_offset); + const u32 opcode = vm::read32(i + ls_offset); (*SPU_instr::rrr_list)(&dis_asm, opcode); if (i >= 0 && i < 0x40000) { @@ -454,7 +501,7 @@ void SPUThread::EnqMfcCmd(MFCReg& MFCArgs) } else // store unconditional { - if (R_ADDR) + if (R_ADDR) // may be wrong { m_events |= SPU_EVENT_LR; } @@ -484,7 +531,7 @@ bool SPUThread::CheckEvents() { for (u32 i = 0; i < 16; i++) { - if (vm::get_ptr(R_ADDR)[i] != R_DATA[i]) + if (vm::get_ptr((u32)R_ADDR)[i] != R_DATA[i]) { m_events |= SPU_EVENT_LR; R_ADDR = 0; @@ -498,18 +545,20 @@ bool SPUThread::CheckEvents() u32 SPUThread::GetChannelCount(u32 ch) { + u32 res = 0xdeafbeef; + switch (ch) { - case SPU_WrOutMbox: return SPU.Out_MBox.GetFreeCount(); - case SPU_WrOutIntrMbox: return SPU.Out_IntrMBox.GetFreeCount(); - case SPU_RdInMbox: return SPU.In_MBox.GetCount(); - case MFC_RdTagStat: return MFC1.TagStatus.GetCount(); - case MFC_RdListStallStat: return StallStat.GetCount(); - case MFC_WrTagUpdate: return MFC1.TagStatus.GetCount(); // hack - case SPU_RdSigNotify1: return SPU.SNR[0].GetCount(); - case SPU_RdSigNotify2: return SPU.SNR[1].GetCount(); - case MFC_RdAtomicStat: return MFC1.AtomicStat.GetCount(); - case SPU_RdEventStat: return CheckEvents() ? 1 : 0; + case SPU_WrOutMbox: res = SPU.Out_MBox.GetFreeCount(); break; + case SPU_WrOutIntrMbox: res = SPU.Out_IntrMBox.GetFreeCount(); break; + case SPU_RdInMbox: res = SPU.In_MBox.GetCount(); break; + case MFC_RdTagStat: res = MFC1.TagStatus.GetCount(); break; + case MFC_RdListStallStat: res = StallStat.GetCount(); break; + case MFC_WrTagUpdate: res = MFC1.TagStatus.GetCount(); break;// hack + case SPU_RdSigNotify1: res = SPU.SNR[0].GetCount(); break; + case SPU_RdSigNotify2: res = SPU.SNR[1].GetCount(); break; + case MFC_RdAtomicStat: res = MFC1.AtomicStat.GetCount(); break; + case SPU_RdEventStat: res = CheckEvents() ? 1 : 0; break; default: { @@ -518,12 +567,17 @@ u32 SPUThread::GetChannelCount(u32 ch) return 0; } } + + //LOG_NOTICE(Log::SPU, "%s(%s) -> 0x%x", __FUNCTION__, spu_ch_name[ch], res); + return res; } void SPUThread::WriteChannel(u32 ch, const u128& r) { const u32 v = r._u32[3]; + //LOG_NOTICE(Log::SPU, "%s(%s): v=0x%x", __FUNCTION__, spu_ch_name[ch], v); + switch (ch) { case SPU_WrOutIntrMbox: @@ -880,13 +934,27 @@ void SPUThread::ReadChannel(u128& r, u32 ch) case SPU_RdSigNotify1: { - while (!SPU.SNR[0].Pop(v) && !Emu.IsStopped()) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + if (cfg.value & 1) + { + while (!SPU.SNR[0].Pop_XCHG(v) && !Emu.IsStopped()) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + else + { + while (!SPU.SNR[0].Pop(v) && !Emu.IsStopped()) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } break; } case SPU_RdSigNotify2: { - while (!SPU.SNR[1].Pop(v) && !Emu.IsStopped()) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + if (cfg.value & 2) + { + while (!SPU.SNR[1].Pop_XCHG(v) && !Emu.IsStopped()) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + else + { + while (!SPU.SNR[1].Pop(v) && !Emu.IsStopped()) std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } break; } @@ -936,6 +1004,8 @@ void SPUThread::ReadChannel(u128& r, u32 ch) } if (Emu.IsStopped()) LOG_WARNING(Log::SPU, "%s(%s) aborted", __FUNCTION__, spu_ch_name[ch]); + + //LOG_NOTICE(Log::SPU, "%s(%s) -> 0x%x", __FUNCTION__, spu_ch_name[ch], v); } void SPUThread::StopAndSignal(u32 code) @@ -945,6 +1015,24 @@ void SPUThread::StopAndSignal(u32 code) switch (code) { + case 0x001: + { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack + break; + } + + case 0x002: + { + FastStop(); + break; + } + + case 0x003: + { + GPR[3]._u64[1] = m_code3_func(*this); + break; + } + case 0x110: { /* ===== sys_spu_thread_receive_event ===== */ @@ -1075,7 +1163,6 @@ void SPUThread::StopAndSignal(u32 code) } default: - { if (!SPU.Out_MBox.GetCount()) { LOG_ERROR(Log::SPU, "Unknown STOP code: 0x%x (no message)", code); @@ -1084,8 +1171,19 @@ void SPUThread::StopAndSignal(u32 code) { LOG_ERROR(Log::SPU, "Unknown STOP code: 0x%x (message=0x%x)", code, SPU.Out_MBox.GetValue()); } - Stop(); + Emu.Pause(); break; } - } +} + +spu_thread::spu_thread(u32 entry, const std::string& name, u32 stack_size, u32 prio) +{ + thread = &Emu.GetCPU().AddThread(CPU_THREAD_SPU); + + thread->SetName(name); + thread->SetEntry(entry); + thread->SetStackSize(stack_size ? stack_size : Emu.GetInfo().GetProcParam().primary_stacksize); + thread->SetPrio(prio ? prio : Emu.GetInfo().GetProcParam().primary_prio); + + argc = 0; } \ No newline at end of file diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index 0e6070d0bf..aaffd7d00d 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -1,4 +1,5 @@ #pragma once +#include "Emu/Memory/atomic_type.h" #include "PPCThread.h" #include "Emu/Event.h" #include "MFC.h" @@ -104,6 +105,66 @@ enum SPU_RdSigNotify2_offs = 0x1C00C, }; +#define mmToU64Ptr(x) ((u64*)(&x)) +#define mmToU32Ptr(x) ((u32*)(&x)) +#define mmToU16Ptr(x) ((u16*)(&x)) +#define mmToU8Ptr(x) ((u8*)(&x)) + +struct g_imm_table_struct +{ + //u16 cntb_table[65536]; + + __m128i fsmb_table[65536]; + __m128i fsmh_table[256]; + __m128i fsm_table[16]; + + __m128i sldq_pshufb[32]; + __m128i srdq_pshufb[32]; + __m128i rldq_pshufb[16]; + + g_imm_table_struct() + { + /*static_assert(offsetof(g_imm_table_struct, cntb_table) == 0, "offsetof(cntb_table) != 0"); + for (u32 i = 0; i < sizeof(cntb_table) / sizeof(cntb_table[0]); i++) + { + u32 cnt_low = 0, cnt_high = 0; + for (u32 j = 0; j < 8; j++) + { + cnt_low += (i >> j) & 1; + cnt_high += (i >> (j + 8)) & 1; + } + cntb_table[i] = (cnt_high << 8) | cnt_low; + }*/ + for (u32 i = 0; i < sizeof(fsm_table) / sizeof(fsm_table[0]); i++) + { + + for (u32 j = 0; j < 4; j++) mmToU32Ptr(fsm_table[i])[j] = (i & (1 << j)) ? ~0 : 0; + } + for (u32 i = 0; i < sizeof(fsmh_table) / sizeof(fsmh_table[0]); i++) + { + for (u32 j = 0; j < 8; j++) mmToU16Ptr(fsmh_table[i])[j] = (i & (1 << j)) ? ~0 : 0; + } + for (u32 i = 0; i < sizeof(fsmb_table) / sizeof(fsmb_table[0]); i++) + { + for (u32 j = 0; j < 16; j++) mmToU8Ptr(fsmb_table[i])[j] = (i & (1 << j)) ? ~0 : 0; + } + for (u32 i = 0; i < sizeof(sldq_pshufb) / sizeof(sldq_pshufb[0]); i++) + { + for (u32 j = 0; j < 16; j++) mmToU8Ptr(sldq_pshufb[i])[j] = (u8)(j - i); + } + for (u32 i = 0; i < sizeof(srdq_pshufb) / sizeof(srdq_pshufb[0]); i++) + { + for (u32 j = 0; j < 16; j++) mmToU8Ptr(srdq_pshufb[i])[j] = (j + i > 15) ? 0xff : (u8)(j + i); + } + for (u32 i = 0; i < sizeof(rldq_pshufb) / sizeof(rldq_pshufb[0]); i++) + { + for (u32 j = 0; j < 16; j++) mmToU8Ptr(rldq_pshufb[i])[j] = (u8)(j - i) & 0xf; + } + } +}; + +extern const g_imm_table_struct g_imm_table; + //Floating point status and control register. Unsure if this is one of the GPRs or SPRs //Is 128 bits, but bits 0-19, 24-28, 32-49, 56-60, 64-81, 88-92, 96-115, 120-124 are unused class FPSCR @@ -246,181 +307,127 @@ public: } } m_intrtag[3]; - template + // limited lock-free queue, most functions are barrier-free + template class Channel { - public: - static const size_t max_count = _max_count; + static_assert(max_count >= 1, "Invalid channel count"); - private: - union _CRT_ALIGN(8) { - struct { - volatile u32 m_index; - u32 m_value[max_count]; - }; - volatile u64 m_indval; + struct ChannelData + { + u32 value; + u32 is_set; }; - std::mutex m_lock; + + atomic_t m_data[max_count]; + size_t m_push; + size_t m_pop; public: - Channel() + __noinline Channel() { - Init(); - } - - void Init() - { - m_indval = 0; - } - - __forceinline bool Pop(u32& res) - { - if (max_count > 1) + for (size_t i = 0; i < max_count; i++) { - std::lock_guard lock(m_lock); - if(!m_index) - { - return false; - } - res = m_value[0]; - if (max_count > 1) for (u32 i = 1; i < max_count; i++) // FIFO - { - m_value[i-1] = m_value[i]; - } - m_value[max_count-1] = 0; - m_index--; - return true; - } - else - { //lock-free - if ((m_indval & 0xffffffff) == 0) - return false; - else - { - res = (m_indval >> 32); - m_indval = 0; - return true; - } - } - } - - __forceinline bool Push(u32 value) - { - if (max_count > 1) - { - std::lock_guard lock(m_lock); - if(m_index >= max_count) - { - return false; - } - m_value[m_index++] = value; - return true; - } - else - { //lock-free - if (m_indval & 0xffffffff) - return false; - else - { - const u64 new_value = ((u64)value << 32) | 1; - m_indval = new_value; - return true; - } - } - } - - __forceinline void PushUncond(u32 value) - { - if (max_count > 1) - { - std::lock_guard lock(m_lock); - if(m_index >= max_count) - m_value[max_count-1] = value; //last message is overwritten - else - m_value[m_index++] = value; - } - else - { //lock-free - const u64 new_value = ((u64)value << 32) | 1; - m_indval = new_value; - } - } - - __forceinline void PushUncond_OR(u32 value) - { - if (max_count > 1) - { - std::lock_guard lock(m_lock); - if(m_index >= max_count) - m_value[max_count-1] |= value; //last message is logically ORed - else - m_value[m_index++] = value; - } - else - { - InterlockedOr64((volatile s64*)m_indval, ((u64)value << 32) | 1); + m_data[i].write_relaxed({}); } + m_push = 0; + m_pop = 0; } __forceinline void PopUncond(u32& res) { - if (max_count > 1) - { - std::lock_guard lock(m_lock); - if(!m_index) - res = 0; //result is undefined - else - { - res = m_value[--m_index]; - m_value[m_index] = 0; - } - } - else - { //lock-free - if(!m_index) - res = 0; - else - { - res = (m_indval >> 32); - m_indval = 0; - } - } + res = m_data[m_pop].read_relaxed().value; + m_data[m_pop].write_relaxed({}); + m_pop = (m_pop + 1) % max_count; } - __forceinline u32 GetCount() + __forceinline bool Pop(u32& res) { - if (max_count > 1) + const auto data = m_data[m_pop].read_relaxed(); + if (data.is_set) { - std::lock_guard lock(m_lock); - return m_index; + res = data.value; + m_data[m_pop].write_relaxed({}); + m_pop = (m_pop + 1) % max_count; + return true; } else { - return m_index; + return false; } } - __forceinline u32 GetFreeCount() + __forceinline bool Pop_XCHG(u32& res) // not barrier-free, not tested { - if (max_count > 1) + const auto data = m_data[m_pop].exchange({}); + if (data.is_set) { - std::lock_guard lock(m_lock); - return max_count - m_index; + res = data.value; + m_pop = (m_pop + 1) % max_count; + return true; } else { - return max_count - m_index; + return false; } } - void SetValue(u32 value) + __forceinline void PushUncond_OR(const u32 value) // not barrier-free, not tested { - m_value[0] = value; + m_data[m_push]._or({ value, 1 }); + m_push = (m_push + 1) % max_count; } - u32 GetValue() const + __forceinline void PushUncond(const u32 value) { - return m_value[0]; + m_data[m_push].write_relaxed({ value, 1 }); + m_push = (m_push + 1) % max_count; + } + + __forceinline bool Push(const u32 value) + { + if (m_data[m_push].read_relaxed().is_set) + { + return false; + } + else + { + PushUncond(value); + return true; + } + } + + __forceinline u32 GetCount() const + { + u32 res = 0; + for (size_t i = 0; i < max_count; i++) + { + res += m_data[i].read_relaxed().is_set ? 1 : 0; + } + return res; + } + + __forceinline u32 GetFreeCount() const + { + u32 res = 0; + for (size_t i = 0; i < max_count; i++) + { + res += m_data[i].read_relaxed().is_set ? 0 : 1; + } + return res; + } + + __forceinline void SetValue(const u32 value) + { + m_data[m_push].direct_op([value](ChannelData& v) + { + v.value = value; + }); + } + + __forceinline u32 GetValue() const + { + return m_data[m_pop].read_relaxed().value; } }; @@ -473,7 +480,7 @@ public: struct { u32 EAH, EAL; }; }; - DMAC dmac; + u32 ls_offset; void ProcessCmd(u32 cmd, u32 tag, u32 lsa, u64 ea, u32 size); @@ -503,6 +510,9 @@ public: void WriteLS64 (const u32 lsa, const u64& data) const { vm::write64 (lsa + m_offset, data); } void WriteLS128(const u32 lsa, const u128& data) const { vm::write128(lsa + m_offset, data); } + std::function m_custom_task; + std::function m_code3_func; + public: SPUThread(CPUThreadType type = CPU_THREAD_SPU); virtual ~SPUThread(); @@ -560,6 +570,8 @@ public: public: virtual void InitRegs(); virtual void Task(); + void FastCall(u32 ls_addr); + void FastStop(); protected: virtual void DoReset(); @@ -571,3 +583,49 @@ protected: }; SPUThread& GetCurrentSPUThread(); + +class spu_thread : cpu_thread +{ + static const u32 stack_align = 0x10; + vm::ptr argv; + u32 argc; + vm::ptr envp; + +public: + spu_thread(u32 entry, const std::string& name = "", u32 stack_size = 0, u32 prio = 0); + + cpu_thread& args(std::initializer_list values) override + { + if (!values.size()) + return *this; + + assert(argc == 0); + + envp.set(Memory.MainMem.AllocAlign((u32)sizeof(envp), stack_align)); + *envp = 0; + argv.set(Memory.MainMem.AllocAlign(u32(sizeof(argv)* values.size()), stack_align)); + + for (auto &arg : values) + { + u32 arg_size = align(u32(arg.size() + 1), stack_align); + u32 arg_addr = Memory.MainMem.AllocAlign(arg_size, stack_align); + + std::strcpy(vm::get_ptr(arg_addr), arg.c_str()); + + argv[argc++] = arg_addr; + } + + return *this; + } + + cpu_thread& run() override + { + thread->Run(); + + static_cast(thread)->GPR[3].from64(argc); + static_cast(thread)->GPR[4].from64(argv.addr()); + static_cast(thread)->GPR[5].from64(envp.addr()); + + return *this; + } +}; \ No newline at end of file diff --git a/rpcs3/Emu/FS/VFS.cpp b/rpcs3/Emu/FS/VFS.cpp index 7007955899..82e188ada3 100644 --- a/rpcs3/Emu/FS/VFS.cpp +++ b/rpcs3/Emu/FS/VFS.cpp @@ -4,33 +4,94 @@ #include "Emu/HDD/HDD.h" #include "vfsDeviceLocalFile.h" #include "Ini.h" +#include "Emu/System.h" -#undef CreateFile // TODO: what's wrong with it? +#undef CreateFile int sort_devices(const void* _a, const void* _b) { const vfsDevice& a = **(const vfsDevice**)_a; const vfsDevice& b = **(const vfsDevice**)_b; - if(a.GetPs3Path().length() > b.GetPs3Path().length()) return 1; - if(a.GetPs3Path().length() < b.GetPs3Path().length()) return -1; + if (a.GetPs3Path().length() > b.GetPs3Path().length()) return 1; + if (a.GetPs3Path().length() < b.GetPs3Path().length()) return -1; return 0; } +std::vector simplify_path_blocks(const std::string& path) +{ + std::string lower_path = path; + std::transform(lower_path.begin(), lower_path.end(), lower_path.begin(), ::tolower); + + std::vector path_blocks = std::move(fmt::split(lower_path, { "/", "\\" })); + + for (size_t i = 0; i < path_blocks.size(); ++i) + { + if (path_blocks[i] == ".") + { + path_blocks.erase(path_blocks.begin() + i--); + } + else if (i && path_blocks[i] == "..") + { + path_blocks.erase(path_blocks.begin() + (i - 1), path_blocks.begin() + (i + 1)); + i--; + } + } + + return path_blocks; +} + +std::string simplify_path(const std::string& path, bool is_dir) +{ + std::vector path_blocks = simplify_path_blocks(path); + + std::string result; + + if (path_blocks.empty()) + return result; + + if (is_dir) + { + for (auto &dir : path_blocks) + { + result += dir + "/"; + } + } + else + { + for (size_t i = 0; i < path_blocks.size() - 1; ++i) + { + result += path_blocks[i] + "/"; + } + + result += path_blocks[path_blocks.size() - 1]; + } + + return result; +} + VFS::~VFS() { UnMountAll(); } +std::string VFS::FindEntry(const std::string &path) +{ + return path; + return cwd + "/" + path; +} + void VFS::Mount(const std::string& ps3_path, const std::string& local_path, vfsDevice* device) { - UnMount(ps3_path); + std::string simpl_ps3_path = simplify_path(ps3_path, true); - device->SetPath(ps3_path, local_path); + UnMount(simpl_ps3_path); + + device->SetPath(simpl_ps3_path, simplify_path(local_path, true)); m_devices.push_back(device); - if(m_devices.size() > 1) + if (m_devices.size() > 1) { //std::qsort(m_devices.GetPtr(), m_devices.GetCount(), sizeof(vfsDevice*), sort_devices); } @@ -38,11 +99,14 @@ void VFS::Mount(const std::string& ps3_path, const std::string& local_path, vfsD void VFS::UnMount(const std::string& ps3_path) { - for(u32 i=0; iGetPs3Path().compare(ps3_path)) + if (!strcmp(m_devices[i]->GetPs3Path().c_str(), simpl_ps3_path.c_str())) { delete m_devices[i]; + m_devices.erase(m_devices.begin() +i); return; @@ -63,9 +127,9 @@ void VFS::UnMountAll() vfsFileBase* VFS::OpenFile(const std::string& ps3_path, vfsOpenMode mode) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { - if(vfsFileBase* res = dev->GetNewFileStream()) + if (vfsFileBase* res = dev->GetNewFileStream()) { res->Open(path, mode); return res; @@ -79,9 +143,9 @@ vfsDirBase* VFS::OpenDir(const std::string& ps3_path) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { - if(vfsDirBase* res = dev->GetNewDirStream()) + if (vfsDirBase* res = dev->GetNewDirStream()) { res->Open(path); return res; @@ -94,11 +158,11 @@ vfsDirBase* VFS::OpenDir(const std::string& ps3_path) const bool VFS::CreateFile(const std::string& ps3_path) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { std::shared_ptr res(dev->GetNewFileStream()); - if(res) + if (res) { return res->Create(path); } @@ -110,11 +174,11 @@ bool VFS::CreateFile(const std::string& ps3_path) const bool VFS::CreateDir(const std::string& ps3_path) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { std::shared_ptr res(dev->GetNewDirStream()); - if(res) + if (res) { return res->Create(path); } @@ -126,11 +190,11 @@ bool VFS::CreateDir(const std::string& ps3_path) const bool VFS::RemoveFile(const std::string& ps3_path) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { std::shared_ptr res(dev->GetNewFileStream()); - if(res) + if (res) { return res->Remove(path); } @@ -142,11 +206,11 @@ bool VFS::RemoveFile(const std::string& ps3_path) const bool VFS::RemoveDir(const std::string& ps3_path) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { std::shared_ptr res(dev->GetNewDirStream()); - if(res) + if (res) { return res->Remove(path); } @@ -158,11 +222,11 @@ bool VFS::RemoveDir(const std::string& ps3_path) const bool VFS::ExistsFile(const std::string& ps3_path) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { std::shared_ptr res(dev->GetNewFileStream()); - if(res) + if (res) { return res->Exists(path); } @@ -174,11 +238,11 @@ bool VFS::ExistsFile(const std::string& ps3_path) const bool VFS::ExistsDir(const std::string& ps3_path) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path, path)) + if (vfsDevice* dev = GetDevice(ps3_path, path)) { std::shared_ptr res(dev->GetNewDirStream()); - if(res) + if (res) { return res->IsExists(path); } @@ -190,11 +254,11 @@ bool VFS::ExistsDir(const std::string& ps3_path) const bool VFS::RenameFile(const std::string& ps3_path_from, const std::string& ps3_path_to) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path_from, path)) + if (vfsDevice* dev = GetDevice(ps3_path_from, path)) { std::shared_ptr res(dev->GetNewFileStream()); - if(res) + if (res) { return res->Rename(path, ps3_path_to); } @@ -206,11 +270,11 @@ bool VFS::RenameFile(const std::string& ps3_path_from, const std::string& ps3_pa bool VFS::RenameDir(const std::string& ps3_path_from, const std::string& ps3_path_to) const { std::string path; - if(vfsDevice* dev = GetDevice(ps3_path_from, path)) + if (vfsDevice* dev = GetDevice(ps3_path_from, path)) { std::shared_ptr res(dev->GetNewDirStream()); - if(res) + if (res) { return res->Rename(path, ps3_path_to); } @@ -221,53 +285,107 @@ bool VFS::RenameDir(const std::string& ps3_path_from, const std::string& ps3_pat vfsDevice* VFS::GetDevice(const std::string& ps3_path, std::string& path) const { - u32 max_eq; - s32 max_i=-1; - - for(u32 i=0; i& ps3_path_blocks) -> vfsDevice* { - const u32 eq = m_devices[i]->CmpPs3Path(ps3_path); + size_t max_eq = 0; + int max_i = -1; - if(max_i < 0 || eq > max_eq) + for (u32 i = 0; i < m_devices.size(); ++i) { - max_eq = eq; - max_i = i; - } - } + std::vector dev_ps3_path_blocks = simplify_path_blocks(m_devices[i]->GetPs3Path()); - if(max_i < 0) return nullptr; - path = vfsDevice::GetWinPath(m_devices[max_i]->GetLocalPath(), ps3_path.substr(max_eq, ps3_path.length() - max_eq)); - return m_devices[max_i]; + if (ps3_path_blocks.size() < dev_ps3_path_blocks.size()) + continue; + + size_t eq = 0; + for (; eq < dev_ps3_path_blocks.size(); ++eq) + { + if (strcmp(ps3_path_blocks[eq].c_str(), dev_ps3_path_blocks[eq].c_str())) + { + break; + } + } + + if (eq > max_eq) + { + max_eq = eq; + max_i = i; + } + } + + if (max_i < 0) + return nullptr; + + path = m_devices[max_i]->GetLocalPath(); + + for (u32 i = max_eq; i < ps3_path_blocks.size(); i++) + { + path += "/" + ps3_path_blocks[i]; + } + + path = simplify_path(path, false); + + return m_devices[max_i]; + }; + + if (auto res = try_get_device(simplify_path_blocks(ps3_path))) + return res; + + if (auto res = try_get_device(simplify_path_blocks(cwd + ps3_path))) + return res; + + return nullptr; } vfsDevice* VFS::GetDeviceLocal(const std::string& local_path, std::string& path) const { - u32 max_eq; - s32 max_i=-1; + size_t max_eq = 0; + int max_i = -1; - rFileName file_path(local_path); - file_path.Normalize(); - std::string mormalized_path = file_path.GetFullPath(); + std::vector local_path_blocks = simplify_path_blocks(local_path); - for(u32 i=0; iCmpLocalPath(mormalized_path); + std::vector dev_local_path_blocks_blocks = simplify_path_blocks(m_devices[i]->GetLocalPath()); - if(max_i < 0 || eq > max_eq) + if (local_path_blocks.size() < dev_local_path_blocks_blocks.size()) + continue; + + size_t eq = 0; + for (; eq < dev_local_path_blocks_blocks.size(); ++eq) + { + if (strcmp(local_path_blocks[eq].c_str(), dev_local_path_blocks_blocks[eq].c_str())) + { + break; + } + } + + if (eq > max_eq) { max_eq = eq; max_i = i; } } - if(max_i < 0) return nullptr; + if (max_i < 0) + return nullptr; + + path = m_devices[max_i]->GetPs3Path(); + + for (u32 i = max_eq; i < local_path_blocks.size(); i++) + { + path += "/" + local_path_blocks[i]; + } + + path = simplify_path(path, false); - path = vfsDevice::GetPs3Path(m_devices[max_i]->GetPs3Path(), local_path.substr(max_eq, local_path.length() - max_eq)); return m_devices[max_i]; } void VFS::Init(const std::string& path) { + cwd = simplify_path(path, true); + UnMountAll(); std::vector entries; @@ -293,8 +411,8 @@ void VFS::Init(const std::string& path) std::string mpath = entry.path; // TODO: This shouldn't use current dir - fmt::Replace(mpath,"$(EmulatorDir)", "."); - fmt::Replace(mpath,"$(GameDir)", vfsDevice::GetRoot(path)); + fmt::Replace(mpath, "$(EmulatorDir)", Emu.GetEmulatorPath()); + fmt::Replace(mpath, "$(GameDir)", cwd); Mount(entry.mount, mpath, dev); } } @@ -305,11 +423,11 @@ void VFS::SaveLoadDevices(std::vector& res, bool is_load) entries_count.Init("count", "VFSManager"); int count = 0; - if(is_load) + if (is_load) { count = entries_count.LoadValue(count); - if(!count) + if (!count) { res.emplace_back(vfsDevice_LocalFile, "$(EmulatorDir)/dev_hdd0/", "/dev_hdd0/"); res.emplace_back(vfsDevice_LocalFile, "$(EmulatorDir)/dev_hdd1/", "/dev_hdd1/"); @@ -319,7 +437,6 @@ void VFS::SaveLoadDevices(std::vector& res, bool is_load) res.emplace_back(vfsDevice_LocalFile, "$(GameDir)", "/app_home/"); res.emplace_back(vfsDevice_LocalFile, "$(GameDir)/../", "/dev_bdvd/"); res.emplace_back(vfsDevice_LocalFile, "", "/host_root/"); - res.emplace_back(vfsDevice_LocalFile, "$(GameDir)", "/"); return; } @@ -344,7 +461,7 @@ void VFS::SaveLoadDevices(std::vector& res, bool is_load) entry_mount.Init(fmt::Format("mount[%d]", i), "VFSManager"); entry_device.Init(fmt::Format("device[%d]", i), "VFSManager"); - if(is_load) + if (is_load) { res[i] = VFSManagerEntry(); res[i].path = entry_path.LoadValue(""); diff --git a/rpcs3/Emu/FS/VFS.h b/rpcs3/Emu/FS/VFS.h index 8876072b3f..acaccf17ec 100644 --- a/rpcs3/Emu/FS/VFS.h +++ b/rpcs3/Emu/FS/VFS.h @@ -42,10 +42,17 @@ struct VFSManagerEntry } }; +std::vector simplify_path_blocks(const std::string& path); +std::string simplify_path(const std::string& path, bool is_dir); + struct VFS { ~VFS(); + std::string cwd; + + std::string FindEntry(const std::string &path); + //TODO: find out where these are supposed to be deleted or just make it shared_ptr //and also make GetDevice and GetDeviceLocal return shared_ptr then. // A vfsDevice will be deleted when they're unmounted or the VFS struct is destroyed. diff --git a/rpcs3/Emu/FS/vfsDir.cpp b/rpcs3/Emu/FS/vfsDir.cpp index 94ed07096a..7d483d8b3d 100644 --- a/rpcs3/Emu/FS/vfsDir.cpp +++ b/rpcs3/Emu/FS/vfsDir.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "Emu/System.h" +#include "vfsDevice.h" #include "VFS.h" #include "vfsDir.h" @@ -10,7 +11,7 @@ vfsDir::vfsDir() { // TODO: proper implementation // m_stream is nullptr here. So open root until a proper dir is given - Open("/"); + //Open("/"); } vfsDir::vfsDir(const std::string& path) @@ -26,37 +27,78 @@ bool vfsDir::Open(const std::string& path) m_stream.reset(Emu.GetVFS().OpenDir(path)); - return m_stream && m_stream->IsOpened(); + DirEntryInfo info; + + m_cwd = simplify_path(0 && m_stream && m_stream->IsOpened() ? m_stream->GetPath() : path, true); + + auto blocks = simplify_path_blocks(GetPath()); + + for (auto dev : Emu.GetVFS().m_devices) + { + auto dev_blocks = simplify_path_blocks(dev->GetPs3Path()); + + if (dev_blocks.size() < (blocks.size() + 1)) + { + continue; + } + + bool is_ok = true; + + for (size_t i = 0; i < blocks.size(); ++i) + { + if (strcmp(dev_blocks[i].c_str(), blocks[i].c_str())) + { + is_ok = false; + break; + } + } + + if (is_ok) + { + info.name = dev_blocks[blocks.size()]; + m_entries.push_back(info); + } + } + + if (m_stream && m_stream->IsOpened()) + { + m_entries.insert(m_entries.begin(), m_stream->GetEntries().begin(), m_stream->GetEntries().end()); + } + + return !m_entries.empty(); } bool vfsDir::Create(const std::string& path) { - return m_stream->Create(path); + return Emu.GetVFS().CreateDir(path); } bool vfsDir::IsExists(const std::string& path) const { - return m_stream->IsExists(path); -} + auto path_blocks = simplify_path_blocks(path); -const std::vector& vfsDir::GetEntries() const -{ - return m_stream->GetEntries(); + if (path_blocks.empty()) + return false; + + std::string dir_name = path_blocks[path_blocks.size() - 1]; + + for (const auto entry : vfsDir(path + "/..")) + { + if (!strcmp(entry->name.c_str(), dir_name.c_str())) + return true; + } + + return false; } bool vfsDir::Rename(const std::string& from, const std::string& to) { - return m_stream->Rename(from, to); + return Emu.GetVFS().RenameDir(from, to); } bool vfsDir::Remove(const std::string& path) { - return m_stream->Remove(path); -} - -const DirEntryInfo* vfsDir::Read() -{ - return m_stream->Read(); + return Emu.GetVFS().RemoveDir(path); } void vfsDir::Close() @@ -64,12 +106,7 @@ void vfsDir::Close() m_stream.reset(); } -std::string vfsDir::GetPath() const -{ - return m_stream->GetPath(); -} - bool vfsDir::IsOpened() const { - return m_stream && m_stream->IsOpened(); + return !m_entries.empty(); } diff --git a/rpcs3/Emu/FS/vfsDir.h b/rpcs3/Emu/FS/vfsDir.h index 09c8ee197d..5dd2b8897e 100644 --- a/rpcs3/Emu/FS/vfsDir.h +++ b/rpcs3/Emu/FS/vfsDir.h @@ -13,13 +13,11 @@ public: virtual bool Open(const std::string& path) override; virtual bool IsOpened() const override; virtual bool IsExists(const std::string& path) const override; - virtual const std::vector& GetEntries() const override; virtual void Close() override; - virtual std::string GetPath() const override; + //virtual std::string GetPath() const override; virtual bool Create(const std::string& path) override; //virtual bool Create(const DirEntryInfo& info) override; virtual bool Rename(const std::string& from, const std::string& to) override; virtual bool Remove(const std::string& path) override; - virtual const DirEntryInfo* Read() override; }; diff --git a/rpcs3/Emu/FS/vfsDirBase.cpp b/rpcs3/Emu/FS/vfsDirBase.cpp index e5bda0eded..2d54b48e42 100644 --- a/rpcs3/Emu/FS/vfsDirBase.cpp +++ b/rpcs3/Emu/FS/vfsDirBase.cpp @@ -32,7 +32,7 @@ bool vfsDirBase::IsOpened() const bool vfsDirBase::IsExists(const std::string& path) const { - return rExists(path); + return false; } const std::vector& vfsDirBase::GetEntries() const @@ -58,3 +58,9 @@ const DirEntryInfo* vfsDirBase::Read() return &m_entries[m_pos++]; } + +const DirEntryInfo* vfsDirBase::First() +{ + m_pos = 0; + return Read(); +} \ No newline at end of file diff --git a/rpcs3/Emu/FS/vfsDirBase.h b/rpcs3/Emu/FS/vfsDirBase.h index 7251862976..0d05dcbaf5 100644 --- a/rpcs3/Emu/FS/vfsDirBase.h +++ b/rpcs3/Emu/FS/vfsDirBase.h @@ -53,4 +53,57 @@ public: virtual bool Rename(const std::string& from, const std::string& to) = 0; virtual bool Remove(const std::string& path) = 0; virtual const DirEntryInfo* Read(); + virtual const DirEntryInfo* First(); + + class iterator + { + vfsDirBase *parent; + const DirEntryInfo* data; + + public: + iterator(vfsDirBase* parent) + : parent(parent) + , data(parent->First()) + { + } + + iterator(const DirEntryInfo* data) + : parent(parent) + , data(data) + { + } + + iterator& operator++() + { + data = parent->Read(); + return *this; + } + + iterator operator++(int) + { + const DirEntryInfo* olddata = data; + data = parent->Read(); + return iterator(olddata); + } + + const DirEntryInfo* operator *() + { + return data; + } + + bool operator!=(iterator other) const + { + return data != other.data; + } + }; + + iterator begin() + { + return iterator(this); + } + + iterator end() + { + return iterator((const DirEntryInfo*)nullptr); + } }; diff --git a/rpcs3/Emu/FS/vfsLocalDir.cpp b/rpcs3/Emu/FS/vfsLocalDir.cpp index 0c44144ab9..d6eb9e0e66 100644 --- a/rpcs3/Emu/FS/vfsLocalDir.cpp +++ b/rpcs3/Emu/FS/vfsLocalDir.cpp @@ -21,7 +21,7 @@ bool vfsLocalDir::Open(const std::string& path) std::string name; for(bool is_ok = dir.GetFirst(&name); is_ok; is_ok = dir.GetNext(&name)) { - std::string dir_path = path + name; + std::string dir_path = path + "/" + name; m_entries.emplace_back(); // TODO: Use same info structure as fileinfo? @@ -46,6 +46,11 @@ bool vfsLocalDir::Create(const std::string& path) return rMkpath(path); } +bool vfsLocalDir::IsExists(const std::string& path) const +{ + return rIsDir(path); +} + bool vfsLocalDir::Rename(const std::string& from, const std::string& to) { return false; diff --git a/rpcs3/Emu/FS/vfsLocalDir.h b/rpcs3/Emu/FS/vfsLocalDir.h index f4b41509d2..c2174f3658 100644 --- a/rpcs3/Emu/FS/vfsLocalDir.h +++ b/rpcs3/Emu/FS/vfsLocalDir.h @@ -18,4 +18,5 @@ public: virtual bool Rename(const std::string& from, const std::string& to) override; virtual bool Remove(const std::string& path) override; virtual bool IsOpened() const override; + virtual bool IsExists(const std::string& path) const; }; \ No newline at end of file diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index b81c8678cd..a5ba1b1447 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -59,12 +59,13 @@ public: } }; -struct ID +class ID { std::string m_name; IDData* m_data; IDType m_type; +public: template ID(const std::string& name, T* data, const IDType type) : m_name(name) @@ -96,6 +97,21 @@ struct ID { delete m_data; } + + const std::string& GetName() const + { + return m_name; + } + + IDData* GetData() const + { + return m_data; + } + + IDType GetType() const + { + return m_type; + } }; class IdManager @@ -172,7 +188,7 @@ public: return false; } - result = f->second.m_data->get(); + result = f->second.GetData()->get(); return true; } @@ -198,8 +214,8 @@ public: if (item == m_id_map.end()) { return false; } - if (item->second.m_type < TYPE_OTHER) { - m_types[item->second.m_type].erase(id); + if (item->second.GetType() < TYPE_OTHER) { + m_types[item->second.GetType()].erase(id); } item->second.Kill(); diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp index 50784d199a..ddb837d725 100644 --- a/rpcs3/Emu/Memory/Memory.cpp +++ b/rpcs3/Emu/Memory/Memory.cpp @@ -108,9 +108,9 @@ void MemoryBase::Init(MemoryType type) memset(RawSPUMem, 0, sizeof(RawSPUMem)); #ifdef _WIN32 - if (!m_base_addr) + if (!vm::g_base_addr) #else - if ((s64)m_base_addr == (s64)-1) + if ((s64)vm::g_base_addr == (s64)-1) #endif { LOG_ERROR(MEMORY, "Initializing memory failed"); @@ -119,7 +119,7 @@ void MemoryBase::Init(MemoryType type) } else { - LOG_NOTICE(MEMORY, "Initializing memory: m_base_addr = 0x%llx", (u64)m_base_addr); + LOG_NOTICE(MEMORY, "Initializing memory: base_addr = 0x%llx", (u64)vm::g_base_addr); } switch (type) @@ -128,6 +128,7 @@ void MemoryBase::Init(MemoryType type) MemoryBlocks.push_back(MainMem.SetRange(0x00010000, 0x2FFF0000)); MemoryBlocks.push_back(UserMemory = PRXMem.SetRange(0x30000000, 0x10000000)); MemoryBlocks.push_back(RSXCMDMem.SetRange(0x40000000, 0x10000000)); + MemoryBlocks.push_back(SPRXMem.SetRange(0x50000000, 0x10000000)); MemoryBlocks.push_back(MmaperMem.SetRange(0xB0000000, 0x10000000)); MemoryBlocks.push_back(RSXFBMem.SetRange(0xC0000000, 0x10000000)); MemoryBlocks.push_back(StackMem.SetRange(0xD0000000, 0x10000000)); @@ -205,7 +206,7 @@ bool MemoryBase::Map(const u64 addr, const u32 size) { LV2_LOCK(0); - if ((u32)addr != addr || (u64)addr + (u64)size > 0x100000000ull) + if ((addr | (addr + size)) & ~0xFFFFFFFFull) { return false; } @@ -218,7 +219,8 @@ bool MemoryBase::Map(const u64 addr, const u32 size) } MemoryBlocks.push_back((new MemoryBlock())->SetRange(addr, size)); - LOG_WARNING(MEMORY, "MemoryBase::Map(0x%llx, 0x%x)", addr, size); + + LOG_WARNING(MEMORY, "Memory mapped at 0x%llx: size=0x%x", addr, size); return true; } @@ -442,6 +444,12 @@ void DynamicMemoryBlockBase::AppendMem(u64 addr, u32 size) /* private */ u64 DynamicMemoryBlockBase::AllocAlign(u32 size, u32 align) { + if (!MemoryBlock::GetStartAddr()) + { + LOG_ERROR(MEMORY, "DynamicMemoryBlockBase::AllocAlign(size=0x%x, align=0x%x): memory block not initialized", size, align); + return 0; + } + size = PAGE_4K(size); u32 exsize; @@ -568,9 +576,9 @@ bool VirtualMemoryBlock::IsInMyRange(const u64 addr, const u32 size) bool VirtualMemoryBlock::IsMyAddress(const u64 addr) { - for(u32 i=0; i= m_mapped_memory[i].addr && addr < m_mapped_memory[i].addr + m_mapped_memory[i].size) + if (addr >= m_mapped_memory[i].addr && addr < m_mapped_memory[i].addr + m_mapped_memory[i].size) { return true; } @@ -579,73 +587,71 @@ bool VirtualMemoryBlock::IsMyAddress(const u64 addr) return false; } -u64 VirtualMemoryBlock::Map(u64 realaddr, u32 size, u64 addr) +u64 VirtualMemoryBlock::Map(u64 realaddr, u32 size) { - if(addr) + for (u64 addr = GetStartAddr(); addr <= GetEndAddr() - GetReservedAmount() - size;) { - if(!IsInMyRange(addr, size) && (IsMyAddress(addr) || IsMyAddress(addr + size - 1))) - return 0; + bool is_good_addr = true; + + // check if address is already mapped + for (u32 i = 0; i= m_mapped_memory[i].addr && addr < m_mapped_memory[i].addr + m_mapped_memory[i].size) || + (m_mapped_memory[i].addr >= addr && m_mapped_memory[i].addr < addr + size)) + { + is_good_addr = false; + addr = m_mapped_memory[i].addr + m_mapped_memory[i].size; + break; + } + } + + if (!is_good_addr) continue; m_mapped_memory.emplace_back(addr, realaddr, size); + return addr; } - else - { - for(u64 addr = GetStartAddr(); addr <= GetEndAddr() - GetReservedAmount() - size;) - { - bool is_good_addr = true; - - // check if address is already mapped - for(u32 i=0; i= m_mapped_memory[i].addr && addr < m_mapped_memory[i].addr + m_mapped_memory[i].size) || - (m_mapped_memory[i].addr >= addr && m_mapped_memory[i].addr < addr + size)) - { - is_good_addr = false; - addr = m_mapped_memory[i].addr + m_mapped_memory[i].size; - break; - } - } - - if(!is_good_addr) continue; - - m_mapped_memory.emplace_back(addr, realaddr, size); - - return addr; - } - - return 0; - } -} - -u32 VirtualMemoryBlock::UnmapRealAddress(u64 realaddr) -{ - for(u32 i=0; i= m_mapped_memory[i].addr && addr < m_mapped_memory[i].addr + m_mapped_memory[i].size) + if (addr >= m_mapped_memory[i].addr && addr < m_mapped_memory[i].addr + m_mapped_memory[i].size) { result = m_mapped_memory[i].realAddress + (addr - m_mapped_memory[i].addr); return true; @@ -682,9 +688,9 @@ bool VirtualMemoryBlock::getRealAddr(u64 addr, u64& result) u64 VirtualMemoryBlock::getMappedAddress(u64 realAddress) { - for(u32 i=0; i= m_mapped_memory[i].realAddress && realAddress < m_mapped_memory[i].realAddress + m_mapped_memory[i].size) + if (realAddress >= m_mapped_memory[i].realAddress && realAddress < m_mapped_memory[i].realAddress + m_mapped_memory[i].size) { return m_mapped_memory[i].addr + (realAddress - m_mapped_memory[i].realAddress); } @@ -702,7 +708,7 @@ void VirtualMemoryBlock::Delete() bool VirtualMemoryBlock::Reserve(u32 size) { - if(size + GetReservedAmount() > GetEndAddr() - GetStartAddr()) + if (size + GetReservedAmount() > GetEndAddr() - GetStartAddr()) return false; m_reserve_size += size; @@ -711,7 +717,7 @@ bool VirtualMemoryBlock::Reserve(u32 size) bool VirtualMemoryBlock::Unreserve(u32 size) { - if(size > GetReservedAmount()) + if (size > GetReservedAmount()) return false; m_reserve_size -= size; @@ -721,4 +727,4 @@ bool VirtualMemoryBlock::Unreserve(u32 size) u32 VirtualMemoryBlock::GetReservedAmount() { return m_reserve_size; -} +} \ No newline at end of file diff --git a/rpcs3/Emu/Memory/Memory.h b/rpcs3/Emu/Memory/Memory.h index 394c48f399..1fccab32b8 100644 --- a/rpcs3/Emu/Memory/Memory.h +++ b/rpcs3/Emu/Memory/Memory.h @@ -7,8 +7,6 @@ using std::nullptr_t; #define safe_delete(x) do {delete (x);(x)=nullptr;} while(0) #define safe_free(x) do {free(x);(x)=nullptr;} while(0) -extern void* const m_base_addr; - enum MemoryType { Memory_PS3, @@ -24,6 +22,11 @@ enum : u32 RAW_SPU_PROB_OFFSET = 0x00040000, }; +namespace vm +{ + extern void* const g_base_addr; +} + class MemoryBase { std::vector MemoryBlocks; @@ -33,6 +36,7 @@ public: MemoryBlock* UserMemory; DynamicMemoryBlock MainMem; + DynamicMemoryBlock SPRXMem; DynamicMemoryBlock PRXMem; DynamicMemoryBlock RSXCMDMem; DynamicMemoryBlock MmaperMem; @@ -70,7 +74,7 @@ public: static void* const GetBaseAddr() { - return m_base_addr; + return vm::g_base_addr; } __noinline void InvalidAddress(const char* func, const u64 addr); diff --git a/rpcs3/Emu/Memory/MemoryBlock.h b/rpcs3/Emu/Memory/MemoryBlock.h index 6d4c43088f..1dcf833553 100644 --- a/rpcs3/Emu/Memory/MemoryBlock.h +++ b/rpcs3/Emu/Memory/MemoryBlock.h @@ -163,13 +163,14 @@ public: // maps real address to virtual address space, returns the mapped address or 0 on failure (if no address is specified the // first mappable space is used) - virtual u64 Map(u64 realaddr, u32 size, u64 addr = 0); + virtual bool Map(u64 realaddr, u32 size, u64 addr); + virtual u64 Map(u64 realaddr, u32 size); // Unmap real address (please specify only starting point, no midway memory will be unmapped), returns the size of the unmapped area - virtual u32 UnmapRealAddress(u64 realaddr); + virtual bool UnmapRealAddress(u64 realaddr, u32& size); // Unmap address (please specify only starting point, no midway memory will be unmapped), returns the size of the unmapped area - virtual u32 UnmapAddress(u64 addr); + virtual bool UnmapAddress(u64 addr, u32& size); // Reserve a certain amount so no one can use it, returns true on succces, false on failure virtual bool Reserve(u32 size); diff --git a/rpcs3/Emu/Memory/atomic_type.h b/rpcs3/Emu/Memory/atomic_type.h new file mode 100644 index 0000000000..7309f9cd2b --- /dev/null +++ b/rpcs3/Emu/Memory/atomic_type.h @@ -0,0 +1,211 @@ +#pragma once + +template +struct _to_atomic +{ + static_assert(size == 1 || size == 2 || size == 4 || size == 8, "Invalid atomic type"); + + typedef T type; +}; + +template +struct _to_atomic +{ + typedef uint8_t type; +}; + +template +struct _to_atomic +{ + typedef uint16_t type; +}; + +template +struct _to_atomic +{ + typedef uint32_t type; +}; + +template +struct _to_atomic +{ + typedef uint64_t type; +}; + +template +class _atomic_base +{ + typedef typename _to_atomic::type atomic_type; + atomic_type data; + +public: + // atomically compare data with cmp, replace with exch if equal, return previous data value anyway + __forceinline const T compare_and_swap(const T& cmp, const T& exch) volatile + { + const atomic_type res = InterlockedCompareExchange(&data, (atomic_type&)(exch), (atomic_type&)(cmp)); + return (T&)res; + } + + // atomically compare data with cmp, replace with exch if equal, return true if data was replaced + __forceinline bool compare_and_swap_test(const T& cmp, const T& exch) volatile + { + return InterlockedCompareExchangeTest(&data, (atomic_type&)(exch), (atomic_type&)(cmp)); + } + + // read data with memory barrier + __forceinline const T read_sync() const volatile + { + const atomic_type res = InterlockedCompareExchange(const_cast(&data), 0, 0); + return (T&)res; + } + + // atomically replace data with exch, return previous data value + __forceinline const T exchange(const T& exch) volatile + { + const atomic_type res = InterlockedExchange(&data, (atomic_type&)(exch)); + return (T&)res; + } + + // read data without memory barrier + __forceinline const T read_relaxed() const volatile + { + return (T&)data; + } + + // write data without memory barrier + __forceinline void write_relaxed(const T& value) volatile + { + data = (atomic_type&)(value); + } + + // perform atomic operation on data + template __forceinline void atomic_op(const FT atomic_proc) volatile + { + while (true) + { + const T old = read_relaxed(); + T _new = old; + atomic_proc(_new); // function should accept reference to T type + if (compare_and_swap_test(old, _new)) return; + } + } + + // perform atomic operation on data with special exit condition (if intermediate result != proceed_value) + template __forceinline RT atomic_op(const RT proceed_value, const FT atomic_proc) volatile + { + while (true) + { + const T old = read_relaxed(); + T _new = old; + RT res = (RT)atomic_proc(_new); // function should accept reference to T type and return some value + if (res != proceed_value) return res; + if (compare_and_swap_test(old, _new)) return proceed_value; + } + } + + // perform atomic operation on data with additional memory barrier + template __forceinline void atomic_op_sync(const FT atomic_proc) volatile + { + T old = read_sync(); + while (true) + { + T _new = old; + atomic_proc(_new); // function should accept reference to T type + const T val = compare_and_swap(old, _new); + if ((atomic_type&)val == (atomic_type&)old) return; + old = val; + } + } + + // perform atomic operation on data with additional memory barrier and special exit condition (if intermediate result != proceed_value) + template __forceinline RT atomic_op_sync(const RT proceed_value, const FT atomic_proc) volatile + { + T old = read_sync(); + while (true) + { + T _new = old; + RT res = (RT)atomic_proc(_new); // function should accept reference to T type and return some value + if (res != proceed_value) return res; + const T val = compare_and_swap(old, _new); + if ((atomic_type&)val == (atomic_type&)old) return proceed_value; + old = val; + } + } + + // perform non-atomic operation on data directly without memory barriers + template __forceinline void direct_op(const FT direct_proc) volatile + { + direct_proc((T&)data); + } + + // atomic bitwise OR, returns previous data + __forceinline const T _or(const T& right) volatile + { + const atomic_type res = InterlockedOr(&data, (atomic_type&)(right)); + return (T&)res; + } + + // atomic bitwise AND, returns previous data + __forceinline const T _and(const T& right) volatile + { + const atomic_type res = InterlockedAnd(&data, (atomic_type&)(right)); + return (T&)res; + } + + // atomic bitwise AND NOT (inverts right argument), returns previous data + __forceinline const T _and_not(const T& right) volatile + { + const atomic_type res = InterlockedAnd(&data, ~(atomic_type&)(right)); + return (T&)res; + } + + // atomic bitwise XOR, returns previous data + __forceinline const T _xor(const T& right) volatile + { + const atomic_type res = InterlockedXor(&data, (atomic_type&)(right)); + return (T&)res; + } + + __forceinline const T operator |= (const T& right) volatile + { + const atomic_type res = InterlockedOr(&data, (atomic_type&)(right)) | (atomic_type&)(right); + return (T&)res; + } + + __forceinline const T operator &= (const T& right) volatile + { + const atomic_type res = InterlockedAnd(&data, (atomic_type&)(right)) & (atomic_type&)(right); + return (T&)res; + } + + __forceinline const T operator ^= (const T& right) volatile + { + const atomic_type res = InterlockedXor(&data, (atomic_type&)(right)) ^ (atomic_type&)(right); + return (T&)res; + } + +}; + +template struct atomic_le_t : public _atomic_base +{ +}; + +template struct atomic_be_t : public _atomic_base::type> +{ +}; + +namespace ps3 +{ + template struct atomic_t : public atomic_be_t + { + }; +} + +namespace psv +{ + template struct atomic_t : public atomic_le_t + { + }; +} + +using namespace ps3; diff --git a/rpcs3/Emu/Memory/vm.cpp b/rpcs3/Emu/Memory/vm.cpp index a55b9a9259..dbac50e797 100644 --- a/rpcs3/Emu/Memory/vm.cpp +++ b/rpcs3/Emu/Memory/vm.cpp @@ -1,23 +1,22 @@ #include "stdafx.h" #include "Memory.h" -#ifdef _WIN32 -#include - -void* const m_base_addr = VirtualAlloc(nullptr, 0x100000000, MEM_RESERVE, PAGE_NOACCESS); -#else -#include - -/* OS X uses MAP_ANON instead of MAP_ANONYMOUS */ -#ifndef MAP_ANONYMOUS -#define MAP_ANONYMOUS MAP_ANON -#endif - -void* const m_base_addr = ::mmap(nullptr, 0x100000000, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); -#endif - namespace vm { + #ifdef _WIN32 + #include + void* const g_base_addr = VirtualAlloc(nullptr, 0x100000000, MEM_RESERVE, PAGE_NOACCESS); + #else + #include + + /* OS X uses MAP_ANON instead of MAP_ANONYMOUS */ + #ifndef MAP_ANONYMOUS + #define MAP_ANONYMOUS MAP_ANON + #endif + + void* const g_base_addr = mmap(nullptr, 0x100000000, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + #endif + bool check_addr(u32 addr) { // Checking address before using it is unsafe. @@ -28,20 +27,120 @@ namespace vm //TODO bool map(u32 addr, u32 size, u32 flags) { - return false; + return Memory.Map(addr, size); } bool unmap(u32 addr, u32 size, u32 flags) { - return false; + return Memory.Unmap(addr); } - u32 alloc(u32 size) + u32 alloc(u32 addr, u32 size, memory_location location) { - return 0; + return g_locations[location].fixed_allocator(addr, size); } - void unalloc(u32 addr) + u32 alloc(u32 size, memory_location location) { + return g_locations[location].allocator(size); + } + + void dealloc(u32 addr, memory_location location) + { + return g_locations[location].deallocator(addr); + } + + namespace ps3 + { + u32 main_alloc(u32 size) + { + return Memory.MainMem.AllocAlign(size, 1); + } + u32 main_fixed_alloc(u32 addr, u32 size) + { + return Memory.MainMem.AllocFixed(addr, size) ? addr : 0; + } + void main_dealloc(u32 addr) + { + Memory.MainMem.Free(addr); + } + + u32 g_stack_offset = 0; + + u32 stack_alloc(u32 size) + { + return Memory.StackMem.AllocAlign(size, 0x10); + } + u32 stack_fixed_alloc(u32 addr, u32 size) + { + return Memory.StackMem.AllocFixed(addr, size) ? addr : 0; + } + void stack_dealloc(u32 addr) + { + Memory.StackMem.Free(addr); + } + + u32 sprx_alloc(u32 size) + { + return Memory.SPRXMem.AllocAlign(size, 1); + } + u32 sprx_fixed_alloc(u32 addr, u32 size) + { + return Memory.SPRXMem.AllocFixed(Memory.SPRXMem.GetStartAddr() + addr, size) ? Memory.SPRXMem.GetStartAddr() + addr : 0; + } + void sprx_dealloc(u32 addr) + { + Memory.SPRXMem.Free(addr); + } + + u32 user_space_alloc(u32 size) + { + return Memory.PRXMem.AllocAlign(size, 1); + } + u32 user_space_fixed_alloc(u32 addr, u32 size) + { + return Memory.PRXMem.AllocFixed(addr, size) ? addr : 0; + } + void user_space_dealloc(u32 addr) + { + Memory.PRXMem.Free(addr); + } + + void init() + { + Memory.Init(Memory_PS3); + } + } + + namespace psv + { + void init() + { + Memory.Init(Memory_PSV); + } + } + + namespace psp + { + void init() + { + Memory.Init(Memory_PSP); + } + } + + location_info g_locations[memory_location_count] = + { + { 0x00010000, 0x2FFF0000, ps3::main_alloc, ps3::main_fixed_alloc, ps3::main_dealloc }, + { 0xD0000000, 0x10000000, ps3::stack_alloc, ps3::stack_fixed_alloc, ps3::stack_dealloc }, + + //remove me + { 0x00010000, 0x2FFF0000, ps3::sprx_alloc, ps3::sprx_fixed_alloc, ps3::sprx_dealloc }, + + { 0x30000000, 0x10000000, ps3::user_space_alloc, ps3::user_space_fixed_alloc, ps3::user_space_dealloc }, + }; + + void close() + { + Memory.Close(); } } \ No newline at end of file diff --git a/rpcs3/Emu/Memory/vm.h b/rpcs3/Emu/Memory/vm.h index fd3ab07d38..87d173bbb5 100644 --- a/rpcs3/Emu/Memory/vm.h +++ b/rpcs3/Emu/Memory/vm.h @@ -1,83 +1,72 @@ #pragma once +#include "Memory.h" namespace vm { + enum memory_location : uint + { + main, + stack, + + //remove me + sprx, + + user_space, + + memory_location_count + }; + + static void set_stack_size(u32 size) {} + static void initialize_stack() {} + + extern void* const g_base_addr; bool map(u32 addr, u32 size, u32 flags); bool unmap(u32 addr, u32 size = 0, u32 flags = 0); - u32 alloc(u32 size); - void unalloc(u32 addr); + u32 alloc(u32 size, memory_location location = user_space); + u32 alloc(u32 addr, u32 size, memory_location location = user_space); + void dealloc(u32 addr, memory_location location = user_space); - template + template T* const get_ptr(u32 addr) { - return (T*)((u8*)m_base_addr + addr); + return (T*)((u8*)g_base_addr + addr); } - template - T* const get_ptr(u64 addr) - { - return get_ptr((u32)addr); - } - template T& get_ref(u32 addr) { return *get_ptr(addr); } - template - T& get_ref(u64 addr) - { - return get_ref((u32)addr); - } - namespace ps3 { + void init(); + static u8 read8(u32 addr) { - return *((u8*)m_base_addr + addr); - } - - static u8 read8(u64 addr) - { - return read8((u32)addr); + return *((u8*)g_base_addr + addr); } static void write8(u32 addr, u8 value) { - *((u8*)m_base_addr + addr) = value; - } - - static void write8(u64 addr, u8 value) - { - write8((u32)addr, value); + *((u8*)g_base_addr + addr) = value; } static u16 read16(u32 addr) { - return re16(*(u16*)((u8*)m_base_addr + addr)); + return re16(*(u16*)((u8*)g_base_addr + addr)); } - static u16 read16(u64 addr) + static void write16(u32 addr, be_t value) { - return read16((u32)addr); - } - - static void write16(u32 addr, u16 value) - { - *(u16*)((u8*)m_base_addr + addr) = re16(value); - } - - static void write16(u64 addr, u16 value) - { - write16((u32)addr, value); + *(be_t*)((u8*)g_base_addr + addr) = value; } static u32 read32(u32 addr) { if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET) { - return re32(*(u32*)((u8*)m_base_addr + addr)); + return re32(*(u32*)((u8*)g_base_addr + addr)); } else { @@ -85,16 +74,11 @@ namespace vm } } - static u32 read32(u64 addr) - { - return read32((u32)addr); - } - - static void write32(u32 addr, u32 value) + static void write32(u32 addr, be_t value) { if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET) { - *(u32*)((u8*)m_base_addr + addr) = re32(value); + *(be_t*)((u8*)g_base_addr + addr) = value; } else { @@ -102,106 +86,170 @@ namespace vm } } - static void write32(u64 addr, u32 value) - { - write32((u32)addr, value); - } - static u64 read64(u32 addr) { - return re64(*(u64*)((u8*)m_base_addr + addr)); + return re64(*(u64*)((u8*)g_base_addr + addr)); } - static u64 read64(u64 addr) + static void write64(u32 addr, be_t value) { - return read64((u32)addr); + *(be_t*)((u8*)g_base_addr + addr) = value; + } + + static void write16(u32 addr, u16 value) + { + write16(addr, be_t::make(value)); + } + + static void write32(u32 addr, u32 value) + { + write32(addr, be_t::make(value)); } static void write64(u32 addr, u64 value) { - *(u64*)((u8*)m_base_addr + addr) = re64(value); - } - - static void write64(u64 addr, u64 value) - { - write64((u32)addr, value); + write64(addr, be_t::make(value)); } static u128 read128(u32 addr) { - return re128(*(u128*)((u8*)m_base_addr + addr)); - } - - static u128 read128(u64 addr) - { - return read128((u32)addr); + return re128(*(u128*)((u8*)g_base_addr + addr)); } static void write128(u32 addr, u128 value) { - *(u128*)((u8*)m_base_addr + addr) = re128(value); - } - - static void write128(u64 addr, u128 value) - { - write128((u32)addr, value); + *(u128*)((u8*)g_base_addr + addr) = re128(value); } } namespace psv { + void init(); + static u8 read8(u32 addr) { - return *((u8*)m_base_addr + addr); + return *((u8*)g_base_addr + addr); } static void write8(u32 addr, u8 value) { - *((u8*)m_base_addr + addr) = value; + *((u8*)g_base_addr + addr) = value; } static u16 read16(u32 addr) { - return *(u16*)((u8*)m_base_addr + addr); + return *(u16*)((u8*)g_base_addr + addr); } static void write16(u32 addr, u16 value) { - *(u16*)((u8*)m_base_addr + addr) = value; + *(u16*)((u8*)g_base_addr + addr) = value; } static u32 read32(u32 addr) { - return *(u32*)((u8*)m_base_addr + addr); + return *(u32*)((u8*)g_base_addr + addr); } static void write32(u32 addr, u32 value) { - *(u32*)((u8*)m_base_addr + addr) = value; + *(u32*)((u8*)g_base_addr + addr) = value; } static u64 read64(u32 addr) { - return *(u64*)((u8*)m_base_addr + addr); + return *(u64*)((u8*)g_base_addr + addr); } static void write64(u32 addr, u64 value) { - *(u64*)((u8*)m_base_addr + addr) = value; + *(u64*)((u8*)g_base_addr + addr) = value; } static u128 read128(u32 addr) { - return *(u128*)((u8*)m_base_addr + addr); + return *(u128*)((u8*)g_base_addr + addr); } static void write128(u32 addr, u128 value) { - *(u128*)((u8*)m_base_addr + addr) = value; + *(u128*)((u8*)g_base_addr + addr) = value; } } + + namespace psp + { + using namespace psv; + + void init(); + } + + void close(); } #include "vm_ref.h" #include "vm_ptr.h" -#include "vm_var.h" \ No newline at end of file +#include "vm_var.h" + +namespace vm +{ + struct location_info + { + u32 addr_offset; + u32 size; + + u32(*allocator)(u32 size); + u32(*fixed_allocator)(u32 addr, u32 size); + void(*deallocator)(u32 addr); + + u32 alloc_offset; + + template + ptr alloc(u32 count) const + { + return ptr::make(allocator(count * sizeof(T))); + } + }; + + extern location_info g_locations[memory_location_count]; + + template + location_info& get() + { + assert(location < memory_location_count); + return g_locations[location]; + } + + class stack + { + u32 m_begin; + u32 m_size; + int m_page_size; + int m_position; + u8 m_align; + + public: + void init(u32 begin, u32 size, u32 page_size = 180, u8 align = 0x10) + { + m_begin = begin; + m_size = size; + m_page_size = page_size; + m_position = 0; + m_align = align; + } + + u32 alloc_new_page() + { + assert(m_position + m_page_size < (int)m_size); + m_position += (int)m_page_size; + return m_begin + m_position; + } + + u32 dealloc_new_page() + { + assert(m_position - m_page_size > 0); + m_position -= (int)m_page_size; + return m_begin + m_position; + } + }; +} diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index 9a7e150170..9bef4bedee 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -10,7 +10,7 @@ namespace vm AT m_addr; public: - typedef T type; + typedef typename std::remove_cv::type type; _ptr_base operator++ (int) { @@ -38,41 +38,41 @@ namespace vm return *this; } - _ptr_base& operator += (int count) + _ptr_base& operator += (AT count) { m_addr += count * sizeof(AT); return *this; } - _ptr_base& operator -= (int count) + _ptr_base& operator -= (AT count) { m_addr -= count * sizeof(AT); return *this; } - _ptr_base operator + (int count) const + _ptr_base operator + (typename remove_be_t::type count) const { return make(m_addr + count * sizeof(AT)); } + _ptr_base operator + (typename to_be_t::type count) const { return make(m_addr + count * sizeof(AT)); } + _ptr_base operator - (typename remove_be_t::type count) const { return make(m_addr - count * sizeof(AT)); } + _ptr_base operator - (typename to_be_t::type count) const { return make(m_addr - count * sizeof(AT)); } + + __forceinline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } + __forceinline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } + __forceinline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } + __forceinline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } + __forceinline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } + __forceinline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } + __forceinline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } + __forceinline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } + explicit operator bool() const { return m_addr != 0; } + + __forceinline _ptr_base::value, typename to_be_t::type, AT>>& operator *() const { - return make(m_addr + count * sizeof(AT)); + return vm::get_ref<_ptr_base::value, typename to_be_t::type, AT>>>(m_addr); } - _ptr_base operator - (int count) const + __forceinline _ptr_base::value, typename to_be_t::type, AT>>& operator [](AT index) const { - return make(m_addr - count * sizeof(AT)); - } - - __forceinline _ptr_base& operator *() const - { - return vm::get_ref<_ptr_base>(m_addr); - } - - __forceinline _ptr_base& operator [](int index) const - { - return vm::get_ref<_ptr_base>(m_addr + sizeof(AT) * index); - } - - operator bool() const - { - return m_addr != 0; + return vm::get_ref<_ptr_base::value, typename to_be_t::type, AT>>>(m_addr + sizeof(AT)* index); } //typedef typename invert_be_t::type AT2; @@ -80,7 +80,7 @@ namespace vm template operator const _ptr_base() const { - typename std::remove_const::type addr; addr = m_addr; + typename std::remove_const::type addr = convert_le_be(m_addr); return (_ptr_base&)addr; } @@ -108,6 +108,8 @@ namespace vm AT m_addr; public: + typedef typename std::remove_cv::type type; + __forceinline T* const operator -> () const { return vm::get_ptr(m_addr); @@ -139,38 +141,49 @@ namespace vm return *this; } - _ptr_base& operator += (int count) + _ptr_base& operator += (AT count) { m_addr += count * sizeof(T); return *this; } - _ptr_base& operator -= (int count) + _ptr_base& operator -= (AT count) { m_addr -= count * sizeof(T); return *this; } - _ptr_base operator + (int count) const - { - return make(m_addr + count * sizeof(T)); - } - - _ptr_base operator - (int count) const - { - return make(m_addr - count * sizeof(T)); - } + _ptr_base operator + (typename remove_be_t::type count) const { return make(m_addr + count * sizeof(T)); } + _ptr_base operator + (typename to_be_t::type count) const { return make(m_addr + count * sizeof(T)); } + _ptr_base operator - (typename remove_be_t::type count) const { return make(m_addr - count * sizeof(T)); } + _ptr_base operator - (typename to_be_t::type count) const { return make(m_addr - count * sizeof(T)); } __forceinline T& operator *() const { - return get_ref(m_addr); + return vm::get_ref(m_addr); } - __forceinline T& operator [](int index) const + __forceinline T& operator [](typename remove_be_t::type index) const { - return get_ref(m_addr + sizeof(T) * index); + return vm::get_ref(m_addr + sizeof(T)* index); } - + + __forceinline T& operator [](typename to_be_t::forced_type index) const + { + return vm::get_ref(m_addr + sizeof(T)* index); + } + + __forceinline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } + __forceinline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } + __forceinline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } + __forceinline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } + __forceinline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } + __forceinline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } + __forceinline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } + __forceinline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } + explicit operator bool() const { return m_addr != 0; } + explicit operator T*() const { return get_ptr(); } + /* operator _ref_base() { @@ -188,26 +201,28 @@ namespace vm return m_addr; } - void set(const AT value) + template + void set(U&& value) { - m_addr = value; + m_addr = convert_le_be(value); } - operator bool() const + /* + operator T*() const { - return m_addr != 0; + return get_ptr(); } - + */ //typedef typename invert_be_t::type AT2; template operator const _ptr_base() const { - typename std::remove_const::type addr; addr = m_addr; + typename std::remove_const::type addr = convert_le_be(m_addr); return (_ptr_base&)addr; } - T* const get_ptr() const + T* get_ptr() const { return vm::get_ptr(m_addr); } @@ -236,29 +251,39 @@ namespace vm m_addr = value; } - void* const get_ptr() const + void* get_ptr() const { return vm::get_ptr(m_addr); } - operator bool() const + explicit operator void*() const { - return m_addr != 0; + return get_ptr(); } + __forceinline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } + __forceinline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } + __forceinline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } + __forceinline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } + __forceinline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } + __forceinline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } + __forceinline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } + __forceinline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } + explicit operator bool() const { return m_addr != 0; } + //typedef typename invert_be_t::type AT2; template operator const _ptr_base() const { - typename std::remove_const::type addr; addr = m_addr; + typename std::remove_const::type addr = convert_le_be(m_addr); return (_ptr_base&)addr; } template operator const _ptr_base() const { - typename std::remove_const::type addr; addr = m_addr; + typename std::remove_const::type addr = convert_le_be(m_addr); return (_ptr_base&)addr; } @@ -286,22 +311,32 @@ namespace vm m_addr = value; } - const void* const get_ptr() const + const void* get_ptr() const { return vm::get_ptr(m_addr); } - operator bool() const + explicit operator const void*() const { - return m_addr != 0; + return get_ptr(); } + __forceinline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } + __forceinline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } + __forceinline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } + __forceinline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } + __forceinline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } + __forceinline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } + __forceinline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } + __forceinline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } + explicit operator bool() const { return m_addr != 0; } + //typedef typename invert_be_t::type AT2; template operator const _ptr_base() const { - typename std::remove_const::type addr; addr = m_addr; + typename std::remove_const::type addr = convert_le_be(m_addr); return (_ptr_base&)addr; } @@ -335,17 +370,22 @@ namespace vm m_addr = value; } - operator bool() const - { - return m_addr != 0; - } + __forceinline bool operator <(const _ptr_base& right) const { return m_addr < right.m_addr; } + __forceinline bool operator <=(const _ptr_base& right) const { return m_addr <= right.m_addr; } + __forceinline bool operator >(const _ptr_base& right) const { return m_addr > right.m_addr; } + __forceinline bool operator >=(const _ptr_base& right) const { return m_addr >= right.m_addr; } + __forceinline bool operator ==(const _ptr_base& right) const { return m_addr == right.m_addr; } + __forceinline bool operator !=(const _ptr_base& right) const { return m_addr != right.m_addr; } + __forceinline bool operator ==(const nullptr_t& right) const { return m_addr == 0; } + __forceinline bool operator !=(const nullptr_t& right) const { return m_addr != 0; } + explicit operator bool() const { return m_addr != 0; } //typedef typename invert_be_t::type AT2; template operator const _ptr_base() const { - typename std::remove_const::type addr; addr = m_addr; + typename std::remove_const::type addr = convert_le_be(m_addr); return (_ptr_base&)addr; } @@ -356,7 +396,7 @@ namespace vm operator const std::function() const { - typename std::remove_const::type addr; addr = m_addr; + typename std::remove_const::type addr = convert_le_be(m_addr); return [addr](T... args) -> RT { return make(addr)(args...); }; } @@ -413,7 +453,7 @@ namespace vm namespace ps3 { - //default pointer for HLE functions (LE ptrerence to BE data) + //default pointer for HLE functions (LE pointer to BE data) template struct ptr : public lptrb { static ptr make(AT addr) @@ -425,7 +465,7 @@ namespace vm //using lptrb::operator const _ptr_base::type, lvl, AT>; }; - //default pointer for HLE structures (BE ptrerence to BE data) + //default pointer for HLE structures (BE pointer to BE data) template struct bptr : public bptrb { static bptr make(AT addr) @@ -440,7 +480,7 @@ namespace vm namespace psv { - //default pointer for HLE functions & structures (LE ptrerence to LE data) + //default pointer for HLE functions & structures (LE pointer to LE data) template struct ptr : public lptrl { static ptr make(AT addr) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index e761b90f65..0c65d26982 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -90,7 +90,7 @@ std::string GLFragmentDecompilerThread::AddConst() return name; } - auto data = vm::ptr>::make(m_addr + m_size + m_offset); + auto data = vm::ptr::make(m_addr + m_size + m_offset); m_offset += 4 * 4; u32 x = GetData(data[0]); @@ -279,7 +279,7 @@ std::string GLFragmentDecompilerThread::BuildCode() void GLFragmentDecompilerThread::Task() { - auto data = vm::ptr>::make(m_addr); + auto data = vm::ptr::make(m_addr); m_size = 0; m_location = 0; m_loop_count = 0; diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 2a460fb235..2af22b20ec 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1380,6 +1380,7 @@ void GLGSRender::WriteColorBuffers() glBindBuffer(GL_PIXEL_PACK_BUFFER, g_pbo[i]); glBufferData(GL_PIXEL_PACK_BUFFER, RSXThread::m_width * RSXThread::m_height * 4, 0, GL_STREAM_READ); } + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); WriteColorBufferA(); WriteColorBufferB(); break; @@ -1804,11 +1805,9 @@ void GLGSRender::ExecCMD() } } - if (m_set_two_side_light_enable) - { - glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); - checkForGlError("glLightModeli"); - } + // TODO: Use other glLightModel functions? + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, m_set_two_side_light_enable ? GL_TRUE : GL_FALSE); + checkForGlError("glLightModeli"); if(m_set_shade_mode) { @@ -2038,8 +2037,12 @@ void GLGSRender::Flip() glReadPixels(0, 0, RSXThread::m_width, RSXThread::m_height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, 0); checkForGlError("Flip(): glReadPixels(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8)"); GLubyte *packed = (GLubyte *)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); - memcpy(pixels.data(), packed, RSXThread::m_width * RSXThread::m_height * 4); - glUnmapBuffer(GL_PIXEL_PACK_BUFFER); + if (packed) + { + memcpy(pixels.data(), packed, RSXThread::m_width * RSXThread::m_height * 4); + glUnmapBuffer(GL_PIXEL_PACK_BUFFER); + checkForGlError("Flip(): glUnmapBuffer"); + } glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); src_buffer = pixels.data(); diff --git a/rpcs3/Emu/RSX/GL/GLShaderParam.h b/rpcs3/Emu/RSX/GL/GLShaderParam.h index f39846da44..80fa5a3dec 100644 --- a/rpcs3/Emu/RSX/GL/GLShaderParam.h +++ b/rpcs3/Emu/RSX/GL/GLShaderParam.h @@ -90,9 +90,8 @@ struct GLParamArray case PARAM_IN: return "in "; case PARAM_UNIFORM: return "uniform "; case PARAM_CONST: return "const "; + default: return ""; } - - return ""; } bool HasParam(const GLParamFlag flag, std::string type, const std::string& name) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 952a963f1b..83a9183151 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -3,6 +3,7 @@ #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" +#include "Emu/RSX/GSManager.h" #include "RSXThread.h" #include "Emu/SysCalls/Callback.h" @@ -45,15 +46,40 @@ void RSXThread::nativeRescale(float width, float height) u32 GetAddress(u32 offset, u32 location) { + u32 res = 0; + switch(location) { - case CELL_GCM_LOCATION_LOCAL: return (u32)Memory.RSXFBMem.GetStartAddr() + offset; - case CELL_GCM_LOCATION_MAIN: return (u32)Memory.RSXIOMem.RealAddr(Memory.RSXIOMem.GetStartAddr() + offset); // TODO: Error Check? + case CELL_GCM_LOCATION_LOCAL: + { + res = (u32)Memory.RSXFBMem.GetStartAddr() + offset; + break; + } + case CELL_GCM_LOCATION_MAIN: + { + res = (u32)Memory.RSXIOMem.RealAddr(offset); // TODO: Error Check? + if (res == 0) + { + LOG_ERROR(RSX, "GetAddress(offset=0x%x): RSXIO memory not mapped", offset); + Emu.Pause(); + break; + } + + if (Emu.GetGSManager().GetRender().m_strict_ordering[offset >> 20]) + { + _mm_mfence(); // probably doesn't have any effect on current implementation + } + break; + } + default: + { + LOG_ERROR(RSX, "GetAddress(offset=0x%x, location=0x%x): invalid location", offset, location); + Emu.Pause(); + break; + } } - LOG_ERROR(RSX, "GetAddress(offset=0x%x, location=0x%x)", location); - assert(0); - return 0; + return res; } RSXVertexData::RSXVertexData() @@ -144,7 +170,7 @@ u32 RSXVertexData::GetTypeSize() u32 RSXThread::OutOfArgsCount(const uint x, const u32 cmd, const u32 count, const u32 args_addr) { - auto args = vm::ptr>::make(args_addr); + auto args = vm::ptr::make(args_addr); std::string debug = GetMethodName(cmd); debug += "("; for(u32 i=0; i>::make(args_addr); + auto args = vm::ptr::make(args_addr); #if CMD_DEBUG std::string debug = GetMethodName(cmd); @@ -239,7 +265,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV406E_SET_CONTEXT_DMA_SEMAPHORE: { if (ARGS(0)) - LOG_WARNING(RSX, "NV406E_SET_CONTEXT_DMA_SEMAPHORE: %x", ARGS(0)); + LOG_WARNING(RSX, "NV406E_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", ARGS(0)); } break; @@ -254,7 +280,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV406E_SEMAPHORE_ACQUIRE: { if (ARGS(0)) - LOG_WARNING(RSX, "NV406E_SEMAPHORE_ACQUIRE: %x", ARGS(0)); + LOG_WARNING(RSX, "NV406E_SEMAPHORE_ACQUIRE: 0x%x", ARGS(0)); } break; @@ -315,21 +341,21 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_NOTIFY: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_NOTIFY: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_NOTIFY: 0x%x", ARGS(0)); } break; case NV4097_WAIT_FOR_IDLE: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_WAIT_FOR_IDLE: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_WAIT_FOR_IDLE: 0x%x", ARGS(0)); } break; case NV4097_PM_TRIGGER: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_PM_TRIGGER: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_PM_TRIGGER: 0x%x", ARGS(0)); } break; @@ -458,7 +484,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_INPUT_MASK: 0x%x", ARGS(0)); //VertexData[0].prog.attributeInputMask = ARGS(0); } @@ -467,7 +493,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK: 0x%x", ARGS(0)); //VertexData[0].prog.attributeOutputMask = ARGS(0); //FragmentData.prog.attributeInputMask = ARGS(0)/* & ~0x20*/; @@ -490,7 +516,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_COLOR_MASK_MRT: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_COLOR_MASK_MRT: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_COLOR_MASK_MRT: 0x%x", ARGS(0)); } break; @@ -829,14 +855,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_CLEAR_RECT_HORIZONTAL: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_HORIZONTAL: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_HORIZONTAL: 0x%x", ARGS(0)); } break; case NV4097_SET_CLEAR_RECT_VERTICAL: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_VERTICAL: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_CLEAR_RECT_VERTICAL: 0x%x", ARGS(0)); } break; @@ -933,7 +959,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const { const u32 a0 = ARGS(0); - //LOG_WARNING(RSX, "NV4097_SET_BEGIN_END: %x", a0); + //LOG_WARNING(RSX, "NV4097_SET_BEGIN_END: 0x%x", a0); m_read_buffer = false; @@ -1066,7 +1092,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_INVALIDATE_L2: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_INVALIDATE_L2: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_INVALIDATE_L2: 0x%x", ARGS(0)); } break; @@ -1085,7 +1111,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_INVALIDATE_ZCULL: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_INVALIDATE_ZCULL: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_INVALIDATE_ZCULL: 0x%x", ARGS(0)); } break; @@ -1249,7 +1275,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_SCULL_CONTROL: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_SCULL_CONTROL: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_SCULL_CONTROL: 0x%x", ARGS(0)); //This is stencil culling , nothing to do with stencil masking on regular color or depth buffer //const u32 a0 = ARGS(0); @@ -1287,7 +1313,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_POINT_PARAMS_ENABLE: { if (ARGS(0)) - LOG_ERROR(RSX, "NV4097_SET_POINT_PARAMS_ENABLE: %x", ARGS(0)); + LOG_ERROR(RSX, "NV4097_SET_POINT_PARAMS_ENABLE: 0x%x", ARGS(0)); } break; @@ -1427,7 +1453,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_SURFACE_PITCH_D: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_SURFACE_PITCH_D: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_SURFACE_PITCH_D: 0x%x", ARGS(0)); } break; @@ -1467,7 +1493,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_CONTEXT_DMA_COLOR_D: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_COLOR_D: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_COLOR_D: 0x%x", ARGS(0)); } break; @@ -1481,14 +1507,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_CONTEXT_DMA_SEMAPHORE: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_SEMAPHORE: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_SEMAPHORE: 0x%x", ARGS(0)); } break; case NV4097_SET_CONTEXT_DMA_NOTIFIES: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_NOTIFIES: 0x%x", ARGS(0)); } break; @@ -1529,7 +1555,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const const u8 alphaToOne = (a0 >> 8) & 0xf; const u16 sampleMask = a0 >> 16; - LOG_WARNING(RSX, "TODO: NV4097_SET_ANTI_ALIASING_CONTROL: %x", a0); + LOG_WARNING(RSX, "TODO: NV4097_SET_ANTI_ALIASING_CONTROL: 0x%x", a0); } break; @@ -1599,7 +1625,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_ZCULL_CONTROL0: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL0: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL0: 0x%x", ARGS(0)); //m_set_depth_func = true; //m_depth_func = ARGS(0) >> 4; @@ -1609,7 +1635,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_ZCULL_CONTROL1: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL1: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_ZCULL_CONTROL1: 0x%x", ARGS(0)); //m_set_depth_func = true; //m_depth_func = ARGS(0) >> 4; @@ -1619,14 +1645,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV4097_SET_ZCULL_STATS_ENABLE: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_ZCULL_STATS_ENABLE: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_SET_ZCULL_STATS_ENABLE: 0x%x", ARGS(0)); } break; case NV4097_ZCULL_SYNC: { if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_ZCULL_SYNC: %x", ARGS(0)); + LOG_WARNING(RSX, "NV4097_ZCULL_SYNC: 0x%x", ARGS(0)); } break; @@ -1745,7 +1771,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const { const u32 offset = ARGS(0) & 0xffffff; const u8 mode = ARGS(0) >> 24; - LOG_WARNING(RSX, "NV4097_SET_RENDER_ENABLE: Offset=%06x, Mode=%x", offset, mode); + LOG_WARNING(RSX, "NV4097_SET_RENDER_ENABLE: Offset=0x%06x, Mode=0x%x", offset, mode); } break; @@ -1812,14 +1838,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV0039_PITCH_IN: { if (ARGS(0)) - LOG_WARNING(RSX, "NV0039_PITCH_IN: %x", ARGS(0)); + LOG_WARNING(RSX, "NV0039_PITCH_IN: 0x%x", ARGS(0)); } break; case NV0039_BUFFER_NOTIFY: { if (ARGS(0)) - LOG_WARNING(RSX, "NV0039_BUFFER_NOTIFY: %x", ARGS(0)); + LOG_WARNING(RSX, "NV0039_BUFFER_NOTIFY: 0x%x", ARGS(0)); } break; @@ -1848,7 +1874,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const case NV309E_SET_CONTEXT_DMA_IMAGE: { if (ARGS(0)) - LOG_WARNING(RSX, "NV309E_SET_CONTEXT_DMA_IMAGE: %x", ARGS(0)); + LOG_WARNING(RSX, "NV309E_SET_CONTEXT_DMA_IMAGE: 0x%x", ARGS(0)); } break; @@ -1947,13 +1973,17 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, const u32 args_addr, const u8* pixels_src = vm::get_ptr(GetAddress(offset, m_context_dma_img_src - 0xfeed0000)); u8* pixels_dst = vm::get_ptr(GetAddress(m_dst_offset, m_context_dma_img_dst - 0xfeed0000)); + LOG_WARNING(RSX, "NV3089_IMAGE_IN_SIZE: width=%d, height=%d, pitch=%d, origin=%d, inter=%d, offset=0x%x, u=%d, v=%d", width, height, pitch, origin, inter, offset, u, v); + LOG_WARNING(RSX, "*** m_dst_offset=0x%x, m_color: conv_in_h=0x%x, format_src_pitch=0x%x, conv_in_x=0x%x, conv_in_y=0x%x, conv_out_x=0x%x, conv_out_y=0x%x", + m_dst_offset, m_color_conv_in_h, m_color_format_src_pitch, m_color_conv_in_x, m_color_conv_in_y, m_color_conv_out_x, m_color_conv_out_y); + for(u16 y=0; y> 18) & 0x7ff; //if(cmd == 0) continue; + if (Ini.RSXLogging.GetValue()) + LOG_NOTICE(Log::RSX, "%s (cmd=0x%x)", GetMethodName(cmd & 0xffff).c_str(), cmd); + + //LOG_NOTICE(Log::RSX, "put=0x%x, get=0x%x, cmd=0x%x (%s)", put, get, cmd, GetMethodName(cmd & 0xffff).c_str()); + if(cmd & CELL_GCM_METHOD_FLAG_JUMP) { u32 addr = cmd & ~(CELL_GCM_METHOD_FLAG_JUMP | CELL_GCM_METHOD_FLAG_NON_INCREMENT); @@ -2212,7 +2247,7 @@ void RSXThread::Task() { m_call_stack.push(get + 4); u32 offs = cmd & ~CELL_GCM_METHOD_FLAG_CALL; - //u32 addr = Memory.RSXIOMem.GetStartAddr() + offs; + //u32 addr = offs; //LOG_WARNING(RSX, "rsx call(0x%x) #0x%x - 0x%x - 0x%x", offs, addr, cmd, get); m_ctrl->get = offs; continue; @@ -2229,19 +2264,19 @@ void RSXThread::Task() if(cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT) { //LOG_WARNING(RSX, "non increment cmd! 0x%x", cmd); - inc=0; + inc = 0; } if(cmd == 0) { - //HACK! We couldn't be here - //ConLog.Error("null cmd: addr=0x%x, put=0x%x, get=0x%x", Memory.RSXIOMem.GetStartAddr() + get, m_ctrl->put, get); + LOG_ERROR(Log::RSX, "null cmd: cmd=0x%x, put=0x%x, get=0x%x (addr=0x%x)", cmd, put, get, (u32)Memory.RSXIOMem.RealAddr(get)); //Emu.Pause(); + //HACK! We shouldn't be here m_ctrl->get = get + (count + 1) * 4; continue; } - auto args = vm::ptr>::make((u32)Memory.RSXIOMem.RealAddr(Memory.RSXIOMem.GetStartAddr() + get + 4)); + auto args = vm::ptr::make((u32)Memory.RSXIOMem.RealAddr(get + 4)); for(u32 i=0; i::MakeFromBE(se16(0xffff)), be_t::MakeFromBE(se16(0xffff)) }, //0 - 0 - { be_t::MakeFromBE(se16(1920)), be_t::MakeFromBE(se16(1080)) }, //1 - 1 - { be_t::MakeFromBE(se16(1280)), be_t::MakeFromBE(se16(720)) }, //2 - 2 - { be_t::MakeFromBE(se16(720)), be_t::MakeFromBE(se16(480)) }, //4 - 3 - { be_t::MakeFromBE(se16(720)), be_t::MakeFromBE(se16(576)) }, //5 - 4 - { be_t::MakeFromBE(se16(1600)), be_t::MakeFromBE(se16(1080)) }, //10 - 5 - { be_t::MakeFromBE(se16(1440)), be_t::MakeFromBE(se16(1080)) }, //11 - 6 - { be_t::MakeFromBE(se16(1280)), be_t::MakeFromBE(se16(1080)) }, //12 - 7 - { be_t::MakeFromBE(se16(960)), be_t::MakeFromBE(se16(1080)) }, //13 - 8 + { be_t::make(0xffff), be_t::make(0xffff) }, //0 - 0 + { be_t::make(1920), be_t::make(1080) }, //1 - 1 + { be_t::make(1280), be_t::make(720) }, //2 - 2 + { be_t::make(720), be_t::make(480) }, //4 - 3 + { be_t::make(720), be_t::make(576) }, //5 - 4 + { be_t::make(1600), be_t::make(1080) }, //10 - 5 + { be_t::make(1440), be_t::make(1080) }, //11 - 6 + { be_t::make(1280), be_t::make(1080) }, //12 - 7 + { be_t::make(960), be_t::make(1080) }, //13 - 8 }; inline static u32 ResolutionIdToNum(u32 id) diff --git a/rpcs3/Emu/SysCalls/CB_FUNC.h b/rpcs3/Emu/SysCalls/CB_FUNC.h index d989d13e2f..6d3ab37f40 100644 --- a/rpcs3/Emu/SysCalls/CB_FUNC.h +++ b/rpcs3/Emu/SysCalls/CB_FUNC.h @@ -55,7 +55,7 @@ namespace cb_detail template struct _func_arg { - static_assert(f_count <= 12, "TODO: Unsupported stack argument type (float)"); + static_assert(f_count <= 13, "TODO: Unsupported stack argument type (float)"); static_assert(v_count <= 12, "TODO: Unsupported stack argument type (vector)"); static_assert(sizeof(T) <= 8, "Invalid callback argument type for ARG_STACK"); @@ -84,7 +84,7 @@ namespace cb_detail const bool is_float = std::is_floating_point::value; const bool is_vector = std::is_same::value; const _func_arg_type t = is_float - ? ((f_count >= 12) ? ARG_STACK : ARG_FLOAT) + ? ((f_count >= 13) ? ARG_STACK : ARG_FLOAT) : (is_vector ? ((v_count >= 12) ? ARG_STACK : ARG_VECTOR) : ((g_count >= 8) ? ARG_STACK : ARG_GENERAL)); const int g = g_count + (is_float || is_vector ? 0 : 1); const int f = f_count + (is_float ? 1 : 0); diff --git a/rpcs3/Emu/SysCalls/LogBase.cpp b/rpcs3/Emu/SysCalls/LogBase.cpp index 2afeb52bae..0f1a48edf4 100644 --- a/rpcs3/Emu/SysCalls/LogBase.cpp +++ b/rpcs3/Emu/SysCalls/LogBase.cpp @@ -6,7 +6,7 @@ bool LogBase::CheckLogging() const { - return Ini.HLELogging.GetValue(); + return Ini.HLELogging.GetValue() || m_logging; } void LogBase::LogOutput(LogType type, const char* info, const std::string& text) const diff --git a/rpcs3/Emu/SysCalls/LogBase.h b/rpcs3/Emu/SysCalls/LogBase.h index d3ba9cc16b..92848e7ba0 100644 --- a/rpcs3/Emu/SysCalls/LogBase.h +++ b/rpcs3/Emu/SysCalls/LogBase.h @@ -31,12 +31,12 @@ public: template __noinline void Notice(const u32 id, const char* fmt, Targs... args) const { - LogOutput(LogNotice, id, ": ", fmt::Format(fmt, args...)); + LogOutput(LogNotice, id, " : ", fmt::Format(fmt, args...)); } template __noinline void Notice(const char* fmt, Targs... args) const { - LogOutput(LogNotice, ": ", fmt::Format(fmt, args...)); + LogOutput(LogNotice, " : ", fmt::Format(fmt, args...)); } template __forceinline void Log(const char* fmt, Targs... args) const @@ -57,12 +57,12 @@ public: template __noinline void Success(const u32 id, const char* fmt, Targs... args) const { - LogOutput(LogSuccess, id, ": ", fmt::Format(fmt, args...)); + LogOutput(LogSuccess, id, " : ", fmt::Format(fmt, args...)); } template __noinline void Success(const char* fmt, Targs... args) const { - LogOutput(LogSuccess, ": ", fmt::Format(fmt, args...)); + LogOutput(LogSuccess, " : ", fmt::Format(fmt, args...)); } template __noinline void Warning(const u32 id, const char* fmt, Targs... args) const diff --git a/rpcs3/Emu/SysCalls/ModuleManager.cpp b/rpcs3/Emu/SysCalls/ModuleManager.cpp index c312310e43..bb5609cbc7 100644 --- a/rpcs3/Emu/SysCalls/ModuleManager.cpp +++ b/rpcs3/Emu/SysCalls/ModuleManager.cpp @@ -4,7 +4,9 @@ extern void cellAdec_init(Module* pxThis); extern void cellAtrac_init(Module* pxThis); extern void cellAudio_init(Module* pxThis); +extern void cellAvconfExt_init(Module* pxThis); extern void cellCamera_init(Module* pxThis); +extern void cellCamera_unload(); extern void cellDmux_init(Module *pxThis); extern void cellFiber_init(Module *pxThis); extern void cellFont_init(Module *pxThis); @@ -18,10 +20,14 @@ extern void cellGcmSys_init(Module *pxThis); extern void cellGcmSys_load(); extern void cellGcmSys_unload(); extern void cellGem_init(Module *pxThis); +extern void cellGem_unload(); extern void cellJpgDec_init(Module *pxThis); extern void cellGifDec_init(Module *pxThis); extern void cellL10n_init(Module *pxThis); +extern void cellMic_init(Module *pxThis); +extern void cellMic_unload(); extern void cellNetCtl_init(Module *pxThis); +extern void cellNetCtl_unload(); extern void cellOvis_init(Module *pxThis); extern void cellPamf_init(Module *pxThis); extern void cellPngDec_init(Module *pxThis); @@ -43,6 +49,7 @@ extern void cellVdec_init(Module *pxThis); extern void cellVpost_init(Module *pxThis); extern void libmixer_init(Module *pxThis); extern void sceNp_init(Module *pxThis); +extern void sceNp_unload(); extern void sceNpClans_init(Module *pxThis); extern void sceNpClans_unload(); extern void sceNpCommerce2_init(Module *pxThis); @@ -90,9 +97,9 @@ static const g_modules_list[] = { 0x0011, "cellAudio", cellAudio_init, nullptr, nullptr }, { 0x0012, "cellPamf", cellPamf_init, nullptr, nullptr }, { 0x0013, "cellAtrac", cellAtrac_init, nullptr, nullptr }, - { 0x0014, "cellNetCtl", cellNetCtl_init, nullptr, nullptr }, + { 0x0014, "cellNetCtl", cellNetCtl_init, nullptr, cellNetCtl_unload }, { 0x0015, "cellSysutil", cellSysutil_init, cellSysutil_load, nullptr }, - { 0x0016, "sceNp", sceNp_init, nullptr, nullptr }, + { 0x0016, "sceNp", sceNp_init, nullptr, sceNp_unload }, { 0x0017, "sys_io", sys_io_init, nullptr, nullptr }, { 0x0018, "cellPngDec", cellPngDec_init, nullptr, nullptr }, { 0x0019, "cellFont", cellFont_init, cellFont_load, cellFont_unload }, @@ -104,8 +111,8 @@ static const g_modules_list[] = { 0x001f, "cellResc", cellResc_init, cellResc_load, cellResc_unload }, { 0x0020, "cellDaisy", nullptr, nullptr, nullptr }, { 0x0021, "cellKey2char", nullptr, nullptr, nullptr }, - { 0x0022, "cellMic", nullptr, nullptr, nullptr }, - { 0x0023, "cellCamera", cellCamera_init, nullptr, nullptr }, + { 0x0022, "cellMic", cellMic_init, nullptr, cellMic_unload }, + { 0x0023, "cellCamera", cellCamera_init, nullptr, cellCamera_unload }, { 0x0024, "cellVdecMpeg2", nullptr, nullptr, nullptr }, { 0x0025, "cellVdecAvc", nullptr, nullptr, nullptr }, { 0x0026, "cellAdecLpcm", nullptr, nullptr, nullptr }, @@ -115,7 +122,7 @@ static const g_modules_list[] = { 0x002a, "cellDmuxPamf", nullptr, nullptr, nullptr }, { 0x002e, "cellLv2dbg", nullptr, nullptr, nullptr }, { 0x0030, "cellUsbpspcm", nullptr, nullptr, nullptr }, - { 0x0031, "cellAvconfExt", nullptr, nullptr, nullptr }, + { 0x0031, "cellAvconfExt", cellAvconfExt_init, nullptr, nullptr }, { 0x0032, "cellUserInfo", cellUserInfo_init, nullptr, nullptr }, { 0x0033, "cellSysutilSavedata", nullptr, nullptr, nullptr }, { 0x0034, "cellSubdisplay", nullptr, nullptr, nullptr }, @@ -150,7 +157,7 @@ static const g_modules_list[] = { 0x0056, "cellNpUtil", nullptr, nullptr, nullptr }, { 0x0057, "cellRudp", nullptr, nullptr, nullptr }, { 0x0059, "cellNpSns", sceNpSns_init, nullptr, sceNpSns_unload }, - { 0x005a, "cellGem", cellGem_init, nullptr, nullptr }, + { 0x005a, "cellGem", cellGem_init, nullptr, cellGem_unload }, { 0xf00a, "cellCelpEnc", nullptr, nullptr, nullptr }, { 0xf010, "cellGifDec", cellGifDec_init, nullptr, nullptr }, { 0xf019, "cellAdecCelp", nullptr, nullptr, nullptr }, diff --git a/rpcs3/Emu/SysCalls/ModuleManager.h b/rpcs3/Emu/SysCalls/ModuleManager.h index 33034a9739..524887112d 100644 --- a/rpcs3/Emu/SysCalls/ModuleManager.h +++ b/rpcs3/Emu/SysCalls/ModuleManager.h @@ -10,6 +10,7 @@ class ModuleManager std::vector m_modules_funcs_list; std::vector m_mod_init; //owner of Module bool initialized; + public: ModuleManager(); ~ModuleManager(); diff --git a/rpcs3/Emu/SysCalls/Modules.cpp b/rpcs3/Emu/SysCalls/Modules.cpp index a994cf5488..c11dcc4f33 100644 --- a/rpcs3/Emu/SysCalls/Modules.cpp +++ b/rpcs3/Emu/SysCalls/Modules.cpp @@ -5,6 +5,7 @@ #include "Emu/SysCalls/Static.h" #include "Crypto/sha1.h" #include "ModuleManager.h" +#include "Emu/Cell/PPUInstrTable.h" u32 getFunctionId(const char* name) { @@ -61,10 +62,12 @@ Module::~Module() { UnLoad(); - for (int i = 0; i < m_funcs_list.size(); i++) + for (auto &i : m_funcs_list) { - delete m_funcs_list[i]; + delete i.second; } + + m_funcs_list.clear(); } void Module::Load() @@ -74,12 +77,10 @@ void Module::Load() if(m_load_func) m_load_func(); - for(u32 i=0; iid); + i.second->lle_func.set(0); } + // TODO: Re-enable this when needed + // This was disabled because some functions would get unloaded and + // some games tried to use them, thus only printing a TODO message + //for(u32 i=0; iid); + //} + SetLoaded(false); } @@ -102,16 +111,14 @@ bool Module::Load(u32 id) if(Emu.GetModuleManager().IsLoadedFunc(id)) return false; - for(u32 i=0; iid == id) - { - Emu.GetModuleManager().AddFunc(m_funcs_list[i]); - return true; - } - } + auto res = m_funcs_list.find(id); - return false; + if (res == m_funcs_list.end()) + return false; + + Emu.GetModuleManager().AddFunc(res->second); + + return true; } bool Module::UnLoad(u32 id) @@ -146,12 +153,12 @@ void Module::SetName(const std::string& name) bool Module::CheckID(u32 id) const { - return Emu.GetIdManager().CheckID(id) && Emu.GetIdManager().GetID(id).m_name == GetName(); + return Emu.GetIdManager().CheckID(id) && Emu.GetIdManager().GetID(id).GetName() == GetName(); } bool Module::CheckID(u32 id, ID*& _id) const { - return Emu.GetIdManager().CheckID(id) && (_id = &Emu.GetIdManager().GetID(id))->m_name == GetName(); + return Emu.GetIdManager().CheckID(id) && (_id = &Emu.GetIdManager().GetID(id))->GetName() == GetName(); } bool Module::RemoveId(u32 id) @@ -171,12 +178,18 @@ void Module::PushNewFuncSub(SFunc* func) void fix_import(Module* module, u32 func, u32 addr) { - vm::write32(addr + 0x0, 0x3d600000 | (func >> 16)); /* lis r11, (func_id >> 16) */ - vm::write32(addr + 0x4, 0x616b0000 | (func & 0xffff)); /* ori r11, (func_id & 0xffff) */ - vm::write32(addr + 0x8, 0x60000000); /* nop */ - // leave rtoc saving at 0xC - vm::write64(addr + 0x10, 0x440000024e800020ull); /* sc + blr */ - vm::write64(addr + 0x18, 0x6000000060000000ull); /* nop + nop */ + using namespace PPU_instr; + + vm::ptr ptr = vm::ptr::make(addr); + + *ptr++ = ADDIS(11, 0, func >> 16); + *ptr++ = ORI(11, 11, func & 0xffff); + *ptr++ = NOP(); + ++ptr; + *ptr++ = SC(2); + *ptr++ = BLR(); + *ptr++ = NOP(); + *ptr++ = NOP(); module->Load(func); } @@ -191,36 +204,38 @@ void fix_relocs(Module* module, u32 lib, u32 start, u32 end, u32 seg2) for (u32 i = lib + start; i < lib + end; i += 24) { - u64 addr = vm::read64(i); + u64 addr = vm::read64(i) + lib; const u64 flag = vm::read64(i + 8); - if (flag == 0x10100000001ull) + if ((u32)addr != addr || (u32)(addr + seg2) != (addr + seg2)) { - addr = addr + seg2 + lib; - u32 value = vm::read32(addr); + module->Error("fix_relocs(): invalid address (0x%llx)", addr); + } + else if (flag == 0x10100000001ull) + { + addr = addr + seg2; + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16) + seg2); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 0x100000001ull) { - addr = addr + seg2 + lib; - u32 value = vm::read32(addr); + addr = addr + seg2; + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16)); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 0x10000000001ull) { - addr = addr + lib; - u32 value = vm::read32(addr); + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16) + seg2); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 1) { - addr = addr + lib; - u32 value = vm::read32(addr); + u32 value = vm::read32((u32)addr); assert(value == vm::read64(i + 16)); - vm::write32(addr, value + lib); + vm::write32((u32)addr, value + lib); } else if (flag == 0x10000000004ull || flag == 0x10000000006ull) { diff --git a/rpcs3/Emu/SysCalls/Modules.h b/rpcs3/Emu/SysCalls/Modules.h index 3f7e7ebe15..0ee2ddd9f4 100644 --- a/rpcs3/Emu/SysCalls/Modules.h +++ b/rpcs3/Emu/SysCalls/Modules.h @@ -9,10 +9,12 @@ struct ModuleFunc { u32 id; func_caller* func; + vm::ptr lle_func; - ModuleFunc(u32 id, func_caller* func) + ModuleFunc(u32 id, func_caller* func, vm::ptr lle_func = vm::ptr::make(0)) : id(id) , func(func) + , lle_func(lle_func) { } @@ -57,7 +59,7 @@ class Module : public LogBase void PushNewFuncSub(SFunc* func); public: - std::vector m_funcs_list; + std::unordered_map m_funcs_list; Module(u16 id, const char* name, void(*load)() = nullptr, void(*unload)() = nullptr); @@ -66,6 +68,16 @@ public: Module &operator =(Module &other) = delete; Module &operator =(Module &&other); + + ModuleFunc* GetFunc(u32 id) + { + auto res = m_funcs_list.find(id); + + if (res == m_funcs_list.end()) + return nullptr; + + return res->second; + } ~Module(); @@ -89,7 +101,7 @@ public: if(!CheckID(id, id_data)) return false; - data = id_data->m_data->get(); + data = id_data->GetData()->get(); return true; } @@ -100,8 +112,8 @@ public: if(!CheckID(id, id_data)) return false; - data = id_data->m_data->get(); - type = id_data->m_type; + data = id_data->GetData()->get(); + type = id_data->GetType(); return true; } @@ -114,9 +126,20 @@ public: } bool RemoveId(u32 id); + + void RegisterLLEFunc(u32 id, vm::ptr func) + { + if (auto f = GetFunc(id)) + { + f->lle_func = func; + return; + } + + m_funcs_list[id] = new ModuleFunc(id, nullptr, func); + } template __forceinline void AddFunc(u32 id, T func); - template __forceinline void AddFunc(const char* name, T func); + template __forceinline void AddFunc(const char* name, T func); template __forceinline void AddFuncSub(const char group[8], const u64 ops[], const char* name, T func); }; @@ -125,7 +148,7 @@ u32 getFunctionId(const char* name); template __forceinline void Module::AddFunc(u32 id, T func) { - m_funcs_list.emplace_back(new ModuleFunc(id, bind_func(func))); + m_funcs_list[id] = new ModuleFunc(id, bind_func(func)); } template diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp index 51dc0e6b62..e23461cda8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.cpp @@ -27,7 +27,7 @@ AudioDecoder::AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptrpb = avio_alloc_context(io_buf, 4096, 0, this, adecRead, NULL, NULL); + fmt->pb = avio_alloc_context(io_buf, 256, 0, this, adecRead, NULL, NULL); if (!fmt->pb) { cellAdec->Error("AudioDecoder(): avio_alloc_context failed"); @@ -64,14 +64,14 @@ AudioDecoder::AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptr> 2; + adec.frame_size = ((((u32)code1 & 0x3) << 8) | (u32)code2) * 8 + 8; + adec.sample_rate = at3freq[code1 >> 5]; + + adec.reader.size -= 8; + adec.reader.addr += 8; + adec.reader.has_ats = false; + } + + if (!adec.reader.init) + { + OMAHeader oma(1 /* atrac3p id */, adec.sample_rate, adec.channels, adec.frame_size); + if (buf_size < sizeof(oma)) { - if (Emu.IsStopped()) - { - cellAdec->Warning("adecRawRead(): aborted"); - return 0; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + cellAdec->Error("adecRead(): OMAHeader writing failed"); + Emu.Pause(); + return 0; } - switch (adec.job.Peek().type) + memcpy(buf, &oma, sizeof(oma)); + buf += sizeof(oma); + buf_size -= sizeof(oma); + res += sizeof(oma); + + adec.reader.init = true; + } + + if (adec.reader.size < (u32)buf_size /*&& !adec.just_started*/) + { + AdecTask task; + if (!adec.job.Peek(task, &adec.is_closed)) + { + if (Emu.IsStopped()) cellAdec->Warning("adecRawRead() aborted"); + return 0; + } + + switch (task.type) { case adecEndSeq: case adecClose: - { - buf_size = adec.reader.size; - } - break; + { + buf_size = adec.reader.size; + } + break; + case adecDecodeAu: - { - memcpy(buf, vm::get_ptr(adec.reader.addr), adec.reader.size); + { + memcpy(buf, vm::get_ptr(adec.reader.addr), adec.reader.size); + + buf += adec.reader.size; + buf_size -= adec.reader.size; + res += adec.reader.size; - buf += adec.reader.size; - buf_size -= adec.reader.size; - res += adec.reader.size; + adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_AUDONE, adec.task.au.auInfo_addr, adec.cbArg); - adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_AUDONE, adec.task.au.auInfo_addr, adec.cbArg); + adec.job.Pop(adec.task, nullptr); - adec.job.Pop(adec.task); - - adec.reader.addr = adec.task.au.addr; - adec.reader.size = adec.task.au.size; - //LOG_NOTICE(HLE, "Audio AU: size = 0x%x, pts = 0x%llx", adec.task.au.size, adec.task.au.pts); - } - break; + adec.reader.addr = adec.task.au.addr; + adec.reader.size = adec.task.au.size; + adec.reader.has_ats = adec.use_ats_headers; + //LOG_NOTICE(HLE, "Audio AU: size = 0x%x, pts = 0x%llx", adec.task.au.size, adec.task.au.pts); + } + break; + default: - cellAdec->Error("adecRawRead(): sequence error (task %d)", adec.job.Peek().type); + { + cellAdec->Error("adecRawRead(): unknown task (%d)", task.type); + Emu.Pause(); return -1; } + } goto next; } @@ -156,89 +190,6 @@ next: } } -int adecRead(void* opaque, u8* buf, int buf_size) -{ - AudioDecoder& adec = *(AudioDecoder*)opaque; - - int res = 0; - - if (adec.reader.rem_size && adec.reader.rem) - { - if (buf_size < (int)adec.reader.rem_size) - { - cellAdec->Error("adecRead(): too small buf_size (rem_size = %d, buf_size = %d)", adec.reader.rem_size, buf_size); - Emu.Pause(); - return 0; - } - - memcpy(buf, adec.reader.rem, adec.reader.rem_size); - free(adec.reader.rem); - adec.reader.rem = nullptr; - buf += adec.reader.rem_size; - buf_size -= adec.reader.rem_size; - res += adec.reader.rem_size; - adec.reader.rem_size = 0; - } - - while (buf_size) - { - u8 header[8]; - if (adecRawRead(opaque, header, 8) < 8) break; - if (header[0] != 0x0f || header[1] != 0xd0) - { - cellAdec->Error("adecRead(): 0x0FD0 header not found"); - Emu.Pause(); - return -1; - } - - if (!adec.reader.init) - { - OMAHeader oma(1 /* atrac3p id */, header[2], header[3]); - if (buf_size < sizeof(oma) + 8) - { - cellAdec->Error("adecRead(): OMAHeader writing failed"); - Emu.Pause(); - return 0; - } - - memcpy(buf, &oma, sizeof(oma)); - buf += sizeof(oma); - buf_size -= sizeof(oma); - res += sizeof(oma); - - adec.reader.init = true; - } - else - { - } - - u32 size = (((header[2] & 0x3) << 8) | header[3]) * 8 + 8; // data to be read before next header - - //LOG_NOTICE(HLE, "*** audio block read: size = 0x%x", size); - - if (buf_size < (int)size) - { - if (adecRawRead(opaque, buf, buf_size) < buf_size) break; // ??? - res += buf_size; - size -= buf_size; - buf_size = 0; - - adec.reader.rem = (u8*)malloc(size); - adec.reader.rem_size = size; - if (adecRawRead(opaque, adec.reader.rem, size) < (int)size) break; // ??? - } - else - { - if (adecRawRead(opaque, buf, size) < (int)size) break; // ??? - buf += size; - buf_size -= size; - res += size; - } - } - - return res; -} - u32 adecOpen(AudioDecoder* data) { AudioDecoder& adec = *data; @@ -264,24 +215,18 @@ u32 adecOpen(AudioDecoder* data) while (true) { - if (Emu.IsStopped()) + if (Emu.IsStopped() || adec.is_closed) { break; } - if (!adec.job.GetCountUnsafe() && adec.is_running) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - } + //if (!adec.job.GetCountUnsafe() && adec.is_running) + //{ + // std::this_thread::sleep_for(std::chrono::milliseconds(1)); + // continue; + //} - /*if (adec.frames.GetCount() >= 50) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - }*/ - - if (!adec.job.Pop(task)) + if (!adec.job.Pop(task, &adec.is_closed)) { break; } @@ -296,11 +241,13 @@ u32 adecOpen(AudioDecoder* data) adec.reader.addr = 0; adec.reader.size = 0; adec.reader.init = false; - if (adec.reader.rem) free(adec.reader.rem); - adec.reader.rem = nullptr; - adec.reader.rem_size = 0; - adec.is_running = true; + adec.reader.has_ats = false; adec.just_started = true; + + adec.channels = task.at3p.channels; + adec.frame_size = task.at3p.frame_size; + adec.sample_rate = task.at3p.sample_rate; + adec.use_ats_headers = task.at3p.ats_header == 1; } break; @@ -310,7 +257,6 @@ u32 adecOpen(AudioDecoder* data) cellAdec->Warning("adecEndSeq:"); adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_SEQDONE, CELL_OK, adec.cbArg); - adec.is_running = false; adec.just_finished = true; } break; @@ -321,12 +267,13 @@ u32 adecOpen(AudioDecoder* data) adec.reader.addr = task.au.addr; adec.reader.size = task.au.size; + adec.reader.has_ats = adec.use_ats_headers; //LOG_NOTICE(HLE, "Audio AU: size = 0x%x, pts = 0x%llx", task.au.size, task.au.pts); if (adec.just_started) { adec.first_pts = task.au.pts; - adec.last_pts = task.au.pts - 0x10000; // hack + adec.last_pts = task.au.pts - 0x10000; // hack? } struct AVPacketHolder : AVPacket @@ -350,36 +297,30 @@ u32 adecOpen(AudioDecoder* data) ~AVPacketHolder() { av_free(data); - //av_free_packet(this); } } au(0); - /*{ - wxFile dump; - dump.Open(wxString::Format("audio pts-0x%llx.dump", task.au.pts), wxFile::write); - u8* buf = (u8*)malloc(task.au.size); - if (Memory.CopyToReal(buf, task.au.addr, task.au.size)) dump.Write(buf, task.au.size); - free(buf); - dump.Close(); - }*/ - if (adec.just_started && adec.just_finished) { avcodec_flush_buffers(adec.ctx); - adec.reader.init = true; + + adec.reader.init = true; // wrong adec.just_finished = false; adec.just_started = false; } else if (adec.just_started) // deferred initialization { - err = avformat_open_input(&adec.fmt, NULL, av_find_input_format("oma"), NULL); - if (err) + AVDictionary* opts = nullptr; + av_dict_set(&opts, "probesize", "96", 0); + err = avformat_open_input(&adec.fmt, NULL, av_find_input_format("oma"), &opts); + if (err || opts) { - cellAdec->Error("adecDecodeAu: avformat_open_input() failed"); + cellAdec->Error("adecDecodeAu: avformat_open_input() failed (err=0x%x, opts=%d)", err, opts ? 1 : 0); Emu.Pause(); break; } + AVCodec* codec = avcodec_find_decoder(AV_CODEC_ID_ATRAC3P); // ??? if (!codec) { @@ -408,14 +349,14 @@ u32 adecOpen(AudioDecoder* data) } adec.ctx = adec.fmt->streams[0]->codec; // TODO: check data - AVDictionary* opts = nullptr; + opts = nullptr; av_dict_set(&opts, "refcounted_frames", "1", 0); { std::lock_guard lock(g_mutex_avcodec_open2); // not multithread-safe (???) err = avcodec_open2(adec.ctx, codec, &opts); } - if (err) + if (err || opts) { cellAdec->Error("adecDecodeAu: avcodec_open2() failed"); Emu.Pause(); @@ -428,27 +369,11 @@ u32 adecOpen(AudioDecoder* data) while (true) { - if (Emu.IsStopped()) + if (Emu.IsStopped() || adec.is_closed) { - cellAdec->Warning("adecDecodeAu: aborted"); - return; - } - - /*if (!adec.ctx) // fake - { - AdecFrame frame; - frame.pts = task.au.pts; - frame.auAddr = task.au.addr; - frame.auSize = task.au.size; - frame.userdata = task.au.userdata; - frame.size = 4096; - frame.data = nullptr; - adec.frames.Push(frame); - - adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_PCMOUT, CELL_OK, adec.cbArg); - + if (Emu.IsStopped()) cellAdec->Warning("adecDecodeAu: aborted"); break; - }*/ + } last_frame = av_read_frame(adec.fmt, &au) < 0; if (last_frame) @@ -507,7 +432,7 @@ u32 adecOpen(AudioDecoder* data) } else { - adec.last_pts += ((u64)frame.data->nb_samples) * 90000 / 48000; + adec.last_pts += ((u64)frame.data->nb_samples) * 90000 / frame.data->sample_rate; frame.pts = adec.last_pts; } //frame.pts = adec.last_pts; @@ -523,21 +448,16 @@ u32 adecOpen(AudioDecoder* data) Emu.Pause(); break; } - if (frame.data->channels != 2) - { - cellAdec->Error("adecDecodeAu: unsupported channel count (%d)", frame.data->channels); - Emu.Pause(); - break; - } //LOG_NOTICE(HLE, "got audio frame (pts=0x%llx, nb_samples=%d, ch=%d, sample_rate=%d, nbps=%d)", //frame.pts, frame.data->nb_samples, frame.data->channels, frame.data->sample_rate, //av_get_bytes_per_sample((AVSampleFormat)frame.data->format)); - adec.frames.Push(frame); - frame.data = nullptr; // to prevent destruction - - adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_PCMOUT, CELL_OK, adec.cbArg); + if (adec.frames.Push(frame, &adec.is_closed)) + { + frame.data = nullptr; // to prevent destruction + adec.cbFunc.call(*adec.adecCb, adec.id, CELL_ADEC_MSG_TYPE_PCMOUT, CELL_OK, adec.cbArg); + } } } @@ -545,19 +465,20 @@ u32 adecOpen(AudioDecoder* data) } break; - case adecClose: - { - adec.is_finished = true; - cellAdec->Notice("Audio Decoder thread ended"); - return; - } + case adecClose: break; default: + { cellAdec->Error("Audio Decoder thread error: unknown task(%d)", task.type); + Emu.Pause(); + return; + } } } + adec.is_finished = true; - cellAdec->Warning("Audio Decoder thread aborted"); + if (adec.is_closed) cellAdec->Notice("Audio Decoder thread ended"); + if (Emu.IsStopped()) cellAdec->Warning("Audio Decoder thread aborted"); }); t.detach(); @@ -600,12 +521,12 @@ int cellAdecQueryAttr(vm::ptr type, vm::ptr attr) // TODO: check values attr->adecVerLower = 0x280000; // from dmux attr->adecVerUpper = 0x260000; - attr->workMemSize = 4 * 1024 * 1024; // 4 MB + attr->workMemSize = 256 * 1024; // 256 KB return CELL_OK; } -int cellAdecOpen(vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr> handle) +int cellAdecOpen(vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr handle) { cellAdec->Warning("cellAdecOpen(type_addr=0x%x, res_addr=0x%x, cb_addr=0x%x, handle_addr=0x%x)", type.addr(), res.addr(), cb.addr(), handle.addr()); @@ -617,7 +538,7 @@ int cellAdecOpen(vm::ptr type, vm::ptr res, vm:: return CELL_OK; } -int cellAdecOpenEx(vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr> handle) +int cellAdecOpenEx(vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr handle) { cellAdec->Warning("cellAdecOpenEx(type_addr=0x%x, res_addr=0x%x, cb_addr=0x%x, handle_addr=0x%x)", type.addr(), res.addr(), cb.addr(), handle.addr()); @@ -639,7 +560,8 @@ int cellAdecClose(u32 handle) return CELL_ADEC_ERROR_ARG; } - adec->job.Push(AdecTask(adecClose)); + adec->is_closed = true; + adec->job.Push(AdecTask(adecClose), &sq_no_wait); while (!adec->is_finished) { @@ -658,7 +580,7 @@ int cellAdecClose(u32 handle) int cellAdecStartSeq(u32 handle, u32 param_addr) { - cellAdec->Log("cellAdecStartSeq(handle=%d, param_addr=0x%x)", handle, param_addr); + cellAdec->Warning("cellAdecStartSeq(handle=%d, param_addr=0x%x)", handle, param_addr); AudioDecoder* adec; if (!Emu.GetIdManager().GetIDData(handle, adec)) @@ -667,16 +589,34 @@ int cellAdecStartSeq(u32 handle, u32 param_addr) } AdecTask task(adecStartSeq); - /*if (adec->type == CELL_ADEC_TYPE_ATRACX_2CH) - { - } - else*/ + switch (adec->type) { - cellAdec->Todo("cellAdecStartSeq(): initialization"); + case CELL_ADEC_TYPE_ATRACX_2CH: + { + auto param = vm::ptr::make(param_addr); + + task.at3p.sample_rate = param->sampling_freq; + task.at3p.channel_config = param->ch_config_idx; + task.at3p.channels = param->nch_out; + task.at3p.frame_size = param->nbytes; + task.at3p.extra_config = param->extra_config_data; + task.at3p.output = param->bw_pcm; + task.at3p.downmix = param->downmix_flag; + task.at3p.ats_header = param->au_includes_ats_hdr_flg; + cellAdec->Todo("*** CellAdecParamAtracX: sr=%d, ch_cfg=%d(%d), frame_size=0x%x, extra=0x%x, output=%d, downmix=%d, ats_header=%d", + task.at3p.sample_rate, task.at3p.channel_config, task.at3p.channels, task.at3p.frame_size, (u32&)task.at3p.extra_config, task.at3p.output, task.at3p.downmix, task.at3p.ats_header); + break; } - - adec->job.Push(task); + default: + { + cellAdec->Todo("cellAdecStartSeq(): Unimplemented audio codec type(%d)", adec->type); + Emu.Pause(); + return CELL_OK; + } + } + + adec->job.Push(task, &adec->is_closed); return CELL_OK; } @@ -690,7 +630,7 @@ int cellAdecEndSeq(u32 handle) return CELL_ADEC_ERROR_ARG; } - adec->job.Push(AdecTask(adecEndSeq)); + adec->job.Push(AdecTask(adecEndSeq), &adec->is_closed); return CELL_OK; } @@ -711,7 +651,8 @@ int cellAdecDecodeAu(u32 handle, vm::ptr auInfo) task.au.pts = ((u64)auInfo->pts.upper << 32) | (u64)auInfo->pts.lower; task.au.userdata = auInfo->userData; - adec->job.Push(task); + //cellAdec->Notice("cellAdecDecodeAu(): addr=0x%x, size=0x%x, pts=0x%llx", task.au.addr, task.au.size, task.au.pts); + adec->job.Push(task, &adec->is_closed); return CELL_OK; } @@ -725,39 +666,50 @@ int cellAdecGetPcm(u32 handle, vm::ptr outBuffer) return CELL_ADEC_ERROR_ARG; } - if (adec->frames.IsEmpty()) + AdecFrame af; + if (!adec->frames.Pop(af, &sq_no_wait)) { + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_ADEC_ERROR_EMPTY; } - AdecFrame af; - adec->frames.Pop(af); AVFrame* frame = af.data; - if (!af.data) // fake: empty data + if (outBuffer) { - return CELL_OK; + // reverse byte order: + if (frame->channels == 1) + { + float* in_f = (float*)frame->extended_data[0]; + for (u32 i = 0; i < af.size / 4; i++) + { + outBuffer[i] = in_f[i]; + } + } + else if (frame->channels == 2) + { + float* in_f[2]; + in_f[0] = (float*)frame->extended_data[0]; + in_f[1] = (float*)frame->extended_data[1]; + for (u32 i = 0; i < af.size / 8; i++) + { + outBuffer[i * 2 + 0] = in_f[0][i]; + outBuffer[i * 2 + 1] = in_f[1][i]; + } + } + else + { + cellAdec->Error("cellAdecGetPcm(): unsupported channel count (%d)", frame->channels); + Emu.Pause(); + } } - // reverse byte order, extract data: - float* in_f[2]; - in_f[0] = (float*)frame->extended_data[0]; - in_f[1] = (float*)frame->extended_data[1]; - for (u32 i = 0; i < af.size / 8; i++) - { - outBuffer[i * 2 + 0] = in_f[0][i]; - outBuffer[i * 2 + 1] = in_f[1][i]; - } - - if (af.data) - { - av_frame_unref(af.data); - av_frame_free(&af.data); - } + av_frame_unref(af.data); + av_frame_free(&af.data); return CELL_OK; } -int cellAdecGetPcmItem(u32 handle, vm::ptr> pcmItem_ptr) +int cellAdecGetPcmItem(u32 handle, vm::ptr pcmItem_ptr) { cellAdec->Log("cellAdecGetPcmItem(handle=%d, pcmItem_ptr_addr=0x%x)", handle, pcmItem_ptr.addr()); @@ -767,14 +719,13 @@ int cellAdecGetPcmItem(u32 handle, vm::ptr> pcmItem_ptr) return CELL_ADEC_ERROR_ARG; } - if (adec->frames.IsEmpty()) + AdecFrame af; + if (!adec->frames.Peek(af, &sq_no_wait)) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_ADEC_ERROR_EMPTY; } - AdecFrame& af = adec->frames.Peek(); - AVFrame* frame = af.data; auto pcm = vm::ptr::make(adec->memAddr + adec->memBias); @@ -797,12 +748,23 @@ int cellAdecGetPcmItem(u32 handle, vm::ptr> pcmItem_ptr) pcm->auInfo.userData = af.userdata; auto atx = vm::ptr::make(pcm.addr() + sizeof(CellAdecPcmItem)); - atx->samplingFreq = frame->sample_rate; // ??? - atx->nbytes = frame->nb_samples * frame->channels * sizeof(float); // ??? - atx->channelConfigIndex = CELL_ADEC_CH_STEREO; // ??? + atx->samplingFreq = frame->sample_rate; + atx->nbytes = frame->nb_samples * sizeof(float); + if (frame->channels == 1) + { + atx->channelConfigIndex = 1; + } + else if (frame->channels == 2) + { + atx->channelConfigIndex = 2; + } + else + { + cellAdec->Error("cellAdecGetPcmItem(): unsupported channel count (%d)", frame->channels); + Emu.Pause(); + } *pcmItem_ptr = pcm.addr(); - return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAdec.h b/rpcs3/Emu/SysCalls/Modules/cellAdec.h index 210e4695d3..414d986dee 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAdec.h @@ -790,7 +790,7 @@ struct CellAdecParamAtracX be_t ch_config_idx; be_t nch_out; be_t nbytes; - u8 extra_config_data[4]; // downmix coefficients + std::array extra_config_data; // downmix coefficients be_t bw_pcm; ATRACX_DownmixFlag downmix_flag; ATRACX_ATSHeaderInclude au_includes_ats_hdr_flg; @@ -1010,6 +1010,18 @@ struct AdecTask u64 pts; u64 userdata; } au; + + struct + { + s32 sample_rate; + s32 channel_config; + s32 channels; + s32 frame_size; + std::array extra_config; + s32 output; + u8 downmix; + u8 ats_header; + } at3p; }; AdecTask(AdecJobType type) @@ -1034,6 +1046,8 @@ struct AdecFrame int adecRead(void* opaque, u8* buf, int buf_size); +static const u32 at3freq[8] = { 32000, 44100, 48000, 88200, 96000, 0, 0, 0 }; + struct OMAHeader // OMA Header { u32 magic; // 0x01334145 @@ -1043,26 +1057,34 @@ struct OMAHeader // OMA Header u64 unk2; // 0xcef5000000000400ULL u64 unk3; // 0x1c458024329192d2ULL u8 codecId; // 1 for ATRAC3P - u8 reserved0; // 0 + u8 code0; // 0 u8 code1; u8 code2; - u32 reserved1; // 0 - u64 reserved[7]; // 0 + u32 reserved[15]; // 0 - OMAHeader(u8 id, u8 code1, u8 code2) + OMAHeader(u8 codec_id, u32 freq, u8 channel_count, u32 frame_size) : magic(0x01334145) , size(96 << 8) , unk0(0xffff) , unk1(0x00500f0100000000ULL) , unk2(0xcef5000000000400ULL) , unk3(0x1c458024329192d2ULL) - , codecId(id) - , reserved0(0) - , code1(code1) - , code2(code2) - , reserved1(0) + , codecId(codec_id) + , code0(0) { memset(reserved, 0, sizeof(reserved)); + + u8 freq_code; + for (freq_code = 0; freq_code < 5; freq_code++) + { + if (at3freq[freq_code] == freq) + { + break; + } + } + u32 prepared_frame_size = (frame_size - 8) / 8; + code1 = ((prepared_frame_size >> 8) & 0x3) | ((channel_count & 0x7) << 2) | (freq_code << 5); + code2 = prepared_frame_size & 0xff; } }; @@ -1073,7 +1095,7 @@ class AudioDecoder public: SQueue job; u32 id; - volatile bool is_running; + volatile bool is_closed; volatile bool is_finished; bool just_started; bool just_finished; @@ -1087,20 +1109,13 @@ public: u32 addr; u32 size; bool init; - u8* rem; - u32 rem_size; + bool has_ats; AudioReader() - : rem(nullptr) - , rem_size(0) + : init(false) { } - ~AudioReader() - { - if (rem) free(rem); - rem = nullptr; - } } reader; SQueue frames; @@ -1115,6 +1130,11 @@ public: AdecTask task; u64 last_pts, first_pts; + u32 channels; + u32 frame_size; + u32 sample_rate; + bool use_ats_headers; + PPUThread* adecCb; AudioDecoder(AudioCodecType type, u32 addr, u32 size, vm::ptr func, u32 arg); diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp index 6e9a72d357..5ee26e36d0 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.cpp @@ -1,48 +1,71 @@ #include "stdafx.h" #include "Emu/Memory/Memory.h" +#include "Emu/System.h" #include "Emu/SysCalls/Modules.h" Module *cellAtrac = nullptr; #include "cellAtrac.h" -int cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr> puiWorkMemByte) +#ifdef PRX_DEBUG +#include "prx_libatrac3plus.h" +u32 libatrac3plus; +u32 libatrac3plus_rtoc; +#endif + +s64 cellAtracSetDataAndGetMemSize(vm::ptr pHandle, u32 pucBufferAddr, u32 uiReadByte, u32 uiBufferByte, vm::ptr puiWorkMemByte) { - cellAtrac->Todo("cellAtracSetDataAndGetMemSize(pHandle=0x%x, pucBufferAddr=0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, puiWorkMemByte_addr=0x%x)", + cellAtrac->Warning("cellAtracSetDataAndGetMemSize(pHandle=0x%x, pucBufferAddr=0x%x, uiReadByte=0x%x, uiBufferByte=0x%x, puiWorkMemByte_addr=0x%x)", pHandle.addr(), pucBufferAddr, uiReadByte, uiBufferByte, puiWorkMemByte.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x11F4, libatrac3plus_rtoc); +#endif *puiWorkMemByte = 0x1000; // unproved return CELL_OK; } -int cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) +s64 cellAtracCreateDecoder(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, u32 uiSpuThreadPriority) { - cellAtrac->Todo("cellAtracCreateDecoder(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", + cellAtrac->Warning("cellAtracCreateDecoder(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, uiSpuThreadPriority=%d)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, uiSpuThreadPriority); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0FF0, libatrac3plus_rtoc); +#endif pHandle->data.pucWorkMem_addr = pucWorkMem_addr; return CELL_OK; } -int cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, vm::ptr pExtRes) +s64 cellAtracCreateDecoderExt(vm::ptr pHandle, u32 pucWorkMem_addr, u32 uiPpuThreadPriority, vm::ptr pExtRes) { - cellAtrac->Todo("cellAtracCreateDecoderExt(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, pExtRes_addr=0x%x)", + cellAtrac->Warning("cellAtracCreateDecoderExt(pHandle=0x%x, pucWorkMem_addr=0x%x, uiPpuThreadPriority=%d, pExtRes_addr=0x%x)", pHandle.addr(), pucWorkMem_addr, uiPpuThreadPriority, pExtRes.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0DB0, libatrac3plus_rtoc); +#endif pHandle->data.pucWorkMem_addr = pucWorkMem_addr; return CELL_OK; } -int cellAtracDeleteDecoder(vm::ptr pHandle) +s64 cellAtracDeleteDecoder(vm::ptr pHandle) { - cellAtrac->Todo("cellAtracDeleteDecoder(pHandle=0x%x)", pHandle.addr()); + cellAtrac->Warning("cellAtracDeleteDecoder(pHandle=0x%x)", pHandle.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0D08, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr> puiSamples, vm::ptr> puiFinishflag, vm::ptr> piRemainFrame) +s64 cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr puiSamples, vm::ptr puiFinishflag, vm::ptr piRemainFrame) { - cellAtrac->Todo("cellAtracDecode(pHandle=0x%x, pfOutAddr=0x%x, puiSamples_addr=0x%x, puiFinishFlag_addr=0x%x, piRemainFrame_addr=0x%x)", + cellAtrac->Warning("cellAtracDecode(pHandle=0x%x, pfOutAddr=0x%x, puiSamples_addr=0x%x, puiFinishFlag_addr=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), pfOutAddr, puiSamples.addr(), puiFinishflag.addr(), piRemainFrame.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x09A8, libatrac3plus_rtoc); +#endif *puiSamples = 0; *puiFinishflag = 1; @@ -50,10 +73,13 @@ int cellAtracDecode(vm::ptr pHandle, u32 pfOutAddr, vm::ptr pHandle, vm::ptr> ppucWritePointer, vm::ptr> puiWritableByte, vm::ptr> puiReadPosition) +s64 cellAtracGetStreamDataInfo(vm::ptr pHandle, vm::ptr ppucWritePointer, vm::ptr puiWritableByte, vm::ptr puiReadPosition) { - cellAtrac->Todo("cellAtracGetStreamDataInfo(pHandle=0x%x, ppucWritePointer_addr=0x%x, puiWritableByte_addr=0x%x, puiReadPosition_addr=0x%x)", + cellAtrac->Warning("cellAtracGetStreamDataInfo(pHandle=0x%x, ppucWritePointer_addr=0x%x, puiWritableByte_addr=0x%x, puiReadPosition_addr=0x%x)", pHandle.addr(), ppucWritePointer.addr(), puiWritableByte.addr(), puiReadPosition.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0BE8, libatrac3plus_rtoc); +#endif *ppucWritePointer = pHandle->data.pucWorkMem_addr; *puiWritableByte = 0x1000; @@ -61,79 +87,112 @@ int cellAtracGetStreamDataInfo(vm::ptr pHandle, vm::ptr pHandle, u32 uiAddByte) +s64 cellAtracAddStreamData(vm::ptr pHandle, u32 uiAddByte) { - cellAtrac->Todo("cellAtracAddStreamData(pHandle=0x%x, uiAddByte=0x%x)", pHandle.addr(), uiAddByte); + cellAtrac->Warning("cellAtracAddStreamData(pHandle=0x%x, uiAddByte=0x%x)", pHandle.addr(), uiAddByte); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0AFC, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr> piRemainFrame) +s64 cellAtracGetRemainFrame(vm::ptr pHandle, vm::ptr piRemainFrame) { - cellAtrac->Todo("cellAtracGetRemainFrame(pHandle=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), piRemainFrame.addr()); + cellAtrac->Warning("cellAtracGetRemainFrame(pHandle=0x%x, piRemainFrame_addr=0x%x)", pHandle.addr(), piRemainFrame.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x092C, libatrac3plus_rtoc); +#endif *piRemainFrame = CELL_ATRAC_ALLDATA_IS_ON_MEMORY; return CELL_OK; } -int cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr> puiVacantSize) +s64 cellAtracGetVacantSize(vm::ptr pHandle, vm::ptr puiVacantSize) { - cellAtrac->Todo("cellAtracGetVacantSize(pHandle=0x%x, puiVacantSize_addr=0x%x)", pHandle.addr(), puiVacantSize.addr()); + cellAtrac->Warning("cellAtracGetVacantSize(pHandle=0x%x, puiVacantSize_addr=0x%x)", pHandle.addr(), puiVacantSize.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x08B0, libatrac3plus_rtoc); +#endif *puiVacantSize = 0x1000; return CELL_OK; } -int cellAtracIsSecondBufferNeeded(vm::ptr pHandle) +s64 cellAtracIsSecondBufferNeeded(vm::ptr pHandle) { - cellAtrac->Todo("cellAtracIsSecondBufferNeeded(pHandle=0x%x)", pHandle.addr()); + cellAtrac->Warning("cellAtracIsSecondBufferNeeded(pHandle=0x%x)", pHandle.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0010, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr> puiReadPosition, vm::ptr> puiDataByte) +s64 cellAtracGetSecondBufferInfo(vm::ptr pHandle, vm::ptr puiReadPosition, vm::ptr puiDataByte) { - cellAtrac->Todo("cellAtracGetSecondBufferInfo(pHandle=0x%x, puiReadPosition_addr=0x%x, puiDataByte_addr=0x%x)", + cellAtrac->Warning("cellAtracGetSecondBufferInfo(pHandle=0x%x, puiReadPosition_addr=0x%x, puiDataByte_addr=0x%x)", pHandle.addr(), puiReadPosition.addr(), puiDataByte.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x07E8, libatrac3plus_rtoc); +#endif *puiReadPosition = 0; *puiDataByte = 0; // write to null block will occur return CELL_OK; } -int cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) +s64 cellAtracSetSecondBuffer(vm::ptr pHandle, u32 pucSecondBufferAddr, u32 uiSecondBufferByte) { - cellAtrac->Todo("cellAtracSetSecondBuffer(pHandle=0x%x, pucSecondBufferAddr=0x%x, uiSecondBufferByte=0x%x)", + cellAtrac->Warning("cellAtracSetSecondBuffer(pHandle=0x%x, pucSecondBufferAddr=0x%x, uiSecondBufferByte=0x%x)", pHandle.addr(), pucSecondBufferAddr, uiSecondBufferByte); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0704, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetChannel(vm::ptr pHandle, vm::ptr> puiChannel) +s64 cellAtracGetChannel(vm::ptr pHandle, vm::ptr puiChannel) { - cellAtrac->Todo("cellAtracGetChannel(pHandle=0x%x, puiChannel_addr=0x%x)", pHandle.addr(), puiChannel.addr()); + cellAtrac->Warning("cellAtracGetChannel(pHandle=0x%x, puiChannel_addr=0x%x)", pHandle.addr(), puiChannel.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0060, libatrac3plus_rtoc); +#endif *puiChannel = 2; return CELL_OK; } -int cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr> puiMaxSample) +s64 cellAtracGetMaxSample(vm::ptr pHandle, vm::ptr puiMaxSample) { - cellAtrac->Todo("cellAtracGetMaxSample(pHandle=0x%x, puiMaxSample_addr=0x%x)", pHandle.addr(), puiMaxSample.addr()); + cellAtrac->Warning("cellAtracGetMaxSample(pHandle=0x%x, puiMaxSample_addr=0x%x)", pHandle.addr(), puiMaxSample.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x00AC, libatrac3plus_rtoc); +#endif *puiMaxSample = 512; return CELL_OK; } -int cellAtracGetNextSample(vm::ptr pHandle, vm::ptr> puiNextSample) +s64 cellAtracGetNextSample(vm::ptr pHandle, vm::ptr puiNextSample) { - cellAtrac->Todo("cellAtracGetNextSample(pHandle=0x%x, puiNextSample_addr=0x%x)", pHandle.addr(), puiNextSample.addr()); + cellAtrac->Warning("cellAtracGetNextSample(pHandle=0x%x, puiNextSample_addr=0x%x)", pHandle.addr(), puiNextSample.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0688, libatrac3plus_rtoc); +#endif *puiNextSample = 0; return CELL_OK; } -int cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr> piEndSample, vm::ptr> piLoopStartSample, vm::ptr> piLoopEndSample) +s64 cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr piEndSample, vm::ptr piLoopStartSample, vm::ptr piLoopEndSample) { - cellAtrac->Todo("cellAtracGetSoundInfo(pHandle=0x%x, piEndSample_addr=0x%x, piLoopStartSample_addr=0x%x, piLoopEndSample_addr=0x%x)", + cellAtrac->Warning("cellAtracGetSoundInfo(pHandle=0x%x, piEndSample_addr=0x%x, piLoopStartSample_addr=0x%x, piLoopEndSample_addr=0x%x)", pHandle.addr(), piEndSample.addr(), piLoopStartSample.addr(), piLoopEndSample.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0104, libatrac3plus_rtoc); +#endif *piEndSample = 0; *piLoopStartSample = 0; @@ -141,44 +200,60 @@ int cellAtracGetSoundInfo(vm::ptr pHandle, vm::ptr> p return CELL_OK; } -int cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr> puiSamplePosition) +s64 cellAtracGetNextDecodePosition(vm::ptr pHandle, vm::ptr puiSamplePosition) { - cellAtrac->Todo("cellAtracGetNextDecodePosition(pHandle=0x%x, puiSamplePosition_addr=0x%x)", + cellAtrac->Warning("cellAtracGetNextDecodePosition(pHandle=0x%x, puiSamplePosition_addr=0x%x)", pHandle.addr(), puiSamplePosition.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0190, libatrac3plus_rtoc); +#endif *puiSamplePosition = 0; return CELL_ATRAC_ERROR_ALLDATA_WAS_DECODED; } -int cellAtracGetBitrate(vm::ptr pHandle, vm::ptr> puiBitrate) +s64 cellAtracGetBitrate(vm::ptr pHandle, vm::ptr puiBitrate) { - cellAtrac->Todo("cellAtracGetBitrate(pHandle=0x%x, puiBitrate_addr=0x%x)", + cellAtrac->Warning("cellAtracGetBitrate(pHandle=0x%x, puiBitrate_addr=0x%x)", pHandle.addr(), puiBitrate.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x0374, libatrac3plus_rtoc); +#endif *puiBitrate = 128; return CELL_OK; } -int cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr> piLoopNum, vm::ptr> puiLoopStatus) +s64 cellAtracGetLoopInfo(vm::ptr pHandle, vm::ptr piLoopNum, vm::ptr puiLoopStatus) { - cellAtrac->Todo("cellAtracGetLoopInfo(pHandle=0x%x, piLoopNum_addr=0x%x, puiLoopStatus_addr=0x%x)", + cellAtrac->Warning("cellAtracGetLoopInfo(pHandle=0x%x, piLoopNum_addr=0x%x, puiLoopStatus_addr=0x%x)", pHandle.addr(), piLoopNum.addr(), puiLoopStatus.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x025C, libatrac3plus_rtoc); +#endif *piLoopNum = 0; *puiLoopStatus = 0; return CELL_OK; } -int cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) +s64 cellAtracSetLoopNum(vm::ptr pHandle, int iLoopNum) { - cellAtrac->Todo("cellAtracSetLoopNum(pHandle=0x%x, iLoopNum=0x%x)", pHandle.addr(), iLoopNum); + cellAtrac->Warning("cellAtracSetLoopNum(pHandle=0x%x, iLoopNum=0x%x)", pHandle.addr(), iLoopNum); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x1538, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) +s64 cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiSample, vm::ptr pBufferInfo) { - cellAtrac->Todo("cellAtracGetBufferInfoForResetting(pHandle=0x%x, uiSample=0x%x, pBufferInfo_addr=0x%x)", + cellAtrac->Warning("cellAtracGetBufferInfoForResetting(pHandle=0x%x, uiSample=0x%x, pBufferInfo_addr=0x%x)", pHandle.addr(), uiSample, pBufferInfo.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x05BC, libatrac3plus_rtoc); +#endif pBufferInfo->pucWriteAddr = pHandle->data.pucWorkMem_addr; pBufferInfo->uiWritableByte = 0x1000; @@ -187,17 +262,24 @@ int cellAtracGetBufferInfoForResetting(vm::ptr pHandle, u32 uiS return CELL_OK; } -int cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte) +s64 cellAtracResetPlayPosition(vm::ptr pHandle, u32 uiSample, u32 uiWriteByte) { - cellAtrac->Todo("cellAtracResetPlayPosition(pHandle=0x%x, uiSample=0x%x, uiWriteByte=0x%x)", + cellAtrac->Warning("cellAtracResetPlayPosition(pHandle=0x%x, uiSample=0x%x, uiWriteByte=0x%x)", pHandle.addr(), uiSample, uiWriteByte); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x04E4, libatrac3plus_rtoc); +#endif + return CELL_OK; } -int cellAtracGetInternalErrorInfo(vm::ptr pHandle, vm::ptr> piResult) +s64 cellAtracGetInternalErrorInfo(vm::ptr pHandle, vm::ptr piResult) { - cellAtrac->Todo("cellAtracGetInternalErrorInfo(pHandle=0x%x, piResult_addr=0x%x)", + cellAtrac->Warning("cellAtracGetInternalErrorInfo(pHandle=0x%x, piResult_addr=0x%x)", pHandle.addr(), piResult.addr()); +#ifdef PRX_DEBUG + return GetCurrentPPUThread().FastCall2(libatrac3plus + 0x02E4, libatrac3plus_rtoc); +#endif *piResult = 0; return CELL_OK; @@ -237,4 +319,27 @@ void cellAtrac_init(Module *pxThis) cellAtrac->AddFunc(0x7772eb2b, cellAtracResetPlayPosition); cellAtrac->AddFunc(0xb5c11938, cellAtracGetInternalErrorInfo); + +#ifdef PRX_DEBUG + CallAfter([]() + { + if (!Memory.MainMem.GetStartAddr()) return; + + libatrac3plus = (u32)Memory.MainMem.AllocAlign(sizeof(libatrac3plus_data), 0x100000); + memcpy(vm::get_ptr(libatrac3plus), libatrac3plus_data, sizeof(libatrac3plus_data)); + libatrac3plus_rtoc = libatrac3plus + 0xBED0; + + extern Module* cellAdec; + + FIX_IMPORT(cellAdec, cellAdecDecodeAu, libatrac3plus + 0x399C); + FIX_IMPORT(cellAdec, cellAdecStartSeq, libatrac3plus + 0x39BC); + FIX_IMPORT(cellAdec, cellAdecQueryAttr, libatrac3plus + 0x39DC); + FIX_IMPORT(cellAdec, cellAdecClose, libatrac3plus + 0x39FC); + FIX_IMPORT(cellAdec, cellAdecGetPcm, libatrac3plus + 0x3A1C); + FIX_IMPORT(cellAdec, cellAdecOpen, libatrac3plus + 0x3A3C); + fix_import(cellAdec, 0xDF982D2C, libatrac3plus + 0x3A5C); + + fix_relocs(cellAtrac, libatrac3plus, 0x3EF0, 0x5048, 0x3CE0); + }); +#endif } diff --git a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h index 809bcc6d10..c6102316b9 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAtrac.h +++ b/rpcs3/Emu/SysCalls/Modules/cellAtrac.h @@ -3,7 +3,6 @@ // Return Codes enum { - CELL_ATRAC_OK = 0x00000000, CELL_ATRAC_ERROR_API_FAIL = 0x80610301, CELL_ATRAC_ERROR_READSIZE_OVER_BUFFER = 0x80610311, CELL_ATRAC_ERROR_UNKNOWN_FORMAT = 0x80610312, @@ -27,6 +26,32 @@ enum CELL_ATRAC_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610382, }; +enum +{ + CELL_ATRACMULTI_ERROR_API_FAIL = 0x80610b01, + CELL_ATRACMULTI_ERROR_READSIZE_OVER_BUFFER = 0x80610b11, + CELL_ATRACMULTI_ERROR_UNKNOWN_FORMAT = 0x80610b12, + CELL_ATRACMULTI_ERROR_READSIZE_IS_TOO_SMALL = 0x80610b13, + CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLING_RATE = 0x80610b14, + CELL_ATRACMULTI_ERROR_ILLEGAL_DATA = 0x80610b15, + CELL_ATRACMULTI_ERROR_NO_DECODER = 0x80610b21, + CELL_ATRACMULTI_ERROR_UNSET_DATA = 0x80610b22, + CELL_ATRACMULTI_ERROR_DECODER_WAS_CREATED = 0x80610b23, + CELL_ATRACMULTI_ERROR_ALLDATA_WAS_DECODED = 0x80610b31, + CELL_ATRACMULTI_ERROR_NODATA_IN_BUFFER = 0x80610b32, + CELL_ATRACMULTI_ERROR_NOT_ALIGNED_OUT_BUFFER = 0x80610b33, + CELL_ATRACMULTI_ERROR_NEED_SECOND_BUFFER = 0x80610b34, + CELL_ATRACMULTI_ERROR_ALLDATA_IS_ONMEMORY = 0x80610b41, + CELL_ATRACMULTI_ERROR_ADD_DATA_IS_TOO_BIG = 0x80610b42, + CELL_ATRACMULTI_ERROR_NONEED_SECOND_BUFFER = 0x80610b51, + CELL_ATRACMULTI_ERROR_UNSET_LOOP_NUM = 0x80610b61, + CELL_ATRACMULTI_ERROR_ILLEGAL_SAMPLE = 0x80610b71, + CELL_ATRACMULTI_ERROR_ILLEGAL_RESET_BYTE = 0x80610b72, + CELL_ATRACMULTI_ERROR_ILLEGAL_PPU_THREAD_PRIORITY = 0x80610b81, + CELL_ATRACMULTI_ERROR_ILLEGAL_SPU_THREAD_PRIORITY = 0x80610b82, + CELL_ATRACMULTI_ERROR_API_PARAMETER = 0x80610b91, +}; + // Remain Frame enum { @@ -38,6 +63,7 @@ enum union CellAtracHandle { u8 uiWorkMem[512]; + struct AtracHandle { u32 pucWorkMem_addr; @@ -56,4 +82,4 @@ struct CellAtracExtRes { be_t pSpurs_addr; u8 priority[8]; -}; \ No newline at end of file +}; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index 262ae847aa..f302a9fc2f 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -105,9 +105,9 @@ int cellAudioInit() float* oal_buffer_float = nullptr; if (g_is_u16) - queue.Pop(oal_buffer); + queue.Pop(oal_buffer, nullptr); else - queue_float.Pop(oal_buffer_float); + queue_float.Pop(oal_buffer_float, nullptr); if (g_is_u16) { @@ -153,7 +153,6 @@ int cellAudioInit() m_config.counter++; const u32 oal_pos = m_config.counter % BUFFER_NUM; - const u32 oal_pos_float = m_config.counter % BUFFER_NUM; if (Emu.IsPaused()) { @@ -338,7 +337,7 @@ int cellAudioInit() // 2x MAXPS (optional) // 2x MINPS (optional) // 2x CVTPS2DQ (converts float to s32) - // PACKSSDW (converts s32 to s16 with clipping) + // PACKSSDW (converts s32 to s16 with signed saturation) if (g_is_u16) { @@ -350,10 +349,10 @@ int cellAudioInit() _mm_cvtps_epi32(_mm_mul_ps((__m128&)(buf2ch[i + 4]), float2u16))); } } - + else for (u32 i = 0; i < (sizeof(buf2ch) / sizeof(float)); i++) { - oal_buffer_float[oal_pos_float][oal_buffer_offset + i] = buf2ch[i]; + oal_buffer_float[oal_pos][oal_buffer_offset + i] = buf2ch[i]; } } @@ -361,8 +360,8 @@ int cellAudioInit() if (first_mix) { - memset(&oal_buffer[oal_pos][0], 0, oal_buffer_size * sizeof(s16)); - memset(&oal_buffer_float[oal_pos_float][0], 0, oal_buffer_size * sizeof(float)); + if (g_is_u16) memset(&oal_buffer[oal_pos][0], 0, oal_buffer_size * sizeof(s16)); + else memset(&oal_buffer_float[oal_pos][0], 0, oal_buffer_size * sizeof(float)); } oal_buffer_offset += sizeof(buf2ch) / sizeof(float); @@ -371,9 +370,9 @@ int cellAudioInit() if(m_audio_out) { if (g_is_u16) - queue.Push(&oal_buffer[oal_pos][0]); + queue.Push(&oal_buffer[oal_pos][0], nullptr); - queue_float.Push(&oal_buffer_float[oal_pos_float][0]); + queue_float.Push(&oal_buffer_float[oal_pos][0], nullptr); } oal_buffer_offset = 0; @@ -385,7 +384,7 @@ int cellAudioInit() { std::lock_guard lock(audioMutex); // update indexes: - auto indexes = vm::ptr>::make(m_config.m_indexes); + auto indexes = vm::ptr::make(m_config.m_indexes); for (u32 i = 0; i < m_config.AUDIO_PORT_COUNT; i++) { if (!m_config.m_ports[i].m_is_audio_port_started) continue; @@ -439,8 +438,8 @@ int cellAudioInit() } cellAudio->Notice("Audio thread ended"); abort: - queue.Push(nullptr); - queue_float.Push(nullptr); + queue.Push(nullptr, nullptr); + queue_float.Push(nullptr, nullptr); if(do_dump) m_dump.Finalize(); @@ -505,7 +504,7 @@ int cellAudioQuit() return CELL_OK; } -int cellAudioPortOpen(vm::ptr audioParam, vm::ptr> portNum) +int cellAudioPortOpen(vm::ptr audioParam, vm::ptr portNum) { cellAudio->Warning("cellAudioPortOpen(audioParam_addr=0x%x, portNum_addr=0x%x)", audioParam.addr(), portNum.addr()); @@ -657,7 +656,7 @@ int cellAudioPortStop(u32 portNum) return CELL_OK; } -int cellAudioGetPortTimestamp(u32 portNum, u64 tag, vm::ptr> stamp) +int cellAudioGetPortTimestamp(u32 portNum, u64 tag, vm::ptr stamp) { cellAudio->Log("cellAudioGetPortTimestamp(portNum=0x%x, tag=0x%llx, stamp_addr=0x%x)", portNum, tag, stamp.addr()); @@ -685,7 +684,7 @@ int cellAudioGetPortTimestamp(u32 portNum, u64 tag, vm::ptr> stamp) return CELL_OK; } -int cellAudioGetPortBlockTag(u32 portNum, u64 blockNo, vm::ptr> tag) +int cellAudioGetPortBlockTag(u32 portNum, u64 blockNo, vm::ptr tag) { cellAudio->Log("cellAudioGetPortBlockTag(portNum=0x%x, blockNo=0x%llx, tag_addr=0x%x)", portNum, blockNo, tag.addr()); @@ -736,7 +735,7 @@ int cellAudioSetPortLevel(u32 portNum, float level) } // Utility Functions -int cellAudioCreateNotifyEventQueue(vm::ptr> id, vm::ptr> key) +int cellAudioCreateNotifyEventQueue(vm::ptr id, vm::ptr key) { cellAudio->Warning("cellAudioCreateNotifyEventQueue(id_addr=0x%x, key_addr=0x%x)", id.addr(), key.addr()); @@ -764,7 +763,7 @@ int cellAudioCreateNotifyEventQueue(vm::ptr> id, vm::ptr> ke return CELL_OK; } -int cellAudioCreateNotifyEventQueueEx(vm::ptr> id, vm::ptr> key, u32 iFlags) +int cellAudioCreateNotifyEventQueueEx(vm::ptr id, vm::ptr key, u32 iFlags) { cellAudio->Todo("cellAudioCreateNotifyEventQueueEx(id_addr=0x%x, key_addr=0x%x, iFlags=0x%x)", id.addr(), key.addr(), iFlags); return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp b/rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp new file mode 100644 index 0000000000..260c8eb9bb --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellAvconfExt.cpp @@ -0,0 +1,61 @@ +#include "stdafx.h" +#include "Ini.h" +#include "Emu/Memory/Memory.h" +#include "Emu/SysCalls/Modules.h" +#include "Emu/RSX/sysutil_video.h" + +Module *cellAvconfExt = nullptr; + +int cellVideoOutConvertCursorColor() +{ + UNIMPLEMENTED_FUNC(cellAvconfExt); + return CELL_OK; +} + +int cellVideoOutGetScreenSize(u32 videoOut, vm::ptr screenSize) +{ + cellAvconfExt->Warning("cellVideoOutGetScreenSize(videoOut=%d, screenSize_addr=0x%x)", videoOut, screenSize.addr()); + + if (!videoOut == CELL_VIDEO_OUT_PRIMARY) + return CELL_VIDEO_OUT_ERROR_UNSUPPORTED_VIDEO_OUT; + + //TODO: Use virtual screen size +#ifdef _WIN32 + HDC screen = GetDC(NULL); + float diagonal = round(sqrt((pow(GetDeviceCaps(screen, HORZSIZE), 2) + pow(GetDeviceCaps(screen, VERTSIZE), 2))) * 0.0393); +#else + // TODO: Linux implementation, without using wx + // float diagonal = round(sqrt((pow(wxGetDisplaySizeMM().GetWidth(), 2) + pow(wxGetDisplaySizeMM().GetHeight(), 2))) * 0.0393); +#endif + + if (Ini.GS3DTV.GetValue()) + { +#ifdef _WIN32 + *screenSize = diagonal; +#endif + return CELL_OK; + } + + return CELL_VIDEO_OUT_ERROR_VALUE_IS_NOT_SET; +} + +int cellVideoOutGetGamma() +{ + UNIMPLEMENTED_FUNC(cellAvconfExt); + return CELL_OK; +} + +int cellVideoOutSetGamma() +{ + UNIMPLEMENTED_FUNC(cellAvconfExt); + return CELL_OK; +} + +void cellAvconfExt_init(Module *pxThis) +{ + cellAvconfExt = pxThis; + + cellAvconfExt->AddFunc(0x4ec8c141, cellVideoOutConvertCursorColor); + cellAvconfExt->AddFunc(0xfaa275a4, cellVideoOutGetScreenSize); + cellAvconfExt->AddFunc(0xc7020f62, cellVideoOutSetGamma); +} \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp b/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp index 7a364deb36..c0fe253842 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellCamera.cpp @@ -53,18 +53,30 @@ int cellCameraOpen() int cellCameraOpenEx() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraClose() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraGetDeviceGUID() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } @@ -72,6 +84,9 @@ int cellCameraGetType(s32 dev_num, vm::ptr type) { cellCamera->Warning("cellCameraGetType(dev_num=%d, type_addr=0x%x)", dev_num, type); + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + switch (Ini.CameraType.GetValue()) { case 1: *type = CELL_CAMERA_EYETOY; break; @@ -110,18 +125,30 @@ int cellCameraIsStarted() int cellCameraGetAttribute() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraSetAttribute() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraGetBufferSize() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } @@ -134,6 +161,10 @@ int cellCameraGetBufferInfo() int cellCameraGetBufferInfoEx() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } @@ -164,63 +195,108 @@ int cellCameraSetExtensionUnit() int cellCameraReset() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraStart() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraRead() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraReadEx() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraReadComplete() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraStop() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraSetNotifyEventQueue() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraRemoveNotifyEventQueue() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraSetNotifyEventQueue2() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } int cellCameraRemoveNotifyEventQueue2() { UNIMPLEMENTED_FUNC(cellCamera); + + if (!cellCameraInstance.m_bInitialized) + return CELL_CAMERA_ERROR_NOT_INIT; + return CELL_OK; } +void cellCamera_unload() +{ + cellCameraInstance.m_bInitialized = false; +} + void cellCamera_init(Module* pxThis) { cellCamera = pxThis; diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index 3e715a2dfb..5d4acc0f30 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -62,7 +62,11 @@ bool ElementaryStream::is_full() { if (released < put_count) { - u32 first = entries.Peek(); + u32 first; + if (!entries.Peek(first, &dmux->is_closed)) + { + return false; + } if (first >= put) { return (first - put) < GetMaxAU(); @@ -136,9 +140,10 @@ void ElementaryStream::finish(DemuxerStream& stream) // not multithread-safe (or put_count++; //if (fidMajor != 0xbd) LOG_NOTICE(HLE, "<<< es::finish(): peek=0x%x, first=0x%x, put=0x%x, size=0x%x", peek, first, put, size); } - if (!entries.Push(addr)) + if (!entries.Push(addr, &sq_no_wait)) { cellDmux->Error("es::finish() aborted (no space)"); + Emu.Pause(); } } @@ -196,10 +201,15 @@ bool ElementaryStream::release() if (released >= put_count) { cellDmux->Error("es::release(): buffer is empty"); + Emu.Pause(); return false; } - u32 addr = entries.Peek(); + u32 addr; + if (!entries.Peek(addr, &dmux->is_closed)) + { + return false; // ??? + } auto info = vm::ptr::make(addr); //if (fidMajor != 0xbd) LOG_WARNING(HLE, "es::release(): (%s) size = 0x%x, info = 0x%x, pts = 0x%x", @@ -208,13 +218,15 @@ bool ElementaryStream::release() if (released >= peek_count) { cellDmux->Error("es::release(): buffer has not been seen yet"); + Emu.Pause(); return false; } released++; - if (!entries.Pop(addr)) + if (!entries.Pop(addr, &sq_no_wait)) { cellDmux->Error("es::release(): entries.Pop() aborted (no entries found)"); + Emu.Pause(); return false; } //if (fidMajor != 0xbd) LOG_NOTICE(HLE, "<<< es::release(): peek=0x%x, first=0x%x, put=0x%x, size=0x%x", peek, first, put, size); @@ -235,7 +247,12 @@ bool ElementaryStream::peek(u32& out_data, bool no_ex, u32& out_spec, bool updat return false; } - u32 addr = entries.Peek(peek_count - released); + u32 addr; + if (!entries.Peek(addr, &dmux->is_closed, peek_count - released)) + { + return false; // ??? + } + auto info = vm::ptr::make(addr); //if (fidMajor != 0xbd) LOG_WARNING(HLE, "es::peek(%sAu(Ex)): (%s) size = 0x%x, info = 0x%x, pts = 0x%x", //wxString(update_index ? "Get" : "Peek").wx_str(), @@ -309,7 +326,7 @@ u32 dmuxOpen(Demuxer* data) cellDmux->Notice("Demuxer thread started (mem=0x%x, size=0x%x, cb=0x%x, arg=0x%x)", dmux.memAddr, dmux.memSize, dmux.cbFunc, dmux.cbArg); DemuxerTask task; - DemuxerStream stream; + DemuxerStream stream = {}; ElementaryStream* esALL[192]; memset(esALL, 0, sizeof(esALL)); ElementaryStream** esAVC = &esALL[0]; // AVC (max 16) ElementaryStream** esM2V = &esALL[16]; // MPEG-2 (max 16) @@ -320,17 +337,14 @@ u32 dmuxOpen(Demuxer* data) u32 cb_add = 0; - u32 updates_count = 0; - u32 updates_signaled = 0; - while (true) { - if (Emu.IsStopped()) + if (Emu.IsStopped() || dmux.is_closed) { break; } - if (!dmux.job.GetCountUnsafe() && dmux.is_running) + if (!dmux.job.Peek(task, &sq_no_wait) && dmux.is_running && stream.addr) { // default task (demuxing) (if there is no other work) be_t code; @@ -339,168 +353,149 @@ u32 dmuxOpen(Demuxer* data) if (!stream.peek(code)) { - dmux.is_running = false; // demuxing finished auto dmuxMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); dmuxMsg->msgType = CELL_DMUX_MSG_TYPE_DEMUX_DONE; dmuxMsg->supplementalInfo = stream.userdata; dmux.cbFunc.call(*dmux.dmuxCb, dmux.id, dmuxMsg, dmux.cbArg); - updates_signaled++; + dmux.is_running = false; } else switch (code.ToLE()) { case PACK_START_CODE: - { - stream.skip(14); - } - break; + { + stream.skip(14); + } + break; case SYSTEM_HEADER_START_CODE: - { - stream.skip(18); - } - break; + { + stream.skip(18); + } + break; case PADDING_STREAM: - { - stream.skip(4); - stream.get(len); - stream.skip(len); - } - break; + { + stream.skip(4); + stream.get(len); + stream.skip(len); + } + break; case PRIVATE_STREAM_2: - { - stream.skip(4); - stream.get(len); - stream.skip(len); - } - break; + { + stream.skip(4); + stream.get(len); + stream.skip(len); + } + break; case PRIVATE_STREAM_1: + { + DemuxerStream backup = stream; + + // audio AT3+ (and probably LPCM or user data) + stream.skip(4); + stream.get(len); + + PesHeader pes(stream); + + // read additional header: + stream.peek(ch); // ??? + //stream.skip(4); + //pes.size += 4; + + if (esATX[ch]) { - DemuxerStream backup = stream; + ElementaryStream& es = *esATX[ch]; + if (es.isfull()) + { + stream = backup; + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + continue; + } - // audio AT3+ (and probably LPCM or user data) stream.skip(4); - stream.get(len); + len -= 4; - PesHeader pes(stream); - - if (!pes.new_au) // temporarily - { - cellDmux->Error("No pts info found"); - } - - // read additional header: - stream.peek(ch); // ??? - //stream.skip(4); - //pes.size += 4; - - if (esATX[ch]) - { - ElementaryStream& es = *esATX[ch]; - if (es.isfull()) - { - stream = backup; - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - } - - /*if (es.hasunseen()) // hack, probably useless - { - stream = backup; - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - }*/ - - stream.skip(4); - len -= 4; - - es.push(stream, len - pes.size - 3, pes); - es.finish(stream); - //LOG_NOTICE(HLE, "*** AT3+ AU sent (len=0x%x, pts=0x%llx)", len - pes.size - 3, pes.pts); + es.push(stream, len - pes.size - 3, pes); + es.finish(stream); + //LOG_NOTICE(HLE, "*** AT3+ AU sent (len=0x%x, pts=0x%llx)", len - pes.size - 3, pes.pts); - auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); - esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_AU_FOUND; - esMsg->supplementalInfo = stream.userdata; - es.cbFunc.call(*dmux.dmuxCb, dmux.id, es.id, esMsg, es.cbArg); - } - else - { - stream.skip(len - pes.size - 3); - } + auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); + esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_AU_FOUND; + esMsg->supplementalInfo = stream.userdata; + es.cbFunc.call(*dmux.dmuxCb, dmux.id, es.id, esMsg, es.cbArg); } - break; + else + { + stream.skip(len - pes.size - 3); + } + } + break; case 0x1e0: case 0x1e1: case 0x1e2: case 0x1e3: case 0x1e4: case 0x1e5: case 0x1e6: case 0x1e7: case 0x1e8: case 0x1e9: case 0x1ea: case 0x1eb: case 0x1ec: case 0x1ed: case 0x1ee: case 0x1ef: + { + // video AVC + ch = code - 0x1e0; + if (esAVC[ch]) { - // video AVC - ch = code - 0x1e0; - if (esAVC[ch]) + ElementaryStream& es = *esAVC[ch]; + if (es.isfull()) { - ElementaryStream& es = *esAVC[ch]; - if (es.isfull()) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + continue; + } - DemuxerStream backup = stream; + DemuxerStream backup = stream; - stream.skip(4); - stream.get(len); - PesHeader pes(stream); + stream.skip(4); + stream.get(len); + PesHeader pes(stream); - if (es.freespace() < (u32)(len + 6)) - { - pes.new_au = true; - } + if (es.freespace() < (u32)(len + 6)) + { + pes.new_au = true; + } - if (pes.new_au && es.hasdata()) // new AU detected - { - /*if (es.hasunseen()) // hack, probably useless - { - stream = backup; - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - }*/ - es.finish(stream); - // callback - auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); - esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_AU_FOUND; - esMsg->supplementalInfo = stream.userdata; - es.cbFunc.call(*dmux.dmuxCb, dmux.id, es.id, esMsg, es.cbArg); - } + if (pes.new_au && es.hasdata()) // new AU detected + { + es.finish(stream); + // callback + auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); + esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_AU_FOUND; + esMsg->supplementalInfo = stream.userdata; + es.cbFunc.call(*dmux.dmuxCb, dmux.id, es.id, esMsg, es.cbArg); + } - if (pes.new_au) - { - //LOG_NOTICE(HLE, "*** AVC AU detected (pts=0x%llx, dts=0x%llx)", pes.pts, pes.dts); - } + if (pes.new_au) + { + //LOG_NOTICE(HLE, "*** AVC AU detected (pts=0x%llx, dts=0x%llx)", pes.pts, pes.dts); + } - if (es.isfull()) - { - stream = backup; - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - } - - //reconstruction of MPEG2-PS stream for vdec module + if (es.isfull()) + { stream = backup; - es.push(stream, len + 6 /*- pes.size - 3*/, pes); - } - else - { - stream.skip(4); - stream.get(len); - stream.skip(len); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + continue; } + + //reconstruction of MPEG2-PS stream for vdec module + stream = backup; + es.push(stream, len + 6 /*- pes.size - 3*/, pes); } - break; + else + { + stream.skip(4); + stream.get(len); + stream.skip(len); + } + } + break; case 0x1c0: case 0x1c1: case 0x1c2: case 0x1c3: case 0x1c4: case 0x1c5: case 0x1c6: case 0x1c7: @@ -510,34 +505,33 @@ u32 dmuxOpen(Demuxer* data) case 0x1d4: case 0x1d5: case 0x1d6: case 0x1d7: case 0x1d8: case 0x1d9: case 0x1da: case 0x1db: case 0x1dc: case 0x1dd: case 0x1de: case 0x1df: - { - // unknown - cellDmux->Warning("Unknown MPEG stream found"); - stream.skip(4); - stream.get(len); - stream.skip(len); - } - break; + { + // unknown + cellDmux->Warning("Unknown MPEG stream found"); + stream.skip(4); + stream.get(len); + stream.skip(len); + } + break; case USER_DATA_START_CODE: - { - cellDmux->Error("USER_DATA_START_CODE found"); - return; - } + { + cellDmux->Error("USER_DATA_START_CODE found"); + Emu.Pause(); + return; + } default: - { - // search - stream.skip(1); - } - break; - + { + // search + stream.skip(1); + } } continue; } // wait for task with yielding (if no default work) - if (!dmux.job.Pop(task)) + if (!dmux.job.Pop(task, &dmux.is_closed)) { break; // Emu is stopped } @@ -545,147 +539,129 @@ u32 dmuxOpen(Demuxer* data) switch (task.type) { case dmuxSetStream: + { + if (task.stream.discontinuity) { - if (task.stream.discontinuity) + cellDmux->Warning("dmuxSetStream (beginning)"); + for (u32 i = 0; i < 192; i++) { - cellDmux->Warning("dmuxSetStream (beginning)"); - for (u32 i = 0; i < 192; i++) + if (esALL[i]) { - if (esALL[i]) - { - esALL[i]->reset(); - } + esALL[i]->reset(); } - updates_count = 0; - updates_signaled = 0; } - - if (updates_count != updates_signaled) - { - cellDmux->Error("dmuxSetStream: stream update inconsistency (input=%d, signaled=%d)", updates_count, updates_signaled); - return; - } - - updates_count++; - stream = task.stream; - //LOG_NOTICE(HLE, "*** stream updated(addr=0x%x, size=0x%x, discont=%d, userdata=0x%llx)", - //stream.addr, stream.size, stream.discontinuity, stream.userdata); - - dmux.is_running = true; - dmux.fbSetStream.Push(task.stream.addr); // feedback } - break; + + stream = task.stream; + //LOG_NOTICE(HLE, "*** stream updated(addr=0x%x, size=0x%x, discont=%d, userdata=0x%llx)", + //stream.addr, stream.size, stream.discontinuity, stream.userdata); + } + break; case dmuxResetStream: case dmuxResetStreamAndWaitDone: - { - auto dmuxMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); - dmuxMsg->msgType = CELL_DMUX_MSG_TYPE_DEMUX_DONE; - dmuxMsg->supplementalInfo = stream.userdata; - dmux.cbFunc.call(*dmux.dmuxCb, dmux.id, dmuxMsg, dmux.cbArg); + { + auto dmuxMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); + dmuxMsg->msgType = CELL_DMUX_MSG_TYPE_DEMUX_DONE; + dmuxMsg->supplementalInfo = stream.userdata; + dmux.cbFunc.call(*dmux.dmuxCb, dmux.id, dmuxMsg, dmux.cbArg); - updates_signaled++; - dmux.is_running = false; - if (task.type == dmuxResetStreamAndWaitDone) - { - dmux.fbSetStream.Push(0); - } - } - break; - - case dmuxClose: - { - dmux.is_finished = true; - cellDmux->Notice("Demuxer thread ended"); - return; - } + stream = {}; + dmux.is_running = false; + //if (task.type == dmuxResetStreamAndWaitDone) + //{ + //} + } + break; case dmuxEnableEs: + { + ElementaryStream& es = *task.es.es_ptr; + if (es.fidMajor >= 0xe0 && + es.fidMajor <= 0xef && + es.fidMinor == 0 && + es.sup1 == 1 && + es.sup2 == 0) { - ElementaryStream& es = *task.es.es_ptr; - if (es.fidMajor >= 0xe0 && - es.fidMajor <= 0xef && - es.fidMinor == 0 && - es.sup1 == 1 && - es.sup2 == 0) - { - esAVC[es.fidMajor - 0xe0] = task.es.es_ptr; - } - else if (es.fidMajor == 0xbd && - es.fidMinor == 0 && - es.sup1 == 0 && - es.sup2 == 0) - { - esATX[0] = task.es.es_ptr; - } - else - { - cellDmux->Warning("dmuxEnableEs: (TODO) unsupported filter (0x%x, 0x%x, 0x%x, 0x%x)", es.fidMajor, es.fidMinor, es.sup1, es.sup2); - } - es.dmux = &dmux; + esAVC[es.fidMajor - 0xe0] = task.es.es_ptr; } - break; + else if (es.fidMajor == 0xbd && + es.fidMinor == 0 && + es.sup1 == 0 && + es.sup2 == 0) + { + esATX[0] = task.es.es_ptr; + } + else + { + cellDmux->Warning("dmuxEnableEs: (TODO) unsupported filter (0x%x, 0x%x, 0x%x, 0x%x)", es.fidMajor, es.fidMinor, es.sup1, es.sup2); + } + es.dmux = &dmux; + } + break; case dmuxDisableEs: + { + ElementaryStream& es = *task.es.es_ptr; + if (es.dmux != &dmux) { - ElementaryStream& es = *task.es.es_ptr; - if (es.dmux != &dmux) - { - cellDmux->Warning("dmuxDisableEs: invalid elementary stream"); - break; - } - for (u32 i = 0; i < 192; i++) - { - if (esALL[i] == &es) - { - esALL[i] = nullptr; - } - } - es.dmux = nullptr; - Emu.GetIdManager().RemoveID(task.es.es); + cellDmux->Warning("dmuxDisableEs: invalid elementary stream"); + break; } - break; - - /*case dmuxReleaseAu: + for (u32 i = 0; i < 192; i++) { - task.es.es_ptr->release(); + if (esALL[i] == &es) + { + esALL[i] = nullptr; + } } - break;*/ + es.dmux = nullptr; + Emu.GetIdManager().RemoveID(task.es.es); + } + break; case dmuxFlushEs: + { + ElementaryStream& es = *task.es.es_ptr; + + if (es.hasdata()) { - ElementaryStream& es = *task.es.es_ptr; - - if (es.hasdata()) - { - es.finish(stream); - // callback - auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); - esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_AU_FOUND; - esMsg->supplementalInfo = stream.userdata; - es.cbFunc.call(*dmux.dmuxCb, dmux.id, es.id, esMsg, es.cbArg); - } - + es.finish(stream); // callback auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); - esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_FLUSH_DONE; + esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_AU_FOUND; esMsg->supplementalInfo = stream.userdata; es.cbFunc.call(*dmux.dmuxCb, dmux.id, es.id, esMsg, es.cbArg); } - break; + + // callback + auto esMsg = vm::ptr::make(a128(dmux.memAddr) + (cb_add ^= 16)); + esMsg->msgType = CELL_DMUX_ES_MSG_TYPE_FLUSH_DONE; + esMsg->supplementalInfo = stream.userdata; + es.cbFunc.call(*dmux.dmuxCb, dmux.id, es.id, esMsg, es.cbArg); + } + break; case dmuxResetEs: - { - task.es.es_ptr->reset(); - } - break; + { + task.es.es_ptr->reset(); + } + break; + + case dmuxClose: break; default: + { cellDmux->Error("Demuxer thread error: unknown task(%d)", task.type); + Emu.Pause(); return; + } } } - cellDmux->Warning("Demuxer thread aborted"); + + dmux.is_finished = true; + if (Emu.IsStopped()) cellDmux->Warning("Demuxer thread aborted"); + if (dmux.is_closed) cellDmux->Notice("Demuxer thread ended"); }); t.detach(); @@ -720,7 +696,7 @@ int cellDmuxQueryAttr2(vm::ptr demuxerType2, vm::ptr demuxerType, vm::ptr demuxerResource, - vm::ptr demuxerCb, vm::ptr> demuxerHandle) + vm::ptr demuxerCb, vm::ptr demuxerHandle) { cellDmux->Warning("cellDmuxOpen(demuxerType_addr=0x%x, demuxerResource_addr=0x%x, demuxerCb_addr=0x%x, demuxerHandle_addr=0x%x)", demuxerType.addr(), demuxerResource.addr(), demuxerCb.addr(), demuxerHandle.addr()); @@ -738,7 +714,7 @@ int cellDmuxOpen(vm::ptr demuxerType, vm::ptr demuxerType, vm::ptr demuxerResourceEx, - vm::ptr demuxerCb, vm::ptr> demuxerHandle) + vm::ptr demuxerCb, vm::ptr demuxerHandle) { cellDmux->Warning("cellDmuxOpenEx(demuxerType_addr=0x%x, demuxerResourceEx_addr=0x%x, demuxerCb_addr=0x%x, demuxerHandle_addr=0x%x)", demuxerType.addr(), demuxerResourceEx.addr(), demuxerCb.addr(), demuxerHandle.addr()); @@ -756,7 +732,7 @@ int cellDmuxOpenEx(vm::ptr demuxerType, vm::ptr demuxerType2, vm::ptr demuxerResource2, - vm::ptr demuxerCb, vm::ptr> demuxerHandle) + vm::ptr demuxerCb, vm::ptr demuxerHandle) { cellDmux->Warning("cellDmuxOpen2(demuxerType2_addr=0x%x, demuxerResource2_addr=0x%x, demuxerCb_addr=0x%x, demuxerHandle_addr=0x%x)", demuxerType2.addr(), demuxerResource2.addr(), demuxerCb.addr(), demuxerHandle.addr()); @@ -783,7 +759,8 @@ int cellDmuxClose(u32 demuxerHandle) return CELL_DMUX_ERROR_ARG; } - dmux->job.Push(DemuxerTask(dmuxClose)); + dmux->is_closed = true; + dmux->job.Push(DemuxerTask(dmuxClose), &sq_no_wait); while (!dmux->is_finished) { @@ -812,14 +789,9 @@ int cellDmuxSetStream(u32 demuxerHandle, const u32 streamAddress, u32 streamSize return CELL_DMUX_ERROR_ARG; } - if (dmux->is_running) + if (dmux->is_running.exchange(true)) { - if (Emu.IsStopped()) - { - cellDmux->Warning("cellDmuxSetStream(%d) aborted (waiting)", demuxerHandle); - return CELL_OK; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_DMUX_ERROR_BUSY; } @@ -830,19 +802,7 @@ int cellDmuxSetStream(u32 demuxerHandle, const u32 streamAddress, u32 streamSize info.discontinuity = discontinuity; info.userdata = userData; - dmux->job.Push(task); - - u32 addr; - if (!dmux->fbSetStream.Pop(addr)) - { - cellDmux->Warning("cellDmuxSetStream(%d) aborted (fbSetStream.Pop())", demuxerHandle); - return CELL_OK; - } - if (addr != info.addr) - { - cellDmux->Error("cellDmuxSetStream(%d): wrong stream queued (right=0x%x, queued=0x%x)", demuxerHandle, info.addr, addr); - Emu.Pause(); - } + dmux->job.Push(task, &dmux->is_closed); return CELL_OK; } @@ -856,8 +816,7 @@ int cellDmuxResetStream(u32 demuxerHandle) return CELL_DMUX_ERROR_ARG; } - dmux->job.Push(DemuxerTask(dmuxResetStream)); - + dmux->job.Push(DemuxerTask(dmuxResetStream), &dmux->is_closed); return CELL_OK; } @@ -871,18 +830,15 @@ int cellDmuxResetStreamAndWaitDone(u32 demuxerHandle) return CELL_DMUX_ERROR_ARG; } - dmux->job.Push(DemuxerTask(dmuxResetStreamAndWaitDone)); - - u32 addr; - if (!dmux->fbSetStream.Pop(addr)) + dmux->job.Push(DemuxerTask(dmuxResetStreamAndWaitDone), &dmux->is_closed); + while (dmux->is_running && !dmux->is_closed) // TODO: ensure that it is safe { - cellDmux->Warning("cellDmuxResetStreamAndWaitDone(%d) aborted (fbSetStream.Pop())", demuxerHandle); - return CELL_OK; - } - if (addr != 0) - { - cellDmux->Error("cellDmuxResetStreamAndWaitDone(%d): wrong stream queued (0x%x)", demuxerHandle, addr); - Emu.Pause(); + if (Emu.IsStopped()) + { + cellDmux->Warning("cellDmuxResetStreamAndWaitDone(%d) aborted", demuxerHandle); + return CELL_OK; + } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); } return CELL_OK; } @@ -899,7 +855,6 @@ int cellDmuxQueryEsAttr(vm::ptr demuxerType, vm::ptr demuxerType2, vm::ptrstreamSpecificInfo_addr, esFilterId, esSpecificInfo_addr, esAttr); return CELL_OK; } int cellDmuxEnableEs(u32 demuxerHandle, vm::ptr esFilterId, vm::ptr esResourceInfo, vm::ptr esCb, - const u32 esSpecificInfo_addr, vm::ptr> esHandle) + const u32 esSpecificInfo_addr, vm::ptr esHandle) { cellDmux->Warning("cellDmuxEnableEs(demuxerHandle=%d, esFilterId_addr=0x%x, esResourceInfo_addr=0x%x, esCb_addr=0x%x, " "esSpecificInfo_addr=0x%x, esHandle_addr=0x%x)", demuxerHandle, esFilterId.addr(), esResourceInfo.addr(), @@ -946,13 +900,13 @@ int cellDmuxEnableEs(u32 demuxerHandle, vm::ptr esFil *esHandle = id; cellDmux->Warning("*** New ES(dmux=%d, addr=0x%x, size=0x%x, filter(0x%x, 0x%x, 0x%x, 0x%x), cb=0x%x(arg=0x%x), spec=0x%x): id = %d", - demuxerHandle, es->memAddr, es->memSize, es->fidMajor, es->fidMinor, es->sup1, es->sup2, (u32)esCb->cbEsMsgFunc, es->cbArg, es->spec, id); + demuxerHandle, es->memAddr, es->memSize, es->fidMajor, es->fidMinor, es->sup1, es->sup2, esCb->cbEsMsgFunc.addr(), es->cbArg, es->spec, id); DemuxerTask task(dmuxEnableEs); task.es.es = id; task.es.es_ptr = es; - dmux->job.Push(task); + dmux->job.Push(task, &dmux->is_closed); return CELL_OK; } @@ -970,7 +924,7 @@ int cellDmuxDisableEs(u32 esHandle) task.es.es = esHandle; task.es.es_ptr = es; - es->dmux->job.Push(task); + es->dmux->job.Push(task, &es->dmux->is_closed); return CELL_OK; } @@ -988,11 +942,11 @@ int cellDmuxResetEs(u32 esHandle) task.es.es = esHandle; task.es.es_ptr = es; - es->dmux->job.Push(task); + es->dmux->job.Push(task, &es->dmux->is_closed); return CELL_OK; } -int cellDmuxGetAu(u32 esHandle, vm::ptr> auInfo_ptr, vm::ptr> auSpecificInfo_ptr) +int cellDmuxGetAu(u32 esHandle, vm::ptr auInfo_ptr, vm::ptr auSpecificInfo_ptr) { cellDmux->Log("cellDmuxGetAu(esHandle=0x%x, auInfo_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", esHandle, auInfo_ptr.addr(), auSpecificInfo_ptr.addr()); @@ -1015,7 +969,7 @@ int cellDmuxGetAu(u32 esHandle, vm::ptr> auInfo_ptr, vm::ptr return CELL_OK; } -int cellDmuxPeekAu(u32 esHandle, vm::ptr> auInfo_ptr, vm::ptr> auSpecificInfo_ptr) +int cellDmuxPeekAu(u32 esHandle, vm::ptr auInfo_ptr, vm::ptr auSpecificInfo_ptr) { cellDmux->Log("cellDmuxPeekAu(esHandle=0x%x, auInfo_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", esHandle, auInfo_ptr.addr(), auSpecificInfo_ptr.addr()); @@ -1038,7 +992,7 @@ int cellDmuxPeekAu(u32 esHandle, vm::ptr> auInfo_ptr, vm::ptr> auInfoEx_ptr, vm::ptr> auSpecificInfo_ptr) +int cellDmuxGetAuEx(u32 esHandle, vm::ptr auInfoEx_ptr, vm::ptr auSpecificInfo_ptr) { cellDmux->Log("cellDmuxGetAuEx(esHandle=0x%x, auInfoEx_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", esHandle, auInfoEx_ptr.addr(), auSpecificInfo_ptr.addr()); @@ -1061,7 +1015,7 @@ int cellDmuxGetAuEx(u32 esHandle, vm::ptr> auInfoEx_ptr, vm::ptr> auInfoEx_ptr, vm::ptr> auSpecificInfo_ptr) +int cellDmuxPeekAuEx(u32 esHandle, vm::ptr auInfoEx_ptr, vm::ptr auSpecificInfo_ptr) { cellDmux->Log("cellDmuxPeekAuEx(esHandle=0x%x, auInfoEx_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", esHandle, auInfoEx_ptr.addr(), auSpecificInfo_ptr.addr()); @@ -1115,7 +1069,7 @@ int cellDmuxFlushEs(u32 esHandle) task.es.es = esHandle; task.es.es_ptr = es; - es->dmux->job.Push(task); + es->dmux->job.Push(task, &es->dmux->is_closed); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.h b/rpcs3/Emu/SysCalls/Modules/cellDmux.h index 5c41043952..0eca5daef0 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.h +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.h @@ -408,19 +408,20 @@ class Demuxer { public: SQueue job; - SQueue fbSetStream; const u32 memAddr; const u32 memSize; const vm::ptr cbFunc; const u32 cbArg; u32 id; volatile bool is_finished; - volatile bool is_running; + volatile bool is_closed; + std::atomic is_running; PPUThread* dmuxCb; Demuxer(u32 addr, u32 size, vm::ptr func, u32 arg) : is_finished(false) + , is_closed(false) , is_running(false) , memAddr(addr) , memSize(size) diff --git a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp index 010f69c9e7..59130605eb 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellFont.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellFont.cpp @@ -383,7 +383,7 @@ int cellFontGetEffectSlant(vm::ptr font, vm::ptr> slantPar return CELL_FONT_OK; } -int cellFontGetFontIdCode(vm::ptr font, u32 code, vm::ptr> fontId, vm::ptr> fontCode) +int cellFontGetFontIdCode(vm::ptr font, u32 code, vm::ptr fontId, vm::ptr fontCode) { cellFont->Todo("cellFontGetFontIdCode(font_addr=0x%x, code=0x%x, fontId_addr=0x%x, fontCode_addr=0x%x", font.addr(), code, fontId.addr(), fontCode.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp index 5d12d644fe..8f1e997069 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGame.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGame.cpp @@ -15,7 +15,7 @@ Module *cellGame = nullptr; std::string contentInfo = ""; std::string usrdir = ""; -int cellGameBootCheck(vm::ptr> type, vm::ptr> attributes, vm::ptr size, vm::ptr dirName) +int cellGameBootCheck(vm::ptr type, vm::ptr attributes, vm::ptr size, vm::ptr dirName) { cellGame->Warning("cellGameBootCheck(type_addr=0x%x, attributes_addr=0x%x, size_addr=0x%x, dirName_addr=0x%x)", type.addr(), attributes.addr(), size.addr(), dirName.addr()); @@ -30,7 +30,7 @@ int cellGameBootCheck(vm::ptr> type, vm::ptr> attributes, vm size->sysSizeKB = 0; } - vfsFile f("/app_home/PARAM.SFO"); + vfsFile f("/app_home/../PARAM.SFO"); if (!f.IsOpened()) { cellGame->Error("cellGameBootCheck(): CELL_GAME_ERROR_ACCESS_ERROR (cannot open PARAM.SFO)"); @@ -100,7 +100,7 @@ int cellGamePatchCheck(vm::ptr size, u32 reserved_addr) size->sysSizeKB = 0; } - vfsFile f("/app_home/PARAM.SFO"); + vfsFile f("/app_home/../PARAM.SFO"); if (!f.IsOpened()) { cellGame->Error("cellGamePatchCheck(): CELL_GAME_ERROR_ACCESS_ERROR (cannot open PARAM.SFO)"); @@ -180,6 +180,12 @@ int cellGameContentPermit(vm::ptr contentInfoPath, vm: { cellGame->Warning("cellGameContentPermit(contentInfoPath_addr=0x%x, usrdirPath_addr=0x%x)", contentInfoPath.addr(), usrdirPath.addr()); + + if (!contentInfoPath && !usrdirPath) + { + cellGame->Warning("cellGameContentPermit(): CELL_GAME_ERROR_PARAM"); + return CELL_GAME_ERROR_PARAM; + } if (contentInfo == "" && usrdir == "") { @@ -325,12 +331,12 @@ int cellGameDeleteGameData() return CELL_OK; } -int cellGameGetParamInt(u32 id, vm::ptr> value) +int cellGameGetParamInt(u32 id, vm::ptr value) { cellGame->Warning("cellGameGetParamInt(id=%d, value_addr=0x%x)", id, value.addr()); // TODO: Access through cellGame***Check functions - vfsFile f("/app_home/PARAM.SFO"); + vfsFile f("/app_home/../PARAM.SFO"); PSFLoader psf(f); if(!psf.Load(false)) return CELL_GAME_ERROR_FAILURE; @@ -353,7 +359,7 @@ int cellGameGetParamString(u32 id, vm::ptr buf, u32 bufsize) cellGame->Warning("cellGameGetParamString(id=%d, buf_addr=0x%x, bufsize=%d)", id, buf.addr(), bufsize); // TODO: Access through cellGame***Check functions - vfsFile f("/app_home/PARAM.SFO"); + vfsFile f("/app_home/../PARAM.SFO"); PSFLoader psf(f); if(!psf.Load(false)) return CELL_GAME_ERROR_FAILURE; diff --git a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp index b6cd5faf21..f51efc2615 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGcmSys.cpp @@ -43,29 +43,29 @@ u32 map_offset_pos = 0; u32 gcmGetLocalMemorySize(u32 sdk_version) { if (sdk_version >= 0x00220000) { - return 0x0F900000; // 249MB + return 0x0F900000; // 249MB } if (sdk_version >= 0x00200000) { - return 0x0F200000; // 242MB + return 0x0F200000; // 242MB } if (sdk_version >= 0x00190000) { - return 0x0EA00000; // 234MB + return 0x0EA00000; // 234MB } if (sdk_version >= 0x00180000) { - return 0x0E800000; // 232MB + return 0x0E800000; // 232MB } - return 0x0E000000; // 224MB + return 0x0E000000; // 224MB } CellGcmOffsetTable offsetTable; void InitOffsetTable() { - offsetTable.ioAddress = (u32)Memory.Alloc(3072 * sizeof(u16), 1); - offsetTable.eaAddress = (u32)Memory.Alloc(512 * sizeof(u16), 1); + offsetTable.ioAddress.set(be_t::make((u32)Memory.Alloc(3072 * sizeof(u16), 1))); + offsetTable.eaAddress.set(be_t::make((u32)Memory.Alloc(512 * sizeof(u16), 1))); - memset(vm::get_ptr(offsetTable.ioAddress), 0xFF, 3072 * sizeof(u16)); - memset(vm::get_ptr(offsetTable.eaAddress), 0xFF, 512 * sizeof(u16)); + memset(offsetTable.ioAddress.get_ptr(), 0xFF, 3072 * sizeof(u16)); + memset(offsetTable.eaAddress.get_ptr(), 0xFF, 512 * sizeof(u16)); } //---------------------------------------------------------------------------- @@ -129,7 +129,7 @@ u32 cellGcmGetNotifyDataAddress(u32 index) cellGcmGetOffsetTable(table); // If entry not in use, return NULL - u16 entry = vm::read16(table->eaAddress + 241 * sizeof(u16)); + u16 entry = table->eaAddress[241]; if (entry == 0xFFFF) { return 0; } @@ -338,12 +338,12 @@ s32 _cellGcmInitBody(vm::ptr context, u32 cmdSize, u32 ioSiz if (system_mode == CELL_GCM_SYSTEM_MODE_IOMAP_512MB) { cellGcmSys->Warning("cellGcmInit(): 512MB io address space used"); - Memory.RSXIOMem.SetRange(0x50000000, 0x20000000 /*512MB*/); + Memory.RSXIOMem.SetRange(0, 0x20000000 /*512MB*/); } else { cellGcmSys->Warning("cellGcmInit(): 256MB io address space used"); - Memory.RSXIOMem.SetRange(0x50000000, 0x10000000 /*256MB*/); + Memory.RSXIOMem.SetRange(0, 0x10000000 /*256MB*/); } if(cellGcmMapEaIoAddress(ioAddress, 0, ioSize) != CELL_OK) @@ -540,7 +540,9 @@ int cellGcmSetSecondVFrequency(u32 freq) switch (freq) { case CELL_GCM_DISPLAY_FREQUENCY_59_94HZ: + cellGcmSys->Todo("Unimplemented display frequency: 59.94Hz"); case CELL_GCM_DISPLAY_FREQUENCY_SCANOUT: + cellGcmSys->Todo("Unimplemented display frequency: Scanout"); case CELL_GCM_DISPLAY_FREQUENCY_DISABLE: Emu.GetGSManager().GetRender().m_frequency_mode = freq; break; @@ -801,7 +803,8 @@ s32 cellGcmAddressToOffset(u64 address, vm::ptr> offset) cellGcmSys->Log("cellGcmAddressToOffset(address=0x%x,offset_addr=0x%x)", address, offset.addr()); // Address not on main memory or local memory - if (address >= 0xD0000000) { + if (!address || address >= 0xD0000000) { + cellGcmSys->Error("cellGcmAddressToOffset(address=0x%x,offset_addr=0x%x)", address, offset.addr()); return CELL_GCM_ERROR_FAILURE; } @@ -814,7 +817,7 @@ s32 cellGcmAddressToOffset(u64 address, vm::ptr> offset) // Address in main memory else check else { - u16 upper12Bits = vm::read16(offsetTable.ioAddress + sizeof(u16)*(address >> 20)); + u16 upper12Bits = offsetTable.ioAddress[address >> 20]; // If the address is mapped in IO if (upper12Bits != 0xFFFF) { @@ -833,7 +836,7 @@ u32 cellGcmGetMaxIoMapSize() { cellGcmSys->Log("cellGcmGetMaxIoMapSize()"); - return (u32)(Memory.RSXIOMem.GetEndAddr() - Memory.RSXIOMem.GetStartAddr() - Memory.RSXIOMem.GetReservedAmount()); + return (u32)(Memory.RSXIOMem.GetEndAddr() - Memory.RSXIOMem.GetReservedAmount()); } void cellGcmGetOffsetTable(vm::ptr table) @@ -850,7 +853,7 @@ s32 cellGcmIoOffsetToAddress(u32 ioOffset, u64 address) u64 realAddr; - if (!Memory.RSXIOMem.getRealAddr(Memory.RSXIOMem.GetStartAddr() + ioOffset, realAddr)) + if (!Memory.RSXIOMem.getRealAddr(ioOffset, realAddr)) return CELL_GCM_ERROR_FAILURE; vm::write64(address, realAddr); @@ -858,20 +861,19 @@ s32 cellGcmIoOffsetToAddress(u32 ioOffset, u64 address) return CELL_OK; } -s32 cellGcmMapEaIoAddress(u32 ea, u32 io, u32 size) +s32 gcmMapEaIoAddress(u32 ea, u32 io, u32 size, bool is_strict) { - cellGcmSys->Warning("cellGcmMapEaIoAddress(ea=0x%x, io=0x%x, size=0x%x)", ea, io, size); - if ((ea & 0xFFFFF) || (io & 0xFFFFF) || (size & 0xFFFFF)) return CELL_GCM_ERROR_FAILURE; // Check if the mapping was successfull - if (Memory.RSXIOMem.Map(ea, size, Memory.RSXIOMem.GetStartAddr() + io)) + if (Memory.RSXIOMem.Map(ea, size, io)) { // Fill the offset table for (u32 i = 0; i<(size >> 20); i++) { - vm::write16(offsetTable.ioAddress + ((ea >> 20) + i)*sizeof(u16), (io >> 20) + i); - vm::write16(offsetTable.eaAddress + ((io >> 20) + i)*sizeof(u16), (ea >> 20) + i); + offsetTable.ioAddress[(ea >> 20) + i] = (io >> 20) + i; + offsetTable.eaAddress[(io >> 20) + i] = (ea >> 20) + i; + Emu.GetGSManager().GetRender().m_strict_ordering[(io >> 20) + i] = is_strict; } } else @@ -883,10 +885,20 @@ s32 cellGcmMapEaIoAddress(u32 ea, u32 io, u32 size) return CELL_OK; } +s32 cellGcmMapEaIoAddress(u32 ea, u32 io, u32 size) +{ + cellGcmSys->Warning("cellGcmMapEaIoAddress(ea=0x%x, io=0x%x, size=0x%x)", ea, io, size); + + return gcmMapEaIoAddress(ea, io, size, false); +} + s32 cellGcmMapEaIoAddressWithFlags(u32 ea, u32 io, u32 size, u32 flags) { cellGcmSys->Warning("cellGcmMapEaIoAddressWithFlags(ea=0x%x, io=0x%x, size=0x%x, flags=0x%x)", ea, io, size, flags); - return cellGcmMapEaIoAddress(ea, io, size); // TODO: strict ordering + + assert(flags == 2 /*CELL_GCM_IOMAP_FLAG_STRICT_ORDERING*/); + + return gcmMapEaIoAddress(ea, io, size, true); } s32 cellGcmMapLocalMemory(u64 address, u64 size) @@ -910,25 +922,23 @@ s32 cellGcmMapLocalMemory(u64 address, u64 size) return CELL_OK; } -s32 cellGcmMapMainMemory(u32 ea, u32 size, vm::ptr> offset) +s32 cellGcmMapMainMemory(u32 ea, u32 size, vm::ptr offset) { cellGcmSys->Warning("cellGcmMapMainMemory(ea=0x%x,size=0x%x,offset_addr=0x%x)", ea, size, offset.addr()); - u32 io; - if ((ea & 0xFFFFF) || (size & 0xFFFFF)) return CELL_GCM_ERROR_FAILURE; - //check if the mapping was successfull - if (io = (u32)Memory.RSXIOMem.Map(ea, size, 0)) - { - // convert to offset - io = io - (u32)Memory.RSXIOMem.GetStartAddr(); + u32 io = Memory.RSXIOMem.Map(ea, size); + //check if the mapping was successfull + if (Memory.RSXIOMem.RealAddr(io) == ea) + { //fill the offset table for (u32 i = 0; i<(size >> 20); i++) { - vm::write16(offsetTable.ioAddress + ((ea >> 20) + i) * sizeof(u16), (u16)(io >> 20) + i); - vm::write16(offsetTable.eaAddress + ((io >> 20) + i) * sizeof(u16), (u16)(ea >> 20) + i); + offsetTable.ioAddress[(ea >> 20) + i] = (u16)((io >> 20) + i); + offsetTable.eaAddress[(io >> 20) + i] = (u16)((ea >> 20) + i); + Emu.GetGSManager().GetRender().m_strict_ordering[(io >> 20) + i] = false; } *offset = io; @@ -968,17 +978,17 @@ s32 cellGcmUnmapEaIoAddress(u64 ea) { cellGcmSys->Log("cellGcmUnmapEaIoAddress(ea=0x%llx)", ea); - u32 size = Memory.RSXIOMem.UnmapRealAddress(ea); - if (size) + u32 size; + if (Memory.RSXIOMem.UnmapRealAddress(ea, size)) { u64 io; ea = ea >> 20; - io = vm::read16(offsetTable.ioAddress + (ea*sizeof(u16))); + io = offsetTable.ioAddress[ea]; for (u32 i = 0; iLog("cellGcmUnmapIoAddress(io=0x%llx)", io); - u32 size = Memory.RSXIOMem.UnmapAddress(io); - if (size) + u32 size; + if (Memory.RSXIOMem.UnmapAddress(io, size)) { u64 ea; io = io >> 20; - ea = vm::read16(offsetTable.eaAddress + (io*sizeof(u16))); + ea = offsetTable.eaAddress[io]; for (u32 i = 0; i ioAddress; // u16* - be_t eaAddress; // u16* + vm::bptr ioAddress; + vm::bptr eaAddress; }; // Auxiliary functions @@ -30,7 +30,7 @@ void cellGcmGetOffsetTable(vm::ptr table); s32 cellGcmIoOffsetToAddress(u32 ioOffset, u64 address); s32 cellGcmMapEaIoAddress(u32 ea, u32 io, u32 size); s32 cellGcmMapEaIoAddressWithFlags(u32 ea, u32 io, u32 size, u32 flags); -s32 cellGcmMapMainMemory(u32 ea, u32 size, vm::ptr> offset); +s32 cellGcmMapMainMemory(u32 ea, u32 size, vm::ptr offset); s32 cellGcmReserveIoMapSize(u32 size); s32 cellGcmUnmapEaIoAddress(u64 ea); s32 cellGcmUnmapIoAddress(u64 io); diff --git a/rpcs3/Emu/SysCalls/Modules/cellGem.cpp b/rpcs3/Emu/SysCalls/Modules/cellGem.cpp index 2fc7b1eb83..d9f51ef96a 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGem.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGem.cpp @@ -21,36 +21,60 @@ cellGemInternal cellGemInstance; int cellGemCalibrate() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemClearStatusFlags() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemConvertVideoFinish() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemConvertVideoStart() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemEnableCameraPitchAngleCorrection() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemEnableMagnetometer() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } @@ -69,60 +93,100 @@ int cellGemEnd() int cellGemFilterState() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemForceRGB() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetAccelerometerPositionInDevice() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetAllTrackableHues() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetCameraState() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetEnvironmentLightingColor() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetHuePixels() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetImageState() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetInertialState() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetInfo() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } @@ -140,30 +204,50 @@ s32 cellGemGetMemorySize(be_t max_connect) int cellGemGetRGB() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetRumble() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetState() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetStatusFlags() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemGetTrackerHue() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } @@ -188,6 +272,10 @@ int cellGemInit(vm::ptr attribute) int cellGemInvalidateCalibration() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } @@ -200,57 +288,98 @@ int cellGemIsTrackableHue() int cellGemPrepareCamera() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemPrepareVideoConvert() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemReset() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemSetRumble() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemSetYaw() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemTrackHues() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemUpdateFinish() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemUpdateStart() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } int cellGemWriteExternalPort() { UNIMPLEMENTED_FUNC(cellGem); + + if (!cellGemInstance.m_bInitialized) + return CELL_GEM_ERROR_UNINITIALIZED; + return CELL_OK; } +void cellGem_unload() +{ + cellGemInstance.m_bInitialized = false; +} + void cellGem_init(Module *pxThis) { cellGem = pxThis; diff --git a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp index c39f8ec181..db9da02789 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellGifDec.cpp @@ -21,7 +21,7 @@ int cellGifDecExtCreate(u32 mainHandle, u32 threadInParam, u32 threadOutParam, u return CELL_OK; } -int cellGifDecOpen(u32 mainHandle, vm::ptr> subHandle, vm::ptr src, vm::ptr openInfo) +int cellGifDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptr src, vm::ptr openInfo) { cellGifDec->Warning("cellGifDecOpen(mainHandle=0x%x, subHandle_addr=0x%x, src_addr=0x%x, openInfo_addr=0x%x)", mainHandle, subHandle.addr(), src.addr(), openInfo.addr()); @@ -39,7 +39,7 @@ int cellGifDecOpen(u32 mainHandle, vm::ptr> subHandle, vm::ptr> fd; - int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr>::make(0), 0); + int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); current_subHandle->fd = fd->ToLE(); if (ret != CELL_OK) return CELL_GIFDEC_ERROR_OPEN_FILE; diff --git a/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp index 7039b25c65..9ac73c1584 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellJpgDec.cpp @@ -26,7 +26,7 @@ int cellJpgDecDestroy(u32 mainHandle) return CELL_OK; } -int cellJpgDecOpen(u32 mainHandle, vm::ptr> subHandle, vm::ptr src, vm::ptr openInfo) +int cellJpgDecOpen(u32 mainHandle, vm::ptr subHandle, vm::ptr src, vm::ptr openInfo) { cellJpgDec->Warning("cellJpgDecOpen(mainHandle=0x%x, subHandle_addr=0x%x, src_addr=0x%x, openInfo_addr=0x%x)", mainHandle, subHandle.addr(), src.addr(), openInfo.addr()); @@ -45,7 +45,7 @@ int cellJpgDecOpen(u32 mainHandle, vm::ptr> subHandle, vm::ptr> fd; - int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr>::make(0), 0); + int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); current_subHandle->fd = fd->ToLE(); if (ret != CELL_OK) return CELL_JPGDEC_ERROR_OPEN_FILE; diff --git a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp index ef71786077..60bae80ecc 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellL10n.cpp @@ -16,7 +16,7 @@ Module *cellL10n = nullptr; -int UTF16stoUTF8s(vm::lptrl utf16, vm::ptr> utf16_len, vm::ptr utf8, vm::ptr> utf8_len) +int UTF16stoUTF8s(vm::lptrl utf16, vm::ptr utf16_len, vm::ptr utf8, vm::ptr utf8_len) { cellL10n->Warning("UTF16stoUTF8s(utf16_addr=0x%x, utf16_len_addr=0x%x, utf8_addr=0x%x, utf8_len_addr=0x%x)", utf16.addr(), utf16_len.addr(), utf8.addr(), utf8_len.addr()); @@ -281,11 +281,11 @@ int _L10nConvertStr(int src_code, const void* src, size_t * src_len, int dst_cod #endif //TODO: Check the code in emulation. If support for UTF8/UTF16/UTF32/UCS2/UCS4 should use wider chars.. awful. -int L10nConvertStr(int src_code, vm::ptr src, vm::ptr> src_len, int dst_code, vm::ptr dst, vm::ptr> dst_len) +int L10nConvertStr(int src_code, vm::ptr src, vm::ptr src_len, int dst_code, vm::ptr dst, vm::ptr dst_len) { - cellL10n->Todo("L10nConvertStr(src_code=%d,src=0x%x,src_len=%ld,dst_code=%d,dst=0x%x,dst_len=%ld)", + cellL10n->Error("L10nConvertStr(src_code=%d, srca_addr=0x%x, src_len_addr=0x%x, dst_code=%d, dst_addr=0x%x, dst_len_addr=0x%x)", src_code, src.addr(), src_len.addr(), dst_code, dst.addr(), dst_len.addr()); - cellL10n->Todo("L10nConvertStr: 1st char at dst: %x(Hex)", *((char*)src.get_ptr())); + //cellL10n->Todo("L10nConvertStr: 1st char at dst: 0x%x", *((char*)src.get_ptr())); #ifdef _MSC_VER unsigned int srcCode = 0, dstCode = 0; //OEM code pages bool src_page_converted = _L10nCodeParse(src_code, srcCode); //Check if code is in list. diff --git a/rpcs3/Emu/SysCalls/Modules/cellMic.cpp b/rpcs3/Emu/SysCalls/Modules/cellMic.cpp index a3a665f55e..6841e37ccf 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellMic.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellMic.cpp @@ -1,40 +1,45 @@ #include "stdafx.h" -#if 0 +#include "Emu/Memory/Memory.h" +#include "Emu/System.h" +#include "Emu/SysCalls/Modules.h" -void cellMic_init(); -Module cellMic(0x0022, cellMic_init); +#include "cellMic.h" -// Error Codes -enum +Module *cellMic = nullptr; + +struct cellMicInternal { - CELL_MICIN_ERROR_ALREADY_INIT = 0x80140101, - CELL_MICIN_ERROR_SYSTEM = 0x80140102, - CELL_MICIN_ERROR_NOT_INIT = 0x80140103, - CELL_MICIN_ERROR_PARAM = 0x80140104, - CELL_MICIN_ERROR_PORT_FULL = 0x80140105, - CELL_MICIN_ERROR_ALREADY_OPEN = 0x80140106, - CELL_MICIN_ERROR_NOT_OPEN = 0x80140107, - CELL_MICIN_ERROR_NOT_RUN = 0x80140108, - CELL_MICIN_ERROR_TRANS_EVENT = 0x80140109, - CELL_MICIN_ERROR_OPEN = 0x8014010a, - CELL_MICIN_ERROR_SHAREDMEMORY = 0x8014010b, - CELL_MICIN_ERROR_MUTEX = 0x8014010c, - CELL_MICIN_ERROR_EVENT_QUEUE = 0x8014010d, - CELL_MICIN_ERROR_DEVICE_NOT_FOUND = 0x8014010e, - CELL_MICIN_ERROR_SYSTEM_NOT_FOUND = 0x8014010e, - CELL_MICIN_ERROR_FATAL = 0x8014010f, - CELL_MICIN_ERROR_DEVICE_NOT_SUPPORT = 0x80140110, + bool m_bCellMicInitialized;; + + cellMicInternal() + : m_bCellMicInitialized(false) + { + } }; +cellMicInternal CellMicInstance; + int cellMicInit() { - UNIMPLEMENTED_FUNC(cellMic); + cellMic->Warning("cellMicInit()"); + + if (CellMicInstance.m_bCellMicInitialized) + return CELL_MICIN_ERROR_ALREADY_INIT; + + CellMicInstance.m_bCellMicInitialized = true; + return CELL_OK; } int cellMicEnd() { - UNIMPLEMENTED_FUNC(cellMic); + cellMic->Warning("cellMicEnd()"); + + if (!CellMicInstance.m_bCellMicInitialized) + return CELL_MICIN_ERROR_NOT_INIT; + + CellMicInstance.m_bCellMicInitialized = false; + return CELL_OK; } @@ -278,54 +283,60 @@ int cellMicGetDeviceIdentifier() return CELL_OK; } -void cellMic_init() +void cellMic_unload() { - cellMic.AddFunc(0x8325e02d, cellMicInit); - cellMic.AddFunc(0xc6328caa, cellMicEnd); - cellMic.AddFunc(0xdd1b59f0, cellMicOpen); - cellMic.AddFunc(0x8d229f8e, cellMicClose); - - cellMic.AddFunc(0x017024a8, cellMicGetDeviceGUID); - cellMic.AddFunc(0xa52d2ae4, cellMicGetType); - cellMic.AddFunc(0x1b42101b, cellMicIsAttached); - cellMic.AddFunc(0x186cb1fb, cellMicIsOpen); - cellMic.AddFunc(0x6a024aa0, cellMicGetDeviceAttr); - cellMic.AddFunc(0xb2c16321, cellMicSetDeviceAttr); - cellMic.AddFunc(0xac5ba03a, cellMicGetSignalAttr); - cellMic.AddFunc(0x323deb41, cellMicSetSignalAttr); - cellMic.AddFunc(0xb30780eb, cellMicGetSignalState); - - cellMic.AddFunc(0xdd724314, cellMicStart); - cellMic.AddFunc(0x07e1b12c, cellMicRead); - cellMic.AddFunc(0xfcfaf246, cellMicStop); - cellMic.AddFunc(0x6bc46aab, cellMicReset); - - cellMic.AddFunc(0x7903400e, cellMicSetNotifyEventQueue); - cellMic.AddFunc(0x6cc7ae00, cellMicSetNotifyEventQueue2); - cellMic.AddFunc(0x65336418, cellMicRemoveNotifyEventQueue); - - cellMic.AddFunc(0x05709bbf, cellMicOpenEx); - cellMic.AddFunc(0xddd19a89, cellMicStartEx); - cellMic.AddFunc(0x4e0b69ee, cellMicGetFormatRaw); - cellMic.AddFunc(0xfda12276, cellMicGetFormatAux); - cellMic.AddFunc(0x87a08d29, cellMicGetFormatDsp); - cellMic.AddFunc(0xa42ac07a, cellMicOpenRaw); - cellMic.AddFunc(0x72165a7f, cellMicReadRaw); - cellMic.AddFunc(0x3acc118e, cellMicReadAux); - cellMic.AddFunc(0xc414faa5, cellMicReadDsp); - - cellMic.AddFunc(0x25c5723f, cellMicGetStatus); - cellMic.AddFunc(0xe839380f, cellMicStopEx); - cellMic.AddFunc(0x3ace58f3, cellMicSysShareClose); - cellMic.AddFunc(0x48108a23, cellMicGetFormat); - cellMic.AddFunc(0x891c6291, cellMicSetMultiMicNotifyEventQueue); - cellMic.AddFunc(0xad049ecf, cellMicGetFormatEx); - cellMic.AddFunc(0xbdfd51e2, cellMicSysShareStop); - cellMic.AddFunc(0xc3610dbd, cellMicSysShareOpen); - cellMic.AddFunc(0xc461563c, cellMicCommand); - cellMic.AddFunc(0xcac7e7d7, cellMicSysShareStart); - cellMic.AddFunc(0xd127cd3e, cellMicSysShareInit); - cellMic.AddFunc(0xf82bbf7c, cellMicSysShareEnd); - cellMic.AddFunc(0xfdbbe469, cellMicGetDeviceIdentifier); + CellMicInstance.m_bCellMicInitialized = false; +} + +void cellMic_init(Module *pxThis) +{ + cellMic = pxThis; + + cellMic->AddFunc(0x8325e02d, cellMicInit); + cellMic->AddFunc(0xc6328caa, cellMicEnd); + cellMic->AddFunc(0xdd1b59f0, cellMicOpen); + cellMic->AddFunc(0x8d229f8e, cellMicClose); + + cellMic->AddFunc(0x017024a8, cellMicGetDeviceGUID); + cellMic->AddFunc(0xa52d2ae4, cellMicGetType); + cellMic->AddFunc(0x1b42101b, cellMicIsAttached); + cellMic->AddFunc(0x186cb1fb, cellMicIsOpen); + cellMic->AddFunc(0x6a024aa0, cellMicGetDeviceAttr); + cellMic->AddFunc(0xb2c16321, cellMicSetDeviceAttr); + cellMic->AddFunc(0xac5ba03a, cellMicGetSignalAttr); + cellMic->AddFunc(0x323deb41, cellMicSetSignalAttr); + cellMic->AddFunc(0xb30780eb, cellMicGetSignalState); + + cellMic->AddFunc(0xdd724314, cellMicStart); + cellMic->AddFunc(0x07e1b12c, cellMicRead); + cellMic->AddFunc(0xfcfaf246, cellMicStop); + cellMic->AddFunc(0x6bc46aab, cellMicReset); + + cellMic->AddFunc(0x7903400e, cellMicSetNotifyEventQueue); + cellMic->AddFunc(0x6cc7ae00, cellMicSetNotifyEventQueue2); + cellMic->AddFunc(0x65336418, cellMicRemoveNotifyEventQueue); + + cellMic->AddFunc(0x05709bbf, cellMicOpenEx); + cellMic->AddFunc(0xddd19a89, cellMicStartEx); + cellMic->AddFunc(0x4e0b69ee, cellMicGetFormatRaw); + cellMic->AddFunc(0xfda12276, cellMicGetFormatAux); + cellMic->AddFunc(0x87a08d29, cellMicGetFormatDsp); + cellMic->AddFunc(0xa42ac07a, cellMicOpenRaw); + cellMic->AddFunc(0x72165a7f, cellMicReadRaw); + cellMic->AddFunc(0x3acc118e, cellMicReadAux); + cellMic->AddFunc(0xc414faa5, cellMicReadDsp); + + cellMic->AddFunc(0x25c5723f, cellMicGetStatus); + cellMic->AddFunc(0xe839380f, cellMicStopEx); + cellMic->AddFunc(0x3ace58f3, cellMicSysShareClose); + cellMic->AddFunc(0x48108a23, cellMicGetFormat); + cellMic->AddFunc(0x891c6291, cellMicSetMultiMicNotifyEventQueue); + cellMic->AddFunc(0xad049ecf, cellMicGetFormatEx); + cellMic->AddFunc(0xbdfd51e2, cellMicSysShareStop); + cellMic->AddFunc(0xc3610dbd, cellMicSysShareOpen); + cellMic->AddFunc(0xc461563c, cellMicCommand); + cellMic->AddFunc(0xcac7e7d7, cellMicSysShareStart); + cellMic->AddFunc(0xd127cd3e, cellMicSysShareInit); + cellMic->AddFunc(0xf82bbf7c, cellMicSysShareEnd); + cellMic->AddFunc(0xfdbbe469, cellMicGetDeviceIdentifier); } -#endif diff --git a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp index 8df2d3f476..9ba08b4753 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellMsgDialog.cpp @@ -21,6 +21,7 @@ enum MsgDialogState }; std::atomic g_msg_dialog_state(msgDialogNone); +u64 g_msg_dialog_status; u64 g_msg_dialog_wait_until; u32 g_msg_dialog_progress_bar_count; @@ -90,8 +91,8 @@ int cellMsgDialogOpen2(u32 type, vm::ptr msgString, vm::ptr msgString, vm::ptr msgString, vm::ptr s32 + s32 status = (s32)g_msg_dialog_status; + Emu.GetCallbackManager().Register([callback, userData, status]() -> s32 { - callback((s32)status, userData); + callback(status, userData); return CELL_OK; }); } diff --git a/rpcs3/Emu/SysCalls/Modules/cellNetCtl.cpp b/rpcs3/Emu/SysCalls/Modules/cellNetCtl.cpp index 995b633b96..87b31b94dd 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellNetCtl.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellNetCtl.cpp @@ -44,32 +44,32 @@ int cellNetCtlTerm() return CELL_OK; } -int cellNetCtlGetState(vm::ptr> state) +int cellNetCtlGetState(vm::ptr state) { - cellNetCtl->Log("cellNetCtlGetState(state_addr=0x%x)", state.addr()); + cellNetCtl->Warning("cellNetCtlGetState(state_addr=0x%x)", state.addr()); *state = CELL_NET_CTL_STATE_Disconnected; // TODO: Allow other states return CELL_OK; } -int cellNetCtlAddHandler(vm::ptr handler, vm::ptr> arg, s32 hid) +int cellNetCtlAddHandler(vm::ptr handler, vm::ptr arg, vm::ptr hid) { - cellNetCtl->Todo("cellNetCtlAddHandler(handler_addr=0x%x, arg_addr=0x%x, hid=%x)", handler.addr(), arg.addr(), hid); + cellNetCtl->Todo("cellNetCtlAddHandler(handler_addr=0x%x, arg_addr=0x%x, hid_addr=0x%x)", handler.addr(), arg.addr(), hid.addr()); return CELL_OK; } int cellNetCtlDelHandler(s32 hid) { - cellNetCtl->Todo("cellNetCtlDelHandler(hid=%x)", hid); + cellNetCtl->Todo("cellNetCtlDelHandler(hid=0x%x)", hid); return CELL_OK; } int cellNetCtlGetInfo(s32 code, vm::ptr info) { - cellNetCtl->Todo("cellNetCtlGetInfo(code=%x, info_addr=0x%x)", code, info.addr()); + cellNetCtl->Todo("cellNetCtlGetInfo(code=0x%x, info_addr=0x%x)", code, info.addr()); return CELL_OK; } @@ -111,6 +111,11 @@ int cellNetCtlGetNatInfo(vm::ptr natInfo) return CELL_OK; } +void cellNetCtl_unload() +{ + cellNetCtlInstance.m_bInitialized = false; +} + void cellNetCtl_init(Module *pxThis) { cellNetCtl = pxThis; diff --git a/rpcs3/Emu/SysCalls/Modules/cellNetCtl.h b/rpcs3/Emu/SysCalls/Modules/cellNetCtl.h index 11b6695518..4cb89a6962 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellNetCtl.h +++ b/rpcs3/Emu/SysCalls/Modules/cellNetCtl.h @@ -257,4 +257,4 @@ struct CellNetCtlNatInfo be_t mapped_addr; }; -typedef void(*cellNetCtlHandler)(s32 prev_state, s32 new_state, s32 event, s32 error_code, vm::ptr> arg); +typedef void(*cellNetCtlHandler)(s32 prev_state, s32 new_state, s32 event, s32 error_code, vm::ptr arg); diff --git a/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp b/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp index 3b2e2e0403..6284596f73 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellOvis.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "Emu/Memory/Memory.h" #include "Emu/SysCalls/Modules.h" Module *cellOvis = nullptr; @@ -11,9 +12,9 @@ enum CELL_OVIS_ERROR_ALIGN = 0x80410410, }; -int cellOvisGetOverlayTableSize() +int cellOvisGetOverlayTableSize(vm::ptr elf) { - UNIMPLEMENTED_FUNC(cellOvis); + cellOvis->Todo("cellOvisGetOverlayTableSize(elf_addr=0x%x)", elf.addr()); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp b/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp index e06df6d5dd..16a5064293 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp @@ -77,16 +77,14 @@ int pamfStreamTypeToEsFilterId(u8 type, u8 ch, vm::ptr pEsF u8 pamfGetStreamType(vm::ptr pSelf, u8 stream) { //TODO: get stream type correctly - vm::ptr pAddr(pSelf->pAddr); - - switch (pAddr->stream_headers[stream].type) + switch (pSelf->pAddr->stream_headers[stream].type) { case 0x1b: return CELL_PAMF_STREAM_TYPE_AVC; case 0xdc: return CELL_PAMF_STREAM_TYPE_ATRAC3PLUS; case 0x80: return CELL_PAMF_STREAM_TYPE_PAMF_LPCM; case 0xdd: return CELL_PAMF_STREAM_TYPE_USER_DATA; default: - cellPamf->Todo("pamfGetStreamType: unsupported stream type found(0x%x)", pAddr->stream_headers[stream].type); + cellPamf->Todo("pamfGetStreamType: unsupported stream type found(0x%x)", pSelf->pAddr->stream_headers[stream].type); return 0; } } @@ -94,18 +92,18 @@ u8 pamfGetStreamType(vm::ptr pSelf, u8 stream) u8 pamfGetStreamChannel(vm::ptr pSelf, u8 stream) { //TODO: get stream channel correctly - vm::ptr pAddr(pSelf->pAddr); - switch (pAddr->stream_headers[stream].type) + switch (pSelf->pAddr->stream_headers[stream].type) { case 0x1b: - if ((pAddr->stream_headers[stream].stream_id >= 0xe0) && (pAddr->stream_headers[stream].stream_id <= 0xef)) + if ((pSelf->pAddr->stream_headers[stream].stream_id >= 0xe0) && (pSelf->pAddr->stream_headers[stream].stream_id <= 0xef)) { - return pAddr->stream_headers[stream].stream_id - 0xe0; + return pSelf->pAddr->stream_headers[stream].stream_id - 0xe0; } else { - cellPamf->Error("pamfGetStreamChannel: stream type %x got invalid stream id=%x", pAddr->stream_headers[stream].type, pAddr->stream_headers[stream].stream_id); + cellPamf->Error("pamfGetStreamChannel: stream type 0x%x got invalid stream id=0x%x", + pSelf->pAddr->stream_headers[stream].type, pSelf->pAddr->stream_headers[stream].stream_id); return 0; } case 0xdc: @@ -118,13 +116,13 @@ u8 pamfGetStreamChannel(vm::ptr pSelf, u8 stream) cellPamf->Todo("pamfGetStreamChannel: CELL_PAMF_STREAM_TYPE_USER_DATA"); return 0; default: - cellPamf->Todo("pamfGetStreamType: unsupported stream type found(0x%x)", pAddr->stream_headers[stream].type); + cellPamf->Todo("pamfGetStreamType: unsupported stream type found(0x%x)", pSelf->pAddr->stream_headers[stream].type); return 0; } } -int cellPamfGetHeaderSize(vm::ptr pAddr, u64 fileSize, vm::ptr> pSize) +int cellPamfGetHeaderSize(vm::ptr pAddr, u64 fileSize, vm::ptr pSize) { cellPamf->Warning("cellPamfGetHeaderSize(pAddr=0x%x, fileSize=%d, pSize_addr=0x%x)", pAddr.addr(), fileSize, pSize.addr()); @@ -136,7 +134,7 @@ int cellPamfGetHeaderSize(vm::ptr pAddr, u64 fileSize, vm::ptr pAddr, u64 fileSize, u32 attribute, vm::ptr> pSize) +int cellPamfGetHeaderSize2(vm::ptr pAddr, u64 fileSize, u32 attribute, vm::ptr pSize) { cellPamf->Warning("cellPamfGetHeaderSize2(pAddr=0x%x, fileSize=%d, attribute=0x%x, pSize_addr=0x%x)", pAddr.addr(), fileSize, attribute, pSize.addr()); @@ -148,7 +146,7 @@ int cellPamfGetHeaderSize2(vm::ptr pAddr, u64 fileSize, u32 attribut return CELL_OK; } -int cellPamfGetStreamOffsetAndSize(vm::ptr pAddr, u64 fileSize, vm::ptr> pOffset, vm::ptr> pSize) +int cellPamfGetStreamOffsetAndSize(vm::ptr pAddr, u64 fileSize, vm::ptr pOffset, vm::ptr pSize) { cellPamf->Warning("cellPamfGetStreamOffsetAndSize(pAddr=0x%x, fileSize=%d, pOffset_addr=0x%x, pSize_addr=0x%x)", pAddr.addr(), fileSize, pOffset.addr(), pSize.addr()); @@ -196,10 +194,12 @@ int cellPamfReaderGetPresentationStartTime(vm::ptr pSelf, vm::pt { cellPamf->Warning("cellPamfReaderGetPresentationStartTime(pSelf=0x%x, pTimeStamp_addr=0x%x)", pSelf.addr(), pTimeStamp.addr()); - vm::ptr pAddr(pSelf->pAddr); - const u32 upper = (u16)pAddr->start_pts_high; - pTimeStamp->upper = upper; - pTimeStamp->lower = pAddr->start_pts_low; + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } + + pTimeStamp->upper = (u32)(u16)pSelf->pAddr->start_pts_high; + pTimeStamp->lower = pSelf->pAddr->start_pts_low; return CELL_OK; } @@ -207,10 +207,12 @@ int cellPamfReaderGetPresentationEndTime(vm::ptr pSelf, vm::ptr< { cellPamf->Warning("cellPamfReaderGetPresentationEndTime(pSelf=0x%x, pTimeStamp_addr=0x%x)", pSelf.addr(), pTimeStamp.addr()); - vm::ptr pAddr(pSelf->pAddr); - const u32 upper = (u16)pAddr->end_pts_high; - pTimeStamp->upper = upper; - pTimeStamp->lower = pAddr->end_pts_low; + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } + + pTimeStamp->upper = (u32)(u16)pSelf->pAddr->end_pts_high; + pTimeStamp->lower = pSelf->pAddr->end_pts_low; return CELL_OK; } @@ -218,27 +220,35 @@ int cellPamfReaderGetMuxRateBound(vm::ptr pSelf) { cellPamf->Warning("cellPamfReaderGetMuxRateBound(pSelf=0x%x)", pSelf.addr()); - vm::ptr pAddr(pSelf->pAddr); - return pAddr->mux_rate_max; + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } + + return pSelf->pAddr->mux_rate_max; } int cellPamfReaderGetNumberOfStreams(vm::ptr pSelf) { cellPamf->Warning("cellPamfReaderGetNumberOfStreams(pSelf=0x%x)", pSelf.addr()); - vm::ptr pAddr(pSelf->pAddr); - return pAddr->stream_count; + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } + + return pSelf->pAddr->stream_count; } int cellPamfReaderGetNumberOfSpecificStreams(vm::ptr pSelf, u8 streamType) { cellPamf->Warning("cellPamfReaderGetNumberOfSpecificStreams(pSelf=0x%x, streamType=%d)", pSelf.addr(), streamType); - - vm::ptr pAddr(pSelf->pAddr); + + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } int counts[6] = {0, 0, 0, 0, 0, 0}; - for (u8 i = 0; i < pAddr->stream_count; i++) + for (u8 i = 0; i < pSelf->pAddr->stream_count; i++) { counts[pamfGetStreamType(pSelf, i)]++; } @@ -265,25 +275,27 @@ int cellPamfReaderSetStreamWithIndex(vm::ptr pSelf, u8 streamInd { cellPamf->Warning("cellPamfReaderSetStreamWithIndex(pSelf=0x%x, streamIndex=%d)", pSelf.addr(), streamIndex); - vm::ptr pAddr(pSelf->pAddr); + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } - if (streamIndex < pAddr->stream_count) + if (streamIndex < pSelf->pAddr->stream_count) { pSelf->stream = streamIndex; return CELL_OK; } - else - { - cellPamf->Error("cellPamfReaderSetStreamWithIndex: CELL_PAMF_ERROR_INVALID_ARG"); - return CELL_PAMF_ERROR_INVALID_ARG; - } + + cellPamf->Error("cellPamfReaderSetStreamWithIndex: CELL_PAMF_ERROR_INVALID_ARG"); + return CELL_PAMF_ERROR_INVALID_ARG; } int cellPamfReaderSetStreamWithTypeAndChannel(vm::ptr pSelf, u8 streamType, u8 ch) { cellPamf->Warning("cellPamfReaderSetStreamWithTypeAndChannel(pSelf=0x%x, streamType=%d, ch=%d)", pSelf.addr(), streamType, ch); - vm::ptr pAddr(pSelf->pAddr); + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } if (streamType > 5) { @@ -292,7 +304,7 @@ int cellPamfReaderSetStreamWithTypeAndChannel(vm::ptr pSelf, u8 return CELL_PAMF_ERROR_INVALID_ARG; } - for (u8 i = 0; i < pAddr->stream_count; i++) + for (u8 i = 0; i < pSelf->pAddr->stream_count; i++) { if (pamfGetStreamType(pSelf, i) == streamType) { @@ -311,11 +323,13 @@ int cellPamfReaderSetStreamWithTypeAndIndex(vm::ptr pSelf, u8 st { cellPamf->Warning("cellPamfReaderSetStreamWithTypeAndIndex(pSelf=0x%x, streamType=%d, streamIndex=%d)", pSelf.addr(), streamType, streamIndex); - vm::ptr pAddr(pSelf->pAddr); + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } u32 found = 0; - for (u8 i = 0; i < pAddr->stream_count; i++) + for (u8 i = 0; i < pSelf->pAddr->stream_count; i++) { const u8 type = pamfGetStreamType(pSelf, i); @@ -390,7 +404,9 @@ int cellPamfReaderGetStreamInfo(vm::ptr pSelf, u32 pInfo_addr, u { cellPamf->Warning("cellPamfReaderGetStreamInfo(pSelf=0x%x, stream=%d, pInfo_addr=0x%x, size=%d)", pSelf.addr(), pSelf->stream, pInfo_addr, size); - vm::ptr pAddr(pSelf->pAddr); + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } memset(vm::get_ptr(pInfo_addr), 0, size); @@ -450,7 +466,7 @@ int cellPamfReaderGetStreamInfo(vm::ptr pSelf, u32 pInfo_addr, u case CELL_PAMF_STREAM_TYPE_AC3: { auto pInfo = vm::ptr::make(pInfo_addr); - auto pAudio = vm::ptr::make(pSelf->pAddr + 0x98 + pSelf->stream * 0x30); + auto pAudio = vm::ptr::make(pSelf->pAddr.addr() + 0x98 + pSelf->stream * 0x30); if (size != sizeof(CellPamfAc3Info)) { @@ -465,7 +481,7 @@ int cellPamfReaderGetStreamInfo(vm::ptr pSelf, u32 pInfo_addr, u case CELL_PAMF_STREAM_TYPE_PAMF_LPCM: { auto pInfo = vm::ptr::make(pInfo_addr); - auto pAudio = vm::ptr::make(pSelf->pAddr + 0x98 + pSelf->stream * 0x30); + auto pAudio = vm::ptr::make(pSelf->pAddr.addr() + 0x98 + pSelf->stream * 0x30); if (size != sizeof(CellPamfLpcmInfo)) { @@ -497,15 +513,21 @@ int cellPamfReaderGetNumberOfEp(vm::ptr pSelf) { cellPamf->Warning("cellPamfReaderGetNumberOfEp(pSelf=0x%x, stream=%d)", pSelf.addr(), pSelf->stream); - vm::ptr pAddr(pSelf->pAddr); - return pAddr->stream_headers[pSelf->stream].ep_num; + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } + + return pSelf->pAddr->stream_headers[pSelf->stream].ep_num; } int cellPamfReaderGetEpIteratorWithIndex(vm::ptr pSelf, u32 epIndex, vm::ptr pIt) { cellPamf->Todo("cellPamfReaderGetEpIteratorWithIndex(pSelf=0x%x, stream=%d, epIndex=%d, pIt_addr=0x%x)", pSelf.addr(), pSelf->stream, epIndex, pIt.addr()); - vm::ptr pAddr(pSelf->pAddr); + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } + //TODO: return CELL_OK; } @@ -514,7 +536,9 @@ int cellPamfReaderGetEpIteratorWithTimeStamp(vm::ptr pSelf, vm:: { cellPamf->Todo("cellPamfReaderGetEpIteratorWithTimeStamp(pSelf=0x%x, pTimeStamp_addr=0x%x, pIt_addr=0x%x)", pSelf.addr(), pTimeStamp.addr(), pIt.addr()); - vm::ptr pAddr(pSelf->pAddr); + if (!pSelf->pAddr) { + return CELL_PAMF_ERROR_INVALID_PAMF; + } //TODO: diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp index ea76f998d2..05e88cd71e 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.cpp @@ -16,10 +16,10 @@ u32 libpngdec; u32 libpngdec_rtoc; #endif -s32 pngDecCreate( +s64 pngDecCreate( vm::ptr mainHandle, vm::ptr param, - vm::ptr ext = {}) + vm::ptr ext = vm::ptr::make(0)) { // alloc memory (should probably use param->cbCtrlMallocFunc) auto dec = CellPngDecMainHandle::make(Memory.Alloc(sizeof(PngDecoder), 128)); @@ -45,7 +45,7 @@ s32 pngDecCreate( return CELL_OK; } -s32 pngDecDestroy(CellPngDecMainHandle dec) +s64 pngDecDestroy(CellPngDecMainHandle dec) { if (!Memory.Free(dec.addr())) { @@ -55,13 +55,13 @@ s32 pngDecDestroy(CellPngDecMainHandle dec) return CELL_OK; } -s32 pngDecOpen( +s64 pngDecOpen( CellPngDecMainHandle dec, vm::ptr subHandle, vm::ptr src, vm::ptr openInfo, - vm::ptr cb = {}, - vm::ptr param = {}) + vm::ptr cb = vm::ptr::make(0), + vm::ptr param = vm::ptr::make(0)) { // alloc memory (should probably use dec->malloc) auto stream = CellPngDecSubHandle::make(Memory.Alloc(sizeof(PngStream), 128)); @@ -75,16 +75,16 @@ s32 pngDecOpen( stream->fd = 0; stream->src = *src; - switch (src->srcSelect.ToBE()) + switch (src->srcSelect.ToLE()) { - case se32(CELL_PNGDEC_BUFFER): + case CELL_PNGDEC_BUFFER: stream->fileSize = src->streamSize.ToLE(); break; - case se32(CELL_PNGDEC_FILE): + case CELL_PNGDEC_FILE: // Get file descriptor vm::var> fd; - int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr>::make(0), 0); + int ret = cellFsOpen(vm::ptr::make(src->fileName.addr()), 0, fd, vm::ptr::make(0), 0); stream->fd = fd->ToLE(); if (ret != CELL_OK) return CELL_PNGDEC_ERROR_OPEN_FILE; @@ -115,7 +115,7 @@ s32 pngDecOpen( return CELL_OK; } -s32 pngDecClose(CellPngDecSubHandle stream) +s64 pngDecClose(CellPngDecSubHandle stream) { cellFsClose(stream->fd); if (!Memory.Free(stream.addr())) @@ -126,10 +126,10 @@ s32 pngDecClose(CellPngDecSubHandle stream) return CELL_OK; } -s32 pngReadHeader( +s64 pngReadHeader( CellPngDecSubHandle stream, vm::ptr info, - vm::ptr extInfo = {}) + vm::ptr extInfo = vm::ptr::make(0)) { CellPngDecInfo& current_info = stream->info; @@ -189,12 +189,12 @@ s32 pngReadHeader( return CELL_OK; } -s32 pngDecSetParameter( +s64 pngDecSetParameter( CellPngDecSubHandle stream, vm::ptr inParam, vm::ptr outParam, - vm::ptr extInParam = {}, - vm::ptr extOutParam = {}) + vm::ptr extInParam = vm::ptr::make(0), + vm::ptr extOutParam = vm::ptr::make(0)) { CellPngDecInfo& current_info = stream->info; CellPngDecOutParam& current_outParam = stream->outParam; @@ -230,13 +230,13 @@ s32 pngDecSetParameter( return CELL_OK; } -s32 pngDecodeData( +s64 pngDecodeData( CellPngDecSubHandle stream, vm::ptr data, vm::ptr dataCtrlParam, vm::ptr dataOutInfo, - vm::ptr cbCtrlDisp = {}, - vm::ptr dispParam = {}) + vm::ptr cbCtrlDisp = vm::ptr::make(0), + vm::ptr dispParam = vm::ptr::make(0)) { dataOutInfo->status = CELL_PNGDEC_DEC_STATUS_STOP; @@ -359,7 +359,7 @@ s32 pngDecodeData( return CELL_OK; } -s32 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam) +s64 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -379,7 +379,7 @@ s32 cellPngDecCreate(vm::ptr mainHandle, vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam, @@ -405,7 +405,7 @@ s32 cellPngDecExtCreate( #endif } -s32 cellPngDecDestroy(CellPngDecMainHandle mainHandle) +s64 cellPngDecDestroy(CellPngDecMainHandle mainHandle) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -418,7 +418,7 @@ s32 cellPngDecDestroy(CellPngDecMainHandle mainHandle) #endif } -s32 cellPngDecOpen( +s64 cellPngDecOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, @@ -436,7 +436,7 @@ s32 cellPngDecOpen( #endif } -s32 cellPngDecExtOpen( +s64 cellPngDecExtOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, @@ -456,7 +456,7 @@ s32 cellPngDecExtOpen( #endif } -s32 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle) +s64 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -468,7 +468,7 @@ s32 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHand #endif } -s32 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info) +s64 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -481,7 +481,7 @@ s32 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle su #endif } -s32 cellPngDecExtReadHeader( +s64 cellPngDecExtReadHeader( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info, @@ -498,7 +498,7 @@ s32 cellPngDecExtReadHeader( #endif } -s32 cellPngDecSetParameter( +s64 cellPngDecSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, @@ -515,7 +515,7 @@ s32 cellPngDecSetParameter( #endif } -s32 cellPngDecExtSetParameter( +s64 cellPngDecExtSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, @@ -534,7 +534,7 @@ s32 cellPngDecExtSetParameter( #endif } -s32 cellPngDecDecodeData( +s64 cellPngDecDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, @@ -552,7 +552,7 @@ s32 cellPngDecDecodeData( #endif } -s32 cellPngDecExtDecodeData( +s64 cellPngDecExtDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, @@ -572,7 +572,7 @@ s32 cellPngDecExtDecodeData( #endif } -s32 cellPngDecGetUnknownChunks( +s64 cellPngDecGetUnknownChunks( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr> unknownChunk, @@ -587,7 +587,7 @@ s32 cellPngDecGetUnknownChunks( #endif } -s32 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal) +s64 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -598,7 +598,7 @@ s32 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm) +s64 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -609,7 +609,7 @@ s32 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal) +s64 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -620,7 +620,7 @@ s32 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys) +s64 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -631,7 +631,7 @@ s32 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs) +s64 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -642,7 +642,7 @@ s32 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt) +s64 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -653,7 +653,7 @@ s32 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd) +s64 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -664,7 +664,7 @@ s32 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time) +s64 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -675,7 +675,7 @@ s32 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist) +s64 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -686,7 +686,7 @@ s32 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns) +s64 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -697,7 +697,7 @@ s32 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit) +s64 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -708,7 +708,7 @@ s32 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp) +s64 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -719,7 +719,7 @@ s32 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb) +s64 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -730,7 +730,7 @@ s32 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama) +s64 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -741,7 +741,7 @@ s32 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte) +s64 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte) { #ifdef PRX_DEBUG cellPngDec->Warning("%s()", __FUNCTION__); @@ -752,7 +752,7 @@ s32 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHa #endif } -s32 cellPngDecGetTextChunk( +s64 cellPngDecGetTextChunk( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr textInfoNum, @@ -804,7 +804,9 @@ void cellPngDec_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { - libpngdec = (u32)Memory.PRXMem.AllocAlign(sizeof(libpngdec_data), 4096); + if (!Memory.MainMem.GetStartAddr()) return; + + libpngdec = (u32)Memory.MainMem.AllocAlign(sizeof(libpngdec_data), 0x100000); memcpy(vm::get_ptr(libpngdec), libpngdec_data, sizeof(libpngdec_data)); libpngdec_rtoc = libpngdec + 0x49710; diff --git a/rpcs3/Emu/SysCalls/Modules/cellPngDec.h b/rpcs3/Emu/SysCalls/Modules/cellPngDec.h index 6bb2d021a4..e0a5473584 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPngDec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellPngDec.h @@ -183,77 +183,77 @@ struct CellPngDecDataOutInfo }; // Functions -s32 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam); +s64 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam); -s32 cellPngDecExtCreate( +s64 cellPngDecExtCreate( vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam, vm::ptr extThreadInParam, vm::ptr extThreadOutParam); -s32 cellPngDecOpen( +s64 cellPngDecOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, vm::ptr openInfo); -s32 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info); +s64 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info); -s32 cellPngDecSetParameter( +s64 cellPngDecSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, vm::ptr outParam); -s32 cellPngDecDecodeData( +s64 cellPngDecDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, vm::ptr dataCtrlParam, vm::ptr dataOutInfo); -s32 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle); +s64 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle); -s32 cellPngDecDestroy(CellPngDecMainHandle mainHandle); +s64 cellPngDecDestroy(CellPngDecMainHandle mainHandle); -s32 cellPngDecGetTextChunk( +s64 cellPngDecGetTextChunk( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr textInfoNum, vm::ptr> textInfo); -s32 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte); +s64 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte); -s32 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama); +s64 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama); -s32 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb); +s64 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb); -s32 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp); +s64 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp); -s32 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit); +s64 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit); -s32 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns); +s64 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns); -s32 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist); +s64 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist); -s32 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time); +s64 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time); -s32 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd); +s64 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd); -s32 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt); +s64 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt); -s32 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs); +s64 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs); -s32 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys); +s64 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys); -s32 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal); +s64 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal); -s32 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm); +s64 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm); -s32 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal); +s64 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal); -s32 cellPngDecGetUnknownChunks( +s64 cellPngDecGetUnknownChunks( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr> unknownChunk, @@ -349,7 +349,7 @@ struct CellPngDecCbCtrlDisp }; // Functions -s32 cellPngDecExtOpen( +s64 cellPngDecExtOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, @@ -357,13 +357,13 @@ s32 cellPngDecExtOpen( vm::ptr cbCtrlStrm, vm::ptr opnParam); -s32 cellPngDecExtReadHeader( +s64 cellPngDecExtReadHeader( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info, vm::ptr extInfo); -s32 cellPngDecExtSetParameter( +s64 cellPngDecExtSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, @@ -371,7 +371,7 @@ s32 cellPngDecExtSetParameter( vm::ptr extInParam, vm::ptr extOutParam); -s32 cellPngDecExtDecodeData( +s64 cellPngDecExtDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, diff --git a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp index 9c07072b33..c87eb12b6d 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp @@ -603,7 +603,7 @@ void cellRescExit() if (IsPalTemporal()) { cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_DISABLE); - cellGcmSetVBlankHandler({}); + cellGcmSetVBlankHandler(vm::ptr::make(0)); //GcmSysTypePrefix::cellGcmSetSecondVHandler(NULL); if (IsPalInterpolate()) @@ -620,7 +620,7 @@ void cellRescExit() s_rescInternalInstance->m_bInitialized = false; } -int cellRescVideoOutResolutionId2RescBufferMode(u32 resolutionId, vm::ptr> bufferMode) +int cellRescVideoOutResolutionId2RescBufferMode(u32 resolutionId, vm::ptr bufferMode) { cellResc->Log("cellRescVideoOutResolutionId2RescBufferMode(resolutionId=%d, bufferMode_addr=0x%x)", resolutionId, bufferMode.addr()); @@ -780,20 +780,20 @@ int cellRescSetDisplayMode(u32 displayMode) cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ); //cellGcmSetVBlankHandler(IntrHandler50); //cellGcmSetSecondVHandler(IntrHandler60); - cellGcmSetFlipHandler({}); + cellGcmSetFlipHandler(vm::ptr::make(0)); } else if (IsPalDrop()) { //InitLabels(); cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ); - cellGcmSetVBlankHandler({}); + cellGcmSetVBlankHandler(vm::ptr::make(0)); //cellGcmSetSecondVHandler(IntrHandler60Drop); - cellGcmSetFlipHandler({}); + cellGcmSetFlipHandler(vm::ptr::make(0)); } else if (IsPal60Hsync()) { cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ); - cellGcmSetVBlankHandler({}); + cellGcmSetVBlankHandler(vm::ptr::make(0)); } if (s_rescInternalInstance->s_applicationVBlankHandler) SetVBlankHandler(s_rescInternalInstance->s_applicationVBlankHandler); @@ -858,7 +858,7 @@ int cellRescSetPalInterpolateDropFlexRatio(float ratio) return CELL_OK; } -int cellRescGetBufferSize(vm::ptr> colorBuffers, vm::ptr> vertexArray, vm::ptr> fragmentShader) +int cellRescGetBufferSize(vm::ptr colorBuffers, vm::ptr vertexArray, vm::ptr fragmentShader) { cellResc->Warning("cellRescGetBufferSize(colorBuffers_addr=0x%x, vertexArray_addr=0x%x, fragmentShader_addr=0x%x)", colorBuffers.addr(), vertexArray.addr(), fragmentShader.addr()); @@ -1029,7 +1029,7 @@ int cellRescSetWaitFlip() return CELL_OK; } -int cellRescSetBufferAddress(vm::ptr> colorBuffers, vm::ptr> vertexArray, vm::ptr> fragmentShader) +int cellRescSetBufferAddress(vm::ptr colorBuffers, vm::ptr vertexArray, vm::ptr fragmentShader) { cellResc->Warning("cellRescSetBufferAddress(colorBuffers_addr=0x%x, vertexArray_addr=0x%x, fragmentShader_addr=0x%x)", colorBuffers.addr(), vertexArray.addr(), fragmentShader.addr()); @@ -1169,8 +1169,8 @@ int CreateInterlaceTable(u32 ea_addr, float srcH, float dstH, CellRescTableEleme float bandwidth = 0.5f / (srcH / dstH); float phi_b = 2.f * PI * bandwidth; float window[4]; - auto buf16 = vm::ptr>::make(ea_addr); - auto buf32 = vm::ptr>::make(ea_addr); + auto buf16 = vm::ptr::make(ea_addr); + auto buf32 = vm::ptr::make(ea_addr); blackman(window); diff --git a/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp b/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp index 99f281514c..aae606a4d1 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellRtc.cpp @@ -310,7 +310,7 @@ int cellRtcConvertLocalTimeToUtc(vm::ptr pLocalTime, vm::ptr pDateTime, vm::ptr> puiDosTime) +int cellRtcGetDosTime(vm::ptr pDateTime, vm::ptr puiDosTime) { cellRtc->Log("cellRtcGetDosTime(pDateTime=0x%x, puiDosTime=0x%x)", pDateTime.addr(), puiDosTime.addr()); @@ -321,7 +321,7 @@ int cellRtcGetDosTime(vm::ptr pDateTime, vm::ptr> pui return CELL_OK; } -int cellRtcGetTime_t(vm::ptr pDateTime, vm::ptr> piTime) +int cellRtcGetTime_t(vm::ptr pDateTime, vm::ptr piTime) { cellRtc->Log("cellRtcGetTime_t(pDateTime=0x%x, piTime=0x%x)", pDateTime.addr(), piTime.addr()); @@ -333,7 +333,7 @@ int cellRtcGetTime_t(vm::ptr pDateTime, vm::ptr> piTi return CELL_OK; } -int cellRtcGetWin32FileTime(vm::ptr pDateTime, vm::ptr> pulWin32FileTime) +int cellRtcGetWin32FileTime(vm::ptr pDateTime, vm::ptr pulWin32FileTime) { cellRtc->Log("cellRtcGetWin32FileTime(pDateTime=0x%x, pulWin32FileTime=0x%x)", pDateTime.addr(), pulWin32FileTime.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSail.cpp b/rpcs3/Emu/SysCalls/Modules/cellSail.cpp index 409535dd88..3e22257a26 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSail.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSail.cpp @@ -6,9 +6,12 @@ Module *cellSail = nullptr; -int cellSailMemAllocatorInitialize() +int cellSailMemAllocatorInitialize(vm::ptr pSelf, vm::ptr pCallbacks) { - UNIMPLEMENTED_FUNC(cellSail); + cellSail->Warning("cellSailMemAllocatorInitialize(pSelf_addr=0x%x, pCallbacks_addr=0x%x)", pSelf.addr(), pCallbacks.addr()); + + pSelf->callbacks = pCallbacks; + return CELL_OK; } @@ -66,15 +69,25 @@ int cellSailDescriptorGetMediaInfo() return CELL_OK; } -int cellSailDescriptorSetAutoSelection() +int cellSailDescriptorSetAutoSelection(vm::ptr pSelf, bool autoSelection) { - UNIMPLEMENTED_FUNC(cellSail); + cellSail->Todo("cellSailDescriptorSetAutoSelection(pSelf_addr=0x%x, autoSelection=%s)", pSelf.addr(), autoSelection ? "true" : "false"); + + if (pSelf) { + pSelf->autoSelection = autoSelection; + return autoSelection; + } + return CELL_OK; } -int cellSailDescriptorIsAutoSelection() +int cellSailDescriptorIsAutoSelection(vm::ptr pSelf) { - UNIMPLEMENTED_FUNC(cellSail); + cellSail->Warning("cellSailDescriptorIsAutoSelection(pSelf_addr=0x%x)", pSelf.addr()); + + if (pSelf) + return pSelf->autoSelection; + return CELL_OK; } @@ -486,9 +499,18 @@ int cellSailPlayerInitialize() return CELL_OK; } -int cellSailPlayerInitialize2() +int cellSailPlayerInitialize2(vm::ptr pSelf, vm::ptr pAllocator, vm::ptr pCallback, u64 callbackArg, + vm::ptr pAttribute, vm::ptr pResource) { - UNIMPLEMENTED_FUNC(cellSail); + cellSail->Warning("cellSailPlayerInitialize2(pSelf_addr=0x%x, pAllocator_addr=0x%x, pCallback=0x%x, callbackArg=%d, pAttribute_addr=0x%x, pResource=0x%x)", pSelf.addr(), + pAllocator.addr(), pCallback.addr(), callbackArg, pAttribute.addr(), pResource.addr()); + + pSelf->allocator = pAllocator; + pSelf->callback = pCallback; + pSelf->callbackArgument = callbackArg; + pSelf->attribute = pAttribute; + pSelf->resource = pResource; + return CELL_OK; } @@ -576,34 +598,76 @@ int cellSailPlayerBoot() return CELL_OK; } -int cellSailPlayerCreateDescriptor() +int cellSailPlayerAddDescriptor(vm::ptr pSelf, vm::ptr pDesc) { - UNIMPLEMENTED_FUNC(cellSail); + cellSail->Warning("cellSailPlayerAddDescriptor(pSelf_addr=0x%x, pDesc_addr=0x%x)", pSelf.addr(), pDesc.addr()); + + if (pSelf && pSelf->descriptors < 3 && pDesc) + { + pSelf->descriptors++; + pSelf->registeredDescriptors[pSelf->descriptors] = pDesc; + pDesc->registered = true; + } + else + { + cellSail->Error("Descriptor limit reached or the descriptor is unspecified! This should never happen, report this to a developer."); + } + return CELL_OK; } -int cellSailPlayerDestroyDescriptor() +int cellSailPlayerCreateDescriptor(vm::ptr pSelf, s32 streamType, vm::ptr pMediaInfo, vm::ptr pUri, vm::ptr ppDesc) { - UNIMPLEMENTED_FUNC(cellSail); + cellSail->Todo("cellSailPlayerCreateDescriptor(pSelf_addr=0x%x, streamType=%d, pMediaInfo_addr=0x%x, pUri_addr=0x%x, ppDesc_addr=0x%x)", pSelf.addr(), streamType, + pMediaInfo.addr(), pUri.addr(), ppDesc.addr()); + + // TODO: Let the game allocate memory for the descriptor, setup the descriptor and pass it back to the game + + //CellSailDescriptor *pDesc = new CellSailDescriptor(); + //u32 descriptorAddress = pSelf->allocator->callbacks->pAlloc(pSelf->allocator->pArg, 4, descriptorAddress); + //cellSail->Error("Address: 0x%x", descriptorAddress); + //vm::ptr descriptor = vm::ptr::make(Memory.RealToVirtualAddr(&descriptorAddress)); + //descriptor->streamType = streamType; + //descriptor->registered = false; + + pSelf->descriptors = 0; + pSelf->repeatMode = 0; + //ppDesc = descriptor; + + //cellSail->Todo("pSelf_addr=0x%x, pDesc_addr=0x%x", pSelf.addr(), descriptor.addr()); + //cellSailPlayerAddDescriptor(pSelf, ppDesc); + return CELL_OK; } -int cellSailPlayerAddDescriptor() +int cellSailPlayerDestroyDescriptor(vm::ptr pSelf, vm::ptr pDesc) { - UNIMPLEMENTED_FUNC(cellSail); + cellSail->Todo("cellSailPlayerAddDescriptor(pSelf_addr=0x%x, pDesc_addr=0x%x)", pSelf.addr(), pDesc.addr()); + + if (pDesc->registered) + return CELL_SAIL_ERROR_INVALID_STATE; + return CELL_OK; } -int cellSailPlayerRemoveDescriptor() +int cellSailPlayerRemoveDescriptor(vm::ptr pSelf, vm::ptr ppDesc) { - UNIMPLEMENTED_FUNC(cellSail); - return CELL_OK; + cellSail->Warning("cellSailPlayerAddDescriptor(pSelf_addr=0x%x, pDesc_addr=0x%x)", pSelf.addr(), ppDesc.addr()); + + if (pSelf->descriptors > 0) + { + ppDesc = pSelf->registeredDescriptors[pSelf->descriptors]; + delete &pSelf->registeredDescriptors[pSelf->descriptors]; + pSelf->descriptors--; + } + + return pSelf->descriptors; } -int cellSailPlayerGetDescriptorCount() +int cellSailPlayerGetDescriptorCount(vm::ptr pSelf) { - UNIMPLEMENTED_FUNC(cellSail); - return CELL_OK; + cellSail->Warning("cellSailPlayerGetDescriptorCount(pSelf_addr=0x%x)", pSelf.addr()); + return pSelf->descriptors; } int cellSailPlayerGetCurrentDescriptor() @@ -714,16 +778,23 @@ int cellSailPlayerIsPaused() return CELL_OK; } -int cellSailPlayerSetRepeatMode() +int cellSailPlayerSetRepeatMode(vm::ptr pSelf, s32 repeatMode, vm::ptr pCommand) { - UNIMPLEMENTED_FUNC(cellSail); - return CELL_OK; + cellSail->Warning("cellSailPlayerSetRepeatMode(pSelf_addr=0x%x, repeatMode=%i, pCommand_addr=0x%x)", pSelf.addr(), repeatMode, pCommand.addr()); + + pSelf->repeatMode = repeatMode; + pSelf->playbackCommand = pCommand; + + return pSelf->repeatMode; } -int cellSailPlayerGetRepeatMode() +int cellSailPlayerGetRepeatMode(vm::ptr pSelf, vm::ptr pCommand) { - UNIMPLEMENTED_FUNC(cellSail); - return CELL_OK; + cellSail->Warning("cellSailPlayerGetRepeatMode(pSelf_addr=0x%x, pCommand_addr=0x%x)", pSelf.addr(), pCommand.addr()); + + pCommand = pSelf->playbackCommand; + + return pSelf->repeatMode; } int cellSailPlayerSetEsAudioMuted() diff --git a/rpcs3/Emu/SysCalls/Modules/cellSail.h b/rpcs3/Emu/SysCalls/Modules/cellSail.h index 55dc556dc3..052133beaa 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSail.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSail.h @@ -17,6 +17,519 @@ enum CELL_SAIL_ERROR_FATAL = 0x806107FF, }; +// Call types +enum { + CELL_SAIL_PLAYER_CALL_NONE = 0, + CELL_SAIL_PLAYER_CALL_BOOT = 1, + CELL_SAIL_PLAYER_CALL_OPEN_STREAM = 2, + CELL_SAIL_PLAYER_CALL_CLOSE_STREAM = 3, + CELL_SAIL_PLAYER_CALL_OPEN_ES_AUDIO = 4, + CELL_SAIL_PLAYER_CALL_OPEN_ES_VIDEO = 5, + CELL_SAIL_PLAYER_CALL_OPEN_ES_USER = 6, + CELL_SAIL_PLAYER_CALL_CLOSE_ES_AUDIO = 7, + CELL_SAIL_PLAYER_CALL_CLOSE_ES_VIDEO = 8, + CELL_SAIL_PLAYER_CALL_CLOSE_ES_USER = 9, + CELL_SAIL_PLAYER_CALL_START = 10, + CELL_SAIL_PLAYER_CALL_STOP = 11, + CELL_SAIL_PLAYER_CALL_NEXT = 12, + CELL_SAIL_PLAYER_CALL_REOPEN_ES_AUDIO = 13, + CELL_SAIL_PLAYER_CALL_REOPEN_ES_VIDEO = 14, + CELL_SAIL_PLAYER_CALL_REOPEN_ES_USER = 15, + + _CELL_SAIL_PLAYER_CALL_TYPE_NUM_OF_ELEMENTS = 16, // Never used? +}; + +// State types +enum { + CELL_SAIL_PLAYER_STATE_INITIALIZED = 0, + CELL_SAIL_PLAYER_STATE_BOOT_TRANSITION = 1, + CELL_SAIL_PLAYER_STATE_CLOSED = 2, + CELL_SAIL_PLAYER_STATE_OPEN_TRANSITION = 3, + CELL_SAIL_PLAYER_STATE_OPENED = 4, + CELL_SAIL_PLAYER_STATE_START_TRANSITION = 5, + CELL_SAIL_PLAYER_STATE_RUNNING = 6, + CELL_SAIL_PLAYER_STATE_STOP_TRANSITION = 7, + CELL_SAIL_PLAYER_STATE_CLOSE_TRANSITION = 8, + CELL_SAIL_PLAYER_STATE_LOST = 9, + _CELL_SAIL_PLAYER_STATE_TYPE_NUM_OF_ELEMENTS = 10, // Never used? +}; + +// Preset types +enum { + CELL_SAIL_PLAYER_PRESET_AV_SYNC = 0, // Deprecated, same as 59_94HZ + CELL_SAIL_PLAYER_PRESET_AS_IS = 1, + CELL_SAIL_PLAYER_PRESET_AV_SYNC_59_94HZ = 2, + CELL_SAIL_PLAYER_PRESET_AV_SYNC_29_97HZ = 3, + CELL_SAIL_PLAYER_PRESET_AV_SYNC_50HZ = 4, + CELL_SAIL_PLAYER_PRESET_AV_SYNC_25HZ = 5, + CELL_SAIL_PLAYER_PRESET_AV_SYNC_AUTO_DETECT = 6, +}; + +// Parameter types +enum { + CELL_SAIL_PARAMETER_ENABLE_VPOST = 0, + + // Player + CELL_SAIL_PARAMETER_CONTROL_QUEUE_DEPTH = 1, + CELL_SAIL_PARAMETER_CONTROL_PPU_THREAD_PRIORITY = 2, + + // SPURS + CELL_SAIL_PARAMETER_SPURS_NUM_OF_SPUS = 3, + CELL_SAIL_PARAMETER_SPURS_SPU_THREAD_PRIORITY = 4, + CELL_SAIL_PARAMETER_SPURS_PPU_THREAD_PRIORITY = 5, + CELL_SAIL_PARAMETER_SPURS_EXIT_IF_NO_WORK = 6, + + // Source + CELL_SAIL_PARAMETER_IO_PPU_THREAD_PRIORITY = 7, + + // Dmux + CELL_SAIL_PARAMETER_DMUX_PPU_THREAD_PRIORITY = 8, + CELL_SAIL_PARAMETER_DMUX_SPU_THREAD_PRIORITY = 9, // Deprecated + CELL_SAIL_PARAMETER_DMUX_NUM_OF_SPUS = 10, + CELL_SAIL_PARAMETER_DMUX_SPURS_TASK_PRIORITIES = 11, + + // Adec + CELL_SAIL_PARAMETER_ADEC_PPU_THREAD_PRIORITY = 12, + CELL_SAIL_PARAMETER_ADEC_SPU_THREAD_PRIORITY = 13, // Deprecated + CELL_SAIL_PARAMETER_ADEC_NUM_OF_SPUS = 14, + CELL_SAIL_PARAMETER_ADEC_SPURS_TASK_PRIORITIES = 15, + + // Vdec + CELL_SAIL_PARAMETER_VDEC_PPU_THREAD_PRIORITY = 16, + CELL_SAIL_PARAMETER_VDEC_SPU_THREAD_PRIORITY = 17, // Deprecated + CELL_SAIL_PARAMETER_VDEC_M2V_NUM_OF_SPUS = 18, + CELL_SAIL_PARAMETER_VDEC_AVC_NUM_OF_SPUS = 19, + CELL_SAIL_PARAMETER_VDEC_SPURS_TASK_PRIORITIES = 20, + + // Vpost */ + CELL_SAIL_PARAMETER_VPOST_PPU_THREAD_PRIORITY = 21, // Deprecated + CELL_SAIL_PARAMETER_VPOST_SPU_THREAD_PRIORITY = 22, // Deprecated + CELL_SAIL_PARAMETER_VPOST_NUM_OF_SPUS = 23, + CELL_SAIL_PARAMETER_VPOST_SPURS_TASK_PRIORITIES = 24, + + // Graphics Adapter + CELL_SAIL_PARAMETER_GRAPHICS_ADAPTER_BUFFER_RELEASE_DELAY = 25, + + // AV Sync + CELL_SAIL_PARAMETER_AV_SYNC_ES_AUDIO = 26, + CELL_SAIL_PARAMETER_AV_SYNC_ES_VIDEO = 27, + CELL_SAIL_PARAMETER_AV_SYNC_ES_USER = 28, // Not available + + // Control + CELL_SAIL_PARAMETER_CONTROL_PPU_THREAD_STACK_SIZE = 29, + CELL_SAIL_PARAMETER_RESERVED0_ = 30, // Should be never used + CELL_SAIL_PARAMETER_RESERVED1 = 31, // Should be never used + + // Apost + CELL_SAIL_PARAMETER_ENABLE_APOST_SRC = 32, + + // File I/O Interface + CELL_SAIL_PARAMETER_FS = 33, + CELL_SAIL_PARAMETER_IO_PPU_THREAD_STACK_SIZE = 34, + CELL_SAIL_PARAMETER_VIDEO_PERFORMANCE_POLICY = 35, + _CELL_SAIL_PARAMETER_TYPE_NUM_OF_ELEMENTS = 36, // Should be never used + CELL_SAIL_PARAMETER_SOURCE_PPU_THREAD_PRIORITY = CELL_SAIL_PARAMETER_IO_PPU_THREAD_PRIORITY, + CELL_SAIL_PARAMETER_DMUX_SPURS_TASK_PRIORITY = CELL_SAIL_PARAMETER_DMUX_SPURS_TASK_PRIORITIES, // Deprecated + CELL_SAIL_PARAMETER_VDEC_SPURS_TASK_PRIORITY = CELL_SAIL_PARAMETER_VDEC_SPURS_TASK_PRIORITIES, // Deprecated + CELL_SAIL_PARAMETER_ADEC_SPURS_TASK_PRIORITY = CELL_SAIL_PARAMETER_ADEC_SPURS_TASK_PRIORITIES, // Deprecated + CELL_SAIL_PARAMETER_VPOST_SPURS_TASK_PRIORITY = CELL_SAIL_PARAMETER_VPOST_SPURS_TASK_PRIORITIES, // Deprecated +}; + +// Media states +enum { + CELL_SAIL_MEDIA_STATE_FINE = 0, + CELL_SAIL_MEDIA_STATE_BAD = 1, + CELL_SAIL_MEDIA_STATE_LOST = 2, +}; + +// Stream Types +enum +{ + CELL_SAIL_STREAM_PAMF = 0, + CELL_SAIL_STREAM_MP4 = 1, + CELL_SAIL_STREAM_AVI = 2, + + CELL_SAIL_STREAM_UNSPECIFIED = -1, +}; + +// Sync Types +enum { + CELL_SAIL_SYNC_MODE_REPEAT = 1 << 0, + CELL_SAIL_SYNC_MODE_SKIP = 1 << 1, +}; + +// Flags +enum { + CELL_SAIL_AVISF_DISABLED = 0x00000001, + CELL_SAIL_AVIF_HASINDEX = 0x00000010, + CELL_SAIL_AVIF_MUSTUSEINDEX = 0x00000020, + CELL_SAIL_AVIF_ISINTERLEAVED = 0x00000100, + CELL_SAIL_AVIF_WASCAPTUREFILE = 0x00010000, + CELL_SAIL_AVISF_VIDEO_PALCHANGES = 0x00010000, + CELL_SAIL_AVIF_COPYRIGHTED = 0x00020000, + + CELL_SAIL_AVIF_TRUSTCKTYPE = 0x00000800, // Open-DML only +}; + +// Wave types +enum { + CELL_SAIL_WAVE_FORMAT_PCM = 0x0001, + CELL_SAIL_WAVE_FORMAT_MPEG = 0x0050, + CELL_SAIL_WAVE_FORMAT_MPEGLAYER3 = 0x0055, + CELL_SAIL_WAVE_FORMAT_AC3 = 0x2000, + CELL_SAIL_WAVE_FORMAT_UNSPECIFIED = 0xFFFF, +}; + +// MPEG Layers +enum { + CELL_SAIL_ACM_MPEG_LAYER1 = 0x0001, + CELL_SAIL_ACM_MPEG_LAYER2 = 0x0002, + CELL_SAIL_ACM_MPEG_LAYER3 = 0x0004, +}; + +// MPEG Modes +enum { + CELL_SAIL_ACM_MPEG_STEREO = 0x0001, + CELL_SAIL_ACM_MPEG_JOINTSTEREO = 0x0002, + CELL_SAIL_ACM_MPEG_DUALCHANNEL = 0x0004, + CELL_SAIL_ACM_MPEG_SINGLECHANNEL = 0x0008, +}; + +// MPEG Flags +enum { + CELL_SAIL_ACM_MPEG_PRIVATEBIT = 0x0001, + CELL_SAIL_ACM_MPEG_COPYRIGHT = 0x0002, + CELL_SAIL_ACM_MPEG_ORIGINALHOME = 0x0004, + CELL_SAIL_ACM_MPEG_PROTECTIONBIT = 0x0008, + CELL_SAIL_ACM_MPEG_ID_MPEG1 = 0x0010, +}; + +// MPEG Layer 3 Flags +enum { + CELL_SAIL_MPEGLAYER3_ID_UNKNOWN = 0, + CELL_SAIL_MPEGLAYER3_ID_MPEG = 1, + CELL_SAIL_MPEGLAYER3_ID_CONSTANTFRAMESIZE = 2, + CELL_SAIL_MPEGLAYER3_FLAG_PADDING_ISO = 0x00000000, + CELL_SAIL_MPEGLAYER3_FLAG_PADDING_ON = 0x00000001, + CELL_SAIL_MPEGLAYER3_FLAG_PADDING_OFF = 0x00000002, +}; + +// ES Types +enum { + CELL_SAIL_ES_AUDIO = 0, + CELL_SAIL_ES_VIDEO = 1, + CELL_SAIL_ES_USER = 2, +}; + +// Audio Coding Types +enum { + CELL_SAIL_AUDIO_CODING_UNSPECIFIED = -1, + CELL_SAIL_AUDIO_CODING_LPCM_FLOAT32 = 1, +}; + +enum { + CELL_SAIL_AUDIO_CHNUM_UNSPECIFIED = -1, + CELL_SAIL_AUDIO_CH_NUM_UNSPECIFIED = -1, + CELL_SAIL_AUDIO_AUSAMPLE_UNSPECIFIED = -1, + CELL_SAIL_AUDIO_SAMPLE_NUM_UNSPECIFIED = -1, +}; + +enum { + CELL_SAIL_AUDIO_FS_32000HZ = 32000, + CELL_SAIL_AUDIO_FS_44100HZ = 44100, + CELL_SAIL_AUDIO_FS_48000HZ = 48000, + + CELL_SAIL_AUDIO_FS_96000HZ = 96000, + CELL_SAIL_AUDIO_FS_88200HZ = 88200, + CELL_SAIL_AUDIO_FS_64000HZ = 64000, + //CELL_SAIL_AUDIO_FS_48000HZ = 48000, + //CELL_SAIL_AUDIO_FS_44100HZ = 44100, + //CELL_SAIL_AUDIO_FS_32000HZ = 32000, + CELL_SAIL_AUDIO_FS_24000HZ = 24000, + CELL_SAIL_AUDIO_FS_22050HZ = 22050, + CELL_SAIL_AUDIO_FS_16000HZ = 16000, + CELL_SAIL_AUDIO_FS_12000HZ = 12000, + CELL_SAIL_AUDIO_FS_11025HZ = 11025, + CELL_SAIL_AUDIO_FS_8000HZ = 8000, + CELL_SAIL_AUDIO_FS_7350HZ = 7350, + + CELL_SAIL_AUDIO_FS_192000HZ = 192000, + //CELL_SAIL_AUDIO_FS_11024HZ = 11025, + CELL_SAIL_AUDIO_FS_UNSPECIFIED = -1, + +}; + +enum { + CELL_SAIL_AUDIO_CH_LAYOUT_UNDEFINED = 0, + + // monoral + CELL_SAIL_AUDIO_CH_LAYOUT_1CH = 1, + + // 1. Front Left + // 2. Front Right + CELL_SAIL_AUDIO_CH_LAYOUT_2CH_LR = 2, + + // 1. Front Left + // 2. Front Center + // 3. Front Right + // for m4aac ac3 + CELL_SAIL_AUDIO_CH_LAYOUT_3CH_LCR = 3, + + // 1. Front Left + // 2. Front Center + // 3. Surround + // for m4aac ac3 + CELL_SAIL_AUDIO_CH_LAYOUT_3CH_LRc = 4, + + // 1. Front Left + // 2. Front Center + // 3. Front Right + // 4. Surround + // for m4aac ac3 + CELL_SAIL_AUDIO_CH_LAYOUT_4CH_LCRc = 5, + + // 1. Front Left + // 2. Front Right + // 3. Surround Left + // 4. Surround Right + // for m4aac + CELL_SAIL_AUDIO_CH_LAYOUT_4CH_LRlr = 6, + + // 1. Front Left + // 2. Front Center + // 3. Front Right + // 4. Surround Left + // 5. Surround Right + // for m4aac + CELL_SAIL_AUDIO_CH_LAYOUT_5CH_LCRlr = 7, + + // 1. Front Left + // 2. Front Center + // 3. Front Right + // 4. Surround Left + // 5. Surround Right + // 6. LFE + // for lpcm ac3 m4aac + CELL_SAIL_AUDIO_CH_LAYOUT_6CH_LCRlrE = 8, + + // 1. Front Left + // 2. Front Center + // 3. Front Right + // 4. Back Left + // 5. Back Right + // 6. LFE + // for at3plus + CELL_SAIL_AUDIO_CH_LAYOUT_6CH_LCRxyE = 9, + + // 1. Front Left + // 2. Front Center + // 3. Front Right + // 4. Back Left + // 5. Back Right + // 6. Back Center + // 7. LFE + // (for at3plus) + CELL_SAIL_AUDIO_CH_LAYOUT_7CH_LCRxycE = 10, + + // 1. Front Left + // 2. Front Center + // 3. Front Right + // 4. LFE + // 5. Surround Left + // 6. Surround Right + // 7. Back Left (Left-Extend) + // 8. Back Right (Right-Extend) + // for lpcm at3plus + CELL_SAIL_AUDIO_CH_LAYOUT_8CH_LRCElrxy = 11, + + CELL_SAIL_AUDIO_CH_LAYOUT_2CH_DUAL = 12, + CELL_SAIL_AUDIO_CH_LAYOUT_UNSPECIFIED = -1, +}; + +// Video Codings +enum { + CELL_SAIL_VIDEO_CODING_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_CODING_ARGB_INTERLEAVED = 0, + CELL_SAIL_VIDEO_CODING_RGBA_INTERLEAVED = 1, + CELL_SAIL_VIDEO_CODING_YUV422_U_Y0_V_Y1 = 2, + CELL_SAIL_VIDEO_CODING_YUV420_PLANAR = 3, + + // Suported by cellCamera + CELL_SAIL_VIDEO_CODING_YUV422_Y0_U_Y1_V = 4, + CELL_SAIL_VIDEO_CODING_YUV422_V_Y1_U_Y0 = 9, + CELL_SAIL_VIDEO_CODING_YUV422_Y1_V_Y0_U = 10, + CELL_SAIL_VIDEO_CODING_JPEG = 11, + CELL_SAIL_VIDEO_CODING_RAW8_BAYER_BGGR = 12, + _CELL_SAIL_VIDEO_CODING_TYPE_NUM_OF_ELEMENTS = 13, + CELL_SAIL_VIDEO_CODING_UYVY422_INTERLEAVED = 2, + CELL_SAIL_VIDEO_CODING_YUYV422_INTERLEAVED = 4, + CELL_SAIL_VIDEO_CODING_VYUY422_REVERSE_INTERLEAVED = 9, + CELL_SAIL_VIDEO_CODING_RAW8_BAYER_GRBG = 12, +}; + +// Video Color Types +enum { + CELL_SAIL_VIDEO_COLOR_MATRIX_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_COLOR_MATRIX_BT601 = 0, + CELL_SAIL_VIDEO_COLOR_MATRIX_BT709 = 1, + _CELL_SAIL_VIDEO_COLOR_MATRIX_TYPE_NUM_OF_ELEMENTS = 2, +}; + +// Video Scan Types +enum { + CELL_SAIL_VIDEO_SCAN_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_SCAN_PROGRESSIVE = 0, + CELL_SAIL_VIDEO_SCAN_INTERLACE = 1, + _CELL_SAIL_VIDEO_SCAN_TYPE_NUM_OF_ELEMENTS = 2, +}; + +// Framerates +enum { + CELL_SAIL_VIDEO_FRAME_RATE_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_FRAME_RATE_24000_1001HZ = 0, + CELL_SAIL_VIDEO_FRAME_RATE_24HZ = 1, + CELL_SAIL_VIDEO_FRAME_RATE_25HZ = 2, + CELL_SAIL_VIDEO_FRAME_RATE_30000_1001HZ = 3, + CELL_SAIL_VIDEO_FRAME_RATE_30HZ = 4, + CELL_SAIL_VIDEO_FRAME_RATE_50HZ = 5, + CELL_SAIL_VIDEO_FRAME_RATE_60000_1001HZ = 6, + CELL_SAIL_VIDEO_FRAME_RATE_60HZ = 7, + _CELL_SAIL_VIDEO_FRAME_RATE_TYPE_NUM_OF_ELEMENTS = 8, +}; + +// Aspect Ratios +enum { + CELL_SAIL_VIDEO_ASPECT_RATIO_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_ASPECT_RATIO_1_1 = 1, // 1920x1080 1280x720 + CELL_SAIL_VIDEO_ASPECT_RATIO_12_11 = 2, // 720x576 normal + CELL_SAIL_VIDEO_ASPECT_RATIO_10_11 = 3, // 720x480 normal + CELL_SAIL_VIDEO_ASPECT_RATIO_16_11 = 4, // 720x576 wide + CELL_SAIL_VIDEO_ASPECT_RATIO_40_33 = 5, // 720x480 wide + CELL_SAIL_VIDEO_ASPECT_RATIO_4_3 = 14, // 1440x1080 +}; + +enum { + CELL_SAIL_VIDEO_WIDTH_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_HEIGHT_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_PITCH_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_BITS_PER_COLOR_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_ALPHA_UNSPECIFIED = -1, +}; + +// Color Ranges +enum { + CELL_SAIL_VIDEO_COLOR_RANGE_UNSPECIFIED = -1, + CELL_SAIL_VIDEO_COLOR_RANGE_LIMITED = 1, + CELL_SAIL_VIDEO_COLOR_RANGE_FULL = 0, +}; + +enum { + CELL_SAIL_START_NOT_SPECIFIED = 0, + CELL_SAIL_START_NORMAL = 1 << 0, //1 + CELL_SAIL_START_TIME_SCALE = 1 << 2, //4 + CELL_SAIL_START_EP_SKIP = 1 << 4, //16 + CELL_SAIL_START_EP_SKIP_REVERSE = 1 << 5, //32 + CELL_SAIL_START_FRAME_STEP = 1 << 6, //64 +}; + +// Seek Types +enum { + CELL_SAIL_SEEK_NOT_SPECIFIED = 0, + CELL_SAIL_SEEK_ABSOLUTE_BYTE_POSITION = 1 << 0, // For PAMF + CELL_SAIL_SEEK_RELATIVE_BYTE_POSITION = 1 << 1, // Not implemented + CELL_SAIL_SEEK_ABSOLUTE_TIME_POSITION = 1 << 4, // MP4, AVI + CELL_SAIL_SEEK_CURRENT_POSITION = 1 << 6, + CELL_SAIL_SEEK_MP4_SCALE_AND_TIME = 1 << 4, // For MP4, obsolete +}; + +// Terminus Types +enum { + CELL_SAIL_TERMINUS_NOT_SPECIFIED = 0, + CELL_SAIL_TERMINUS_EOS = 1 << 0, + CELL_SAIL_TERMINUS_ABSOLUTE_BYTE_POSITION = 1 << 1, // For PAMF + CELL_SAIL_TERMINUS_RELATIVE_BYTE_POSITION = 1 << 2, // Mot implemented + CELL_SAIL_TERMINUS_ABSOLUTE_TIME_POSITION = 1 << 5, // For MP4, AVI + CELL_SAIL_TERMINUS_MP4_SCALE_AND_TIME = 1 << 5, // For MP4, obsolete + CELL_SAIL_TERMINUS_MP4_SCALE_ANT_TIME = 1 << 5, // For MP4, here because of a typo +}; + +// Start Flag Types +enum { + CELL_SAIL_START_FLAG_NOT_SPECIFIED = 0, + CELL_SAIL_START_FLAG_UNFLUSH = 1 << 0, + CELL_SAIL_START_FLAG_PAUSE_BEGIN = 1 << 1, + CELL_SAIL_START_FLAG_PAUSE_END = 1 << 2, + CELL_SAIL_START_FLAG_COMPLETE_STREAM = 1 << 3, + CELL_SAIL_START_FLAG_STICKY = 1 << 4, + CELL_SAIL_START_FLAG_PAUSE = 1 << 1, // Obsolete +}; + +enum { + _CELL_SAIL_SYNC_SHIFT_NUM = 8, + + // Buffering + CELL_SAIL_SYNC_UNDERFLOW = 1, + // = 2, Reserved + + // Sync Status + CELL_SAIL_SYNC_ON_TIME = 1 << 2, + CELL_SAIL_SYNC_MAYBE_ON_TIME = 2 << 2, + CELL_SAIL_SYNC_EARLY = 3 << 2, + CELL_SAIL_SYNC_LATE = 4 << 2, + CELL_SAIL_SYNC_NO_SYNC = 5 << 2, + CELL_SAIL_SYNC_NO_PTS = 6 << 2, + CELL_SAIL_SYNC_NOT_READY = 7 << 2, + CELL_SAIL_SYNC_DISABLED = 8 << 2, + CELL_SAIL_SYNC_PAUSED = 9 << 2, + CELL_SAIL_SYNC_DISABLED_PAUSED = 10 << 2, + CELL_SAIL_SYNC_MUTED = 11 << 2, + CELL_SAIL_SYNC_DONE = 12 << 2, + // = 13 << 2, Reserved + // = 14 << 2, Reserved + // = 15 << 2, Reserved + + //CELL_SAIL_SYNC_FIRST_FRAME = 64, + //CELL_SAIL_SYNC_LAST_FRAME = 128, + + + // Frame Status + CELL_SAIL_SYNC_NO_FRAME = 0, + CELL_SAIL_SYNC_REPEATED = 1 << _CELL_SAIL_SYNC_SHIFT_NUM, + CELL_SAIL_SYNC_NEXT = 2 << _CELL_SAIL_SYNC_SHIFT_NUM, + CELL_SAIL_SYNC_SKIPPED_ONE = 3 << _CELL_SAIL_SYNC_SHIFT_NUM, +}; + +enum { + CELL_SAIL_EVENT_RECORDER_CALL_COMPLETED = 2, + CELL_SAIL_EVENT_RECORDER_STATE_CHANGED = 3, +}; + + +enum { + CELL_SAIL_VIDEO_FRAME_RATE_100HZ = 8, + CELL_SAIL_VIDEO_FRAME_RATE_120000_1001HZ = 9, + CELL_SAIL_VIDEO_FRAME_RATE_120HZ = 10, +}; + +enum { + CELL_SAIL_GRAPHICS_ADAPTER_FIELD_TOP = 0, + CELL_SAIL_GRAPHICS_ADAPTER_FIELD_BOTTOM = 1, + CELL_SAIL_GRAPHICS_ADAPTER_FIELD_DONT_CARE = 2, +}; + +enum { + CELL_SAIL_SOURCE_SEEK_ABSOLUTE_BYTE_POSITION = 1 << 0, +}; + +enum { + CELL_SAIL_SOURCE_CAPABILITY_NONE = 0, + CELL_SAIL_SOURCE_CAPABILITY_SEEK_ABSOLUTE_BYTE_POSITION = 1 << 0, + CELL_SAIL_SOURCE_CAPABILITY_PAUSE = 1 << 4, + CELL_SAIL_SOURCE_CAPABILITY_GAPLESS = 1 << 5, + CELL_SAIL_SOURCE_CAPABILITY_EOS = 1 << 6, + CELL_SAIL_SOURCE_CAPABILITY_SEEK_ABSOLUTE_TIME_POSITION = 1 << 7, +}; + struct CellSailAudioFormat { s8 coding; @@ -105,8 +618,8 @@ union CellSailEvent }; }; -typedef void(*CellSailMemAllocatorFuncAlloc)(u32 pArg, u32 boundary, u32 size); -typedef void(*CellSailMemAllocatorFuncFree)(u32 pArg, u32 boundary, u32 pMemory); +typedef u32(*CellSailMemAllocatorFuncAlloc)(u32 pArg, u32 boundary, u32 size); +typedef u32(*CellSailMemAllocatorFuncFree)(u32 pArg, u32 boundary, u32 pMemory); typedef int(*CellSailSoundAdapterFuncMakeup)(u32 pArg); typedef int(*CellSailSoundAdapterFuncCleanup)(u32 pArg); @@ -172,7 +685,7 @@ struct CellSailMemAllocatorFuncs struct CellSailMemAllocator { - CellSailMemAllocatorFuncs callbacks; + vm::ptr callbacks; be_t pArg; }; @@ -522,6 +1035,9 @@ struct CellSailMpegLayer3WaveFormat struct CellSailDescriptor { + bool autoSelection; + bool registered; + be_t streamType; be_t internalData[32]; }; @@ -577,5 +1093,13 @@ struct CellSailPlayerResource struct CellSailPlayer { - be_t internalData[128]; + vm::ptr allocator; + vm::ptr callback; + be_t callbackArgument; + vm::ptr attribute; + vm::ptr resource; + vm::ptr playbackCommand; + be_t repeatMode; + be_t descriptors; + vm::ptr registeredDescriptors[2]; }; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp index 61dad6c763..e5796c775a 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSaveData.cpp @@ -178,7 +178,7 @@ void getSaveDataStat(SaveDataEntry entry, vm::ptr statGet) strcpy_trunc(statGet->getParam.listParam, entry.listParam); statGet->fileNum = 0; - statGet->fileList = vm::bptr::make(0); + statGet->fileList.set(be_t::make(0)); statGet->fileListNum = 0; std::string saveDir = "/dev_hdd0/home/00000001/savedata/" + entry.dirName; // TODO: Get the path of the current user vfsDir dir(saveDir); @@ -210,7 +210,7 @@ void getSaveDataStat(SaveDataEntry entry, vm::ptr statGet) } } - statGet->fileList = vm::bptr::make(be_t::MakeFromLE((u32)Memory.Alloc(sizeof(CellSaveDataFileStat) * (u32)fileEntries.size(), sizeof(CellSaveDataFileStat)))); + statGet->fileList = vm::bptr::make(be_t::make((u32)Memory.Alloc(sizeof(CellSaveDataFileStat) * (u32)fileEntries.size(), sizeof(CellSaveDataFileStat)))); for (u32 i=0; ifileList[i], &fileEntries[i], sizeof(CellSaveDataFileStat)); } @@ -989,7 +989,7 @@ int cellSaveDataFixedExport() //const char *dirName, u32 maxSizeKB, CellSaveData return CELL_SAVEDATA_RET_OK; } -int cellSaveDataGetListItem() //const char *dirName, CellSaveDataDirStat *dir, CellSaveDataSystemFileParam *sysFileParam, vm::ptr> bind, vm::ptr> sizeKB +int cellSaveDataGetListItem() //const char *dirName, CellSaveDataDirStat *dir, CellSaveDataSystemFileParam *sysFileParam, vm::ptr bind, vm::ptr sizeKB { UNIMPLEMENTED_FUNC(cellSysutil); return CELL_SAVEDATA_RET_OK; @@ -1025,7 +1025,7 @@ int cellSaveDataUserFixedExport() //CellSysutilUserId userId, const char *dirNam return CELL_SAVEDATA_RET_OK; } -int cellSaveDataUserGetListItem() //CellSysutilUserId userId, const char *dirName, CellSaveDataDirStat *dir, CellSaveDataSystemFileParam *sysFileParam, vm::ptr> bind, vm::ptr> sizeKB +int cellSaveDataUserGetListItem() //CellSysutilUserId userId, const char *dirName, CellSaveDataDirStat *dir, CellSaveDataSystemFileParam *sysFileParam, vm::ptr bind, vm::ptr sizeKB { UNIMPLEMENTED_FUNC(cellSysutil); return CELL_SAVEDATA_RET_OK; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp index 7d6a2d4721..997cd8c5f8 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.cpp @@ -1,10 +1,17 @@ #include "stdafx.h" #include "Emu/Memory/Memory.h" +#include "Emu/System.h" #include "Emu/SysCalls/Modules.h" #include "Emu/SysCalls/Callback.h" -#include "Emu/SysCalls/lv2/sys_spu.h" +#include "Emu/Cell/SPUThread.h" +#include "Emu/SysCalls/lv2/sys_ppu_thread.h" +#include "Emu/SysCalls/lv2/sys_memory.h" +#include "Emu/SysCalls/lv2/sys_process.h" +#include "Emu/SysCalls/lv2/sys_semaphore.h" +#include "Emu/SysCalls/lv2/sys_event.h" #include "Emu/Cell/SPURSManager.h" +#include "sysPrxForUser.h" #include "cellSpurs.h" Module *cellSpurs = nullptr; @@ -14,41 +21,658 @@ extern u32 libsre; extern u32 libsre_rtoc; #endif +s64 spursCreateLv2EventQueue(vm::ptr spurs, u32& queue_id, vm::ptr port, s32 size, u64 name_u64) +{ +#ifdef PRX_DEBUG_XXX + vm::var> queue; + s32 res = cb_call, vm::ptr, vm::ptr, s32, u32>(GetCurrentPPUThread(), libsre + 0xB14C, libsre_rtoc, + spurs, queue, port, size, vm::read32(libsre_rtoc - 0x7E2C)); + queue_id = queue->ToLE(); + return res; +#endif + + queue_id = event_queue_create(SYS_SYNC_FIFO, SYS_PPU_QUEUE, name_u64, 0, size); + if (!queue_id) + { + return CELL_EAGAIN; // rough + } + + assert(spursAttachLv2EventQueue(spurs, queue_id, port, 1, true) == CELL_OK); + return CELL_OK; +} + s64 spursInit( - vm::ptr spurs, - u32 revision, - u32 sdkVersion, - s32 nSpus, - s32 spuPriority, - s32 ppuPriority, + vm::ptr spurs, + const u32 revision, + const u32 sdkVersion, + const s32 nSpus, + const s32 spuPriority, + const s32 ppuPriority, u32 flags, // SpursAttrFlags const char prefix[], - u32 prefixSize, - u32 container, + const u32 prefixSize, + const u32 container, const u8 swlPriority[], - u32 swlMaxSpu, - u32 swlIsPreem) + const u32 swlMaxSpu, + const u32 swlIsPreem) { - // internal function -#ifdef PRX_DEBUG - return cb_call, u32, u32, s32, s32, s32, u32, u32, u32, u32, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x74E4, libsre_rtoc, +#ifdef PRX_DEBUG_XXX + return cb_call, u32, u32, s32, s32, s32, u32, u32, u32, u32, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x74E4, libsre_rtoc, spurs, revision, sdkVersion, nSpus, spuPriority, ppuPriority, flags, Memory.RealToVirtualAddr(prefix), prefixSize, container, Memory.RealToVirtualAddr(swlPriority), swlMaxSpu, swlIsPreem); -#else - //spurs->spurs = new SPURSManager(attr); - return CELL_OK; #endif + + // SPURS initialization (asserts should actually rollback and return the error instead) + + if (!spurs) + { + return CELL_SPURS_CORE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_CORE_ERROR_ALIGN; + } + if (prefixSize > CELL_SPURS_NAME_MAX_LENGTH) + { + return CELL_SPURS_CORE_ERROR_INVAL; + } + if (process_is_spu_lock_line_reservation_address(spurs.addr(), SYS_MEMORY_ACCESS_RIGHT_SPU_THR) != CELL_OK) + { + return CELL_SPURS_CORE_ERROR_PERM; + } + + const bool isSecond = (flags & SAF_SECOND_VERSION) != 0; + memset(spurs.get_ptr(), 0, CellSpurs::size1 + isSecond * CellSpurs::size2); + spurs->m.revision = revision; + spurs->m.sdkVersion = sdkVersion; + spurs->m.ppu0 = 0xffffffffull; + spurs->m.ppu1 = 0xffffffffull; + spurs->m.flags = flags; + memcpy(spurs->m.prefix, prefix, prefixSize); + spurs->m.prefixSize = (u8)prefixSize; + + std::string name(prefix, prefixSize); // initialize name string + + if (!isSecond) + { + spurs->m.wklMskA.write_relaxed(be_t::make(0xffff)); + } + spurs->m.xCC = 0; + spurs->m.xCD = 0; + spurs->m.xCE = 0; + for (u32 i = 0; i < 8; i++) + { + spurs->m.xC0[i] = -1; + } + + // default or system workload: +#ifdef PRX_DEBUG + spurs->m.wklSysG.pm.set(be_t::make(vm::read32(libsre_rtoc - 0x7EA4))); + spurs->m.wklSysG.size = 0x2200; +#else + spurs->m.wklSysG.pm.set(be_t::make(0x100)); // wrong 64-bit address +#endif + spurs->m.wklSysG.data = 0; + spurs->m.wklSysG.copy.write_relaxed(0xff); + u32 sem; + for (u32 i = 0; i < 0x10; i++) + { + sem = semaphore_create(0, 1, SYS_SYNC_PRIORITY, *(u64*)"_spuWkl"); + assert(sem && ~sem); // should rollback if semaphore creation failed and return the error + spurs->m.wklF1[i].sem = sem; + } + if (isSecond) + { + for (u32 i = 0; i < 0x10; i++) + { + sem = semaphore_create(0, 1, SYS_SYNC_PRIORITY, *(u64*)"_spuWkl"); + assert(sem && ~sem); + spurs->m.wklF2[i].sem = sem; + } + } + sem = semaphore_create(0, 1, SYS_SYNC_PRIORITY, *(u64*)"_spuPrv"); + assert(sem && ~sem); + spurs->m.semPrv = sem; + spurs->m.unk11 = -1; + spurs->m.unk12 = -1; + spurs->m.unk13 = 0; + spurs->m.nSpus = nSpus; + spurs->m.spuPriority = spuPriority; +#ifdef PRX_DEBUG + assert(spu_image_import(spurs->m.spuImg, vm::read32(libsre_rtoc - (isSecond ? 0x7E94 : 0x7E98)), 1) == CELL_OK); +#else + spurs->m.spuImg.addr = Memory.Alloc(0x40000, 4096); +#endif + + s32 tgt = SYS_SPU_THREAD_GROUP_TYPE_NORMAL; + if (flags & SAF_SPU_TGT_EXCLUSIVE_NON_CONTEXT) + { + tgt = SYS_SPU_THREAD_GROUP_TYPE_EXCLUSIVE_NON_CONTEXT; + } + else if (flags & SAF_UNKNOWN_FLAG_0) + { + tgt = 0xC02; + } + if (flags & SAF_SPU_MEMORY_CONTAINER_SET) tgt |= SYS_SPU_THREAD_GROUP_TYPE_MEMORY_FROM_CONTAINER; + if (flags & SAF_SYSTEM_WORKLOAD_ENABLED) tgt |= SYS_SPU_THREAD_GROUP_TYPE_COOPERATE_WITH_SYSTEM; + if (flags & SAF_UNKNOWN_FLAG_7) tgt |= 0x102; + if (flags & SAF_UNKNOWN_FLAG_8) tgt |= 0xC02; + if (flags & SAF_UNKNOWN_FLAG_9) tgt |= 0x800; + auto tg = spu_thread_group_create(name + "CellSpursKernelGroup", nSpus, spuPriority, tgt, container); + assert(tg); + spurs->m.spuTG = tg->m_id; + + name += "CellSpursKernel0"; + for (s32 num = 0; num < nSpus; num++, name[name.size() - 1]++) + { + spurs->m.spus[num] = spu_thread_initialize(tg, num, spurs->m.spuImg, name, SYS_SPU_THREAD_OPTION_DEC_SYNC_TB_ENABLE, 0, 0, 0, 0, [spurs, num, isSecond](SPUThread& SPU) + { +#ifdef PRX_DEBUG_XXX + SPU.GPR[3]._u32[3] = num; + SPU.GPR[4]._u64[1] = spurs.addr(); + return SPU.FastCall(SPU.PC); +#endif + + // code replacement: + { + const u32 addr = /*SPU.ReadLS32(0x1e0) +*/ 8; //SPU.ReadLS32(0x1e4); + SPU.WriteLS32(addr + 0, 3); // hack for cellSpursModulePollStatus + SPU.WriteLS32(addr + 4, 0x35000000); // bi $0 + SPU.WriteLS32(0x1e4, addr); + + SPU.WriteLS32(SPU.ReadLS32(0x1e0), 2); // hack for cellSpursModuleExit + } + + if (!isSecond) SPU.m_code3_func = [spurs, num](SPUThread& SPU) -> u64 // first kernel + { + LV2_LOCK(0); // TODO: lock-free implementation if possible + + const u32 arg1 = SPU.GPR[3]._u32[3]; + u32 var0 = SPU.ReadLS32(0x1d8); + u32 var1 = SPU.ReadLS32(0x1dc); + u128 wklA = vm::read128(spurs.addr() + 0x20); + u128 wklB = vm::read128(spurs.addr() + 0x30); + u128 savedA = SPU.ReadLS128(0x180); + u128 savedB = SPU.ReadLS128(0x190); + u128 vAA = u128::sub8(wklA, savedA); + u128 vBB = u128::sub8(wklB, savedB); + u128 vM1 = {}; if (var1 <= 15) vM1.u8r[var1] = 0xff; + u128 vAABB = (arg1 == 0) ? vAA : u128::add8(vAA, u128::andnot(vM1, vBB)); + + u32 vNUM = 0x20; + u64 vRES = 0x20ull << 32; + u128 vSET = {}; + + if (spurs->m.x72.read_relaxed() & (1 << num)) + { + SPU.WriteLS8(0x1eb, 0); // var4 + if (arg1 == 0 || var1 == 0x20) + { + spurs->m.x72._and_not(1 << num); + } + } + else + { + u128 wklReadyCount0 = vm::read128(spurs.addr() + 0x0); + u128 wklReadyCount1 = vm::read128(spurs.addr() + 0x10); + u128 savedC = SPU.ReadLS128(0x1A0); + u128 savedD = SPU.ReadLS128(0x1B0); + u128 vRC = u128::add8(u128::minu8(wklReadyCount0, u128::from8p(8)), u128::minu8(wklReadyCount1, u128::from8p(8))); + u32 wklFlag = spurs->m.wklFlag.flag.read_relaxed(); + u32 flagRecv = spurs->m.flagRecv.read_relaxed(); + u128 vFM = u128::fromV(g_imm_table.fsmb_table[(wklFlag == 0) && (flagRecv < 16) ? 0x8000 >> flagRecv : 0]); + u128 wklSet1 = u128::fromV(g_imm_table.fsmb_table[spurs->m.wklSet1.read_relaxed()]); + u128 vFMS1 = vFM | wklSet1; + u128 vFMV1 = u128::fromV(g_imm_table.fsmb_table[(var1 < 16) ? 0x8000 >> var1 : 0]); + u32 var5 = SPU.ReadLS32(0x1ec); + u128 wklMinCnt = vm::read128(spurs.addr() + 0x40); + u128 wklMaxCnt = vm::read128(spurs.addr() + 0x50); + u128 vCC = u128::andnot(vFMS1, u128::eq8(wklReadyCount0, {}) | u128::leu8(vRC, vAABB)) | + u128::leu8(wklMaxCnt, vAABB) | + u128::eq8(savedC, {}) | + u128::fromV(g_imm_table.fsmb_table[(~var5) >> 16]); + u128 vCCH1 = u128::andnot(vCC, + u128::from8p(0x80) & (vFMS1 | u128::gtu8(wklReadyCount0, vAABB)) | + u128::from8p(0x7f) & savedC); + u128 vCCL1 = u128::andnot(vCC, + u128::from8p(0x80) & vFMV1 | + u128::from8p(0x40) & u128::gtu8(vAABB, {}) & u128::gtu8(wklMinCnt, vAABB) | + u128::from8p(0x3c) & u128::fromV(_mm_slli_epi32(u128::sub8(u128::from8p(8), vAABB).vi, 2)) | + u128::from8p(0x02) & u128::eq8(savedD, u128::from8p((u8)var0)) | + u128::from8p(0x01)); + u128 vSTAT = + u128::from8p(0x01) & u128::gtu8(wklReadyCount0, vAABB) | + u128::from8p(0x02) & wklSet1 | + u128::from8p(0x04) & vFM; + + for (s32 i = 0, max = -1; i < 0x10; i++) + { + const s32 value = ((s32)vCCH1.u8r[i] << 8) | ((s32)vCCL1.u8r[i]); + if (value > max && (vCC.u8r[i] & 1) == 0) + { + vNUM = i; + max = value; + } + } + + if (vNUM < 0x10) + { + vRES = ((u64)vNUM << 32) | vSTAT.u8r[vNUM]; + vSET.u8r[vNUM] = 0x01; + } + + SPU.WriteLS8(0x1eb, vNUM == 0x20); + + if (!arg1 || var1 == vNUM) + { + spurs->m.wklSet1._and_not(be_t::make((u16)(vNUM < 16 ? 0x8000 >> vNUM : 0))); + if (vNUM == flagRecv && wklFlag == 0) + { + spurs->m.wklFlag.flag.write_relaxed(be_t::make(-1)); + } + } + } + + if (arg1 == 0) + { + vm::write128(spurs.addr() + 0x20, u128::add8(vAA, vSET)); // update wklA + + SPU.WriteLS128(0x180, vSET); // update savedA + SPU.WriteLS32(0x1dc, vNUM); // update var1 + } + + if (arg1 == 1 && vNUM != var1) + { + vm::write128(spurs.addr() + 0x30, u128::add8(vBB, vSET)); // update wklB + + SPU.WriteLS128(0x190, vSET); // update savedB + } + else + { + vm::write128(spurs.addr() + 0x30, vBB); // update wklB + + SPU.WriteLS128(0x190, {}); // update savedB + } + + return vRES; + }; + else SPU.m_code3_func = [spurs, num](SPUThread& SPU) -> u64 // second kernel + { + LV2_LOCK(0); // TODO: lock-free implementation if possible + + const u32 arg1 = SPU.GPR[3]._u32[3]; + u32 var0 = SPU.ReadLS32(0x1d8); + u32 var1 = SPU.ReadLS32(0x1dc); + u128 wklA = vm::read128(spurs.addr() + 0x20); + u128 wklB = vm::read128(spurs.addr() + 0x30); + u128 savedA = SPU.ReadLS128(0x180); + u128 savedB = SPU.ReadLS128(0x190); + u128 vAA = u128::sub8(wklA, savedA); + u128 vBB = u128::sub8(wklB, savedB); + u128 vM1 = {}; if (var1 <= 31) vM1.u8r[var1 & 0xf] = (var1 <= 15) ? 0xf : 0xf0; + u128 vAABB = (arg1 == 0) ? vAA : u128::add8(vAA, u128::andnot(vM1, vBB)); + + u32 vNUM = 0x20; + u64 vRES = 0x20ull << 32; + u128 vSET = {}; + + if (spurs->m.x72.read_relaxed() & (1 << num)) + { + SPU.WriteLS8(0x1eb, 0); // var4 + if (arg1 == 0 || var1 == 0x20) + { + spurs->m.x72._and_not(1 << num); + } + } + else + { + u128 wklReadyCount0 = vm::read128(spurs.addr() + 0x0); + u128 wklReadyCount1 = vm::read128(spurs.addr() + 0x10); + u128 savedC = SPU.ReadLS128(0x1A0); + u128 wklMaxCnt = vm::read128(spurs.addr() + 0x50); + u32 wklFlag = spurs->m.wklFlag.flag.read_relaxed(); + u32 flagRecv = spurs->m.flagRecv.read_relaxed(); + u128 wklSet1 = u128::fromV(g_imm_table.fsmb_table[spurs->m.wklSet1.read_relaxed()]); + u128 wklSet2 = u128::fromV(g_imm_table.fsmb_table[spurs->m.wklSet2.read_relaxed()]); + u128 vABL = vAABB & u128::from8p(0x0f); + u128 vABH = u128::fromV(_mm_srli_epi32((vAABB & u128::from8p(0xf0)).vi, 4)); + u32 var5 = SPU.ReadLS32(0x1ec); + u128 v5L = u128::fromV(g_imm_table.fsmb_table[var5 >> 16]); + u128 v5H = u128::fromV(g_imm_table.fsmb_table[(u16)var5]); + u128 vFML = u128::fromV(g_imm_table.fsmb_table[(wklFlag == 0) && (flagRecv < 16) ? 0x8000 >> flagRecv : 0]); + u128 vFMH = u128::fromV(g_imm_table.fsmb_table[(u16)((wklFlag == 0) && (flagRecv < 32) ? 0x80000000 >> flagRecv : 0)]); + u128 vCL = u128::fromV(_mm_slli_epi32((savedC & u128::from8p(0x0f)).vi, 4)); + u128 vCH = savedC & u128::from8p(0xf0); + u128 vABRL = u128::gtu8(wklReadyCount0, vABL); + u128 vABRH = u128::gtu8(wklReadyCount1, vABH); + u128 vCCL = v5L & u128::gtu8(vCL, {}) & u128::gtu8(wklMaxCnt & u128::from8p(0x0f), vABL) & (wklSet1 | vFML | vABRL); + u128 vCCH = v5H & u128::gtu8(vCH, {}) & u128::gtu8(u128::fromV(_mm_srli_epi32((wklMaxCnt & u128::from8p(0xf0)).vi, 4)), vABH) & (wklSet2 | vFMH | vABRH); + u128 v1H = {}; if (var1 <= 31 && var1 > 15) v1H.u8r[var1 & 0xf] = 4; + u128 v1L = {}; if (var1 <= 15) v1L.u8r[var1] = 4; + u128 vCH1 = (v1H | vCH & u128::from8p(0xFB)) & vCCH; + u128 vCL1 = (v1L | vCL & u128::from8p(0xFB)) & vCCL; + u128 vSTATL = vABRL & u128::from8p(1) | wklSet1 & u128::from8p(2) | vFML & u128::from8p(4); + u128 vSTATH = vABRH & u128::from8p(1) | wklSet2 & u128::from8p(2) | vFMH & u128::from8p(4); + + s32 max = -1; + for (u32 i = 0; i < 0x10; i++) + { + const s32 value = vCL1.u8r[i]; + if (value > max && (vCCL.u8r[i] & 1)) + { + vNUM = i; + max = value; + } + } + for (u32 i = 16; i < 0x20; i++) + { + const s32 value = vCH1.u8r[i]; + if (value > max && (vCCH.u8r[i] & 1)) + { + vNUM = i; + max = value; + } + } + + if (vNUM < 0x10) + { + vRES = ((u64)vNUM << 32) | vSTATL.u8r[vNUM]; + vSET.u8r[vNUM] = 0x01; + } + else if (vNUM < 0x20) + { + vRES = ((u64)vNUM << 32) | vSTATH.u8r[vNUM & 0xf]; + vSET.u8r[vNUM] = 0x10; + } + + SPU.WriteLS8(0x1eb, vNUM == 0x20); + + if (!arg1 || var1 == vNUM) + { + spurs->m.wklSet1._and_not(be_t::make((u16)(vNUM < 16 ? 0x8000 >> vNUM : 0))); + spurs->m.wklSet2._and_not(be_t::make((u16)(0x80000000 >> vNUM))); + if (vNUM == flagRecv && wklFlag == 0) + { + spurs->m.wklFlag.flag.write_relaxed(be_t::make(-1)); + } + } + } + + if (arg1 == 0) + { + vm::write128(spurs.addr() + 0x20, u128::add8(vAA, vSET)); // update wklA + + SPU.WriteLS128(0x180, vSET); // update savedA + SPU.WriteLS32(0x1dc, vNUM); // update var1 + } + + if (arg1 == 1 && vNUM != var1) + { + vm::write128(spurs.addr() + 0x30, u128::add8(vBB, vSET)); // update wklB + + SPU.WriteLS128(0x190, vSET); // update savedB + } + else + { + vm::write128(spurs.addr() + 0x30, vBB); // update wklB + + SPU.WriteLS128(0x190, {}); // update savedB + } + + return vRES; + }; + //SPU.m_code3_func = [spurs, num](SPUThread& SPU) -> u64 // test + //{ + // LV2_LOCK(0); + // SPU.FastCall(0x290); + // u64 vRES = SPU.GPR[3]._u64[1]; + // return vRES; + //}; + + SPU.WriteLS128(0x1c0, u128::from32r(0, spurs.addr(), num, 0x1f)); + + u32 wid = 0x20; + u32 stat = 0; + while (true) + { + if (Emu.IsStopped()) + { + cellSpurs->Warning("Spurs Kernel aborted"); + return; + } + + // get current workload info: + auto& wkl = wid <= 15 ? spurs->m.wklG1[wid] : (wid <= 31 && isSecond ? spurs->m.wklG2[wid & 0xf] : spurs->m.wklSysG); + + if (SPU.ReadLS64(0x1d0) != wkl.pm.addr()) + { + // load executable code: + memcpy(vm::get_ptr(SPU.ls_offset + 0xa00), wkl.pm.get_ptr(), wkl.size); + SPU.WriteLS64(0x1d0, wkl.pm.addr()); + SPU.WriteLS32(0x1d8, wkl.copy.read_relaxed()); + } + + if (!isSecond) SPU.WriteLS16(0x1e8, 0); + + // run workload: + SPU.GPR[1]._u32[3] = 0x3FFB0; + SPU.GPR[3]._u32[3] = 0x100; + SPU.GPR[4]._u64[1] = wkl.data; + SPU.GPR[5]._u32[3] = stat; + SPU.FastCall(0xa00); + + // check status: + auto status = SPU.SPU.Status.GetValue(); + if (status == SPU_STATUS_STOPPED_BY_STOP) + { + return; + } + else + { + assert(status == SPU_STATUS_RUNNING); + } + + // get workload id: + SPU.GPR[3].clear(); + assert(SPU.m_code3_func); + u64 res = SPU.m_code3_func(SPU); + stat = (u32)(res); + wid = (u32)(res >> 32); + } + + })->GetId(); + } + + if (flags & SAF_SPU_PRINTF_ENABLED) + { + // spu_printf: attach group + if (!spu_printf_agcb || spu_printf_agcb(tg->m_id) != CELL_OK) + { + // remove flag if failed + spurs->m.flags &= ~SAF_SPU_PRINTF_ENABLED; + } + } + + assert(lwmutex_create(spurs->m.mutex, SYS_SYNC_PRIORITY, SYS_SYNC_NOT_RECURSIVE, *(u64*)"_spuPrv") == CELL_OK); + assert(lwcond_create(spurs->m.cond, spurs->m.mutex, *(u64*)"_spuPrv") == CELL_OK); + + spurs->m.flags1 = (flags & SAF_EXIT_IF_NO_WORK ? SF1_EXIT_IF_NO_WORK : 0) | (isSecond ? SF1_IS_SECOND : 0); + spurs->m.flagRecv.write_relaxed(0xff); + spurs->m.wklFlag.flag.write_relaxed(be_t::make(-1)); + spurs->_u8[0xD64] = 0; + spurs->_u8[0xD65] = 0; + spurs->_u8[0xD66] = 0; + spurs->m.ppuPriority = ppuPriority; + + u32 queue; + assert(spursCreateLv2EventQueue(spurs, queue, vm::ptr::make(spurs.addr() + 0xc9), 0x2a, *(u64*)"_spuPrv") == CELL_OK); + spurs->m.queue = queue; + + u32 port = event_port_create(0); + assert(port && ~port); + spurs->m.port = port; + + assert(sys_event_port_connect_local(port, queue) == CELL_OK); + + name = std::string(prefix, prefixSize); + + spurs->m.ppu0 = ppu_thread_create(0, 0, ppuPriority, 0x4000, true, false, name + "SpursHdlr0", [spurs](PPUThread& CPU) + { +#ifdef PRX_DEBUG_XXX + return cb_call>(CPU, libsre + 0x9214, libsre_rtoc, spurs); +#endif + + if (spurs->m.flags & SAF_UNKNOWN_FLAG_30) + { + return; + } + + while (true) + { + if (Emu.IsStopped()) + { + cellSpurs->Warning("SPURS Handler Thread 0 aborted"); + return; + } + + if (spurs->m.flags1 & SF1_EXIT_IF_NO_WORK) + { + assert(sys_lwmutex_lock(spurs->get_lwmutex(), 0) == CELL_OK); + if (spurs->m.xD66.read_relaxed()) + { + assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == CELL_OK); + return; + } + else while (true) + { + spurs->m.xD64.exchange(0); + if (spurs->m.exception.ToBE() == 0) + { + bool do_break = false; + for (u32 i = 0; i < 16; i++) + { + if (spurs->m.wklStat1[i].read_relaxed() == 2 && + spurs->m.wklG1[i].priority.ToBE() != 0 && + spurs->m.wklMaxCnt[i].read_relaxed() & 0xf + ) + { + if (spurs->m.wklReadyCount[i].read_relaxed() || + spurs->m.wklSet1.read_relaxed() & (0x8000u >> i) || + (spurs->m.wklFlag.flag.read_relaxed() == 0 && + spurs->m.flagRecv.read_relaxed() == (u8)i + )) + { + do_break = true; + break; + } + } + } + if (spurs->m.flags1 & SF1_IS_SECOND) for (u32 i = 0; i < 16; i++) + { + if (spurs->m.wklStat2[i].read_relaxed() == 2 && + spurs->m.wklG2[i].priority.ToBE() != 0 && + spurs->m.wklMaxCnt[i].read_relaxed() & 0xf0 + ) + { + if (spurs->m.wklReadyCount[i + 0x10].read_relaxed() || + spurs->m.wklSet2.read_relaxed() & (0x8000u >> i) || + (spurs->m.wklFlag.flag.read_relaxed() == 0 && + spurs->m.flagRecv.read_relaxed() == (u8)i + 0x10 + )) + { + do_break = true; + break; + } + } + } + if (do_break) break; // from while + } + + spurs->m.xD65.exchange(1); + if (spurs->m.xD64.read_relaxed() == 0) + { + assert(sys_lwcond_wait(spurs->get_lwcond(), 0) == CELL_OK); + } + spurs->m.xD65.exchange(0); + if (spurs->m.xD66.read_relaxed()) + { + assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == CELL_OK); + return; + } + } + assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == CELL_OK); + } + + if (Emu.IsStopped()) continue; + + assert(sys_spu_thread_group_start(spurs->m.spuTG) == CELL_OK); + if (s32 res = sys_spu_thread_group_join(spurs->m.spuTG, vm::ptr::make(0), vm::ptr::make(0))) + { + if (res == CELL_ESTAT) + { + return; + } + assert(res == CELL_OK); + } + + if (Emu.IsStopped()) continue; + + if ((spurs->m.flags1 & SF1_EXIT_IF_NO_WORK) == 0) + { + assert(spurs->m.xD66.read_relaxed() == 1 || Emu.IsStopped()); + return; + } + } + })->GetId(); + + spurs->m.ppu1 = ppu_thread_create(0, 0, ppuPriority, 0x8000, true, false, name + "SpursHdlr1", [spurs](PPUThread& CPU) + { +#ifdef PRX_DEBUG + return cb_call>(CPU, libsre + 0xB40C, libsre_rtoc, spurs); +#endif + + })->GetId(); + + // enable exception event handler + if (spurs->m.enableEH.compare_and_swap_test(be_t::make(0), be_t::make(1))) + { + assert(sys_spu_thread_group_connect_event(spurs->m.spuTG, spurs->m.queue, SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION) == CELL_OK); + } + + spurs->m.unk22 = 0; + // can also use cellLibprof if available (omitted) + + // some unknown subroutine + spurs->m.sub3.unk1 = spurs.addr() + 0xc9; + spurs->m.sub3.unk2 = 3; // unknown const + spurs->m.sub3.port = (u64)spurs->m.port; + + if (flags & SAF_SYSTEM_WORKLOAD_ENABLED) // initialize system workload + { + s32 res = CELL_OK; +#ifdef PRX_DEBUG + res = cb_call, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x10428, libsre_rtoc, + spurs, Memory.RealToVirtualAddr(swlPriority), swlMaxSpu, swlIsPreem); +#endif + assert(res == CELL_OK); + } + else if (flags & SAF_EXIT_IF_NO_WORK) // wakeup + { + return spursWakeUp(spurs); + } + + return CELL_OK; } s64 cellSpursInitialize(vm::ptr spurs, s32 nSpus, s32 spuPriority, s32 ppuPriority, bool exitIfNoWork) { cellSpurs->Warning("cellSpursInitialize(spurs_addr=0x%x, nSpus=%d, spuPriority=%d, ppuPriority=%d, exitIfNoWork=%d)", spurs.addr(), nSpus, spuPriority, ppuPriority, exitIfNoWork ? 1 : 0); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x8480, libsre_rtoc); -#else +#endif + return spursInit( - vm::ptr::make(spurs.addr()), + spurs, 0, 0, nSpus, @@ -61,16 +685,15 @@ s64 cellSpursInitialize(vm::ptr spurs, s32 nSpus, s32 spuPriority, s3 nullptr, 0, 0); -#endif } s64 cellSpursInitializeWithAttribute(vm::ptr spurs, vm::ptr attr) { cellSpurs->Warning("cellSpursInitializeWithAttribute(spurs_addr=0x%x, attr_addr=0x%x)", spurs.addr(), attr.addr()); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x839C, libsre_rtoc); -#else +#endif + if (!attr) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -85,7 +708,7 @@ s64 cellSpursInitializeWithAttribute(vm::ptr spurs, vm::ptr::make(spurs.addr()), + spurs, attr->m.revision, attr->m.sdkVersion, attr->m.nSpus, @@ -98,16 +721,15 @@ s64 cellSpursInitializeWithAttribute(vm::ptr spurs, vm::ptrm.swlPriority, attr->m.swlMaxSpu, attr->m.swlIsPreem); -#endif } -s64 cellSpursInitializeWithAttribute2(vm::ptr spurs, vm::ptr attr) +s64 cellSpursInitializeWithAttribute2(vm::ptr spurs, vm::ptr attr) { cellSpurs->Warning("cellSpursInitializeWithAttribute2(spurs_addr=0x%x, attr_addr=0x%x)", spurs.addr(), attr.addr()); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x82B4, libsre_rtoc); -#else +#endif + if (!attr) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -128,24 +750,23 @@ s64 cellSpursInitializeWithAttribute2(vm::ptr spurs, vm::ptrm.nSpus, attr->m.spuPriority, attr->m.ppuPriority, - attr->m.flags.ToLE() | (attr->m.exitIfNoWork ? SAF_EXIT_IF_NO_WORK : 0) | 4, // +add unknown flag + attr->m.flags.ToLE() | (attr->m.exitIfNoWork ? SAF_EXIT_IF_NO_WORK : 0) | SAF_SECOND_VERSION, attr->m.prefix, attr->m.prefixSize, attr->m.container, attr->m.swlPriority, attr->m.swlMaxSpu, attr->m.swlIsPreem); -#endif } s64 _cellSpursAttributeInitialize(vm::ptr attr, u32 revision, u32 sdkVersion, u32 nSpus, s32 spuPriority, s32 ppuPriority, bool exitIfNoWork) { cellSpurs->Warning("_cellSpursAttributeInitialize(attr_addr=0x%x, revision=%d, sdkVersion=0x%x, nSpus=%d, spuPriority=%d, ppuPriority=%d, exitIfNoWork=%d)", attr.addr(), revision, sdkVersion, nSpus, spuPriority, ppuPriority, exitIfNoWork ? 1 : 0); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x72CC, libsre_rtoc); -#else +#endif + if (!attr) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -163,16 +784,15 @@ s64 _cellSpursAttributeInitialize(vm::ptr attr, u32 revision attr->m.ppuPriority = ppuPriority; attr->m.exitIfNoWork = exitIfNoWork; return CELL_OK; -#endif } s64 cellSpursAttributeSetMemoryContainerForSpuThread(vm::ptr attr, u32 container) { cellSpurs->Warning("cellSpursAttributeSetMemoryContainerForSpuThread(attr_addr=0x%x, container=%d)", attr.addr(), container); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x6FF8, libsre_rtoc); -#else +#endif + if (!attr) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -190,16 +810,15 @@ s64 cellSpursAttributeSetMemoryContainerForSpuThread(vm::ptr attr->m.container = container; attr->m.flags |= SAF_SPU_MEMORY_CONTAINER_SET; return CELL_OK; -#endif } s64 cellSpursAttributeSetNamePrefix(vm::ptr attr, vm::ptr prefix, u32 size) { cellSpurs->Warning("cellSpursAttributeSetNamePrefix(attr_addr=0x%x, prefix_addr=0x%x, size=%d)", attr.addr(), prefix.addr(), size); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x7234, libsre_rtoc); -#else +#endif + if (!attr || !prefix) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -217,16 +836,15 @@ s64 cellSpursAttributeSetNamePrefix(vm::ptr attr, vm::ptrm.prefix, prefix.get_ptr(), size); attr->m.prefixSize = size; return CELL_OK; -#endif } s64 cellSpursAttributeEnableSpuPrintfIfAvailable(vm::ptr attr) { cellSpurs->Warning("cellSpursAttributeEnableSpuPrintfIfAvailable(attr_addr=0x%x)", attr.addr()); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x7150, libsre_rtoc); -#else +#endif + if (!attr) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -238,16 +856,15 @@ s64 cellSpursAttributeEnableSpuPrintfIfAvailable(vm::ptr att attr->m.flags |= SAF_SPU_PRINTF_ENABLED; return CELL_OK; -#endif } s64 cellSpursAttributeSetSpuThreadGroupType(vm::ptr attr, s32 type) { cellSpurs->Warning("cellSpursAttributeSetSpuThreadGroupType(attr_addr=0x%x, type=%d)", attr.addr(), type); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x70C8, libsre_rtoc); -#else +#endif + if (!attr) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -274,17 +891,16 @@ s64 cellSpursAttributeSetSpuThreadGroupType(vm::ptr attr, s3 return CELL_SPURS_CORE_ERROR_INVAL; } return CELL_OK; -#endif } s64 cellSpursAttributeEnableSystemWorkload(vm::ptr attr, vm::ptr priority, u32 maxSpu, vm::ptr isPreemptible) { cellSpurs->Warning("cellSpursAttributeEnableSystemWorkload(attr_addr=0x%x, priority_addr=0x%x, maxSpu=%d, isPreemptible_addr=0x%x)", attr.addr(), priority.addr(), maxSpu, isPreemptible.addr()); - #ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0xF410, libsre_rtoc); -#else +#endif + if (!attr) { return CELL_SPURS_CORE_ERROR_NULL_POINTER; @@ -333,53 +949,191 @@ s64 cellSpursAttributeEnableSystemWorkload(vm::ptr attr, vm: } } return CELL_SPURS_CORE_ERROR_INVAL; -#endif } s64 cellSpursFinalize(vm::ptr spurs) { cellSpurs->Warning("cellSpursFinalize(spurs_addr=0x%x)", spurs.addr()); - -#ifdef PRX_DEBUG +#ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x8568, libsre_rtoc); -#else - spurs->spurs->Finalize(); +#endif + if (!spurs) + { + return CELL_SPURS_CORE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_CORE_ERROR_ALIGN; + } + if (spurs->m.xD66.read_relaxed()) + { + return CELL_SPURS_CORE_ERROR_STAT; + } + + + + return CELL_OK; +} + +s64 spursAttachLv2EventQueue(vm::ptr spurs, u32 queue, vm::ptr port, s32 isDynamic, bool wasCreated) +{ +#ifdef PRX_DEBUG_XXX + return cb_call, u32, vm::ptr, s32, bool>(GetCurrentPPUThread(), libsre + 0xAE34, libsre_rtoc, + spurs, queue, port, isDynamic, wasCreated); +#endif + + if (!spurs || !port) + { + return CELL_SPURS_CORE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_CORE_ERROR_ALIGN; + } + if (spurs->m.exception.ToBE()) + { + return CELL_SPURS_CORE_ERROR_STAT; + } + + s32 sdk_ver; + assert(process_get_sdk_version(process_getpid(), sdk_ver) == CELL_OK); + if (sdk_ver == -1) sdk_ver = 0x460000; + + u8 _port = 0x3f; + u64 port_mask = 0; + + if (isDynamic == 0) + { + _port = *port; + if (_port > 0x3f) + { + return CELL_SPURS_CORE_ERROR_INVAL; + } + if (sdk_ver > 0x17ffff && _port > 0xf) + { + return CELL_SPURS_CORE_ERROR_PERM; + } + } + + for (u32 i = isDynamic ? 0x10 : _port; i <= _port; i++) + { + port_mask |= 1ull << (i); + } + + assert(port_mask); // zero mask will return CELL_EINVAL + if (s32 res = sys_spu_thread_group_connect_event_all_threads(spurs->m.spuTG, queue, port_mask, port)) + { + if (res == CELL_EISCONN) + { + return CELL_SPURS_CORE_ERROR_BUSY; + } + return res; + } + + if (!wasCreated) + { + spurs->m.spups |= be_t::make(1ull << *port); // atomic bitwise or + } + return CELL_OK; +} + +s64 cellSpursAttachLv2EventQueue(vm::ptr spurs, u32 queue, vm::ptr port, s32 isDynamic) +{ + cellSpurs->Warning("cellSpursAttachLv2EventQueue(spurs_addr=0x%x, queue=%d, port_addr=0x%x, isDynamic=%d)", + spurs.addr(), queue, port.addr(), isDynamic); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0xAFE0, libsre_rtoc); +#endif + + return spursAttachLv2EventQueue(spurs, queue, port, isDynamic, false); +} + +s64 cellSpursDetachLv2EventQueue(vm::ptr spurs, u8 port) +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("cellSpursDetachLv2EventQueue(spurs_addr=0x%x, port=%d)", spurs.addr(), port); + return GetCurrentPPUThread().FastCall2(libsre + 0xB144, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); return CELL_OK; #endif } -s64 cellSpursGetSpuThreadGroupId(vm::ptr spurs, vm::ptr> group) +s64 cellSpursGetSpuGuid() { #ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xEFB0, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursGetSpuThreadGroupId(vm::ptr spurs, vm::ptr group) +{ cellSpurs->Warning("cellSpursGetSpuThreadGroupId(spurs_addr=0x%x, group_addr=0x%x)", spurs.addr(), group.addr()); +#ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x8B30, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; #endif + + if (!spurs || !group) + { + return CELL_SPURS_CORE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_CORE_ERROR_ALIGN; + } + + *group = spurs->m.spuTG; + return CELL_OK; } -s64 cellSpursGetNumSpuThread(vm::ptr spurs, vm::ptr> nThreads) +s64 cellSpursGetNumSpuThread(vm::ptr spurs, vm::ptr nThreads) { -#ifdef PRX_DEBUG cellSpurs->Warning("cellSpursGetNumSpuThread(spurs_addr=0x%x, nThreads_addr=0x%x)", spurs.addr(), nThreads.addr()); +#ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x8B78, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; #endif + + if (!spurs || !nThreads) + { + return CELL_SPURS_CORE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_CORE_ERROR_ALIGN; + } + + *nThreads = (u32)spurs->m.nSpus; + return CELL_OK; } -s64 cellSpursGetSpuThreadId(vm::ptr spurs, vm::ptr> thread, vm::ptr> nThreads) +s64 cellSpursGetSpuThreadId(vm::ptr spurs, vm::ptr thread, vm::ptr nThreads) { -#ifdef PRX_DEBUG cellSpurs->Warning("cellSpursGetSpuThreadId(spurs_addr=0x%x, thread_addr=0x%x, nThreads_addr=0x%x)", spurs.addr(), thread.addr(), nThreads.addr()); +#ifdef PRX_DEBUG_XXX return GetCurrentPPUThread().FastCall2(libsre + 0x8A98, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; #endif + + if (!spurs || !thread || !nThreads) + { + return CELL_SPURS_CORE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_CORE_ERROR_ALIGN; + } + + const u32 count = std::min(*nThreads, spurs->m.nSpus); + for (u32 i = 0; i < count; i++) + { + thread[i] = spurs->m.spus[i]; + } + *nThreads = count; + return CELL_OK; } s64 cellSpursSetMaxContention(vm::ptr spurs, u32 workloadId, u32 maxContention) @@ -415,29 +1169,6 @@ s64 cellSpursSetPreemptionVictimHints(vm::ptr spurs, vm::ptr spurs, u32 queue, vm::ptr port, s32 isDynamic) -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("cellSpursAttachLv2EventQueue(spurs_addr=0x%x, queue=%d, port_addr=0x%x, isDynamic=%d)", - spurs.addr(), queue, port.addr(), isDynamic); - return GetCurrentPPUThread().FastCall2(libsre + 0xAFE0, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursDetachLv2EventQueue(vm::ptr spurs, u8 port) -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("cellSpursDetachLv2EventQueue(spurs_addr=0x%x, port=0x%x)", spurs.addr(), port); - return GetCurrentPPUThread().FastCall2(libsre + 0xB144, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - s64 cellSpursEnableExceptionEventHandler(vm::ptr spurs, bool flag) { #ifdef PRX_DEBUG @@ -483,6 +1214,629 @@ s64 cellSpursGetInfo(vm::ptr spurs, vm::ptr info) #endif } +s64 spursWakeUp(vm::ptr spurs) +{ +#ifdef PRX_DEBUG_XXX + return cb_call>(GetCurrentPPUThread(), libsre + 0x84D8, libsre_rtoc, spurs); +#endif + + if (!spurs) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + if (spurs->m.exception.ToBE()) + { + return CELL_SPURS_POLICY_MODULE_ERROR_STAT; + } + + spurs->m.xD64.exchange(1); + if (spurs->m.xD65.read_sync()) + { + assert(sys_lwmutex_lock(spurs->get_lwmutex(), 0) == 0); + assert(sys_lwcond_signal(spurs->get_lwcond()) == 0); + assert(sys_lwmutex_unlock(spurs->get_lwmutex()) == 0); + } + return CELL_OK; +} + +s64 cellSpursWakeUp(vm::ptr spurs) +{ + cellSpurs->Warning("%s(spurs_addr=0x%x)", __FUNCTION__, spurs.addr()); + + return spursWakeUp(spurs); +} + +s32 spursAddWorkload( + vm::ptr spurs, + vm::ptr wid, + vm::ptr pm, + u32 size, + u64 data, + const u8 priorityTable[], + u32 minContention, + u32 maxContention, + vm::ptr nameClass, + vm::ptr nameInstance, + vm::ptr hook, + vm::ptr hookArg) +{ +#ifdef PRX_DEBUG_XXX + return cb_call, vm::ptr, vm::ptr, u32, u64, u32, u32, u32, u32, u32, u32, u32>(GetCurrentPPUThread(), libsre + 0x96EC, libsre_rtoc, + spurs, wid, pm, size, data, Memory.RealToVirtualAddr(priorityTable), minContention, maxContention, + nameClass.addr(), nameInstance.addr(), hook.addr(), hookArg.addr()); +#endif + + if (!spurs || !wid || !pm) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128 || pm.addr() % 16) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + if (minContention == 0 || *(u64*)priorityTable & 0xf0f0f0f0f0f0f0f0ull) // check if some priority > 15 + { + return CELL_SPURS_POLICY_MODULE_ERROR_INVAL; + } + if (spurs->m.exception.ToBE()) + { + return CELL_SPURS_POLICY_MODULE_ERROR_STAT; + } + + u32 wnum; + const u32 wmax = spurs->m.flags1 & SF1_IS_SECOND ? 0x20u : 0x10u; // TODO: check if can be changed + spurs->m.wklMskA.atomic_op([spurs, wmax, &wnum](be_t& value) + { + wnum = cntlz32(~(u32)value); // found empty position + if (wnum < wmax) + { + value |= (u32)(0x80000000ull >> wnum); // set workload bit + } + }); + + *wid = wnum; // store workload id + if (wnum >= wmax) + { + return CELL_SPURS_POLICY_MODULE_ERROR_AGAIN; + } + + u32 index = wnum & 0xf; + if (wnum <= 15) + { + assert((spurs->m.wklA[wnum] & 0xf) == 0); + assert((spurs->m.wklB[wnum] & 0xf) == 0); + spurs->m.wklStat1[wnum].write_relaxed(1); + spurs->m.wklD1[wnum] = 0; + spurs->m.wklE1[wnum] = 0; + spurs->m.wklG1[wnum].pm = pm; + spurs->m.wklG1[wnum].data = data; + spurs->m.wklG1[wnum].size = size; + spurs->m.wklG1[wnum].priority = *(be_t*)priorityTable; + spurs->m.wklH1[wnum].nameClass = nameClass; + spurs->m.wklH1[wnum].nameInstance = nameInstance; + memset(spurs->m.wklF1[wnum].unk0, 0, 0x20); // clear struct preserving semaphore id + memset(spurs->m.wklF1[wnum].unk1, 0, 0x58); + if (hook) + { + spurs->m.wklF1[wnum].hook = hook; + spurs->m.wklF1[wnum].hookArg = hookArg; + spurs->m.wklE1[wnum] |= 2; + } + if ((spurs->m.flags1 & SF1_IS_SECOND) == 0) + { + spurs->m.wklReadyCount[wnum + 16].write_relaxed(0); + spurs->m.wklMinCnt[wnum] = minContention > 8 ? 8 : minContention; + } + } + else + { + assert((spurs->m.wklA[index] & 0xf0) == 0); + assert((spurs->m.wklB[index] & 0xf0) == 0); + spurs->m.wklStat2[index].write_relaxed(1); + spurs->m.wklD2[index] = 0; + spurs->m.wklE2[index] = 0; + spurs->m.wklG2[index].pm = pm; + spurs->m.wklG2[index].data = data; + spurs->m.wklG2[index].size = size; + spurs->m.wklG2[index].priority = *(be_t*)priorityTable; + spurs->m.wklH2[index].nameClass = nameClass; + spurs->m.wklH2[index].nameInstance = nameInstance; + memset(spurs->m.wklF2[index].unk0, 0, 0x20); // clear struct preserving semaphore id + memset(spurs->m.wklF2[index].unk1, 0, 0x58); + if (hook) + { + spurs->m.wklF2[index].hook = hook; + spurs->m.wklF2[index].hookArg = hookArg; + spurs->m.wklE2[index] |= 2; + } + } + spurs->m.wklReadyCount[wnum].write_relaxed(0); + + if (wnum <= 15) + { + spurs->m.wklMaxCnt[wnum].atomic_op([maxContention](u8& v) + { + v &= ~0xf; + v |= (maxContention > 8 ? 8 : maxContention); + }); + spurs->m.wklSet1._and_not({ be_t::make(0x8000 >> index) }); // clear bit in wklFlag1 + } + else + { + spurs->m.wklMaxCnt[index].atomic_op([maxContention](u8& v) + { + v &= ~0xf0; + v |= (maxContention > 8 ? 8 : maxContention) << 4; + }); + spurs->m.wklSet2._and_not({ be_t::make(0x8000 >> index) }); // clear bit in wklFlag2 + } + + spurs->m.flagRecv.compare_and_swap(wnum, 0xff); + + u32 res_wkl; + CellSpurs::_sub_str3& wkl = wnum <= 15 ? spurs->m.wklG1[wnum] : spurs->m.wklG2[wnum & 0xf]; + spurs->m.wklMskB.atomic_op_sync([spurs, &wkl, wnum, &res_wkl](be_t& v) + { + const u32 mask = v.ToLE() & ~(0x80000000u >> wnum); + res_wkl = 0; + + for (u32 i = 0, m = 0x80000000, k = 0; i < 32; i++, m >>= 1) + { + if (mask & m) + { + CellSpurs::_sub_str3& current = i <= 15 ? spurs->m.wklG1[i] : spurs->m.wklG2[i & 0xf]; + if (current.pm.addr() == wkl.pm.addr()) + { + // if a workload with identical policy module found + res_wkl = current.copy.read_relaxed(); + break; + } + else + { + k |= 0x80000000 >> current.copy.read_relaxed(); + res_wkl = cntlz32(~k); + } + } + } + + wkl.copy.exchange((u8)res_wkl); + v = mask | (0x80000000u >> wnum); + }); + assert(res_wkl <= 31); + + spurs->wklStat(wnum).exchange(2); + spurs->m.xBD.exchange(0xff); + spurs->m.x72.exchange(0xff); + return CELL_OK; +} + +s64 cellSpursAddWorkload( + vm::ptr spurs, + vm::ptr wid, + vm::ptr pm, + u32 size, + u64 data, + vm::ptr priorityTable, + u32 minContention, + u32 maxContention) +{ + cellSpurs->Warning("%s(spurs_addr=0x%x, wid_addr=0x%x, pm_addr=0x%x, size=0x%x, data=0x%llx, priorityTable_addr=0x%x, minContention=0x%x, maxContention=0x%x)", + __FUNCTION__, spurs.addr(), wid.addr(), pm.addr(), size, data, priorityTable.addr(), minContention, maxContention); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0x9ED0, libsre_rtoc); +#endif + + return spursAddWorkload( + spurs, + wid, + pm, + size, + data, + *priorityTable, + minContention, + maxContention, + vm::ptr::make(0), + vm::ptr::make(0), + vm::ptr::make(0), + vm::ptr::make(0)); +} + +s64 _cellSpursWorkloadAttributeInitialize( + vm::ptr attr, + u32 revision, + u32 sdkVersion, + vm::ptr pm, + u32 size, + u64 data, + vm::ptr priorityTable, + u32 minContention, + u32 maxContention) +{ + cellSpurs->Warning("%s(attr_addr=0x%x, revision=%d, sdkVersion=0x%x, pm_addr=0x%x, size=0x%x, data=0x%llx, priorityTable_addr=0x%x, minContention=0x%x, maxContention=0x%x)", + __FUNCTION__, attr.addr(), revision, sdkVersion, pm.addr(), size, data, priorityTable.addr(), minContention, maxContention); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0x9F08, libsre_rtoc); +#endif + + if (!attr) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (attr.addr() % 8) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + if (!pm) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (pm.addr() % 16) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + if (minContention == 0 || *(u64*)*priorityTable & 0xf0f0f0f0f0f0f0f0ull) // check if some priority > 15 + { + return CELL_SPURS_POLICY_MODULE_ERROR_INVAL; + } + + memset(attr.get_ptr(), 0, CellSpursWorkloadAttribute::size); + attr->m.revision = revision; + attr->m.sdkVersion = sdkVersion; + attr->m.pm = pm; + attr->m.size = size; + attr->m.data = data; + *(u64*)attr->m.priority = *(u64*)*priorityTable; + attr->m.minContention = minContention; + attr->m.maxContention = maxContention; + return CELL_OK; +} + +s64 cellSpursWorkloadAttributeSetName(vm::ptr attr, vm::ptr nameClass, vm::ptr nameInstance) +{ + cellSpurs->Warning("%s(attr_addr=0x%x, nameClass_addr=0x%x, nameInstance_addr=0x%x)", __FUNCTION__, attr.addr(), nameClass.addr(), nameInstance.addr()); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0x9664, libsre_rtoc); +#endif + + if (!attr) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (attr.addr() % 8) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + + attr->m.nameClass = nameClass; + attr->m.nameInstance = nameInstance; + return CELL_OK; +} + +s64 cellSpursWorkloadAttributeSetShutdownCompletionEventHook(vm::ptr attr, vm::ptr hook, vm::ptr arg) +{ + cellSpurs->Warning("%s(attr_addr=0x%x, hook_addr=0x%x, arg=0x%x)", __FUNCTION__, attr.addr(), hook.addr(), arg.addr()); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0x96A4, libsre_rtoc); +#endif + + if (!attr || !hook) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (attr.addr() % 8) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + + attr->m.hook = hook; + attr->m.hookArg = arg; + return CELL_OK; +} + +s64 cellSpursAddWorkloadWithAttribute(vm::ptr spurs, vm::ptr wid, vm::ptr attr) +{ + cellSpurs->Warning("%s(spurs_addr=0x%x, wid_addr=0x%x, attr_addr=0x%x)", __FUNCTION__, spurs.addr(), wid.addr(), attr.addr()); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0x9E14, libsre_rtoc); +#endif + + if (!attr) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (attr.addr() % 8) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + if (attr->m.revision != be_t::make(1)) + { + return CELL_SPURS_POLICY_MODULE_ERROR_INVAL; + } + + return spursAddWorkload( + spurs, + wid, + vm::ptr::make(attr->m.pm.addr()), + attr->m.size, + attr->m.data, + attr->m.priority, + attr->m.minContention, + attr->m.maxContention, + vm::ptr::make(attr->m.nameClass.addr()), + vm::ptr::make(attr->m.nameInstance.addr()), + vm::ptr::make(attr->m.hook.addr()), + vm::ptr::make(attr->m.hookArg.addr())); +} + +s64 cellSpursRemoveWorkload() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xA414, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursWaitForWorkloadShutdown() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xA20C, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursShutdownWorkload() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xA060, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 _cellSpursWorkloadFlagReceiver(vm::ptr spurs, u32 wid, u32 is_set) +{ + cellSpurs->Warning("%s(spurs_addr=0x%x, wid=%d, is_set=%d)", __FUNCTION__, spurs.addr(), wid, is_set); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0xF158, libsre_rtoc); +#endif + + if (!spurs) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + if (wid >= (spurs->m.flags1 & SF1_IS_SECOND ? 0x20u : 0x10u)) + { + return CELL_SPURS_POLICY_MODULE_ERROR_INVAL; + } + if ((spurs->m.wklMskA.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0) + { + return CELL_SPURS_POLICY_MODULE_ERROR_SRCH; + } + if (spurs->m.exception.ToBE()) + { + return CELL_SPURS_POLICY_MODULE_ERROR_STAT; + } + if (s32 res = spurs->m.wklFlag.flag.atomic_op_sync(0, [spurs, wid, is_set](be_t& flag) -> s32 + { + if (is_set) + { + if (spurs->m.flagRecv.read_relaxed() != 0xff) + { + return CELL_SPURS_POLICY_MODULE_ERROR_BUSY; + } + } + else + { + if (spurs->m.flagRecv.read_relaxed() != wid) + { + return CELL_SPURS_POLICY_MODULE_ERROR_PERM; + } + } + flag = -1; + return 0; + })) + { + return res; + } + + spurs->m.flagRecv.atomic_op([wid, is_set](u8& FR) + { + if (is_set) + { + if (FR == 0xff) + { + FR = (u8)wid; + } + } + else + { + if (FR == wid) + { + FR = 0xff; + } + } + }); + return CELL_OK; +} + +s64 cellSpursGetWorkloadFlag(vm::ptr spurs, vm::ptr> flag) +{ + cellSpurs->Warning("%s(spurs_addr=0x%x, flag_addr=0x%x)", __FUNCTION__, spurs.addr(), flag.addr()); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0xEC00, libsre_rtoc); +#endif + + if (!spurs || !flag) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + + flag->set(Memory.RealToVirtualAddr(&spurs->m.wklFlag)); + return CELL_OK; +} + +s64 cellSpursSendWorkloadSignal() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xA658, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursGetWorkloadData() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xA78C, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursReadyCountStore(vm::ptr spurs, u32 wid, u32 value) +{ + cellSpurs->Warning("%s(spurs_addr=0x%x, wid=%d, value=0x%x)", __FUNCTION__, spurs.addr(), wid, value); +#ifdef PRX_DEBUG_XXX + return GetCurrentPPUThread().FastCall2(libsre + 0xAB2C, libsre_rtoc); +#endif + + if (!spurs) + { + return CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER; + } + if (spurs.addr() % 128) + { + return CELL_SPURS_POLICY_MODULE_ERROR_ALIGN; + } + if (wid >= (spurs->m.flags1 & SF1_IS_SECOND ? 0x20u : 0x10u) || value > 0xff) + { + return CELL_SPURS_POLICY_MODULE_ERROR_INVAL; + } + if ((spurs->m.wklMskA.read_relaxed().ToLE() & (0x80000000u >> wid)) == 0) + { + return CELL_SPURS_POLICY_MODULE_ERROR_SRCH; + } + if (spurs->m.exception.ToBE() || spurs->wklStat(wid).read_relaxed() != 2) + { + return CELL_SPURS_POLICY_MODULE_ERROR_STAT; + } + + spurs->m.wklReadyCount[wid].exchange((u8)value); + return CELL_OK; +} + +s64 cellSpursReadyCountAdd() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xA868, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursReadyCountCompareAndSwap() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xA9CC, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursReadyCountSwap() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xAC34, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursRequestIdleSpu() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xAD88, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursGetWorkloadInfo() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xE70C, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 _cellSpursWorkloadFlagReceiver2() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xF298, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursSetExceptionEventHandler() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xDB54, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + +s64 cellSpursUnsetExceptionEventHandler() +{ +#ifdef PRX_DEBUG + cellSpurs->Warning("%s()", __FUNCTION__); + return GetCurrentPPUThread().FastCall2(libsre + 0xD77C, libsre_rtoc); +#else + UNIMPLEMENTED_FUNC(cellSpurs); + return CELL_OK; +#endif +} + s64 _cellSpursEventFlagInitialize(vm::ptr spurs, vm::ptr taskset, vm::ptr eventFlag, u32 flagClearMode, u32 flagDirection) { #ifdef PRX_DEBUG @@ -517,7 +1871,7 @@ s64 cellSpursEventFlagDetachLv2EventQueue(vm::ptr eventFlag) #endif } -s64 cellSpursEventFlagWait(vm::ptr eventFlag, vm::ptr> mask, u32 mode) +s64 cellSpursEventFlagWait(vm::ptr eventFlag, vm::ptr mask, u32 mode) { #ifdef PRX_DEBUG cellSpurs->Warning("cellSpursEventFlagWait(eventFlag_addr=0x%x, mask_addr=0x%x, mode=%d)", eventFlag.addr(), mask.addr(), mode); @@ -550,7 +1904,7 @@ s64 cellSpursEventFlagSet(vm::ptr eventFlag, u16 bits) #endif } -s64 cellSpursEventFlagTryWait(vm::ptr eventFlag, vm::ptr> mask, u32 mode) +s64 cellSpursEventFlagTryWait(vm::ptr eventFlag, vm::ptr mask, u32 mode) { #ifdef PRX_DEBUG cellSpurs->Warning("cellSpursEventFlagTryWait(eventFlag_addr=0x%x, mask_addr=0x%x, mode=0x%x)", eventFlag.addr(), mask.addr(), mode); @@ -561,7 +1915,7 @@ s64 cellSpursEventFlagTryWait(vm::ptr eventFlag, vm::ptr eventFlag, vm::ptr> direction) +s64 cellSpursEventFlagGetDirection(vm::ptr eventFlag, vm::ptr direction) { #ifdef PRX_DEBUG cellSpurs->Warning("cellSpursEventFlagGetDirection(eventFlag_addr=0x%x, direction_addr=0x%x)", eventFlag.addr(), direction.addr()); @@ -572,7 +1926,7 @@ s64 cellSpursEventFlagGetDirection(vm::ptr eventFlag, vm::pt #endif } -s64 cellSpursEventFlagGetClearMode(vm::ptr eventFlag, vm::ptr> clear_mode) +s64 cellSpursEventFlagGetClearMode(vm::ptr eventFlag, vm::ptr clear_mode) { #ifdef PRX_DEBUG cellSpurs->Warning("cellSpursEventFlagGetClearMode(eventFlag_addr=0x%x, clear_mode_addr=0x%x)", eventFlag.addr(), clear_mode.addr()); @@ -928,7 +2282,7 @@ s64 cellSpursJoinTaskset(vm::ptr taskset) #endif } -s64 cellSpursGetTasksetId(vm::ptr taskset, vm::ptr> workloadId) +s64 cellSpursGetTasksetId(vm::ptr taskset, vm::ptr workloadId) { #ifdef PRX_DEBUG cellSpurs->Warning("cellSpursGetTasksetId(taskset_addr=0x%x, workloadId_addr=0x%x)", taskset.addr(), workloadId.addr()); @@ -950,7 +2304,7 @@ s64 cellSpursShutdownTaskset(vm::ptr taskset) #endif } -s64 cellSpursCreateTask(vm::ptr taskset, vm::ptr> taskID, u32 elf_addr, u32 context_addr, u32 context_size, vm::ptr lsPattern, +s64 cellSpursCreateTask(vm::ptr taskset, vm::ptr taskID, u32 elf_addr, u32 context_addr, u32 context_size, vm::ptr lsPattern, vm::ptr argument) { #ifdef PRX_DEBUG @@ -1278,28 +2632,6 @@ s64 cellSpursTasksetGetSpursAddress() #endif } -s64 cellSpursSetExceptionEventHandler() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xDB54, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursUnsetExceptionEventHandler() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xD77C, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - s64 cellSpursGetTasksetInfo() { #ifdef PRX_DEBUG @@ -1421,237 +2753,6 @@ s64 cellSpursJobChainGetError() #endif } -s64 cellSpursWorkloadAttributeSetName() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0x9664, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursWorkloadAttributeSetShutdownCompletionEventHook() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0x96A4, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursAddWorkloadWithAttribute() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0x9E14, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursRemoveWorkload() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xA414, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursWaitForWorkloadShutdown() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xA20C, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursAddWorkload() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0x9ED0, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursWakeUp() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0x84D8, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursShutdownWorkload() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xA060, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 _cellSpursWorkloadFlagReceiver() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xF158, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursGetWorkloadFlag() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xEC00, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursReadyCountStore() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xAB2C, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 _cellSpursWorkloadAttributeInitialize() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0x9F08, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursSendWorkloadSignal() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xA658, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursGetWorkloadData() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xA78C, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursReadyCountAdd() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xA868, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursReadyCountCompareAndSwap() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xA9CC, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursReadyCountSwap() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xAC34, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursRequestIdleSpu() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xAD88, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursGetWorkloadInfo() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xE70C, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 cellSpursGetSpuGuid() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xEFB0, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - -s64 _cellSpursWorkloadFlagReceiver2() -{ -#ifdef PRX_DEBUG - cellSpurs->Warning("%s()", __FUNCTION__); - return GetCurrentPPUThread().FastCall2(libsre + 0xF298, libsre_rtoc); -#else - UNIMPLEMENTED_FUNC(cellSpurs); - return CELL_OK; -#endif -} - s64 cellSpursGetJobPipelineInfo() { #ifdef PRX_DEBUG diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h index c01d38c5c3..4e72b50826 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpurs.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSpurs.h @@ -1,4 +1,7 @@ #pragma once +#include "Emu/SysCalls/lv2/sys_lwmutex.h" +#include "Emu/SysCalls/lv2/sys_lwcond.h" +#include "Emu/SysCalls/lv2/sys_spu.h" // Core return codes. enum @@ -14,6 +17,27 @@ enum CELL_SPURS_CORE_ERROR_NULL_POINTER = 0x80410711, }; +// +enum +{ + CELL_SPURS_POLICY_MODULE_ERROR_AGAIN = 0x80410801, + CELL_SPURS_POLICY_MODULE_ERROR_INVAL = 0x80410802, + CELL_SPURS_POLICY_MODULE_ERROR_NOSYS = 0x80410803, + CELL_SPURS_POLICY_MODULE_ERROR_NOMEM = 0x80410804, + CELL_SPURS_POLICY_MODULE_ERROR_SRCH = 0x80410805, + CELL_SPURS_POLICY_MODULE_ERROR_NOENT = 0x80410806, + CELL_SPURS_POLICY_MODULE_ERROR_NOEXEC = 0x80410807, + CELL_SPURS_POLICY_MODULE_ERROR_DEADLK = 0x80410808, + CELL_SPURS_POLICY_MODULE_ERROR_PERM = 0x80410809, + CELL_SPURS_POLICY_MODULE_ERROR_BUSY = 0x8041080A, + CELL_SPURS_POLICY_MODULE_ERROR_ABORT = 0x8041080C, + CELL_SPURS_POLICY_MODULE_ERROR_FAULT = 0x8041080D, + CELL_SPURS_POLICY_MODULE_ERROR_CHILD = 0x8041080E, + CELL_SPURS_POLICY_MODULE_ERROR_STAT = 0x8041080F, + CELL_SPURS_POLICY_MODULE_ERROR_ALIGN = 0x80410810, + CELL_SPURS_POLICY_MODULE_ERROR_NULL_POINTER = 0x80410811, +}; + // Task return codes. enum { @@ -32,6 +56,38 @@ enum CELL_SPURS_TASK_ERROR_SHUTDOWN = 0x80410920, }; +enum +{ + CELL_SPURS_JOB_ERROR_AGAIN = 0x80410A01, + CELL_SPURS_JOB_ERROR_INVAL = 0x80410A02, + CELL_SPURS_JOB_ERROR_NOSYS = 0x80410A03, + CELL_SPURS_JOB_ERROR_NOMEM = 0x80410A04, + CELL_SPURS_JOB_ERROR_SRCH = 0x80410A05, + CELL_SPURS_JOB_ERROR_NOENT = 0x80410A06, + CELL_SPURS_JOB_ERROR_NOEXEC = 0x80410A07, + CELL_SPURS_JOB_ERROR_DEADLK = 0x80410A08, + CELL_SPURS_JOB_ERROR_PERM = 0x80410A09, + CELL_SPURS_JOB_ERROR_BUSY = 0x80410A0A, + CELL_SPURS_JOB_ERROR_JOB_DESCRIPTOR = 0x80410A0B, + CELL_SPURS_JOB_ERROR_JOB_DESCRIPTOR_SIZE = 0x80410A0C, + CELL_SPURS_JOB_ERROR_FAULT = 0x80410A0D, + CELL_SPURS_JOB_ERROR_CHILD = 0x80410A0E, + CELL_SPURS_JOB_ERROR_STAT = 0x80410A0F, + CELL_SPURS_JOB_ERROR_ALIGN = 0x80410A10, + CELL_SPURS_JOB_ERROR_NULL_POINTER = 0x80410A11, + CELL_SPURS_JOB_ERROR_MEMORY_CORRUPTED = 0x80410A12, + + CELL_SPURS_JOB_ERROR_MEMORY_SIZE = 0x80410A17, + CELL_SPURS_JOB_ERROR_UNKNOWN_COMMAND = 0x80410A18, + CELL_SPURS_JOB_ERROR_JOBLIST_ALIGNMENT = 0x80410A19, + CELL_SPURS_JOB_ERROR_JOB_ALIGNMENT = 0x80410A1a, + CELL_SPURS_JOB_ERROR_CALL_OVERFLOW = 0x80410A1b, + CELL_SPURS_JOB_ERROR_ABORT = 0x80410A1c, + CELL_SPURS_JOB_ERROR_DMALIST_ELEMENT = 0x80410A1d, + CELL_SPURS_JOB_ERROR_NUM_CACHE = 0x80410A1e, + CELL_SPURS_JOB_ERROR_INVALID_BINARY = 0x80410A1f, +}; + // SPURS defines. enum SPURSKernelInterfaces { @@ -80,26 +136,32 @@ class SPURSManager; class SPURSManagerEventFlag; class SPURSManagerTaskset; -// Core CellSpurs structures. -struct CellSpurs -{ - SPURSManager *spurs; -}; - -struct CellSpurs2 -{ - SPURSManager *spurs; -}; +struct CellSpurs; enum SpursAttrFlags : u32 { - SAF_NONE = 0x0, - SAF_EXIT_IF_NO_WORK = 0x1, + SAF_NONE = 0x0, + SAF_EXIT_IF_NO_WORK = 0x1, + SAF_UNKNOWN_FLAG_30 = 0x2, + SAF_SECOND_VERSION = 0x4, + + SAF_UNKNOWN_FLAG_9 = 0x00400000, + SAF_UNKNOWN_FLAG_8 = 0x00800000, + SAF_UNKNOWN_FLAG_7 = 0x01000000, SAF_SYSTEM_WORKLOAD_ENABLED = 0x02000000, SAF_SPU_PRINTF_ENABLED = 0x10000000, SAF_SPU_TGT_EXCLUSIVE_NON_CONTEXT = 0x20000000, SAF_SPU_MEMORY_CONTAINER_SET = 0x40000000, + SAF_UNKNOWN_FLAG_0 = 0x80000000, +}; + +enum SpursFlags1 : u8 +{ + SF1_NONE = 0x0, + + SF1_IS_SECOND = 0x40, + SF1_EXIT_IF_NO_WORK = 0x80, }; struct CellSpursAttribute @@ -113,7 +175,7 @@ struct CellSpursAttribute u8 _u8[size]; struct { be_t _u32[size / sizeof(u32)]; }; - // real structure + // real data struct { be_t revision; // 0x0 @@ -140,6 +202,214 @@ struct CellSpursAttribute }; }; +struct CellSpursWorkloadFlag +{ + be_t unused0; + be_t unused1; + atomic_t flag; +}; + +typedef void(*CellSpursShutdownCompletionEventHook)(vm::ptr, u32 wid, vm::ptr arg); + +// Core CellSpurs structures +struct CellSpurs +{ + static const uint align = 128; + static const uint size = 0x2000; // size of CellSpurs2 + static const uint size1 = 0x1000; // size of CellSpurs + static const uint size2 = 0x1000; + + struct _sub_str1 + { + u8 unk0[0x20]; + be_t sem; // 0x20 + u8 unk1[0x8]; + vm::bptr hook; // 0x30 + vm::bptr hookArg; // 0x38 + u8 unk2[0x40]; + }; + + static_assert(sizeof(_sub_str1) == 0x80, "Wrong _sub_str1 size"); + + struct _sub_str2 + { + be_t unk0; + be_t unk1; + be_t unk2; + be_t unk3; + be_t port; // 0x10 + u8 unk_[0x68]; + }; + + static_assert(sizeof(_sub_str2) == 0x80, "Wrong _sub_str2 size"); + + struct _sub_str3 + { + vm::bptr pm; // policy module + be_t data; // spu argument + be_t size; + atomic_t copy; + be_t priority; + }; + + static_assert(sizeof(_sub_str3) == 0x20, "Wrong _sub_str3 size"); + + struct _sub_str4 + { + static const uint size = 0x10; + + vm::bptr nameClass; + vm::bptr nameInstance; + }; + + union + { + // raw data + u8 _u8[size]; + std::array, size / sizeof(u32)> _u32; + + // real data + struct + { + atomic_t wklReadyCount[0x20]; // 0x0 (index = wid) + u8 wklA[0x10]; // 0x20 (packed 4-bit data, index = wid % 16, internal index = wid / 16) + u8 wklB[0x10]; // 0x30 (packed 4-bit data, index = wid % 16, internal index = wid / 16) + u8 wklMinCnt[0x10]; // 0x40 (seems only for first 0..15 wids) + atomic_t wklMaxCnt[0x10]; // 0x50 (packed 4-bit data, index = wid % 16, internal index = wid / 16) + CellSpursWorkloadFlag wklFlag; // 0x60 + atomic_t wklSet1; // 0x70 (bitset for 0..15 wids) + atomic_t x72; // 0x72 + u8 x73; // 0x73 + u8 flags1; // 0x74 + u8 x75; // 0x75 + u8 nSpus; // 0x76 + atomic_t flagRecv; // 0x77 + atomic_t wklSet2; // 0x78 (bitset for 16..32 wids) + u8 x7A[6]; // 0x7A + atomic_t wklStat1[0x10]; // 0x80 + u8 wklD1[0x10]; // 0x90 + u8 wklE1[0x10]; // 0xA0 + atomic_t wklMskA; // 0xB0 + atomic_t wklMskB; // 0xB4 + u8 xB8[5]; // 0xB8 + atomic_t xBD; // 0xBD + u8 xBE[2]; // 0xBE + u8 xC0[8]; // 0xC0 + u8 xC8; // 0xC8 + u8 spuPort; // 0xC9 + u8 xCA; // 0xCA + u8 xCB; // 0xCB + u8 xCC; // 0xCC + u8 xCD; // 0xCD + u8 xCE; // 0xCE + u8 xCF; // 0xCF + atomic_t wklStat2[0x10]; // 0xD0 + u8 wklD2[0x10]; // 0xE0 + u8 wklE2[0x10]; // 0xF0 + _sub_str1 wklF1[0x10]; // 0x100 + be_t unk22; // 0x900 + u8 unknown7[0x980 - 0x908]; + be_t semPrv; // 0x980 + be_t unk11; // 0x988 + be_t unk12; // 0x98C + be_t unk13; // 0x990 + u8 unknown4[0xB00 - 0x998]; + _sub_str3 wklG1[0x10]; // 0xB00 + _sub_str3 wklSysG; // 0xD00 + be_t ppu0; // 0xD20 + be_t ppu1; // 0xD28 + be_t spuTG; // 0xD30 + be_t spus[8]; // 0xD34 + u8 unknown3[0xD5C - 0xD54]; + be_t queue; // 0xD5C + be_t port; // 0xD60 + atomic_t xD64; // 0xD64 + atomic_t xD65; // 0xD65 + atomic_t xD66; // 0xD66 + atomic_t enableEH; // 0xD68 + be_t exception; // 0xD6C + sys_spu_image spuImg; // 0xD70 + be_t flags; // 0xD80 + be_t spuPriority; // 0xD84 + be_t ppuPriority; // 0xD88 + char prefix[0x0f]; // 0xD8C + u8 prefixSize; // 0xD9B + be_t unk5; // 0xD9C + be_t revision; // 0xDA0 + be_t sdkVersion; // 0xDA4 + atomic_t spups; // 0xDA8 + sys_lwmutex_t mutex; // 0xDB0 + sys_lwcond_t cond; // 0xDC8 + u8 unknown9[0xE00 - 0xDD0]; + _sub_str4 wklH1[0x10]; // 0xE00 + _sub_str2 sub3; // 0xF00 + u8 unknown6[0x1000 - 0xF80]; + _sub_str3 wklG2[0x10]; // 0x1000 + _sub_str1 wklF2[0x10]; // 0x1200 + _sub_str4 wklH2[0x10]; // 0x1A00 + } m; + + // alternative implementation + struct + { + SPURSManager *spurs; + } c; + }; + + __forceinline atomic_t& wklStat(const u32 wid) + { + if (wid & 0x10) + { + return m.wklStat2[wid & 0xf]; + } + else + { + return m.wklStat1[wid & 0xf]; + } + } + + __forceinline vm::ptr get_lwmutex() + { + return vm::ptr::make(Memory.RealToVirtualAddr(&m.mutex)); + } + + __forceinline vm::ptr get_lwcond() + { + return vm::ptr::make(Memory.RealToVirtualAddr(&m.cond)); + } +}; + +typedef CellSpurs CellSpurs2; + +struct CellSpursWorkloadAttribute +{ + static const uint align = 8; + static const uint size = 512; + + union + { + // raw data + u8 _u8[size]; + + // real data + struct + { + be_t revision; + be_t sdkVersion; + vm::bptr pm; + be_t size; + be_t data; + u8 priority[8]; + be_t minContention; + be_t maxContention; + vm::bptr nameClass; + vm::bptr nameInstance; + vm::bptr hook; + vm::bptr hookArg; + } m; + }; +}; + struct CellSpursEventFlag { SPURSManagerEventFlag *eventFlag; @@ -336,3 +606,6 @@ struct CellSpursTaskBinInfo be_t __reserved__; CellSpursTaskLsPattern lsPattern; }; + +s64 spursAttachLv2EventQueue(vm::ptr spurs, u32 queue, vm::ptr port, s32 isDynamic, bool wasCreated); +s64 spursWakeUp(vm::ptr spurs); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp b/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp index 8c8e50f384..c1ad643060 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSpursJq.cpp @@ -766,7 +766,9 @@ void cellSpursJq_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { - libspurs_jq = (u32)Memory.PRXMem.AllocAlign(sizeof(libspurs_jq_data), 4096); + if (!Memory.MainMem.GetStartAddr()) return; + + libspurs_jq = (u32)Memory.MainMem.AllocAlign(sizeof(libspurs_jq_data), 0x100000); memcpy(vm::get_ptr(libspurs_jq), libspurs_jq_data, sizeof(libspurs_jq_data)); libspurs_jq_rtoc = libspurs_jq + 0x17E80; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp index 43df317feb..fd68456b2c 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.cpp @@ -16,6 +16,13 @@ u32 libsre; u32 libsre_rtoc; #endif +waiter_map_t g_sync_mutex_wm("sync_mutex_wm"); +waiter_map_t g_sync_barrier_wait_wm("sync_barrier_wait_wm"); +waiter_map_t g_sync_barrier_notify_wm("sync_barrier_notify_wm"); +waiter_map_t g_sync_rwm_read_wm("sync_rwm_read_wm"); +waiter_map_t g_sync_rwm_write_wm("sync_rwm_write_wm"); +waiter_map_t g_sync_queue_wm("sync_queue_wm"); + s32 syncMutexInitialize(vm::ptr mutex) { if (!mutex) @@ -28,8 +35,7 @@ s32 syncMutexInitialize(vm::ptr mutex) } // prx: set zero and sync - mutex->m_data() = 0; - InterlockedCompareExchange(&mutex->m_data(), 0, 0); + mutex->data.exchange({}); return CELL_OK; } @@ -53,32 +59,21 @@ s32 cellSyncMutexLock(vm::ptr mutex) return CELL_SYNC_ERROR_ALIGN; } - // prx: increase u16 and remember its old value - be_t old_order; - while (true) + // prx: increase m_acq and remember its old value + be_t order; + mutex->data.atomic_op([&order](CellSyncMutex::data_t& mutex) { - const u32 old_data = mutex->m_data(); - CellSyncMutex new_mutex; - new_mutex.m_data() = old_data; + order = mutex.m_acq++; + }); - old_order = new_mutex.m_order; - new_mutex.m_order++; // increase m_order - if (InterlockedCompareExchange(&mutex->m_data(), new_mutex.m_data(), old_data) == old_data) break; - } - - // prx: wait until another u16 value == old value - while (old_order != mutex->m_freed) + // prx: wait until this old value is equal to m_rel + g_sync_mutex_wm.wait_op(mutex.addr(), [mutex, order]() { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncMutexLock(mutex_addr=0x%x) aborted", mutex.addr()); - break; - } - } + return order == mutex->data.read_relaxed().m_rel; + }); // prx: sync - InterlockedCompareExchange(&mutex->m_data(), 0, 0); + mutex->data.read_sync(); return CELL_OK; } @@ -95,25 +90,15 @@ s32 cellSyncMutexTryLock(vm::ptr mutex) return CELL_SYNC_ERROR_ALIGN; } - while (true) + // prx: exit if m_acq and m_rel are not equal, increase m_acq + return mutex->data.atomic_op(CELL_OK, [](CellSyncMutex::data_t& mutex) -> s32 { - const u32 old_data = mutex->m_data(); - CellSyncMutex new_mutex; - new_mutex.m_data() = old_data; - - // prx: compare two u16 values and exit if not equal - if (new_mutex.m_order != new_mutex.m_freed) + if (mutex.m_acq++ != mutex.m_rel) { return CELL_SYNC_ERROR_BUSY; } - else - { - new_mutex.m_order++; - } - if (InterlockedCompareExchange(&mutex->m_data(), new_mutex.m_data(), old_data) == old_data) break; - } - - return CELL_OK; + return CELL_OK; + }); } s32 cellSyncMutexUnlock(vm::ptr mutex) @@ -129,18 +114,12 @@ s32 cellSyncMutexUnlock(vm::ptr mutex) return CELL_SYNC_ERROR_ALIGN; } - InterlockedCompareExchange(&mutex->m_data(), 0, 0); - - while (true) + mutex->data.atomic_op_sync([](CellSyncMutex::data_t& mutex) { - const u32 old_data = mutex->m_data(); - CellSyncMutex new_mutex; - new_mutex.m_data() = old_data; - - new_mutex.m_freed++; - if (InterlockedCompareExchange(&mutex->m_data(), new_mutex.m_data(), old_data) == old_data) break; - } + mutex.m_rel++; + }); + g_sync_mutex_wm.notify(mutex.addr()); return CELL_OK; } @@ -160,9 +139,7 @@ s32 syncBarrierInitialize(vm::ptr barrier, u16 total_count) } // prx: zeroize first u16, write total_count in second u16 and sync - barrier->m_value = 0; - barrier->m_count = total_count; - InterlockedCompareExchange(&barrier->m_data(), 0, 0); + barrier->data.exchange({ be_t::make(0), be_t::make(total_count) }); return CELL_OK; } @@ -173,6 +150,24 @@ s32 cellSyncBarrierInitialize(vm::ptr barrier, u16 total_count) return syncBarrierInitialize(barrier, total_count); } +s32 syncBarrierTryNotifyOp(CellSyncBarrier::data_t& barrier) +{ + // prx: extract m_value (repeat if < 0), increase, compare with second s16, set sign bit if equal, insert it back + s16 value = (s16)barrier.m_value; + if (value < 0) + { + return CELL_SYNC_ERROR_BUSY; + } + + value++; + if (value == (s16)barrier.m_count) + { + value |= 0x8000; + } + barrier.m_value = value; + return CELL_OK; +}; + s32 cellSyncBarrierNotify(vm::ptr barrier) { cellSync->Log("cellSyncBarrierNotify(barrier_addr=0x%x)", barrier.addr()); @@ -186,36 +181,12 @@ s32 cellSyncBarrierNotify(vm::ptr barrier) return CELL_SYNC_ERROR_ALIGN; } - // prx: sync, extract m_value, repeat if < 0, increase, compare with second s16, set sign bit if equal, insert it back - InterlockedCompareExchange(&barrier->m_data(), 0, 0); - - while (true) + g_sync_barrier_notify_wm.wait_op(barrier.addr(), [barrier]() { - const u32 old_data = barrier->m_data(); - CellSyncBarrier new_barrier; - new_barrier.m_data() = old_data; - - s16 value = (s16)new_barrier.m_value; - if (value < 0) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncBarrierNotify(barrier_addr=0x%x) aborted", barrier.addr()); - return CELL_OK; - } - continue; - } - - value++; - if (value == (s16)new_barrier.m_count) - { - value |= 0x8000; - } - new_barrier.m_value = value; - if (InterlockedCompareExchange(&barrier->m_data(), new_barrier.m_data(), old_data) == old_data) break; - } + return barrier->data.atomic_op_sync(CELL_OK, syncBarrierTryNotifyOp) == CELL_OK; + }); + g_sync_barrier_wait_wm.notify(barrier.addr()); return CELL_OK; } @@ -232,31 +203,30 @@ s32 cellSyncBarrierTryNotify(vm::ptr barrier) return CELL_SYNC_ERROR_ALIGN; } - InterlockedCompareExchange(&barrier->m_data(), 0, 0); - - while (true) + if (s32 res = barrier->data.atomic_op_sync(CELL_OK, syncBarrierTryNotifyOp)) { - const u32 old_data = barrier->m_data(); - CellSyncBarrier new_barrier; - new_barrier.m_data() = old_data; - - s16 value = (s16)new_barrier.m_value; - if (value >= 0) - { - value++; - if (value == (s16)new_barrier.m_count) - { - value |= 0x8000; - } - new_barrier.m_value = value; - if (InterlockedCompareExchange(&barrier->m_data(), new_barrier.m_data(), old_data) == old_data) break; - } - else - { - if (InterlockedCompareExchange(&barrier->m_data(), new_barrier.m_data(), old_data) == old_data) return CELL_SYNC_ERROR_BUSY; - } + return res; } + g_sync_barrier_wait_wm.notify(barrier.addr()); + return CELL_OK; +} + +s32 syncBarrierTryWaitOp(CellSyncBarrier::data_t& barrier) +{ + // prx: extract m_value (repeat if >= 0), decrease it, set 0 if == 0x8000, insert it back + s16 value = (s16)barrier.m_value; + if (value >= 0) + { + return CELL_SYNC_ERROR_BUSY; + } + + value--; + if (value == (s16)0x8000) + { + value = 0; + } + barrier.m_value = value; return CELL_OK; } @@ -273,36 +243,12 @@ s32 cellSyncBarrierWait(vm::ptr barrier) return CELL_SYNC_ERROR_ALIGN; } - // prx: sync, extract m_value (repeat if >= 0), decrease it, set 0 if == 0x8000, insert it back - InterlockedCompareExchange(&barrier->m_data(), 0, 0); - - while (true) + g_sync_barrier_wait_wm.wait_op(barrier.addr(), [barrier]() { - const u32 old_data = barrier->m_data(); - CellSyncBarrier new_barrier; - new_barrier.m_data() = old_data; - - s16 value = (s16)new_barrier.m_value; - if (value >= 0) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncBarrierWait(barrier_addr=0x%x) aborted", barrier.addr()); - return CELL_OK; - } - continue; - } - - value--; - if (value == (s16)0x8000) - { - value = 0; - } - new_barrier.m_value = value; - if (InterlockedCompareExchange(&barrier->m_data(), new_barrier.m_data(), old_data) == old_data) break; - } + return barrier->data.atomic_op_sync(CELL_OK, syncBarrierTryWaitOp) == CELL_OK; + }); + g_sync_barrier_notify_wm.notify(barrier.addr()); return CELL_OK; } @@ -319,29 +265,12 @@ s32 cellSyncBarrierTryWait(vm::ptr barrier) return CELL_SYNC_ERROR_ALIGN; } - InterlockedCompareExchange(&barrier->m_data(), 0, 0); - - while (true) + if (s32 res = barrier->data.atomic_op_sync(CELL_OK, syncBarrierTryWaitOp)) { - const u32 old_data = barrier->m_data(); - CellSyncBarrier new_barrier; - new_barrier.m_data() = old_data; - - s16 value = (s16)new_barrier.m_value; - if (value >= 0) - { - return CELL_SYNC_ERROR_BUSY; - } - - value--; - if (value == (s16)0x8000) - { - value = 0; - } - new_barrier.m_value = value; - if (InterlockedCompareExchange(&barrier->m_data(), new_barrier.m_data(), old_data) == old_data) break; + return res; } + g_sync_barrier_notify_wm.notify(barrier.addr()); return CELL_OK; } @@ -361,10 +290,9 @@ s32 syncRwmInitialize(vm::ptr rwm, vm::ptr buffer, u32 buffer } // prx: zeroize first u16 and second u16, write buffer_size in second u32, write buffer_addr in second u64 and sync - rwm->m_data() = 0; - rwm->m_size = buffer_size; + rwm->m_size = be_t::make(buffer_size); rwm->m_buffer = buffer; - InterlockedCompareExchange(&rwm->m_data(), 0, 0); + rwm->data.exchange({}); return CELL_OK; } @@ -375,6 +303,29 @@ s32 cellSyncRwmInitialize(vm::ptr rwm, vm::ptr buffer, u32 bu return syncRwmInitialize(rwm, buffer, buffer_size); } +s32 syncRwmTryReadBeginOp(CellSyncRwm::data_t& rwm) +{ + if (rwm.m_writers.ToBE()) + { + return CELL_SYNC_ERROR_BUSY; + } + + rwm.m_readers++; + return CELL_OK; +} + +s32 syncRwmReadEndOp(CellSyncRwm::data_t& rwm) +{ + if (!rwm.m_readers.ToBE()) + { + cellSync->Error("syncRwmReadEndOp(rwm_addr=0x%x): m_readers == 0 (m_writers=%d)", Memory.RealToVirtualAddr(&rwm), (u16)rwm.m_writers); + return CELL_SYNC_ERROR_ABORT; + } + + rwm.m_readers--; + return CELL_OK; +} + s32 cellSyncRwmRead(vm::ptr rwm, vm::ptr buffer) { cellSync->Log("cellSyncRwmRead(rwm_addr=0x%x, buffer_addr=0x%x)", rwm.addr(), buffer.addr()); @@ -388,47 +339,22 @@ s32 cellSyncRwmRead(vm::ptr rwm, vm::ptr buffer) return CELL_SYNC_ERROR_ALIGN; } - // prx: atomically load first u32, repeat until second u16 == 0, increase first u16 and sync - while (true) + // prx: increase m_readers, wait until m_writers is zero + g_sync_rwm_read_wm.wait_op(rwm.addr(), [rwm]() { - const u32 old_data = rwm->m_data(); - CellSyncRwm new_rwm; - new_rwm.m_data() = old_data; - - if (new_rwm.m_writers.ToBE()) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncRwmRead(rwm_addr=0x%x) aborted", rwm.addr()); - return CELL_OK; - } - continue; - } - - new_rwm.m_readers++; - if (InterlockedCompareExchange(&rwm->m_data(), new_rwm.m_data(), old_data) == old_data) break; - } + return rwm->data.atomic_op(CELL_OK, syncRwmTryReadBeginOp) == CELL_OK; + }); // copy data to buffer_addr memcpy(buffer.get_ptr(), rwm->m_buffer.get_ptr(), (u32)rwm->m_size); - // prx: load first u32, return 0x8041010C if first u16 == 0, atomically decrease it - while (true) + // prx: decrease m_readers (return 0x8041010C if already zero) + if (s32 res = rwm->data.atomic_op(CELL_OK, syncRwmReadEndOp)) { - const u32 old_data = rwm->m_data(); - CellSyncRwm new_rwm; - new_rwm.m_data() = old_data; - - if (!new_rwm.m_readers.ToBE()) - { - cellSync->Error("cellSyncRwmRead(rwm_addr=0x%x): m_readers == 0 (m_writers=%d)", rwm.addr(), (u16)new_rwm.m_writers); - return CELL_SYNC_ERROR_ABORT; - } - - new_rwm.m_readers--; - if (InterlockedCompareExchange(&rwm->m_data(), new_rwm.m_data(), old_data) == old_data) break; + return res; } + + g_sync_rwm_write_wm.notify(rwm.addr()); return CELL_OK; } @@ -445,38 +371,30 @@ s32 cellSyncRwmTryRead(vm::ptr rwm, vm::ptr buffer) return CELL_SYNC_ERROR_ALIGN; } - while (true) + if (s32 res = rwm->data.atomic_op(CELL_OK, syncRwmTryReadBeginOp)) { - const u32 old_data = rwm->m_data(); - CellSyncRwm new_rwm; - new_rwm.m_data() = old_data; - - if (new_rwm.m_writers.ToBE()) - { - return CELL_SYNC_ERROR_BUSY; - } - - new_rwm.m_readers++; - if (InterlockedCompareExchange(&rwm->m_data(), new_rwm.m_data(), old_data) == old_data) break; + return res; } memcpy(buffer.get_ptr(), rwm->m_buffer.get_ptr(), (u32)rwm->m_size); - while (true) + if (s32 res = rwm->data.atomic_op(CELL_OK, syncRwmReadEndOp)) { - const u32 old_data = rwm->m_data(); - CellSyncRwm new_rwm; - new_rwm.m_data() = old_data; - - if (!new_rwm.m_readers.ToBE()) - { - cellSync->Error("cellSyncRwmRead(rwm_addr=0x%x): m_readers == 0 (m_writers=%d)", rwm.addr(), (u16)new_rwm.m_writers); - return CELL_SYNC_ERROR_ABORT; - } - - new_rwm.m_readers--; - if (InterlockedCompareExchange(&rwm->m_data(), new_rwm.m_data(), old_data) == old_data) break; + return res; } + + g_sync_rwm_write_wm.notify(rwm.addr()); + return CELL_OK; +} + +s32 syncRwmTryWriteBeginOp(CellSyncRwm::data_t& rwm) +{ + if (rwm.m_writers.ToBE()) + { + return CELL_SYNC_ERROR_BUSY; + } + + rwm.m_writers = 1; return CELL_OK; } @@ -493,45 +411,23 @@ s32 cellSyncRwmWrite(vm::ptr rwm, vm::ptr buffer) return CELL_SYNC_ERROR_ALIGN; } - // prx: atomically compare second u16 (m_writers) with 0, repeat if not 0, set 1, sync - while (true) + g_sync_rwm_read_wm.wait_op(rwm.addr(), [rwm]() { - const u32 old_data = rwm->m_data(); - CellSyncRwm new_rwm; - new_rwm.m_data() = old_data; - - if (new_rwm.m_writers.ToBE()) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncRwmWrite(rwm_addr=0x%x) aborted (I)", rwm.addr()); - return CELL_OK; - } - continue; - } - - new_rwm.m_writers = 1; - if (InterlockedCompareExchange(&rwm->m_data(), new_rwm.m_data(), old_data) == old_data) break; - } + return rwm->data.atomic_op(CELL_OK, syncRwmTryWriteBeginOp) == CELL_OK; + }); // prx: wait until m_readers == 0 - while (rwm->m_readers.ToBE()) + g_sync_rwm_write_wm.wait_op(rwm.addr(), [rwm]() { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncRwmWrite(rwm_addr=0x%x) aborted (II)", rwm.addr()); - return CELL_OK; - } - } + return rwm->data.read_relaxed().m_readers.ToBE() == 0; + }); // prx: copy data from buffer_addr memcpy(rwm->m_buffer.get_ptr(), buffer.get_ptr(), (u32)rwm->m_size); // prx: sync and zeroize m_readers and m_writers - InterlockedCompareExchange(&rwm->m_data(), 0, 0); - rwm->m_data() = 0; + rwm->data.exchange({}); + g_sync_rwm_read_wm.notify(rwm.addr()); return CELL_OK; } @@ -548,15 +444,18 @@ s32 cellSyncRwmTryWrite(vm::ptr rwm, vm::ptr buffer) return CELL_SYNC_ERROR_ALIGN; } - // prx: compare m_readers | m_writers with 0, return busy if not zero, set m_writers to 1 - if (InterlockedCompareExchange(&rwm->m_data(), se32(1), 0) != 0) return CELL_SYNC_ERROR_BUSY; + // prx: compare m_readers | m_writers with 0, return if not zero, set m_writers to 1 + if (!rwm->data.compare_and_swap_test({}, { be_t::make(0), be_t::make(1) })) + { + return CELL_SYNC_ERROR_BUSY; + } // prx: copy data from buffer_addr memcpy(rwm->m_buffer.get_ptr(), buffer.get_ptr(), (u32)rwm->m_size); // prx: sync and zeroize m_readers and m_writers - InterlockedCompareExchange(&rwm->m_data(), 0, 0); - rwm->m_data() = 0; + rwm->data.exchange({}); + g_sync_rwm_read_wm.notify(rwm.addr()); return CELL_OK; } @@ -580,11 +479,10 @@ s32 syncQueueInitialize(vm::ptr queue, vm::ptr buffer, u32 si } // prx: zeroize first u64, write size in third u32, write depth in fourth u32, write address in third u64 and sync - queue->m_data() = 0; - queue->m_size = size; - queue->m_depth = depth; - queue->m_buffer = buffer; - InterlockedCompareExchange(&queue->m_data(), 0, 0); + queue->m_size = be_t::make(size); + queue->m_depth = be_t::make(depth); + queue->m_buffer.set(buffer.addr()); + queue->data.exchange({}); return CELL_OK; } @@ -595,6 +493,26 @@ s32 cellSyncQueueInitialize(vm::ptr queue, vm::ptr buffer, u3 return syncQueueInitialize(queue, buffer, size, depth); } +s32 syncQueueTryPushOp(CellSyncQueue::data_t& queue, u32 depth, u32& position) +{ + const u32 v1 = (u32)queue.m_v1; + const u32 v2 = (u32)queue.m_v2; + // prx: compare 5th u8 with zero (break if not zero) + // prx: compare (second u32 (u24) + first u8) with depth (break if greater or equal) + if ((v2 >> 24) || ((v2 & 0xffffff) + (v1 >> 24)) >= depth) + { + return CELL_SYNC_ERROR_BUSY; + } + + // prx: extract first u32 (u24) (-> position), calculate (position + 1) % depth, insert it back + // prx: insert 1 in 5th u8 + // prx: extract second u32 (u24), increase it, insert it back + position = (v1 & 0xffffff); + queue.m_v1 = (v1 & 0xff000000) | ((position + 1) % depth); + queue.m_v2 = (1 << 24) | ((v2 & 0xffffff) + 1); + return CELL_OK; +} + s32 cellSyncQueuePush(vm::ptr queue, vm::ptr buffer) { cellSync->Log("cellSyncQueuePush(queue_addr=0x%x, buffer_addr=0x%x)", queue.addr(), buffer.addr()); @@ -610,52 +528,24 @@ s32 cellSyncQueuePush(vm::ptr queue, vm::ptr buffer) const u32 size = (u32)queue->m_size; const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && ((u32)queue->m_v2 & 0xffffff) <= depth); + const auto data = queue->data.read_relaxed(); + assert(((u32)data.m_v1 & 0xffffff) <= depth && ((u32)data.m_v2 & 0xffffff) <= depth); u32 position; - while (true) + g_sync_queue_wm.wait_op(queue.addr(), [queue, depth, &position]() { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v1 = (u32)new_queue.m_v1; - const u32 v2 = (u32)new_queue.m_v2; - // prx: compare 5th u8 with zero (repeat if not zero) - // prx: compare (second u32 (u24) + first u8) with depth (repeat if greater or equal) - if ((v2 >> 24) || ((v2 & 0xffffff) + (v1 >> 24)) >= depth) + return CELL_OK == queue->data.atomic_op(CELL_OK, [depth, &position](CellSyncQueue::data_t& queue) -> s32 { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncQueuePush(queue_addr=0x%x) aborted", queue.addr()); - return CELL_OK; - } - continue; - } - - // prx: extract first u32 (u24) (-> position), calculate (position + 1) % depth, insert it back - // prx: insert 1 in 5th u8 - // prx: extract second u32 (u24), increase it, insert it back - position = (v1 & 0xffffff); - new_queue.m_v1 = (v1 & 0xff000000) | ((position + 1) % depth); - new_queue.m_v2 = (1 << 24) | ((v2 & 0xffffff) + 1); - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } + return syncQueueTryPushOp(queue, depth, position); + }); + }); // prx: memcpy(position * m_size + m_addr, buffer_addr, m_size), sync memcpy(&queue->m_buffer[position * size], buffer.get_ptr(), size); // prx: atomically insert 0 in 5th u8 - while (true) - { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - new_queue.m_v2 &= 0xffffff; // TODO: use InterlockedAnd() or something - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } + queue->data &= { be_t::make(~0), be_t::make(0xffffff) }; + g_sync_queue_wm.notify(queue.addr()); return CELL_OK; } @@ -674,39 +564,42 @@ s32 cellSyncQueueTryPush(vm::ptr queue, vm::ptr buffe const u32 size = (u32)queue->m_size; const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && ((u32)queue->m_v2 & 0xffffff) <= depth); + const auto data = queue->data.read_relaxed(); + assert(((u32)data.m_v1 & 0xffffff) <= depth && ((u32)data.m_v2 & 0xffffff) <= depth); u32 position; - while (true) + s32 res = queue->data.atomic_op(CELL_OK, [depth, &position](CellSyncQueue::data_t& queue) -> s32 { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v1 = (u32)new_queue.m_v1; - const u32 v2 = (u32)new_queue.m_v2; - if ((v2 >> 24) || ((v2 & 0xffffff) + (v1 >> 24)) >= depth) - { - return CELL_SYNC_ERROR_BUSY; - } - - position = (v1 & 0xffffff); - new_queue.m_v1 = (v1 & 0xff000000) | ((position + 1) % depth); - new_queue.m_v2 = (1 << 24) | ((v2 & 0xffffff) + 1); - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; + return syncQueueTryPushOp(queue, depth, position); + }); + if (res) + { + return res; } memcpy(&queue->m_buffer[position * size], buffer.get_ptr(), size); + queue->data &= { be_t::make(~0), be_t::make(0xffffff) }; + g_sync_queue_wm.notify(queue.addr()); + return CELL_OK; +} - while (true) +s32 syncQueueTryPopOp(CellSyncQueue::data_t& queue, u32 depth, u32& position) +{ + const u32 v1 = (u32)queue.m_v1; + const u32 v2 = (u32)queue.m_v2; + // prx: extract first u8, repeat if not zero + // prx: extract second u32 (u24), subtract 5th u8, compare with zero, repeat if less or equal + if ((v1 >> 24) || ((v2 & 0xffffff) <= (v2 >> 24))) { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - new_queue.m_v2 &= 0xffffff; // TODO: use InterlockedAnd() or something - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; + return CELL_SYNC_ERROR_BUSY; } + + // prx: insert 1 in first u8 + // prx: extract first u32 (u24), add depth, subtract second u32 (u24), calculate (% depth), save to position + // prx: extract second u32 (u24), decrease it, insert it back + queue.m_v1 = 0x1000000 | v1; + position = ((v1 & 0xffffff) + depth - (v2 & 0xffffff)) % depth; + queue.m_v2 = (v2 & 0xff000000) | ((v2 & 0xffffff) - 1); return CELL_OK; } @@ -725,52 +618,24 @@ s32 cellSyncQueuePop(vm::ptr queue, vm::ptr buffer) const u32 size = (u32)queue->m_size; const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && ((u32)queue->m_v2 & 0xffffff) <= depth); + const auto data = queue->data.read_relaxed(); + assert(((u32)data.m_v1 & 0xffffff) <= depth && ((u32)data.m_v2 & 0xffffff) <= depth); u32 position; - while (true) + g_sync_queue_wm.wait_op(queue.addr(), [queue, depth, &position]() { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v1 = (u32)new_queue.m_v1; - const u32 v2 = (u32)new_queue.m_v2; - // prx: extract first u8, repeat if not zero - // prx: extract second u32 (u24), subtract 5th u8, compare with zero, repeat if less or equal - if ((v1 >> 24) || ((v2 & 0xffffff) <= (v2 >> 24))) + return CELL_OK == queue->data.atomic_op(CELL_OK, [depth, &position](CellSyncQueue::data_t& queue) -> s32 { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncQueuePop(queue_addr=0x%x) aborted", queue.addr()); - return CELL_OK; - } - continue; - } - - // prx: insert 1 in first u8 - // prx: extract first u32 (u24), add depth, subtract second u32 (u24), calculate (% depth), save to position - // prx: extract second u32 (u24), decrease it, insert it back - new_queue.m_v1 = 0x1000000 | v1; - position = ((v1 & 0xffffff) + depth - (v2 & 0xffffff)) % depth; - new_queue.m_v2 = (v2 & 0xff000000) | ((v2 & 0xffffff) - 1); - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } + return syncQueueTryPopOp(queue, depth, position); + }); + }); // prx: (sync), memcpy(buffer_addr, position * m_size + m_addr, m_size) memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); // prx: atomically insert 0 in first u8 - while (true) - { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - new_queue.m_v1 &= 0xffffff; // TODO: use InterlockedAnd() or something - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } + queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + g_sync_queue_wm.notify(queue.addr()); return CELL_OK; } @@ -789,39 +654,36 @@ s32 cellSyncQueueTryPop(vm::ptr queue, vm::ptr buffer) const u32 size = (u32)queue->m_size; const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && ((u32)queue->m_v2 & 0xffffff) <= depth); + const auto data = queue->data.read_relaxed(); + assert(((u32)data.m_v1 & 0xffffff) <= depth && ((u32)data.m_v2 & 0xffffff) <= depth); u32 position; - while (true) + s32 res = queue->data.atomic_op(CELL_OK, [depth, &position](CellSyncQueue::data_t& queue) -> s32 { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v1 = (u32)new_queue.m_v1; - const u32 v2 = (u32)new_queue.m_v2; - if ((v1 >> 24) || ((v2 & 0xffffff) <= (v2 >> 24))) - { - return CELL_SYNC_ERROR_BUSY; - } - - new_queue.m_v1 = 0x1000000 | v1; - position = ((v1 & 0xffffff) + depth - (v2 & 0xffffff)) % depth; - new_queue.m_v2 = (v2 & 0xff000000) | ((v2 & 0xffffff) - 1); - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; + return syncQueueTryPopOp(queue, depth, position); + }); + if (res) + { + return res; } memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); + queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + g_sync_queue_wm.notify(queue.addr()); + return CELL_OK; +} - while (true) +s32 syncQueueTryPeekOp(CellSyncQueue::data_t& queue, u32 depth, u32& position) +{ + const u32 v1 = (u32)queue.m_v1; + const u32 v2 = (u32)queue.m_v2; + if ((v1 >> 24) || ((v2 & 0xffffff) <= (v2 >> 24))) { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - new_queue.m_v1 &= 0xffffff; // TODO: use InterlockedAnd() or something - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; + return CELL_SYNC_ERROR_BUSY; } + + queue.m_v1 = 0x1000000 | v1; + position = ((v1 & 0xffffff) + depth - (v2 & 0xffffff)) % depth; return CELL_OK; } @@ -840,44 +702,21 @@ s32 cellSyncQueuePeek(vm::ptr queue, vm::ptr buffer) const u32 size = (u32)queue->m_size; const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && ((u32)queue->m_v2 & 0xffffff) <= depth); + const auto data = queue->data.read_relaxed(); + assert(((u32)data.m_v1 & 0xffffff) <= depth && ((u32)data.m_v2 & 0xffffff) <= depth); u32 position; - while (true) + g_sync_queue_wm.wait_op(queue.addr(), [queue, depth, &position]() { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v1 = (u32)new_queue.m_v1; - const u32 v2 = (u32)new_queue.m_v2; - if ((v1 >> 24) || ((v2 & 0xffffff) <= (v2 >> 24))) + return CELL_OK == queue->data.atomic_op(CELL_OK, [depth, &position](CellSyncQueue::data_t& queue) -> s32 { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) - { - cellSync->Warning("cellSyncQueuePeek(queue_addr=0x%x) aborted", queue.addr()); - return CELL_OK; - } - continue; - } - - new_queue.m_v1 = 0x1000000 | v1; - position = ((v1 & 0xffffff) + depth - (v2 & 0xffffff)) % depth; - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } + return syncQueueTryPeekOp(queue, depth, position); + }); + }); memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); - - while (true) - { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - new_queue.m_v1 &= 0xffffff; // TODO: use InterlockedAnd() or something - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } + queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + g_sync_queue_wm.notify(queue.addr()); return CELL_OK; } @@ -896,38 +735,22 @@ s32 cellSyncQueueTryPeek(vm::ptr queue, vm::ptr buffer) const u32 size = (u32)queue->m_size; const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && ((u32)queue->m_v2 & 0xffffff) <= depth); + const auto data = queue->data.read_relaxed(); + assert(((u32)data.m_v1 & 0xffffff) <= depth && ((u32)data.m_v2 & 0xffffff) <= depth); u32 position; - while (true) + s32 res = queue->data.atomic_op(CELL_OK, [depth, &position](CellSyncQueue::data_t& queue) -> s32 { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v1 = (u32)new_queue.m_v1; - const u32 v2 = (u32)new_queue.m_v2; - if ((v1 >> 24) || ((v2 & 0xffffff) <= (v2 >> 24))) - { - return CELL_SYNC_ERROR_BUSY; - } - - new_queue.m_v1 = 0x1000000 | v1; - position = ((v1 & 0xffffff) + depth - (v2 & 0xffffff)) % depth; - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; + return syncQueueTryPeekOp(queue, depth, position); + }); + if (res) + { + return res; } memcpy(buffer.get_ptr(), &queue->m_buffer[position * size], size); - - while (true) - { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - new_queue.m_v1 &= 0xffffff; // TODO: use InterlockedAnd() or something - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } + queue->data &= { be_t::make(0xffffff), be_t::make(~0) }; + g_sync_queue_wm.notify(queue.addr()); return CELL_OK; } @@ -944,9 +767,10 @@ s32 cellSyncQueueSize(vm::ptr queue) return CELL_SYNC_ERROR_ALIGN; } - const u32 count = (u32)queue->m_v2 & 0xffffff; + const auto data = queue->data.read_relaxed(); + const u32 count = (u32)data.m_v2 & 0xffffff; const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && count <= depth); + assert(((u32)data.m_v1 & 0xffffff) <= depth && count <= depth); return count; } @@ -965,55 +789,44 @@ s32 cellSyncQueueClear(vm::ptr queue) } const u32 depth = (u32)queue->m_depth; - assert(((u32)queue->m_v1 & 0xffffff) <= depth && ((u32)queue->m_v2 & 0xffffff) <= depth); + const auto data = queue->data.read_relaxed(); + assert(((u32)data.m_v1 & 0xffffff) <= depth && ((u32)data.m_v2 & 0xffffff) <= depth); // TODO: optimize if possible - while (true) + g_sync_queue_wm.wait_op(queue.addr(), [queue, depth]() { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v1 = (u32)new_queue.m_v1; - // prx: extract first u8, repeat if not zero, insert 1 - if (v1 >> 24) + return CELL_OK == queue->data.atomic_op(CELL_OK, [depth](CellSyncQueue::data_t& queue) -> s32 { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) + const u32 v1 = (u32)queue.m_v1; + // prx: extract first u8, repeat if not zero, insert 1 + if (v1 >> 24) { - cellSync->Warning("cellSyncQueueClear(queue_addr=0x%x) aborted (I)", queue.addr()); - return CELL_OK; + return CELL_SYNC_ERROR_BUSY; } - continue; - } - new_queue.m_v1 = v1 | 0x1000000; - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } - while (true) + queue.m_v1 = v1 | 0x1000000; + return CELL_OK; + }); + }); + + g_sync_queue_wm.wait_op(queue.addr(), [queue, depth]() { - const u64 old_data = queue->m_data(); - CellSyncQueue new_queue; - new_queue.m_data() = old_data; - - const u32 v2 = (u32)new_queue.m_v2; - // prx: extract 5th u8, repeat if not zero, insert 1 - if (v2 >> 24) + return CELL_OK == queue->data.atomic_op(CELL_OK, [depth](CellSyncQueue::data_t& queue) -> s32 { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack - if (Emu.IsStopped()) + const u32 v2 = (u32)queue.m_v2; + // prx: extract 5th u8, repeat if not zero, insert 1 + if (v2 >> 24) { - cellSync->Warning("cellSyncQueueClear(queue_addr=0x%x) aborted (II)", queue.addr()); - return CELL_OK; + return CELL_SYNC_ERROR_BUSY; } - continue; - } - new_queue.m_v2 = v2 | 0x1000000; - if (InterlockedCompareExchange(&queue->m_data(), new_queue.m_data(), old_data) == old_data) break; - } - queue->m_data() = 0; - InterlockedCompareExchange(&queue->m_data(), 0, 0); + queue.m_v2 = v2 | 0x1000000; + return CELL_OK; + }); + }); + + queue->data.exchange({}); + g_sync_queue_wm.notify(queue.addr()); return CELL_OK; } @@ -1030,50 +843,42 @@ void syncLFQueueDump(vm::ptr queue) void syncLFQueueInit(vm::ptr queue, vm::ptr buffer, u32 size, u32 depth, CellSyncQueueDirection direction, vm::ptr eaSignal) { - queue->m_h1 = 0; - queue->m_h2 = 0; - queue->m_h4 = 0; - queue->m_h5 = 0; - queue->m_h6 = 0; - queue->m_h8 = 0; queue->m_size = size; queue->m_depth = depth; queue->m_buffer = buffer; queue->m_direction = direction; - for (u32 i = 0; i < sizeof(queue->m_hs) / sizeof(queue->m_hs[0]); i++) - { - queue->m_hs[i] = 0; - } + *queue->m_hs1 = {}; + *queue->m_hs2 = {}; queue->m_eaSignal = eaSignal; if (direction == CELL_SYNC_QUEUE_ANY2ANY) { - queue->m_h3 = 0; - queue->m_h7 = 0; - queue->m_buffer = buffer + 1; - assert(queue->m_buffer.addr() % 2); + queue->pop1.write_relaxed({}); + queue->push1.write_relaxed({}); + queue->m_buffer.set(queue->m_buffer.addr() | 1); queue->m_bs[0] = -1; queue->m_bs[1] = -1; //m_bs[2] //m_bs[3] queue->m_v1 = -1; - queue->m_hs[0] = -1; - queue->m_hs[16] = -1; - queue->m_v2 = 0; - queue->m_v3 = 0; + queue->push2.write_relaxed({ be_t::make(-1) }); + queue->pop2.write_relaxed({ be_t::make(-1) }); } else { - //m_h3 - //m_h7 + queue->pop1.write_relaxed({ be_t::make(0), be_t::make(0), queue->pop1.read_relaxed().m_h3, be_t::make(0) }); + queue->push1.write_relaxed({ be_t::make(0), be_t::make(0), queue->push1.read_relaxed().m_h7, be_t::make(0) }); queue->m_bs[0] = -1; // written as u32 queue->m_bs[1] = -1; queue->m_bs[2] = -1; queue->m_bs[3] = -1; queue->m_v1 = 0; - queue->m_v2 = 0; // written as u64 - queue->m_v3 = 0; + queue->push2.write_relaxed({}); + queue->pop2.write_relaxed({}); } + + queue->m_v2 = 0; + queue->m_eq_id = 0; } s32 syncLFQueueInitialize(vm::ptr queue, vm::ptr buffer, u32 size, u32 depth, CellSyncQueueDirection direction, vm::ptr eaSignal) @@ -1081,7 +886,7 @@ s32 syncLFQueueInitialize(vm::ptr queue, vm::ptr buffer, u3 #ifdef PRX_DEBUG_XXX return cb_caller, vm::ptr, u32, u32, CellSyncQueueDirection, vm::ptr>::call(GetCurrentPPUThread(), libsre + 0x205C, libsre_rtoc, queue, buffer, size, depth, direction, eaSignal); -#else +#endif if (!queue) { @@ -1123,17 +928,16 @@ s32 syncLFQueueInitialize(vm::ptr queue, vm::ptr buffer, u3 u32 old_value; while (true) { - const u32 old_data = queue->m_data(); - CellSyncLFQueue new_data; - new_data.m_data() = old_data; + const auto old = queue->init.read_relaxed(); + auto init = old; - if (old_data) + if (old.ToBE()) { - if (sdk_ver > 0x17ffff && old_data != se32(2)) + if (sdk_ver > 0x17ffff && old != 2) { return CELL_SYNC_ERROR_STAT; } - old_value = old_data; + old_value = old.ToLE(); } else { @@ -1148,14 +952,14 @@ s32 syncLFQueueInitialize(vm::ptr queue, vm::ptr buffer, u3 } } } - new_data.m_data() = se32(1); - old_value = se32(1); + init = 1; + old_value = 1; } - if (InterlockedCompareExchange(&queue->m_data(), new_data.m_data(), old_data) == old_data) break; + if (queue->init.compare_and_swap_test(old, init)) break; } - if (old_value == se32(2)) + if (old_value == 2) { if ((u32)queue->m_size != size || (u32)queue->m_depth != depth || queue->m_buffer.addr() != buffer.addr()) { @@ -1175,14 +979,12 @@ s32 syncLFQueueInitialize(vm::ptr queue, vm::ptr buffer, u3 syncLFQueueInit(queue, buffer, size, depth, direction, eaSignal); // prx: sync, zeroize u32 at 0x2c offset - InterlockedCompareExchange(&queue->m_data(), 0, 0); - queue->m_data() = 0; + queue->init.exchange({}); } // prx: sync - InterlockedCompareExchange(&queue->m_data(), 0, 0); + queue->init.read_sync(); return CELL_OK; -#endif } s32 cellSyncLFQueueInitialize(vm::ptr queue, vm::ptr buffer, u32 size, u32 depth, CellSyncQueueDirection direction, vm::ptr eaSignal) @@ -1195,7 +997,7 @@ s32 cellSyncLFQueueInitialize(vm::ptr queue, vm::ptr buffer s32 syncLFQueueGetPushPointer(vm::ptr queue, s32& pointer, u32 isBlocking, u32 useEventQueue) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_PPU2SPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_PPU2SPU) { return CELL_SYNC_ERROR_PERM; } @@ -1211,28 +1013,27 @@ s32 syncLFQueueGetPushPointer(vm::ptr queue, s32& pointer, u32 return -1; } - const u64 old_data = InterlockedCompareExchange(&queue->m_push1(), 0, 0); - CellSyncLFQueue new_queue; - new_queue.m_push1() = old_data; + const auto old = queue->push1.read_sync(); + auto push = old; if (var1) { - new_queue.m_h7 = 0; + push.m_h7 = 0; } if (isBlocking && useEventQueue && *(u32*)queue->m_bs == -1) { return CELL_SYNC_ERROR_STAT; } - s32 var2 = (s32)(s16)new_queue.m_h8; + s32 var2 = (s32)(s16)push.m_h8; s32 res; - if (useEventQueue && ((s32)(u16)new_queue.m_h5 != var2 || new_queue.m_h7.ToBE() != 0)) + if (useEventQueue && ((s32)push.m_h5 != var2 || push.m_h7.ToBE() != 0)) { res = CELL_SYNC_ERROR_BUSY; } else { - var2 -= (s32)(u16)queue->m_h1; + var2 -= (s32)(u16)queue->pop1.read_relaxed().m_h1; if (var2 < 0) { var2 += depth * 2; @@ -1240,21 +1041,21 @@ s32 syncLFQueueGetPushPointer(vm::ptr queue, s32& pointer, u32 if (var2 < depth) { - pointer = (s16)new_queue.m_h8; + pointer = (s16)push.m_h8; if (pointer + 1 >= depth * 2) { - new_queue.m_h8 = 0; + push.m_h8 = 0; } else { - new_queue.m_h8++; + push.m_h8++; } res = CELL_OK; } else if (!isBlocking) { res = CELL_SYNC_ERROR_AGAIN; - if (!new_queue.m_h7.ToBE() || res) + if (!push.m_h7.ToBE() || res) { return res; } @@ -1267,7 +1068,7 @@ s32 syncLFQueueGetPushPointer(vm::ptr queue, s32& pointer, u32 else { res = CELL_OK; - new_queue.m_h7 = 3; + push.m_h7 = 3; if (isBlocking != 3) { break; @@ -1275,9 +1076,9 @@ s32 syncLFQueueGetPushPointer(vm::ptr queue, s32& pointer, u32 } } - if (InterlockedCompareExchange(&queue->m_push1(), new_queue.m_push1(), old_data) == old_data) + if (queue->push1.compare_and_swap_test(old, push)) { - if (!new_queue.m_h7.ToBE() || res) + if (!push.m_h7.ToBE() || res) { return res; } @@ -1285,17 +1086,12 @@ s32 syncLFQueueGetPushPointer(vm::ptr queue, s32& pointer, u32 } } - u32 eq = (u32)queue->m_v3; // 0x7c - sys_event_data event; - assert(0); - // TODO: sys_event_queue_receive (event data is not used), assert if error returned + assert(sys_event_queue_receive(queue->m_eq_id, vm::ptr::make(0), 0) == CELL_OK); var1 = 1; } - - assert(0); } -s32 _cellSyncLFQueueGetPushPointer(vm::ptr queue, vm::ptr> pointer, u32 isBlocking, u32 useEventQueue) +s32 _cellSyncLFQueueGetPushPointer(vm::ptr queue, vm::ptr pointer, u32 isBlocking, u32 useEventQueue) { cellSync->Todo("_cellSyncLFQueueGetPushPointer(queue_addr=0x%x, pointer_addr=0x%x, isBlocking=%d, useEventQueue=%d)", queue.addr(), pointer.addr(), isBlocking, useEventQueue); @@ -1314,7 +1110,7 @@ s32 syncLFQueueGetPushPointer2(vm::ptr queue, s32& pointer, u32 return CELL_OK; } -s32 _cellSyncLFQueueGetPushPointer2(vm::ptr queue, vm::ptr> pointer, u32 isBlocking, u32 useEventQueue) +s32 _cellSyncLFQueueGetPushPointer2(vm::ptr queue, vm::ptr pointer, u32 isBlocking, u32 useEventQueue) { // arguments copied from _cellSyncLFQueueGetPushPointer cellSync->Todo("_cellSyncLFQueueGetPushPointer2(queue_addr=0x%x, pointer_addr=0x%x, isBlocking=%d, useEventQueue=%d)", @@ -1328,7 +1124,7 @@ s32 _cellSyncLFQueueGetPushPointer2(vm::ptr queue, vm::ptr queue, s32 pointer, const std::function fpSendSignal) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_PPU2SPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_PPU2SPU) { return CELL_SYNC_ERROR_PERM; } @@ -1337,27 +1133,26 @@ s32 syncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, while (true) { - const u32 old_data = InterlockedCompareExchange(&queue->m_push2(), 0, 0); - CellSyncLFQueue new_queue; - new_queue.m_push2() = old_data; + const auto old = queue->push2.read_sync(); + auto push2 = old; - const u32 old_data2 = queue->m_push3(); - new_queue.m_push3() = old_data2; + const auto old2 = queue->push3.read_relaxed(); + auto push3 = old2; - s32 var1 = pointer - (u16)new_queue.m_h5; + s32 var1 = pointer - (u16)push3.m_h5; if (var1 < 0) { var1 += depth * 2; } - s32 var2 = (s32)(s16)queue->m_h4 - (s32)(u16)queue->m_h1; + s32 var2 = (s32)(s16)queue->pop1.read_relaxed().m_h4 - (s32)(u16)queue->pop1.read_relaxed().m_h1; if (var2 < 0) { var2 += depth * 2; } s32 var9_ = 15 - var1; - // calculate (1 slw (15 - var1)) + // calculate (u16)(1 slw (15 - var1)) if (var9_ & 0x30) { var9_ = 0; @@ -1366,20 +1161,9 @@ s32 syncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, { var9_ = 1 << var9_; } - s32 var9 = ~(var9_ | (u16)new_queue.m_h6); - // count leading zeros in u16 - { - u16 v = var9; - for (var9 = 0; var9 < 16; var9++) - { - if (v & (1 << (15 - var9))) - { - break; - } - } - } + s32 var9 = cntlz32((u32)(u16)~(var9_ | (u16)push3.m_h6)) - 16; // count leading zeros in u16 - s32 var5 = (s32)(u16)new_queue.m_h6 | var9_; + s32 var5 = (s32)(u16)push3.m_h6 | var9_; if (var9 & 0x30) { var5 = 0; @@ -1389,13 +1173,13 @@ s32 syncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, var5 <<= var9; } - s32 var3 = (u16)new_queue.m_h5 + var9; + s32 var3 = (u16)push3.m_h5 + var9; if (var3 >= depth * 2) { var3 -= depth * 2; } - u16 pack = new_queue.m_hs[0]; // three packed 5-bit fields + u16 pack = push2.pack; // three packed 5-bit fields s32 var4 = ((pack >> 10) & 0x1f) - ((pack >> 5) & 0x1f); if (var4 < 0) @@ -1433,22 +1217,23 @@ s32 syncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, var12 = (var12 + 1) << 10; } - new_queue.m_hs[0] = (pack & 0x83ff) | var12; - var6 = (u16)queue->m_hs[1 + 2 * var11]; + push2.pack = (pack & 0x83ff) | var12; + var6 = (u16)queue->m_hs1[var11]; } else { var6 = -1; } - s32 var7 = (var3 << 16) | (var5 & 0xffff); + push3.m_h5 = (u16)var3; + push3.m_h6 = (u16)var5; - if (InterlockedCompareExchange(&queue->m_push2(), new_queue.m_push2(), old_data) == old_data) + if (queue->push2.compare_and_swap_test(old, push2)) { assert(var2 + var4 < 16); if (var6 != -1) { - bool exch = InterlockedCompareExchange(&queue->m_push3(), re32(var7), old_data2) == old_data2; + bool exch = queue->push3.compare_and_swap_test(old2, push3); assert(exch); if (exch) { @@ -1458,10 +1243,10 @@ s32 syncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, } else { - pack = queue->m_hs[0]; + pack = queue->push2.read_relaxed().pack; if ((pack & 0x1f) == ((pack >> 10) & 0x1f)) { - if (InterlockedCompareExchange(&queue->m_push3(), re32(var7), old_data2) == old_data2) + if (queue->push3.compare_and_swap_test(old2, push3)) { return CELL_OK; } @@ -1469,8 +1254,6 @@ s32 syncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, } } } - - assert(0); } s32 _cellSyncLFQueueCompletePushPointer(vm::ptr queue, s32 pointer, vm::ptr fpSendSignal) @@ -1522,7 +1305,7 @@ s32 _cellSyncLFQueuePushBody(vm::ptr queue, vm::ptr { s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, u32, u32, u64>::call(GetCurrentPPUThread(), libsre + 0x24B0, libsre_rtoc, @@ -1568,7 +1351,7 @@ s32 _cellSyncLFQueuePushBody(vm::ptr queue, vm::ptr memcpy(vm::get_ptr((u64)(queue->m_buffer.addr() & ~1ull) + size * (position >= depth ? position - depth : position)), buffer.get_ptr(), size); s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, s32, u64>::call(GetCurrentPPUThread(), libsre + 0x26C0, libsre_rtoc, @@ -1593,7 +1376,7 @@ s32 _cellSyncLFQueuePushBody(vm::ptr queue, vm::ptr s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 isBlocking, u32, u32 useEventQueue) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_SPU2PPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_SPU2PPU) { return CELL_SYNC_ERROR_PERM; } @@ -1609,28 +1392,27 @@ s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 i return -1; } - const u64 old_data = InterlockedCompareExchange(&queue->m_pop1(), 0, 0); - CellSyncLFQueue new_queue; - new_queue.m_pop1() = old_data; + const auto old = queue->pop1.read_sync(); + auto pop = old; if (var1) { - new_queue.m_h3 = 0; + pop.m_h3 = 0; } if (isBlocking && useEventQueue && *(u32*)queue->m_bs == -1) { return CELL_SYNC_ERROR_STAT; } - s32 var2 = (s32)(s16)new_queue.m_h4; + s32 var2 = (s32)(s16)pop.m_h4; s32 res; - if (useEventQueue && ((s32)(u16)new_queue.m_h1 != var2 || new_queue.m_h3.ToBE() != 0)) + if (useEventQueue && ((s32)(u16)pop.m_h1 != var2 || pop.m_h3.ToBE() != 0)) { res = CELL_SYNC_ERROR_BUSY; } else { - var2 = (s32)(u16)queue->m_h5 - var2; + var2 = (s32)(u16)queue->push1.read_relaxed().m_h5 - var2; if (var2 < 0) { var2 += depth * 2; @@ -1638,21 +1420,21 @@ s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 i if (var2 > 0) { - pointer = (s16)new_queue.m_h4; + pointer = (s16)pop.m_h4; if (pointer + 1 >= depth * 2) { - new_queue.m_h4 = 0; + pop.m_h4 = 0; } else { - new_queue.m_h4++; + pop.m_h4++; } res = CELL_OK; } else if (!isBlocking) { res = CELL_SYNC_ERROR_AGAIN; - if (!new_queue.m_h3.ToBE() || res) + if (!pop.m_h3.ToBE() || res) { return res; } @@ -1665,7 +1447,7 @@ s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 i else { res = CELL_OK; - new_queue.m_h3 = 3; + pop.m_h3 = 3; if (isBlocking != 3) { break; @@ -1673,9 +1455,9 @@ s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 i } } - if (InterlockedCompareExchange(&queue->m_pop1(), new_queue.m_pop1(), old_data) == old_data) + if (queue->pop1.compare_and_swap_test(old, pop)) { - if (!new_queue.m_h3.ToBE() || res) + if (!pop.m_h3.ToBE() || res) { return res; } @@ -1683,17 +1465,12 @@ s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 i } } - u32 eq = (u32)queue->m_v3; // 0x7c - sys_event_data event; - assert(0); - // TODO: sys_event_queue_receive (event data is not used), assert if error returned + assert(sys_event_queue_receive(queue->m_eq_id, vm::ptr::make(0), 0) == CELL_OK); var1 = 1; } - - assert(0); } -s32 _cellSyncLFQueueGetPopPointer(vm::ptr queue, vm::ptr> pointer, u32 isBlocking, u32 arg4, u32 useEventQueue) +s32 _cellSyncLFQueueGetPopPointer(vm::ptr queue, vm::ptr pointer, u32 isBlocking, u32 arg4, u32 useEventQueue) { cellSync->Todo("_cellSyncLFQueueGetPopPointer(queue_addr=0x%x, pointer_addr=0x%x, isBlocking=%d, arg4=%d, useEventQueue=%d)", queue.addr(), pointer.addr(), isBlocking, arg4, useEventQueue); @@ -1712,7 +1489,7 @@ s32 syncLFQueueGetPopPointer2(vm::ptr queue, s32& pointer, u32 return CELL_OK; } -s32 _cellSyncLFQueueGetPopPointer2(vm::ptr queue, vm::ptr> pointer, u32 isBlocking, u32 useEventQueue) +s32 _cellSyncLFQueueGetPopPointer2(vm::ptr queue, vm::ptr pointer, u32 isBlocking, u32 useEventQueue) { // arguments copied from _cellSyncLFQueueGetPopPointer cellSync->Todo("_cellSyncLFQueueGetPopPointer2(queue_addr=0x%x, pointer_addr=0x%x, isBlocking=%d, useEventQueue=%d)", @@ -1726,7 +1503,7 @@ s32 _cellSyncLFQueueGetPopPointer2(vm::ptr queue, vm::ptr queue, s32 pointer, const std::function fpSendSignal, u32 noQueueFull) { - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_SPU2PPU)) + if (queue->m_direction != CELL_SYNC_QUEUE_SPU2PPU) { return CELL_SYNC_ERROR_PERM; } @@ -1735,27 +1512,26 @@ s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, c while (true) { - const u32 old_data = InterlockedCompareExchange(&queue->m_pop2(), 0, 0); - CellSyncLFQueue new_queue; - new_queue.m_pop2() = old_data; + const auto old = queue->pop2.read_sync(); + auto pop2 = old; - const u32 old_data2 = queue->m_pop3(); - new_queue.m_pop3() = old_data2; + const auto old2 = queue->pop3.read_relaxed(); + auto pop3 = old2; - s32 var1 = pointer - (u16)new_queue.m_h1; + s32 var1 = pointer - (u16)pop3.m_h1; if (var1 < 0) { var1 += depth * 2; } - s32 var2 = (s32)(s16)queue->m_h8 - (s32)(u16)queue->m_h5; + s32 var2 = (s32)(s16)queue->push1.read_relaxed().m_h8 - (s32)(u16)queue->push1.read_relaxed().m_h5; if (var2 < 0) { var2 += depth * 2; } s32 var9_ = 15 - var1; - // calculate (1 slw (15 - var1)) + // calculate (u16)(1 slw (15 - var1)) if (var9_ & 0x30) { var9_ = 0; @@ -1764,20 +1540,9 @@ s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, c { var9_ = 1 << var9_; } - s32 var9 = ~(var9_ | (u16)new_queue.m_h2); - // count leading zeros in u16 - { - u16 v = var9; - for (var9 = 0; var9 < 16; var9++) - { - if (v & (1 << (15 - var9))) - { - break; - } - } - } + s32 var9 = cntlz32((u32)(u16)~(var9_ | (u16)pop3.m_h2)) - 16; // count leading zeros in u16 - s32 var5 = (s32)(u16)new_queue.m_h2 | var9_; + s32 var5 = (s32)(u16)pop3.m_h2 | var9_; if (var9 & 0x30) { var5 = 0; @@ -1787,13 +1552,13 @@ s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, c var5 <<= var9; } - s32 var3 = (u16)new_queue.m_h1 + var9; + s32 var3 = (u16)pop3.m_h1 + var9; if (var3 >= depth * 2) { var3 -= depth * 2; } - u16 pack = new_queue.m_hs[16]; // three packed 5-bit fields + u16 pack = pop2.pack; // three packed 5-bit fields s32 var4 = ((pack >> 10) & 0x1f) - ((pack >> 5) & 0x1f); if (var4 < 0) @@ -1835,17 +1600,18 @@ s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, c var12 = (var12 + 1) << 10; } - new_queue.m_hs[0] = (pack & 0x83ff) | var12; - var6 = (u16)queue->m_hs[17 + 2 * var11]; + pop2.pack = (pack & 0x83ff) | var12; + var6 = (u16)queue->m_hs2[var11]; } - s32 var7 = (var3 << 16) | (var5 & 0xffff); + pop3.m_h1 = (u16)var3; + pop3.m_h2 = (u16)var5; - if (InterlockedCompareExchange(&queue->m_pop2(), new_queue.m_pop2(), old_data) == old_data) + if (queue->pop2.compare_and_swap_test(old, pop2)) { if (var6 != -1) { - bool exch = InterlockedCompareExchange(&queue->m_pop3(), re32(var7), old_data2) == old_data2; + bool exch = queue->pop3.compare_and_swap_test(old2, pop3); assert(exch); if (exch) { @@ -1855,10 +1621,10 @@ s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, c } else { - pack = queue->m_hs[16]; + pack = queue->pop2.read_relaxed().pack; if ((pack & 0x1f) == ((pack >> 10) & 0x1f)) { - if (InterlockedCompareExchange(&queue->m_pop3(), re32(var7), old_data2) == old_data2) + if (queue->pop3.compare_and_swap_test(old2, pop3)) { return CELL_OK; } @@ -1866,8 +1632,6 @@ s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, c } } } - - assert(0); } s32 _cellSyncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, vm::ptr fpSendSignal, u32 noQueueFull) @@ -1917,7 +1681,7 @@ s32 _cellSyncLFQueuePopBody(vm::ptr queue, vm::ptr buffer while (true) { s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, u32, u32, u64, u64>::call(GetCurrentPPUThread(), libsre + 0x2A90, libsre_rtoc, @@ -1960,7 +1724,7 @@ s32 _cellSyncLFQueuePopBody(vm::ptr queue, vm::ptr buffer memcpy(buffer.get_ptr(), vm::get_ptr((u64)(queue->m_buffer.addr() & ~1ull) + size * (position >= depth ? position - depth : position)), size); s32 res; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { #ifdef PRX_DEBUG_XXX res = cb_caller, s32, u64, u64>::call(GetCurrentPPUThread(), libsre + 0x2CA8, libsre_rtoc, @@ -1995,42 +1759,44 @@ s32 cellSyncLFQueueClear(vm::ptr queue) return CELL_SYNC_ERROR_ALIGN; } - // TODO: optimize if possible while (true) { - const u64 old_data = InterlockedCompareExchange(&queue->m_pop1(), 0, 0); - CellSyncLFQueue new_queue; - new_queue.m_pop1() = old_data; + const auto old = queue->pop1.read_sync(); + auto pop = old; - const u64 new_data = queue->m_push1(); - new_queue.m_push1() = new_data; + const auto push = queue->push1.read_relaxed(); s32 var1, var2; - if (queue->m_direction.ToBE() != se32(CELL_SYNC_QUEUE_ANY2ANY)) + if (queue->m_direction != CELL_SYNC_QUEUE_ANY2ANY) { - var1 = var2 = (u16)queue->m_hs[16]; + var1 = var2 = (u16)queue->pop2.read_relaxed().pack; } else { - var1 = (u16)new_queue.m_h7; - var2 = (u16)new_queue.m_h3; + var1 = (u16)push.m_h7; + var2 = (u16)pop.m_h3; } - if ((s32)(s16)new_queue.m_h4 != (s32)(u16)new_queue.m_h1 || - (s32)(s16)new_queue.m_h8 != (s32)(u16)new_queue.m_h5 || + if ((s32)(s16)pop.m_h4 != (s32)(u16)pop.m_h1 || + (s32)(s16)push.m_h8 != (s32)(u16)push.m_h5 || ((var2 >> 10) & 0x1f) != (var2 & 0x1f) || ((var1 >> 10) & 0x1f) != (var1 & 0x1f)) { return CELL_SYNC_ERROR_BUSY; } - if (InterlockedCompareExchange(&queue->m_pop1(), new_data, old_data) == old_data) break; + pop.m_h1 = push.m_h5; + pop.m_h2 = push.m_h6; + pop.m_h3 = push.m_h7; + pop.m_h4 = push.m_h8; + + if (queue->pop1.compare_and_swap_test(old, pop)) break; } return CELL_OK; } -s32 cellSyncLFQueueSize(vm::ptr queue, vm::ptr> size) +s32 cellSyncLFQueueSize(vm::ptr queue, vm::ptr size) { cellSync->Warning("cellSyncLFQueueSize(queue_addr=0x%x, size_addr=0x%x)", queue.addr(), size.addr()); @@ -2043,15 +1809,14 @@ s32 cellSyncLFQueueSize(vm::ptr queue, vm::ptr> size) return CELL_SYNC_ERROR_ALIGN; } - // TODO: optimize if possible while (true) { - const u32 old_data = InterlockedCompareExchange(&queue->m_pop3(), 0, 0); + const auto old = queue->pop3.read_sync(); - u32 var1 = (u16)queue->m_h1; - u32 var2 = (u16)queue->m_h5; + u32 var1 = (u16)queue->pop1.read_relaxed().m_h1; + u32 var2 = (u16)queue->push1.read_relaxed().m_h5; - if (InterlockedCompareExchange(&queue->m_pop3(), old_data, old_data) == old_data) + if (queue->pop3.compare_and_swap_test(old, old)) { if (var1 <= var2) { @@ -2064,11 +1829,9 @@ s32 cellSyncLFQueueSize(vm::ptr queue, vm::ptr> size) return CELL_OK; } } - - assert(0); } -s32 cellSyncLFQueueDepth(vm::ptr queue, vm::ptr> depth) +s32 cellSyncLFQueueDepth(vm::ptr queue, vm::ptr depth) { cellSync->Log("cellSyncLFQueueDepth(queue_addr=0x%x, depth_addr=0x%x)", queue.addr(), depth.addr()); @@ -2085,7 +1848,7 @@ s32 cellSyncLFQueueDepth(vm::ptr queue, vm::ptr> dept return CELL_OK; } -s32 _cellSyncLFQueueGetSignalAddress(vm::ptr queue, vm::ptr> ppSignal) +s32 _cellSyncLFQueueGetSignalAddress(vm::ptr queue, vm::ptr ppSignal) { cellSync->Log("_cellSyncLFQueueGetSignalAddress(queue_addr=0x%x, ppSignal_addr=0x%x)", queue.addr(), ppSignal.addr()); @@ -2102,7 +1865,7 @@ s32 _cellSyncLFQueueGetSignalAddress(vm::ptr queue, vm::p return CELL_OK; } -s32 cellSyncLFQueueGetDirection(vm::ptr queue, vm::ptr> direction) +s32 cellSyncLFQueueGetDirection(vm::ptr queue, vm::ptr direction) { cellSync->Log("cellSyncLFQueueGetDirection(queue_addr=0x%x, direction_addr=0x%x)", queue.addr(), direction.addr()); @@ -2119,7 +1882,7 @@ s32 cellSyncLFQueueGetDirection(vm::ptr queue, vm::ptr queue, vm::ptr> entry_size) +s32 cellSyncLFQueueGetEntrySize(vm::ptr queue, vm::ptr entry_size) { cellSync->Log("cellSyncLFQueueGetEntrySize(queue_addr=0x%x, entry_size_addr=0x%x)", queue.addr(), entry_size.addr()); @@ -2136,28 +1899,36 @@ s32 cellSyncLFQueueGetEntrySize(vm::ptr queue, vm::ptr> spus, u32 num, vm::ptr queue) +s32 syncLFQueueAttachLv2EventQueue(vm::ptr spus, u32 num, vm::ptr queue) { - // TODO - assert(0); +#ifdef PRX_DEBUG + return cb_call, u32, vm::ptr>(GetCurrentPPUThread(), libsre + 0x19A8, libsre_rtoc, + spus, num, queue); +#endif + + assert(!"syncLFQueueAttachLv2EventQueue"); return CELL_OK; } -s32 _cellSyncLFQueueAttachLv2EventQueue(vm::ptr> spus, u32 num, vm::ptr queue) +s32 _cellSyncLFQueueAttachLv2EventQueue(vm::ptr spus, u32 num, vm::ptr queue) { cellSync->Todo("_cellSyncLFQueueAttachLv2EventQueue(spus_addr=0x%x, num=%d, queue_addr=0x%x)", spus.addr(), num, queue.addr()); return syncLFQueueAttachLv2EventQueue(spus, num, queue); } -s32 syncLFQueueDetachLv2EventQueue(vm::ptr> spus, u32 num, vm::ptr queue) +s32 syncLFQueueDetachLv2EventQueue(vm::ptr spus, u32 num, vm::ptr queue) { - // TODO - assert(0); +#ifdef PRX_DEBUG + return cb_call, u32, vm::ptr>(GetCurrentPPUThread(), libsre + 0x1DA0, libsre_rtoc, + spus, num, queue); +#endif + + assert(!"syncLFQueueDetachLv2EventQueue"); return CELL_OK; } -s32 _cellSyncLFQueueDetachLv2EventQueue(vm::ptr> spus, u32 num, vm::ptr queue) +s32 _cellSyncLFQueueDetachLv2EventQueue(vm::ptr spus, u32 num, vm::ptr queue) { cellSync->Todo("_cellSyncLFQueueDetachLv2EventQueue(spus_addr=0x%x, num=%d, queue_addr=0x%x)", spus.addr(), num, queue.addr()); @@ -2218,7 +1989,9 @@ void cellSync_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { - libsre = (u32)Memory.PRXMem.AllocAlign(sizeof(libsre_data), 4096); + if (!Memory.MainMem.GetStartAddr()) return; + + libsre = (u32)Memory.MainMem.AllocAlign(sizeof(libsre_data), 0x100000); memcpy(vm::get_ptr(libsre), libsre_data, sizeof(libsre_data)); libsre_rtoc = libsre + 0x399B0; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync.h b/rpcs3/Emu/SysCalls/Modules/cellSync.h index 5e282cec50..998418615a 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync.h +++ b/rpcs3/Emu/SysCalls/Modules/cellSync.h @@ -31,58 +31,58 @@ enum struct CellSyncMutex { - be_t m_freed; - be_t m_order; - - volatile u32& m_data() + struct data_t { - return *reinterpret_cast(this); + be_t m_rel; // release order (increased when mutex is unlocked) + be_t m_acq; // acquire order (increased when mutex is locked) }; + + atomic_t data; }; static_assert(sizeof(CellSyncMutex) == 4, "CellSyncMutex: wrong size"); struct CellSyncBarrier { - be_t m_value; - be_t m_count; - - volatile u32& m_data() + struct data_t { - return *reinterpret_cast(this); + be_t m_value; + be_t m_count; }; + + atomic_t data; }; static_assert(sizeof(CellSyncBarrier) == 4, "CellSyncBarrier: wrong size"); struct CellSyncRwm { - be_t m_readers; - be_t m_writers; + struct data_t + { + be_t m_readers; + be_t m_writers; + }; + + atomic_t data; be_t m_size; vm::bptr m_buffer; - - volatile u32& m_data() - { - return *reinterpret_cast(this); - }; }; static_assert(sizeof(CellSyncRwm) == 16, "CellSyncRwm: wrong size"); struct CellSyncQueue { - be_t m_v1; - be_t m_v2; + struct data_t + { + be_t m_v1; + be_t m_v2; + }; + + atomic_t data; be_t m_size; be_t m_depth; vm::bptr m_buffer; be_t reserved; - - volatile u64& m_data() - { - return *reinterpret_cast(this); - }; }; static_assert(sizeof(CellSyncQueue) == 32, "CellSyncQueue: wrong size"); @@ -97,60 +97,68 @@ enum CellSyncQueueDirection : u32 // CellSyncLFQueueDirection struct CellSyncLFQueue { - be_t m_h1; // 0x0 - be_t m_h2; // 0x2 - be_t m_h3; // 0x4 - be_t m_h4; // 0x6 - be_t m_h5; // 0x8 - be_t m_h6; // 0xA - be_t m_h7; // 0xC - be_t m_h8; // 0xE - be_t m_size; // 0x10 - be_t m_depth; // 0x14 + struct pop1_t + { + be_t m_h1; + be_t m_h2; + be_t m_h3; + be_t m_h4; + }; + + struct pop2_t + { + be_t pack; + }; + + struct pop3_t + { + be_t m_h1; + be_t m_h2; + }; + + struct push1_t + { + be_t m_h5; + be_t m_h6; + be_t m_h7; + be_t m_h8; + }; + + struct push2_t + { + be_t pack; + }; + + struct push3_t + { + be_t m_h5; + be_t m_h6; + }; + + union + { + atomic_t pop1; // 0x0 + atomic_t pop3; + }; + union + { + atomic_t push1; // 0x8 + atomic_t push3; + }; + be_t m_size; // 0x10 + be_t m_depth; // 0x14 vm::bptr m_buffer; // 0x18 - u8 m_bs[4]; // 0x20 + u8 m_bs[4]; // 0x20 be_t m_direction; // 0x24 - be_t m_v1; // 0x28 - be_t m_sync; // 0x2C - be_t m_hs[32]; // 0x30 + be_t m_v1; // 0x28 + atomic_t init; // 0x2C + atomic_t push2; // 0x30 + be_t m_hs1[15]; // 0x32 + atomic_t pop2; // 0x50 + be_t m_hs2[15]; // 0x52 vm::bptr m_eaSignal; // 0x70 - be_t m_v2; // 0x78 - be_t m_v3; // 0x7C - - volatile u32& m_data() - { - return *reinterpret_cast((u8*)this + 0x2c); - } - - volatile u64& m_push1() - { - return *reinterpret_cast((u8*)this + 0x8); - } - - volatile u32& m_push2() - { - return *reinterpret_cast((u8*)this + 0x30); - } - - volatile u32& m_push3() - { - return *reinterpret_cast((u8*)this + 0x8); - } - - volatile u64& m_pop1() - { - return *reinterpret_cast((u8*)this + 0x0); - } - - volatile u32& m_pop2() - { - return *reinterpret_cast((u8*)this + 0x50); - } - - volatile u32& m_pop3() - { - return *reinterpret_cast((u8*)this + 0x0); - } + be_t m_v2; // 0x78 + be_t m_eq_id; // 0x7C }; static_assert(sizeof(CellSyncLFQueue) == 128, "CellSyncLFQueue: wrong size"); @@ -172,5 +180,5 @@ s32 syncLFQueueGetPopPointer(vm::ptr queue, s32& pointer, u32 i s32 syncLFQueueGetPopPointer2(vm::ptr queue, s32& pointer, u32 isBlocking, u32 useEventQueue); s32 syncLFQueueCompletePopPointer(vm::ptr queue, s32 pointer, const std::function fpSendSignal, u32 noQueueFull); s32 syncLFQueueCompletePopPointer2(vm::ptr queue, s32 pointer, const std::function fpSendSignal, u32 noQueueFull); -s32 syncLFQueueAttachLv2EventQueue(vm::ptr> spus, u32 num, vm::ptr queue); -s32 syncLFQueueDetachLv2EventQueue(vm::ptr> spus, u32 num, vm::ptr queue); +s32 syncLFQueueAttachLv2EventQueue(vm::ptr spus, u32 num, vm::ptr queue); +s32 syncLFQueueDetachLv2EventQueue(vm::ptr spus, u32 num, vm::ptr queue); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp b/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp index de4ca912e0..fb39449614 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSync2.cpp @@ -458,7 +458,9 @@ void cellSync2_init(Module *pxThis) #ifdef PRX_DEBUG CallAfter([]() { - libsync2 = (u32)Memory.PRXMem.AllocAlign(sizeof(libsync2_data), 4096); + if (!Memory.MainMem.GetStartAddr()) return; + + libsync2 = (u32)Memory.MainMem.AllocAlign(sizeof(libsync2_data), 0x100000); memcpy(vm::get_ptr(libsync2), libsync2_data, sizeof(libsync2_data)); libsync2_rtoc = libsync2 + 0xF280; diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index e096a7e657..2c4271e8ff 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -23,7 +23,7 @@ typedef void (*CellHddGameStatCallback)(vm::ptr cbResult, v Module *cellSysutil = nullptr; -int cellSysutilGetSystemParamInt(int id, vm::ptr> value) +int cellSysutilGetSystemParamInt(int id, vm::ptr value) { cellSysutil->Log("cellSysutilGetSystemParamInt(id=0x%x, value_addr=0x%x)", id, value.addr()); @@ -825,7 +825,7 @@ int cellSysutilGetBgmPlaybackStatus2(vm::ptr stat return CELL_OK; } -int cellWebBrowserEstimate2(const vm::ptr config, vm::ptr> memSize) +int cellWebBrowserEstimate2(const vm::ptr config, vm::ptr memSize) { cellSysutil->Warning("cellWebBrowserEstimate2(config_addr=0x%x, memSize_addr=0x%x)", config.addr(), memSize.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp index 8c4d653abc..8815280edc 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellUserInfo.cpp @@ -55,7 +55,7 @@ int cellUserInfoEnableOverlay() return CELL_OK; } -int cellUserInfoGetList(vm::ptr> listNum, vm::ptr listBuf, vm::ptr> currentUserId) +int cellUserInfoGetList(vm::ptr listNum, vm::ptr listBuf, vm::ptr currentUserId) { cellUserInfo->Warning("cellUserInfoGetList(listNum_addr=0x%x, listBuf_addr=0x%x, currentUserId_addr=0x%x)", listNum.addr(), listBuf.addr(), currentUserId.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp index 55dc0e5c1e..55f4b9c2ec 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.cpp @@ -28,7 +28,7 @@ VideoDecoder::VideoDecoder(CellVdecCodecType type, u32 profile, u32 addr, u32 si , cbFunc(func) , cbArg(arg) , is_finished(false) - , is_running(false) + , is_closed(false) , just_started(false) , just_finished(false) , ctx(nullptr) @@ -64,14 +64,14 @@ VideoDecoder::VideoDecoder(CellVdecCodecType type, u32 profile, u32 addr, u32 si VideoDecoder::~VideoDecoder() { // TODO: check finalization + VdecFrame vf; + while (frames.Pop(vf, &sq_no_wait)) + { + av_frame_unref(vf.data); + av_frame_free(&vf.data); + } if (ctx) { - for (u32 i = frames.GetCount() - 1; ~i; i--) - { - VdecFrame& vf = frames.Peek(i); - av_frame_unref(vf.data); - av_frame_free(&vf.data); - } avcodec_close(ctx); avformat_close_input(&fmt); } @@ -95,44 +95,46 @@ int vdecRead(void* opaque, u8* buf, int buf_size) next: if (vdec.reader.size < (u32)buf_size /*&& !vdec.just_started*/) { - while (!vdec.job.GetCountUnsafe()) + VdecTask task; + if (!vdec.job.Peek(task, &vdec.is_closed)) { - if (Emu.IsStopped()) - { - cellVdec->Warning("vdecRead(): aborted"); - return 0; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + if (Emu.IsStopped()) cellVdec->Warning("vdecRead() aborted"); + return 0; } - switch (vdec.job.Peek().type) + switch (task.type) { case vdecEndSeq: case vdecClose: - { - buf_size = vdec.reader.size; - } - break; + { + buf_size = vdec.reader.size; + } + break; + case vdecDecodeAu: - { - memcpy(buf, vm::get_ptr(vdec.reader.addr), vdec.reader.size); + { + memcpy(buf, vm::get_ptr(vdec.reader.addr), vdec.reader.size); - buf += vdec.reader.size; - buf_size -= vdec.reader.size; - res += vdec.reader.size; + buf += vdec.reader.size; + buf_size -= vdec.reader.size; + res += vdec.reader.size; - vdec.cbFunc.call(*vdec.vdecCb, vdec.id, CELL_VDEC_MSG_TYPE_AUDONE, CELL_OK, vdec.cbArg); + vdec.cbFunc.call(*vdec.vdecCb, vdec.id, CELL_VDEC_MSG_TYPE_AUDONE, CELL_OK, vdec.cbArg); - vdec.job.Pop(vdec.task); + vdec.job.Pop(vdec.task, nullptr); - vdec.reader.addr = vdec.task.addr; - vdec.reader.size = vdec.task.size; - //LOG_NOTICE(HLE, "Video AU: size = 0x%x, pts = 0x%llx, dts = 0x%llx", vdec.task.size, vdec.task.pts, vdec.task.dts); - } - break; + vdec.reader.addr = vdec.task.addr; + vdec.reader.size = vdec.task.size; + //LOG_NOTICE(HLE, "Video AU: size = 0x%x, pts = 0x%llx, dts = 0x%llx", vdec.task.size, vdec.task.pts, vdec.task.dts); + } + break; + default: - cellVdec->Error("vdecRead(): sequence error (task %d)", vdec.job.Peek().type); - return 0; + { + cellVdec->Error("vdecRead(): unknown task (%d)", task.type); + Emu.Pause(); + return -1; + } } goto next; @@ -199,24 +201,18 @@ u32 vdecOpen(VideoDecoder* data) while (true) { - if (Emu.IsStopped()) + if (Emu.IsStopped() || vdec.is_closed) { break; } - if (!vdec.job.GetCountUnsafe() && vdec.is_running) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - } + //if (!vdec.job.GetCountUnsafe() && vdec.is_running) + //{ + // std::this_thread::sleep_for(std::chrono::milliseconds(1)); + // continue; + //} - if (vdec.frames.GetCount() >= 50) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - continue; - } - - if (!vdec.job.Pop(task)) + if (!vdec.job.Pop(task, &vdec.is_closed)) { break; } @@ -228,9 +224,7 @@ u32 vdecOpen(VideoDecoder* data) // TODO: reset data cellVdec->Warning("vdecStartSeq:"); - vdec.reader.addr = 0; - vdec.reader.size = 0; - vdec.is_running = true; + vdec.reader = {}; vdec.just_started = true; } break; @@ -242,7 +236,6 @@ u32 vdecOpen(VideoDecoder* data) vdec.cbFunc.call(*vdec.vdecCb, vdec.id, CELL_VDEC_MSG_TYPE_SEQDONE, CELL_OK, vdec.cbArg); - vdec.is_running = false; vdec.just_finished = true; } break; @@ -358,11 +351,10 @@ u32 vdecOpen(VideoDecoder* data) while (true) { - if (Emu.IsStopped() || vdec.job.PeekIfExist().type == vdecClose) + if (Emu.IsStopped() || vdec.is_closed) { - vdec.is_finished = true; - cellVdec->Warning("vdecDecodeAu: aborted"); - return; + if (Emu.IsStopped()) cellVdec->Warning("vdecDecodeAu: aborted"); + break; } last_frame = av_read_frame(vdec.fmt, &au) < 0; @@ -432,10 +424,11 @@ u32 vdecOpen(VideoDecoder* data) //LOG_NOTICE(HLE, "got picture (pts=0x%llx, dts=0x%llx)", frame.pts, frame.dts); - vdec.frames.Push(frame); // !!!!!!!! - frame.data = nullptr; // to prevent destruction - - vdec.cbFunc.call(*vdec.vdecCb, vdec.id, CELL_VDEC_MSG_TYPE_PICOUT, CELL_OK, vdec.cbArg); + if (vdec.frames.Push(frame, &vdec.is_closed)) + { + frame.data = nullptr; // to prevent destruction + vdec.cbFunc.call(*vdec.vdecCb, vdec.id, CELL_VDEC_MSG_TYPE_PICOUT, CELL_OK, vdec.cbArg); + } } } @@ -443,26 +436,27 @@ u32 vdecOpen(VideoDecoder* data) } break; - case vdecClose: - { - vdec.is_finished = true; - cellVdec->Notice("Video Decoder thread ended"); - return; - } - case vdecSetFrameRate: { cellVdec->Error("TODO: vdecSetFrameRate(%d)", task.frc); + Emu.Pause(); } break; + case vdecClose: break; + default: + { cellVdec->Error("Video Decoder thread error: unknown task(%d)", task.type); + Emu.Pause(); + return; + } } } vdec.is_finished = true; - cellVdec->Warning("Video Decoder thread aborted"); + if (Emu.IsStopped()) cellVdec->Warning("Video Decoder thread aborted"); + if (vdec.is_closed) cellVdec->Notice("Video Decoder thread ended"); }); t.detach(); @@ -484,7 +478,7 @@ int cellVdecQueryAttrEx(vm::ptr type, vm::ptrcodecType, type->profileLevel, type->codecSpecificInfo_addr, attr); } -int cellVdecOpen(vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr> handle) +int cellVdecOpen(vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr handle) { cellVdec->Warning("cellVdecOpen(type_addr=0x%x, res_addr=0x%x, cb_addr=0x%x, handle_addr=0x%x)", type.addr(), res.addr(), cb.addr(), handle.addr()); @@ -494,7 +488,7 @@ int cellVdecOpen(vm::ptr type, vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr> handle) +int cellVdecOpenEx(vm::ptr type, vm::ptr res, vm::ptr cb, vm::ptr handle) { cellVdec->Warning("cellVdecOpenEx(type_addr=0x%x, res_addr=0x%x, cb_addr=0x%x, handle_addr=0x%x)", type.addr(), res.addr(), cb.addr(), handle.addr()); @@ -514,7 +508,8 @@ int cellVdecClose(u32 handle) return CELL_VDEC_ERROR_ARG; } - vdec->job.Push(VdecTask(vdecClose)); + vdec->is_closed = true; + vdec->job.Push(VdecTask(vdecClose), &sq_no_wait); while (!vdec->is_finished) { @@ -541,7 +536,7 @@ int cellVdecStartSeq(u32 handle) return CELL_VDEC_ERROR_ARG; } - vdec->job.Push(VdecTask(vdecStartSeq)); + vdec->job.Push(VdecTask(vdecStartSeq), &vdec->is_closed); return CELL_OK; } @@ -555,29 +550,7 @@ int cellVdecEndSeq(u32 handle) return CELL_VDEC_ERROR_ARG; } - /*if (!vdec->job.IsEmpty()) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - return CELL_VDEC_ERROR_BUSY; // ??? - } - - if (!vdec->frames.IsEmpty()) - { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - return CELL_VDEC_ERROR_BUSY; // ??? - }*/ - - while (!vdec->job.IsEmpty() || !vdec->frames.IsEmpty()) - { - if (Emu.IsStopped()) - { - cellVdec->Warning("cellVdecEndSeq(%d) aborted", handle); - return CELL_OK; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - - vdec->job.Push(VdecTask(vdecEndSeq)); + vdec->job.Push(VdecTask(vdecEndSeq), &vdec->is_closed); return CELL_OK; } @@ -601,7 +574,7 @@ int cellVdecDecodeAu(u32 handle, CellVdecDecodeMode mode, vm::ptruserData; task.specData = auInfo->codecSpecificData; - vdec->job.Push(task); + vdec->job.Push(task, &vdec->is_closed); return CELL_OK; } @@ -615,11 +588,19 @@ int cellVdecGetPicture(u32 handle, vm::ptr format, vm:: return CELL_VDEC_ERROR_ARG; } - if (vdec->frames.IsEmpty()) + VdecFrame vf; + if (!vdec->frames.Pop(vf, &sq_no_wait)) { + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_VDEC_ERROR_EMPTY; } + if (!vf.data) + { + // hack + return CELL_OK; + } + if (outBuff) { u32 buf_size = a128(av_image_get_buffer_size(vdec->ctx->pix_fmt, vdec->ctx->width, vdec->ctx->height, 1)); @@ -636,10 +617,6 @@ int cellVdecGetPicture(u32 handle, vm::ptr format, vm:: return CELL_OK; } - VdecFrame vf; - - vdec->frames.Pop(vf); - AVFrame& frame = *vf.data; // TODO: zero padding bytes @@ -650,15 +627,14 @@ int cellVdecGetPicture(u32 handle, vm::ptr format, vm:: cellVdec->Error("cellVdecGetPicture: av_image_copy_to_buffer failed(%d)", err); Emu.Pause(); } - - av_frame_unref(vf.data); - av_frame_free(&vf.data); } + av_frame_unref(vf.data); + av_frame_free(&vf.data); return CELL_OK; } -int cellVdecGetPicItem(u32 handle, vm::ptr> picItem_ptr) +int cellVdecGetPicItem(u32 handle, vm::ptr picItem_ptr) { cellVdec->Log("cellVdecGetPicItem(handle=%d, picItem_ptr_addr=0x%x)", handle, picItem_ptr.addr()); @@ -668,14 +644,13 @@ int cellVdecGetPicItem(u32 handle, vm::ptr> picItem_ptr) return CELL_VDEC_ERROR_ARG; } - if (vdec->frames.IsEmpty()) + VdecFrame vf; + if (!vdec->frames.Peek(vf, &sq_no_wait)) { - std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack return CELL_VDEC_ERROR_EMPTY; } - VdecFrame& vf = vdec->frames.Peek(); - AVFrame& frame = *vf.data; auto info = vm::ptr::make(vdec->memAddr + vdec->memBias); @@ -782,7 +757,7 @@ int cellVdecSetFrameRate(u32 handle, CellVdecFrameRate frc) VdecTask task(vdecSetFrameRate); task.frc = frc; - vdec->job.Push(task); + vdec->job.Push(task, &vdec->is_closed); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellVdec.h b/rpcs3/Emu/SysCalls/Modules/cellVdec.h index ca4795e145..144c0766ad 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVdec.h +++ b/rpcs3/Emu/SysCalls/Modules/cellVdec.h @@ -647,7 +647,6 @@ struct CellVdecMpeg2Info enum VdecJobType : u32 { - vdecInvalid, vdecStartSeq, vdecEndSeq, vdecDecodeAu, @@ -676,7 +675,6 @@ struct VdecTask } VdecTask() - : type(vdecInvalid) { } }; @@ -696,7 +694,7 @@ class VideoDecoder public: SQueue job; u32 id; - volatile bool is_running; + volatile bool is_closed; volatile bool is_finished; bool just_started; bool just_finished; diff --git a/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp b/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp index 749dc18f42..d4790ca782 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellVpost.cpp @@ -35,7 +35,7 @@ u32 vpostOpen(VpostInstance* data) return id; } -int cellVpostOpen(vm::ptr cfgParam, vm::ptr resource, vm::ptr> handle) +int cellVpostOpen(vm::ptr cfgParam, vm::ptr resource, vm::ptr handle) { cellVpost->Warning("cellVpostOpen(cfgParam_addr=0x%x, resource_addr=0x%x, handle_addr=0x%x)", cfgParam.addr(), resource.addr(), handle.addr()); @@ -45,7 +45,7 @@ int cellVpostOpen(vm::ptr cfgParam, vm::ptr cfgParam, vm::ptr resource, vm::ptr> handle) +int cellVpostOpenEx(vm::ptr cfgParam, vm::ptr resource, vm::ptr handle) { cellVpost->Warning("cellVpostOpenEx(cfgParam_addr=0x%x, resource_addr=0x%x, handle_addr=0x%x)", cfgParam.addr(), resource.addr(), handle.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp index 618be0c3c2..76fae67e3f 100644 --- a/rpcs3/Emu/SysCalls/Modules/libmixer.cpp +++ b/rpcs3/Emu/SysCalls/Modules/libmixer.cpp @@ -140,7 +140,7 @@ int cellAANDisconnect(u32 receive, u32 receivePortNo, u32 source, u32 sourcePort return CELL_OK; } -int cellSSPlayerCreate(vm::ptr> handle, vm::ptr config) +int cellSSPlayerCreate(vm::ptr handle, vm::ptr config) { libmixer->Warning("cellSSPlayerCreate(handle_addr=0x%x, config_addr=0x%x)", handle.addr(), config.addr()); @@ -358,7 +358,7 @@ int cellSurMixerCreate(vm::ptr config) memset(mixdata, 0, sizeof(mixdata)); if (surMixerCb) { - surMixerCb.call(cb_thread, surMixerCbArg, mixcount, 256); + surMixerCb.call(cb_thread, surMixerCbArg, (u32)mixcount, 256); } //u64 stamp1 = get_system_time(); @@ -471,14 +471,14 @@ int cellSurMixerCreate(vm::ptr config) return CELL_OK; } -int cellSurMixerGetAANHandle(vm::ptr> handle) +int cellSurMixerGetAANHandle(vm::ptr handle) { libmixer->Warning("cellSurMixerGetAANHandle(handle_addr=0x%x) -> %d", handle.addr(), 0x11111111); *handle = 0x11111111; return CELL_OK; } -int cellSurMixerChStripGetAANPortNo(vm::ptr> port, u32 type, u32 index) +int cellSurMixerChStripGetAANPortNo(vm::ptr port, u32 type, u32 index) { libmixer->Warning("cellSurMixerChStripGetAANPortNo(port_addr=0x%x, type=0x%x, index=0x%x) -> 0x%x", port.addr(), type, index, (type << 16) | index); *port = (type << 16) | index; @@ -593,7 +593,7 @@ int cellSurMixerPause(u32 type) return CELL_OK; } -int cellSurMixerGetCurrentBlockTag(vm::ptr> tag) +int cellSurMixerGetCurrentBlockTag(vm::ptr tag) { libmixer->Log("cellSurMixerGetCurrentBlockTag(tag_addr=0x%x)", tag.addr()); @@ -601,7 +601,7 @@ int cellSurMixerGetCurrentBlockTag(vm::ptr> tag) return CELL_OK; } -int cellSurMixerGetTimestamp(u64 tag, vm::ptr> stamp) +int cellSurMixerGetTimestamp(u64 tag, vm::ptr stamp) { libmixer->Log("cellSurMixerGetTimestamp(tag=0x%llx, stamp_addr=0x%x)", tag, stamp.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp index 9930bcb665..e9d7b4fd0a 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNp.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.cpp @@ -16,11 +16,15 @@ struct sceNpInternal bool m_bSceNpInitialized; bool m_bSceNp2Initialized; bool m_bScoreInitialized; + bool m_bLookupInitialized; + bool m_bSceNpUtilBandwidthTestInitialized; sceNpInternal() : m_bSceNpInitialized(false), m_bSceNp2Initialized(false), - m_bScoreInitialized(false) + m_bScoreInitialized(false), + m_bLookupInitialized(false), + m_bSceNpUtilBandwidthTestInitialized(false) { } }; @@ -106,8 +110,9 @@ int npDrmIsAvailable(u32 k_licensee_addr, vm::ptr drm_path) // TODO: These shouldn't use current dir std::string enc_drm_path = drm_path.get_ptr(); - std::string dec_drm_path = "/dev_hdd1/" + titleID + "/" + drm_file_name; - std::string rap_path = "/dev_usb000/"; + std::string dec_drm_path = "/dev_hdd1/cache/" + drm_file_name; + std::string pf_str("00000001"); // TODO: Allow multiple profiles. Use default for now. + std::string rap_path("../dev_hdd0/home/" + pf_str + "/exdata/"); // Search dev_usb000 for a compatible RAP file. vfsDir *raps_dir = new vfsDir(rap_path); @@ -126,19 +131,19 @@ int npDrmIsAvailable(u32 k_licensee_addr, vm::ptr drm_path) } } - // Create a new directory under dev_hdd1/titleID to hold the decrypted data. - // TODO: These shouldn't use current dir - std::string tmp_dir = "./dev_hdd1/" + titleID; - if (!rExists(tmp_dir)) - rMkdir("./dev_hdd1/" + titleID); - // Decrypt this EDAT using the supplied k_licensee and matching RAP file. std::string enc_drm_path_local, dec_drm_path_local, rap_path_local; Emu.GetVFS().GetDevice(enc_drm_path, enc_drm_path_local); Emu.GetVFS().GetDevice(dec_drm_path, dec_drm_path_local); Emu.GetVFS().GetDevice(rap_path, rap_path_local); - DecryptEDAT(enc_drm_path_local, dec_drm_path_local, 8, rap_path_local, k_licensee, false); + if (DecryptEDAT(enc_drm_path_local, dec_drm_path_local, 8, rap_path_local, k_licensee, false) >= 0) + { + // If decryption succeeds, replace the encrypted file with it. + rRemoveFile(enc_drm_path_local); + rRename(dec_drm_path_local, enc_drm_path_local); + } + return CELL_OK; } @@ -156,9 +161,17 @@ int sceNpDrmIsAvailable2(u32 k_licensee_addr, vm::ptr drm_path) return npDrmIsAvailable(k_licensee_addr, drm_path); } -int sceNpDrmVerifyUpgradeLicense(u32 content_id_addr) +int sceNpDrmVerifyUpgradeLicense(vm::ptr content_id) { - UNIMPLEMENTED_FUNC(sceNp); + sceNp->Todo("sceNpDrmVerifyUpgradeLicense(content_id_addr=0x%x)", content_id.addr()); + + return CELL_OK; +} + +int sceNpDrmVerifyUpgradeLicense2(vm::ptr content_id) +{ + sceNp->Todo("sceNpDrmVerifyUpgradeLicense2(content_id_addr=0x%x)", content_id.addr()); + return CELL_OK; } @@ -168,13 +181,727 @@ int sceNpDrmExecuteGamePurchase() return CELL_OK; } -int sceNpDrmGetTimelimit(u32 drm_path_addr, vm::ptr> time_remain_usec) +int sceNpDrmGetTimelimit(u32 drm_path_addr, vm::ptr time_remain_usec) { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpManagerGetStatus(vm::ptr> status) +int sceNpDrmProcessExitSpawn() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpDrmProcessExitSpawn2() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicRegisterHandler() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicRegisterContextSensitiveHandler() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicUnregisterHandler() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicSetPresence() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicSetPresenceDetails() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicSetPresenceDetails2() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicSendMessage() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicSendMessageGui() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicSendMessageAttachment() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicRecvMessageAttachment() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicRecvMessageAttachmentLoad() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicRecvMessageCustom() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicMarkMessageAsUsed() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicAbortGui() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicAddFriend() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetFriendListEntryCount(vm::ptr count) +{ + sceNp->Warning("sceNpBasicGetFriendListEntryCount(count=%d)", count); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + // TODO: Check if there are any friends + *count = 0; + + return CELL_OK; +} + +int sceNpBasicGetFriendListEntry() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetFriendPresenceByIndex() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetFriendPresenceByIndex2() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetFriendPresenceByNpId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetFriendPresenceByNpId2() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicAddPlayersHistory() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicAddPlayersHistoryAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetPlayersHistoryEntryCount(u32 options, vm::ptr count) +{ + sceNp->Todo("sceNpBasicGetPlayersHistoryEntryCount(options=%d, count_addr=0x%x)", options, count.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetPlayersHistoryEntry() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicAddBlockListEntry() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetBlockListEntryCount(u32 count) +{ + sceNp->Todo("sceNpBasicGetBlockListEntryCount(count=%d)", count); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetBlockListEntry() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetMessageAttachmentEntryCount(vm::ptr count) +{ + sceNp->Todo("sceNpBasicGetMessageAttachmentEntryCount(count_addr=0x%x)", count.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetMessageAttachmentEntry(u32 index, vm::ptr from) +{ + sceNp->Todo("sceNpBasicGetMessageAttachmentEntry(index=%d, from_addr=0x%x)", index, from.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetCustomInvitationEntryCount() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetCustomInvitationEntry() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpBasicGetMatchingInvitationEntryCount(vm::ptr count) +{ + sceNp->Todo("sceNpBasicGetMatchingInvitationEntryCount(count_addr=0x%x)", count.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetMatchingInvitationEntry(u32 index, vm::ptr from) +{ + sceNp->Todo("sceNpBasicGetMatchingInvitationEntry(index=%d, from_addr=0x%x)", index, from.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetClanMessageEntryCount(vm::ptr count) +{ + sceNp->Todo("sceNpBasicGetClanMessageEntryCount(count_addr=0x%x)", count.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetClanMessageEntry(u32 index, vm::ptr from) +{ + sceNp->Todo("sceNpBasicGetClanMessageEntry(index=%d, from_addr=0x%x)", index, from.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetMessageEntryCount(u32 type, vm::ptr count) +{ + sceNp->Warning("sceNpBasicGetMessageEntryCount(type=%d, count=%d)", type, count); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + // TODO: Check if there are messages + *count = 0; + + return CELL_OK; +} + +int sceNpBasicGetMessageEntry(u32 type, u32 index, vm::ptr from) +{ + sceNp->Todo("sceNpBasicGetMessageEntry(type=%d, index=%d, from_addr=0x%x)", type, index, from.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpBasicGetEvent(vm::ptr event, vm::ptr from, vm::ptr data, vm::ptr size) +{ + sceNp->Warning("sceNpBasicGetEvent(event_addr=0x%x, from_addr=0x%x, data_addr=0x%x, size_addr=0x%x)", event.addr(), from.addr(), data.addr(), size.addr()); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_BASIC_ERROR_NOT_INITIALIZED; + + // TODO: Check for other error and pass other events + *event = SCE_NP_BASIC_EVENT_OFFLINE; + + return CELL_OK; +} + +int sceNpCommerceCreateCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceDestroyCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceInitProductCategory() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceDestroyProductCategory() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetProductCategoryStart() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetProductCategoryFinish() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetProductCategoryResult() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetProductCategoryAbort() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetProductId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetProductName() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCategoryDescription() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCategoryId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCategoryImageURL() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCategoryInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCategoryName() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCurrencyCode() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCurrencyDecimals() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetCurrencyInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetNumOfChildCategory() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetNumOfChildProductSku() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetSkuDescription() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetSkuId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetSkuImageURL() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetSkuName() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetSkuPrice() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetSkuUserData() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceSetDataFlagStart() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetDataFlagStart() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceSetDataFlagFinish() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetDataFlagFinish() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetDataFlagState() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetDataFlagAbort() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetChildCategoryInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceGetChildProductSkuInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceDoCheckoutStartAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCommerceDoCheckoutFinishAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCustomMenuRegisterActions() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCustomMenuActionSetActivation() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpCustomMenuRegisterExceptionList() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpFriendlist() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpFriendlistCustom() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpFriendlistAbortGui() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupInit() +{ + sceNp->Warning("sceNpLookupInit()"); + + // TODO: Make sure the error code returned is right, + // since there are no error codes for Lookup utility. + if (sceNpInstance.m_bLookupInitialized) + return SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED; + + sceNpInstance.m_bLookupInitialized = true; + + return CELL_OK; +} + +int sceNpLookupTerm() +{ + sceNp->Warning("sceNpLookupTerm()"); + + if (!sceNpInstance.m_bLookupInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + + sceNpInstance.m_bLookupInitialized = false; + + return CELL_OK; +} + +int sceNpLookupCreateTitleCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupDestroyTitleCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupCreateTransactionCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupDestroyTransactionCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupSetTimeout() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupAbortTransaction() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupWaitAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupPollAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupNpId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupNpIdAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupUserProfile() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupUserProfileAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupUserProfileWithAvatarSize() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupUserProfileWithAvatarSizeAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupAvatarImage() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupAvatarImageAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupTitleStorage() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupTitleStorageAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + + return CELL_OK; +} + +int sceNpLookupTitleSmallStorage() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpLookupTitleSmallStorageAsync() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerRegisterCallback() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerUnregisterCallback() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetStatus(vm::ptr status) { sceNp->Log("sceNpManagerGetStatus(status_addr=0x%x)", status.addr()); @@ -187,241 +914,31 @@ int sceNpManagerGetStatus(vm::ptr> status) return CELL_OK; } -int sceNpManagerSubSignout() +int sceNpManagerGetNetworkTime() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceGetChildProductSkuInfo() +int sceNpManagerGetOnlineId() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicSendMessageGui() +int sceNpManagerGetNpId() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpMatchingGetResult() +int sceNpManagerGetOnlineName() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicGetFriendListEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreRecordGameData() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetDataFlagAbort() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetMatchingInvitationEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetRankingByNpId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetTicket() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingQuickMatchGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingGetConnectionInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupNpId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreRecordScore() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicAddPlayersHistory() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetAccountAge() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetPsHandle() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreWaitAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetSkuUserData() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicAddBlockListEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupUserProfileWithAvatarSizeAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetRankingByRangeAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClansRankingByClanIdAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreDestroyTitleCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetFriendPresenceByNpId2() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingGetCtxOpt() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingGetResultGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetProductCategoryStart() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreSetPlayerCharacterId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingSetCtxOpt() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicAddFriend() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreSetTimeout() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClansRankingByClanId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingAcceptInvitationGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetNumOfChildCategory() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreSanitizeCommentAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingDestroyCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpProfileAbortGui() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupUserProfileWithAvatarSize() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetMessageEntry() +int sceNpManagerGetAvatarUrl() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; @@ -433,7 +950,243 @@ int sceNpManagerGetMyLanguages() return CELL_OK; } -int sceNpBasicGetFriendPresenceByIndex() +int sceNpManagerGetAccountRegion() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetAccountAge() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetContentRatingFlag(vm::ptr isRestricted, vm::ptr age) +{ + sceNp->Warning("sceNpManagerGetContentRatingFlag(isRestricted=%d, age=%d)", isRestricted, age); + + if (!sceNpInstance.m_bSceNpInitialized) + return SCE_NP_ERROR_NOT_INITIALIZED; + + // TODO: read user's parental control information + *isRestricted = 0; + *age = 18; + + return CELL_OK; +} + +int sceNpManagerGetChatRestrictionFlag() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetCachedInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetPsHandle() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerRequestTicket() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerRequestTicket2() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetTicket() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetTicketParam() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetEntitlementIdList() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerGetEntitlementById() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerSubSignin() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerSubSigninAbortGui() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpManagerSubSignout() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingCreateCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingDestroyCtx() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGetResult() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGetResultGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingSetRoomInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingSetRoomInfoNoLimit() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGetRoomInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGetRoomInfoNoLimit() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingSetRoomSearchFlag() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGetRoomSearchFlag() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGetRoomMemberListLocal() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGetRoomListLimitGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingKickRoomMember() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingKickRoomMemberWithOpt() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingQuickMatchGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingSendInvitationGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingAcceptInvitationGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingCreateRoomGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingJoinRoomGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingLeaveRoom() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingSearchJoinRoomGUI() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpMatchingGrantOwnership() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpProfileCallGui() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpProfileAbortGui() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; @@ -451,445 +1204,6 @@ int sceNpScoreInit() return CELL_OK; } -int sceNpMatchingSearchJoinRoomGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingKickRoomMember() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingGetConnectionFromPeerAddress() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetCategoryDescription() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetAvatarUrl() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetSkuId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetGameData() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingCreateRoomGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupAbortTransaction() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetRankingByNpIdAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicSetPresence() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetProductCategoryResult() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicRegisterContextSensitiveHandler() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClansMembersRankingByNpIdPcId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClansMembersRankingByNpIdPcIdAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicSendMessageAttachment() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerSubSignin() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCustomMenuRegisterActions() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingJoinRoomGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicAbortGui() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingSetRoomInfoNoLimit() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetCachedInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClansMembersRankingByRangeAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetClanMessageEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingAddExtendedHandler() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerUnregisterCallback() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetTicketParam() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetMessageAttachmentEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupDestroyTitleCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupTitleStorageAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - - return CELL_OK; -} - -int sceNpBasicSetPresenceDetails2() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupInit() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerSubSigninAbortGui() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingActivateConnection() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingCreateCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetFriendPresenceByIndex2() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicRecvMessageAttachmentLoad() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingCancelPeerNetInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetProductCategoryAbort() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingGetRoomInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceDestroyProductCategory() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClansMembersRankingByRange() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetCategoryName() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetContentRatingFlag() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreCreateTransactionCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingSetRoomInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupSetTimeout() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetNumOfChildProductSku() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetBlockListEntryCount() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingGetRoomMemberListLocal() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClanMemberGameData() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupPollAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingGetPeerNetInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetSkuPrice() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetCurrencyCode() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClansRankingByRangeAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreCensorCommentAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreCensorComment() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerRequestTicket() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicRecvMessageCustom() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int _sceNpSysutilClientFree() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerRequestTicket2() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupTerm() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupTitleSmallStorageAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingSendInvitationGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceInitProductCategory() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceSetDataFlagFinish() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetMessageAttachmentEntryCount() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetDataFlagFinish() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetProductId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetCategoryImageURL() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCustomMenuRegisterExceptionList() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingTerminateConnection() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - int sceNpScoreTerm() { sceNp->Warning("sceNpScoreTerm()"); @@ -902,37 +1216,43 @@ int sceNpScoreTerm() return CELL_OK; } -int sceNpCommerceSetDataFlagStart() +int sceNpScoreCreateTitleCtx() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpSignalingGetLocalNetInfo() +int sceNpScoreDestroyTitleCtx() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpLookupTitleStorage() +int sceNpScoreCreateTransactionCtx() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicGetPlayersHistoryEntryCount() +int sceNpScoreDestroyTransactionCtx() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpManagerGetEntitlementById() +int sceNpScoreSetTimeout() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpMatchingSetRoomSearchFlag() +int sceNpScoreSetPlayerCharacterId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpScoreWaitAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; @@ -944,175 +1264,97 @@ int sceNpScorePollAsync() return CELL_OK; } -int sceNpCommerceGetSkuDescription() +int sceNpScoreGetBoardInfo() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicGetCustomInvitationEntryCount() +int sceNpScoreGetBoardInfoAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpDrmProcessExitSpawn() +int sceNpScoreRecordScore() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpMatchingCreateCtx() +int sceNpScoreRecordScoreAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicUnregisterHandler() +int sceNpScoreRecordGameData() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceGetCategoryId() +int sceNpScoreRecordGameDataAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceDoCheckoutFinishAsync() +int sceNpScoreGetGameData() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicGetMatchingInvitationEntryCount() +int sceNpScoreGetGameDataAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceGetCurrencyDecimals() +int sceNpScoreGetRankingByNpId() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicGetFriendListEntryCount() +int sceNpScoreGetRankingByNpIdAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpMatchingGetRoomInfoNoLimit() +int sceNpScoreGetRankingByRange() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpScoreGetClansRankingByRange() +int sceNpScoreGetRankingByRangeAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceGetCurrencyInfo() +int sceNpScoreCensorComment() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpManagerGetAccountRegion() +int sceNpScoreCensorCommentAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicRecvMessageAttachment() +int sceNpScoreSanitizeComment() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpLookupAvatarImage() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetEntitlementIdList() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreCreateTitleCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetChildCategoryInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetPlayersHistoryEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicRegisterHandler() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicAddPlayersHistoryAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetNetworkTime() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetOnlineId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpDrmVerifyUpgradeLicense2() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicSetPresenceDetails() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetClanMemberGameDataAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetClanMessageEntryCount() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupAvatarImageAsync() +int sceNpScoreSanitizeCommentAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; @@ -1130,114 +1372,7 @@ int sceNpScoreGetRankingByNpIdPcIdAsync() return CELL_OK; } -int sceNpScoreDestroyTransactionCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingGetConnectionStatus() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupTitleSmallStorage() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetSkuImageURL() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupCreateTitleCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpProfileCallGui() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetProductCategoryFinish() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceGetDataFlagState() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetCustomInvitationEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingGetPeerNetInfoResult() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupNpIdAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpUtilCmpNpId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingKickRoomMemberWithOpt() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupWaitAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpFriendlistCustom() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingGrantOwnership() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetGameDataAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} -int sceNpCommerceGetDataFlagStart() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetBoardInfoAsync() +int sceNpScoreAbortTransaction() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; @@ -1249,252 +1384,73 @@ int sceNpScoreGetClansMembersRankingByNpId() return CELL_OK; } -int sceNpLookupUserProfile() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetEvent() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicMarkMessageAsUsed() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingGetRoomListLimitGUI() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceDestroyCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceDoCheckoutStartAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpDrmProcessExitSpawn2() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerRegisterCallback() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingGetConnectionFromNpId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - int sceNpScoreGetClansMembersRankingByNpIdAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpLookupCreateTransactionCtx() +int sceNpScoreGetClansMembersRankingByNpIdPcId() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceGetProductName() +int sceNpScoreGetClansMembersRankingByNpIdPcIdAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpManagerGetChatRestrictionFlag() +int sceNpScoreGetClansRankingByRange() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceGetCategoryInfo() +int sceNpScoreGetClansRankingByRangeAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicSendMessage() +int sceNpScoreGetClanMemberGameData() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpBasicGetMessageEntryCount() +int sceNpScoreGetClanMemberGameDataAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int _sceNpSysutilClientMalloc() +int sceNpScoreGetClansRankingByClanId() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpCommerceGetSkuName() +int sceNpScoreGetClansRankingByClanIdAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpScoreAbortTransaction() +int sceNpScoreGetClansMembersRankingByRange() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpMatchingGetRoomSearchFlag() +int sceNpScoreGetClansMembersRankingByRangeAsync() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; } -int sceNpFriendlist() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreRecordScoreAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreSanitizeComment() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} -int sceNpBasicGetBlockListEntry() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetOnlineName() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetBoardInfo() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpFriendlistAbortGui() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpUtilCmpNpIdInOrder() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreRecordGameDataAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpMatchingLeaveRoom() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCustomMenuActionSetActivation() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupDestroyTransactionCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpScoreGetRankingByRange() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpCommerceCreateCtx() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpSignalingDeactivateConnection() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpBasicGetFriendPresenceByNpId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpManagerGetNpId() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpLookupUserProfileAsync() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpUtilBandwidthTestShutdown() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpUtilBandwidthTestInitStart() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpUtilBandwidthTestGetStatus() -{ - UNIMPLEMENTED_FUNC(sceNp); - return CELL_OK; -} - -int sceNpUtilBandwidthTestAbort() +int sceNpSignalingCreateCtx() { UNIMPLEMENTED_FUNC(sceNp); return CELL_OK; @@ -1506,236 +1462,397 @@ int sceNpSignalingDestroyCtx() return CELL_OK; } +int sceNpSignalingAddExtendedHandler() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingSetCtxOpt() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetCtxOpt() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingActivateConnection() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingDeactivateConnection() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingTerminateConnection() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetConnectionStatus() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetConnectionInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetConnectionFromNpId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetConnectionFromPeerAddress() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetLocalNetInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetPeerNetInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingCancelPeerNetInfo() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpSignalingGetPeerNetInfoResult() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpUtilCmpNpId() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpUtilCmpNpIdInOrder() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int sceNpUtilBandwidthTestInitStart(u32 prio, size_t stack) +{ + UNIMPLEMENTED_FUNC(sceNp); + + if (sceNpInstance.m_bSceNpUtilBandwidthTestInitialized) + return SCE_NP_ERROR_ALREADY_INITIALIZED; + + sceNpInstance.m_bSceNpUtilBandwidthTestInitialized = true; + + return CELL_OK; +} + +int sceNpUtilBandwidthTestGetStatus() +{ + UNIMPLEMENTED_FUNC(sceNp); + + if (!sceNpInstance.m_bSceNpUtilBandwidthTestInitialized) + return SCE_NP_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int sceNpUtilBandwidthTestShutdown() +{ + UNIMPLEMENTED_FUNC(sceNp); + + if (!sceNpInstance.m_bSceNpUtilBandwidthTestInitialized) + return SCE_NP_ERROR_NOT_INITIALIZED; + + sceNpInstance.m_bSceNpUtilBandwidthTestInitialized = false; + + return CELL_OK; +} + +int sceNpUtilBandwidthTestAbort() +{ + UNIMPLEMENTED_FUNC(sceNp); + + if (!sceNpInstance.m_bSceNpUtilBandwidthTestInitialized) + return SCE_NP_ERROR_NOT_INITIALIZED; + + return CELL_OK; +} + +int _sceNpSysutilClientMalloc() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +int _sceNpSysutilClientFree() +{ + UNIMPLEMENTED_FUNC(sceNp); + return CELL_OK; +} + +void sceNp_unload() +{ + sceNpInstance.m_bSceNpInitialized = false; + sceNpInstance.m_bSceNp2Initialized = false; + sceNpInstance.m_bScoreInitialized = false; + sceNpInstance.m_bLookupInitialized = false; + sceNpInstance.m_bSceNpUtilBandwidthTestInitialized = false; +} + void sceNp_init(Module *pxThis) { sceNp = pxThis; sceNp->AddFunc(0xbd28fdbf, sceNpInit); sceNp->AddFunc(0x41251f74, sceNp2Init); + sceNp->AddFunc(0xc2ced2b7, sceNpUtilBandwidthTestInitStart); sceNp->AddFunc(0x4885aa18, sceNpTerm); sceNp->AddFunc(0xaadb7c12, sceNp2Term); + sceNp->AddFunc(0x432b3cbf, sceNpUtilBandwidthTestShutdown); sceNp->AddFunc(0xad218faf, sceNpDrmIsAvailable); sceNp->AddFunc(0xf042b14f, sceNpDrmIsAvailable2); sceNp->AddFunc(0x2ecd48ed, sceNpDrmVerifyUpgradeLicense); sceNp->AddFunc(0xbe0e3ee2, sceNpDrmVerifyUpgradeLicense2); sceNp->AddFunc(0xf283c143, sceNpDrmExecuteGamePurchase); sceNp->AddFunc(0xcf51864b, sceNpDrmGetTimelimit); - sceNp->AddFunc(0xa7bff757, sceNpManagerGetStatus); - sceNp->AddFunc(0x000e53cc, sceNpManagerSubSignout); - sceNp->AddFunc(0x01cd9cfd, sceNpCommerceGetChildProductSkuInfo); - sceNp->AddFunc(0x01fbbc9b, sceNpBasicSendMessageGui); - sceNp->AddFunc(0x03c741a7, sceNpMatchingGetResult); - sceNp->AddFunc(0x04372385, sceNpBasicGetFriendListEntry); - sceNp->AddFunc(0x04ca5e6a, sceNpScoreRecordGameData); - sceNp->AddFunc(0x0561448b, sceNpCommerceGetDataFlagAbort); - sceNp->AddFunc(0x05af1cb8, sceNpBasicGetMatchingInvitationEntry); - sceNp->AddFunc(0x05d65dff, sceNpScoreGetRankingByNpId); - sceNp->AddFunc(0x0968aa36, sceNpManagerGetTicket); - sceNp->AddFunc(0x14497465, sceNpMatchingQuickMatchGUI); - sceNp->AddFunc(0x155de760, sceNpSignalingGetConnectionInfo); - sceNp->AddFunc(0x166dcc11, sceNpLookupNpId); - sceNp->AddFunc(0x1672170e, sceNpScoreRecordScore); - sceNp->AddFunc(0x168a3117, sceNpBasicAddPlayersHistory); - sceNp->AddFunc(0x168fcece, sceNpManagerGetAccountAge); - sceNp->AddFunc(0x16f88a6f, sceNpManagerGetPsHandle); - sceNp->AddFunc(0x1a2704f7, sceNpScoreWaitAsync); - sceNp->AddFunc(0x1a3fcb69, sceNpCommerceGetSkuUserData); - sceNp->AddFunc(0x1ae8a549, sceNpBasicAddBlockListEntry); - sceNp->AddFunc(0x1fdb3ec2, sceNpLookupUserProfileWithAvatarSizeAsync); - sceNp->AddFunc(0x21206642, sceNpScoreGetRankingByRangeAsync); - sceNp->AddFunc(0x227f8763, sceNpScoreGetClansRankingByClanIdAsync); - sceNp->AddFunc(0x259113b8, sceNpScoreDestroyTitleCtx); - sceNp->AddFunc(0x260caedd, sceNpBasicGetFriendPresenceByNpId2); - sceNp->AddFunc(0x2687a127, sceNpSignalingGetCtxOpt); - sceNp->AddFunc(0x26b3bc94, sceNpMatchingGetResultGUI); - sceNp->AddFunc(0x26f33146, sceNpCommerceGetProductCategoryStart); - sceNp->AddFunc(0x2706eaa1, sceNpScoreSetPlayerCharacterId); - sceNp->AddFunc(0x276c72b2, sceNpSignalingSetCtxOpt); - sceNp->AddFunc(0x27c69eba, sceNpBasicAddFriend); - sceNp->AddFunc(0x29dd45dc, sceNpScoreSetTimeout); - sceNp->AddFunc(0x2a76895a, sceNpScoreGetClansRankingByClanId); - sceNp->AddFunc(0x2ad7837d, sceNpMatchingAcceptInvitationGUI); - sceNp->AddFunc(0x2be41ece, sceNpCommerceGetNumOfChildCategory); - sceNp->AddFunc(0x2cd2a1af, sceNpScoreSanitizeCommentAsync); - sceNp->AddFunc(0x2e1c5068, sceNpMatchingDestroyCtx); - sceNp->AddFunc(0x2f2c6b3e, sceNpProfileAbortGui); - sceNp->AddFunc(0x2fccbfe0, sceNpLookupUserProfileWithAvatarSize); - sceNp->AddFunc(0x30d1cbde, sceNpBasicGetMessageEntry); - sceNp->AddFunc(0x32200389, sceNpManagerGetMyLanguages); - sceNp->AddFunc(0x32c78a6a, sceNpBasicGetFriendPresenceByIndex); - sceNp->AddFunc(0x32cf311f, sceNpScoreInit); - sceNp->AddFunc(0x32febb4c, sceNpMatchingSearchJoinRoomGUI); - sceNp->AddFunc(0x34cc0ca4, sceNpMatchingKickRoomMember); - sceNp->AddFunc(0x34ce82a0, sceNpSignalingGetConnectionFromPeerAddress); - sceNp->AddFunc(0x359642a6, sceNpCommerceGetCategoryDescription); - sceNp->AddFunc(0x36d0c2c5, sceNpManagerGetAvatarUrl); - sceNp->AddFunc(0x39a69619, sceNpCommerceGetSkuId); - sceNp->AddFunc(0x3b02418d, sceNpScoreGetGameData); - sceNp->AddFunc(0x3cc8588a, sceNpMatchingCreateRoomGUI); - sceNp->AddFunc(0x3d1760dc, sceNpLookupAbortTransaction); - sceNp->AddFunc(0x3db7914d, sceNpScoreGetRankingByNpIdAsync); - sceNp->AddFunc(0x3f0808aa, sceNpBasicSetPresence); - sceNp->AddFunc(0x3f195b3a, sceNpCommerceGetProductCategoryResult); - sceNp->AddFunc(0x4026eac5, sceNpBasicRegisterContextSensitiveHandler); - sceNp->AddFunc(0x41ffd4f2, sceNpScoreGetClansMembersRankingByNpIdPcId); - sceNp->AddFunc(0x433fcb30, sceNpScoreGetClansMembersRankingByNpIdPcIdAsync); - sceNp->AddFunc(0x43b989f5, sceNpBasicSendMessageAttachment); - sceNp->AddFunc(0x442381f7, sceNpManagerSubSignin); - sceNp->AddFunc(0x45f8f3aa, sceNpCustomMenuRegisterActions); - sceNp->AddFunc(0x474b7b13, sceNpMatchingJoinRoomGUI); - sceNp->AddFunc(0x481ce0e8, sceNpBasicAbortGui); - sceNp->AddFunc(0x4a18a89e, sceNpMatchingSetRoomInfoNoLimit); - sceNp->AddFunc(0x4b9efb7a, sceNpManagerGetCachedInfo); - sceNp->AddFunc(0x4d5e0670, sceNpScoreGetClansMembersRankingByRangeAsync); - sceNp->AddFunc(0x4d9c615d, sceNpBasicGetClanMessageEntry); - sceNp->AddFunc(0x50b86d94, sceNpSignalingAddExtendedHandler); - sceNp->AddFunc(0x52a6b523, sceNpManagerUnregisterCallback); - sceNp->AddFunc(0x58fa4fcd, sceNpManagerGetTicketParam); - sceNp->AddFunc(0x5d543bbe, sceNpBasicGetMessageAttachmentEntry); - sceNp->AddFunc(0x5de61626, sceNpLookupDestroyTitleCtx); - sceNp->AddFunc(0x5e117ed5, sceNpLookupTitleStorageAsync); - sceNp->AddFunc(0x5e849303, sceNpBasicSetPresenceDetails2); - sceNp->AddFunc(0x5f2d9257, sceNpLookupInit); - sceNp->AddFunc(0x60440c73, sceNpManagerSubSigninAbortGui); - sceNp->AddFunc(0x60897c38, sceNpSignalingActivateConnection); - sceNp->AddFunc(0x6356082e, sceNpSignalingCreateCtx); - sceNp->AddFunc(0x6453b27b, sceNpBasicGetFriendPresenceByIndex2); - sceNp->AddFunc(0x64a704cc, sceNpBasicRecvMessageAttachmentLoad); - sceNp->AddFunc(0x64dbb89d, sceNpSignalingCancelPeerNetInfo); - sceNp->AddFunc(0x674bb9ff, sceNpCommerceGetProductCategoryAbort); - sceNp->AddFunc(0x691f429d, sceNpMatchingGetRoomInfo); - sceNp->AddFunc(0x6cb81eb2, sceNpCommerceDestroyProductCategory); - sceNp->AddFunc(0x6d4adc3b, sceNpScoreGetClansMembersRankingByRange); - sceNp->AddFunc(0x6e2ab18b, sceNpCommerceGetCategoryName); - sceNp->AddFunc(0x6ee62ed2, sceNpManagerGetContentRatingFlag); - sceNp->AddFunc(0x6f5e8143, sceNpScoreCreateTransactionCtx); - sceNp->AddFunc(0x6f8fd267, sceNpMatchingSetRoomInfo); - sceNp->AddFunc(0x71e5af7e, sceNpLookupSetTimeout); - sceNp->AddFunc(0x7208dc08, sceNpCommerceGetNumOfChildProductSku); - sceNp->AddFunc(0x73931bd0, sceNpBasicGetBlockListEntryCount); - sceNp->AddFunc(0x73a2e36b, sceNpMatchingGetRoomMemberListLocal); - sceNp->AddFunc(0x741fbf24, sceNpScoreGetClanMemberGameData); - sceNp->AddFunc(0x7508112e, sceNpLookupPollAsync); - sceNp->AddFunc(0x75eb50cb, sceNpSignalingGetPeerNetInfo); - sceNp->AddFunc(0x78d7f9ad, sceNpCommerceGetSkuPrice); - sceNp->AddFunc(0x79225aa3, sceNpCommerceGetCurrencyCode); - sceNp->AddFunc(0x7b7e9137, sceNpScoreGetClansRankingByRangeAsync); - sceNp->AddFunc(0x7be47e61, sceNpScoreCensorCommentAsync); - sceNp->AddFunc(0x7deb244c, sceNpScoreCensorComment); - sceNp->AddFunc(0x7e2fef28, sceNpManagerRequestTicket); - sceNp->AddFunc(0x806960ab, sceNpBasicRecvMessageCustom); - sceNp->AddFunc(0x816c6a5f, _sceNpSysutilClientFree); - sceNp->AddFunc(0x8297f1ec, sceNpManagerRequestTicket2); - sceNp->AddFunc(0x8440537c, sceNpLookupTerm); - sceNp->AddFunc(0x860b1756, sceNpLookupTitleSmallStorageAsync); - sceNp->AddFunc(0x8b7bbd73, sceNpMatchingSendInvitationGUI); - sceNp->AddFunc(0x8d1d096c, sceNpCommerceInitProductCategory); - sceNp->AddFunc(0x8d4518a0, sceNpCommerceSetDataFlagFinish); - sceNp->AddFunc(0x9153bdf4, sceNpBasicGetMessageAttachmentEntryCount); - sceNp->AddFunc(0x9281e87a, sceNpCommerceGetDataFlagFinish); - sceNp->AddFunc(0x936df4aa, sceNpCommerceGetProductId); - sceNp->AddFunc(0x9452f4f8, sceNpCommerceGetCategoryImageURL); - sceNp->AddFunc(0x9458f464, sceNpCustomMenuRegisterExceptionList); - sceNp->AddFunc(0x95c7bba3, sceNpSignalingTerminateConnection); - sceNp->AddFunc(0x9851f805, sceNpScoreTerm); - sceNp->AddFunc(0x99ac9952, sceNpCommerceSetDataFlagStart); - sceNp->AddFunc(0x9ad7fbd1, sceNpSignalingGetLocalNetInfo); - sceNp->AddFunc(0x9ee9f97e, sceNpLookupTitleStorage); - sceNp->AddFunc(0xa15f35fe, sceNpBasicGetPlayersHistoryEntryCount); - sceNp->AddFunc(0xa1709abd, sceNpManagerGetEntitlementById); - sceNp->AddFunc(0xa284bd1d, sceNpMatchingSetRoomSearchFlag); - sceNp->AddFunc(0xa7a090e5, sceNpScorePollAsync); - sceNp->AddFunc(0xa85a4951, sceNpCommerceGetSkuDescription); - sceNp->AddFunc(0xa8afa7d4, sceNpBasicGetCustomInvitationEntryCount); sceNp->AddFunc(0xaa16695f, sceNpDrmProcessExitSpawn); - sceNp->AddFunc(0xac66568c, sceNpMatchingCreateCtx); - sceNp->AddFunc(0xacb9ee8e, sceNpBasicUnregisterHandler); - sceNp->AddFunc(0xaee8cf71, sceNpCommerceGetCategoryId); - sceNp->AddFunc(0xaf3eba5a, sceNpCommerceDoCheckoutFinishAsync); - sceNp->AddFunc(0xaf505def, sceNpBasicGetMatchingInvitationEntryCount); - sceNp->AddFunc(0xaf57d9c9, sceNpCommerceGetCurrencyDecimals); - sceNp->AddFunc(0xafef640d, sceNpBasicGetFriendListEntryCount); - sceNp->AddFunc(0xb020684e, sceNpMatchingGetRoomInfoNoLimit); - sceNp->AddFunc(0xb082003b, sceNpScoreGetClansRankingByRange); - sceNp->AddFunc(0xb1c02d66, sceNpCommerceGetCurrencyInfo); - sceNp->AddFunc(0xb1e0718b, sceNpManagerGetAccountRegion); - sceNp->AddFunc(0xb5cb2d56, sceNpBasicRecvMessageAttachment); - sceNp->AddFunc(0xb6017827, sceNpLookupAvatarImage); - sceNp->AddFunc(0xb66d1c46, sceNpManagerGetEntitlementIdList); - sceNp->AddFunc(0xb9f93bbb, sceNpScoreCreateTitleCtx); - sceNp->AddFunc(0xba65de6d, sceNpCommerceGetChildCategoryInfo); - sceNp->AddFunc(0xbab91fc9, sceNpBasicGetPlayersHistoryEntry); + sceNp->AddFunc(0xe6c8f3f9, sceNpDrmProcessExitSpawn2); sceNp->AddFunc(0xbcc09fe7, sceNpBasicRegisterHandler); + sceNp->AddFunc(0x4026eac5, sceNpBasicRegisterContextSensitiveHandler); + sceNp->AddFunc(0xacb9ee8e, sceNpBasicUnregisterHandler); + sceNp->AddFunc(0x3f0808aa, sceNpBasicSetPresence); + sceNp->AddFunc(0xbe81c71c, sceNpBasicSetPresenceDetails); + sceNp->AddFunc(0x5e849303, sceNpBasicSetPresenceDetails2); + sceNp->AddFunc(0xec0a1fbf, sceNpBasicSendMessage); + sceNp->AddFunc(0x01fbbc9b, sceNpBasicSendMessageGui); + sceNp->AddFunc(0x43b989f5, sceNpBasicSendMessageAttachment); + sceNp->AddFunc(0xb5cb2d56, sceNpBasicRecvMessageAttachment); + sceNp->AddFunc(0x64a704cc, sceNpBasicRecvMessageAttachmentLoad); + sceNp->AddFunc(0x806960ab, sceNpBasicRecvMessageCustom); + sceNp->AddFunc(0xe1c9f675, sceNpBasicMarkMessageAsUsed); + sceNp->AddFunc(0x481ce0e8, sceNpBasicAbortGui); + sceNp->AddFunc(0x27c69eba, sceNpBasicAddFriend); + sceNp->AddFunc(0xafef640d, sceNpBasicGetFriendListEntryCount); + sceNp->AddFunc(0x04372385, sceNpBasicGetFriendListEntry); + sceNp->AddFunc(0x32c78a6a, sceNpBasicGetFriendPresenceByIndex); + sceNp->AddFunc(0x6453b27b, sceNpBasicGetFriendPresenceByIndex2); + sceNp->AddFunc(0xfd39ae13, sceNpBasicGetFriendPresenceByNpId); + sceNp->AddFunc(0x260caedd, sceNpBasicGetFriendPresenceByNpId2); + sceNp->AddFunc(0x168a3117, sceNpBasicAddPlayersHistory); sceNp->AddFunc(0xbcdbb2ab, sceNpBasicAddPlayersHistoryAsync); + sceNp->AddFunc(0xa15f35fe, sceNpBasicGetPlayersHistoryEntryCount); + sceNp->AddFunc(0xbab91fc9, sceNpBasicGetPlayersHistoryEntry); + sceNp->AddFunc(0x1ae8a549, sceNpBasicAddBlockListEntry); + sceNp->AddFunc(0x73931bd0, sceNpBasicGetBlockListEntryCount); + sceNp->AddFunc(0xf2b3338a, sceNpBasicGetBlockListEntry); + sceNp->AddFunc(0x9153bdf4, sceNpBasicGetMessageAttachmentEntryCount); + sceNp->AddFunc(0x5d543bbe, sceNpBasicGetMessageAttachmentEntry); + sceNp->AddFunc(0xa8afa7d4, sceNpBasicGetCustomInvitationEntryCount); + sceNp->AddFunc(0xd053f113, sceNpBasicGetCustomInvitationEntry); + sceNp->AddFunc(0xaf505def, sceNpBasicGetMatchingInvitationEntryCount); + sceNp->AddFunc(0x05af1cb8, sceNpBasicGetMatchingInvitationEntry); + sceNp->AddFunc(0xbf607ec6, sceNpBasicGetClanMessageEntryCount); + sceNp->AddFunc(0x4d9c615d, sceNpBasicGetClanMessageEntry); + sceNp->AddFunc(0xecd503de, sceNpBasicGetMessageEntryCount); + sceNp->AddFunc(0x30d1cbde, sceNpBasicGetMessageEntry); + sceNp->AddFunc(0xe035f7d6, sceNpBasicGetEvent); + sceNp->AddFunc(0xfcac355a, sceNpCommerceCreateCtx); + sceNp->AddFunc(0xe2877bea, sceNpCommerceDestroyCtx); + sceNp->AddFunc(0x8d1d096c, sceNpCommerceInitProductCategory); + sceNp->AddFunc(0x6cb81eb2, sceNpCommerceDestroyProductCategory); + sceNp->AddFunc(0x26f33146, sceNpCommerceGetProductCategoryStart); + sceNp->AddFunc(0xcfd469e4, sceNpCommerceGetProductCategoryFinish); + sceNp->AddFunc(0x3f195b3a, sceNpCommerceGetProductCategoryResult); + sceNp->AddFunc(0x674bb9ff, sceNpCommerceGetProductCategoryAbort); + sceNp->AddFunc(0x936df4aa, sceNpCommerceGetProductId); + sceNp->AddFunc(0xeb5f2544, sceNpCommerceGetProductName); + sceNp->AddFunc(0x359642a6, sceNpCommerceGetCategoryDescription); + sceNp->AddFunc(0xaee8cf71, sceNpCommerceGetCategoryId); + sceNp->AddFunc(0x9452f4f8, sceNpCommerceGetCategoryImageURL); + sceNp->AddFunc(0xeb9df054, sceNpCommerceGetCategoryInfo); + sceNp->AddFunc(0x6e2ab18b, sceNpCommerceGetCategoryName); + sceNp->AddFunc(0x79225aa3, sceNpCommerceGetCurrencyCode); + sceNp->AddFunc(0xaf57d9c9, sceNpCommerceGetCurrencyDecimals); + sceNp->AddFunc(0xb1c02d66, sceNpCommerceGetCurrencyInfo); + sceNp->AddFunc(0x2be41ece, sceNpCommerceGetNumOfChildCategory); + sceNp->AddFunc(0x7208dc08, sceNpCommerceGetNumOfChildProductSku); + sceNp->AddFunc(0xa85a4951, sceNpCommerceGetSkuDescription); + sceNp->AddFunc(0x39a69619, sceNpCommerceGetSkuId); + sceNp->AddFunc(0xccbe2e69, sceNpCommerceGetSkuImageURL); + sceNp->AddFunc(0xee530059, sceNpCommerceGetSkuName); + sceNp->AddFunc(0x78d7f9ad, sceNpCommerceGetSkuPrice); + sceNp->AddFunc(0x1a3fcb69, sceNpCommerceGetSkuUserData); + sceNp->AddFunc(0x99ac9952, sceNpCommerceSetDataFlagStart); + sceNp->AddFunc(0xdbdb909f, sceNpCommerceGetDataFlagStart); + sceNp->AddFunc(0x8d4518a0, sceNpCommerceSetDataFlagFinish); + sceNp->AddFunc(0x9281e87a, sceNpCommerceGetDataFlagFinish); + sceNp->AddFunc(0xd03cea35, sceNpCommerceGetDataFlagState); + sceNp->AddFunc(0x0561448b, sceNpCommerceGetDataFlagAbort); + sceNp->AddFunc(0xba65de6d, sceNpCommerceGetChildCategoryInfo); + sceNp->AddFunc(0x01cd9cfd, sceNpCommerceGetChildProductSkuInfo); + sceNp->AddFunc(0xe36c660e, sceNpCommerceDoCheckoutStartAsync); + sceNp->AddFunc(0xaf3eba5a, sceNpCommerceDoCheckoutFinishAsync); + sceNp->AddFunc(0x45f8f3aa, sceNpCustomMenuRegisterActions); + sceNp->AddFunc(0xf9732ac8, sceNpCustomMenuActionSetActivation); + sceNp->AddFunc(0x9458f464, sceNpCustomMenuRegisterExceptionList); + sceNp->AddFunc(0xf0a9182b, sceNpFriendlist); + sceNp->AddFunc(0xd7fb1fa6, sceNpFriendlistCustom); + sceNp->AddFunc(0xf59e1da8, sceNpFriendlistAbortGui); + sceNp->AddFunc(0x5f2d9257, sceNpLookupInit); + sceNp->AddFunc(0x8440537c, sceNpLookupTerm); + sceNp->AddFunc(0xce81c7f0, sceNpLookupCreateTitleCtx); + sceNp->AddFunc(0x5de61626, sceNpLookupDestroyTitleCtx); + sceNp->AddFunc(0xea2e9ffc, sceNpLookupCreateTransactionCtx); + sceNp->AddFunc(0xfb87cf5e, sceNpLookupDestroyTransactionCtx); + sceNp->AddFunc(0x71e5af7e, sceNpLookupSetTimeout); + sceNp->AddFunc(0x3d1760dc, sceNpLookupAbortTransaction); + sceNp->AddFunc(0xd737fd2d, sceNpLookupWaitAsync); + sceNp->AddFunc(0x7508112e, sceNpLookupPollAsync); + sceNp->AddFunc(0x166dcc11, sceNpLookupNpId); + sceNp->AddFunc(0xd12e40ae, sceNpLookupNpIdAsync); + sceNp->AddFunc(0xdfd63b62, sceNpLookupUserProfile); + sceNp->AddFunc(0xff0a2378, sceNpLookupUserProfileAsync); + sceNp->AddFunc(0x2fccbfe0, sceNpLookupUserProfileWithAvatarSize); + sceNp->AddFunc(0x1fdb3ec2, sceNpLookupUserProfileWithAvatarSizeAsync); + sceNp->AddFunc(0xb6017827, sceNpLookupAvatarImage); + sceNp->AddFunc(0xbf9eea93, sceNpLookupAvatarImageAsync); + sceNp->AddFunc(0x9ee9f97e, sceNpLookupTitleStorage); + sceNp->AddFunc(0x5e117ed5, sceNpLookupTitleStorageAsync); + sceNp->AddFunc(0xca39c4b2, sceNpLookupTitleSmallStorage); + sceNp->AddFunc(0x860b1756, sceNpLookupTitleSmallStorageAsync); + sceNp->AddFunc(0xe7dcd3b4, sceNpManagerRegisterCallback); + sceNp->AddFunc(0x52a6b523, sceNpManagerUnregisterCallback); + sceNp->AddFunc(0xa7bff757, sceNpManagerGetStatus); sceNp->AddFunc(0xbdc07fd5, sceNpManagerGetNetworkTime); sceNp->AddFunc(0xbe07c708, sceNpManagerGetOnlineId); - sceNp->AddFunc(0xbe81c71c, sceNpBasicSetPresenceDetails); - sceNp->AddFunc(0xbef887e5, sceNpScoreGetClanMemberGameDataAsync); - sceNp->AddFunc(0xbf607ec6, sceNpBasicGetClanMessageEntryCount); - sceNp->AddFunc(0xbf9eea93, sceNpLookupAvatarImageAsync); + sceNp->AddFunc(0xfe37a7f4, sceNpManagerGetNpId); + sceNp->AddFunc(0xf42c0df8, sceNpManagerGetOnlineName); + sceNp->AddFunc(0x36d0c2c5, sceNpManagerGetAvatarUrl); + sceNp->AddFunc(0x32200389, sceNpManagerGetMyLanguages); + sceNp->AddFunc(0xb1e0718b, sceNpManagerGetAccountRegion); + sceNp->AddFunc(0x168fcece, sceNpManagerGetAccountAge); + sceNp->AddFunc(0x6ee62ed2, sceNpManagerGetContentRatingFlag); + sceNp->AddFunc(0xeb7a3d84, sceNpManagerGetChatRestrictionFlag); + sceNp->AddFunc(0x4b9efb7a, sceNpManagerGetCachedInfo); + sceNp->AddFunc(0x16f88a6f, sceNpManagerGetPsHandle); + sceNp->AddFunc(0x7e2fef28, sceNpManagerRequestTicket); + sceNp->AddFunc(0x8297f1ec, sceNpManagerRequestTicket2); + sceNp->AddFunc(0x0968aa36, sceNpManagerGetTicket); + sceNp->AddFunc(0x58fa4fcd, sceNpManagerGetTicketParam); + sceNp->AddFunc(0xb66d1c46, sceNpManagerGetEntitlementIdList); + sceNp->AddFunc(0xa1709abd, sceNpManagerGetEntitlementById); + sceNp->AddFunc(0x442381f7, sceNpManagerSubSignin); + sceNp->AddFunc(0x60440c73, sceNpManagerSubSigninAbortGui); + sceNp->AddFunc(0x000e53cc, sceNpManagerSubSignout); + sceNp->AddFunc(0xac66568c, sceNpMatchingCreateCtx); + sceNp->AddFunc(0x2e1c5068, sceNpMatchingDestroyCtx); + sceNp->AddFunc(0x03c741a7, sceNpMatchingGetResult); + sceNp->AddFunc(0x26b3bc94, sceNpMatchingGetResultGUI); + sceNp->AddFunc(0x6f8fd267, sceNpMatchingSetRoomInfo); + sceNp->AddFunc(0x4a18a89e, sceNpMatchingSetRoomInfoNoLimit); + sceNp->AddFunc(0x691f429d, sceNpMatchingGetRoomInfo); + sceNp->AddFunc(0xb020684e, sceNpMatchingGetRoomInfoNoLimit); + sceNp->AddFunc(0xa284bd1d, sceNpMatchingSetRoomSearchFlag); + sceNp->AddFunc(0xee64cf8e, sceNpMatchingGetRoomSearchFlag); + sceNp->AddFunc(0x73a2e36b, sceNpMatchingGetRoomMemberListLocal); + sceNp->AddFunc(0xe24eea19, sceNpMatchingGetRoomListLimitGUI); + sceNp->AddFunc(0x34cc0ca4, sceNpMatchingKickRoomMember); + sceNp->AddFunc(0xd20d7798, sceNpMatchingKickRoomMemberWithOpt); + sceNp->AddFunc(0x14497465, sceNpMatchingQuickMatchGUI); + sceNp->AddFunc(0x8b7bbd73, sceNpMatchingSendInvitationGUI); + sceNp->AddFunc(0x2ad7837d, sceNpMatchingAcceptInvitationGUI); + sceNp->AddFunc(0x3cc8588a, sceNpMatchingCreateRoomGUI); + sceNp->AddFunc(0x474b7b13, sceNpMatchingJoinRoomGUI); + sceNp->AddFunc(0xf806c54c, sceNpMatchingLeaveRoom); + sceNp->AddFunc(0x32febb4c, sceNpMatchingSearchJoinRoomGUI); + sceNp->AddFunc(0xdae2d351, sceNpMatchingGrantOwnership); + sceNp->AddFunc(0xceeebc7a, sceNpProfileCallGui); + sceNp->AddFunc(0x2f2c6b3e, sceNpProfileAbortGui); + sceNp->AddFunc(0x32cf311f, sceNpScoreInit); + sceNp->AddFunc(0x9851f805, sceNpScoreTerm); + sceNp->AddFunc(0xb9f93bbb, sceNpScoreCreateTitleCtx); + sceNp->AddFunc(0x259113b8, sceNpScoreDestroyTitleCtx); + sceNp->AddFunc(0x6f5e8143, sceNpScoreCreateTransactionCtx); + sceNp->AddFunc(0xc5f4cf82, sceNpScoreDestroyTransactionCtx); + sceNp->AddFunc(0x29dd45dc, sceNpScoreSetTimeout); + sceNp->AddFunc(0x2706eaa1, sceNpScoreSetPlayerCharacterId); + sceNp->AddFunc(0x1a2704f7, sceNpScoreWaitAsync); + sceNp->AddFunc(0xa7a090e5, sceNpScorePollAsync); + sceNp->AddFunc(0xf4e0f607, sceNpScoreGetBoardInfo); + sceNp->AddFunc(0xddce7d15, sceNpScoreGetBoardInfoAsync); + sceNp->AddFunc(0x1672170e, sceNpScoreRecordScore); + sceNp->AddFunc(0xf0b1e399, sceNpScoreRecordScoreAsync); + sceNp->AddFunc(0x04ca5e6a, sceNpScoreRecordGameData); + sceNp->AddFunc(0xf76847c2, sceNpScoreRecordGameDataAsync); + sceNp->AddFunc(0x3b02418d, sceNpScoreGetGameData); + sceNp->AddFunc(0xdb2e4dc2, sceNpScoreGetGameDataAsync); + sceNp->AddFunc(0x05d65dff, sceNpScoreGetRankingByNpId); + sceNp->AddFunc(0x3db7914d, sceNpScoreGetRankingByNpIdAsync); + sceNp->AddFunc(0xfbc82301, sceNpScoreGetRankingByRange); + sceNp->AddFunc(0x21206642, sceNpScoreGetRankingByRangeAsync); + sceNp->AddFunc(0x7deb244c, sceNpScoreCensorComment); + sceNp->AddFunc(0x7be47e61, sceNpScoreCensorCommentAsync); + sceNp->AddFunc(0xf1b77918, sceNpScoreSanitizeComment); + sceNp->AddFunc(0x2cd2a1af, sceNpScoreSanitizeCommentAsync); sceNp->AddFunc(0xc3a991ee, sceNpScoreGetRankingByNpIdPcId); sceNp->AddFunc(0xc4b6cd8f, sceNpScoreGetRankingByNpIdPcIdAsync); - sceNp->AddFunc(0xc5f4cf82, sceNpScoreDestroyTransactionCtx); - sceNp->AddFunc(0xca0a2d04, sceNpSignalingGetConnectionStatus); - sceNp->AddFunc(0xca39c4b2, sceNpLookupTitleSmallStorage); - sceNp->AddFunc(0xccbe2e69, sceNpCommerceGetSkuImageURL); - sceNp->AddFunc(0xce81c7f0, sceNpLookupCreateTitleCtx); - sceNp->AddFunc(0xceeebc7a, sceNpProfileCallGui); - sceNp->AddFunc(0xcfd469e4, sceNpCommerceGetProductCategoryFinish); - sceNp->AddFunc(0xd03cea35, sceNpCommerceGetDataFlagState); - sceNp->AddFunc(0xd053f113, sceNpBasicGetCustomInvitationEntry); - sceNp->AddFunc(0xd0958814, sceNpSignalingGetPeerNetInfoResult); - sceNp->AddFunc(0xd12e40ae, sceNpLookupNpIdAsync); - sceNp->AddFunc(0xd208f91d, sceNpUtilCmpNpId); - sceNp->AddFunc(0xd20d7798, sceNpMatchingKickRoomMemberWithOpt); - sceNp->AddFunc(0xd737fd2d, sceNpLookupWaitAsync); - sceNp->AddFunc(0xd7fb1fa6, sceNpFriendlistCustom); - sceNp->AddFunc(0xdae2d351, sceNpMatchingGrantOwnership); - sceNp->AddFunc(0xdb2e4dc2, sceNpScoreGetGameDataAsync); - sceNp->AddFunc(0xdbdb909f, sceNpCommerceGetDataFlagStart); - sceNp->AddFunc(0xddce7d15, sceNpScoreGetBoardInfoAsync); - sceNp->AddFunc(0xded17c26, sceNpScoreGetClansMembersRankingByNpId); - sceNp->AddFunc(0xdfd63b62, sceNpLookupUserProfile); - sceNp->AddFunc(0xe035f7d6, sceNpBasicGetEvent); - sceNp->AddFunc(0xe1c9f675, sceNpBasicMarkMessageAsUsed); - sceNp->AddFunc(0xe24eea19, sceNpMatchingGetRoomListLimitGUI); - sceNp->AddFunc(0xe2877bea, sceNpCommerceDestroyCtx); - sceNp->AddFunc(0xe36c660e, sceNpCommerceDoCheckoutStartAsync); - sceNp->AddFunc(0xe6c8f3f9, sceNpDrmProcessExitSpawn2); - sceNp->AddFunc(0xe7dcd3b4, sceNpManagerRegisterCallback); - sceNp->AddFunc(0xe853d388, sceNpSignalingGetConnectionFromNpId); - sceNp->AddFunc(0xe8a67160, sceNpScoreGetClansMembersRankingByNpIdAsync); - sceNp->AddFunc(0xea2e9ffc, sceNpLookupCreateTransactionCtx); - sceNp->AddFunc(0xeb5f2544, sceNpCommerceGetProductName); - sceNp->AddFunc(0xeb7a3d84, sceNpManagerGetChatRestrictionFlag); - sceNp->AddFunc(0xeb9df054, sceNpCommerceGetCategoryInfo); - sceNp->AddFunc(0xec0a1fbf, sceNpBasicSendMessage); - sceNp->AddFunc(0xecd503de, sceNpBasicGetMessageEntryCount); - sceNp->AddFunc(0xee0cc40c, _sceNpSysutilClientMalloc); - sceNp->AddFunc(0xee530059, sceNpCommerceGetSkuName); sceNp->AddFunc(0xee5b20d9, sceNpScoreAbortTransaction); - sceNp->AddFunc(0xee64cf8e, sceNpMatchingGetRoomSearchFlag); - sceNp->AddFunc(0xf0a9182b, sceNpFriendlist); - sceNp->AddFunc(0xf0b1e399, sceNpScoreRecordScoreAsync); - sceNp->AddFunc(0xf1b77918, sceNpScoreSanitizeComment); - sceNp->AddFunc(0xf2b3338a, sceNpBasicGetBlockListEntry); - sceNp->AddFunc(0xf42c0df8, sceNpManagerGetOnlineName); - sceNp->AddFunc(0xf4e0f607, sceNpScoreGetBoardInfo); - sceNp->AddFunc(0xf59e1da8, sceNpFriendlistAbortGui); - sceNp->AddFunc(0xf5ff5f31, sceNpUtilCmpNpIdInOrder); - sceNp->AddFunc(0xf76847c2, sceNpScoreRecordGameDataAsync); - sceNp->AddFunc(0xf806c54c, sceNpMatchingLeaveRoom); - sceNp->AddFunc(0xf9732ac8, sceNpCustomMenuActionSetActivation); - sceNp->AddFunc(0xfb87cf5e, sceNpLookupDestroyTransactionCtx); - sceNp->AddFunc(0xfbc82301, sceNpScoreGetRankingByRange); - sceNp->AddFunc(0xfcac355a, sceNpCommerceCreateCtx); + sceNp->AddFunc(0xded17c26, sceNpScoreGetClansMembersRankingByNpId); + sceNp->AddFunc(0xe8a67160, sceNpScoreGetClansMembersRankingByNpIdAsync); + sceNp->AddFunc(0x41ffd4f2, sceNpScoreGetClansMembersRankingByNpIdPcId); + sceNp->AddFunc(0x433fcb30, sceNpScoreGetClansMembersRankingByNpIdPcIdAsync); + sceNp->AddFunc(0x6d4adc3b, sceNpScoreGetClansMembersRankingByRange); + sceNp->AddFunc(0x4d5e0670, sceNpScoreGetClansMembersRankingByRangeAsync); + sceNp->AddFunc(0x741fbf24, sceNpScoreGetClanMemberGameData); + sceNp->AddFunc(0xbef887e5, sceNpScoreGetClanMemberGameDataAsync); + sceNp->AddFunc(0x2a76895a, sceNpScoreGetClansRankingByClanId); + sceNp->AddFunc(0x227f8763, sceNpScoreGetClansRankingByClanIdAsync); + sceNp->AddFunc(0xb082003b, sceNpScoreGetClansRankingByRange); + sceNp->AddFunc(0x7b7e9137, sceNpScoreGetClansRankingByRangeAsync); + sceNp->AddFunc(0x6356082e, sceNpSignalingCreateCtx); + sceNp->AddFunc(0xa8cf8451, sceNpSignalingDestroyCtx); + sceNp->AddFunc(0x50b86d94, sceNpSignalingAddExtendedHandler); + sceNp->AddFunc(0x276c72b2, sceNpSignalingSetCtxOpt); + sceNp->AddFunc(0x2687a127, sceNpSignalingGetCtxOpt); + sceNp->AddFunc(0x60897c38, sceNpSignalingActivateConnection); sceNp->AddFunc(0xfd0eb5ae, sceNpSignalingDeactivateConnection); - sceNp->AddFunc(0xfd39ae13, sceNpBasicGetFriendPresenceByNpId); - sceNp->AddFunc(0xfe37a7f4, sceNpManagerGetNpId); - sceNp->AddFunc(0xff0a2378, sceNpLookupUserProfileAsync); - sceNp->AddFunc(0x432b3cbf, sceNpUtilBandwidthTestShutdown); - sceNp->AddFunc(0xc2ced2b7, sceNpUtilBandwidthTestInitStart); + sceNp->AddFunc(0x95c7bba3, sceNpSignalingTerminateConnection); + sceNp->AddFunc(0xca0a2d04, sceNpSignalingGetConnectionStatus); + sceNp->AddFunc(0x155de760, sceNpSignalingGetConnectionInfo); + sceNp->AddFunc(0xe853d388, sceNpSignalingGetConnectionFromNpId); + sceNp->AddFunc(0x34ce82a0, sceNpSignalingGetConnectionFromPeerAddress); + sceNp->AddFunc(0x9ad7fbd1, sceNpSignalingGetLocalNetInfo); + sceNp->AddFunc(0x75eb50cb, sceNpSignalingGetPeerNetInfo); + sceNp->AddFunc(0x64dbb89d, sceNpSignalingCancelPeerNetInfo); + sceNp->AddFunc(0xd0958814, sceNpSignalingGetPeerNetInfoResult); + sceNp->AddFunc(0xd208f91d, sceNpUtilCmpNpId); + sceNp->AddFunc(0xf5ff5f31, sceNpUtilCmpNpIdInOrder); sceNp->AddFunc(0xc880f37d, sceNpUtilBandwidthTestGetStatus); sceNp->AddFunc(0xc99ee313, sceNpUtilBandwidthTestAbort); - sceNp->AddFunc(0xa8cf8451, sceNpSignalingDestroyCtx); + sceNp->AddFunc(0xee0cc40c, _sceNpSysutilClientMalloc); + sceNp->AddFunc(0x816c6a5f, _sceNpSysutilClientFree); } diff --git a/rpcs3/Emu/SysCalls/Modules/sceNp.h b/rpcs3/Emu/SysCalls/Modules/sceNp.h index 87a4540132..ddce57f3dd 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNp.h +++ b/rpcs3/Emu/SysCalls/Modules/sceNp.h @@ -28,6 +28,40 @@ enum SCE_NP_ERROR_ALREADY_USED = 0x8002aa15, SCE_NP_ERROR_DIFFERENT_USER = 0x8002aa16, SCE_NP_ERROR_ALREADY_DONE = 0x8002aa17, + // NP Basic Utility + SCE_NP_BASIC_ERROR_ALREADY_INITIALIZED = 0x8002a661, + SCE_NP_BASIC_ERROR_NOT_INITIALIZED = 0x8002a662, + SCE_NP_BASIC_ERROR_NOT_SUPPORTED = 0x8002a663, + SCE_NP_BASIC_ERROR_OUT_OF_MEMORY = 0x8002a664, + SCE_NP_BASIC_ERROR_INVALID_ARGUMENT = 0x8002a665, + SCE_NP_BASIC_ERROR_BAD_ID = 0x8002a666, + SCE_NP_BASIC_ERROR_IDS_DIFFER = 0x8002a667, + SCE_NP_BASIC_ERROR_PARSER_FAILED = 0x8002a668, + SCE_NP_BASIC_ERROR_TIMEOUT = 0x8002a669, + SCE_NP_BASIC_ERROR_NO_EVENT = 0x8002a66a, + SCE_NP_BASIC_ERROR_EXCEEDS_MAX = 0x8002a66b, + SCE_NP_BASIC_ERROR_INSUFFICIENT = 0x8002a66c, + SCE_NP_BASIC_ERROR_NOT_REGISTERED = 0x8002a66d, + SCE_NP_BASIC_ERROR_DATA_LOST = 0x8002a66e, + SCE_NP_BASIC_ERROR_BUSY = 0x8002a66f, + SCE_NP_BASIC_ERROR_STATUS = 0x8002a670, + SCE_NP_BASIC_ERROR_CANCEL = 0x8002a671, + SCE_NP_BASIC_ERROR_INVALID_MEMORY_CONTAINER = 0x8002a672, + SCE_NP_BASIC_ERROR_INVALID_DATA_ID = 0x8002a673, + SCE_NP_BASIC_ERROR_BROKEN_DATA = 0x8002a674, + SCE_NP_BASIC_ERROR_BLOCKLIST_ADD_FAILED = 0x8002a675, + SCE_NP_BASIC_ERROR_BLOCKLIST_IS_FULL = 0x8002a676, + SCE_NP_BASIC_ERROR_SEND_FAILED = 0x8002a677, + SCE_NP_BASIC_ERROR_NOT_CONNECTED = 0x8002a678, + SCE_NP_BASIC_ERROR_INSUFFICIENT_DISK_SPACE = 0x8002a679, + SCE_NP_BASIC_ERROR_INTERNAL_FAILURE = 0x8002a67a, + SCE_NP_BASIC_ERROR_DOES_NOT_EXIST = 0x8002a67b, + SCE_NP_BASIC_ERROR_INVALID = 0x8002a67c, + SCE_NP_BASIC_ERROR_UNKNOWN = 0x8002a6bf, + SCE_NP_EXT_ERROR_CONTEXT_DOES_NOT_EXIST = 0x8002a6a1, + SCE_NP_EXT_ERROR_CONTEXT_ALREADY_EXISTS = 0x8002a6a2, + SCE_NP_EXT_ERROR_NO_CONTEXT = 0x8002a6a3, + SCE_NP_EXT_ERROR_NO_ORIGIN = 0x8002a6a4, // NP Community Utility SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED = 0x8002a101, SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED = 0x8002a102, @@ -62,6 +96,8 @@ enum SCE_NP_COMMUNITY_ERROR_TOO_MANY_SLOTID = 0x8002a1b1, }; +typedef int(*SceNpBasicEventHandler)(s32 event, s32 retCode, u32 reqId, vm::ptr arg); + // NP Manager Utility statuses enum { @@ -72,6 +108,38 @@ enum SCE_NP_MANAGER_STATUS_ONLINE = 3, }; +// Event types +enum +{ + SCE_NP_BASIC_EVENT_UNKNOWN = -1, + SCE_NP_BASIC_EVENT_OFFLINE = 0, + SCE_NP_BASIC_EVENT_PRESENCE = 1, + SCE_NP_BASIC_EVENT_MESSAGE = 2, + SCE_NP_BASIC_EVENT_ADD_FRIEND_RESULT = 3, + SCE_NP_BASIC_EVENT_INCOMING_ATTACHMENT = 4, + SCE_NP_BASIC_EVENT_INCOMING_INVITATION = 5, + SCE_NP_BASIC_EVENT_END_OF_INITIAL_PRESENCE = 6, + SCE_NP_BASIC_EVENT_SEND_ATTACHMENT_RESULT = 7, + SCE_NP_BASIC_EVENT_RECV_ATTACHMENT_RESULT = 8, + SCE_NP_BASIC_EVENT_OUT_OF_CONTEXT = 9, + SCE_NP_BASIC_EVENT_FRIEND_REMOVED = 10, + SCE_NP_BASIC_EVENT_ADD_BLOCKLIST_RESULT = 11, + SCE_NP_BASIC_EVENT_SEND_MESSAGE_RESULT = 12, + SCE_NP_BASIC_EVENT_SEND_INVITATION_RESULT = 13, + SCE_NP_BASIC_EVENT_RECV_INVITATION_RESULT = 14, + SCE_NP_BASIC_EVENT_MESSAGE_MARKED_AS_USED_RESULT = 15, + SCE_NP_BASIC_EVENT_INCOMING_CUSTOM_INVITATION = 16, + SCE_NP_BASIC_EVENT_INCOMING_CLAN_MESSAGE = 17, + SCE_NP_BASIC_EVENT_ADD_PLAYERS_HISTORY_RESULT = 18, + SCE_NP_BASIC_EVENT_SEND_CUSTOM_DATA_RESULT = 19, + SCE_NP_BASIC_EVENT_RECV_CUSTOM_DATA_RESULT = 20, + SCE_NP_BASIC_EVENT_INCOMING_CUSTOM_DATA_MESSAGE = 21, + SCE_NP_BASIC_EVENT_SEND_URL_ATTACHMENT_RESULT = 22, + SCE_NP_BASIC_EVENT_INCOMING_BOOTABLE_INVITATION = 23, + SCE_NP_BASIC_EVENT_BLOCKLIST_UPDATE = 24, + SCE_NP_BASIC_EVENT_INCOMING_BOOTABLE_CUSTOM_DATA_MESSAGE = 25, +}; + // IDs for attachment data objects enum { diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp index 0494fb9d37..0c761ee2cc 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpClans.cpp @@ -8,243 +8,428 @@ Module *sceNpClans = nullptr; -int sceNpClansInit() +struct sceNpClansInternal { - UNIMPLEMENTED_FUNC(sceNpClans); + bool m_bSceNpClansInitialized; + + sceNpClansInternal() + : m_bSceNpClansInitialized(false) + { + } +}; + +sceNpClansInternal sceNpClansInstance; + +int sceNpClansInit(vm::ptr commId, vm::ptr passphrase, vm::ptr pool, vm::ptr poolSize, u32 flags) +{ + sceNpClans->Warning("sceNpClansInit(commId_addr=0x%x, passphrase_addr=0x%x, pool_addr=0x%x,poolSize_addr=0x%x, flags=%d)", commId.addr(), passphrase.addr(), pool.addr(), poolSize.addr(), flags); + + if (sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_ALREADY_INITIALIZED; + + if (flags != 0) + return SCE_NP_CLANS_ERROR_NOT_SUPPORTED; + + sceNpClansInstance.m_bSceNpClansInitialized = true; + return CELL_OK; } int sceNpClansTerm() { - UNIMPLEMENTED_FUNC(sceNpClans); + sceNpClans->Warning("sceNpClansTerm()"); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + + sceNpClansInstance.m_bSceNpClansInitialized = false; + return CELL_OK; } -int sceNpClansCreateRequest() +int sceNpClansCreateRequest(vm::ptr handle,u64 flags) { - UNIMPLEMENTED_FUNC(sceNpClans); + sceNpClans->Todo("sceNpClansCreateRequest(handle_addr=0x%x, flags=0x%llx)", handle.addr(), flags); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + + if (flags != 0) + return SCE_NP_CLANS_ERROR_NOT_SUPPORTED; + return CELL_OK; } -int sceNpClansDestroyRequest() +int sceNpClansDestroyRequest(vm::ptr handle) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansAbortRequest() +int sceNpClansAbortRequest(vm::ptr handle) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansCreateClan() +int sceNpClansCreateClan(vm::ptr handle, vm::ptr name, vm::ptr tag, vm::ptr clanId) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansDisbandClan() +int sceNpClansDisbandClan(vm::ptr handle, u32 clanId) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansGetClanList() +int sceNpClansGetClanList(vm::ptr handle, vm::ptr paging, vm::ptr clanList, vm::ptr pageResult) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansGetClanListByNpId() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansSearchByProfile() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansSearchByName() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansGetClanInfo() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansUpdateClanInfo() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansGetMemberList() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansGetMemberInfo() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansUpdateMemberInfo() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansChangeMemberRole() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansGetAutoAcceptStatus() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansUpdateAutoAcceptStatus() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansJoinClan() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansLeaveClan() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansKickMember() +int sceNpClansKickMember(vm::ptr handle, u32 clanId, vm::ptr npid, vm::ptr message) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansSendInvitation() +int sceNpClansSendInvitation(vm::ptr handle, u32 clanId, vm::ptr npid, vm::ptr message) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansCancelInvitation() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansSendInvitationResponse() +int sceNpClansSendInvitationResponse(vm::ptr handle, u32 clanId, vm::ptr message, bool accept) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansSendMembershipRequest() +int sceNpClansSendMembershipRequest(vm::ptr handle, u32 clanId, vm::ptr message) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansCancelMembershipRequest() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansSendMembershipResponse() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansGetBlacklist() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansAddBlacklistEntry() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansRemoveBlacklistEntry() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansRetrieveAnnouncements() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansPostAnnouncement() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansRemoveAnnouncement() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } -int sceNpClansPostChallenge() +int sceNpClansPostChallenge(vm::ptr handle, u32 clanId, u32 targetClan, vm::ptr message, vm::ptr data, u32 duration, vm::ptr mId) { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + + if (data != 0) + return SCE_NP_CLANS_ERROR_NOT_SUPPORTED; + + //todo + return CELL_OK; } int sceNpClansRetrievePostedChallenges() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + + //todo + return CELL_OK; } int sceNpClansRemovePostedChallenge() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansRetrieveChallenges() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpClansRemoveChallenge() { UNIMPLEMENTED_FUNC(sceNpClans); + + if (!sceNpClansInstance.m_bSceNpClansInitialized) + return SCE_NP_CLANS_ERROR_NOT_INITIALIZED; + return CELL_OK; } void sceNpClans_unload() { - // TODO: Unload Clans module + sceNpClansInstance.m_bSceNpClansInitialized = false; } void sceNpClans_init(Module *pxThis) diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpCommerce2.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpCommerce2.cpp index d2ea06cc48..392de7166f 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpCommerce2.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpCommerce2.cpp @@ -6,6 +6,18 @@ Module *sceNpCommerce2 = nullptr; +struct sceNpCommerce2Internal +{ + bool m_bSceNpCommerce2Initialized; + + sceNpCommerce2Internal() + : m_bSceNpCommerce2Initialized(false) + { + } +}; + +sceNpCommerce2Internal sceNpCommerce2Instance; + int sceNpCommerce2ExecuteStoreBrowse() { UNIMPLEMENTED_FUNC(sceNpCommerce2); @@ -20,13 +32,25 @@ int sceNpCommerce2GetStoreBrowseUserdata() int sceNpCommerce2Init() { - UNIMPLEMENTED_FUNC(sceNpCommerce2); + sceNpCommerce2->Warning("sceNpCommerce2Init()"); + + if (sceNpCommerce2Instance.m_bSceNpCommerce2Initialized) + return SCE_NP_COMMERCE2_ERROR_ALREADY_INITIALIZED; + + sceNpCommerce2Instance.m_bSceNpCommerce2Initialized = true; + return CELL_OK; } int sceNpCommerce2Term() { - UNIMPLEMENTED_FUNC(sceNpCommerce2); + sceNpCommerce2->Warning("sceNpCommerce2Term()"); + + if (!sceNpCommerce2Instance.m_bSceNpCommerce2Initialized) + return SCE_NP_COMMERCE2_ERROR_NOT_INITIALIZED; + + sceNpCommerce2Instance.m_bSceNpCommerce2Initialized = false; + return CELL_OK; } @@ -290,7 +314,7 @@ int sceNpCommerce2DestroyReq() void sceNpCommerce2_unload() { - // TODO: Unload SNS module + sceNpCommerce2Instance.m_bSceNpCommerce2Initialized = false; } void sceNpCommerce2_init(Module *pxThis) diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp index 9577708714..c8c95a187f 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTrophy.cpp @@ -67,35 +67,36 @@ struct sceNpTrophyInternal } }; -sceNpTrophyInternal s_npTrophyInstance; +sceNpTrophyInternal sceNpTrophyInstance; // Functions int sceNpTrophyInit(u32 pool_addr, u32 poolSize, u32 containerId, u64 options) { sceNpTrophy->Log("sceNpTrophyInit(pool_addr=0x%x, poolSize=%d, containerId=%d, options=0x%llx)", pool_addr, poolSize, containerId, options); - if (s_npTrophyInstance.m_bInitialized) + if (sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_ALREADY_INITIALIZED; if (options) return SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; - s_npTrophyInstance.m_bInitialized = true; + sceNpTrophyInstance.m_bInitialized = true; + return CELL_OK; } -int sceNpTrophyCreateContext(vm::ptr> context, vm::ptr commID, vm::ptr commSign, u64 options) +int sceNpTrophyCreateContext(vm::ptr context, vm::ptr commID, vm::ptr commSign, u64 options) { sceNpTrophy->Warning("sceNpTrophyCreateContext(context_addr=0x%x, commID_addr=0x%x, commSign_addr=0x%x, options=0x%llx)", context.addr(), commID.addr(), commSign.addr(), options); - if (!s_npTrophyInstance.m_bInitialized) + if (!sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; if (options & (~(u64)1)) return SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; // TODO: There are other possible errors // TODO: Is the TROPHY.TRP file necessarily located in this path? - vfsDir dir("/app_home/TROPDIR/"); + vfsDir dir("/app_home/../TROPDIR/"); if(!dir.IsOpened()) return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; @@ -104,12 +105,12 @@ int sceNpTrophyCreateContext(vm::ptr> context, vm::ptrflags & DirEntry_TypeDir) { - vfsStream* stream = Emu.GetVFS().OpenFile("/app_home/TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead); + vfsStream* stream = Emu.GetVFS().OpenFile("/app_home/../TROPDIR/" + entry->name + "/TROPHY.TRP", vfsRead); if (stream && stream->IsOpened()) { - s_npTrophyInstance.contexts.emplace_back(); - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts.back(); + sceNpTrophyInstance.contexts.emplace_back(); + sceNpTrophyInternalContext& ctxt = sceNpTrophyInstance.contexts.back(); ctxt.trp_stream.reset(stream); ctxt.trp_name = entry->name; stream = nullptr; @@ -121,11 +122,11 @@ int sceNpTrophyCreateContext(vm::ptr> context, vm::ptr> handle) +int sceNpTrophyCreateHandle(vm::ptr handle) { sceNpTrophy->Warning("sceNpTrophyCreateHandle(handle_addr=0x%x)", handle.addr()); - if (!s_npTrophyInstance.m_bInitialized) + if (!sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; // TODO: There are other possible errors @@ -139,15 +140,15 @@ int sceNpTrophyRegisterContext(u32 context, u32 handle, vm::ptrWarning("sceNpTrophyRegisterContext(context=%d, handle=%d, statusCb_addr=0x%x, arg_addr=0x%x, options=0x%llx)", context, handle, statusCb.addr(), arg_addr, options); - if (!(s_npTrophyInstance.m_bInitialized)) + if (!(sceNpTrophyInstance.m_bInitialized)) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; if (options & (~(u64)1)) return SCE_NP_TROPHY_ERROR_NOT_SUPPORTED; - if (context >= s_npTrophyInstance.contexts.size()) + if (context >= sceNpTrophyInstance.contexts.size()) return SCE_NP_TROPHY_ERROR_UNKNOWN_CONTEXT; // TODO: There are other possible errors - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + sceNpTrophyInternalContext& ctxt = sceNpTrophyInstance.contexts[context]; if (!ctxt.trp_stream) return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; @@ -211,18 +212,18 @@ int sceNpTrophySetSoundLevel() return CELL_OK; } -int sceNpTrophyGetRequiredDiskSpace(u32 context, u32 handle, vm::ptr> reqspace, u64 options) +int sceNpTrophyGetRequiredDiskSpace(u32 context, u32 handle, vm::ptr reqspace, u64 options) { sceNpTrophy->Warning("sceNpTrophyGetRequiredDiskSpace(context=%d, handle=%d, reqspace_addr=0x%x, options=0x%llx)", context, handle, reqspace.addr(), options); - if (!s_npTrophyInstance.m_bInitialized) + if (!sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; - if (context >= s_npTrophyInstance.contexts.size()) + if (context >= sceNpTrophyInstance.contexts.size()) return SCE_NP_TROPHY_ERROR_UNKNOWN_CONTEXT; // TODO: There are other possible errors - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + sceNpTrophyInternalContext& ctxt = sceNpTrophyInstance.contexts[context]; if (!ctxt.trp_stream) return SCE_NP_TROPHY_ERROR_CONF_DOES_NOT_EXIST; @@ -236,9 +237,15 @@ int sceNpTrophyDestroyContext() return CELL_OK; } -int sceNpTrophyAbortHandle() +int sceNpTrophyAbortHandle(u32 handle) { - UNIMPLEMENTED_FUNC(sceNpTrophy); + sceNpTrophy->Todo("sceNpTrophyAbortHandle(handle=%d)", handle); + + // TODO: ? + + if (!sceNpTrophyInstance.m_bInitialized) + return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; + return CELL_OK; } @@ -247,13 +254,13 @@ int sceNpTrophyGetGameInfo(u32 context, u32 handle, vm::ptrWarning("sceNpTrophyGetGameInfo(context=%d, handle=%d, details_addr=0x%x, data_addr=0x%x)", context, handle, details.addr(), data.addr()); - if (!s_npTrophyInstance.m_bInitialized) + if (!sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; // TODO: There are other possible errors std::string path; rXmlDocument doc; - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + sceNpTrophyInternalContext& ctxt = sceNpTrophyInstance.contexts[context]; Emu.GetVFS().GetDevice("/dev_hdd0/home/00000001/trophy/" + ctxt.trp_name + "/TROPCONF.SFM", path); // TODO: Get the path of the current user doc.Load(path); @@ -300,16 +307,16 @@ int sceNpTrophyDestroyHandle() return CELL_OK; } -int sceNpTrophyUnlockTrophy(u32 context, u32 handle, s32 trophyId, vm::ptr> platinumId) +int sceNpTrophyUnlockTrophy(u32 context, u32 handle, s32 trophyId, vm::ptr platinumId) { sceNpTrophy->Warning("sceNpTrophyUnlockTrophy(context=%d, handle=%d, trophyId=%d, platinumId_addr=0x%x)", context, handle, trophyId, platinumId.addr()); - if (!s_npTrophyInstance.m_bInitialized) + if (!sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; // TODO: There are other possible errors - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + sceNpTrophyInternalContext& ctxt = sceNpTrophyInstance.contexts[context]; if (trophyId >= (s32)ctxt.tropusr->GetTrophiesCount()) return SCE_NP_TROPHY_ERROR_INVALID_TROPHY_ID; if (ctxt.tropusr->GetTrophyUnlockState(trophyId)) @@ -327,20 +334,26 @@ int sceNpTrophyUnlockTrophy(u32 context, u32 handle, s32 trophyId, vm::ptrWarning("sceNpTrophyTerm()"); + + if (!sceNpTrophyInstance.m_bInitialized) + return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; + + sceNpTrophyInstance.m_bInitialized = false; + return CELL_OK; } -int sceNpTrophyGetTrophyUnlockState(u32 context, u32 handle, vm::ptr flags, vm::ptr> count) +int sceNpTrophyGetTrophyUnlockState(u32 context, u32 handle, vm::ptr flags, vm::ptr count) { sceNpTrophy->Warning("sceNpTrophyGetTrophyUnlockState(context=%d, handle=%d, flags_addr=0x%x, count_addr=0x%x)", context, handle, flags.addr(), count.addr()); - if (!s_npTrophyInstance.m_bInitialized) + if (!sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; // TODO: There are other possible errors - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + sceNpTrophyInternalContext& ctxt = sceNpTrophyInstance.contexts[context]; *count = ctxt.tropusr->GetTrophiesCount(); if (*count > 128) sceNpTrophy->Warning("sceNpTrophyGetTrophyUnlockState: More than 128 trophies detected!"); @@ -368,13 +381,13 @@ int sceNpTrophyGetTrophyInfo(u32 context, u32 handle, s32 trophyId, vm::ptrWarning("sceNpTrophyGetTrophyInfo(context=%u, handle=%u, trophyId=%d, details_addr=0x%x, data_addr=0x%x)", context, handle, trophyId, details.addr(), data.addr()); - if (!s_npTrophyInstance.m_bInitialized) + if (!sceNpTrophyInstance.m_bInitialized) return SCE_NP_TROPHY_ERROR_NOT_INITIALIZED; // TODO: There are other possible errors std::string path; rXmlDocument doc; - sceNpTrophyInternalContext& ctxt = s_npTrophyInstance.contexts[context]; + sceNpTrophyInternalContext& ctxt = sceNpTrophyInstance.contexts[context]; Emu.GetVFS().GetDevice("/dev_hdd0/home/00000001/trophy/" + ctxt.trp_name + "/TROPCONF.SFM", path); // TODO: Get the path of the current user doc.Load(path); @@ -420,7 +433,7 @@ int sceNpTrophyGetGameIcon() void sceNpTrophy_unload() { - s_npTrophyInstance.m_bInitialized = false; + sceNpTrophyInstance.m_bInitialized = false; } void sceNpTrophy_init(Module *pxThis) diff --git a/rpcs3/Emu/SysCalls/Modules/sceNpTus.cpp b/rpcs3/Emu/SysCalls/Modules/sceNpTus.cpp index 50a5af0d2c..59c7dfe5fe 100644 --- a/rpcs3/Emu/SysCalls/Modules/sceNpTus.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sceNpTus.cpp @@ -7,333 +7,565 @@ Module *sceNpTus = nullptr; +struct sceNpTusInternal +{ + bool m_bSceNpTusInitialized; + + sceNpTusInternal() + : m_bSceNpTusInitialized(false) + { + } +}; + +sceNpTusInternal sceNpTusInstance; + int sceNpTusInit() { - UNIMPLEMENTED_FUNC(sceNpTus); + sceNpTus->Warning("sceNpTusInit()"); + + if (sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_ALREADY_INITIALIZED; + + sceNpTusInstance.m_bSceNpTusInitialized = true; + return CELL_OK; } int sceNpTusTerm() { - UNIMPLEMENTED_FUNC(sceNpTus); + sceNpTus->Warning("sceNpTusTerm()"); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + + sceNpTusInstance.m_bSceNpTusInitialized = false; + return CELL_OK; } int sceNpTusCreateTitleCtx() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDestroyTitleCtx() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusCreateTransactionCtx() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDestroyTransactionCtx() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetTimeout() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusAbortTransaction() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusWaitAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusPollAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetMultiSlotVariable() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetMultiSlotVariableVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetMultiSlotVariableAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetMultiSlotVariableVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotVariable() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotVariableVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotVariableAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotVariableVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserVariable() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserVariableVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserVariableAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserVariableVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusAddAndGetVariable() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusAddAndGetVariableVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusAddAndGetVariableAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusAddAndGetVariableVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusTryAndSetVariable() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusTryAndSetVariableVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusTryAndSetVariableAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusTryAndSetVariableVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotVariable() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotVariableVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotVariableAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotVariableVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetData() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetDataVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetDataAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusSetDataVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetData() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetDataVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetDataAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetDataVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotDataStatus() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotDataStatusVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotDataStatusAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiSlotDataStatusVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserDataStatus() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserDataStatusVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserDataStatusAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusGetMultiUserDataStatusVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotData() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotDataVUser() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotDataAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } int sceNpTusDeleteMultiSlotDataVUserAsync() { UNIMPLEMENTED_FUNC(sceNpTus); + + if (!sceNpTusInstance.m_bSceNpTusInitialized) + return SCE_NP_COMMUNITY_ERROR_NOT_INITIALIZED; + return CELL_OK; } void sceNpTus_unload() { - // TODO: Unload Tus module + sceNpTusInstance.m_bSceNpTusInitialized = false; } void sceNpTus_init(Module *pxThis) diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp index 8730463aff..86db920f9f 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.cpp @@ -5,7 +5,6 @@ #include "Emu/SysCalls/Callback.h" #include "Emu/FS/vfsFile.h" -#include "Emu/FS/vfsStreamMemory.h" #include "Emu/SysCalls/lv2/sys_spu.h" #include "Emu/SysCalls/lv2/sys_lwmutex.h" #include "Emu/SysCalls/lv2/sys_spinlock.h" @@ -15,13 +14,17 @@ #include "Emu/SysCalls/lv2/sys_time.h" #include "Emu/SysCalls/lv2/sys_mmapper.h" #include "Emu/SysCalls/lv2/sys_lwcond.h" -#include "Loader/ELF.h" +#include "Loader/ELF32.h" +#include "Crypto/unself.h" #include "Emu/Cell/RawSPUThread.h" #include "sysPrxForUser.h" Module *sysPrxForUser = nullptr; -extern u32 LoadSpuImage(vfsStream& stream, u32& spu_ep); +void sys_initialize_tls() +{ + sysPrxForUser->Log("sys_initialize_tls()"); +} int _sys_heap_create_heap(const u32 heap_addr, const u32 align, const u32 size) { @@ -52,11 +55,6 @@ u32 _sys_heap_memalign(u32 heap_id, u32 align, u32 size) return (u32)Memory.Alloc(size, align); } -void sys_initialize_tls() -{ - sysPrxForUser->Log("sys_initialize_tls()"); -} - s64 _sys_process_atexitspawn() { sysPrxForUser->Log("_sys_process_atexitspawn()"); @@ -83,9 +81,9 @@ s64 sys_prx_exitspawn_with_level() return CELL_OK; } -int sys_spu_elf_get_information(u32 elf_img, vm::ptr> entry, vm::ptr> nseg) +int sys_spu_elf_get_information(u32 elf_img, vm::ptr entry, vm::ptr nseg) { - sysPrxForUser->Todo("sys_spu_elf_get_information(elf_img=0x%x, entry_addr=0x%x, nseg_addr=0x%x", elf_img, entry.addr(), nseg.addr()); + sysPrxForUser->Todo("sys_spu_elf_get_information(elf_img=0x%x, entry_addr=0x%x, nseg_addr=0x%x)", elf_img, entry.addr(), nseg.addr()); return CELL_OK; } @@ -97,18 +95,9 @@ int sys_spu_elf_get_segments(u32 elf_img, vm::ptr segments, int int sys_spu_image_import(vm::ptr img, u32 src, u32 type) { - sysPrxForUser->Warning("sys_spu_image_import(img=0x%x, src=0x%x, type=0x%x)", img.addr(), src, type); + sysPrxForUser->Warning("sys_spu_image_import(img=0x%x, src=0x%x, type=%d)", img.addr(), src, type); - vfsStreamMemory f(src); - u32 entry; - u32 offset = LoadSpuImage(f, entry); - - img->type = type; - img->entry_point = entry; - img->segs_addr = offset; - img->nsegs = 0; - - return CELL_OK; + return spu_image_import(*img, src, type); } int sys_spu_image_close(vm::ptr img) @@ -117,7 +106,7 @@ int sys_spu_image_close(vm::ptr img) return CELL_OK; } -int sys_raw_spu_load(s32 id, vm::ptr path, vm::ptr> entry) +int sys_raw_spu_load(s32 id, vm::ptr path, vm::ptr entry) { sysPrxForUser->Warning("sys_raw_spu_load(id=0x%x, path_addr=0x%x('%s'), entry_addr=0x%x)", id, path.addr(), path.get_ptr(), entry.addr()); @@ -129,11 +118,22 @@ int sys_raw_spu_load(s32 id, vm::ptr path, vm::ptr> entry) return CELL_ENOENT; } - ELFLoader l(f); - l.LoadInfo(); - l.LoadData(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id); + SceHeader hdr; + hdr.Load(f); - *entry = l.GetEntry(); + if (hdr.CheckMagic()) + { + sysPrxForUser->Error("sys_raw_spu_load error: '%s' is encrypted! Decrypt SELF and try again.", path.get_ptr()); + Emu.Pause(); + return CELL_ENOENT; + } + + f.Seek(0); + + u32 _entry; + LoadSpuImage(f, _entry, RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id); + + *entry = _entry; return CELL_OK; } @@ -143,20 +143,23 @@ int sys_raw_spu_image_load(int id, vm::ptr img) sysPrxForUser->Warning("sys_raw_spu_image_load(id=0x%x, img_addr=0x%x)", id, img.addr()); // TODO: use segment info - memcpy(vm::get_ptr(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id), vm::get_ptr(img->segs_addr), 256 * 1024); + memcpy(vm::get_ptr(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id), vm::get_ptr(img->addr), 256 * 1024); vm::write32(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id + RAW_SPU_PROB_OFFSET + SPU_NPC_offs, (u32)img->entry_point); return CELL_OK; } -int sys_get_random_number(u32 addr, u64 size) +int sys_get_random_number(vm::ptr addr, u64 size) { - sysPrxForUser->Warning("sys_get_random_number(addr=0x%x, size=%d)", addr, size); + sysPrxForUser->Warning("sys_get_random_number(addr=0x%x, size=%d)", addr.addr(), size); if (size > 4096) size = 4096; - vm::write32(addr, rand() % size); + for (u32 i = 0; i < (u32)size - 1; i++) + { + addr[i] = rand() % 256; + } return CELL_OK; } @@ -235,8 +238,6 @@ vm::ptr _sys_strncpy(vm::ptr dest, vm::ptr source, u32 l return dest; } -typedef s32(*spu_printf_cb_t)(u32 arg); - vm::ptr spu_printf_agcb; vm::ptr spu_printf_dgcb; vm::ptr spu_printf_atcb; @@ -270,68 +271,63 @@ s32 _sys_spu_printf_finalize() return CELL_OK; } -s64 _sys_spu_printf_attach_group(u32 arg) +s64 _sys_spu_printf_attach_group(u32 group) { - sysPrxForUser->Warning("_sys_spu_printf_attach_group(arg=0x%x)", arg); + sysPrxForUser->Warning("_sys_spu_printf_attach_group(group=%d)", group); if (!spu_printf_agcb) { return CELL_ESTAT; } - return spu_printf_agcb(arg); + return spu_printf_agcb(group); } -s64 _sys_spu_printf_detach_group(u32 arg) +s64 _sys_spu_printf_detach_group(u32 group) { - sysPrxForUser->Warning("_sys_spu_printf_detach_group(arg=0x%x)", arg); + sysPrxForUser->Warning("_sys_spu_printf_detach_group(group=%d)", group); if (!spu_printf_dgcb) { return CELL_ESTAT; } - return spu_printf_dgcb(arg); + return spu_printf_dgcb(group); } -s64 _sys_spu_printf_attach_thread(u32 arg) +s64 _sys_spu_printf_attach_thread(u32 thread) { - sysPrxForUser->Warning("_sys_spu_printf_attach_thread(arg=0x%x)", arg); + sysPrxForUser->Warning("_sys_spu_printf_attach_thread(thread=%d)", thread); if (!spu_printf_atcb) { return CELL_ESTAT; } - return spu_printf_atcb(arg); + return spu_printf_atcb(thread); } -s64 _sys_spu_printf_detach_thread(u32 arg) +s64 _sys_spu_printf_detach_thread(u32 thread) { - sysPrxForUser->Warning("_sys_spu_printf_detach_thread(arg=0x%x)", arg); + sysPrxForUser->Warning("_sys_spu_printf_detach_thread(thread=%d)", thread); if (!spu_printf_dtcb) { return CELL_ESTAT; } - return spu_printf_dtcb(arg); + return spu_printf_dtcb(thread); } -s32 _sys_snprintf(vm::ptr dst, u32 count, vm::ptr fmt, u32 a1, u32 a2) // va_args... +s32 _sys_snprintf(vm::ptr dst, u32 count, vm::ptr fmt) // va_args... { sysPrxForUser->Todo("_sys_snprintf(dst_addr=0x%x, count=%d, fmt_addr=0x%x['%s'], ...)", dst.addr(), count, fmt.addr(), fmt.get_ptr()); - if (std::string(fmt.get_ptr()) == "%s_%08x") - { - return snprintf(dst.get_ptr(), count, fmt.get_ptr(), vm::get_ptr(a1), a2); - } - Emu.Pause(); return 0; } -s32 _sys_printf(vm::ptr fmt) +s32 _sys_printf(vm::ptr fmt) // va_args... { sysPrxForUser->Todo("_sys_printf(fmt_addr=0x%x, ...)", fmt.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.h b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.h index 6fa65c5d69..8c020f3ecc 100644 --- a/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.h +++ b/rpcs3/Emu/SysCalls/Modules/sysPrxForUser.h @@ -1,4 +1,4 @@ -# pragma once +#pragma once struct HeapInfo { @@ -14,5 +14,13 @@ struct HeapInfo } }; +typedef s32(*spu_printf_cb_t)(u32 arg); + +// Aux +extern vm::ptr spu_printf_agcb; +extern vm::ptr spu_printf_dgcb; +extern vm::ptr spu_printf_atcb; +extern vm::ptr spu_printf_dtcb; + // SysCalls vm::ptr _sys_memset(vm::ptr dst, s32 value, u32 size); diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index 0c3c18224b..8cbefa8055 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -111,7 +111,7 @@ int sdata_unpack(const std::string& packed_file, const std::string& unpacked_fil } -int cellFsSdataOpen(vm::ptr path, int flags, vm::ptr> fd, vm::ptr> arg, u64 size) +int cellFsSdataOpen(vm::ptr path, int flags, vm::ptr> fd, vm::ptr arg, u64 size) { sys_fs->Warning("cellFsSdataOpen(path=\"%s\", flags=0x%x, fd_addr=0x%x, arg_addr=0x%x, size=0x%llx) -> cellFsOpen()", path.get_ptr(), flags, fd.addr(), arg.addr(), size); @@ -136,7 +136,7 @@ int cellFsSdataOpen(vm::ptr path, int flags, vm::ptr> fd, return cellFsOpen(path, flags, fd, arg, size); } -int cellFsSdataOpenByFd(int mself_fd, int flags, vm::ptr> sdata_fd, u64 offset, vm::ptr> arg, u64 size) +int cellFsSdataOpenByFd(int mself_fd, int flags, vm::ptr sdata_fd, u64 offset, vm::ptr arg, u64 size) { sys_fs->Todo("cellFsSdataOpenByFd(mself_fd=0x%x, flags=0x%x, sdata_fd_addr=0x%x, offset=0x%llx, arg_addr=0x%x, size=0x%llx) -> cellFsOpen()", mself_fd, flags, sdata_fd.addr(), offset, arg.addr(), size); @@ -208,7 +208,7 @@ void fsAioRead(u32 fd, vm::ptr aio, int xid, vm::ptr aio, vm::ptr> aio_id, vm::ptr xaio, int error, int xid, u64 size)> func) +int cellFsAioRead(vm::ptr aio, vm::ptr aio_id, vm::ptr xaio, int error, int xid, u64 size)> func) { sys_fs->Warning("cellFsAioRead(aio_addr=0x%x, id_addr=0x%x, func_addr=0x%x)", aio.addr(), aio_id.addr(), func.addr()); @@ -239,7 +239,7 @@ int cellFsAioRead(vm::ptr aio, vm::ptr> aio_id, vm::ptr aio, vm::ptr> aio_id, vm::ptr xaio, int error, int xid, u64 size)> func) +int cellFsAioWrite(vm::ptr aio, vm::ptr aio_id, vm::ptr xaio, int error, int xid, u64 size)> func) { sys_fs->Todo("cellFsAioWrite(aio_addr=0x%x, id_addr=0x%x, func_addr=0x%x)", aio.addr(), aio_id.addr(), func.addr()); diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp index a98f61d002..9f550557c1 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp @@ -19,7 +19,7 @@ extern "C" Module *sys_net = nullptr; -vm::ptr> g_lastError = vm::ptr>::make(0); +vm::ptr g_lastError = vm::ptr::make(0); // Auxiliary Functions @@ -96,7 +96,7 @@ int sys_net_accept(s32 s, vm::ptr addr, vm::ptr pad { sys_net->Warning("accept(s=%d, family_addr=0x%x, paddrlen=0x%x)", s, addr.addr(), paddrlen.addr()); if (!addr) { - int ret = accept(s, NULL, NULL); + int ret = accept(s, nullptr, nullptr); *g_lastError = getLastError(); return ret; } @@ -341,7 +341,7 @@ int socketselect() int sys_net_initialize_network_ex(vm::ptr param) { sys_net->Warning("sys_net_initialize_network_ex(param_addr=0x%x)", param.addr()); - g_lastError = vm::ptr>::make((u32)Memory.Alloc(4, 1)); + g_lastError = vm::ptr::make((u32)Memory.Alloc(4, 1)); #ifdef _WIN32 WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1,1); @@ -474,7 +474,7 @@ int sys_net_finalize_network() { sys_net->Warning("sys_net_initialize_network_ex()"); Memory.Free(g_lastError.addr()); - g_lastError = vm::ptr>::make(0); + g_lastError = vm::ptr::make(0); #ifdef _WIN32 WSACleanup(); #endif diff --git a/rpcs3/Emu/SysCalls/SC_FUNC.h b/rpcs3/Emu/SysCalls/SC_FUNC.h index fbb3e676eb..111c4333b2 100644 --- a/rpcs3/Emu/SysCalls/SC_FUNC.h +++ b/rpcs3/Emu/SysCalls/SC_FUNC.h @@ -57,14 +57,14 @@ namespace detail template struct bind_arg { - static_assert(f_count <= 12, "TODO: Unsupported stack argument type (float)"); + static_assert(f_count <= 13, "TODO: Unsupported stack argument type (float)"); static_assert(v_count <= 12, "TODO: Unsupported stack argument type (vector)"); static_assert(sizeof(T) <= 8, "Invalid function argument type for ARG_STACK"); static __forceinline T func(PPUThread& CPU) { // TODO: check stack argument displacement - const u64 res = CPU.GetStackArg(8 + std::max(g_count - 8, 0) + std::max(f_count - 12, 0) + std::max(v_count - 12, 0)); + const u64 res = CPU.GetStackArg(8 + std::max(g_count - 8, 0) + std::max(f_count - 13, 0) + std::max(v_count - 12, 0)); return (T&)res; } }; @@ -144,7 +144,7 @@ namespace detail const bool is_float = std::is_floating_point::value; const bool is_vector = std::is_same::value; const bind_arg_type t = is_float - ? ((f_count >= 12) ? ARG_STACK : ARG_FLOAT) + ? ((f_count >= 13) ? ARG_STACK : ARG_FLOAT) : (is_vector ? ((v_count >= 12) ? ARG_STACK : ARG_VECTOR) : ((g_count >= 8) ? ARG_STACK : ARG_GENERAL)); const int g = g_count + (is_float || is_vector ? 0 : 1); const int f = f_count + (is_float ? 1 : 0); @@ -249,4 +249,4 @@ template func_caller* bind_func(RT(*call)(T...)) { return new detail::func_binder(call); -} \ No newline at end of file +} diff --git a/rpcs3/Emu/SysCalls/SyncPrimitivesManager.h b/rpcs3/Emu/SysCalls/SyncPrimitivesManager.h index f4360ae4d2..97110e2a50 100644 --- a/rpcs3/Emu/SysCalls/SyncPrimitivesManager.h +++ b/rpcs3/Emu/SysCalls/SyncPrimitivesManager.h @@ -12,7 +12,7 @@ struct SemaphoreAttributes u32 max_count; SemaphoreAttributes() {} - SemaphoreAttributes(const std::string& _name, const u32 _count, const u32 _max_count) : name(_name), count(_count), max_count(_max_count) {} + SemaphoreAttributes(const std::string& _name, u32 _count, u32 _max_count) : name(_name), count(_count), max_count(_max_count) {} }; struct LwMutexAttributes @@ -22,15 +22,13 @@ struct LwMutexAttributes std::string status; // TODO: check status? LwMutexAttributes() {} - LwMutexAttributes(const std::string& _name, const u32 _owner_id, const std::string& _status = "INITIALIZED") + LwMutexAttributes(const std::string& _name, u32 _owner_id, std::string _status = "INITIALIZED") : name(_name), owner_id(_owner_id), status(_status) {} }; class SyncPrimManager { private: - std::mutex m_mutex; - std::map m_cond_name; std::map m_mutex_name; std::map m_lw_cond_name; @@ -42,78 +40,71 @@ public: // semaphores void AddSemaphoreData(const u32 id, const std::string& name, const u32 count, const u32 max_count) { - std::lock_guard lock(m_mutex); m_semaph_attr[id] = *(new SemaphoreAttributes(name, count, max_count)); } void EraseSemaphoreData(const u32 id) { - std::lock_guard lock(m_mutex); m_semaph_attr.erase(id); } SemaphoreAttributes& GetSemaphoreData(const u32 id) { - std::lock_guard lock(m_mutex); return m_semaph_attr[id]; } // lw_mutexes void AddLwMutexData(const u32 id, const std::string& name, const u32 owner_id) { - std::lock_guard lock(m_mutex); m_lw_mutex_attr[id] = *(new LwMutexAttributes(name, owner_id)); } void EraseLwMutexData(const u32 id) { - std::lock_guard lock(m_mutex); m_lw_mutex_attr.erase(id); } LwMutexAttributes& GetLwMutexData(const u32 id) { - std::lock_guard lock(m_mutex); return m_lw_mutex_attr[id]; } // lw_conditions, mutexes, conditions void AddSyncPrimData(const IDType type, const u32 id, const std::string& name) { - std::lock_guard lock(m_mutex); switch (type) { case TYPE_LWCOND: m_lw_cond_name[id] = name; break; case TYPE_MUTEX: m_mutex_name[id] = name; break; case TYPE_COND: m_cond_name[id] = name; break; - default: LOG_ERROR(GENERAL, "Unknown IDType = %d", type); break; + default: LOG_ERROR(GENERAL, "Unknown IDType = %d", type); } } void EraseSyncPrimData(const IDType type, const u32 id) { - std::lock_guard lock(m_mutex); switch (type) { case TYPE_LWCOND: m_lw_cond_name.erase(id); break; case TYPE_MUTEX: m_mutex_name.erase(id); break; case TYPE_COND: m_cond_name.erase(id); break; - default: LOG_ERROR(GENERAL, "Unknown IDType = %d", type); break; + default: LOG_ERROR(GENERAL, "Unknown IDType = %d", type); } } - std::string GetSyncPrimName(const IDType type, const u32 id) + const std::string& GetSyncPrimName(const IDType type, const u32 id) { - std::lock_guard lock(m_mutex); + static const std::string empty = ""; + switch (type) { case TYPE_LWCOND: return m_lw_cond_name[id]; case TYPE_MUTEX: return m_mutex_name[id]; case TYPE_COND: return m_cond_name[id]; - default: return fmt::Format("Unknown IDType = %d", type); + default: LOG_ERROR(GENERAL, "Unknown IDType = %d", type); return empty; } } diff --git a/rpcs3/Emu/SysCalls/SysCalls.cpp b/rpcs3/Emu/SysCalls/SysCalls.cpp index 377ab0970e..f055985e88 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.cpp +++ b/rpcs3/Emu/SysCalls/SysCalls.cpp @@ -31,7 +31,7 @@ namespace detail{ template<> bool CheckId(u32 id, ID*& _id,const std::string &name) { - return Emu.GetIdManager().CheckID(id) && (_id = &Emu.GetIdManager().GetID(id))->m_name == name; + return Emu.GetIdManager().CheckID(id) && (_id = &Emu.GetIdManager().GetID(id))->GetName() == name; } } diff --git a/rpcs3/Emu/SysCalls/SysCalls.h b/rpcs3/Emu/SysCalls/SysCalls.h index bfeeed3434..f01e33ed14 100644 --- a/rpcs3/Emu/SysCalls/SysCalls.h +++ b/rpcs3/Emu/SysCalls/SysCalls.h @@ -12,7 +12,7 @@ namespace detail{ { ID* id_data; if(!CheckId(id, id_data,name)) return false; - data = id_data->m_data->get(); + data = id_data->GetData()->get(); return true; } @@ -40,7 +40,7 @@ public: bool CheckId(u32 id) const { - return GetIdManager().CheckID(id) && GetIdManager().GetID(id).m_name == GetName(); + return GetIdManager().CheckID(id) && GetIdManager().GetID(id).GetName() == GetName(); } template diff --git a/rpcs3/Emu/SysCalls/lv2/lv2Fs.cpp b/rpcs3/Emu/SysCalls/lv2/lv2Fs.cpp index e7dceb38c6..d0d9400761 100644 --- a/rpcs3/Emu/SysCalls/lv2/lv2Fs.cpp +++ b/rpcs3/Emu/SysCalls/lv2/lv2Fs.cpp @@ -30,7 +30,7 @@ struct FsRingBufferConfig } fs_config; -s32 cellFsOpen(vm::ptr path, s32 flags, vm::ptr> fd, vm::ptr> arg, u64 size) +s32 cellFsOpen(vm::ptr path, s32 flags, vm::ptr> fd, vm::ptr arg, u64 size) { sys_fs->Log("cellFsOpen(path=\"%s\", flags=0x%x, fd_addr=0x%x, arg_addr=0x%x, size=0x%llx)", path.get_ptr(), flags, fd.addr(), arg.addr(), size); @@ -137,7 +137,7 @@ s32 cellFsRead(u32 fd, vm::ptr buf, u64 nbytes, vm::ptr> nread) return CELL_OK; } -s32 cellFsWrite(u32 fd, vm::ptr buf, u64 nbytes, vm::ptr> nwrite) +s32 cellFsWrite(u32 fd, vm::ptr buf, u64 nbytes, vm::ptr nwrite) { sys_fs->Log("cellFsWrite(fd=%d, buf_addr=0x%x, nbytes=0x%llx, nwrite_addr=0x%x)", fd, buf.addr(), nbytes, nwrite.addr()); @@ -170,7 +170,7 @@ s32 cellFsClose(u32 fd) return CELL_OK; } -s32 cellFsOpendir(vm::ptr path, vm::ptr> fd) +s32 cellFsOpendir(vm::ptr path, vm::ptr fd) { sys_fs->Warning("cellFsOpendir(path=\"%s\", fd_addr=0x%x)", path.get_ptr(), fd.addr()); @@ -187,7 +187,7 @@ s32 cellFsOpendir(vm::ptr path, vm::ptr> fd) return CELL_OK; } -s32 cellFsReaddir(u32 fd, vm::ptr dir, vm::ptr> nread) +s32 cellFsReaddir(u32 fd, vm::ptr dir, vm::ptr nread) { sys_fs->Warning("cellFsReaddir(fd=%d, dir_addr=0x%x, nread_addr=0x%x)", fd, dir.addr(), nread.addr()); @@ -305,7 +305,7 @@ s32 cellFsMkdir(vm::ptr path, u32 mode) const std::string _path = path.get_ptr(); - if(Emu.GetVFS().ExistsDir(_path)) + if(vfsDir().IsExists(_path)) return CELL_EEXIST; if(!Emu.GetVFS().CreateDir(_path)) return CELL_EBUSY; @@ -395,7 +395,7 @@ s32 cellFsUnlink(vm::ptr path) std::string _path = path.get_ptr(); - if (Emu.GetVFS().ExistsDir(_path)) + if (vfsDir().IsExists(_path)) return CELL_EISDIR; if (!Emu.GetVFS().ExistsFile(_path)) @@ -496,7 +496,7 @@ s32 cellFsTruncate(vm::ptr path, u64 size) return CELL_OK; } -s32 cellFsFGetBlockSize(u32 fd, vm::ptr> sector_size, vm::ptr> block_size) +s32 cellFsFGetBlockSize(u32 fd, vm::ptr sector_size, vm::ptr block_size) { sys_fs->Warning("cellFsFGetBlockSize(fd=%d, sector_size_addr=0x%x, block_size_addr=0x%x)", fd, sector_size.addr(), block_size.addr()); @@ -512,7 +512,7 @@ s32 cellFsFGetBlockSize(u32 fd, vm::ptr> sector_size, vm::ptr path, vm::ptr> sector_size, vm::ptr> block_size) +s32 cellFsGetBlockSize(vm::ptr path, vm::ptr sector_size, vm::ptr block_size) { sys_fs->Warning("cellFsGetBlockSize(file='%s', sector_size_addr=0x%x, block_size_addr=0x%x)", path.get_ptr(), sector_size.addr(), block_size.addr()); @@ -525,7 +525,7 @@ s32 cellFsGetBlockSize(vm::ptr path, vm::ptr> sector_size, return CELL_OK; } -s32 cellFsGetFreeSize(vm::ptr path, vm::ptr> block_size, vm::ptr> block_count) +s32 cellFsGetFreeSize(vm::ptr path, vm::ptr block_size, vm::ptr block_count) { sys_fs->Warning("cellFsGetFreeSize(path=\"%s\", block_size_addr=0x%x, block_count_addr=0x%x)", path.get_ptr(), block_size.addr(), block_count.addr()); @@ -539,7 +539,7 @@ s32 cellFsGetFreeSize(vm::ptr path, vm::ptr> block_size, v return CELL_OK; } -s32 cellFsGetDirectoryEntries(u32 fd, vm::ptr entries, u32 entries_size, vm::ptr> data_count) +s32 cellFsGetDirectoryEntries(u32 fd, vm::ptr entries, u32 entries_size, vm::ptr data_count) { sys_fs->Warning("cellFsGetDirectoryEntries(fd=%d, entries_addr=0x%x, entries_size=0x%x, data_count_addr=0x%x)", fd, entries.addr(), entries_size, data_count.addr()); @@ -637,7 +637,7 @@ s32 cellFsStReadGetRingBuf(u32 fd, vm::ptr ringbuf) return CELL_OK; } -s32 cellFsStReadGetStatus(u32 fd, vm::ptr> status) +s32 cellFsStReadGetStatus(u32 fd, vm::ptr status) { sys_fs->Warning("cellFsStReadGetRingBuf(fd=%d, status_addr=0x%x)", fd, status.addr()); @@ -651,7 +651,7 @@ s32 cellFsStReadGetStatus(u32 fd, vm::ptr> status) return CELL_OK; } -s32 cellFsStReadGetRegid(u32 fd, vm::ptr> regid) +s32 cellFsStReadGetRegid(u32 fd, vm::ptr regid) { sys_fs->Warning("cellFsStReadGetRingBuf(fd=%d, regid_addr=0x%x)", fd, regid.addr()); @@ -694,7 +694,7 @@ s32 cellFsStReadStop(u32 fd) return CELL_OK; } -s32 cellFsStRead(u32 fd, u32 buf_addr, u64 size, vm::ptr> rsize) +s32 cellFsStRead(u32 fd, u32 buf_addr, u64 size, vm::ptr rsize) { sys_fs->Warning("cellFsStRead(fd=%d, buf_addr=0x%x, size=0x%llx, rsize_addr=0x%x)", fd, buf_addr, size, rsize.addr()); @@ -714,7 +714,7 @@ s32 cellFsStRead(u32 fd, u32 buf_addr, u64 size, vm::ptr> rsize) return CELL_OK; } -s32 cellFsStReadGetCurrentAddr(u32 fd, vm::ptr> addr, vm::ptr> size) +s32 cellFsStReadGetCurrentAddr(u32 fd, vm::ptr addr, vm::ptr size) { sys_fs->Todo("cellFsStReadGetCurrentAddr(fd=%d, addr_addr=0x%x, size_addr=0x%x)", fd, addr.addr(), size.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/lv2Fs.h b/rpcs3/Emu/SysCalls/lv2/lv2Fs.h index c7cf8814fe..6adb71cdc9 100644 --- a/rpcs3/Emu/SysCalls/lv2/lv2Fs.h +++ b/rpcs3/Emu/SysCalls/lv2/lv2Fs.h @@ -128,12 +128,12 @@ struct CellFsRingBuffer }; // SysCalls -s32 cellFsOpen(vm::ptr path, s32 flags, vm::ptr> fd, vm::ptr> arg, u64 size); +s32 cellFsOpen(vm::ptr path, s32 flags, vm::ptr> fd, vm::ptr arg, u64 size); s32 cellFsRead(u32 fd, vm::ptr buf, u64 nbytes, vm::ptr> nread); -s32 cellFsWrite(u32 fd, vm::ptr buf, u64 nbytes, vm::ptr> nwrite); +s32 cellFsWrite(u32 fd, vm::ptr buf, u64 nbytes, vm::ptr nwrite); s32 cellFsClose(u32 fd); -s32 cellFsOpendir(vm::ptr path, vm::ptr> fd); -s32 cellFsReaddir(u32 fd, vm::ptr dir, vm::ptr> nread); +s32 cellFsOpendir(vm::ptr path, vm::ptr fd); +s32 cellFsReaddir(u32 fd, vm::ptr dir, vm::ptr nread); s32 cellFsClosedir(u32 fd); s32 cellFsStat(vm::ptr path, vm::ptr sb); s32 cellFsFstat(u32 fd, vm::ptr sb); @@ -146,19 +146,19 @@ s32 cellFsUnlink(vm::ptr path); s32 cellFsLseek(u32 fd, s64 offset, u32 whence, vm::ptr> pos); s32 cellFsFtruncate(u32 fd, u64 size); s32 cellFsTruncate(vm::ptr path, u64 size); -s32 cellFsFGetBlockSize(u32 fd, vm::ptr> sector_size, vm::ptr> block_size); -s32 cellFsGetBlockSize(vm::ptr path, vm::ptr> sector_size, vm::ptr> block_size); -s32 cellFsGetFreeSize(vm::ptr path, vm::ptr> block_size, vm::ptr> block_count); -s32 cellFsGetDirectoryEntries(u32 fd, vm::ptr entries, u32 entries_size, vm::ptr> data_count); +s32 cellFsFGetBlockSize(u32 fd, vm::ptr sector_size, vm::ptr block_size); +s32 cellFsGetBlockSize(vm::ptr path, vm::ptr sector_size, vm::ptr block_size); +s32 cellFsGetFreeSize(vm::ptr path, vm::ptr block_size, vm::ptr block_count); +s32 cellFsGetDirectoryEntries(u32 fd, vm::ptr entries, u32 entries_size, vm::ptr data_count); s32 cellFsStReadInit(u32 fd, vm::ptr ringbuf); s32 cellFsStReadFinish(u32 fd); s32 cellFsStReadGetRingBuf(u32 fd, vm::ptr ringbuf); -s32 cellFsStReadGetStatus(u32 fd, vm::ptr> status); -s32 cellFsStReadGetRegid(u32 fd, vm::ptr> regid); +s32 cellFsStReadGetStatus(u32 fd, vm::ptr status); +s32 cellFsStReadGetRegid(u32 fd, vm::ptr regid); s32 cellFsStReadStart(u32 fd, u64 offset, u64 size); s32 cellFsStReadStop(u32 fd); -s32 cellFsStRead(u32 fd, u32 buf_addr, u64 size, vm::ptr> rsize); -s32 cellFsStReadGetCurrentAddr(u32 fd, vm::ptr> addr_addr, vm::ptr> size); +s32 cellFsStRead(u32 fd, u32 buf_addr, u64 size, vm::ptr rsize); +s32 cellFsStReadGetCurrentAddr(u32 fd, vm::ptr addr_addr, vm::ptr size); s32 cellFsStReadPutCurrentAddr(u32 fd, u32 addr_addr, u64 size); s32 cellFsStReadWait(u32 fd, u64 size); s32 cellFsStReadWaitCallback(u32 fd, u64 size, vm::ptr func); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_cond.cpp b/rpcs3/Emu/SysCalls/lv2/sys_cond.cpp index 7f21a920e7..ab53f0699a 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_cond.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_cond.cpp @@ -9,11 +9,13 @@ SysCallBase sys_cond("sys_cond"); -s32 sys_cond_create(vm::ptr> cond_id, u32 mutex_id, vm::ptr attr) +s32 sys_cond_create(vm::ptr cond_id, u32 mutex_id, vm::ptr attr) { sys_cond.Log("sys_cond_create(cond_id_addr=0x%x, mutex_id=%d, attr_addr=0x%x)", cond_id.addr(), mutex_id, attr.addr()); + LV2_LOCK(0); + if (attr->pshared.ToBE() != se32(0x200)) { sys_cond.Error("Invalid pshared attribute(0x%x)", (u32)attr->pshared); @@ -45,6 +47,8 @@ s32 sys_cond_destroy(u32 cond_id) { sys_cond.Warning("sys_cond_destroy(cond_id=%d)", cond_id); + LV2_LOCK(0); + Cond* cond; if (!Emu.GetIdManager().GetIDData(cond_id, cond)) { @@ -76,9 +80,7 @@ s32 sys_cond_signal(u32 cond_id) if (u32 target = (mutex->protocol == SYS_SYNC_PRIORITY ? cond->m_queue.pop_prio() : cond->m_queue.pop())) { - //cond->signal_stamp = get_system_time(); cond->signal.lock(target); - Emu.GetCPU().NotifyThread(target); if (Emu.IsStopped()) { @@ -104,9 +106,7 @@ s32 sys_cond_signal_all(u32 cond_id) while (u32 target = (mutex->protocol == SYS_SYNC_PRIORITY ? cond->m_queue.pop_prio() : cond->m_queue.pop())) { cond->signaler = GetCurrentPPUThread().GetId(); - //cond->signal_stamp = get_system_time(); cond->signal.lock(target); - Emu.GetCPU().NotifyThread(target); if (Emu.IsStopped()) { @@ -143,9 +143,7 @@ s32 sys_cond_signal_to(u32 cond_id, u32 thread_id) u32 target = thread_id; { - //cond->signal_stamp = get_system_time(); cond->signal.lock(target); - Emu.GetCPU().NotifyThread(target); } if (Emu.IsStopped()) @@ -191,7 +189,6 @@ s32 sys_cond_wait(u32 cond_id, u64 timeout) { if (cond->signal.unlock(tid, tid) == SMR_OK) { - //const u64 stamp2 = get_system_time(); if (SMutexResult res = mutex->m_mutex.trylock(tid)) { if (res != SMR_FAILED) @@ -211,14 +208,11 @@ s32 sys_cond_wait(u32 cond_id, u64 timeout) } } mutex->recursive = 1; - const volatile u64 stamp = cond->signal_stamp; cond->signal.unlock(tid); - Emu.GetCPU().NotifyThread(cond->signaler); - //ConLog.Write("sys_cond_wait(): signal latency %lld (minimum %lld)", get_system_time() - stamp, stamp2 - stamp); return CELL_OK; } - SM_Sleep(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); if (counter++ > max_counter) { diff --git a/rpcs3/Emu/SysCalls/lv2/sys_cond.h b/rpcs3/Emu/SysCalls/lv2/sys_cond.h index 3ed2c93eca..f1278a484d 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_cond.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_cond.h @@ -27,11 +27,12 @@ struct Cond , m_queue(name) , signaler(0) { + signal.initialize(); } }; // SysCalls -s32 sys_cond_create(vm::ptr> cond_id, u32 mutex_id, vm::ptr attr); +s32 sys_cond_create(vm::ptr cond_id, u32 mutex_id, vm::ptr attr); s32 sys_cond_destroy(u32 cond_id); s32 sys_cond_wait(u32 cond_id, u64 timeout); s32 sys_cond_signal(u32 cond_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event.cpp b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp index 76a73b0f26..701c827c40 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_event.cpp @@ -10,7 +10,24 @@ SysCallBase sys_event("sys_event"); -s32 sys_event_queue_create(vm::ptr> equeue_id, vm::ptr attr, u64 event_queue_key, int size) +u32 event_queue_create(u32 protocol, s32 type, u64 name_u64, u64 event_queue_key, s32 size) +{ + EventQueue* eq = new EventQueue(protocol, type, name_u64, event_queue_key, size); + + if (event_queue_key && !Emu.GetEventManager().RegisterKey(eq, event_queue_key)) + { + delete eq; + return 0; + } + + std::string name((const char*)&name_u64, 8); + u32 id = sys_event.GetNewId(eq, TYPE_EVENT_QUEUE); + sys_event.Warning("*** event_queue created [%s] (protocol=0x%x, type=0x%x, key=0x%llx, size=0x%x): id = %d", + name.c_str(), protocol, type, event_queue_key, size, id); + return id; +} + +s32 sys_event_queue_create(vm::ptr equeue_id, vm::ptr attr, u64 event_queue_key, s32 size) { sys_event.Warning("sys_event_queue_create(equeue_id_addr=0x%x, attr_addr=0x%x, event_queue_key=0x%llx, size=%d)", equeue_id.addr(), attr.addr(), event_queue_key, size); @@ -33,7 +50,7 @@ s32 sys_event_queue_create(vm::ptr> equeue_id, vm::ptrtype); return CELL_EINVAL; + default: sys_event.Error("Unknown 0x%x type attr", (s32)attr->type); return CELL_EINVAL; } if (event_queue_key && Emu.GetEventManager().CheckKey(event_queue_key)) @@ -41,20 +58,13 @@ s32 sys_event_queue_create(vm::ptr> equeue_id, vm::ptrprotocol, (int)attr->type, attr->name_u64, event_queue_key, size); - - if (event_queue_key && !Emu.GetEventManager().RegisterKey(eq, event_queue_key)) + if (u32 id = event_queue_create(attr->protocol, attr->type, attr->name_u64, event_queue_key, size)) { - delete eq; - return CELL_EAGAIN; + *equeue_id = id; + return CELL_OK; } - u32 id = sys_event.GetNewId(eq, TYPE_EVENT_QUEUE); - *equeue_id = id; - sys_event.Warning("*** event_queue created [%s] (protocol=0x%x, type=0x%x): id = %d", - std::string(attr->name, 8).c_str(), (u32)attr->protocol, (int)attr->type, id); - - return CELL_OK; + return CELL_EAGAIN; } s32 sys_event_queue_destroy(u32 equeue_id, int mode) @@ -102,7 +112,7 @@ s32 sys_event_queue_destroy(u32 equeue_id, int mode) return CELL_OK; } -s32 sys_event_queue_tryreceive(u32 equeue_id, vm::ptr event_array, int size, vm::ptr> number) +s32 sys_event_queue_tryreceive(u32 equeue_id, vm::ptr event_array, s32 size, vm::ptr number) { sys_event.Todo("sys_event_queue_tryreceive(equeue_id=%d, event_array_addr=0x%x, size=%d, number_addr=0x%x)", equeue_id, event_array.addr(), size, number.addr()); @@ -141,10 +151,11 @@ s32 sys_event_queue_tryreceive(u32 equeue_id, vm::ptr event_arra return CELL_OK; } -s32 sys_event_queue_receive(u32 equeue_id, vm::ptr event, u64 timeout) +s32 sys_event_queue_receive(u32 equeue_id, vm::ptr dummy_event, u64 timeout) { - sys_event.Log("sys_event_queue_receive(equeue_id=%d, event_addr=0x%x, timeout=%lld)", - equeue_id, event.addr(), timeout); + // dummy_event argument is ignored, data returned in registers + sys_event.Log("sys_event_queue_receive(equeue_id=%d, dummy_event_addr=0x%x, timeout=%lld)", + equeue_id, dummy_event.addr(), timeout); EventQueue* eq; if (!Emu.GetIdManager().GetIDData(equeue_id, eq)) @@ -183,19 +194,20 @@ s32 sys_event_queue_receive(u32 equeue_id, vm::ptr event, u64 ti } } case SMR_SIGNAL: - { - eq->events.pop(*event); - eq->owner.unlock(tid); - sys_event.Log(" *** event received: source=0x%llx, d1=0x%llx, d2=0x%llx, d3=0x%llx", - (u64)event->source, (u64)event->data1, (u64)event->data2, (u64)event->data3); - /* passing event data in registers */ - PPUThread& t = GetCurrentPPUThread(); - t.GPR[4] = event->source; - t.GPR[5] = event->data1; - t.GPR[6] = event->data2; - t.GPR[7] = event->data3; - return CELL_OK; - } + { + sys_event_data event; + eq->events.pop(event); + eq->owner.unlock(tid); + sys_event.Log(" *** event received: source=0x%llx, d1=0x%llx, d2=0x%llx, d3=0x%llx", + (u64)event.source, (u64)event.data1, (u64)event.data2, (u64)event.data3); + /* passing event data in registers */ + PPUThread& t = GetCurrentPPUThread(); + t.GPR[4] = event.source; + t.GPR[5] = event.data1; + t.GPR[6] = event.data2; + t.GPR[7] = event.data3; + return CELL_OK; + } case SMR_FAILED: break; default: eq->sq.invalidate(tid); return CELL_ECANCELED; } @@ -225,7 +237,16 @@ s32 sys_event_queue_drain(u32 equeue_id) return CELL_OK; } -s32 sys_event_port_create(vm::ptr> eport_id, int port_type, u64 name) +u32 event_port_create(u64 name) +{ + EventPort* eport = new EventPort(); + u32 id = sys_event.GetNewId(eport, TYPE_EVENT_PORT); + eport->name = name ? name : ((u64)process_getpid() << 32) | (u64)id; + sys_event.Warning("*** sys_event_port created: id = %d", id); + return id; +} + +s32 sys_event_port_create(vm::ptr eport_id, s32 port_type, u64 name) { sys_event.Warning("sys_event_port_create(eport_id_addr=0x%x, port_type=0x%x, name=0x%llx)", eport_id.addr(), port_type, name); @@ -236,12 +257,7 @@ s32 sys_event_port_create(vm::ptr> eport_id, int port_type, u64 name) return CELL_EINVAL; } - EventPort* eport = new EventPort(); - u32 id = sys_event.GetNewId(eport, TYPE_EVENT_PORT); - eport->name = name ? name : ((u64)process_getpid() << 32) | (u64)id; - *eport_id = id; - sys_event.Warning("*** sys_event_port created: id = %d", id); - + *eport_id = event_port_create(name); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event.h b/rpcs3/Emu/SysCalls/lv2/sys_event.h index c379370d45..61180f5982 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_event.h @@ -37,7 +37,7 @@ enum EventSourceKey : u64 struct sys_event_queue_attr { be_t protocol; // SYS_SYNC_PRIORITY or SYS_SYNC_FIFO - be_t type; // SYS_PPU_QUEUE or SYS_SPU_QUEUE + be_t type; // SYS_PPU_QUEUE or SYS_SPU_QUEUE union { char name[8]; @@ -212,17 +212,22 @@ struct EventQueue , key(key) , events(size) // size: max event count this queue can hold { + owner.initialize(); } }; +// Aux +u32 event_port_create(u64 name); +u32 event_queue_create(u32 protocol, s32 type, u64 name_u64, u64 event_queue_key, s32 size); + // SysCalls -s32 sys_event_queue_create(vm::ptr> equeue_id, vm::ptr attr, u64 event_queue_key, int size); -s32 sys_event_queue_destroy(u32 equeue_id, int mode); -s32 sys_event_queue_receive(u32 equeue_id, vm::ptr event, u64 timeout); -s32 sys_event_queue_tryreceive(u32 equeue_id, vm::ptr event_array, int size, vm::ptr> number); +s32 sys_event_queue_create(vm::ptr equeue_id, vm::ptr attr, u64 event_queue_key, s32 size); +s32 sys_event_queue_destroy(u32 equeue_id, s32 mode); +s32 sys_event_queue_receive(u32 equeue_id, vm::ptr dummy_event, u64 timeout); +s32 sys_event_queue_tryreceive(u32 equeue_id, vm::ptr event_array, s32 size, vm::ptr number); s32 sys_event_queue_drain(u32 event_queue_id); -s32 sys_event_port_create(vm::ptr> eport_id, int port_type, u64 name); +s32 sys_event_port_create(vm::ptr eport_id, s32 port_type, u64 name); s32 sys_event_port_destroy(u32 eport_id); s32 sys_event_port_connect_local(u32 event_port_id, u32 event_queue_id); s32 sys_event_port_disconnect(u32 eport_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event_flag.cpp b/rpcs3/Emu/SysCalls/lv2/sys_event_flag.cpp index 22cd01956a..336c88c4bb 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event_flag.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_event_flag.cpp @@ -37,11 +37,23 @@ u32 EventFlag::check() return target; } -s32 sys_event_flag_create(vm::ptr> eflag_id, vm::ptr attr, u64 init) +s32 sys_event_flag_create(vm::ptr eflag_id, vm::ptr attr, u64 init) { sys_event_flag.Warning("sys_event_flag_create(eflag_id_addr=0x%x, attr_addr=0x%x, init=0x%llx)", eflag_id.addr(), attr.addr(), init); + if (eflag_id.addr() == NULL) + { + sys_event_flag.Error("sys_event_flag_create(): invalid memory access (eflag_id_addr=0x%x)", eflag_id.addr()); + return CELL_EFAULT; + } + + if (attr.addr() == NULL) + { + sys_event_flag.Error("sys_event_flag_create(): invalid memory access (attr_addr=0x%x)", attr.addr()); + return CELL_EFAULT; + } + switch (attr->protocol.ToBE()) { case se32(SYS_SYNC_PRIORITY): break; @@ -88,7 +100,7 @@ s32 sys_event_flag_destroy(u32 eflag_id) return CELL_OK; } -s32 sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr> result, u64 timeout) +s32 sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr result, u64 timeout) { sys_event_flag.Log("sys_event_flag_wait(eflag_id=%d, bitptn=0x%llx, mode=0x%x, result_addr=0x%x, timeout=%lld)", eflag_id, bitptn, mode, result.addr(), timeout); @@ -225,7 +237,7 @@ s32 sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr> r } } -s32 sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr> result) +s32 sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr result) { sys_event_flag.Log("sys_event_flag_trywait(eflag_id=%d, bitptn=0x%llx, mode=0x%x, result_addr=0x%x)", eflag_id, bitptn, mode, result.addr()); @@ -316,7 +328,7 @@ s32 sys_event_flag_clear(u32 eflag_id, u64 bitptn) return CELL_OK; } -s32 sys_event_flag_cancel(u32 eflag_id, vm::ptr> num) +s32 sys_event_flag_cancel(u32 eflag_id, vm::ptr num) { sys_event_flag.Log("sys_event_flag_cancel(eflag_id=%d, num_addr=0x%x)", eflag_id, num.addr()); @@ -354,10 +366,16 @@ s32 sys_event_flag_cancel(u32 eflag_id, vm::ptr> num) return CELL_OK; } -s32 sys_event_flag_get(u32 eflag_id, vm::ptr> flags) +s32 sys_event_flag_get(u32 eflag_id, vm::ptr flags) { sys_event_flag.Log("sys_event_flag_get(eflag_id=%d, flags_addr=0x%x)", eflag_id, flags.addr()); + if (flags.addr() == NULL) + { + sys_event_flag.Error("sys_event_flag_create(): invalid memory access (flags_addr=0x%x)", flags.addr()); + return CELL_EFAULT; + } + EventFlag* ef; if (!sys_event_flag.CheckId(eflag_id, ef)) return CELL_ESRCH; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h b/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h index 90a4fc7a54..05309fb748 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_event_flag.h @@ -45,16 +45,18 @@ struct EventFlag , m_protocol(protocol) , m_type(type) { + m_mutex.initialize(); + signal.initialize(); } u32 check(); }; -s32 sys_event_flag_create(vm::ptr> eflag_id, vm::ptr attr, u64 init); +s32 sys_event_flag_create(vm::ptr eflag_id, vm::ptr attr, u64 init); s32 sys_event_flag_destroy(u32 eflag_id); -s32 sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr> result, u64 timeout); -s32 sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr> result); +s32 sys_event_flag_wait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr result, u64 timeout); +s32 sys_event_flag_trywait(u32 eflag_id, u64 bitptn, u32 mode, vm::ptr result); s32 sys_event_flag_set(u32 eflag_id, u64 bitptn); s32 sys_event_flag_clear(u32 eflag_id, u64 bitptn); -s32 sys_event_flag_cancel(u32 eflag_id, vm::ptr> num); -s32 sys_event_flag_get(u32 eflag_id, vm::ptr> flags); \ No newline at end of file +s32 sys_event_flag_cancel(u32 eflag_id, vm::ptr num); +s32 sys_event_flag_get(u32 eflag_id, vm::ptr flags); \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp index 94e8cd2eaa..cd7f229b71 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.cpp @@ -37,7 +37,7 @@ s32 sys_interrupt_tag_destroy(u32 intrtag) return CELL_OK; } -s32 sys_interrupt_thread_establish(vm::ptr> ih, u32 intrtag, u64 intrthread, u64 arg) +s32 sys_interrupt_thread_establish(vm::ptr ih, u32 intrtag, u64 intrthread, u64 arg) { sys_interrupt.Warning("sys_interrupt_thread_establish(ih_addr=0x%x, intrtag=%d, intrthread=%lld, arg=0x%llx)", ih.addr(), intrtag, intrthread, arg); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_interrupt.h b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.h index 9ada3e84d7..7cef6ced32 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_interrupt.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_interrupt.h @@ -2,6 +2,6 @@ // SysCalls s32 sys_interrupt_tag_destroy(u32 intrtag); -s32 sys_interrupt_thread_establish(vm::ptr> ih, u32 intrtag, u64 intrthread, u64 arg); +s32 sys_interrupt_thread_establish(vm::ptr ih, u32 intrtag, u64 intrthread, u64 arg); s32 sys_interrupt_thread_disestablish(u32 ih); void sys_interrupt_thread_eoi(); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp index e7c1527d38..a7d277977b 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.cpp @@ -9,27 +9,39 @@ SysCallBase sys_lwcond("sys_lwcond"); +s32 lwcond_create(sys_lwcond_t& lwcond, sys_lwmutex_t& lwmutex, u64 name_u64) +{ + LV2_LOCK(0); + + u32 id = sys_lwcond.GetNewId(new Lwcond(name_u64), TYPE_LWCOND); + u32 addr = Memory.RealToVirtualAddr(&lwmutex); + lwcond.lwmutex.set(addr); + lwcond.lwcond_queue = id; + + std::string name((const char*)&name_u64, 8); + + sys_lwcond.Warning("*** lwcond created [%s] (lwmutex_addr=0x%x): id = %d", + name.c_str(), addr, id); + + Emu.GetSyncPrimManager().AddSyncPrimData(TYPE_LWCOND, id, name); + + return CELL_OK; +} + s32 sys_lwcond_create(vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr) { sys_lwcond.Log("sys_lwcond_create(lwcond_addr=0x%x, lwmutex_addr=0x%x, attr_addr=0x%x)", lwcond.addr(), lwmutex.addr(), attr.addr()); - u32 id = sys_lwcond.GetNewId(new Lwcond(attr->name_u64), TYPE_LWCOND); - lwcond->lwmutex = lwmutex.addr(); - lwcond->lwcond_queue = id; - - sys_lwcond.Warning("*** lwcond created [%s] (lwmutex_addr=0x%x): id = %d", - std::string(attr->name, 8).c_str(), lwmutex.addr(), (u32) lwcond->lwcond_queue); - - Emu.GetSyncPrimManager().AddSyncPrimData(TYPE_LWCOND, id, std::string(attr->name, 8)); - - return CELL_OK; + return lwcond_create(*lwcond, *lwmutex, attr->name_u64); } s32 sys_lwcond_destroy(vm::ptr lwcond) { sys_lwcond.Warning("sys_lwcond_destroy(lwcond_addr=0x%x)", lwcond.addr()); + LV2_LOCK(0); + u32 id = lwcond->lwcond_queue; Lwcond* lw; @@ -58,7 +70,7 @@ s32 sys_lwcond_signal(vm::ptr lwcond) return CELL_ESRCH; } - auto mutex = vm::ptr::make(lwcond->lwmutex); + auto mutex = vm::ptr::make(lwcond->lwmutex.addr()); if (u32 target = (mutex->attribute.ToBE() == se32(SYS_SYNC_PRIORITY) ? lw->m_queue.pop_prio() : lw->m_queue.pop())) { @@ -84,7 +96,7 @@ s32 sys_lwcond_signal_all(vm::ptr lwcond) return CELL_ESRCH; } - auto mutex = vm::ptr::make(lwcond->lwmutex); + auto mutex = vm::ptr::make(lwcond->lwmutex.addr()); while (u32 target = (mutex->attribute.ToBE() == se32(SYS_SYNC_PRIORITY) ? lw->m_queue.pop_prio() : lw->m_queue.pop())) { @@ -144,9 +156,9 @@ s32 sys_lwcond_wait(vm::ptr lwcond, u64 timeout) return CELL_ESRCH; } - auto mutex = vm::ptr::make(lwcond->lwmutex); + auto mutex = vm::ptr::make(lwcond->lwmutex.addr()); u32 tid_le = GetCurrentPPUThread().GetId(); - be_t tid = be_t::MakeFromLE(tid_le); + be_t tid = be_t::make(tid_le); SleepQueue* sq = nullptr; Emu.GetIdManager().GetIDData((u32)mutex->sleep_queue, sq); @@ -168,7 +180,7 @@ s32 sys_lwcond_wait(vm::ptr lwcond, u64 timeout) if (sq) { - mutex->mutex.unlock(tid, be_t::MakeFromLE(mutex->attribute.ToBE() == se32(SYS_SYNC_PRIORITY) ? sq->pop_prio() : sq->pop())); + mutex->mutex.unlock(tid, be_t::make(mutex->attribute.ToBE() == se32(SYS_SYNC_PRIORITY) ? sq->pop_prio() : sq->pop())); } else if (mutex->attribute.ToBE() == se32(SYS_SYNC_RETRY)) { diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h index 8331fc00db..5c34190776 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwcond.h @@ -1,5 +1,7 @@ #pragma once +struct sys_lwmutex_t; + struct sys_lwcond_attribute_t { union @@ -11,7 +13,7 @@ struct sys_lwcond_attribute_t struct sys_lwcond_t { - be_t lwmutex; + vm::bptr lwmutex; be_t lwcond_queue; }; @@ -23,9 +25,13 @@ struct Lwcond Lwcond(u64 name) : m_queue(name) { + signal.initialize(); } }; +// Aux +s32 lwcond_create(sys_lwcond_t& lwcond, sys_lwmutex_t& lwmutex, u64 name_u64); + // SysCalls s32 sys_lwcond_create(vm::ptr lwcond, vm::ptr lwmutex, vm::ptr attr); s32 sys_lwcond_destroy(vm::ptr lwcond); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp index df9829a02d..c6a08033bd 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.cpp @@ -11,49 +11,54 @@ SysCallBase sys_lwmutex("sys_lwmutex"); // TODO: move SleepQueue somewhere +s32 lwmutex_create(sys_lwmutex_t& lwmutex, u32 protocol, u32 recursive, u64 name_u64) +{ + LV2_LOCK(0); + + lwmutex.waiter = ~0; + lwmutex.mutex.initialize(); + lwmutex.attribute = protocol | recursive; + lwmutex.recursive_count = 0; + u32 sq_id = sys_lwmutex.GetNewId(new SleepQueue(name_u64), TYPE_LWMUTEX); + lwmutex.sleep_queue = sq_id; + + std::string name((const char*)&name_u64, 8); + sys_lwmutex.Notice("*** lwmutex created [%s] (attribute=0x%x): sq_id = %d", name.c_str(), protocol | recursive, sq_id); + + Emu.GetSyncPrimManager().AddLwMutexData(sq_id, name, GetCurrentPPUThread().GetId()); + + return CELL_OK; +} + s32 sys_lwmutex_create(vm::ptr lwmutex, vm::ptr attr) { - sys_lwmutex.Log("sys_lwmutex_create(lwmutex_addr=0x%x, lwmutex_attr_addr=0x%x)", - lwmutex.addr(), attr.addr()); + sys_lwmutex.Warning("sys_lwmutex_create(lwmutex_addr=0x%x, attr_addr=0x%x)", lwmutex.addr(), attr.addr()); - switch (attr->attr_recursive.ToBE()) + switch (attr->recursive.ToBE()) { case se32(SYS_SYNC_RECURSIVE): break; case se32(SYS_SYNC_NOT_RECURSIVE): break; - default: sys_lwmutex.Error("Unknown recursive attribute(0x%x)", (u32)attr->attr_recursive); return CELL_EINVAL; + default: sys_lwmutex.Error("Unknown recursive attribute(0x%x)", (u32)attr->recursive); return CELL_EINVAL; } - switch (attr->attr_protocol.ToBE()) + switch (attr->protocol.ToBE()) { case se32(SYS_SYNC_PRIORITY): break; case se32(SYS_SYNC_RETRY): break; case se32(SYS_SYNC_PRIORITY_INHERIT): sys_lwmutex.Error("Invalid SYS_SYNC_PRIORITY_INHERIT protocol attr"); return CELL_EINVAL; case se32(SYS_SYNC_FIFO): break; - default: sys_lwmutex.Error("Unknown protocol attribute(0x%x)", (u32)attr->attr_protocol); return CELL_EINVAL; + default: sys_lwmutex.Error("Unknown protocol attribute(0x%x)", (u32)attr->protocol); return CELL_EINVAL; } - lwmutex->attribute = attr->attr_protocol | attr->attr_recursive; - lwmutex->waiter = 0; - lwmutex->mutex.initialize(); - //lwmutex->waiter = lwmutex->owner.GetOwner(); - lwmutex->pad = 0; - lwmutex->recursive_count = 0; - - u32 sq_id = sys_lwmutex.GetNewId(new SleepQueue(attr->name_u64), TYPE_LWMUTEX); - lwmutex->sleep_queue = sq_id; - - sys_lwmutex.Warning("*** lwmutex created [%s] (attribute=0x%x): sq_id = %d", - std::string(attr->name, 8).c_str(), (u32) lwmutex->attribute, sq_id); - - Emu.GetSyncPrimManager().AddLwMutexData(sq_id, std::string(attr->name, 8), GetCurrentPPUThread().GetId()); - - return CELL_OK; + return lwmutex_create(*lwmutex, attr->protocol, attr->recursive, attr->name_u64); } s32 sys_lwmutex_destroy(vm::ptr lwmutex) { sys_lwmutex.Warning("sys_lwmutex_destroy(lwmutex_addr=0x%x)", lwmutex.addr()); + LV2_LOCK(0); + u32 sq_id = lwmutex->sleep_queue; if (!Emu.GetIdManager().CheckID(sq_id)) return CELL_ESRCH; @@ -77,14 +82,14 @@ s32 sys_lwmutex_lock(vm::ptr lwmutex, u64 timeout) //ConLog.Write("*** lock mutex (addr=0x%x, attr=0x%x, Nrec=%d, owner=%d, waiter=%d)", //lwmutex.addr(), (u32)lwmutex->attribute, (u32)lwmutex->recursive_count, lwmutex->vars.parts.owner.GetOwner(), (u32)lwmutex->waiter); - return lwmutex->lock(be_t::MakeFromLE(GetCurrentPPUThread().GetId()), timeout ? ((timeout < 1000) ? 1 : (timeout / 1000)) : 0); + return lwmutex->lock(be_t::make(GetCurrentPPUThread().GetId()), timeout ? ((timeout < 1000) ? 1 : (timeout / 1000)) : 0); } s32 sys_lwmutex_trylock(vm::ptr lwmutex) { sys_lwmutex.Log("sys_lwmutex_trylock(lwmutex_addr=0x%x)", lwmutex.addr()); - return lwmutex->trylock(be_t::MakeFromLE(GetCurrentPPUThread().GetId())); + return lwmutex->trylock(be_t::make(GetCurrentPPUThread().GetId())); } s32 sys_lwmutex_unlock(vm::ptr lwmutex) @@ -94,7 +99,7 @@ s32 sys_lwmutex_unlock(vm::ptr lwmutex) //ConLog.Write("*** unlocking mutex (addr=0x%x, attr=0x%x, Nrec=%d, owner=%d, waiter=%d)", //lwmutex.addr(), (u32)lwmutex->attribute, (u32)lwmutex->recursive_count, (u32)lwmutex->vars.parts.owner.GetOwner(), (u32)lwmutex->waiter); - return lwmutex->unlock(be_t::MakeFromLE(GetCurrentPPUThread().GetId())); + return lwmutex->unlock(be_t::make(GetCurrentPPUThread().GetId())); } void SleepQueue::push(u32 tid) @@ -290,7 +295,7 @@ int sys_lwmutex_t::unlock(be_t tid) recursive_count -= 1; if (!recursive_count.ToBE()) { - be_t target = be_t::MakeFromBE(se32(0)); + be_t target = be_t::make(0); switch (attribute.ToBE() & se32(SYS_SYNC_ATTR_PROTOCOL_MASK)) { case se32(SYS_SYNC_FIFO): diff --git a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h index 067a317e1b..16a2381f60 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_lwmutex.h @@ -29,8 +29,8 @@ enum struct sys_lwmutex_attribute_t { - be_t attr_protocol; - be_t attr_recursive; + be_t protocol; + be_t recursive; union { char name[8]; @@ -66,19 +66,26 @@ struct SleepQueue struct sys_lwmutex_t { - /* volatile */ SMutexBase> mutex; - /* volatile */ be_t waiter; // not used - u64 &all_info(){return *(reinterpret_cast(this));} + SMutexBase> mutex; + be_t waiter; // currently not used be_t attribute; be_t recursive_count; be_t sleep_queue; be_t pad; + u64& all_info() + { + return *(reinterpret_cast(this)); + } + int trylock(be_t tid); int unlock(be_t tid); int lock(be_t tid, u64 timeout); }; +// Aux +s32 lwmutex_create(sys_lwmutex_t& lwmutex, u32 protocol, u32 recursive, u64 name_u64); + // SysCalls s32 sys_lwmutex_create(vm::ptr lwmutex, vm::ptr attr); s32 sys_lwmutex_destroy(vm::ptr lwmutex); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp index 9f89e0bebb..45526a143b 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_memory.cpp @@ -108,7 +108,7 @@ s32 sys_memory_get_user_memory_size(vm::ptr mem_info) return CELL_OK; } -s32 sys_memory_container_create(vm::ptr> cid, u32 yield_size) +s32 sys_memory_container_create(vm::ptr cid, u32 yield_size) { sys_memory.Warning("sys_memory_container_create(cid_addr=0x%x, yield_size=0x%x)", cid.addr(), yield_size); @@ -154,7 +154,6 @@ s32 sys_memory_container_get_size(vm::ptr mem_info, u32 cid) return CELL_ESRCH; // HACK: Return all memory. - sys_memory_info_t info; mem_info->total_user_memory = ct->size; mem_info->available_user_memory = ct->size; return CELL_OK; diff --git a/rpcs3/Emu/SysCalls/lv2/sys_memory.h b/rpcs3/Emu/SysCalls/lv2/sys_memory.h index fd4c9102b9..f0cf7e7ac4 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_memory.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_memory.h @@ -57,6 +57,6 @@ s32 sys_memory_allocate_from_container(u32 size, u32 cid, u32 flags, u32 alloc_a s32 sys_memory_free(u32 start_addr); s32 sys_memory_get_page_attribute(u32 addr, vm::ptr attr); s32 sys_memory_get_user_memory_size(vm::ptr mem_info); -s32 sys_memory_container_create(vm::ptr> cid, u32 yield_size); +s32 sys_memory_container_create(vm::ptr cid, u32 yield_size); s32 sys_memory_container_destroy(u32 cid); s32 sys_memory_container_get_size(vm::ptr mem_info, u32 cid); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp index bfba1da9a4..ba0242383d 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.cpp @@ -24,13 +24,13 @@ s32 sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_a { default: case SYS_MEMORY_PAGE_SIZE_1M: - if(AlignAddr(size, alignment) & 0xfffff) + if(align(size, alignment) & 0xfffff) return CELL_EALIGN; addr = (u32)Memory.Alloc(size, 0x100000); break; case SYS_MEMORY_PAGE_SIZE_64K: - if(AlignAddr(size, alignment) & 0xffff) + if (align(size, alignment) & 0xffff) return CELL_EALIGN; addr = (u32)Memory.Alloc(size, 0x10000); break; @@ -53,7 +53,7 @@ s32 sys_mmapper_allocate_fixed_address() return CELL_OK; } -s32 sys_mmapper_allocate_memory(u32 size, u64 flags, vm::ptr> mem_id) +s32 sys_mmapper_allocate_memory(u32 size, u64 flags, vm::ptr mem_id) { sys_mmapper.Warning("sys_mmapper_allocate_memory(size=0x%x, flags=0x%llx, mem_id_addr=0x%x)", size, flags, mem_id.addr()); @@ -80,7 +80,7 @@ s32 sys_mmapper_allocate_memory(u32 size, u64 flags, vm::ptr> mem_id) return CELL_OK; } -s32 sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, vm::ptr> mem_id) +s32 sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, vm::ptr mem_id) { sys_mmapper.Warning("sys_mmapper_allocate_memory_from_container(size=0x%x, cid=%d, flags=0x%llx, mem_id_addr=0x%x)", size, cid, flags, mem_id.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.h b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.h index 7e71de3730..608f6b8dac 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_mmapper.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_mmapper.h @@ -22,8 +22,8 @@ struct mmapper_info // SysCalls s32 sys_mmapper_allocate_address(u32 size, u64 flags, u32 alignment, u32 alloc_addr); s32 sys_mmapper_allocate_fixed_address(); -s32 sys_mmapper_allocate_memory(u32 size, u64 flags, vm::ptr> mem_id); -s32 sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, vm::ptr> mem_id); +s32 sys_mmapper_allocate_memory(u32 size, u64 flags, vm::ptr mem_id); +s32 sys_mmapper_allocate_memory_from_container(u32 size, u32 cid, u64 flags, vm::ptr mem_id); s32 sys_mmapper_change_address_access_right(u32 start_addr, u64 flags); s32 sys_mmapper_free_address(u32 start_addr); s32 sys_mmapper_free_memory(u32 mem_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp index 63d4263552..f22dd97d87 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_mutex.cpp @@ -26,10 +26,12 @@ Mutex::~Mutex() m_queue.m_mutex.unlock(); } -s32 sys_mutex_create(vm::ptr> mutex_id, vm::ptr attr) +s32 sys_mutex_create(vm::ptr mutex_id, vm::ptr attr) { sys_mutex.Log("sys_mutex_create(mutex_id_addr=0x%x, attr_addr=0x%x)", mutex_id.addr(), attr.addr()); + LV2_LOCK(0); + switch (attr->protocol.ToBE()) { case se32(SYS_SYNC_FIFO): break; @@ -73,6 +75,8 @@ s32 sys_mutex_destroy(u32 mutex_id) { sys_mutex.Warning("sys_mutex_destroy(mutex_id=%d)", mutex_id); + LV2_LOCK(0); + Mutex* mutex; if (!Emu.GetIdManager().GetIDData(mutex_id, mutex)) { @@ -214,9 +218,8 @@ s32 sys_mutex_trylock(u32 mutex_id) switch (mutex->m_mutex.trylock(tid)) { case SMR_OK: mutex->recursive = 1; t.owned_mutexes++; return CELL_OK; + default: return CELL_EBUSY; } - - return CELL_EBUSY; } s32 sys_mutex_unlock(u32 mutex_id) diff --git a/rpcs3/Emu/SysCalls/lv2/sys_mutex.h b/rpcs3/Emu/SysCalls/lv2/sys_mutex.h index a94ce37eaf..74a7378e63 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_mutex.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_mutex.h @@ -34,13 +34,14 @@ struct Mutex , m_queue(name) , cond_count(0) { + m_mutex.initialize(); } ~Mutex(); }; // SysCalls -s32 sys_mutex_create(vm::ptr> mutex_id, vm::ptr attr); +s32 sys_mutex_create(vm::ptr mutex_id, vm::ptr attr); s32 sys_mutex_destroy(u32 mutex_id); s32 sys_mutex_lock(u32 mutex_id, u64 timeout); s32 sys_mutex_trylock(u32 mutex_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp index c63b93bcfd..3249dd6cd4 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.cpp @@ -3,6 +3,7 @@ #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/Callback.h" +#include "Emu/Memory/atomic_type.h" #include "Emu/CPU/CPUThreadManager.h" #include "Emu/Cell/PPUThread.h" @@ -33,7 +34,7 @@ void sys_ppu_thread_exit(PPUThread& CPU, u64 errorcode) void sys_internal_ppu_thread_exit(PPUThread& CPU, u64 errorcode) { - sys_ppu_thread.Log("sys_internal_ppu_thread_exit(0x%llx)", errorcode); + sys_ppu_thread.Warning("sys_internal_ppu_thread_exit(0x%llx)", errorcode); ppu_thread_exit(CPU, errorcode); } @@ -46,7 +47,7 @@ s32 sys_ppu_thread_yield() return CELL_OK; } -s32 sys_ppu_thread_join(u64 thread_id, vm::ptr> vptr) +s32 sys_ppu_thread_join(u64 thread_id, vm::ptr vptr) { sys_ppu_thread.Warning("sys_ppu_thread_join(thread_id=%lld, vptr_addr=0x%x)", thread_id, vptr.addr()); @@ -147,42 +148,23 @@ s32 sys_ppu_thread_restart(u64 thread_id) return CELL_OK; } -s32 sys_ppu_thread_create(vm::ptr> thread_id, u32 entry, u64 arg, s32 prio, u32 stacksize, u64 flags, vm::ptr threadname) +PPUThread* ppu_thread_create(u32 entry, u64 arg, s32 prio, u32 stacksize, bool is_joinable, bool is_interrupt, const std::string& name, std::function task) { - sys_ppu_thread.Log("sys_ppu_thread_create(thread_id_addr=0x%x, entry=0x%x, arg=0x%llx, prio=%d, stacksize=0x%x, flags=0x%llx, threadname_addr=0x%x('%s'))", - thread_id.addr(), entry, arg, prio, stacksize, flags, threadname.addr(), threadname ? threadname.get_ptr() : ""); - - bool is_joinable = false; - bool is_interrupt = false; - - switch (flags) - { - case 0: break; - case SYS_PPU_THREAD_CREATE_JOINABLE: - { - is_joinable = true; - break; - } - case SYS_PPU_THREAD_CREATE_INTERRUPT: - { - is_interrupt = true; - break; - } - default: sys_ppu_thread.Error("sys_ppu_thread_create(): unknown flags value (0x%llx)", flags); return CELL_EPERM; - } - PPUThread& new_thread = *(PPUThread*)&Emu.GetCPU().AddThread(CPU_THREAD_PPU); - *thread_id = new_thread.GetId(); + u32 id = new_thread.GetId(); new_thread.SetEntry(entry); new_thread.SetPrio(prio); new_thread.SetStackSize(stacksize); //new_thread.flags = flags; new_thread.m_has_interrupt = false; new_thread.m_is_interrupt = is_interrupt; - new_thread.SetName(threadname ? threadname.get_ptr() : ""); + new_thread.SetName(name); + new_thread.custom_task = task; - sys_ppu_thread.Notice("*** New PPU Thread [%s] (flags=0x%llx, entry=0x%x): id = %d", new_thread.GetName().c_str(), flags, entry, new_thread.GetId()); + sys_ppu_thread.Notice("*** New PPU Thread [%s] (%s, entry=0x%x): id = %d", name.c_str(), + is_interrupt ? "interrupt" : + (is_joinable ? "joinable" : "detached"), entry, id); if (!is_interrupt) { @@ -197,21 +179,49 @@ s32 sys_ppu_thread_create(vm::ptr> thread_id, u32 entry, u64 arg, s32 new_thread.DoRun(); } + return &new_thread; +} + +s32 sys_ppu_thread_create(vm::ptr thread_id, u32 entry, u64 arg, s32 prio, u32 stacksize, u64 flags, vm::ptr threadname) +{ + sys_ppu_thread.Log("sys_ppu_thread_create(thread_id_addr=0x%x, entry=0x%x, arg=0x%llx, prio=%d, stacksize=0x%x, flags=0x%llx, threadname_addr=0x%x('%s'))", + thread_id.addr(), entry, arg, prio, stacksize, flags, threadname.addr(), threadname ? threadname.get_ptr() : ""); + + bool is_joinable = false; + bool is_interrupt = false; + + switch (flags) + { + case 0: break; + case SYS_PPU_THREAD_CREATE_JOINABLE: + is_joinable = true; + break; + + case SYS_PPU_THREAD_CREATE_INTERRUPT: + is_interrupt = true; + break; + + default: sys_ppu_thread.Error("sys_ppu_thread_create(): unknown flags value (0x%llx)", flags); return CELL_EPERM; + } + + std::string name = threadname ? threadname.get_ptr() : ""; + + *thread_id = ppu_thread_create(entry, arg, prio, stacksize, is_joinable, is_interrupt, name)->GetId(); return CELL_OK; } -void sys_ppu_thread_once(PPUThread& CPU, vm::ptr>> once_ctrl, vm::ptr init) +void sys_ppu_thread_once(PPUThread& CPU, vm::ptr> once_ctrl, vm::ptr init) { sys_ppu_thread.Warning("sys_ppu_thread_once(once_ctrl_addr=0x%x, init_addr=0x%x)", once_ctrl.addr(), init.addr()); - be_t old = be_t::MakeFromBE(se32(SYS_PPU_THREAD_ONCE_INIT)); - if (once_ctrl->compare_exchange_weak(old, be_t::MakeFromBE(se32(SYS_PPU_THREAD_DONE_INIT)))) + be_t cmp = be_t::make(SYS_PPU_THREAD_ONCE_INIT); + if (once_ctrl->compare_and_swap(cmp, be_t::make(SYS_PPU_THREAD_DONE_INIT)) == cmp) { init.call(CPU); } } -s32 sys_ppu_thread_get_id(PPUThread& CPU, vm::ptr> thread_id) +s32 sys_ppu_thread_get_id(PPUThread& CPU, vm::ptr thread_id) { sys_ppu_thread.Log("sys_ppu_thread_get_id(thread_id_addr=0x%x)", thread_id.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h index 0bbe4aabc3..83fe511b8f 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_ppu_thread.h @@ -1,9 +1,11 @@ #pragma once -enum +class PPUThread; + +enum : u32 { - SYS_PPU_THREAD_ONCE_INIT, - SYS_PPU_THREAD_DONE_INIT, + SYS_PPU_THREAD_ONCE_INIT = 0, + SYS_PPU_THREAD_DONE_INIT = 1, }; enum ppu_thread_flags : u64 @@ -12,11 +14,14 @@ enum ppu_thread_flags : u64 SYS_PPU_THREAD_CREATE_INTERRUPT = 0x2, }; +// Aux +PPUThread* ppu_thread_create(u32 entry, u64 arg, s32 prio, u32 stacksize, bool is_joinable, bool is_interrupt, const std::string& name, std::function task = nullptr); + // SysCalls void sys_ppu_thread_exit(PPUThread& CPU, u64 errorcode); void sys_internal_ppu_thread_exit(PPUThread& CPU, u64 errorcode); s32 sys_ppu_thread_yield(); -s32 sys_ppu_thread_join(u64 thread_id, vm::ptr> vptr); +s32 sys_ppu_thread_join(u64 thread_id, vm::ptr vptr); s32 sys_ppu_thread_detach(u64 thread_id); void sys_ppu_thread_get_join_state(PPUThread& CPU, vm::ptr isjoinable); s32 sys_ppu_thread_set_priority(u64 thread_id, s32 prio); @@ -24,7 +29,7 @@ s32 sys_ppu_thread_get_priority(u64 thread_id, u32 prio_addr); s32 sys_ppu_thread_get_stack_information(PPUThread& CPU, u32 info_addr); s32 sys_ppu_thread_stop(u64 thread_id); s32 sys_ppu_thread_restart(u64 thread_id); -s32 sys_ppu_thread_create(vm::ptr> thread_id, u32 entry, u64 arg, s32 prio, u32 stacksize, u64 flags, vm::ptr threadname); -void sys_ppu_thread_once(PPUThread& CPU, vm::ptr>> once_ctrl, vm::ptr init); -s32 sys_ppu_thread_get_id(PPUThread& CPU, vm::ptr> thread_id); +s32 sys_ppu_thread_create(vm::ptr thread_id, u32 entry, u64 arg, s32 prio, u32 stacksize, u64 flags, vm::ptr threadname); +void sys_ppu_thread_once(PPUThread& CPU, vm::ptr> once_ctrl, vm::ptr init); +s32 sys_ppu_thread_get_id(PPUThread& CPU, vm::ptr thread_id); s32 sys_ppu_thread_rename(u64 thread_id, vm::ptr name); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_process.cpp b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp index 039bbe66b2..964bafcc4b 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_process.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_process.cpp @@ -134,7 +134,7 @@ void sys_game_process_exitspawn2( return; } -s32 sys_process_get_number_of_object(u32 object, vm::ptr> nump) +s32 sys_process_get_number_of_object(u32 object, vm::ptr nump) { sys_process.Warning("sys_process_get_number_of_object(object=%d, nump_addr=0x%x)", object, nump.addr()); @@ -169,7 +169,7 @@ s32 sys_process_get_number_of_object(u32 object, vm::ptr> nump) return CELL_OK; } -s32 sys_process_get_id(u32 object, vm::ptr> buffer, u32 size, vm::ptr> set_size) +s32 sys_process_get_id(u32 object, vm::ptr buffer, u32 size, vm::ptr set_size) { sys_process.Todo("sys_process_get_id(object=%d, buffer_addr=0x%x, size=%d, set_size_addr=0x%x)", object, buffer.addr(), size, set_size.addr()); @@ -258,7 +258,7 @@ s32 process_get_sdk_version(u32 pid, s32& ver) return CELL_OK; } -s32 sys_process_get_sdk_version(u32 pid, vm::ptr> version) +s32 sys_process_get_sdk_version(u32 pid, vm::ptr version) { sys_process.Warning("sys_process_get_sdk_version(pid=%d, version_addr=0x%x)", pid, version.addr()); @@ -281,7 +281,7 @@ s32 sys_process_kill(u32 pid) return CELL_OK; } -s32 sys_process_wait_for_child(u32 pid, vm::ptr> status, u64 unk) +s32 sys_process_wait_for_child(u32 pid, vm::ptr status, u64 unk) { sys_process.Todo("sys_process_wait_for_child(pid=%d, status_addr=0x%x, unk=0x%llx", pid, status.addr(), unk); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_process.h b/rpcs3/Emu/SysCalls/lv2/sys_process.h index faa8194bbe..e7a1240444 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_process.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_process.h @@ -31,15 +31,15 @@ s32 process_is_spu_lock_line_reservation_address(u32 addr, u64 flags); // SysCalls s32 sys_process_getpid(); s32 sys_process_getppid(); -s32 sys_process_get_number_of_object(u32 object, vm::ptr> nump); -s32 sys_process_get_id(u32 object, vm::ptr> buffer, u32 size, vm::ptr> set_size); +s32 sys_process_get_number_of_object(u32 object, vm::ptr nump); +s32 sys_process_get_id(u32 object, vm::ptr buffer, u32 size, vm::ptr set_size); s32 sys_process_get_paramsfo(vm::ptr buffer); -s32 sys_process_get_sdk_version(u32 pid, vm::ptr> version); +s32 sys_process_get_sdk_version(u32 pid, vm::ptr version); s32 sys_process_get_status(u64 unk); s32 sys_process_is_spu_lock_line_reservation_address(u32 addr, u64 flags); s32 sys_process_exit(s32 errorcode); s32 sys_process_kill(u32 pid); -s32 sys_process_wait_for_child(u32 pid, vm::ptr> status, u64 unk); +s32 sys_process_wait_for_child(u32 pid, vm::ptr status, u64 unk); s32 sys_process_wait_for_child2(u64 unk1, u64 unk2, u64 unk3, u64 unk4, u64 unk5, u64 unk6); s32 sys_process_detach_child(u64 unk); void sys_game_process_exitspawn(vm::ptr path, u32 argv_addr, u32 envp_addr, diff --git a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp index 43e1d449e5..efdb47f96c 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_prx.cpp @@ -34,10 +34,10 @@ s32 sys_prx_load_module(vm::ptr path, u64 flags, vm::ptrsize = (u32)f.GetSize(); prx->address = (u32)Memory.Alloc(prx->size, 4); - prx->path = path; + prx->path = (const char*)path; // Load the PRX into memory - f.Read(vm::get_ptr(prx->address), prx->size); + f.Read(vm::get_ptr(prx->address), prx->size); u32 id = sys_prx.GetNewId(prx, TYPE_PRX); return id; @@ -61,7 +61,7 @@ s32 sys_prx_load_module_on_memcontainer_by_fd() return CELL_OK; } -s32 sys_prx_start_module(s32 id, u32 args, u32 argp_addr, vm::ptr> modres, u64 flags, vm::ptr pOpt) +s32 sys_prx_start_module(s32 id, u32 args, u32 argp_addr, vm::ptr modres, u64 flags, vm::ptr pOpt) { sys_prx.Todo("sys_prx_start_module(id=%d, args=%d, argp_addr=0x%x, modres_addr=0x%x, flags=0x%llx, pOpt=0x%x)", id, args, argp_addr, modres.addr(), flags, pOpt.addr()); @@ -76,7 +76,7 @@ s32 sys_prx_start_module(s32 id, u32 args, u32 argp_addr, vm::ptr> mod return CELL_OK; } -s32 sys_prx_stop_module(s32 id, u32 args, u32 argp_addr, vm::ptr> modres, u64 flags, vm::ptr pOpt) +s32 sys_prx_stop_module(s32 id, u32 args, u32 argp_addr, vm::ptr modres, u64 flags, vm::ptr pOpt) { sys_prx.Todo("sys_prx_stop_module(id=%d, args=%d, argp_addr=0x%x, modres_addr=0x%x, flags=0x%llx, pOpt=0x%x)", id, args, argp_addr, modres.addr(), flags, pOpt.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_prx.h b/rpcs3/Emu/SysCalls/lv2/sys_prx.h index 8ff2af9b8f..2e024c1bde 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_prx.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_prx.h @@ -28,11 +28,74 @@ enum CELL_PRX_ERROR_ELF_IS_REGISTERED = 0x80011910, // Fixed ELF is already registered }; +// Information about imported or exported libraries in PRX modules +struct sys_prx_library_info_t +{ + u8 size; + u8 unk0; + be_t version; + be_t attributes; + be_t num_func; + be_t num_var; + be_t num_tlsvar; + u8 info_hash; + u8 info_tlshash; + u8 unk1[2]; + be_t name_addr; + be_t fnid_addr; + be_t fstub_addr; + be_t unk4; + be_t unk5; + be_t unk6; + be_t unk7; +}; + +// ELF file headers +struct sys_prx_param_t +{ + be_t size; + be_t magic; + be_t version; + be_t unk0; + be_t libentstart; + be_t libentend; + vm::bptr libstubstart; + vm::bptr libstubend; + be_t ver; + be_t unk1; + be_t unk2; +}; + +// PRX file headers +struct sys_prx_module_info_t +{ + be_t attributes; + be_t version; + s8 name[28]; + be_t toc; + vm::bptr exports_start; + vm::bptr exports_end; + be_t imports_start; + be_t imports_end; +}; + +// Relocation information of the SCE_PPURELA segment +struct sys_prx_relocation_info_t +{ + be_t offset; + be_t unk0; + u8 index_value; + u8 index_addr; + be_t type; + vm::bptr ptr; +}; + + // Data types struct sys_prx_load_module_option_t { be_t size; - be_t base_addr; // void* + vm::bptr base_addr; }; struct sys_prx_start_module_option_t @@ -69,8 +132,8 @@ s32 sys_prx_load_module(vm::ptr path, u64 flags, vm::ptr> modres, u64 flags, vm::ptr pOpt); -s32 sys_prx_stop_module(s32 id, u32 args, u32 argp_addr, vm::ptr> modres, u64 flags, vm::ptr pOpt); +s32 sys_prx_start_module(s32 id, u32 args, u32 argp_addr, vm::ptr modres, u64 flags, vm::ptr pOpt); +s32 sys_prx_stop_module(s32 id, u32 args, u32 argp_addr, vm::ptr modres, u64 flags, vm::ptr pOpt); s32 sys_prx_unload_module(s32 id, u64 flags, vm::ptr pOpt); s32 sys_prx_get_module_list(); s32 sys_prx_get_my_module_id(); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp index c6e6ec7d53..21b572a4b4 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_rsx.cpp @@ -29,7 +29,7 @@ s32 sys_rsx_device_close() * @param a6 (IN): E.g. Immediate value passed in cellGcmSys is 16. * @param a7 (IN): E.g. Immediate value passed in cellGcmSys is 8. */ -s32 sys_rsx_memory_allocate(vm::ptr> mem_handle, vm::ptr> mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7) +s32 sys_rsx_memory_allocate(vm::ptr mem_handle, vm::ptr mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7) { sys_rsx.Todo("sys_rsx_memory_allocate(mem_handle_addr=0x%x, local_mem_addr=0x%x, size=0x%x, flags=0x%x, a5=%d, a6=%d, a7=%d)", mem_handle.addr(), mem_addr.addr(), size, flags, a5, a6, a7); @@ -55,7 +55,7 @@ s32 sys_rsx_memory_free(u32 mem_handle) * @param mem_ctx (IN): mem_ctx given by sys_rsx_memory_allocate * @param system_mode (IN): */ -s32 sys_rsx_context_allocate(vm::ptr> context_id, vm::ptr> lpar_dma_control, vm::ptr> lpar_driver_info, vm::ptr> lpar_reports, u64 mem_ctx, u64 system_mode) +s32 sys_rsx_context_allocate(vm::ptr context_id, vm::ptr lpar_dma_control, vm::ptr lpar_driver_info, vm::ptr lpar_reports, u64 mem_ctx, u64 system_mode) { sys_rsx.Todo("sys_rsx_context_allocate(context_id_addr=0x%x, lpar_dma_control_addr=0x%x, lpar_driver_info_addr=0x%x, lpar_reports_addr=0x%x, mem_ctx=0x%x, system_mode=0x%x)", context_id.addr(), lpar_dma_control.addr(), lpar_driver_info.addr(), lpar_reports.addr(), mem_ctx, system_mode); @@ -170,7 +170,7 @@ s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u6 * @param a2 (OUT): Unused? * @param dev_id (IN): An immediate value and always 8. (cellGcmInitPerfMon uses 11, 10, 9, 7, 12 successively). */ -s32 sys_rsx_device_map(vm::ptr> a1, vm::ptr> a2, u32 dev_id) +s32 sys_rsx_device_map(vm::ptr a1, vm::ptr a2, u32 dev_id) { sys_rsx.Todo("sys_rsx_device_map(a1_addr=0x%x, a2_addr=0x%x, a3=%d)", a1.addr(), a2.addr(), dev_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rsx.h b/rpcs3/Emu/SysCalls/lv2/sys_rsx.h index 244588c8c7..f44254cef5 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rsx.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_rsx.h @@ -3,13 +3,13 @@ // SysCalls s32 sys_rsx_device_open(); s32 sys_rsx_device_close(); -s32 sys_rsx_memory_allocate(vm::ptr> mem_handle, vm::ptr> mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7); +s32 sys_rsx_memory_allocate(vm::ptr mem_handle, vm::ptr mem_addr, u32 size, u64 flags, u64 a5, u64 a6, u64 a7); s32 sys_rsx_memory_free(u32 mem_handle); -s32 sys_rsx_context_allocate(vm::ptr> context_id, vm::ptr> lpar_dma_control, vm::ptr> lpar_driver_info, vm::ptr> lpar_reports, u64 mem_ctx, u64 system_mode); +s32 sys_rsx_context_allocate(vm::ptr context_id, vm::ptr lpar_dma_control, vm::ptr lpar_driver_info, vm::ptr lpar_reports, u64 mem_ctx, u64 system_mode); s32 sys_rsx_context_free(u32 context_id); s32 sys_rsx_context_iomap(u32 context_id, u32 io, u32 ea, u32 size, u64 flags); s32 sys_rsx_context_iounmap(u32 context_id, u32 a2, u32 io_addr, u32 size); s32 sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 a4, u64 a5, u64 a6); -s32 sys_rsx_device_map(vm::ptr> a1, vm::ptr> a2, u32 dev_id); +s32 sys_rsx_device_map(vm::ptr a1, vm::ptr a2, u32 dev_id); s32 sys_rsx_device_unmap(u32 dev_id); s32 sys_rsx_attribute(); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp index aec4007308..b35ff563ff 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.cpp @@ -9,7 +9,7 @@ SysCallBase sys_rwlock("sys_rwlock"); -s32 sys_rwlock_create(vm::ptr> rw_lock_id, vm::ptr attr) +s32 sys_rwlock_create(vm::ptr rw_lock_id, vm::ptr attr) { sys_rwlock.Warning("sys_rwlock_create(rw_lock_id_addr=0x%x, attr_addr=0x%x)", rw_lock_id.addr(), attr.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_rwlock.h b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.h index 9b3dcff1a3..eab184f21f 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_rwlock.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_rwlock.h @@ -150,7 +150,7 @@ struct RWLock }; // SysCalls -s32 sys_rwlock_create(vm::ptr> rw_lock_id, vm::ptr attr); +s32 sys_rwlock_create(vm::ptr rw_lock_id, vm::ptr attr); s32 sys_rwlock_destroy(u32 rw_lock_id); s32 sys_rwlock_rlock(u32 rw_lock_id, u64 timeout); s32 sys_rwlock_tryrlock(u32 rw_lock_id); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp index a7ddb0468e..d194a0b563 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.cpp @@ -5,17 +5,37 @@ #include "Emu/CPU/CPUThreadManager.h" #include "Emu/Cell/PPUThread.h" -#include "sys_semaphore.h" #include "sys_time.h" -//#include "Utilities/SMutex.h" +#include "sys_semaphore.h" SysCallBase sys_semaphore("sys_semaphore"); -s32 sys_semaphore_create(vm::ptr> sem, vm::ptr attr, int initial_count, int max_count) +u32 semaphore_create(s32 initial_count, s32 max_count, u32 protocol, u64 name_u64) +{ + LV2_LOCK(0); + + const std::string name((const char*)&name_u64, 8); + const u32 id = sys_semaphore.GetNewId(new Semaphore(initial_count, max_count, protocol, name_u64), TYPE_SEMAPHORE); + sys_semaphore.Notice("*** semaphore created [%s] (protocol=0x%x): id = %d", name.c_str(), protocol, id); + Emu.GetSyncPrimManager().AddSemaphoreData(id, name, initial_count, max_count); + return id; +} + +s32 sys_semaphore_create(vm::ptr sem, vm::ptr attr, s32 initial_count, s32 max_count) { sys_semaphore.Warning("sys_semaphore_create(sem_addr=0x%x, attr_addr=0x%x, initial_count=%d, max_count=%d)", sem.addr(), attr.addr(), initial_count, max_count); + if (sem.addr() == NULL) { + sys_semaphore.Error("sys_semaphore_create(): invalid memory access (sem_addr=0x%x)", sem.addr()); + return CELL_EFAULT; + } + + if (attr.addr() == NULL) { + sys_semaphore.Error("sys_semaphore_create(): An invalid argument value is specified (attr_addr=0x%x)", attr.addr()); + return CELL_EFAULT; + } + if (max_count <= 0 || initial_count > max_count || initial_count < 0) { sys_semaphore.Error("sys_semaphore_create(): invalid parameters (initial_count=%d, max_count=%d)", initial_count, max_count); @@ -37,13 +57,7 @@ s32 sys_semaphore_create(vm::ptr> sem, vm::ptrprotocol); return CELL_EINVAL; } - u32 id = sys_semaphore.GetNewId(new Semaphore(initial_count, max_count, attr->protocol, attr->name_u64), TYPE_SEMAPHORE); - *sem = id; - sys_semaphore.Notice("*** semaphore created [%s] (protocol=0x%x): id = %d", - std::string(attr->name, 8).c_str(), (u32)attr->protocol, id); - - Emu.GetSyncPrimManager().AddSemaphoreData(id, std::string(attr->name, 8), initial_count, max_count); - + *sem = semaphore_create(initial_count, max_count, attr->protocol, attr->name_u64); return CELL_OK; } @@ -51,6 +65,8 @@ s32 sys_semaphore_destroy(u32 sem_id) { sys_semaphore.Warning("sys_semaphore_destroy(sem_id=%d)", sem_id); + LV2_LOCK(0); + Semaphore* sem; if (!Emu.GetIdManager().GetIDData(sem_id, sem)) { @@ -113,11 +129,10 @@ s32 sys_semaphore_wait(u32 sem_id, u64 timeout) continue; } sem->signal = 0; - // TODO: notify signaler return CELL_OK; } - SM_Sleep(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); } } @@ -144,7 +159,7 @@ s32 sys_semaphore_trywait(u32 sem_id) } } -s32 sys_semaphore_post(u32 sem_id, int count) +s32 sys_semaphore_post(u32 sem_id, s32 count) { sys_semaphore.Log("sys_semaphore_post(sem_id=%d, count=%d)", sem_id, count); @@ -159,7 +174,7 @@ s32 sys_semaphore_post(u32 sem_id, int count) return CELL_EINVAL; } - if (count + sem->m_value - (int)sem->m_queue.count() > sem->max) + if (count + sem->m_value - (s32)sem->m_queue.count() > sem->max) { return CELL_EBUSY; } @@ -176,7 +191,7 @@ s32 sys_semaphore_post(u32 sem_id, int count) if (sem->signal && sem->m_queue.count()) { - SM_Sleep(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; } @@ -184,7 +199,6 @@ s32 sys_semaphore_post(u32 sem_id, int count) { count--; sem->signal = target; - Emu.GetCPU().NotifyThread(target); } else { @@ -196,10 +210,15 @@ s32 sys_semaphore_post(u32 sem_id, int count) return CELL_OK; } -s32 sys_semaphore_get_value(u32 sem_id, vm::ptr> count) +s32 sys_semaphore_get_value(u32 sem_id, vm::ptr count) { sys_semaphore.Log("sys_semaphore_get_value(sem_id=%d, count_addr=0x%x)", sem_id, count.addr()); + if (count.addr() == NULL) { + sys_semaphore.Error("sys_semaphore_get_value(): invalid memory access (count=0x%x)", count.addr()); + return CELL_EFAULT; + } + Semaphore* sem; if (!Emu.GetIdManager().GetIDData(sem_id, sem)) { diff --git a/rpcs3/Emu/SysCalls/lv2/sys_semaphore.h b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.h index 6ce29cf398..19956ad377 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_semaphore.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_semaphore.h @@ -7,7 +7,7 @@ struct sys_semaphore_attribute be_t protocol; be_t pshared; // undefined be_t ipc_key; // undefined - be_t flags; // undefined + be_t flags; // undefined be_t pad; // not used union { @@ -20,14 +20,14 @@ struct Semaphore { std::mutex m_mutex; SleepQueue m_queue; - int m_value; + s32 m_value; u32 signal; - const int max; + const s32 max; const u32 protocol; const u64 name; - Semaphore(int initial_count, int max_count, u32 protocol, u64 name) + Semaphore(s32 initial_count, s32 max_count, u32 protocol, u64 name) : m_value(initial_count) , signal(0) , max(max_count) @@ -37,10 +37,13 @@ struct Semaphore } }; +// Aux +u32 semaphore_create(s32 initial_count, s32 max_count, u32 protocol, u64 name_u64); + // SysCalls -s32 sys_semaphore_create(vm::ptr> sem, vm::ptr attr, int initial_count, int max_count); +s32 sys_semaphore_create(vm::ptr sem, vm::ptr attr, s32 initial_count, s32 max_count); s32 sys_semaphore_destroy(u32 sem_id); s32 sys_semaphore_wait(u32 sem_id, u64 timeout); s32 sys_semaphore_trywait(u32 sem_id); -s32 sys_semaphore_post(u32 sem_id, int count); -s32 sys_semaphore_get_value(u32 sem_id, vm::ptr> count); +s32 sys_semaphore_post(u32 sem_id, s32 count); +s32 sys_semaphore_get_value(u32 sem_id, vm::ptr count); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_spinlock.cpp b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.cpp index 5c6c3d9f27..4a24c2b520 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_spinlock.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.cpp @@ -2,27 +2,28 @@ #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" +#include "Emu/Memory/atomic_type.h" #include "sys_spinlock.h" SysCallBase sys_spinlock("sys_spinlock"); -void sys_spinlock_initialize(vm::ptr>> lock) +void sys_spinlock_initialize(vm::ptr> lock) { sys_spinlock.Log("sys_spinlock_initialize(lock_addr=0x%x)", lock.addr()); // prx: set 0 and sync - *lock = be_t::MakeFromBE(0); + lock->exchange(be_t::make(0)); } -void sys_spinlock_lock(vm::ptr>> lock) +void sys_spinlock_lock(vm::ptr> lock) { sys_spinlock.Log("sys_spinlock_lock(lock_addr=0x%x)", lock.addr()); // prx: exchange with 0xabadcafe, repeat until exchanged with 0 - while (lock->exchange(be_t::MakeFromBE(se32(0xabadcafe))).ToBE()) + while (lock->exchange(be_t::make(0xabadcafe)).ToBE()) { - while (lock->load(std::memory_order_relaxed).ToBE()) + while (lock->read_relaxed().ToBE()) { std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack if (Emu.IsStopped()) @@ -39,12 +40,12 @@ void sys_spinlock_lock(vm::ptr>> lock) } } -s32 sys_spinlock_trylock(vm::ptr>> lock) +s32 sys_spinlock_trylock(vm::ptr> lock) { sys_spinlock.Log("sys_spinlock_trylock(lock_addr=0x%x)", lock.addr()); // prx: exchange with 0xabadcafe, translate exchanged value - if (lock->exchange(be_t::MakeFromBE(se32(0xabadcafe))).ToBE()) + if (lock->exchange(be_t::make(0xabadcafe)).ToBE()) { return CELL_EBUSY; } @@ -52,10 +53,10 @@ s32 sys_spinlock_trylock(vm::ptr>> lock) return CELL_OK; } -void sys_spinlock_unlock(vm::ptr>> lock) +void sys_spinlock_unlock(vm::ptr> lock) { sys_spinlock.Log("sys_spinlock_unlock(lock_addr=0x%x)", lock.addr()); // prx: sync and set 0 - *lock = be_t::MakeFromBE(0); + lock->exchange(be_t::make(0)); } \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/lv2/sys_spinlock.h b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.h index 9bab9011a1..42a2bb5a6c 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_spinlock.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_spinlock.h @@ -1,7 +1,7 @@ #pragma once // SysCalls -void sys_spinlock_initialize(vm::ptr>> lock); -void sys_spinlock_lock(vm::ptr>> lock); -s32 sys_spinlock_trylock(vm::ptr>> lock); -void sys_spinlock_unlock(vm::ptr>> lock); +void sys_spinlock_initialize(vm::ptr> lock); +void sys_spinlock_lock(vm::ptr> lock); +s32 sys_spinlock_trylock(vm::ptr> lock); +void sys_spinlock_unlock(vm::ptr> lock); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_spu.cpp b/rpcs3/Emu/SysCalls/lv2/sys_spu.cpp index e2f7c19b12..4a4a1a5523 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_spu.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_spu.cpp @@ -5,24 +5,45 @@ #include "Emu/CPU/CPUThreadManager.h" #include "Emu/Cell/RawSPUThread.h" +#include "Emu/FS/vfsStreamMemory.h" #include "Emu/FS/vfsFile.h" -#include "Loader/ELF.h" +#include "Loader/ELF32.h" +#include "Crypto/unself.h" #include "sys_spu.h" static SysCallBase sys_spu("sys_spu"); +void LoadSpuImage(vfsStream& stream, u32& spu_ep, u32 addr) +{ + loader::handlers::elf32 h; + h.init(stream); + h.load_data(addr); + spu_ep = h.m_ehdr.data_be.e_entry; +} + u32 LoadSpuImage(vfsStream& stream, u32& spu_ep) { - ELFLoader l(stream); - l.LoadInfo(); const u32 alloc_size = 256 * 1024; - u32 spu_offset = (u32)Memory.MainMem.AllocAlign(alloc_size); - l.LoadData(spu_offset); - spu_ep = l.GetEntry(); + u32 spu_offset = (u32)vm::alloc(alloc_size, vm::main); + + LoadSpuImage(stream, spu_ep, spu_offset); return spu_offset; } -//156 +s32 spu_image_import(sys_spu_image& img, u32 src, u32 type) +{ + vfsStreamMemory f(src); + u32 entry; + u32 offset = LoadSpuImage(f, entry); + + img.type = SYS_SPU_IMAGE_TYPE_USER; + img.entry_point = entry; + img.addr = offset; // TODO: writing actual segment info + img.nsegs = 1; // wrong value + + return CELL_OK; +} + s32 sys_spu_image_open(vm::ptr img, vm::ptr path) { sys_spu.Warning("sys_spu_image_open(img_addr=0x%x, path_addr=0x%x [%s])", img.addr(), path.addr(), path.get_ptr()); @@ -34,19 +55,64 @@ s32 sys_spu_image_open(vm::ptr img, vm::ptr path) return CELL_ENOENT; } + SceHeader hdr; + hdr.Load(f); + + if (hdr.CheckMagic()) + { + sys_spu.Error("sys_spu_image_open error: '%s' is encrypted! Decrypt SELF and try again.", path.get_ptr()); + Emu.Pause(); + return CELL_ENOENT; + } + + f.Seek(0); + u32 entry; u32 offset = LoadSpuImage(f, entry); - img->type = 1; + img->type = SYS_SPU_IMAGE_TYPE_USER; img->entry_point = entry; - img->segs_addr = offset; - img->nsegs = 0; + img->addr = offset; // TODO: writing actual segment info + img->nsegs = 1; // wrong value return CELL_OK; } -//172 -s32 sys_spu_thread_initialize(vm::ptr> thread, u32 group, u32 spu_num, vm::ptr img, vm::ptr attr, vm::ptr arg) +SPUThread* spu_thread_initialize(SpuGroupInfo* group, u32 spu_num, sys_spu_image& img, const std::string& name, u32 option, u64 a1, u64 a2, u64 a3, u64 a4, std::function task) +{ + if (option) + { + sys_spu.Todo("Unsupported SPU Thread options (0x%x)", option); + } + + u32 spu_ep = (u32)img.entry_point; + // Copy SPU image: + // TODO: use segment info + u32 spu_offset = (u32)Memory.Alloc(256 * 1024, 4096); + memcpy(vm::get_ptr(spu_offset), vm::get_ptr(img.addr), 256 * 1024); + + SPUThread& new_thread = static_cast(Emu.GetCPU().AddThread(CPU_THREAD_SPU)); + //initialize from new place: + new_thread.SetOffset(spu_offset); + new_thread.SetEntry(spu_ep); + new_thread.SetName(name); + new_thread.m_custom_task = task; + new_thread.Run(); + new_thread.GPR[3] = u128::from64(0, a1); + new_thread.GPR[4] = u128::from64(0, a2); + new_thread.GPR[5] = u128::from64(0, a3); + new_thread.GPR[6] = u128::from64(0, a4); + + const u32 id = new_thread.GetId(); + if (group) group->list[spu_num] = id; + new_thread.group = group; + + sys_spu.Warning("*** New SPU Thread [%s] (ep=0x%x, opt=0x%x, a1=0x%llx, a2=0x%llx, a3=0x%llx, a4=0x%llx): id=%d, spu_offset=0x%x", + name.c_str(), spu_ep, option, a1, a2, a3, a4, id, spu_offset); + return &new_thread; +} + +s32 sys_spu_thread_initialize(vm::ptr thread, u32 group, u32 spu_num, vm::ptr img, vm::ptr attr, vm::ptr arg) { sys_spu.Warning("sys_spu_thread_initialize(thread_addr=0x%x, group=0x%x, spu_num=%d, img_addr=0x%x, attr_addr=0x%x, arg_addr=0x%x)", thread.addr(), group, spu_num, img.addr(), attr.addr(), arg.addr()); @@ -67,49 +133,23 @@ s32 sys_spu_thread_initialize(vm::ptr> thread, u32 group, u32 spu_num, return CELL_EBUSY; } - u32 spu_ep = (u32)img->entry_point; - - std::string name = "SPUThread"; - if (attr->name) - { - name = std::string(attr->name.get_ptr(), attr->name_len); - } - - u64 a1 = arg->arg1; - u64 a2 = arg->arg2; - u64 a3 = arg->arg3; - u64 a4 = arg->arg4; - - // Copy SPU image: - // TODO: use correct segment info - u32 spu_offset = (u32)Memory.Alloc(256 * 1024, 4096); - memcpy(vm::get_ptr(spu_offset), vm::get_ptr(img->segs_addr), 256 * 1024); - - CPUThread& new_thread = Emu.GetCPU().AddThread(CPU_THREAD_SPU); - //initialize from new place: - new_thread.SetOffset(spu_offset); - new_thread.SetEntry(spu_ep); - new_thread.SetName(name); - new_thread.Run(); - static_cast(new_thread).GPR[3] = u128::from64(0, a1); - static_cast(new_thread).GPR[4] = u128::from64(0, a2); - static_cast(new_thread).GPR[5] = u128::from64(0, a3); - static_cast(new_thread).GPR[6] = u128::from64(0, a4); - - u32 id = new_thread.GetId(); - *thread = group_info->list[spu_num] = id; - static_cast(new_thread).group = group_info; - - sys_spu.Warning("*** New SPU Thread [%s] (img_offset=0x%x, ls_offset=0x%x, ep=0x%x, a1=0x%llx, a2=0x%llx, a3=0x%llx, a4=0x%llx): id=%d", - (attr->name ? attr->name.get_ptr() : ""), (u32)img->segs_addr, ((SPUThread&)new_thread).dmac.ls_offset, spu_ep, a1, a2, a3, a4, id); - + *thread = spu_thread_initialize( + group_info, + spu_num, + *img, + attr->name ? std::string(attr->name.get_ptr(), attr->name_len) : "SPUThread", + attr->option, + arg->arg1, + arg->arg2, + arg->arg3, + arg->arg4)->GetId(); return CELL_OK; } -//166 s32 sys_spu_thread_set_argument(u32 id, vm::ptr arg) { sys_spu.Warning("sys_spu_thread_set_argument(id=%d, arg_addr=0x%x)", id, arg.addr()); + CPUThread* thr = Emu.GetCPU().GetThread(id); if(!thr || thr->GetType() != CPU_THREAD_SPU) @@ -127,8 +167,7 @@ s32 sys_spu_thread_set_argument(u32 id, vm::ptr arg) return CELL_OK; } -//165 -s32 sys_spu_thread_get_exit_status(u32 id, vm::ptr> status) +s32 sys_spu_thread_get_exit_status(u32 id, vm::ptr status) { sys_spu.Warning("sys_spu_thread_get_exit_status(id=%d, status_addr=0x%x)", id, status.addr()); @@ -149,7 +188,6 @@ s32 sys_spu_thread_get_exit_status(u32 id, vm::ptr> status) return CELL_OK; } -//171 s32 sys_spu_thread_group_destroy(u32 id) { sys_spu.Warning("sys_spu_thread_group_destroy(id=%d)", id); @@ -192,7 +230,6 @@ s32 sys_spu_thread_group_destroy(u32 id) return CELL_OK; } -//173 s32 sys_spu_thread_group_start(u32 id) { sys_spu.Warning("sys_spu_thread_group_start(id=%d)", id); @@ -218,6 +255,7 @@ s32 sys_spu_thread_group_start(u32 id) CPUThread* t = Emu.GetCPU().GetThread(group_info->list[i]); if (t) { + ((SPUThread*)t)->SPU.Status.SetValue(SPU_STATUS_RUNNING); t->Exec(); } } @@ -228,7 +266,6 @@ s32 sys_spu_thread_group_start(u32 id) return CELL_OK; } -//174 s32 sys_spu_thread_group_suspend(u32 id) { sys_spu.Log("sys_spu_thread_group_suspend(id=%d)", id); @@ -275,7 +312,6 @@ s32 sys_spu_thread_group_suspend(u32 id) return CELL_OK; } -//175 s32 sys_spu_thread_group_resume(u32 id) { sys_spu.Log("sys_spu_thread_group_resume(id=%d)", id); @@ -323,7 +359,6 @@ s32 sys_spu_thread_group_resume(u32 id) return CELL_OK; } -//176: Left doing nothing, indeed s32 sys_spu_thread_group_yield(u32 id) { sys_spu.Error("sys_spu_thread_group_yield(id=%d)", id); @@ -366,7 +401,6 @@ s32 sys_spu_thread_group_yield(u32 id) return CELL_OK; } -//177: Left omit the EPERM check. s32 sys_spu_thread_group_terminate(u32 id, int value) { sys_spu.Error("sys_spu_thread_group_terminate(id=%d, value=%d)", id, value); @@ -406,28 +440,38 @@ s32 sys_spu_thread_group_terminate(u32 id, int value) return CELL_OK; } -//170 -s32 sys_spu_thread_group_create(vm::ptr> id, u32 num, int prio, vm::ptr attr) +SpuGroupInfo* spu_thread_group_create(const std::string& name, u32 num, s32 prio, s32 type, u32 container) +{ + LV2_LOCK(0); + + if (type) + { + sys_spu.Todo("Unsupported SPU Thread Group type (0x%x)", type); + } + + auto group = new SpuGroupInfo(name, num, prio, type, container); + const u32 _id = sys_spu.GetNewId(group); + group->m_id = _id; + sys_spu.Notice("*** SPU Thread Group created [%s] (num=%d, prio=%d, type=0x%x, container=%d): id=%d", + name.c_str(), num, prio, type, container, _id); + return group; +} + +s32 sys_spu_thread_group_create(vm::ptr id, u32 num, s32 prio, vm::ptr attr) { sys_spu.Warning("sys_spu_thread_group_create(id_addr=0x%x, num=%d, prio=%d, attr_addr=0x%x)", id.addr(), num, prio, attr.addr()); - if (num > 256) return CELL_EINVAL; - - if (prio < 16 || prio > 255) return CELL_EINVAL; - - const std::string name(attr->name.get_ptr(), attr->nsize); - - *id = sys_spu.GetNewId(new SpuGroupInfo(name, num, prio, attr->type, attr->ct)); - - sys_spu.Warning("*** SPU Thread Group created [%s] (type=0x%x, option.ct=0x%x): id=%d", - name.c_str(), (int)attr->type, (u32)attr->ct, (u32)*id); + if (!num || num > 6 || prio < 16 || prio > 255) + { + return CELL_EINVAL; + } + *id = spu_thread_group_create(std::string(attr->name.get_ptr(), attr->nsize - 1), num, prio, attr->type, attr->ct)->m_id; return CELL_OK; } -//178 -s32 sys_spu_thread_group_join(u32 id, vm::ptr> cause, vm::ptr> status) +s32 sys_spu_thread_group_join(u32 id, vm::ptr cause, vm::ptr status) { sys_spu.Warning("sys_spu_thread_group_join(id=%d, cause_addr=0x%x, status_addr=0x%x)", id, cause.addr(), status.addr()); @@ -447,7 +491,7 @@ s32 sys_spu_thread_group_join(u32 id, vm::ptr> cause, vm::ptrlist[i])) { - if (!t->IsRunning()) + if (!t->IsAlive()) { if (((SPUThread*)t)->SPU.Status.GetValue() != SPU_STATUS_STOPPED_BY_STOP) { @@ -480,14 +524,13 @@ s32 sys_spu_thread_group_join(u32 id, vm::ptr> cause, vm::ptr> thread_id, vm::ptr> entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr) +s32 sys_spu_thread_create(vm::ptr thread_id, vm::ptr entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr) { sys_spu.Todo("sys_spu_thread_create(thread_id_addr=0x%x, entry_addr=0x%x, arg=0x%llx, prio=%d, stacksize=0x%x, flags=0x%llx, threadname_addr=0x%x", thread_id.addr(), entry.addr(), arg, prio, stacksize, flags, threadname_addr); return CELL_OK; } -//169 s32 sys_spu_initialize(u32 max_usable_spu, u32 max_raw_spu) { sys_spu.Warning("sys_spu_initialize(max_usable_spu=%d, max_raw_spu=%d)", max_usable_spu, max_raw_spu); @@ -500,7 +543,6 @@ s32 sys_spu_initialize(u32 max_usable_spu, u32 max_raw_spu) return CELL_OK; } -//181 s32 sys_spu_thread_write_ls(u32 id, u32 address, u64 value, u32 type) { sys_spu.Log("sys_spu_thread_write_ls(id=%d, address=0x%x, value=0x%llx, type=0x%x)", @@ -533,8 +575,7 @@ s32 sys_spu_thread_write_ls(u32 id, u32 address, u64 value, u32 type) } } -//182 -s32 sys_spu_thread_read_ls(u32 id, u32 address, vm::ptr> value, u32 type) +s32 sys_spu_thread_read_ls(u32 id, u32 address, vm::ptr value, u32 type) { sys_spu.Log("sys_spu_thread_read_ls(id=%d, address=0x%x, value_addr=0x%x, type=0x%x)", id, address, value.addr(), type); @@ -566,10 +607,9 @@ s32 sys_spu_thread_read_ls(u32 id, u32 address, vm::ptr> value, u32 ty } } -//190 s32 sys_spu_thread_write_spu_mb(u32 id, u32 value) { - sys_spu.Log("sys_spu_thread_write_spu_mb(id=%d, value=0x%x)", id, value); + sys_spu.Warning("sys_spu_thread_write_spu_mb(id=%d, value=0x%x)", id, value); CPUThread* thr = Emu.GetCPU().GetThread(id); @@ -583,7 +623,6 @@ s32 sys_spu_thread_write_spu_mb(u32 id, u32 value) return CELL_OK; } -//187 s32 sys_spu_thread_set_spu_cfg(u32 id, u64 value) { sys_spu.Warning("sys_spu_thread_set_spu_cfg(id=%d, value=0x%x)", id, value); @@ -605,8 +644,7 @@ s32 sys_spu_thread_set_spu_cfg(u32 id, u64 value) return CELL_OK; } -//188 -s32 sys_spu_thread_get_spu_cfg(u32 id, vm::ptr> value) +s32 sys_spu_thread_get_spu_cfg(u32 id, vm::ptr value) { sys_spu.Warning("sys_spu_thread_get_spu_cfg(id=%d, value_addr=0x%x)", id, value.addr()); @@ -622,7 +660,6 @@ s32 sys_spu_thread_get_spu_cfg(u32 id, vm::ptr> value) return CELL_OK; } -//184 s32 sys_spu_thread_write_snr(u32 id, u32 number, u32 value) { sys_spu.Log("sys_spu_thread_write_snr(id=%d, number=%d, value=0x%x)", id, number, value); @@ -713,7 +750,6 @@ s32 sys_spu_thread_connect_event(u32 id, u32 eq_id, u32 et, u8 spup) return CELL_OK; } -// s32 sys_spu_thread_disconnect_event(u32 id, u32 et, u8 spup) { sys_spu.Warning("sys_spu_thread_disconnect_event(id=%d, event_type=0x%x, spup=%d)", id, et, spup); @@ -884,8 +920,7 @@ s32 sys_spu_thread_group_disconnect_event_all_threads(u32 id, u8 spup) return CELL_OK; } -//160 -s32 sys_raw_spu_create(vm::ptr> id, u32 attr_addr) +s32 sys_raw_spu_create(vm::ptr id, u32 attr_addr) { sys_spu.Warning("sys_raw_spu_create(id_addr=0x%x, attr_addr=0x%x)", id.addr(), attr_addr); @@ -918,7 +953,7 @@ s32 sys_raw_spu_destroy(u32 id) return CELL_OK; } -s32 sys_raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, vm::ptr> intrtag) +s32 sys_raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, vm::ptr intrtag) { sys_spu.Warning("sys_raw_spu_create_interrupt_tag(id=%d, class_id=%d, hwthread=0x%x, intrtag_addr=0x%x)", id, class_id, hwthread, intrtag.addr()); @@ -964,7 +999,7 @@ s32 sys_raw_spu_set_int_mask(u32 id, u32 class_id, u64 mask) return CELL_OK; } -s32 sys_raw_spu_get_int_mask(u32 id, u32 class_id, vm::ptr> mask) +s32 sys_raw_spu_get_int_mask(u32 id, u32 class_id, vm::ptr mask) { sys_spu.Log("sys_raw_spu_get_int_mask(id=%d, class_id=%d, mask_addr=0x%x)", id, class_id, mask.addr()); @@ -1002,7 +1037,7 @@ s32 sys_raw_spu_set_int_stat(u32 id, u32 class_id, u64 stat) return CELL_OK; } -s32 sys_raw_spu_get_int_stat(u32 id, u32 class_id, vm::ptr> stat) +s32 sys_raw_spu_get_int_stat(u32 id, u32 class_id, vm::ptr stat) { sys_spu.Log("sys_raw_spu_get_int_stat(id=%d, class_id=%d, stat_addr=0xx)", id, class_id, stat.addr()); @@ -1021,7 +1056,7 @@ s32 sys_raw_spu_get_int_stat(u32 id, u32 class_id, vm::ptr> stat) return CELL_OK; } -s32 sys_raw_spu_read_puint_mb(u32 id, vm::ptr> value) +s32 sys_raw_spu_read_puint_mb(u32 id, vm::ptr value) { sys_spu.Log("sys_raw_spu_read_puint_mb(id=%d, value_addr=0x%x)", id, value.addr()); @@ -1051,7 +1086,7 @@ s32 sys_raw_spu_set_spu_cfg(u32 id, u32 value) return CELL_OK; } -s32 sys_raw_spu_get_spu_cfg(u32 id, vm::ptr> value) +s32 sys_raw_spu_get_spu_cfg(u32 id, vm::ptr value) { sys_spu.Log("sys_raw_spu_get_spu_afg(id=%d, value_addr=0x%x)", id, value.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_spu.h b/rpcs3/Emu/SysCalls/lv2/sys_spu.h index 5888aabfdd..6cf66a7bcb 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_spu.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_spu.h @@ -1,6 +1,6 @@ #pragma once -enum +enum : s32 { SYS_SPU_THREAD_GROUP_TYPE_NORMAL = 0x00, SYS_SPU_THREAD_GROUP_TYPE_SEQUENTIAL = 0x01, @@ -8,7 +8,7 @@ enum SYS_SPU_THREAD_GROUP_TYPE_MEMORY_FROM_CONTAINER = 0x04, SYS_SPU_THREAD_GROUP_TYPE_NON_CONTEXT = 0x08, SYS_SPU_THREAD_GROUP_TYPE_EXCLUSIVE_NON_CONTEXT = 0x18, - SYS_SPU_THREAD_GROUP_TYPE_COOPERATE_WITH_SYSTEM = 0x20 + SYS_SPU_THREAD_GROUP_TYPE_COOPERATE_WITH_SYSTEM = 0x20, }; enum @@ -18,7 +18,22 @@ enum SYS_SPU_THREAD_GROUP_JOIN_TERMINATED = 0x0004 }; -enum { +enum +{ + SYS_SPU_THREAD_GROUP_EVENT_RUN = 1, + SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION = 2, + SYS_SPU_THREAD_GROUP_EVENT_SYSTEM_MODULE = 4, +}; + +enum : u64 +{ + SYS_SPU_THREAD_GROUP_EVENT_RUN_KEY = 0xFFFFFFFF53505500ull, + SYS_SPU_THREAD_GROUP_EVENT_EXCEPTION_KEY = 0xFFFFFFFF53505503ull, + SYS_SPU_THREAD_GROUP_EVENT_SYSTEM_MODULE_KEY = 0xFFFFFFFF53505504ull, +}; + +enum +{ SPU_THREAD_GROUP_STATUS_NOT_INITIALIZED, SPU_THREAD_GROUP_STATUS_INITIALIZED, SPU_THREAD_GROUP_STATUS_READY, @@ -30,11 +45,11 @@ enum { SPU_THREAD_GROUP_STATUS_UNKNOWN }; -enum +enum : s32 { - SYS_SPU_SEGMENT_TYPE_COPY = 0x0001, - SYS_SPU_SEGMENT_TYPE_FILL = 0x0002, - SYS_SPU_SEGMENT_TYPE_INFO = 0x0004, + SYS_SPU_SEGMENT_TYPE_COPY = 1, + SYS_SPU_SEGMENT_TYPE_FILL = 2, + SYS_SPU_SEGMENT_TYPE_INFO = 4, }; struct sys_spu_thread_group_attribute @@ -45,6 +60,13 @@ struct sys_spu_thread_group_attribute be_t ct; // memory container id }; +enum : u32 +{ + SYS_SPU_THREAD_OPTION_NONE = 0, + SYS_SPU_THREAD_OPTION_ASYNC_INTR_ENABLE = 1, + SYS_SPU_THREAD_OPTION_DEC_SYNC_TB_ENABLE = 2, +}; + struct sys_spu_thread_attribute { vm::bptr name; @@ -60,20 +82,43 @@ struct sys_spu_thread_argument be_t arg4; }; -struct sys_spu_image -{ - be_t type; - be_t entry_point; - be_t segs_addr; //temporarily used as offset of LS image after elf loading - be_t nsegs; -}; - struct sys_spu_segment { - be_t type; - be_t ls_start; - be_t size; - be_t src; + be_t type; // copy, fill, info + be_t ls; // local storage address + be_t size; + + union + { + be_t addr; // address or fill value + u64 pad; + }; +}; + +static_assert(sizeof(sys_spu_segment) == 0x18, "Wrong sys_spu_segment size"); + +enum : u32 +{ + SYS_SPU_IMAGE_TYPE_USER = 0, + SYS_SPU_IMAGE_TYPE_KERNEL = 1, +}; + +struct sys_spu_image +{ + be_t type; // user, kernel + be_t entry_point; + union + { + be_t addr; // temporarily used as offset of the whole LS image (should be removed) + vm::bptr segs; + }; + be_t nsegs; +}; + +enum : u32 +{ + SYS_SPU_IMAGE_PROTECT = 0, + SYS_SPU_IMAGE_DIRECT = 1, }; struct SpuGroupInfo @@ -81,15 +126,16 @@ struct SpuGroupInfo std::vector list; std::atomic lock; std::string m_name; - int m_prio; - int m_type; - int m_ct; + u32 m_id; + s32 m_prio; + s32 m_type; + u32 m_ct; u32 m_count; - int m_state; //SPU Thread Group State. + s32 m_state; //SPU Thread Group State. u32 m_exit_status; bool m_group_exit; - SpuGroupInfo(const std::string& name, u32 num, int prio, int type, u32 ct) + SpuGroupInfo(const std::string& name, u32 num, s32 prio, s32 type, u32 ct) : m_name(name) , m_prio(prio) , m_type(type) @@ -107,10 +153,21 @@ struct SpuGroupInfo } }; +class SPUThread; +struct vfsStream; + +void LoadSpuImage(vfsStream& stream, u32& spu_ep, u32 addr); +u32 LoadSpuImage(vfsStream& stream, u32& spu_ep); + +// Aux +s32 spu_image_import(sys_spu_image& img, u32 src, u32 type); +SpuGroupInfo* spu_thread_group_create(const std::string& name, u32 num, s32 prio, s32 type, u32 container); +SPUThread* spu_thread_initialize(SpuGroupInfo* group, u32 spu_num, sys_spu_image& img, const std::string& name, u32 option, u64 a1, u64 a2, u64 a3, u64 a4, std::function task = nullptr); + // SysCalls s32 sys_spu_initialize(u32 max_usable_spu, u32 max_raw_spu); s32 sys_spu_image_open(vm::ptr img, vm::ptr path); -s32 sys_spu_thread_initialize(vm::ptr> thread, u32 group, u32 spu_num, vm::ptr img, vm::ptr attr, vm::ptr arg); +s32 sys_spu_thread_initialize(vm::ptr thread, u32 group, u32 spu_num, vm::ptr img, vm::ptr attr, vm::ptr arg); s32 sys_spu_thread_set_argument(u32 id, vm::ptr arg); s32 sys_spu_thread_group_destroy(u32 id); s32 sys_spu_thread_group_start(u32 id); @@ -118,32 +175,32 @@ s32 sys_spu_thread_group_suspend(u32 id); s32 sys_spu_thread_group_resume(u32 id); s32 sys_spu_thread_group_yield(u32 id); s32 sys_spu_thread_group_terminate(u32 id, int value); -s32 sys_spu_thread_group_create(vm::ptr> id, u32 num, int prio, vm::ptr attr); -s32 sys_spu_thread_create(vm::ptr> thread_id, vm::ptr> entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr); -s32 sys_spu_thread_group_join(u32 id, vm::ptr> cause, vm::ptr> status); +s32 sys_spu_thread_group_create(vm::ptr id, u32 num, int prio, vm::ptr attr); +s32 sys_spu_thread_create(vm::ptr thread_id, vm::ptr entry, u64 arg, int prio, u32 stacksize, u64 flags, u32 threadname_addr); +s32 sys_spu_thread_group_join(u32 id, vm::ptr cause, vm::ptr status); s32 sys_spu_thread_group_connect_event(u32 id, u32 eq, u32 et); s32 sys_spu_thread_group_disconnect_event(u32 id, u32 et); s32 sys_spu_thread_group_connect_event_all_threads(u32 id, u32 eq_id, u64 req, vm::ptr spup); s32 sys_spu_thread_group_disconnect_event_all_threads(u32 id, u8 spup); s32 sys_spu_thread_write_ls(u32 id, u32 address, u64 value, u32 type); -s32 sys_spu_thread_read_ls(u32 id, u32 address, vm::ptr> value, u32 type); +s32 sys_spu_thread_read_ls(u32 id, u32 address, vm::ptr value, u32 type); s32 sys_spu_thread_write_spu_mb(u32 id, u32 value); s32 sys_spu_thread_set_spu_cfg(u32 id, u64 value); -s32 sys_spu_thread_get_spu_cfg(u32 id, vm::ptr> value); +s32 sys_spu_thread_get_spu_cfg(u32 id, vm::ptr value); s32 sys_spu_thread_write_snr(u32 id, u32 number, u32 value); s32 sys_spu_thread_connect_event(u32 id, u32 eq, u32 et, u8 spup); s32 sys_spu_thread_disconnect_event(u32 id, u32 event_type, u8 spup); s32 sys_spu_thread_bind_queue(u32 id, u32 spuq, u32 spuq_num); s32 sys_spu_thread_unbind_queue(u32 id, u32 spuq_num); -s32 sys_spu_thread_get_exit_status(u32 id, vm::ptr> status); +s32 sys_spu_thread_get_exit_status(u32 id, vm::ptr status); -s32 sys_raw_spu_create(vm::ptr> id, u32 attr_addr); +s32 sys_raw_spu_create(vm::ptr id, u32 attr_addr); s32 sys_raw_spu_destroy(u32 id); -s32 sys_raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, vm::ptr> intrtag); +s32 sys_raw_spu_create_interrupt_tag(u32 id, u32 class_id, u32 hwthread, vm::ptr intrtag); s32 sys_raw_spu_set_int_mask(u32 id, u32 class_id, u64 mask); -s32 sys_raw_spu_get_int_mask(u32 id, u32 class_id, vm::ptr> mask); +s32 sys_raw_spu_get_int_mask(u32 id, u32 class_id, vm::ptr mask); s32 sys_raw_spu_set_int_stat(u32 id, u32 class_id, u64 stat); -s32 sys_raw_spu_get_int_stat(u32 id, u32 class_id, vm::ptr> stat); -s32 sys_raw_spu_read_puint_mb(u32 id, vm::ptr> value); +s32 sys_raw_spu_get_int_stat(u32 id, u32 class_id, vm::ptr stat); +s32 sys_raw_spu_read_puint_mb(u32 id, vm::ptr value); s32 sys_raw_spu_set_spu_cfg(u32 id, u32 value); -s32 sys_raw_spu_get_spu_cfg(u32 id, vm::ptr> value); +s32 sys_raw_spu_get_spu_cfg(u32 id, vm::ptr value); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_time.cpp b/rpcs3/Emu/SysCalls/lv2/sys_time.cpp index ee65e07e19..c408931bad 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_time.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_time.cpp @@ -18,7 +18,7 @@ SysCallBase sys_time("sys_time"); static const u64 timebase_frequency = /*79800000*/ 80000000; // 80 Mhz -extern int cellSysutilGetSystemParamInt(int id, vm::ptr> value); +extern int cellSysutilGetSystemParamInt(int id, vm::ptr value); // Auxiliary functions u64 get_time() @@ -59,7 +59,7 @@ u64 get_system_time() // Functions -s32 sys_time_get_timezone(vm::ptr> timezone, vm::ptr> summertime) +s32 sys_time_get_timezone(vm::ptr timezone, vm::ptr summertime) { sys_time.Warning("sys_time_get_timezone(timezone_addr=0x%x, summertime_addr=0x%x)", timezone.addr(), summertime.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_time.h b/rpcs3/Emu/SysCalls/lv2/sys_time.h index 28863999e5..34d755db8a 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_time.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_time.h @@ -7,7 +7,7 @@ u64 get_time(); u64 get_system_time(); // SysCalls -s32 sys_time_get_timezone(vm::ptr> timezone, vm::ptr> summertime); +s32 sys_time_get_timezone(vm::ptr timezone, vm::ptr summertime); s32 sys_time_get_current_time(u32 sec_addr, u32 nsec_addr); s64 sys_time_get_system_time(); u64 sys_time_get_timebase_frequency(); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp index 31cd0699ae..c2f5d259d7 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_timer.cpp @@ -8,7 +8,7 @@ SysCallBase sys_timer("sys_timer"); -s32 sys_timer_create(vm::ptr> timer_id) +s32 sys_timer_create(vm::ptr timer_id) { sys_timer.Warning("sys_timer_create(timer_id_addr=0x%x)", timer_id.addr()); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_timer.h b/rpcs3/Emu/SysCalls/lv2/sys_timer.h index 1d65520047..61cd8bbe8e 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_timer.h +++ b/rpcs3/Emu/SysCalls/lv2/sys_timer.h @@ -19,7 +19,7 @@ struct timer sys_timer_information_t timer_information_t; }; -s32 sys_timer_create(vm::ptr> timer_id); +s32 sys_timer_create(vm::ptr timer_id); s32 sys_timer_destroy(u32 timer_id); s32 sys_timer_get_information(u32 timer_id, vm::ptr info); s32 sys_timer_start(u32 timer_id, s64 basetime, u64 period); diff --git a/rpcs3/Emu/SysCalls/lv2/sys_vm.cpp b/rpcs3/Emu/SysCalls/lv2/sys_vm.cpp index 5075183a71..d2557be42d 100644 --- a/rpcs3/Emu/SysCalls/lv2/sys_vm.cpp +++ b/rpcs3/Emu/SysCalls/lv2/sys_vm.cpp @@ -6,12 +6,12 @@ #include "sys_memory.h" #include "sys_vm.h" -SysCallBase sys_vm("vm"); +SysCallBase sys_vm("sys_vm"); MemoryContainerInfo* current_ct; s32 sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 addr) { - sys_vm.Todo("sys_vm_memory_map(vsize=0x%x,psize=0x%x,cidr=0x%x,flags=0x%llx,policy=0x%llx,addr=0x%x)", + sys_vm.Error("sys_vm_memory_map(vsize=0x%x, psize=0x%x, cidr=0x%x, flags=0x%llx, policy=0x%llx, addr_addr=0x%x)", vsize, psize, cid, flag, policy, addr); // Check virtual size. @@ -26,25 +26,12 @@ s32 sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 a return CELL_ENOMEM; } + // Use fixed address (TODO: search and use some free address instead) + u32 new_addr = Memory.IsGoodAddr(0x60000000) ? 0x70000000 : 0x60000000; + // If container ID is SYS_MEMORY_CONTAINER_ID_INVALID, allocate directly. if(cid == SYS_MEMORY_CONTAINER_ID_INVALID) { - u32 new_addr; - switch(flag) - { - case SYS_MEMORY_PAGE_SIZE_1M: - new_addr = (u32)Memory.Alloc(psize, 0x100000); - break; - - case SYS_MEMORY_PAGE_SIZE_64K: - new_addr = (u32)Memory.Alloc(psize, 0x10000); - break; - - default: return CELL_EINVAL; - } - - if(!new_addr) return CELL_ENOMEM; - // Create a new MemoryContainerInfo to act as default container with vsize. current_ct = new MemoryContainerInfo(new_addr, vsize); } @@ -57,18 +44,22 @@ s32 sys_vm_memory_map(u32 vsize, u32 psize, u32 cid, u64 flag, u64 policy, u32 a current_ct = ct; } + // Allocate actual memory using virtual size (physical size is ignored) + assert(Memory.Map(new_addr, vsize)); + // Write a pointer for the allocated memory. - vm::write32(addr, current_ct->addr); + vm::write32(addr, new_addr); return CELL_OK; } s32 sys_vm_unmap(u32 addr) { - sys_vm.Todo("sys_vm_unmap(addr=0x%x)", addr); + sys_vm.Error("sys_vm_unmap(addr=0x%x)", addr); - // Simply free the memory to unmap. - if(!Memory.Free(addr)) return CELL_EINVAL; + // Unmap memory. + assert(addr == 0x60000000 || addr == 0x70000000); + if(!Memory.Unmap(addr)) return CELL_EINVAL; return CELL_OK; } diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index e92724f006..b2cfa2b6ea 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -57,6 +57,8 @@ Emulator::Emulator() , m_sync_prim_manager(new SyncPrimManager()) , m_vfs(new VFS()) { + m_loader.register_handler(new loader::handlers::elf32); + m_loader.register_handler(new loader::handlers::elf64); } Emulator::~Emulator() @@ -171,7 +173,6 @@ void Emulator::Load() if(IsSelf(m_path)) { - std::string self_path = m_path; std::string elf_path = rFileName(m_path).GetPath(); if (fmt::CmpNoCase(rFileName(m_path).GetFullName(),"EBOOT.BIN") == 0) @@ -183,7 +184,7 @@ void Emulator::Load() elf_path += "/" + rFileName(m_path).GetName() + ".elf"; } - if(!DecryptSelf(elf_path, self_path)) + if(!DecryptSelf(elf_path, m_path)) return; m_path = elf_path; @@ -191,7 +192,7 @@ void Emulator::Load() LOG_NOTICE(LOADER, "Loading '%s'...", m_path.c_str()); GetInfo().Reset(); - GetVFS().Init(m_path); + GetVFS().Init(rFileName(m_path).GetPath()); LOG_NOTICE(LOADER, " "); //used to be skip_line LOG_NOTICE(LOADER, "Mount info:"); @@ -236,75 +237,13 @@ void Emulator::Load() return; } - bool is_error; - Loader l(f); - - try + if (!m_loader.load(f)) { - if(!(is_error = !l.Analyze()) && l.GetMachine() != MACHINE_Unknown) - { - switch(l.GetMachine()) - { - case MACHINE_SPU: - Memory.Init(Memory_PS3); - Memory.MainMem.AllocFixed(Memory.MainMem.GetStartAddr(), 0x40000); - break; - - case MACHINE_PPC64: - Memory.Init(Memory_PS3); - break; - - case MACHINE_MIPS: - Memory.Init(Memory_PSP); - break; - - case MACHINE_ARM: - Memory.Init(Memory_PSV); - break; - } - - is_error = !l.Load(); - } - - } - catch(const std::string& e) - { - LOG_ERROR(LOADER, "%s", e.c_str()); - is_error = true; - } - catch(...) - { - LOG_ERROR(LOADER, "Unhandled loader error."); - is_error = true; - } - - CPUThreadType thread_type; - - if(!is_error) - { - switch(l.GetMachine()) - { - case MACHINE_PPC64: thread_type = CPU_THREAD_PPU; break; - case MACHINE_SPU: thread_type = CPU_THREAD_SPU; break; - case MACHINE_ARM: thread_type = CPU_THREAD_ARMv7; break; - - default: - LOG_ERROR(LOADER, "Unimplemented thread type for machine."); - is_error = true; - break; - } - } - - if(is_error) - { - Memory.Close(); - Stop(); + LOG_ERROR(LOADER, "Loading '%s' failed", m_elf_path.c_str()); + vm::close(); return; } - // setting default values - Emu.m_sdk_version = -1; // possibly "unknown" value - // trying to load some info from PARAM.SFO vfsFile f2("/app_home/PARAM.SFO"); if (f2.IsOpened()) @@ -324,69 +263,6 @@ void Emulator::Load() LoadPoints(BreakPointsDBName); - CPUThread& thread = GetCPU().AddThread(thread_type); - - switch(l.GetMachine()) - { - case MACHINE_SPU: - LOG_NOTICE(LOADER, "offset = 0x%llx", Memory.MainMem.GetStartAddr()); - LOG_NOTICE(LOADER, "max addr = 0x%x", l.GetMaxAddr()); - thread.SetOffset(Memory.MainMem.GetStartAddr()); - thread.SetEntry(l.GetEntry() - Memory.MainMem.GetStartAddr()); - thread.Run(); - break; - - case MACHINE_PPC64: - { - m_rsx_callback = (u32)Memory.MainMem.AllocAlign(4 * 4) + 4; - vm::write32(m_rsx_callback - 4, m_rsx_callback); - - auto callback_data = vm::ptr>::make(m_rsx_callback); - callback_data[0] = ADDI(11, 0, 0x3ff); - callback_data[1] = SC(2); - callback_data[2] = BCLR(0x10 | 0x04, 0, 0, 0); - - m_ppu_thr_exit = (u32)Memory.MainMem.AllocAlign(4 * 4); - - auto ppu_thr_exit_data = vm::ptr>::make(m_ppu_thr_exit); - //ppu_thr_exit_data += ADDI(3, 0, 0); // why it kills return value (GPR[3]) ? - ppu_thr_exit_data[0] = ADDI(11, 0, 41); - ppu_thr_exit_data[1] = SC(2); - ppu_thr_exit_data[2] = BCLR(0x10 | 0x04, 0, 0, 0); - - m_ppu_thr_stop = (u32)Memory.MainMem.AllocAlign(2 * 4); - - auto ppu_thr_stop_data = vm::ptr>::make(m_ppu_thr_stop); - ppu_thr_stop_data[0] = SC(4); - ppu_thr_stop_data[1] = BCLR(0x10 | 0x04, 0, 0, 0); - - vm::write64(Memory.PRXMem.AllocAlign(0x10000), 0xDEADBEEFABADCAFE); - - thread.SetEntry(l.GetEntry()); - thread.SetStackSize(0x10000); - thread.SetPrio(0x50); - thread.Run(); - - u32 arg1 = Memory.MainMem.AllocAlign(m_elf_path.size() + 1 + 0x20, 0x10) + 0x20; - memcpy(vm::get_ptr(arg1), m_elf_path.c_str(), m_elf_path.size() + 1); - u32 argv = arg1 - 0x20; - vm::write64(argv, arg1); - - static_cast(thread).GPR[3] = 1; // arg count - static_cast(thread).GPR[4] = argv; // probably, args** - static_cast(thread).GPR[5] = argv + 0x10; // unknown - static_cast(thread).GPR[6] = 0; // unknown - static_cast(thread).GPR[12] = Emu.GetMallocPageSize(); // ??? - //thread.AddArgv("-emu"); - } - break; - - default: - thread.SetEntry(l.GetEntry()); - thread.Run(); - break; - } - m_status = Ready; GetGSManager().Init(); @@ -399,7 +275,6 @@ void Emulator::Load() void Emulator::Run() { - if(!IsReady()) { Load(); diff --git a/rpcs3/Emu/System.h b/rpcs3/Emu/System.h index 05c8927eee..8c9a711532 100644 --- a/rpcs3/Emu/System.h +++ b/rpcs3/Emu/System.h @@ -45,9 +45,10 @@ public: SetTLSData(0, 0, 0); memset(&proc_param, 0, sizeof(sys_process_param_info)); - proc_param.malloc_pagesize = 0x100000; - proc_param.sdk_version = 0x360001; - //TODO + proc_param.malloc_pagesize = be_t::make(0x100000); + proc_param.sdk_version = be_t::make(0x360001); + proc_param.primary_stacksize = be_t::make(0x100000); + proc_param.primary_prio = be_t::make(0x50); } void SetTLSData(const u64 addr, const u64 filesz, const u64 memsz) @@ -106,10 +107,12 @@ class Emulator VFS* m_vfs; EmuInfo m_info; + loader::loader m_loader; public: std::string m_path; std::string m_elf_path; + std::string m_emu_path; std::string m_title_id; u32 m_ppu_thr_stop; s32 m_sdk_version; @@ -121,6 +124,21 @@ public: void SetPath(const std::string& path, const std::string& elf_path = ""); void SetTitleID(const std::string& id); + std::string GetPath() const + { + return m_elf_path; + } + + std::string GetEmulatorPath() const + { + return m_emu_path; + } + + void SetEmulatorPath(const std::string& path) + { + m_emu_path = path; + } + std::recursive_mutex& GetCoreMutex() { return m_core_mutex; } CPUThreadManager& GetCPU() { return *m_thread_manager; } @@ -149,6 +167,21 @@ public: m_info.SetTLSData(addr, filesz, memsz); } + void SetRSXCallback(u32 addr) + { + m_rsx_callback = addr; + } + + void SetPPUThreadExit(u32 addr) + { + m_ppu_thr_exit = addr; + } + + void SetPPUThreadStop(u32 addr) + { + m_ppu_thr_stop = addr; + } + EmuInfo& GetInfo() { return m_info; } u64 GetTLSAddr() const { return m_info.GetTLSAddr(); } diff --git a/rpcs3/Gui/CompilerELF.cpp b/rpcs3/Gui/CompilerELF.cpp index c4254163e2..0dcd836eca 100644 --- a/rpcs3/Gui/CompilerELF.cpp +++ b/rpcs3/Gui/CompilerELF.cpp @@ -421,5 +421,5 @@ void CompilerELF::SetOpStyle(const std::string& text, const wxColour& color, boo void CompilerELF::DoAnalyzeCode(bool compile) { - CompilePPUProgram(fmt::ToUTF8(asm_list->GetValue()), "compiled.elf", asm_list, hex_list, err_list, !compile).Compile(); +// CompilePPUProgram(fmt::ToUTF8(asm_list->GetValue()), "compiled.elf", asm_list, hex_list, err_list, !compile).Compile(); } diff --git a/rpcs3/Gui/DisAsmFrame.cpp b/rpcs3/Gui/DisAsmFrame.cpp index e4c4fe2c17..c7c52acff9 100644 --- a/rpcs3/Gui/DisAsmFrame.cpp +++ b/rpcs3/Gui/DisAsmFrame.cpp @@ -1,4 +1,5 @@ #include "stdafx_gui.h" +#if 0 #include "Utilities/Log.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" @@ -512,3 +513,4 @@ void DisAsmFrame::MouseWheel(wxMouseEvent& event) event.Skip(); } +#endif \ No newline at end of file diff --git a/rpcs3/Gui/DisAsmFrame.h b/rpcs3/Gui/DisAsmFrame.h index 0f9f30b271..4e2bf0b3b9 100644 --- a/rpcs3/Gui/DisAsmFrame.h +++ b/rpcs3/Gui/DisAsmFrame.h @@ -1,5 +1,5 @@ #pragma once - +#if 0 class PPCThread; class DisAsmFrame : public wxFrame @@ -31,4 +31,6 @@ public: } virtual void AddLine(const wxString line); -}; \ No newline at end of file +}; + +#endif \ No newline at end of file diff --git a/rpcs3/Gui/GameViewer.cpp b/rpcs3/Gui/GameViewer.cpp index b59ccae3ce..6d18ba349b 100644 --- a/rpcs3/Gui/GameViewer.cpp +++ b/rpcs3/Gui/GameViewer.cpp @@ -112,7 +112,7 @@ void GameViewer::LoadGames() m_games.clear(); - for(const DirEntryInfo* info = dir.Read(); info; info = dir.Read()) + for(const DirEntryInfo* info : dir) { if(info->flags & DirEntry_TypeDir) { @@ -182,7 +182,7 @@ void GameViewer::ShowData() void GameViewer::Refresh() { - Emu.GetVFS().Init(m_path); + Emu.GetVFS().Init("/"); LoadGames(); LoadPSF(); ShowData(); @@ -210,7 +210,7 @@ void GameViewer::DClick(wxListEvent& event) Debug::AutoPause::getInstance().Reload(); - Emu.GetVFS().Init(path); + Emu.GetVFS().Init("/"); std::string local_path; if (Emu.GetVFS().GetDevice(path, local_path) && !Emu.BootGame(local_path)) { LOG_ERROR(HLE, "Boot error: elf not found! [%s]", path.c_str()); diff --git a/rpcs3/Gui/LLEModulesManager.cpp b/rpcs3/Gui/LLEModulesManager.cpp new file mode 100644 index 0000000000..f6ccd60b0b --- /dev/null +++ b/rpcs3/Gui/LLEModulesManager.cpp @@ -0,0 +1,94 @@ +#include "stdafx_gui.h" +#include "Utilities/Log.h" +#include "Loader/ELF64.h" +#include "Emu/FS/vfsDir.h" +#include "Emu/FS/vfsFile.h" +#include "LLEModulesManager.h" +#include "Emu/System.h" +#include "Emu/FS/VFS.h" + +LLEModulesManagerFrame::LLEModulesManagerFrame(wxWindow* parent) : FrameBase(parent, wxID_ANY, "", "LLEModulesManagerFrame", wxSize(800, 600)) +{ + wxBoxSizer *s_panel = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *s_p_panel = new wxBoxSizer(wxVERTICAL); + wxPanel *p_main = new wxPanel(this); + m_check_list = new wxCheckListBox(p_main, wxID_ANY); + s_p_panel->Add(m_check_list, 1, wxEXPAND | wxALL, 5); + p_main->SetSizerAndFit(s_p_panel); + s_panel->Add(p_main, 1, wxEXPAND | wxALL, 5); + SetSizerAndFit(s_panel); + + Refresh(); + Bind(wxEVT_CHECKLISTBOX, [this](wxCommandEvent& event) { UpdateSelection(event.GetInt()); event.Skip(); }); + Bind(wxEVT_SIZE, [p_main, this](wxSizeEvent& event) { p_main->SetSize(GetClientSize()); m_check_list->SetSize(p_main->GetClientSize() - wxSize(10, 10)); event.Skip(); }); +} + +void LLEModulesManagerFrame::Refresh() +{ + m_check_list->Clear(); + m_funcs.clear(); + + std::string path = "/dev_flash/sys/external/"; + + Emu.GetVFS().Init(path); + + vfsDir dir(path); + + loader::handlers::elf64 sprx_loader; + for (const auto info : dir) + { + if (info->flags & DirEntry_TypeFile) + { + vfsFile f(path + info->name); + if (sprx_loader.init(f) != loader::handler::ok) + { + continue; + } + + if (!sprx_loader.is_sprx()) + { + continue; + } + + //loader::handlers::elf64::sprx_info info; + //sprx_loader.load_sprx(info); + + std::string name = sprx_loader.sprx_get_module_name(); + + bool is_skip = false; + for (auto &i : m_funcs) + { + if (i == name) + { + is_skip = true; + break; + } + } + + if (is_skip) + continue; + + m_funcs.push_back(name); + + IniEntry load_lib; + load_lib.Init(name, "LLE"); + + m_check_list->Check(m_check_list->Append(name + + " v" + std::to_string((int)sprx_loader.m_sprx_module_info.version[0]) + + "." + std::to_string((int)sprx_loader.m_sprx_module_info.version[1])), + load_lib.LoadValue(false)); + } + } + + Emu.GetVFS().UnMountAll(); +} + +void LLEModulesManagerFrame::UpdateSelection(int index) +{ + if (index < 0) + return; + + IniEntry load_lib; + load_lib.Init(m_funcs[index], "LLE"); + load_lib.SaveValue(m_check_list->IsChecked(index)); +} \ No newline at end of file diff --git a/rpcs3/Gui/LLEModulesManager.h b/rpcs3/Gui/LLEModulesManager.h new file mode 100644 index 0000000000..f73fa02910 --- /dev/null +++ b/rpcs3/Gui/LLEModulesManager.h @@ -0,0 +1,14 @@ +#pragma once +#include "Gui/FrameBase.h" +#include + +class LLEModulesManagerFrame : public FrameBase +{ + wxCheckListBox *m_check_list; + std::vector m_funcs; + +public: + LLEModulesManagerFrame(wxWindow *parent); + void Refresh(); + void UpdateSelection(int index); +}; \ No newline at end of file diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index cf2a15e599..b42fd4be6f 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -20,6 +20,7 @@ #include "Gui/KernelExplorer.h" #include "Gui/MemoryViewer.h" #include "Gui/RSXDebugger.h" +#include "Gui/LLEModulesManager.h" #include @@ -33,7 +34,8 @@ enum IDs { id_boot_elf = 0x555, id_boot_game, - id_install_pkg, + id_boot_install_pkg, + id_boot_exit, id_sys_pause, id_sys_stop, id_sys_send_open_menu, @@ -44,6 +46,7 @@ enum IDs id_config_vhdd_manager, id_config_autopause_manager, id_config_savedata_manager, + id_config_lle_modules_manager, id_tools_compiler, id_tools_kernel_explorer, id_tools_memory_viewer, @@ -74,41 +77,45 @@ MainFrame::MainFrame() wxMenuBar* menubar = new wxMenuBar(); wxMenu* menu_boot = new wxMenu(); - menubar->Append(menu_boot, "Boot"); - menu_boot->Append(id_boot_elf, "Boot ELF / SELF file"); - menu_boot->Append(id_boot_game, "Boot game"); + menubar->Append(menu_boot, "&Boot"); + menu_boot->Append(id_boot_elf, "Boot &ELF / SELF file"); + menu_boot->Append(id_boot_game, "Boot &game"); menu_boot->AppendSeparator(); - menu_boot->Append(id_install_pkg, "Install PKG"); + menu_boot->Append(id_boot_install_pkg, "&Install PKG"); + menu_boot->AppendSeparator(); + menu_boot->Append(id_boot_exit, "&Exit"); wxMenu* menu_sys = new wxMenu(); - menubar->Append(menu_sys, "System"); - menu_sys->Append(id_sys_pause, "Pause")->Enable(false); - menu_sys->Append(id_sys_stop, "Stop\tCtrl + S")->Enable(false); + menubar->Append(menu_sys, "&System"); + menu_sys->Append(id_sys_pause, "&Pause")->Enable(false); + menu_sys->Append(id_sys_stop, "&Stop\tCtrl + S")->Enable(false); menu_sys->AppendSeparator(); - menu_sys->Append(id_sys_send_open_menu, "Send open system menu cmd")->Enable(false); - menu_sys->Append(id_sys_send_exit, "Send exit cmd")->Enable(false); + menu_sys->Append(id_sys_send_open_menu, "Send &open system menu cmd")->Enable(false); + menu_sys->Append(id_sys_send_exit, "Send &exit cmd")->Enable(false); wxMenu* menu_conf = new wxMenu(); - menubar->Append(menu_conf, "Config"); - menu_conf->Append(id_config_emu, "Settings"); - menu_conf->Append(id_config_pad, "PAD Settings"); + menubar->Append(menu_conf, "&Config"); + menu_conf->Append(id_config_emu, "&Settings"); + menu_conf->Append(id_config_pad, "&PAD Settings"); menu_conf->AppendSeparator(); - menu_conf->Append(id_config_autopause_manager, "Auto Pause Settings"); + menu_conf->Append(id_config_autopause_manager, "&Auto Pause Settings"); menu_conf->AppendSeparator(); - menu_conf->Append(id_config_vfs_manager, "Virtual File System Manager"); - menu_conf->Append(id_config_vhdd_manager, "Virtual HDD Manager"); - menu_conf->Append(id_config_savedata_manager, "Save Data Utility"); + menu_conf->Append(id_config_vfs_manager, "Virtual &File System Manager"); + menu_conf->Append(id_config_vhdd_manager, "Virtual &HDD Manager"); + menu_conf->Append(id_config_savedata_manager, "Save &Data Utility"); + menu_conf->Append(id_config_lle_modules_manager, "&LLE Modules Manager"); + wxMenu* menu_tools = new wxMenu(); - menubar->Append(menu_tools, "Tools"); - menu_tools->Append(id_tools_compiler, "ELF Compiler"); - menu_tools->Append(id_tools_kernel_explorer, "Kernel Explorer")->Enable(false); - menu_tools->Append(id_tools_memory_viewer, "Memory Viewer")->Enable(false); - menu_tools->Append(id_tools_rsx_debugger, "RSX Debugger")->Enable(false); + menubar->Append(menu_tools, "&Tools"); + menu_tools->Append(id_tools_compiler, "&ELF Compiler"); + menu_tools->Append(id_tools_kernel_explorer, "&Kernel Explorer")->Enable(false); + menu_tools->Append(id_tools_memory_viewer, "&Memory Viewer")->Enable(false); + menu_tools->Append(id_tools_rsx_debugger, "&RSX Debugger")->Enable(false); wxMenu* menu_help = new wxMenu(); - menubar->Append(menu_help, "Help"); - menu_help->Append(id_help_about, "About..."); + menubar->Append(menu_help, "&Help"); + menu_help->Append(id_help_about, "&About..."); SetMenuBar(menubar); @@ -124,7 +131,8 @@ MainFrame::MainFrame() // Events Bind(wxEVT_MENU, &MainFrame::BootElf, this, id_boot_elf); Bind(wxEVT_MENU, &MainFrame::BootGame, this, id_boot_game); - Bind(wxEVT_MENU, &MainFrame::InstallPkg, this, id_install_pkg); + Bind(wxEVT_MENU, &MainFrame::InstallPkg, this, id_boot_install_pkg); + Bind(wxEVT_MENU, [](wxCommandEvent&){ wxGetApp().Exit(); }, id_boot_exit); Bind(wxEVT_MENU, &MainFrame::Pause, this, id_sys_pause); Bind(wxEVT_MENU, &MainFrame::Stop, this, id_sys_stop); @@ -137,6 +145,7 @@ MainFrame::MainFrame() Bind(wxEVT_MENU, &MainFrame::ConfigVHDD, this, id_config_vhdd_manager); Bind(wxEVT_MENU, &MainFrame::ConfigAutoPause, this, id_config_autopause_manager); Bind(wxEVT_MENU, &MainFrame::ConfigSaveData, this, id_config_savedata_manager); + Bind(wxEVT_MENU, &MainFrame::ConfigLLEModules, this, id_config_lle_modules_manager); Bind(wxEVT_MENU, &MainFrame::OpenELFCompiler, this, id_tools_compiler); Bind(wxEVT_MENU, &MainFrame::OpenKernelExplorer, this, id_tools_kernel_explorer); @@ -332,7 +341,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) } wxDialog diag(this, wxID_ANY, "Settings", wxDefaultPosition); - static const u32 width = 385; + static const u32 width = 425; static const u32 height = 400; // Settings panels @@ -341,12 +350,14 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxPanel* p_cpu = new wxPanel(nb_config, wxID_ANY); wxPanel* p_graphics = new wxPanel(nb_config, wxID_ANY); wxPanel* p_audio = new wxPanel(nb_config, wxID_ANY); + wxPanel* p_camera = new wxPanel(nb_config, wxID_ANY); wxPanel* p_io = new wxPanel(nb_config, wxID_ANY); wxPanel* p_hle = new wxPanel(nb_config, wxID_ANY); nb_config->AddPage(p_cpu, wxT("Core")); nb_config->AddPage(p_graphics, wxT("Graphics")); nb_config->AddPage(p_audio, wxT("Audio")); + nb_config->AddPage(p_camera, wxT("Camera")); nb_config->AddPage(p_io, wxT("Input / Output")); nb_config->AddPage(p_hle, wxT("HLE / Misc.")); nb_config->AddPage(p_system, wxT("System")); @@ -355,6 +366,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxBoxSizer* s_subpanel_cpu = new wxBoxSizer(wxVERTICAL); wxBoxSizer* s_subpanel_graphics = new wxBoxSizer(wxVERTICAL); wxBoxSizer* s_subpanel_audio = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* s_subpanel_camera = new wxBoxSizer(wxVERTICAL); wxBoxSizer* s_subpanel_io = new wxBoxSizer(wxVERTICAL); wxBoxSizer* s_subpanel_hle = new wxBoxSizer(wxVERTICAL); @@ -375,10 +387,12 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) // Audio wxStaticBoxSizer* s_round_audio_out = new wxStaticBoxSizer(wxVERTICAL, p_audio, _("Audio Out")); + // Camera + wxStaticBoxSizer* s_round_camera = new wxStaticBoxSizer(wxVERTICAL, p_camera, _("Camera")); + wxStaticBoxSizer* s_round_camera_type = new wxStaticBoxSizer(wxVERTICAL, p_camera, _("Camera type")); + // HLE / Misc. - wxStaticBoxSizer* s_round_hle_misc = new wxStaticBoxSizer(wxHORIZONTAL, p_hle, _("")); wxStaticBoxSizer* s_round_hle_log_lvl = new wxStaticBoxSizer(wxVERTICAL, p_hle, _("Log Level")); - wxStaticBoxSizer* s_round_camera_type = new wxStaticBoxSizer(wxVERTICAL, p_hle, _("Camera type")); // System wxStaticBoxSizer* s_round_sys_lang = new wxStaticBoxSizer(wxVERTICAL, p_system, _("Language")); @@ -392,7 +406,8 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxComboBox* cbox_keyboard_handler = new wxComboBox(p_io, wxID_ANY); wxComboBox* cbox_mouse_handler = new wxComboBox(p_io, wxID_ANY); wxComboBox* cbox_audio_out = new wxComboBox(p_audio, wxID_ANY); - wxComboBox* cbox_camera_type = new wxComboBox(p_hle, wxID_ANY); + wxComboBox* cbox_camera = new wxComboBox(p_camera, wxID_ANY); + wxComboBox* cbox_camera_type = new wxComboBox(p_camera, wxID_ANY); wxComboBox* cbox_hle_loglvl = new wxComboBox(p_hle, wxID_ANY); wxComboBox* cbox_sys_lang = new wxComboBox(p_system, wxID_ANY); @@ -400,9 +415,11 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxCheckBox* chbox_gs_dump_depth = new wxCheckBox(p_graphics, wxID_ANY, "Write Depth Buffer"); wxCheckBox* chbox_gs_dump_color = new wxCheckBox(p_graphics, wxID_ANY, "Write Color Buffers"); wxCheckBox* chbox_gs_vsync = new wxCheckBox(p_graphics, wxID_ANY, "VSync"); + wxCheckBox* chbox_gs_3dmonitor = new wxCheckBox(p_graphics, wxID_ANY, "3D Monitor"); wxCheckBox* chbox_audio_dump = new wxCheckBox(p_audio, wxID_ANY, "Dump to file"); wxCheckBox* chbox_audio_conv = new wxCheckBox(p_audio, wxID_ANY, "Convert to 16 bit"); wxCheckBox* chbox_hle_logging = new wxCheckBox(p_hle, wxID_ANY, "Log all SysCalls"); + wxCheckBox* chbox_rsx_logging = new wxCheckBox(p_hle, wxID_ANY, "RSX Logging"); wxCheckBox* chbox_hle_hook_stfunc = new wxCheckBox(p_hle, wxID_ANY, "Hook static functions"); wxCheckBox* chbox_hle_savetty = new wxCheckBox(p_hle, wxID_ANY, "Save TTY output to file"); wxCheckBox* chbox_hle_exitonstop = new wxCheckBox(p_hle, wxID_ANY, "Exit RPCS3 when process finishes"); @@ -412,13 +429,17 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) wxCheckBox* chbox_dbg_ap_systemcall = new wxCheckBox(p_hle, wxID_ANY, "Auto Pause at System Call"); wxCheckBox* chbox_dbg_ap_functioncall = new wxCheckBox(p_hle, wxID_ANY, "Auto Pause at Function Call"); - cbox_cpu_decoder->Append("PPU Interpreter & DisAsm"); cbox_cpu_decoder->Append("PPU Interpreter"); + cbox_cpu_decoder->Append("PPU JIT (LLVM)"); cbox_spu_decoder->Append("SPU Interpreter"); - cbox_spu_decoder->Append("SPU JIT (asmjit)"); + cbox_spu_decoder->Append("SPU JIT (ASMJIT)"); - for(int i=1; iAppend("Null"); + cbox_gs_render->Append("OpenGL"); + //cbox_gs_render->Append("Software"); + + for(int i = 1; i < WXSIZEOF(ResolutionTable); ++i) { cbox_gs_resolution->Append(wxString::Format("%dx%d", ResolutionTable[i].width.ToLE(), ResolutionTable[i].height.ToLE())); } @@ -426,10 +447,6 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_gs_aspect->Append("4:3"); cbox_gs_aspect->Append("16:9"); - cbox_gs_render->Append("Null"); - cbox_gs_render->Append("OpenGL"); - //cbox_gs_render->Append("Software"); - cbox_pad_handler->Append("Null"); cbox_pad_handler->Append("Windows"); #if defined (_WIN32) @@ -448,6 +465,8 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_audio_out->Append("Null"); cbox_audio_out->Append("OpenAL"); + cbox_camera->Append("Null"); + cbox_camera_type->Append("Unknown"); cbox_camera_type->Append("EyeToy"); cbox_camera_type->Append("PlayStation Eye"); @@ -459,26 +478,35 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_hle_loglvl->Append("Errors"); cbox_hle_loglvl->Append("Nothing"); - static const char* s_sys_lang_table[] = - { - "Japanese", "English (US)", "French", "Spanish", "German", "Italian", - "Dutch", "Portuguese (PT)", "Russian", "Korean", "Chinese (Trad.)", "Chinese (Simp.)", - "Finnish", "Swedish", "Danish", "Norwegian", "Polish", "English (UK)" - }; - - for (auto& lang : s_sys_lang_table) - { - cbox_sys_lang->Append(lang); - } + cbox_sys_lang->Append("Japanese"); + cbox_sys_lang->Append("English (US)"); + cbox_sys_lang->Append("French"); + cbox_sys_lang->Append("Spanish"); + cbox_sys_lang->Append("German"); + cbox_sys_lang->Append("Italian"); + cbox_sys_lang->Append("Dutch"); + cbox_sys_lang->Append("Portuguese (PT)"); + cbox_sys_lang->Append("Russian"); + cbox_sys_lang->Append("Korean"); + cbox_sys_lang->Append("Chinese (Trad.)"); + cbox_sys_lang->Append("Chinese (Simp.)"); + cbox_sys_lang->Append("Finnish"); + cbox_sys_lang->Append("Swedish"); + cbox_sys_lang->Append("Danish"); + cbox_sys_lang->Append("Norwegian"); + cbox_sys_lang->Append("Polish"); + cbox_sys_lang->Append("English (UK)"); // Get values from .ini chbox_gs_log_prog ->SetValue(Ini.GSLogPrograms.GetValue()); chbox_gs_dump_depth ->SetValue(Ini.GSDumpDepthBuffer.GetValue()); chbox_gs_dump_color ->SetValue(Ini.GSDumpColorBuffers.GetValue()); chbox_gs_vsync ->SetValue(Ini.GSVSyncEnable.GetValue()); + chbox_gs_3dmonitor ->SetValue(Ini.GS3DTV.GetValue()); chbox_audio_dump ->SetValue(Ini.AudioDumpToFile.GetValue()); chbox_audio_conv ->SetValue(Ini.AudioConvertToU16.GetValue()); chbox_hle_logging ->SetValue(Ini.HLELogging.GetValue()); + chbox_rsx_logging ->SetValue(Ini.RSXLogging.GetValue()); chbox_hle_hook_stfunc ->SetValue(Ini.HLEHookStFunc.GetValue()); chbox_hle_savetty ->SetValue(Ini.HLESaveTTY.GetValue()); chbox_hle_exitonstop ->SetValue(Ini.HLEExitOnStop.GetValue()); @@ -497,6 +525,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) cbox_keyboard_handler->SetSelection(Ini.KeyboardHandlerMode.GetValue()); cbox_mouse_handler ->SetSelection(Ini.MouseHandlerMode.GetValue()); cbox_audio_out ->SetSelection(Ini.AudioOutMode.GetValue()); + cbox_camera ->SetSelection(Ini.Camera.GetValue()); cbox_camera_type ->SetSelection(Ini.CameraType.GetValue()); cbox_hle_loglvl ->SetSelection(Ini.HLELogLvl.GetValue()); cbox_sys_lang ->SetSelection(Ini.SysLanguage.GetValue()); @@ -505,7 +534,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) chbox_audio_dump->Enable(Emu.IsStopped()); chbox_audio_conv->Enable(Emu.IsStopped()); chbox_hle_logging->Enable(Emu.IsStopped()); - cbox_camera_type->Enable(Emu.IsStopped()); + chbox_rsx_logging->Enable(Emu.IsStopped()); chbox_hle_hook_stfunc->Enable(Emu.IsStopped()); s_round_cpu_decoder->Add(cbox_cpu_decoder, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -521,10 +550,10 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_round_audio_out->Add(cbox_audio_out, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_hle_log_lvl->Add(cbox_hle_loglvl, wxSizerFlags().Border(wxALL, 5).Expand()); + s_round_camera->Add(cbox_camera, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_camera_type->Add(cbox_camera_type, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_hle_misc->Add(s_round_hle_log_lvl, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_hle_misc->Add(s_round_camera_type, wxSizerFlags().Border(wxALL, 5).Expand()); + + s_round_hle_log_lvl->Add(cbox_hle_loglvl, wxSizerFlags().Border(wxALL, 5).Expand()); s_round_sys_lang->Add(cbox_sys_lang, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -540,6 +569,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_subpanel_graphics->Add(chbox_gs_dump_depth, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_graphics->Add(chbox_gs_dump_color, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_graphics->Add(chbox_gs_vsync, wxSizerFlags().Border(wxALL, 5).Expand()); + s_subpanel_graphics->Add(chbox_gs_3dmonitor, wxSizerFlags().Border(wxALL, 5).Expand()); // Input - Output s_subpanel_io->Add(s_round_io_pad_handler, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -551,9 +581,14 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) s_subpanel_audio->Add(chbox_audio_dump, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_audio->Add(chbox_audio_conv, wxSizerFlags().Border(wxALL, 5).Expand()); + // Camera + s_subpanel_camera->Add(s_round_camera, wxSizerFlags().Border(wxALL, 5).Expand()); + s_subpanel_camera->Add(s_round_camera_type, wxSizerFlags().Border(wxALL, 5).Expand()); + // HLE / Misc. - s_subpanel_hle->Add(s_round_hle_misc, wxSizerFlags().Border(wxALL, 5).Expand()); + s_subpanel_hle->Add(s_round_hle_log_lvl, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_hle->Add(chbox_hle_logging, wxSizerFlags().Border(wxALL, 5).Expand()); + s_subpanel_hle->Add(chbox_rsx_logging, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_hle->Add(chbox_hle_hook_stfunc, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_hle->Add(chbox_hle_savetty, wxSizerFlags().Border(wxALL, 5).Expand()); s_subpanel_hle->Add(chbox_hle_exitonstop, wxSizerFlags().Border(wxALL, 5).Expand()); @@ -576,6 +611,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) diag.SetSizerAndFit(s_subpanel_graphics, false); diag.SetSizerAndFit(s_subpanel_io, false); diag.SetSizerAndFit(s_subpanel_audio, false); + diag.SetSizerAndFit(s_subpanel_camera, false); diag.SetSizerAndFit(s_subpanel_hle, false); diag.SetSizerAndFit(s_subpanel_system, false); diag.SetSizerAndFit(s_b_panel, false); @@ -589,18 +625,21 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) Ini.GSRenderMode.SetValue(cbox_gs_render->GetSelection()); Ini.GSResolution.SetValue(ResolutionNumToId(cbox_gs_resolution->GetSelection() + 1)); Ini.GSAspectRatio.SetValue(cbox_gs_aspect->GetSelection() + 1); - Ini.GSVSyncEnable.SetValue(chbox_gs_vsync->GetValue()); Ini.GSLogPrograms.SetValue(chbox_gs_log_prog->GetValue()); Ini.GSDumpDepthBuffer.SetValue(chbox_gs_dump_depth->GetValue()); Ini.GSDumpColorBuffers.SetValue(chbox_gs_dump_color->GetValue()); + Ini.GSVSyncEnable.SetValue(chbox_gs_vsync->GetValue()); + Ini.GS3DTV.SetValue(chbox_gs_3dmonitor->GetValue()); Ini.PadHandlerMode.SetValue(cbox_pad_handler->GetSelection()); Ini.KeyboardHandlerMode.SetValue(cbox_keyboard_handler->GetSelection()); Ini.MouseHandlerMode.SetValue(cbox_mouse_handler->GetSelection()); Ini.AudioOutMode.SetValue(cbox_audio_out->GetSelection()); Ini.AudioDumpToFile.SetValue(chbox_audio_dump->GetValue()); Ini.AudioConvertToU16.SetValue(chbox_audio_conv->GetValue()); + Ini.Camera.SetValue(cbox_camera->GetSelection()); Ini.CameraType.SetValue(cbox_camera_type->GetSelection()); Ini.HLELogging.SetValue(chbox_hle_logging->GetValue()); + Ini.RSXLogging.SetValue(chbox_rsx_logging->GetValue()); Ini.HLEHookStFunc.SetValue(chbox_hle_hook_stfunc->GetValue()); Ini.HLESaveTTY.SetValue(chbox_hle_savetty->GetValue()); Ini.HLEExitOnStop.SetValue(chbox_hle_exitonstop->GetValue()); @@ -643,6 +682,11 @@ void MainFrame::ConfigSaveData(wxCommandEvent& event) SaveDataListDialog(this, true).ShowModal(); } +void MainFrame::ConfigLLEModules(wxCommandEvent& event) +{ + (new LLEModulesManagerFrame(this))->Show(); +} + void MainFrame::OpenELFCompiler(wxCommandEvent& WXUNUSED(event)) { (new CompilerELF(this)) -> Show(); @@ -745,7 +789,7 @@ void MainFrame::UpdateUI(wxCommandEvent& event) // Emulation wxMenuItem& pause = *menubar.FindItem( id_sys_pause ); wxMenuItem& stop = *menubar.FindItem( id_sys_stop ); - pause.SetItemLabel(is_running ? "Pause\tCtrl + P" : is_ready ? "Start\tCtrl + E" : "Resume\tCtrl + E"); + pause.SetItemLabel(is_running ? "&Pause\tCtrl + P" : is_ready ? "&Start\tCtrl + E" : "&Resume\tCtrl + E"); pause.Enable(!is_stopped); stop.Enable(!is_stopped); @@ -753,7 +797,7 @@ void MainFrame::UpdateUI(wxCommandEvent& event) wxMenuItem& send_exit = *menubar.FindItem( id_sys_send_exit ); wxMenuItem& send_open_menu = *menubar.FindItem( id_sys_send_open_menu ); bool enable_commands = !is_stopped; - send_open_menu.SetItemLabel(wxString::Format("Send %s system menu cmd", (m_sys_menu_opened ? "close" : "open"))); + send_open_menu.SetItemLabel(wxString::Format("Send &%s system menu cmd", (m_sys_menu_opened ? "close" : "open"))); send_open_menu.Enable(enable_commands); send_exit.Enable(enable_commands); diff --git a/rpcs3/Gui/MainFrame.h b/rpcs3/Gui/MainFrame.h index 3e1b625048..359e932c6a 100644 --- a/rpcs3/Gui/MainFrame.h +++ b/rpcs3/Gui/MainFrame.h @@ -40,6 +40,7 @@ private: void ConfigVHDD(wxCommandEvent& event); void ConfigAutoPause(wxCommandEvent& event); void ConfigSaveData(wxCommandEvent& event); + void ConfigLLEModules(wxCommandEvent& event); void OpenELFCompiler(wxCommandEvent& evt); void OpenKernelExplorer(wxCommandEvent& evt); void OpenMemoryViewer(wxCommandEvent& evt); diff --git a/rpcs3/Gui/RSXDebugger.cpp b/rpcs3/Gui/RSXDebugger.cpp index 28f755e20e..85ab9a5672 100644 --- a/rpcs3/Gui/RSXDebugger.cpp +++ b/rpcs3/Gui/RSXDebugger.cpp @@ -332,7 +332,7 @@ void RSXDebugger::GoToGet(wxCommandEvent& event) if (!RSXReady()) return; auto ctrl = vm::get_ptr(Emu.GetGSManager().GetRender().m_ctrlAddress); u64 realAddr; - if (Memory.RSXIOMem.getRealAddr(Memory.RSXIOMem.GetStartAddr() + ctrl->get, realAddr)) { + if (Memory.RSXIOMem.getRealAddr(ctrl->get, realAddr)) { m_addr = realAddr; // WARNING: Potential Truncation? Cast from u64 to u32 t_addr->SetValue(wxString::Format("%08x", m_addr)); UpdateInformation(); @@ -346,7 +346,7 @@ void RSXDebugger::GoToPut(wxCommandEvent& event) if (!RSXReady()) return; auto ctrl = vm::get_ptr(Emu.GetGSManager().GetRender().m_ctrlAddress); u64 realAddr; - if (Memory.RSXIOMem.getRealAddr(Memory.RSXIOMem.GetStartAddr() + ctrl->put, realAddr)) { + if (Memory.RSXIOMem.getRealAddr(ctrl->put, realAddr)) { m_addr = realAddr; // WARNING: Potential Truncation? Cast from u64 to u32 t_addr->SetValue(wxString::Format("%08x", m_addr)); UpdateInformation(); @@ -373,20 +373,20 @@ void RSXDebugger::GetMemory() for(u32 i=0; iSetItem(i, 2, wxEmptyString); - u32 ioAddr = RSXReady() ? Memory.RSXIOMem.GetStartAddr() : 0; + bool isReady = RSXReady(); // Write information for(u32 i=0, addr = m_addr; iSetItem(i, 0, wxString::Format("%08x", addr)); - if (ioAddr && Memory.IsGoodAddr(addr)) + if (isReady && Memory.IsGoodAddr(addr)) { u32 cmd = vm::read32(addr); u32 count = (cmd >> 18) & 0x7ff; m_list_commands->SetItem(i, 1, wxString::Format("%08x", cmd)); m_list_commands->SetItem(i, 3, wxString::Format("%d", count)); - m_list_commands->SetItem(i, 2, DisAsmCommand(cmd, count, addr, ioAddr)); + m_list_commands->SetItem(i, 2, DisAsmCommand(cmd, count, addr, 0)); if(!(cmd & (CELL_GCM_METHOD_FLAG_JUMP | CELL_GCM_METHOD_FLAG_CALL)) && cmd != CELL_GCM_METHOD_FLAG_RETURN) { @@ -492,23 +492,24 @@ void RSXDebugger::GetFlags() #define LIST_FLAGS_ADD(name, value) \ m_list_flags->InsertItem(i, name); m_list_flags->SetItem(i, 1, value ? "Enabled" : "Disabled"); i++; - LIST_FLAGS_ADD("Alpha test", render.m_set_alpha_test); - LIST_FLAGS_ADD("Blend", render.m_set_blend); - LIST_FLAGS_ADD("Scissor", render.m_set_scissor_horizontal && render.m_set_scissor_vertical); - LIST_FLAGS_ADD("Cull face", render.m_set_cull_face); - LIST_FLAGS_ADD("Depth bounds test", render.m_set_depth_bounds_test); - LIST_FLAGS_ADD("Depth test", render.m_set_depth_test); - LIST_FLAGS_ADD("Dither", render.m_set_dither); - LIST_FLAGS_ADD("Line smooth", render.m_set_line_smooth); - LIST_FLAGS_ADD("Logic op", render.m_set_logic_op); - LIST_FLAGS_ADD("Poly smooth", render.m_set_poly_smooth); - LIST_FLAGS_ADD("Poly offset fill", render.m_set_poly_offset_fill); - LIST_FLAGS_ADD("Poly offset line", render.m_set_poly_offset_line); - LIST_FLAGS_ADD("Poly offset point", render.m_set_poly_offset_point); - LIST_FLAGS_ADD("Stencil test", render.m_set_stencil_test); - LIST_FLAGS_ADD("Primitive restart", render.m_set_restart_index); - LIST_FLAGS_ADD("Point Sprite", render.m_set_point_sprite_control); - LIST_FLAGS_ADD("Lighting ", render.m_set_specular); + LIST_FLAGS_ADD("Alpha test", render.m_set_alpha_test); + LIST_FLAGS_ADD("Blend", render.m_set_blend); + LIST_FLAGS_ADD("Scissor", render.m_set_scissor_horizontal && render.m_set_scissor_vertical); + LIST_FLAGS_ADD("Cull face", render.m_set_cull_face); + LIST_FLAGS_ADD("Depth bounds test", render.m_set_depth_bounds_test); + LIST_FLAGS_ADD("Depth test", render.m_set_depth_test); + LIST_FLAGS_ADD("Dither", render.m_set_dither); + LIST_FLAGS_ADD("Line smooth", render.m_set_line_smooth); + LIST_FLAGS_ADD("Logic op", render.m_set_logic_op); + LIST_FLAGS_ADD("Poly smooth", render.m_set_poly_smooth); + LIST_FLAGS_ADD("Poly offset fill", render.m_set_poly_offset_fill); + LIST_FLAGS_ADD("Poly offset line", render.m_set_poly_offset_line); + LIST_FLAGS_ADD("Poly offset point", render.m_set_poly_offset_point); + LIST_FLAGS_ADD("Stencil test", render.m_set_stencil_test); + LIST_FLAGS_ADD("Primitive restart", render.m_set_restart_index); + LIST_FLAGS_ADD("Two sided lighting", render.m_set_two_side_light_enable); + LIST_FLAGS_ADD("Point Sprite", render.m_set_point_sprite_control); + LIST_FLAGS_ADD("Lighting ", render.m_set_specular); #undef LIST_FLAGS_ADD } @@ -830,7 +831,7 @@ wxString RSXDebugger::DisAsmCommand(u32 cmd, u32 count, u32 currentAddr, u32 ioA } else if(!(cmd & (CELL_GCM_METHOD_FLAG_JUMP | CELL_GCM_METHOD_FLAG_CALL)) && cmd != CELL_GCM_METHOD_FLAG_RETURN) { - auto args = vm::ptr>::make(currentAddr + 4); + auto args = vm::ptr::make(currentAddr + 4); u32 index = 0; switch(cmd & 0x3ffff) diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index a7be1a2a5d..cbfc6d9fe4 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -104,10 +104,11 @@ public: IniEntry GSRenderMode; IniEntry GSResolution; IniEntry GSAspectRatio; - IniEntry GSVSyncEnable; IniEntry GSLogPrograms; IniEntry GSDumpColorBuffers; IniEntry GSDumpDepthBuffer; + IniEntry GSVSyncEnable; + IniEntry GS3DTV; // Audio IniEntry AudioOutMode; @@ -115,6 +116,7 @@ public: IniEntry AudioConvertToU16; // Camera + IniEntry Camera; IniEntry CameraType; // Input/Output @@ -147,11 +149,12 @@ public: IniEntry PadHandlerRStickUp; // HLE/Miscs + IniEntry HLELogLvl; IniEntry HLELogging; + IniEntry RSXLogging; IniEntry HLEHookStFunc; IniEntry HLESaveTTY; IniEntry HLEExitOnStop; - IniEntry HLELogLvl; IniEntry HLEAlwaysStart; //Auto Pause @@ -176,10 +179,11 @@ public: GSRenderMode.Init("GS_RenderMode", path); GSResolution.Init("GS_Resolution", path); GSAspectRatio.Init("GS_AspectRatio", path); - GSVSyncEnable.Init("GS_VSyncEnable", path); GSLogPrograms.Init("GS_LogPrograms", path); GSDumpColorBuffers.Init("GS_DumpColorBuffers", path); GSDumpDepthBuffer.Init("GS_DumpDepthBuffer", path); + GSVSyncEnable.Init("GS_VSyncEnable", path); + GS3DTV.Init("GS_3DTV", path); // Audio AudioOutMode.Init("Audio_AudioOutMode", path); @@ -187,6 +191,7 @@ public: AudioConvertToU16.Init("Audio_AudioConvertToU16", path); // Camera + Camera.Init("Camera", path); CameraType.Init("Camera_Type", path); // Input/Output @@ -220,6 +225,7 @@ public: // HLE/Misc HLELogging.Init("HLE_HLELogging", path); + RSXLogging.Init("RSX_Logging", path); HLEHookStFunc.Init("HLE_HLEHookStFunc", path); HLESaveTTY.Init("HLE_HLESaveTTY", path); HLEExitOnStop.Init("HLE_HLEExitOnStop", path); @@ -237,17 +243,18 @@ public: void Load() { // Core - CPUDecoderMode.Load(2); + CPUDecoderMode.Load(1); SPUDecoderMode.Load(1); // Graphics GSRenderMode.Load(1); GSResolution.Load(4); GSAspectRatio.Load(2); - GSVSyncEnable.Load(false); GSLogPrograms.Load(false); GSDumpColorBuffers.Load(false); GSDumpDepthBuffer.Load(false); + GSVSyncEnable.Load(false); + GS3DTV.Load(false); // Audio AudioOutMode.Load(1); @@ -255,6 +262,7 @@ public: AudioConvertToU16.Load(false); // Camera + Camera.Load(0); CameraType.Load(2); // Input/Ouput @@ -288,6 +296,7 @@ public: // HLE/Miscs HLELogging.Load(false); + RSXLogging.Load(false); HLEHookStFunc.Load(false); HLESaveTTY.Load(false); HLEExitOnStop.Load(false); @@ -313,10 +322,11 @@ public: GSRenderMode.Save(); GSResolution.Save(); GSAspectRatio.Save(); - GSVSyncEnable.Save(); GSLogPrograms.Save(); GSDumpColorBuffers.Save(); GSDumpDepthBuffer.Save(); + GSVSyncEnable.Save(); + GS3DTV.Save(); // Audio AudioOutMode.Save(); @@ -324,6 +334,7 @@ public: AudioConvertToU16.Save(); // Camera + Camera.Save(); CameraType.Save(); // Input/Output @@ -357,6 +368,7 @@ public: // HLE/Miscs HLELogging.Save(); + RSXLogging.Save(); HLEHookStFunc.Save(); HLESaveTTY.Save(); HLEExitOnStop.Save(); diff --git a/rpcs3/Loader/ELF.cpp b/rpcs3/Loader/ELF.cpp deleted file mode 100644 index b3708bf910..0000000000 --- a/rpcs3/Loader/ELF.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include "stdafx.h" -#include "Emu/FS/vfsStream.h" -#include "ELF.h" -#include "ELF64.h" -#include "ELF32.h" - -void Elf_Ehdr::Show() -{ -} - -void Elf_Ehdr::Load(vfsStream& f) -{ - e_magic = Read32(f); - e_class = Read8(f); -} - -ELFLoader::ELFLoader(vfsStream& f) - : m_elf_file(f) - , LoaderBase() - , m_loader(nullptr) -{ -} - -bool ELFLoader::LoadInfo() -{ - if(!m_elf_file.IsOpened()) - return false; - - m_elf_file.Seek(0); - ehdr.Load(m_elf_file); - if(!ehdr.CheckMagic()) - return false; - - switch(ehdr.GetClass()) - { - case CLASS_ELF32: - m_loader = new ELF32Loader(m_elf_file); - break; - case CLASS_ELF64: - m_loader = new ELF64Loader(m_elf_file); - break; - } - - if(!(m_loader && m_loader->LoadInfo())) - return false; - - entry = m_loader->GetEntry(); - machine = m_loader->GetMachine(); - - return true; -} - -bool ELFLoader::LoadData(u64 offset) -{ - return m_loader && m_loader->LoadData(offset); -} - -bool ELFLoader::Close() -{ - delete m_loader; - m_loader = nullptr; - return m_elf_file.Close(); -} diff --git a/rpcs3/Loader/ELF.h b/rpcs3/Loader/ELF.h deleted file mode 100644 index 44b888b9ff..0000000000 --- a/rpcs3/Loader/ELF.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once -#include "Loader.h" - -struct vfsStream; - -enum ElfClass -{ - CLASS_Unknown, - CLASS_ELF32, - CLASS_ELF64, -}; - -struct Elf_Ehdr -{ - u32 e_magic; - u8 e_class; - - virtual void Show(); - - virtual void Load(vfsStream& f); - - bool CheckMagic() const { return e_magic == 0x7F454C46; } - - ElfClass GetClass() const - { - switch(e_class) - { - case 1: return CLASS_ELF32; - case 2: return CLASS_ELF64; - } - - return CLASS_Unknown; - } -}; - -class ELFLoader : public LoaderBase -{ - vfsStream& m_elf_file; - LoaderBase* m_loader; - -public: - Elf_Ehdr ehdr; - - ELFLoader(vfsStream& f); - virtual ~ELFLoader() - { - Close(); - } - - virtual bool LoadInfo(); - virtual bool LoadData(u64 offset = 0); - virtual bool Close(); -}; \ No newline at end of file diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 03517368e9..377ab7f5ae 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -4,531 +4,126 @@ #include "Emu/FS/vfsStream.h" #include "Emu/Memory/Memory.h" #include "ELF32.h" +#include "Emu/Cell/SPUThread.h" +#include "Emu/ARMv7/ARMv7Thread.h" +#include "Emu/System.h" -void Elf32_Ehdr::Show() +namespace loader { -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "Magic: %08x", e_magic); - LOG_NOTICE(LOADER, "Class: %s", "ELF32"); - LOG_NOTICE(LOADER, "Data: %s", Ehdr_DataToString(e_data).c_str()); - LOG_NOTICE(LOADER, "Current Version: %d", e_curver); - LOG_NOTICE(LOADER, "OS/ABI: %s", Ehdr_OS_ABIToString(e_os_abi).c_str()); - LOG_NOTICE(LOADER, "ABI version: %lld", e_abi_ver); - LOG_NOTICE(LOADER, "Type: %s", Ehdr_TypeToString(e_type).c_str()); - LOG_NOTICE(LOADER, "Machine: %s", Ehdr_MachineToString(e_machine).c_str()); - LOG_NOTICE(LOADER, "Version: %d", e_version); - LOG_NOTICE(LOADER, "Entry point address: 0x%x", e_entry); - LOG_NOTICE(LOADER, "Program headers offset: 0x%08x", e_phoff); - LOG_NOTICE(LOADER, "Section headers offset: 0x%08x", e_shoff); - LOG_NOTICE(LOADER, "Flags: 0x%x", e_flags); - LOG_NOTICE(LOADER, "Size of this header: %d", e_ehsize); - LOG_NOTICE(LOADER, "Size of program headers: %d", e_phentsize); - LOG_NOTICE(LOADER, "Number of program headers: %d", e_phnum); - LOG_NOTICE(LOADER, "Size of section headers: %d", e_shentsize); - LOG_NOTICE(LOADER, "Number of section headers: %d", e_shnum); - LOG_NOTICE(LOADER, "Section header string table index: %d", e_shstrndx); -#endif -} - -void Elf32_Ehdr::Load(vfsStream& f) -{ - e_magic = Read32(f); - e_class = Read8(f); - e_data = Read8(f); - e_curver = Read8(f); - e_os_abi = Read8(f); - - if(IsLittleEndian()) + namespace handlers { - e_abi_ver = Read64LE(f); - e_type = Read16LE(f); - e_machine = Read16LE(f); - e_version = Read32LE(f); - e_entry = Read32LE(f); - e_phoff = Read32LE(f); - e_shoff = Read32LE(f); - e_flags = Read32LE(f); - e_ehsize = Read16LE(f); - e_phentsize = Read16LE(f); - e_phnum = Read16LE(f); - e_shentsize = Read16LE(f); - e_shnum = Read16LE(f); - e_shstrndx = Read16LE(f); - } - else - { - e_abi_ver = Read64(f); - e_type = Read16(f); - e_machine = Read16(f); - e_version = Read32(f); - e_entry = Read32(f); - e_phoff = Read32(f); - e_shoff = Read32(f); - e_flags = Read32(f); - e_ehsize = Read16(f); - e_phentsize = Read16(f); - e_phnum = Read16(f); - e_shentsize = Read16(f); - e_shnum = Read16(f); - e_shstrndx = Read16(f); - } -} - -void Elf32_Desc::Load(vfsStream& f) -{ - revision = Read32(f); - ls_size = Read32(f); - stack_size = Read32(f); - flags = Read32(f); -} - -void Elf32_Desc::LoadLE(vfsStream& f) -{ - revision = Read32LE(f); - ls_size = Read32LE(f); - stack_size = Read32LE(f); - flags = Read32LE(f); -} - -void Elf32_Note::Load(vfsStream& f) -{ - namesz = Read32(f); - descsz = Read32(f); - type = Read32(f); - f.Read(name, 8); - - if (descsz == 32) - { - f.Read(desc_text, descsz); - } - else - { - desc.Load(f); - } -} - -void Elf32_Note::LoadLE(vfsStream& f) -{ - namesz = Read32LE(f); - descsz = Read32LE(f); - type = Read32LE(f); - f.Read(name, 8); - - if (descsz == 32) - { - f.Read(desc_text, descsz); - } - else - { - desc.Load(f); - } -} - -void Elf32_Shdr::Load(vfsStream& f) -{ - sh_name = Read32(f); - sh_type = Read32(f); - sh_flags = Read32(f); - sh_addr = Read32(f); - sh_offset = Read32(f); - sh_size = Read32(f); - sh_link = Read32(f); - sh_info = Read32(f); - sh_addralign = Read32(f); - sh_entsize = Read32(f); -} - -void Elf32_Shdr::LoadLE(vfsStream& f) -{ - sh_name = Read32LE(f); - sh_type = Read32LE(f); - sh_flags = Read32LE(f); - sh_addr = Read32LE(f); - sh_offset = Read32LE(f); - sh_size = Read32LE(f); - sh_link = Read32LE(f); - sh_info = Read32LE(f); - sh_addralign = Read32LE(f); - sh_entsize = Read32LE(f); -} - -void Elf32_Shdr::Show() -{ -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "Name offset: %x", sh_name); - LOG_NOTICE(LOADER, "Type: %d", sh_type); - LOG_NOTICE(LOADER, "Addr: %x", sh_addr); - LOG_NOTICE(LOADER, "Offset: %x", sh_offset); - LOG_NOTICE(LOADER, "Size: %x", sh_size); - LOG_NOTICE(LOADER, "EntSize: %d", sh_entsize); - LOG_NOTICE(LOADER, "Flags: %x", sh_flags); - LOG_NOTICE(LOADER, "Link: %x", sh_link); - LOG_NOTICE(LOADER, "Info: %d", sh_info); - LOG_NOTICE(LOADER, "Address align: %x", sh_addralign); -#endif -} - -void Elf32_Phdr::Load(vfsStream& f) -{ - p_type = Read32(f); - p_offset = Read32(f); - p_vaddr = Read32(f); - p_paddr = Read32(f); - p_filesz = Read32(f); - p_memsz = Read32(f); - p_flags = Read32(f); - p_align = Read32(f); -} - -void Elf32_Phdr::LoadLE(vfsStream& f) -{ - p_type = Read32LE(f); - p_offset = Read32LE(f); - p_vaddr = Read32LE(f); - p_paddr = Read32LE(f); - p_filesz = Read32LE(f); - p_memsz = Read32LE(f); - p_flags = Read32LE(f); - p_align = Read32LE(f); -} - -void Elf32_Phdr::Show() -{ -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "Type: %s", Phdr_TypeToString(p_type).c_str()); - LOG_NOTICE(LOADER, "Offset: 0x%08x", p_offset); - LOG_NOTICE(LOADER, "Virtual address: 0x%08x", p_vaddr); - LOG_NOTICE(LOADER, "Physical address: 0x%08x", p_paddr); - LOG_NOTICE(LOADER, "File size: 0x%08x", p_filesz); - LOG_NOTICE(LOADER, "Memory size: 0x%08x", p_memsz); - LOG_NOTICE(LOADER, "Flags: %s", Phdr_FlagsToString(p_flags).c_str()); - LOG_NOTICE(LOADER, "Align: 0x%x", p_align); -#endif -} - -void WriteEhdr(rFile& f, Elf32_Ehdr& ehdr) -{ - Write32(f, ehdr.e_magic); - Write8(f, ehdr.e_class); - Write8(f, ehdr.e_data); - Write8(f, ehdr.e_curver); - Write8(f, ehdr.e_os_abi); - Write64(f, ehdr.e_abi_ver); - Write16(f, ehdr.e_type); - Write16(f, ehdr.e_machine); - Write32(f, ehdr.e_version); - Write32(f, ehdr.e_entry); - Write32(f, ehdr.e_phoff); - Write32(f, ehdr.e_shoff); - Write32(f, ehdr.e_flags); - Write16(f, ehdr.e_ehsize); - Write16(f, ehdr.e_phentsize); - Write16(f, ehdr.e_phnum); - Write16(f, ehdr.e_shentsize); - Write16(f, ehdr.e_shnum); - Write16(f, ehdr.e_shstrndx); -} - -void WritePhdr(rFile& f, Elf32_Phdr& phdr) -{ - Write32(f, phdr.p_type); - Write32(f, phdr.p_offset); - Write32(f, phdr.p_vaddr); - Write32(f, phdr.p_paddr); - Write32(f, phdr.p_filesz); - Write32(f, phdr.p_memsz); - Write32(f, phdr.p_flags); - Write32(f, phdr.p_align); -} - -void WriteShdr(rFile& f, Elf32_Shdr& shdr) -{ - Write32(f, shdr.sh_name); - Write32(f, shdr.sh_type); - Write32(f, shdr.sh_flags); - Write32(f, shdr.sh_addr); - Write32(f, shdr.sh_offset); - Write32(f, shdr.sh_size); - Write32(f, shdr.sh_link); - Write32(f, shdr.sh_info); - Write32(f, shdr.sh_addralign); - Write32(f, shdr.sh_entsize); -} - -ELF32Loader::ELF32Loader(vfsStream& f) - : elf32_f(f) - , LoaderBase() -{ -} - -bool ELF32Loader::LoadInfo() -{ - if(!elf32_f.IsOpened()) return false; - - if(!LoadEhdrInfo()) return false; - if(!LoadPhdrInfo()) return false; - if(!LoadShdrInfo()) return false; - - return true; -} - -bool ELF32Loader::LoadData(u64 offset) -{ - if(!elf32_f.IsOpened()) return false; - - if(!LoadEhdrData(offset)) return false; - if(!LoadPhdrData(offset)) return false; - if(!LoadShdrData(offset)) return false; - - return true; -} - -bool ELF32Loader::Close() -{ - return elf32_f.Close(); -} - -bool ELF32Loader::LoadEhdrInfo() -{ - elf32_f.Seek(0); - ehdr.Load(elf32_f); - - if(!ehdr.CheckMagic()) return false; - - if(ehdr.IsLittleEndian()) - LOG_WARNING(LOADER, "ELF32 LE"); - - switch(ehdr.e_machine) - { - case MACHINE_MIPS: - case MACHINE_PPC64: - case MACHINE_SPU: - case MACHINE_ARM: - machine = (Elf_Machine)ehdr.e_machine; - break; - - default: - machine = MACHINE_Unknown; - LOG_ERROR(LOADER, "Unknown elf32 machine: 0x%x", ehdr.e_machine); - return false; - } - - entry = ehdr.GetEntry(); - if(entry == 0) - { - LOG_ERROR(LOADER, "elf32 error: entry is null!"); - return false; - } - - return true; -} - -bool ELF32Loader::LoadPhdrInfo() -{ - if(ehdr.e_phoff == 0 && ehdr.e_phnum) - { - LOG_ERROR(LOADER, "LoadPhdr32 error: Program header offset is null!"); - return false; - } - - elf32_f.Seek(ehdr.e_phoff); - for(uint i=0; i= entry && entry < phdr_arr[i].p_paddr + phdr_arr[i].p_memsz) + error_code res = handler::init(stream); + + if (res != ok) + return res; + + m_stream->Read(&m_ehdr, sizeof(ehdr)); + + if (!m_ehdr.check()) { - entry += phdr_arr[i].p_vaddr; - LOG_WARNING(LOADER, "virtual entry = 0x%x", entry); - break; - } - } - } - - return true; -} - -bool ELF32Loader::LoadShdrInfo() -{ - elf32_f.Seek(ehdr.e_shoff); - for(u32 i=0; i= shdr_arr.size()) - { - LOG_WARNING(LOADER, "LoadShdr32 error: shstrndx too big!"); - return true; - } - - for(u32 i=0; i max_addr) + if (m_ehdr.data_le.e_phnum && (m_ehdr.is_le() ? m_ehdr.data_le.e_phentsize : m_ehdr.data_be.e_phentsize) != sizeof(phdr)) { - max_addr = phdr_arr[i].p_vaddr + phdr_arr[i].p_memsz; + return broken_file; } - if(phdr_arr[i].p_vaddr != phdr_arr[i].p_paddr) + if (m_ehdr.data_le.e_shnum && (m_ehdr.is_le() ? m_ehdr.data_le.e_shentsize : m_ehdr.data_be.e_shentsize) != sizeof(shdr)) { - LOG_WARNING - ( - LOADER, - "LoadPhdr32 different load addrs: paddr=0x%8.8x, vaddr=0x%8.8x", - phdr_arr[i].p_paddr, phdr_arr[i].p_vaddr - ); + return broken_file; } - switch(machine) + LOG_WARNING(LOADER, "m_ehdr.e_type = 0x%x", (u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_type : m_ehdr.data_be.e_type)); + + if (m_ehdr.data_le.e_phnum) { - case MACHINE_SPU: break; - case MACHINE_MIPS: Memory.PSP.RAM.AllocFixed(phdr_arr[i].p_vaddr + offset, phdr_arr[i].p_memsz); break; - case MACHINE_ARM: Memory.PSV.RAM.AllocFixed(phdr_arr[i].p_vaddr + offset, phdr_arr[i].p_memsz); break; - - default: - continue; - } - - elf32_f.Seek(phdr_arr[i].p_offset); - elf32_f.Read(vm::get_ptr(phdr_arr[i].p_vaddr + offset), phdr_arr[i].p_filesz); - } - else if(phdr_arr[i].p_type == 0x00000004) - { - elf32_f.Seek(phdr_arr[i].p_offset); - Elf32_Note note; - if(ehdr.IsLittleEndian()) note.LoadLE(elf32_f); - else note.Load(elf32_f); - - if(note.type != 1) - { - LOG_ERROR(LOADER, "ELF32: Bad NOTE type (%d)", note.type); - break; - } - - if(note.namesz != sizeof(note.name)) - { - LOG_ERROR(LOADER, "ELF32: Bad NOTE namesz (%d)", note.namesz); - break; - } - - if(note.descsz != sizeof(note.desc) && note.descsz != 32) - { - LOG_ERROR(LOADER, "ELF32: Bad NOTE descsz (%d)", note.descsz); - break; - } - - //if(note.desc.flags) - //{ - // LOG_ERROR(LOADER, "ELF32: Bad NOTE flags (0x%x)", note.desc.flags); - // break; - //} - - if(note.descsz == sizeof(note.desc)) - { - LOG_WARNING(LOADER, "name = %s", std::string((const char *)note.name, 8).c_str()); - LOG_WARNING(LOADER, "ls_size = %d", note.desc.ls_size); - LOG_WARNING(LOADER, "stack_size = %d", note.desc.stack_size); + m_phdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum); + m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_phoff : m_ehdr.data_be.e_phoff)); + size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum) * sizeof(phdr); + if (m_stream->Read(m_phdrs.data(), size) != size) + return broken_file; } else + m_phdrs.clear(); + + if (m_ehdr.data_le.e_shnum) { - LOG_WARNING(LOADER, "desc = '%s'", std::string(note.desc_text, 32).c_str()); + m_phdrs.resize(m_ehdr.is_le() ? m_ehdr.data_le.e_shnum : m_ehdr.data_be.e_shnum); + m_stream->Seek(handler::get_stream_offset() + (m_ehdr.is_le() ? m_ehdr.data_le.e_shoff : m_ehdr.data_be.e_shoff)); + size_t size = (m_ehdr.is_le() ? m_ehdr.data_le.e_phnum : m_ehdr.data_be.e_phnum) * sizeof(phdr); + + if (m_stream->Read(m_shdrs.data(), size) != size) + return broken_file; } - } -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, ""); -#endif - } + else + m_shdrs.clear(); - return true; -} - -bool ELF32Loader::LoadShdrData(u64 offset) -{ - for(u32 i=0; i max_addr) + handler::error_code elf32::load() { - max_addr = shdr.sh_addr + shdr.sh_size; + Elf_Machine machine; + switch (machine = (Elf_Machine)(u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_machine : m_ehdr.data_be.e_machine)) + { + case MACHINE_MIPS: vm::psp::init(); break; + case MACHINE_ARM: vm::psv::init(); break; + case MACHINE_SPU: vm::ps3::init(); break; + + default: + return bad_version; + } + + error_code res = load_data(0); + + if (res != ok) + return res; + + switch (machine) + { + case MACHINE_MIPS: break; + case MACHINE_ARM: arm7_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break; + case MACHINE_SPU: spu_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break; + } + + return ok; + } + + handler::error_code elf32::load_data(u32 offset) + { + for (auto &phdr : m_phdrs) + { + u32 memsz = m_ehdr.is_le() ? phdr.data_le.p_memsz : phdr.data_be.p_memsz; + u32 filesz = m_ehdr.is_le() ? phdr.data_le.p_filesz : phdr.data_be.p_filesz; + u32 vaddr = offset + (m_ehdr.is_le() ? phdr.data_le.p_vaddr : phdr.data_be.p_vaddr); + u32 offset = m_ehdr.is_le() ? phdr.data_le.p_offset : phdr.data_be.p_offset; + + switch (m_ehdr.is_le() ? phdr.data_le.p_type : phdr.data_be.p_type) + { + case 0x00000001: //LOAD + if (phdr.data_le.p_memsz) + { + if (!vm::alloc(vaddr, memsz, vm::main)) + { + LOG_ERROR(LOADER, "%s(): AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, vaddr, memsz); + + return loading_error; + } + + if (filesz) + { + m_stream->Seek(handler::get_stream_offset() + offset); + m_stream->Read(vm::get_ptr(vaddr), filesz); + } + } + break; + } + } + + return ok; } } - - //TODO - return true; -} +} \ No newline at end of file diff --git a/rpcs3/Loader/ELF32.h b/rpcs3/Loader/ELF32.h index 9e1a8a5948..dc37dd5f0b 100644 --- a/rpcs3/Loader/ELF32.h +++ b/rpcs3/Loader/ELF32.h @@ -4,135 +4,137 @@ struct vfsStream; class rFile; -struct Elf32_Ehdr +namespace loader { - u32 e_magic; - u8 e_class; - u8 e_data; - u8 e_curver; - u8 e_os_abi; - u64 e_abi_ver; - u16 e_type; - u16 e_machine; - u32 e_version; - u16 e_entry; - u32 e_phoff; - u32 e_shoff; - u32 e_flags; - u16 e_ehsize; - u16 e_phentsize; - u16 e_phnum; - u16 e_shentsize; - u16 e_shnum; - u16 e_shstrndx; - - void Show(); - - bool IsLittleEndian() const + namespace handlers { - return e_data == 1; + class elf32 : public handler + { + public: + struct ehdr + { + u32 e_magic; + u8 e_class; + u8 e_data; + u8 e_curver; + u8 e_os_abi; + + union + { + struct + { + u64 e_abi_ver; + u16 e_type; + u16 e_machine; + u32 e_version; + u16 e_entry; + u32 e_phoff; + u32 e_shoff; + u32 e_flags; + u16 e_ehsize; + u16 e_phentsize; + u16 e_phnum; + u16 e_shentsize; + u16 e_shnum; + u16 e_shstrndx; + } data_le; + + struct + { + be_t e_abi_ver; + be_t e_type; + be_t e_machine; + be_t e_version; + be_t e_entry; + be_t e_phoff; + be_t e_shoff; + be_t e_flags; + be_t e_ehsize; + be_t e_phentsize; + be_t e_phnum; + be_t e_shentsize; + be_t e_shnum; + be_t e_shstrndx; + } data_be; + }; + + bool is_le() const { return e_data == 1; } + bool check() const { return e_magic == 0x7F454C46; } + }; + + struct shdr + { + union + { + struct + { + u32 sh_name; + u32 sh_type; + u32 sh_flags; + u32 sh_addr; + u32 sh_offset; + u32 sh_size; + u32 sh_link; + u32 sh_info; + u32 sh_addralign; + u32 sh_entsize; + } data_le; + + struct + { + be_t sh_name; + be_t sh_type; + be_t sh_flags; + be_t sh_addr; + be_t sh_offset; + be_t sh_size; + be_t sh_link; + be_t sh_info; + be_t sh_addralign; + be_t sh_entsize; + } data_be; + }; + }; + + struct phdr + { + union + { + struct + { + u32 p_type; + u32 p_offset; + u32 p_vaddr; + u32 p_paddr; + u32 p_filesz; + u32 p_memsz; + u32 p_flags; + u32 p_align; + } data_le; + + struct + { + be_t p_type; + be_t p_offset; + be_t p_vaddr; + be_t p_paddr; + be_t p_filesz; + be_t p_memsz; + be_t p_flags; + be_t p_align; + } data_be; + }; + }; + + ehdr m_ehdr; + std::vector m_phdrs; + std::vector m_shdrs; + + error_code init(vfsStream& stream) override; + error_code load() override; + error_code load_data(u32 offset); + + virtual ~elf32() = default; + }; } - - void Load(vfsStream& f); - - bool CheckMagic() const { return e_magic == 0x7F454C46; } - u32 GetEntry() const { return e_entry; } -}; - -struct Elf32_Desc -{ - u32 revision; - u32 ls_size; - u32 stack_size; - u32 flags; - - void Load(vfsStream& f); - - void LoadLE(vfsStream& f); -}; - -struct Elf32_Note -{ - u32 namesz; - u32 descsz; - u32 type; - u8 name[8]; - union - { - Elf32_Desc desc; - char desc_text[32]; - }; - - void Load(vfsStream& f); - - void LoadLE(vfsStream& f); -}; - -struct Elf32_Shdr -{ - u32 sh_name; - u32 sh_type; - u32 sh_flags; - u32 sh_addr; - u32 sh_offset; - u32 sh_size; - u32 sh_link; - u32 sh_info; - u32 sh_addralign; - u32 sh_entsize; - - void Load(vfsStream& f); - - void LoadLE(vfsStream& f); - - void Show(); -}; - -struct Elf32_Phdr -{ - u32 p_type; - u32 p_offset; - u32 p_vaddr; - u32 p_paddr; - u32 p_filesz; - u32 p_memsz; - u32 p_flags; - u32 p_align; - - void Load(vfsStream& f); - - void LoadLE(vfsStream& f); - - void Show(); -}; - -class ELF32Loader : public LoaderBase -{ - vfsStream& elf32_f; - -public: - Elf32_Ehdr ehdr; - std::vector shdr_name_arr; - std::vector shdr_arr; - std::vector phdr_arr; - - ELF32Loader(vfsStream& f); - ~ELF32Loader() {Close();} - - virtual bool LoadInfo(); - virtual bool LoadData(u64 offset); - virtual bool Close(); - -private: - bool LoadEhdrInfo(); - bool LoadPhdrInfo(); - bool LoadShdrInfo(); - - bool LoadEhdrData(u64 offset); - bool LoadPhdrData(u64 offset); - bool LoadShdrData(u64 offset); -}; - -void WriteEhdr(rFile& f, Elf32_Ehdr& ehdr); -void WritePhdr(rFile& f, Elf32_Phdr& phdr); -void WriteShdr(rFile& f, Elf32_Shdr& shdr); +} diff --git a/rpcs3/Loader/ELF64.cpp b/rpcs3/Loader/ELF64.cpp index 141d5b5031..ea44995c02 100644 --- a/rpcs3/Loader/ELF64.cpp +++ b/rpcs3/Loader/ELF64.cpp @@ -2,552 +2,541 @@ #include "Utilities/Log.h" #include "Utilities/rFile.h" #include "Emu/FS/vfsStream.h" +#include "Emu/FS/vfsFile.h" +#include "Emu/FS/vfsDir.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/Static.h" -#include "Emu/Cell/PPUInstrTable.h" #include "Emu/SysCalls/ModuleManager.h" +#include "Emu/SysCalls/lv2/sys_prx.h" +#include "Emu/Cell/PPUInstrTable.h" +#include "Emu/CPU/CPUThreadManager.h" #include "ELF64.h" +#include "Ini.h" using namespace PPU_instr; -void Elf64_Ehdr::Load(vfsStream& f) +namespace loader { - e_magic = Read32(f); - e_class = Read8(f); - e_data = Read8(f); - e_curver = Read8(f); - e_os_abi = Read8(f); - e_abi_ver = Read64(f); - e_type = Read16(f); - e_machine = Read16(f); - e_version = Read32(f); - e_entry = Read64(f); - e_phoff = Read64(f); - e_shoff = Read64(f); - e_flags = Read32(f); - e_ehsize = Read16(f); - e_phentsize = Read16(f); - e_phnum = Read16(f); - e_shentsize = Read16(f); - e_shnum = Read16(f); - e_shstrndx = Read16(f); -} - -void Elf64_Ehdr::Show() -{ -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "Magic: %08x", e_magic); - LOG_NOTICE(LOADER, "Class: %s", "ELF64"); - LOG_NOTICE(LOADER, "Data: %s", Ehdr_DataToString(e_data).c_str()); - LOG_NOTICE(LOADER, "Current Version: %d", e_curver); - LOG_NOTICE(LOADER, "OS/ABI: %s", Ehdr_OS_ABIToString(e_os_abi).c_str()); - LOG_NOTICE(LOADER, "ABI version: %lld", e_abi_ver); - LOG_NOTICE(LOADER, "Type: %s", Ehdr_TypeToString(e_type).c_str()); - LOG_NOTICE(LOADER, "Machine: %s", Ehdr_MachineToString(e_machine).c_str()); - LOG_NOTICE(LOADER, "Version: %d", e_version); - LOG_NOTICE(LOADER, "Entry point address: 0x%08llx", e_entry); - LOG_NOTICE(LOADER, "Program headers offset: 0x%08llx", e_phoff); - LOG_NOTICE(LOADER, "Section headers offset: 0x%08llx", e_shoff); - LOG_NOTICE(LOADER, "Flags: 0x%x", e_flags); - LOG_NOTICE(LOADER, "Size of this header: %d", e_ehsize); - LOG_NOTICE(LOADER, "Size of program headers: %d", e_phentsize); - LOG_NOTICE(LOADER, "Number of program headers: %d", e_phnum); - LOG_NOTICE(LOADER, "Size of section headers: %d", e_shentsize); - LOG_NOTICE(LOADER, "Number of section headers: %d", e_shnum); - LOG_NOTICE(LOADER, "Section header string table index: %d", e_shstrndx); -#endif -} - -void Elf64_Shdr::Load(vfsStream& f) -{ - sh_name = Read32(f); - sh_type = Read32(f); - sh_flags = Read64(f); - sh_addr = Read64(f); - sh_offset = Read64(f); - sh_size = Read64(f); - sh_link = Read32(f); - sh_info = Read32(f); - sh_addralign = Read64(f); - sh_entsize = Read64(f); -} - -void Elf64_Shdr::Show() -{ -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "Name offset: %x", sh_name); - LOG_NOTICE(LOADER, "Type: %d", sh_type); - LOG_NOTICE(LOADER, "Addr: %llx", sh_addr); - LOG_NOTICE(LOADER, "Offset: %llx", sh_offset); - LOG_NOTICE(LOADER, "Size: %llx", sh_size); - LOG_NOTICE(LOADER, "EntSize: %lld", sh_entsize); - LOG_NOTICE(LOADER, "Flags: %llx", sh_flags); - LOG_NOTICE(LOADER, "Link: %x", sh_link); - LOG_NOTICE(LOADER, "Info: %x", sh_info); - LOG_NOTICE(LOADER, "Address align: %llx", sh_addralign); -#endif -} - -void Elf64_Phdr::Load(vfsStream& f) -{ - p_type = Read32(f); - p_flags = Read32(f); - p_offset = Read64(f); - p_vaddr = Read64(f); - p_paddr = Read64(f); - p_filesz = Read64(f); - p_memsz = Read64(f); - p_align = Read64(f); -} - -void Elf64_Phdr::Show() -{ -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "Type: %s", Phdr_TypeToString(p_type).c_str()); - LOG_NOTICE(LOADER, "Offset: 0x%08llx", p_offset); - LOG_NOTICE(LOADER, "Virtual address: 0x%08llx", p_vaddr); - LOG_NOTICE(LOADER, "Physical address: 0x%08llx", p_paddr); - LOG_NOTICE(LOADER, "File size: 0x%08llx", p_filesz); - LOG_NOTICE(LOADER, "Memory size: 0x%08llx", p_memsz); - LOG_NOTICE(LOADER, "Flags: %s", Phdr_FlagsToString(p_flags).c_str()); - LOG_NOTICE(LOADER, "Align: 0x%llx", p_align); -#endif -} - -void WriteEhdr(rFile& f, Elf64_Ehdr& ehdr) -{ - Write32(f, ehdr.e_magic); - Write8(f, ehdr.e_class); - Write8(f, ehdr.e_data); - Write8(f, ehdr.e_curver); - Write8(f, ehdr.e_os_abi); - Write64(f, ehdr.e_abi_ver); - Write16(f, ehdr.e_type); - Write16(f, ehdr.e_machine); - Write32(f, ehdr.e_version); - Write64(f, ehdr.e_entry); - Write64(f, ehdr.e_phoff); - Write64(f, ehdr.e_shoff); - Write32(f, ehdr.e_flags); - Write16(f, ehdr.e_ehsize); - Write16(f, ehdr.e_phentsize); - Write16(f, ehdr.e_phnum); - Write16(f, ehdr.e_shentsize); - Write16(f, ehdr.e_shnum); - Write16(f, ehdr.e_shstrndx); -} - -void WritePhdr(rFile& f, Elf64_Phdr& phdr) -{ - Write32(f, phdr.p_type); - Write32(f, phdr.p_flags); - Write64(f, phdr.p_offset); - Write64(f, phdr.p_vaddr); - Write64(f, phdr.p_paddr); - Write64(f, phdr.p_filesz); - Write64(f, phdr.p_memsz); - Write64(f, phdr.p_align); -} - -void WriteShdr(rFile& f, Elf64_Shdr& shdr) -{ - Write32(f, shdr.sh_name); - Write32(f, shdr.sh_type); - Write64(f, shdr.sh_flags); - Write64(f, shdr.sh_addr); - Write64(f, shdr.sh_offset); - Write64(f, shdr.sh_size); - Write32(f, shdr.sh_link); - Write32(f, shdr.sh_info); - Write64(f, shdr.sh_addralign); - Write64(f, shdr.sh_entsize); -} - -ELF64Loader::ELF64Loader(vfsStream& f) - : elf64_f(f) - , LoaderBase() -{ - int a = 0; -} - -bool ELF64Loader::LoadInfo() -{ - if(!elf64_f.IsOpened()) return false; - - if(!LoadEhdrInfo()) return false; - if(!LoadPhdrInfo()) return false; - if(!LoadShdrInfo()) return false; - - return true; -} - -bool ELF64Loader::LoadData(u64 offset) -{ - if(!elf64_f.IsOpened()) return false; - - if(!LoadEhdrData(offset)) return false; - if(!LoadPhdrData(offset)) return false; - if(!LoadShdrData(offset)) return false; - - return true; -} - -bool ELF64Loader::Close() -{ - return elf64_f.Close(); -} - -bool ELF64Loader::LoadEhdrInfo(s64 offset) -{ - elf64_f.Seek(offset < 0 ? 0 : offset); - ehdr.Load(elf64_f); - - if(!ehdr.CheckMagic()) return false; - - if(ehdr.e_phentsize != sizeof(Elf64_Phdr)) + namespace handlers { - LOG_ERROR(LOADER, "elf64 error: e_phentsize[0x%x] != sizeof(Elf64_Phdr)[0x%x]", ehdr.e_phentsize, sizeof(Elf64_Phdr)); - return false; - } - - if(ehdr.e_shentsize != sizeof(Elf64_Shdr)) - { - LOG_ERROR(LOADER, "elf64 error: e_shentsize[0x%x] != sizeof(Elf64_Shdr)[0x%x]", ehdr.e_shentsize, sizeof(Elf64_Shdr)); - return false; - } - - switch(ehdr.e_machine) - { - case MACHINE_PPC64: - case MACHINE_SPU: - machine = (Elf_Machine)ehdr.e_machine; - break; - - default: - machine = MACHINE_Unknown; - LOG_ERROR(LOADER, "Unknown elf64 type: 0x%x", ehdr.e_machine); - return false; - } - - entry = (u32)ehdr.GetEntry(); - if(entry == 0) - { - LOG_ERROR(LOADER, "elf64 error: entry is null!"); - return false; - } - - return true; -} - -bool ELF64Loader::LoadPhdrInfo(s64 offset) -{ - phdr_arr.clear(); - - if(ehdr.e_phoff == 0 && ehdr.e_phnum) - { - LOG_ERROR(LOADER, "LoadPhdr64 error: Program header offset is null!"); - return false; - } - - elf64_f.Seek(offset < 0 ? ehdr.e_phoff : offset); - - for(u32 i=0; i= shdr_arr.size()) - { - LOG_WARNING(LOADER, "LoadShdr64 error: shstrndx too big!"); - return true; - } - - for(u32 i=0; iRead(&m_ehdr, sizeof(ehdr)); -bool ELF64Loader::LoadPhdrData(u64 offset) -{ - for(auto& phdr: phdr_arr) - { - phdr.Show(); - - if (phdr.p_vaddr < min_addr) - { - min_addr = (u32)phdr.p_vaddr; - } - - if (phdr.p_vaddr + phdr.p_memsz > max_addr) - { - max_addr = (u32)(phdr.p_vaddr + phdr.p_memsz); - } - - if (phdr.p_vaddr != phdr.p_paddr) - { - LOG_WARNING(LOADER, "ElfProgram different load addrs: paddr=0x%8.8x, vaddr=0x%8.8x", - phdr.p_paddr, phdr.p_vaddr); - } - - if(!Memory.MainMem.IsInMyRange(offset + phdr.p_vaddr, (u32)phdr.p_memsz)) - { -#ifdef LOADER_DEBUG - LOG_WARNING(LOADER, "Skipping..."); - LOG_WARNING(LOADER, ""); -#endif - continue; - } - - switch(phdr.p_type) - { - case 0x00000001: //LOAD - if(phdr.p_memsz) - { - if (!Memory.MainMem.AllocFixed(offset + phdr.p_vaddr, (u32)phdr.p_memsz)) - { - LOG_ERROR(LOADER, "%s(): AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, offset + phdr.p_vaddr, (u32)phdr.p_memsz); - } - else if (phdr.p_filesz) - { - elf64_f.Seek(phdr.p_offset); - elf64_f.Read(vm::get_ptr(offset + phdr.p_vaddr), phdr.p_filesz); - Emu.GetSFuncManager().StaticAnalyse(vm::get_ptr(offset + phdr.p_vaddr), (u32)phdr.p_filesz, (u32)phdr.p_vaddr); - } - } - break; - - case 0x00000007: //TLS - Emu.SetTLSData(offset + phdr.p_vaddr, phdr.p_filesz, phdr.p_memsz); - break; - - case 0x60000001: //LOOS+1 + if (!m_ehdr.check()) { - if(!phdr.p_filesz) + return bad_file; + } + + if (m_ehdr.e_phnum && m_ehdr.e_phentsize != sizeof(phdr)) + { + return broken_file; + } + + if (m_ehdr.e_shnum && m_ehdr.e_shentsize != sizeof(shdr)) + { + return broken_file; + } + + if (m_ehdr.e_machine != MACHINE_PPC64 && m_ehdr.e_machine != MACHINE_SPU) + { + LOG_ERROR(LOADER, "Unknown elf64 machine type: 0x%x", m_ehdr.e_machine.ToLE()); + return bad_version; + } + + if (m_ehdr.e_phnum) + { + m_phdrs.resize(m_ehdr.e_phnum); + m_stream->Seek(handler::get_stream_offset() + m_ehdr.e_phoff); + if (m_stream->Read(m_phdrs.data(), m_ehdr.e_phnum * sizeof(phdr)) != m_ehdr.e_phnum * sizeof(phdr)) + return broken_file; + } + else + m_phdrs.clear(); + + if (m_ehdr.e_shnum) + { + m_shdrs.resize(m_ehdr.e_shnum); + m_stream->Seek(handler::get_stream_offset() + m_ehdr.e_shoff); + if (m_stream->Read(m_shdrs.data(), m_ehdr.e_shnum * sizeof(shdr)) != m_ehdr.e_shnum * sizeof(shdr)) + return broken_file; + } + else + m_shdrs.clear(); + + if (is_sprx()) + { + m_stream->Seek(handler::get_stream_offset() + m_phdrs[0].p_paddr.addr()); + m_stream->Read(&m_sprx_module_info, sizeof(sprx_module_info)); + + //m_stream->Seek(handler::get_stream_offset() + m_phdrs[1].p_vaddr.addr()); + //m_stream->Read(&m_sprx_function_info, sizeof(sprx_function_info)); + } + else + { + m_sprx_import_info.clear(); + m_sprx_export_info.clear(); + } + + return ok; + } + + handler::error_code elf64::load_sprx(sprx_info& info) + { + for (auto &phdr : m_phdrs) + { + switch ((u32)phdr.p_type) + { + case 0x1: //load + if (phdr.p_memsz) + { + sprx_segment_info segment; + segment.size = phdr.p_memsz; + segment.size_file = phdr.p_filesz; + + segment.begin.set(vm::alloc(segment.size, vm::sprx)); + + if (!segment.begin) + { + LOG_ERROR(LOADER, "%s() sprx: AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, phdr.p_vaddr.addr(), (u32)phdr.p_memsz); + + return loading_error; + } + + segment.initial_addr.set(phdr.p_vaddr.addr()); + LOG_ERROR(LOADER, "segment addr=0x%x, initial addr = 0x%x", segment.begin.addr(), segment.initial_addr.addr()); + + if (phdr.p_filesz) + { + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset); + m_stream->Read(segment.begin.get_ptr(), phdr.p_filesz); + } + + if (phdr.p_paddr) + { + sys_prx_module_info_t module_info; + m_stream->Seek(handler::get_stream_offset() + phdr.p_paddr.addr()); + m_stream->Read(&module_info, sizeof(module_info)); + LOG_ERROR(LOADER, "%s (%x):", module_info.name, (u32)module_info.toc); + info.name = std::string((const char*)module_info.name, 28); + info.rtoc = module_info.toc; + + int import_count = (module_info.imports_end - module_info.imports_start) / sizeof(sys_prx_library_info_t); + + if (import_count) + { + LOG_ERROR(LOADER, "**** Lib '%s'has %d imports!", module_info.name, import_count); + break; + } + + sys_prx_library_info_t lib; + for (u32 e = module_info.exports_start.addr(); + e < module_info.exports_end.addr(); + e += lib.size ? lib.size : sizeof(sys_prx_library_info_t)) + { + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset + e); + m_stream->Read(&lib, sizeof(lib)); + + std::string modulename; + if (lib.name_addr) + { + char name[27]; + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset + lib.name_addr); + m_stream->Read(name, sizeof(name)); + modulename = std::string(name); + LOG_ERROR(LOADER, "**** %s", name); + } + + auto &module = info.modules[modulename]; + + LOG_ERROR(LOADER, "**** 0x%x - 0x%x - 0x%x", (u32)lib.unk4, (u32)lib.unk5, (u32)lib.unk6); + + for (u16 i = 0, end = lib.num_func; i < end; ++i) + { + be_t fnid, fstub; + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset + lib.fnid_addr + i * sizeof(fnid)); + m_stream->Read(&fnid, sizeof(fnid)); + + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset + lib.fstub_addr + i * sizeof(fstub)); + m_stream->Read(&fstub, sizeof(fstub)); + + module.exports[fnid] = fstub; + + //LOG_NOTICE(LOADER, "Exported function '%s' in '%s' module (LLE)", SysCalls::GetHLEFuncName(fnid).c_str(), module_name.c_str()); + LOG_ERROR(LOADER, "**** %s: [%s] -> 0x%x", modulename.c_str(), SysCalls::GetHLEFuncName(fnid).c_str(), (u32)fstub); + } + } + + for (u32 i = module_info.imports_start; + i < module_info.imports_end; + i += lib.size ? lib.size : sizeof(sys_prx_library_info_t)) + { + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset + i); + m_stream->Read(&lib, sizeof(lib)); + } + } + + info.segments.push_back(segment); + } + break; - auto& proc_param = vm::get_ref(offset + phdr.p_vaddr); + case 0x700000a4: //relocation + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset); - if (proc_param.size < sizeof(sys_process_param)) - { - LOG_WARNING(LOADER, "Bad proc param size! [0x%x : 0x%x]", proc_param.size, sizeof(sys_process_param)); - } - if (proc_param.magic != 0x13bcc5f6) - { - LOG_ERROR(LOADER, "Bad magic! [0x%x]", proc_param.magic); - } - else - { -#ifdef LOADER_DEBUG - sys_process_param_info& info = Emu.GetInfo().GetProcParam(); - LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version.ToLE()); - LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio.ToLE()); - LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize.ToLE()); - LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize.ToLE()); - LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg.ToLE()); - //LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr.ToLE()); -#endif + for (uint i = 0; i < phdr.p_filesz; i += sizeof(sys_prx_relocation_info_t)) + { + sys_prx_relocation_info_t rel; + m_stream->Read(&rel, sizeof(rel)); + + u32 ADDR = info.segments[rel.index_addr].begin.addr() + rel.offset; + + switch ((u32)rel.type) + { + case 1: + LOG_WARNING(LOADER, "**** RELOCATION(1): 0x%x <- 0x%x", ADDR, (u32)(info.segments[rel.index_value].begin.addr() + rel.ptr.addr())); + *vm::ptr::make(ADDR) = info.segments[rel.index_value].begin.addr() + rel.ptr.addr(); + break; + + case 4: + LOG_WARNING(LOADER, "**** RELOCATION(4): 0x%x <- 0x%x", ADDR, (u16)(rel.ptr.addr())); + *vm::ptr::make(ADDR) = (u16)(u64)rel.ptr.addr(); + break; + + case 5: + LOG_WARNING(LOADER, "**** RELOCATION(5): 0x%x <- 0x%x", ADDR, (u16)(info.segments[rel.index_value].begin.addr() >> 16)); + *vm::ptr::make(ADDR) = info.segments[rel.index_value].begin.addr() >> 16; + break; + + case 6: + LOG_ERROR(LOADER, "**** RELOCATION(6): 0x%x <- 0x%x", ADDR, (u16)(info.segments[1].begin.addr() >> 16)); + *vm::ptr::make(ADDR) = info.segments[1].begin.addr() >> 16; + break; + + default: + LOG_ERROR(LOADER, "unknown prx relocation type (0x%x)", (u32)rel.type); + return bad_relocation_type; + } + } + + break; } } - break; - case 0x60000002: //LOOS+2 + for (auto &m : info.modules) { - if(!phdr.p_filesz) - break; - - sys_proc_prx_param proc_prx_param = vm::get_ref(offset + phdr.p_vaddr); - - -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "*** size: 0x%x", proc_prx_param.size.ToLE()); - LOG_NOTICE(LOADER, "*** magic: 0x%x", proc_prx_param.magic.ToLE()); - LOG_NOTICE(LOADER, "*** version: 0x%x", proc_prx_param.version.ToLE()); - LOG_NOTICE(LOADER, "*** libentstart: 0x%x", proc_prx_param.libentstart.ToLE()); - LOG_NOTICE(LOADER, "*** libentend: 0x%x", proc_prx_param.libentend.ToLE()); - LOG_NOTICE(LOADER, "*** libstubstart: 0x%x", proc_prx_param.libstubstart.ToLE()); - LOG_NOTICE(LOADER, "*** libstubend: 0x%x", proc_prx_param.libstubend.ToLE()); - LOG_NOTICE(LOADER, "*** ver: 0x%x", proc_prx_param.ver.ToLE()); -#endif - - if (proc_prx_param.magic != 0x1b434cec) { - LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic.ToLE()); - break; - } - - for(u32 s=proc_prx_param.libstubstart; s(offset + s); + u32 stub = e.second; - const std::string module_name = vm::get_ptr(stub.s_modulename); - Module* module = Emu.GetModuleManager().GetModuleByName(module_name); - if (module) { - //module->SetLoaded(); - } - else { - LOG_WARNING(LOADER, "Unknown module '%s'", module_name.c_str()); - } - -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, ""); - LOG_NOTICE(LOADER, "*** size: 0x%x", stub.s_size); - LOG_NOTICE(LOADER, "*** version: 0x%x", stub.s_version.ToLE()); - LOG_NOTICE(LOADER, "*** unk0: 0x%x", stub.s_unk0); - LOG_NOTICE(LOADER, "*** unk1: 0x%x", stub.s_unk1.ToLE()); - LOG_NOTICE(LOADER, "*** imports: %d", stub.s_imports.ToLE()); - LOG_NOTICE(LOADER, "*** module name: %s [0x%x]", module_name.c_str(), stub.s_modulename.ToLE()); - LOG_NOTICE(LOADER, "*** nid: 0x%016llx [0x%x]", vm::read64(stub.s_nid), stub.s_nid.ToLE()); - LOG_NOTICE(LOADER, "*** text: 0x%x", stub.s_text.ToLE()); -#endif - static const u32 section = 4 * 3; - u64 tbl = Memory.MainMem.AllocAlign(stub.s_imports * 4 * 2); - u64 dst = Memory.MainMem.AllocAlign(stub.s_imports * section); - - for(u32 i=0; iLoad(nid)) + if (stub >= s.initial_addr.addr() && stub < s.initial_addr.addr() + s.size_file) { - LOG_WARNING(LOADER, "Unimplemented function '%s' in '%s' module", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str()); + stub += s.begin.addr() - s.initial_addr.addr(); + break; } - else //if (Ini.HLELogging.GetValue()) + } + + e.second = stub; + } + } + + return ok; + } + + handler::error_code elf64::load() + { + if (is_sprx()) + { + sprx_info info; + return load_sprx(info); + } + + Emu.m_sdk_version = -1; + + //store elf to memory + vm::ps3::init(); + + std::vector start_funcs; + std::vector stop_funcs; + + //load modules + vfsDir lle_dir("/dev_flash/sys/external"); + + for (const auto module : lle_dir) + { + elf64 sprx_handler; + vfsFile fsprx(lle_dir.GetPath() + "/" + module->name); + + if (fsprx.IsOpened()) + { + sprx_handler.init(fsprx); + + if (sprx_handler.is_sprx()) + { + IniEntry load_lib; + load_lib.Init(sprx_handler.sprx_get_module_name(), "LLE"); + + if (!load_lib.LoadValue(false)) { - LOG_NOTICE(LOADER, "Imported function '%s' in '%s' module", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str()); + LOG_ERROR(LOADER, "skipped lle library '%s'", sprx_handler.sprx_get_module_name().c_str()); + continue; + } + else + { + LOG_WARNING(LOADER, "loading lle library '%s'", sprx_handler.sprx_get_module_name().c_str()); } -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, "import %d:", i+1); - LOG_NOTICE(LOADER, "*** nid: 0x%x (0x%x)", nid, stub.s_nid + i*4); - LOG_NOTICE(LOADER, "*** text: 0x%x (0x%x)", text, stub.s_text + i*4); -#endif - vm::write32(stub.s_text + i*4, (u32)tbl + i*8); - auto out_tbl = vm::ptr>::make((u32)tbl + i * 8); - out_tbl[0] = (u32)dst + i*section; - out_tbl[1] = Emu.GetModuleManager().GetFuncNumById(nid); + sprx_info info; + sprx_handler.load_sprx(info); - auto out_dst = vm::ptr>::make((u32)dst + i*section); - out_dst[0] = OR(11, 2, 2, 0); - out_dst[1] = SC(2); - out_dst[2] = BCLR(0x10 | 0x04, 0, 0, 0); + for (auto &m : info.modules) + { + if (m.first == "") + { + for (auto &e : m.second.exports) + { + switch (e.first) + { + case 0xbc9a0086: start_funcs.push_back(e.second); break; + case 0xab779874: stop_funcs.push_back(e.second); break; + + default: LOG_ERROR(LOADER, "unknown special func 0x%08x in '%s' library", e.first, info.name.c_str()); break; + } + } + + continue; + } + + Module* module = Emu.GetModuleManager().GetModuleByName(m.first); + + if (!module) + { + LOG_ERROR(LOADER, "unknown module '%s' in '%s' library", m.first.c_str(), info.name.c_str()); + module = new Module(-1, m.first.c_str()); + } + + for (auto &e : m.second.exports) + { + module->RegisterLLEFunc(e.first, vm::ptr::make(e.second)); + } + } } } -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, ""); -#endif } - break; - } -#ifdef LOADER_DEBUG - LOG_NOTICE(LOADER, ""); -#endif - } - return true; -} + error_code res = load_data(0); + if (res != ok) + return res; -bool ELF64Loader::LoadShdrData(u64 offset) -{ - u64 max_addr = 0; + //initialize process + auto rsx_callback_data = vm::ptr::make(Memory.MainMem.AllocAlign(4 * 4)); + *rsx_callback_data++ = (rsx_callback_data + 1).addr(); + Emu.SetRSXCallback(rsx_callback_data.addr()); - for(uint i=0; i::make(Memory.MainMem.AllocAlign(3 * 4)); + ppu_thr_exit_data[0] = ADDI(r11, 0, 41); + ppu_thr_exit_data[1] = SC(2); + ppu_thr_exit_data[2] = BLR(); + Emu.SetPPUThreadExit(ppu_thr_exit_data.addr()); + + auto ppu_thr_stop_data = vm::ptr::make(Memory.MainMem.AllocAlign(2 * 4)); + ppu_thr_stop_data[0] = SC(4); + ppu_thr_stop_data[1] = BLR(); + Emu.SetPPUThreadStop(ppu_thr_stop_data.addr()); + + vm::write64(Memory.PRXMem.AllocAlign(0x10000), 0xDEADBEEFABADCAFE); + /* + //TODO + static const int branch_size = 6 * 4; + auto make_branch = [](vm::ptr& ptr, u32 addr) + { + u32 stub = vm::read32(addr); + u32 rtoc = vm::read32(addr + 4); + + *ptr++ = implicts::LI(r0, stub >> 16); + *ptr++ = ORIS(r0, r0, stub & 0xffff); + *ptr++ = implicts::LI(r2, rtoc >> 16); + *ptr++ = ORIS(r2, r2, rtoc & 0xffff); + *ptr++ = MTCTR(r0); + *ptr++ = BCTRL(); + }; + + auto entry = vm::ptr::make(vm::alloc(branch_size * (start_funcs.size() + 1), vm::main)); + + auto OPD = vm::ptr::make(vm::alloc(2 * 4)); + OPD[0] = entry.addr(); + OPD[1] = 0; + + for (auto &f : start_funcs) + { + make_branch(entry, f); + } + + make_branch(entry, m_ehdr.e_entry); + */ + + ppu_thread main_thread(m_ehdr.e_entry, "main_thread"); + + main_thread.args({ Emu.GetPath()/*, "-emu"*/ }).run(); + main_thread.gpr(11, m_ehdr.e_entry).gpr(12, Emu.GetMallocPageSize()); + + return ok; } -#ifdef LOADER_DEBUG - shdr.Show(); - LOG_NOTICE(LOADER, " "); -#endif - if(shdr.sh_addr + shdr.sh_size > max_addr) max_addr = shdr.sh_addr + shdr.sh_size; - - if((shdr.sh_flags & SHF_ALLOC) != SHF_ALLOC) continue; - - const u64 addr = shdr.sh_addr; - const u64 size = shdr.sh_size; - - if(size == 0 || !Memory.IsGoodAddr(offset + addr, (u32)size)) continue; - - if(shdr.sh_addr && shdr.sh_addr < min_addr) + handler::error_code elf64::load_data(u64 offset) { - min_addr = (u32)shdr.sh_addr; - } + for (auto &phdr : m_phdrs) + { + switch (phdr.p_type.ToLE()) + { + case 0x00000001: //LOAD + if (phdr.p_memsz) + { + if (!vm::alloc(phdr.p_vaddr.addr(), (u32)phdr.p_memsz, vm::main)) + { + LOG_ERROR(LOADER, "%s(): AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, phdr.p_vaddr, (u32)phdr.p_memsz); - if(shdr.sh_addr + shdr.sh_size > max_addr) - { - max_addr = (u32)(shdr.sh_addr + shdr.sh_size); - } + return loading_error; + } - if((shdr.sh_type == SHT_RELA) || (shdr.sh_type == SHT_REL)) - { - LOG_ERROR(LOADER, "ELF64 ERROR: Relocation"); - continue; - } + if (phdr.p_filesz) + { + m_stream->Seek(handler::get_stream_offset() + phdr.p_offset); + m_stream->Read(phdr.p_vaddr.get_ptr(), phdr.p_filesz); + Emu.GetSFuncManager().StaticAnalyse(phdr.p_vaddr.get_ptr(), (u32)phdr.p_filesz, phdr.p_vaddr.addr()); + } + } + break; - switch(shdr.sh_type) - { - case SHT_NOBITS: - //LOG_WARNING(LOADER, "SHT_NOBITS: addr=0x%llx, size=0x%llx", offset + addr, size); - //memset(&Memory[offset + addr], 0, size); - break; + case 0x00000007: //TLS + Emu.SetTLSData(phdr.p_vaddr.addr(), phdr.p_filesz.value(), phdr.p_memsz.value()); + break; - case SHT_PROGBITS: - //elf64_f.Seek(shdr.sh_offset); - //elf64_f.Read(&Memory[offset + addr], shdr.sh_size); - break; + case 0x60000001: //LOOS+1 + if (phdr.p_filesz) + { + const sys_process_param& proc_param = *(sys_process_param*)phdr.p_vaddr.get_ptr(); + + if (proc_param.size < sizeof(sys_process_param)) + { + LOG_WARNING(LOADER, "Bad process_param size! [0x%x : 0x%x]", proc_param.size, sizeof(sys_process_param)); + } + if (proc_param.magic != 0x13bcc5f6) + { + LOG_ERROR(LOADER, "Bad process_param magic! [0x%x]", proc_param.magic); + } + else + { + sys_process_param_info& info = Emu.GetInfo().GetProcParam(); + /* + LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version.ToLE()); + LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio.ToLE()); + LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize.ToLE()); + LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize.ToLE()); + LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg.ToLE()); + //LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr.ToLE()); + */ + + info = proc_param.info; + Emu.m_sdk_version = info.sdk_version; + } + } + break; + + case 0x60000002: //LOOS+2 + if (phdr.p_filesz) + { + const sys_proc_prx_param& proc_prx_param = *(sys_proc_prx_param*)phdr.p_vaddr.get_ptr(); + + if (proc_prx_param.magic != 0x1b434cec) + { + LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic.ToLE()); + break; + } + + for (auto stub = proc_prx_param.libstubstart; stub < proc_prx_param.libstubend; ++stub) + { + const std::string module_name = stub->s_modulename.get_ptr(); + Module* module = Emu.GetModuleManager().GetModuleByName(module_name); + if (module) + { + //module->SetLoaded(); + } + else + { + LOG_WARNING(LOADER, "Unknown module '%s'", module_name.c_str()); + } + + struct tbl_item + { + be_t stub; + be_t rtoc; + }; + + struct stub_data_t + { + be_t data[3]; + } + static const stub_data = + { + be_t::make(MR(11, 2)), + be_t::make(SC(2)), + be_t::make(BLR()) + }; + + const auto& tbl = vm::get().alloc(stub->s_imports); + const auto& dst = vm::get().alloc(stub->s_imports); + + for (u32 i = 0; i < stub->s_imports; ++i) + { + const u32 nid = stub->s_nid[i]; + auto func = module ? module->GetFunc(nid) : nullptr; + + if (!func || !func->lle_func) + { + dst[i] = stub_data; + + tbl[i].stub = (dst + i).addr(); + tbl[i].rtoc = stub->s_nid[i]; + + stub->s_text[i] = (tbl + i).addr(); + + if (module && !module->Load(nid)) + { + LOG_WARNING(LOADER, "Unimplemented function '%s' in '%s' module (HLE)", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str()); + } + else //if (Ini.HLELogging.GetValue()) + { + LOG_NOTICE(LOADER, "Imported function '%s' in '%s' module (HLE)", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str()); + } + } + else + { + stub->s_text[i] = func->lle_func.addr(); + //Is function auto exported, than we can use it + LOG_NOTICE(LOADER, "Imported function '%s' in '%s' module (LLE: 0x%x)", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str(), (u32)stub->s_text[i]); + } + } + } + } + break; + } + } + + return ok; } } - - return true; } diff --git a/rpcs3/Loader/ELF64.h b/rpcs3/Loader/ELF64.h index 7843b9f569..b78cd643ed 100644 --- a/rpcs3/Loader/ELF64.h +++ b/rpcs3/Loader/ELF64.h @@ -1,102 +1,165 @@ #pragma once #include "Loader.h" +#include struct vfsStream; class rFile; -struct Elf64_Ehdr +namespace loader { - u32 e_magic; - u8 e_class; - u8 e_data; - u8 e_curver; - u8 e_os_abi; - u64 e_abi_ver; - u16 e_type; - u16 e_machine; - u32 e_version; - u64 e_entry; - u64 e_phoff; - u64 e_shoff; - u32 e_flags; - u16 e_ehsize; - u16 e_phentsize; - u16 e_phnum; - u16 e_shentsize; - u16 e_shnum; - u16 e_shstrndx; + namespace handlers + { + class elf64 : public handler + { + public: + struct ehdr + { + be_t e_magic; + u8 e_class; + u8 e_data; + u8 e_curver; + u8 e_os_abi; + be_t e_abi_ver; + be_t e_type; + be_t e_machine; + be_t e_version; + be_t e_entry; + be_t e_phoff; + be_t e_shoff; + be_t e_flags; + be_t e_ehsize; + be_t e_phentsize; + be_t e_phnum; + be_t e_shentsize; + be_t e_shnum; + be_t e_shstrndx; - void Load(vfsStream& f); + bool check() const { return e_magic.ToBE() == se32(0x7F454C46); } + } m_ehdr; - void Show(); + struct phdr + { + be_t p_type; + be_t p_flags; + be_t p_offset; + bptr p_vaddr; + bptr p_paddr; + be_t p_filesz; + be_t p_memsz; + be_t p_align; + }; - bool CheckMagic() const { return e_magic == 0x7F454C46; } - u64 GetEntry() const { return e_entry; } -}; + struct shdr + { + be_t sh_name; + be_t sh_type; + be_t sh_flags; + bptr sh_addr; + be_t sh_offset; + be_t sh_size; + be_t sh_link; + be_t sh_info; + be_t sh_addralign; + be_t sh_entsize; + }; -struct Elf64_Shdr -{ - u32 sh_name; - u32 sh_type; - u64 sh_flags; - u64 sh_addr; - u64 sh_offset; - u64 sh_size; - u32 sh_link; - u32 sh_info; - u64 sh_addralign; - u64 sh_entsize; + struct sprx_module_info + { + be_t attr; + u8 version[2]; + char name[28]; + be_t toc_addr; + be_t export_start; + be_t export_end; + be_t import_start; + be_t import_end; + } m_sprx_module_info; - void Load(vfsStream& f); + struct sprx_export_info + { + u8 size; + u8 padding; + be_t version; + be_t attr; + be_t func_count; + be_t vars_count; + be_t tls_vars_count; + be_t hash_info; + be_t tls_hash_info; + u8 reserved[2]; + be_t lib_name_offset; + be_t nid_offset; + be_t stub_offset; + }; - void Show(); -}; + struct sprx_import_info + { + u8 size; + u8 unused; + be_t version; + be_t attr; + be_t func_count; + be_t vars_count; + be_t tls_vars_count; + u8 reserved[4]; + be_t lib_name_offset; + be_t nid_offset; + be_t stub_offset; + //... + }; -struct Elf64_Phdr -{ - u32 p_type; - u32 p_flags; - u64 p_offset; - u64 p_vaddr; - u64 p_paddr; - u64 p_filesz; - u64 p_memsz; - u64 p_align; + struct sprx_function_info + { + be_t name_table_offset; + be_t entry_table_offset; + be_t padding; + } m_sprx_function_info; - void Load(vfsStream& f); + struct sprx_lib_info + { + std::string name; + }; - void Show(); -}; + struct sprx_segment_info + { + vm::ptr begin; + u32 size; + u32 size_file; + vm::ptr initial_addr; + std::vector modules; + }; -class ELF64Loader : public LoaderBase -{ - vfsStream& elf64_f; + struct sprx_info + { + std::string name; + u32 rtoc; -public: - Elf64_Ehdr ehdr; - std::vector shdr_name_arr; - std::vector shdr_arr; - std::vector phdr_arr; + struct module_info + { + std::unordered_map exports; + std::unordered_map imports; + }; - ELF64Loader(vfsStream& f); - ~ELF64Loader() {Close();} + std::unordered_map modules; + std::vector segments; + }; - virtual bool LoadInfo(); - virtual bool LoadData(u64 offset = 0); - virtual bool Close(); + std::vector m_phdrs; + std::vector m_shdrs; - bool LoadEhdrInfo(s64 offset=-1); - bool LoadPhdrInfo(s64 offset=-1); - bool LoadShdrInfo(s64 offset=-1); + std::vector m_sprx_segments_info; + std::vector m_sprx_import_info; + std::vector m_sprx_export_info; -private: - bool LoadEhdrData(u64 offset); - bool LoadPhdrData(u64 offset); - bool LoadShdrData(u64 offset); + public: + virtual ~elf64() = default; - //bool LoadImports(); -}; - -void WriteEhdr(rFile& f, Elf64_Ehdr& ehdr); -void WritePhdr(rFile& f, Elf64_Phdr& phdr); -void WriteShdr(rFile& f, Elf64_Shdr& shdr); + error_code init(vfsStream& stream) override; + error_code load() override; + error_code load_data(u64 offset); + error_code load_sprx(sprx_info& info); + bool is_sprx() const { return m_ehdr.e_type == 0xffa4; } + std::string sprx_get_module_name() const { return m_sprx_module_info.name; } + }; + } +} \ No newline at end of file diff --git a/rpcs3/Loader/Loader.cpp b/rpcs3/Loader/Loader.cpp index d06511889e..e2567a60f0 100644 --- a/rpcs3/Loader/Loader.cpp +++ b/rpcs3/Loader/Loader.cpp @@ -1,11 +1,38 @@ #include "stdafx.h" #include "Utilities/Log.h" #include "Loader.h" -#include "ELF.h" -#include "SELF.h" #include "PSF.h" #include "Emu/FS/vfsLocalFile.h" +namespace loader +{ + bool loader::load(vfsStream& stream) + { + for (auto i : m_handlers) + { + if (i->init(stream) == handler::ok) + { + if (i->load() == handler::ok) + { + return true; + } + } + + stream.Seek(i->get_stream_offset()); + } + + return false; + } + + handler::error_code handler::init(vfsStream& stream) + { + m_stream_offset = stream.Tell(); + m_stream = &stream; + + return ok; + } +}; + static const u64 g_spu_offset = 0x10000; const std::string Ehdr_DataToString(const u8 data) @@ -13,7 +40,7 @@ const std::string Ehdr_DataToString(const u8 data) if(data > 1) return fmt::Format("%d's complement, big endian", data); if(data < 1) return "Data is not found"; - return fmt::Format("%d's complement, small endian", data); + return fmt::Format("%d's complement, little endian", data); } const std::string Ehdr_TypeToString(const u16 type) @@ -95,92 +122,3 @@ const std::string Phdr_TypeToString(const u32 type) return fmt::Format("Unknown (%x)", type); } - -Loader::Loader() - : m_stream(nullptr) - , m_loader(nullptr) -{ -} - -Loader::Loader(vfsFileBase& stream) - : m_stream(&stream) - , m_loader(nullptr) -{ -} - -Loader::~Loader() -{ - delete m_loader; - m_loader = nullptr; -} - -void Loader::Open(vfsFileBase& stream) -{ - m_stream = &stream; -} - -LoaderBase* Loader::SearchLoader() -{ - if(!m_stream) - return nullptr; - - LoaderBase* l = new ELFLoader(*m_stream); - if(l->LoadInfo()) - return l; - delete l; - - l = new SELFLoader(*m_stream); - if(l->LoadInfo()) - return l; - delete l; - - return nullptr; -} - -bool Loader::Analyze() -{ - delete m_loader; - - m_loader = SearchLoader(); - - if(!m_loader) - { - LOG_ERROR(LOADER, "Unknown file type"); - return false; - } - - machine = m_loader->GetMachine(); - entry = m_loader->GetMachine() == MACHINE_SPU ? m_loader->GetEntry() + g_spu_offset : m_loader->GetEntry(); - - return true; -} - -bool Loader::Load() -{ - if(!m_loader) - return false; - - if(!m_loader->LoadData(m_loader->GetMachine() == MACHINE_SPU ? g_spu_offset : 0)) - { - LOG_ERROR(LOADER, "Broken file"); - return false; - } - - /* - const std::string& root = fmt::ToUTF8(wxFileName(wxFileName(m_stream->GetPath()).GetPath()).GetPath()); - std::string ps3_path; - const std::string& psf_path = root + "/" + "PARAM.SFO"; - vfsFile f(psf_path); - if(f.IsOpened()) - { - PSFLoader psf_l(f); - if(psf_l.Load()) - { - CurGameInfo = psf_l.m_info; - CurGameInfo.root = root; - psf_l.Close(); - } - } - */ - return true; -} diff --git a/rpcs3/Loader/Loader.h b/rpcs3/Loader/Loader.h index 0f14d38ab9..3e6fbf925a 100644 --- a/rpcs3/Loader/Loader.h +++ b/rpcs3/Loader/Loader.h @@ -1,6 +1,8 @@ #pragma once +#include "Emu/Memory/vm.h" struct vfsFileBase; +struct vfsStream; class rFile; #ifdef _DEBUG @@ -65,22 +67,7 @@ struct sys_process_param sys_process_param_info info; }; -struct sys_proc_prx_param -{ - be_t size; - be_t magic; - be_t version; - be_t pad0; - be_t libentstart; - be_t libentend; - be_t libstubstart; - be_t libstubend; - be_t ver; - be_t pad1; - be_t pad2; -}; - -struct Elf64_StubHeader +struct sys_stub { u8 s_size; // = 0x2c u8 s_unk0; @@ -89,59 +76,80 @@ struct Elf64_StubHeader be_t s_imports; be_t s_unk2; // = 0x0 be_t s_unk3; // = 0x0 - be_t s_modulename; - be_t s_nid; - be_t s_text; + vm::bptr s_modulename; + vm::bptr s_nid; + vm::bptr s_text; be_t s_unk4; // = 0x0 be_t s_unk5; // = 0x0 be_t s_unk6; // = 0x0 be_t s_unk7; // = 0x0 }; -class LoaderBase +struct sys_proc_prx_param { -protected: - u32 entry; - u32 min_addr; - u32 max_addr; - Elf_Machine machine; - - LoaderBase() - : machine(MACHINE_Unknown) - , entry(0) - , min_addr(0) - , max_addr(0) - { - } - -public: - virtual ~LoaderBase() = default; - - virtual bool LoadInfo() { return false; } - virtual bool LoadData(u64 offset = 0) { return false; } - Elf_Machine GetMachine() const { return machine; } - - u32 GetEntry() const { return entry; } - u32 GetMinAddr() const { return min_addr; } - u32 GetMaxAddr() const { return max_addr; } + be_t size; + be_t magic; + be_t version; + be_t pad0; + be_t libentstart; + be_t libentend; + vm::bptr libstubstart; + vm::bptr libstubend; + be_t ver; + be_t pad1; + be_t pad2; }; -class Loader : public LoaderBase +namespace loader { - vfsFileBase* m_stream; - LoaderBase* m_loader; + class handler + { + u64 m_stream_offset; -public: - Loader(); - Loader(vfsFileBase& stream); - virtual ~Loader(); + protected: + vfsStream* m_stream; - void Open(const std::string& path); - void Open(vfsFileBase& stream); - bool Analyze(); + public: + enum error_code + { + bad_version = -1, + bad_file = -2, + broken_file = -3, + loading_error = -4, + bad_relocation_type = -5, + ok = 0, + }; - bool Load(); + virtual ~handler() = default; -private: - LoaderBase* SearchLoader(); -}; \ No newline at end of file + virtual error_code init(vfsStream& stream); + virtual error_code load() = 0; + u64 get_stream_offset() const + { + return m_stream_offset; + } + }; + + class loader + { + std::vector m_handlers; + + public: + ~loader() + { + for (auto &h : m_handlers) + { + delete h; + } + } + + void register_handler(handler* handler) + { + m_handlers.push_back(handler); + } + + bool load(vfsStream& stream); + }; + + using namespace vm; +} diff --git a/rpcs3/Loader/PSF.cpp b/rpcs3/Loader/PSF.cpp index 9f9813a950..6bf66f4378 100644 --- a/rpcs3/Loader/PSF.cpp +++ b/rpcs3/Loader/PSF.cpp @@ -44,7 +44,7 @@ bool PSFLoader::LoadHeader() if(!m_header.CheckMagic()) return false; - if(m_show_log) LOG_NOTICE(LOADER, "PSF version: %x", m_header.psf_version); + if(m_show_log) LOG_NOTICE(LOADER, "PSF version: 0x%x", m_header.psf_version); m_psfindxs.clear(); m_entries.clear(); diff --git a/rpcs3/Loader/SELF.cpp b/rpcs3/Loader/SELF.cpp deleted file mode 100644 index 0d3755cce9..0000000000 --- a/rpcs3/Loader/SELF.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "stdafx.h" -#include "Utilities/Log.h" -#include "Emu/FS/vfsStream.h" -#include "SELF.h" -#include "ELF64.h" - -void SceHeader::Load(vfsStream& f) -{ - se_magic = Read32(f); - se_hver = Read32(f); - se_flags = Read16(f); - se_type = Read16(f); - se_meta = Read32(f); - se_hsize = Read64(f); - se_esize = Read64(f); -} - -void SceHeader::Show() -{ - LOG_NOTICE(LOADER, "Magic: %08x", se_magic); - LOG_NOTICE(LOADER, "Class: %s", "SELF"); - LOG_NOTICE(LOADER, "hver: 0x%08x", se_hver); - LOG_NOTICE(LOADER, "flags: 0x%04x", se_flags); - LOG_NOTICE(LOADER, "type: 0x%04x", se_type); - LOG_NOTICE(LOADER, "meta: 0x%08x", se_meta); - LOG_NOTICE(LOADER, "hsize: 0x%llx", se_hsize); - LOG_NOTICE(LOADER, "esize: 0x%llx", se_esize); -} - -void SelfHeader::Load(vfsStream& f) -{ - se_htype = Read64(f); - se_appinfooff = Read64(f); - se_elfoff = Read64(f); - se_phdroff = Read64(f); - se_shdroff = Read64(f); - se_secinfoff = Read64(f); - se_sceveroff = Read64(f); - se_controloff = Read64(f); - se_controlsize = Read64(f); - pad = Read64(f); -} - -void SelfHeader::Show() -{ - LOG_NOTICE(LOADER, "header type: 0x%llx", se_htype); - LOG_NOTICE(LOADER, "app info offset: 0x%llx", se_appinfooff); - LOG_NOTICE(LOADER, "elf offset: 0x%llx", se_elfoff); - LOG_NOTICE(LOADER, "program header offset: 0x%llx", se_phdroff); - LOG_NOTICE(LOADER, "section header offset: 0x%llx", se_shdroff); - LOG_NOTICE(LOADER, "section info offset: 0x%llx", se_secinfoff); - LOG_NOTICE(LOADER, "sce version offset: 0x%llx", se_sceveroff); - LOG_NOTICE(LOADER, "control info offset: 0x%llx", se_controloff); - LOG_NOTICE(LOADER, "control info size: 0x%llx", se_controlsize); -} - -SELFLoader::SELFLoader(vfsStream& f) - : self_f(f) - , LoaderBase() -{ -} - -bool SELFLoader::LoadInfo() -{ - if(!self_f.IsOpened()) return false; - self_f.Seek(0); - sce_hdr.Load(self_f); - self_hdr.Load(self_f); - if(!sce_hdr.CheckMagic()) return false; - - return true; -} - -bool SELFLoader::LoadData(u64 offset) -{ - if(!self_f.IsOpened()) return false; - - sce_hdr.Show(); - self_hdr.Show(); - - ELF64Loader l(self_f); - if( !l.LoadEhdrInfo(self_hdr.se_elfoff) || - !l.LoadPhdrInfo(self_hdr.se_phdroff) || - !l.LoadShdrInfo(self_hdr.se_shdroff) || - !l.LoadData(self_hdr.se_appinfooff) ) - { - LOG_ERROR(LOADER, "Broken SELF file."); - - return false; - } - - machine = l.GetMachine(); - entry = l.GetEntry(); - - return true; - - LOG_ERROR(LOADER, "Boot SELF not supported yet!"); - return false; -} \ No newline at end of file diff --git a/rpcs3/Loader/SELF.h b/rpcs3/Loader/SELF.h deleted file mode 100644 index 3c4e7b9fbe..0000000000 --- a/rpcs3/Loader/SELF.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once -#include "Loader.h" - -struct vfsStream; - -struct SceHeader -{ - u32 se_magic; - u32 se_hver; - u16 se_flags; - u16 se_type; - u32 se_meta; - u64 se_hsize; - u64 se_esize; - - void Load(vfsStream& f); - - void Show(); - - bool CheckMagic() const { return se_magic == 0x53434500; } -}; - -struct SelfHeader -{ - u64 se_htype; - u64 se_appinfooff; - u64 se_elfoff; - u64 se_phdroff; - u64 se_shdroff; - u64 se_secinfoff; - u64 se_sceveroff; - u64 se_controloff; - u64 se_controlsize; - u64 pad; - - void Load(vfsStream& f); - - void Show(); -}; - -class SELFLoader : public LoaderBase -{ - vfsStream& self_f; - - SceHeader sce_hdr; - SelfHeader self_hdr; - -public: - SELFLoader(vfsStream& f); - - virtual bool LoadInfo(); - virtual bool LoadData(u64 offset = 0); -}; \ No newline at end of file diff --git a/rpcs3/Loader/TROPUSR.cpp b/rpcs3/Loader/TROPUSR.cpp index e6a15fb59f..7d6b7fb655 100644 --- a/rpcs3/Loader/TROPUSR.cpp +++ b/rpcs3/Loader/TROPUSR.cpp @@ -133,7 +133,7 @@ bool TROPUSRLoader::Generate(const std::string& filepath, const std::string& con { if (n->GetName() == "trophy") { - u32 trophy_id = atoi(n->GetAttribute("id").c_str()); + u32 trophy_id = std::atoi(n->GetAttribute("id").c_str()); u32 trophy_grade; switch (((const char *)n->GetAttribute("ttype").c_str())[0]) { @@ -144,11 +144,20 @@ bool TROPUSRLoader::Generate(const std::string& filepath, const std::string& con default: trophy_grade = 0; } - TROPUSREntry4 entry4 = { be_t::MakeFromBE(se32(4)), be_t::MakeFromBE(se32(sizeof(TROPUSREntry4) - 0x10)), - be_t::MakeFromLE((u32)m_table4.size()), be_t::MakeFromBE(se32(0)), be_t::MakeFromLE(trophy_id), - be_t::MakeFromLE(trophy_grade), be_t::MakeFromBE(se32(0xFFFFFFFF)) }; - TROPUSREntry6 entry6 = { be_t::MakeFromBE(se32(6)), be_t::MakeFromBE(se32(sizeof(TROPUSREntry6) - 0x10)), - be_t::MakeFromLE((u32)m_table6.size()), be_t::MakeFromBE(0), be_t::MakeFromLE(trophy_id) }; + TROPUSREntry4 entry4 = { + be_t::make(4), + be_t::make(sizeof(TROPUSREntry4) - 0x10), + be_t::make((u32)m_table4.size()), + be_t::make(0), + be_t::make(trophy_id), + be_t::make(trophy_grade), + be_t::make(0xFFFFFFFF) }; + TROPUSREntry6 entry6 = { + be_t::make(6), + be_t::make(sizeof(TROPUSREntry6) - 0x10), + be_t::make((u32)m_table6.size()), + be_t::make(0), + be_t::make(trophy_id) }; m_table4.push_back(entry4); m_table6.push_back(entry6); @@ -156,11 +165,19 @@ bool TROPUSRLoader::Generate(const std::string& filepath, const std::string& con } u64 offset = sizeof(TROPUSRHeader) + 2 * sizeof(TROPUSRTableHeader); - TROPUSRTableHeader table4header = { be_t::MakeFromBE(se32(4)), be_t::MakeFromBE(se32(sizeof(TROPUSREntry4)-0x10)), - be_t::MakeFromBE(se32(1)), be_t::MakeFromLE((u32)m_table4.size()), be_t::MakeFromLE(offset) }; + TROPUSRTableHeader table4header = { + be_t::make(4), + be_t::make(sizeof(TROPUSREntry4) - 0x10), + be_t::make(1), + be_t::make((u32)m_table4.size()), + be_t::make(offset) }; offset += m_table4.size() * sizeof(TROPUSREntry4); - TROPUSRTableHeader table6header = { be_t::MakeFromBE(se32(6)), be_t::MakeFromBE(se32(sizeof(TROPUSREntry6)-0x10)), - be_t::MakeFromBE(se32(1)), be_t::MakeFromLE((u32)m_table6.size()), be_t::MakeFromLE(offset) }; + TROPUSRTableHeader table6header = { + be_t::make(6), + be_t::make(sizeof(TROPUSREntry6) - 0x10), + be_t::make(1), + be_t::make((u32)m_table6.size()), + be_t::make(offset) }; offset += m_table6.size() * sizeof(TROPUSREntry6); m_tableHeaders.clear(); diff --git a/rpcs3/Loader/TRP.cpp b/rpcs3/Loader/TRP.cpp index 8f3e55c4ab..6c02e4221a 100644 --- a/rpcs3/Loader/TRP.cpp +++ b/rpcs3/Loader/TRP.cpp @@ -51,7 +51,7 @@ bool TRPLoader::LoadHeader(bool show) return false; if (show) - LOG_NOTICE(LOADER, "TRP version: %x", m_header.trp_version); + LOG_NOTICE(LOADER, "TRP version: 0x%x", m_header.trp_version); m_entries.clear(); m_entries.resize(m_header.trp_files_count); diff --git a/rpcs3/cellMic.h b/rpcs3/cellMic.h new file mode 100644 index 0000000000..4fbc695af2 --- /dev/null +++ b/rpcs3/cellMic.h @@ -0,0 +1,23 @@ +#pragma once + +// Error Codes +enum +{ + CELL_MICIN_ERROR_ALREADY_INIT = 0x80140101, + CELL_MICIN_ERROR_SYSTEM = 0x80140102, + CELL_MICIN_ERROR_NOT_INIT = 0x80140103, + CELL_MICIN_ERROR_PARAM = 0x80140104, + CELL_MICIN_ERROR_PORT_FULL = 0x80140105, + CELL_MICIN_ERROR_ALREADY_OPEN = 0x80140106, + CELL_MICIN_ERROR_NOT_OPEN = 0x80140107, + CELL_MICIN_ERROR_NOT_RUN = 0x80140108, + CELL_MICIN_ERROR_TRANS_EVENT = 0x80140109, + CELL_MICIN_ERROR_OPEN = 0x8014010a, + CELL_MICIN_ERROR_SHAREDMEMORY = 0x8014010b, + CELL_MICIN_ERROR_MUTEX = 0x8014010c, + CELL_MICIN_ERROR_EVENT_QUEUE = 0x8014010d, + CELL_MICIN_ERROR_DEVICE_NOT_FOUND = 0x8014010e, + CELL_MICIN_ERROR_SYSTEM_NOT_FOUND = 0x8014010e, + CELL_MICIN_ERROR_FATAL = 0x8014010f, + CELL_MICIN_ERROR_DEVICE_NOT_SUPPORT = 0x80140110, +}; \ No newline at end of file diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index f09d6a99d5..969839a54d 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -1,6 +1,14 @@  + + Debug - LLVM + Win32 + + + Debug - LLVM + x64 + Debug - MemLeak Win32 @@ -17,6 +25,14 @@ Debug x64 + + Release - LLVM + Win32 + + + Release - LLVM + x64 + Release Win32 @@ -39,27 +55,44 @@ + NotUsing NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing + + + + + + + + + true + true + true + @@ -128,6 +161,7 @@ + @@ -205,22 +239,29 @@ - - + + true + true + true + Create Create Create + Create Create + Create Create + Create Create + Create @@ -242,7 +283,9 @@ + + @@ -256,6 +299,7 @@ + @@ -311,6 +355,7 @@ + @@ -412,16 +457,15 @@ - - + @@ -435,6 +479,12 @@ v120 Unicode + + StaticLibrary + true + v120 + Unicode + StaticLibrary true @@ -447,6 +497,12 @@ v120 Unicode + + StaticLibrary + true + v120 + Unicode + StaticLibrary true @@ -460,6 +516,13 @@ false Unicode + + StaticLibrary + false + v120 + false + Unicode + StaticLibrary false @@ -467,33 +530,57 @@ false Unicode + + StaticLibrary + false + v120 + false + Unicode + + + + + + + + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + $(SolutionDir)$(Platform)\$(Configuration)\ $(Platform)\$(Configuration)\ @@ -504,16 +591,29 @@ $(Platform)\$(Configuration)\ .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + - .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath);..\llvm\include;..\llvm_build\include + $(Platform)\$(Configuration)\emucore\ + + + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath);..\llvm\include;..\llvm_build\include $(Platform)\$(Configuration)\emucore\ - .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath);..\llvm\include;..\llvm_build\include $(Platform)\$(Configuration)\emucore\ - .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath); + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath);..\llvm\include;..\llvm_build\include + $(Platform)\$(Configuration)\emucore\ + + + .\;..\;..\asmjit\src\asmjit;..\wxWidgets\include\msvc;..\wxWidgets\include;.\OpenAL\include;..\ffmpeg\WindowsInclude;..\ffmpeg\Windows\x86_64\Include;$(VC_IncludePath);$(WindowsSDK_IncludePath);..\llvm\include;..\llvm_build\include $(Platform)\$(Configuration)\emucore\ @@ -528,6 +628,18 @@ true + + + Level3 + Disabled + false + Use + stdafx.h + + + true + + Level3 @@ -555,6 +667,24 @@ true + + + Level3 + Disabled + false + Use + _UNICODE;UNICODE;LLVM_AVAILABLE;%(PreprocessorDefinitions) + stdafx.h + Async + + + true + + + ..\llvm_build\Debug\lib + LLVMJIT.lib;LLVMVectorize.lib;LLVMX86CodeGen.lib;LLVMX86Disassembler.lib;LLVMExecutionEngine.lib;LLVMAsmPrinter.lib;LLVMSelectionDAG.lib;LLVMCodeGen.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMTransformUtils.lib;LLVMipa.lib;LLVMAnalysis.lib;LLVMTarget.lib;LLVMX86Desc.lib;LLVMX86AsmPrinter.lib;LLVMObject.lib;LLVMMCParser.lib;LLVMBitReader.lib;LLVMCore.lib;LLVMX86Utils.lib;LLVMMC.lib;LLVMX86Info.lib;LLVMSupport.lib;LLVMMCDisassembler.lib + + Level2 @@ -585,6 +715,22 @@ true + + + Level3 + MaxSpeed + true + true + false + Use + stdafx.h + + + true + true + true + + Level3 @@ -602,6 +748,28 @@ true + + + Level3 + MaxSpeed + true + true + false + Use + stdafx.h + Async + LLVM_AVAILABLE;%(PreprocessorDefinitions) + + + true + true + true + + + ..\llvm_build\Release\lib + LLVMJIT.lib;LLVMVectorize.lib;LLVMX86CodeGen.lib;LLVMX86Disassembler.lib;LLVMExecutionEngine.lib;LLVMAsmPrinter.lib;LLVMSelectionDAG.lib;LLVMCodeGen.lib;LLVMScalarOpts.lib;LLVMInstCombine.lib;LLVMTransformUtils.lib;LLVMipa.lib;LLVMAnalysis.lib;LLVMTarget.lib;LLVMX86Desc.lib;LLVMX86AsmPrinter.lib;LLVMObject.lib;LLVMMCParser.lib;LLVMBitReader.lib;LLVMCore.lib;LLVMX86Utils.lib;LLVMMC.lib;LLVMX86Info.lib;LLVMSupport.lib + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 038502f880..d4cec623e0 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -33,15 +33,9 @@ {28902cf4-4fa6-428b-ab94-6b410fd5077f} - - {13d20086-2188-425a-9856-0440fe6f79f2} - {037247b4-0370-4193-a25d-bc9d075bf0a7} - - {93b1cff1-0158-4327-a437-e9abcac8d724} - {5a18e5b1-2632-4849-ba94-e7a2ea0b78fa} @@ -60,21 +54,33 @@ {84c34dd1-4c49-4ecf-8ee2-4165c14f24be} - - {fadb4b36-57af-4583-891d-d22ff369e266} - - - {4adca4fa-b90f-4662-9eb0-1d29cf3cd2eb} - - - {6f1da5b2-52c5-416b-9b5c-b9897bc1b300} - {fcac6852-b45f-4cf2-afee-cf56bcea14e5} {ead7494f-a872-4b4d-a864-1a61c3b6012f} + + {13d20086-2188-425a-9856-0440fe6f79f2} + + + {93b1cff1-0158-4327-a437-e9abcac8d724} + + + {1d9e6fc4-9a79-4329-a8b5-081e24822aaa} + + + {6674e2ab-90cd-47de-a852-d21643ab18c2} + + + {fadb4b36-57af-4583-891d-d22ff369e266} + + + {4adca4fa-b90f-4662-9eb0-1d29cf3cd2eb} + + + {6f1da5b2-52c5-416b-9b5c-b9897bc1b300} + @@ -131,6 +137,9 @@ Emu\SysCalls\Modules + + Emu\SysCalls\Modules + Emu\SysCalls\Modules @@ -303,28 +312,28 @@ Emu\HDD - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell Emu\CPU @@ -333,7 +342,7 @@ Emu\CPU - Emu\ARMv7 + Emu\CPU\ARMv7 Emu\Audio @@ -347,8 +356,8 @@ Emu\Memory - - Loader + + Emu\Memory Loader @@ -365,9 +374,6 @@ Loader - - Loader - Loader @@ -416,9 +422,6 @@ Emu\SysCalls\currently_unused - - Emu\SysCalls\currently_unused - Emu\SysCalls\currently_unused @@ -555,37 +558,37 @@ Emu\SysCalls\Modules - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX Emu\SysCalls\lv2 @@ -617,8 +620,38 @@ Utilities - - Emu\Memory + + Crypto + + + Emu\SysCalls\Modules + + + Emu\CPU\Cell + + + Emu\CPU\Cell + + + Emu\CPU\ARMv7 + + + Emu\CPU\ARMv7 + + + Emu\CPU\ARMv7 + + + Emu\CPU\ARMv7\Modules + + + Emu\CPU\ARMv7\Modules + + + Emu\CPU\ARMv7\Modules + + + Emu\CPU\ARMv7\Modules @@ -724,6 +757,9 @@ Emu\SysCalls\Modules + + Emu\SysCalls\Modules + Emu\SysCalls\Modules @@ -845,64 +881,64 @@ Emu\HDD - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell - Emu\Cell + Emu\CPU\Cell Emu\CPU @@ -920,19 +956,19 @@ Emu\CPU - Emu\ARMv7 + Emu\CPU\ARMv7 - Emu\ARMv7 + Emu\CPU\ARMv7 - Emu\ARMv7 + Emu\CPU\ARMv7 - Emu\ARMv7 + Emu\CPU\ARMv7 - Emu\ARMv7 + Emu\CPU\ARMv7 Emu\Audio @@ -949,9 +985,6 @@ Emu\Memory - - Loader - Loader @@ -967,9 +1000,6 @@ Loader - - Loader - Loader @@ -1094,58 +1124,58 @@ Emu\SysCalls - Emu\RSX\Null + Emu\GPU\RSX\Null - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX\GL + Emu\GPU\RSX\GL - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX - Emu\RSX + Emu\GPU\RSX Emu\SysCalls\lv2 @@ -1210,14 +1240,26 @@ Header Files - - Emu\SysCalls\Modules - Emu\SysCalls Emu\SysCalls + + Emu\Memory + + + Crypto + + + Emu\SysCalls\Modules + + + Emu\CPU\Cell + + + Emu\CPU\ARMv7 + \ No newline at end of file diff --git a/rpcs3/emucore.vcxproj.user b/rpcs3/emucore.vcxproj.user index ef5ff2a1fa..2a22e69ac4 100644 --- a/rpcs3/emucore.vcxproj.user +++ b/rpcs3/emucore.vcxproj.user @@ -1,4 +1,4 @@ - - - + + + \ No newline at end of file diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp index dc40edfd17..2ec10d0ce1 100644 --- a/rpcs3/rpcs3.cpp +++ b/rpcs3/rpcs3.cpp @@ -40,6 +40,8 @@ wxDEFINE_EVENT(wxEVT_DBG_COMMAND, wxCommandEvent); IMPLEMENT_APP(Rpcs3App) Rpcs3App* TheApp; +std::string simplify_path(const std::string& path, bool is_dir); + bool Rpcs3App::OnInit() { SetSendDbgCommandCallback([](DbgCommand id, CPUThread* t) @@ -128,16 +130,17 @@ bool Rpcs3App::OnInit() wxInitAllImageHandlers(); // RPCS3 assumes the current working directory is the folder where it is contained, so we make sure this is true - const wxString executablePath = wxStandardPaths::Get().GetExecutablePath(); - wxSetWorkingDirectory(wxPathOnly(executablePath)); + const wxString executablePath = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()); + wxSetWorkingDirectory(executablePath); main_thread = std::this_thread::get_id(); Ini.Load(); + Emu.Init(); + Emu.SetEmulatorPath(executablePath.ToStdString()); + m_MainFrame = new MainFrame(); SetTopWindow(m_MainFrame); - Emu.Init(); - m_MainFrame->Show(); m_MainFrame->DoSettings(true); @@ -165,6 +168,10 @@ void Rpcs3App::Exit() Ini.Save(); wxApp::Exit(); + +#ifdef _WIN32 + timeEndPeriod(1); +#endif } void Rpcs3App::SendDbgCommand(DbgCommand id, CPUThread* thr) @@ -176,6 +183,10 @@ void Rpcs3App::SendDbgCommand(DbgCommand id, CPUThread* thr) Rpcs3App::Rpcs3App() { +#ifdef _WIN32 + timeBeginPeriod(1); +#endif + #if defined(__unix__) && !defined(__APPLE__) XInitThreads(); #endif diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 77d5435fb8..946b6cb66e 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -87,7 +87,7 @@ true - $(SolutionDir)$(Platform)\$(Configuration)\emucore.lib;wxmsw31ud_adv.lib;wxbase31ud.lib;wxmsw31ud_core.lib;wxmsw31ud_aui.lib;wxtiffd.lib;wxjpegd.lib;wxpngd.lib;wxzlibd.lib;odbc32.lib;odbccp32.lib;comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;rpcrt4.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libOpenAL32.dll.a;asmjit.lib;%(AdditionalDependencies) + wxmsw31ud_adv.lib;wxbase31ud.lib;wxmsw31ud_core.lib;wxmsw31ud_aui.lib;wxtiffd.lib;wxjpegd.lib;wxpngd.lib;wxzlibd.lib;odbc32.lib;odbccp32.lib;comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;rpcrt4.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libOpenAL32.dll.a;asmjit.lib;%(AdditionalDependencies) %(IgnoreSpecificDefaultLibraries) false ..\wxWidgets\lib\vc_x64_lib;..\ffmpeg\Windows\x86_64\lib;..\OpenAL\Win64 @@ -113,7 +113,7 @@ true - $(SolutionDir)$(Platform)\$(Configuration)\emucore.lib;wxmsw31ud_adv.lib;wxbase31ud.lib;wxmsw31ud_core.lib;wxmsw31ud_aui.lib;wxtiffd.lib;wxjpegd.lib;wxpngd.lib;wxzlibd.lib;odbc32.lib;odbccp32.lib;comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;rpcrt4.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libOpenAL32.dll.a;asmjit.lib;%(AdditionalDependencies) + wxmsw31ud_adv.lib;wxbase31ud.lib;wxmsw31ud_core.lib;wxmsw31ud_aui.lib;wxtiffd.lib;wxjpegd.lib;wxpngd.lib;wxzlibd.lib;odbc32.lib;odbccp32.lib;comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;rpcrt4.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libOpenAL32.dll.a;asmjit.lib;%(AdditionalDependencies) %(IgnoreSpecificDefaultLibraries) false ..\wxWidgets\lib\vc_x64_lib;..\ffmpeg\Windows\x86_64\lib;..\OpenAL\Win64 @@ -148,7 +148,7 @@ true true true - $(SolutionDir)$(Platform)\$(Configuration)\emucore.lib;wxmsw31u_adv.lib;wxbase31u.lib;wxmsw31u_core.lib;wxmsw31u_aui.lib;odbc32.lib;odbccp32.lib;comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;rpcrt4.lib;wxtiff.lib;wxjpeg.lib;wxpng.lib;wxzlib.lib;wxregexu.lib;wxexpat.lib;wsock32.lib;wininet.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libOpenAL32.dll.a;asmjit.lib;%(AdditionalDependencies) + wxmsw31u_adv.lib;wxbase31u.lib;wxmsw31u_core.lib;wxmsw31u_aui.lib;odbc32.lib;odbccp32.lib;comctl32.lib;ws2_32.lib;shlwapi.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;rpcrt4.lib;wxtiff.lib;wxjpeg.lib;wxpng.lib;wxzlib.lib;wxregexu.lib;wxexpat.lib;wsock32.lib;wininet.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;libOpenAL32.dll.a;asmjit.lib;%(AdditionalDependencies) %(IgnoreSpecificDefaultLibraries) @@ -173,6 +173,7 @@ + @@ -212,6 +213,7 @@ + @@ -224,6 +226,11 @@ + + + {c4a10229-4712-4bd2-b63e-50d93c67a038} + + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 18a836398f..5fce1aa362 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -90,6 +90,9 @@ Gui + + Gui + @@ -185,5 +188,8 @@ Gui + + Gui + \ No newline at end of file diff --git a/rpcs3/stdafx.h b/rpcs3/stdafx.h index e1c4825f87..2ca972bc49 100644 --- a/rpcs3/stdafx.h +++ b/rpcs3/stdafx.h @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include "Utilities/GNU.h" @@ -48,7 +50,10 @@ typedef int16_t s16; typedef int32_t s32; typedef int64_t s64; -#define AlignAddr(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1)) +template __forceinline T align(const T addr, int align) +{ + return (addr + (align - 1)) & ~(align - 1); +} #include "Utilities/StrFmt.h" #include "Utilities/BEType.h"