From 0bad1997d1aa6b8cf62245a446c5543c2297efa8 Mon Sep 17 00:00:00 2001 From: marco Date: Fri, 2 Sep 2011 09:43:53 +0000 Subject: [PATCH] * commited patch from Mantis #19956 by Michalis that deals with previous extensions of opengl becoming part of core in never versions. git-svn-id: trunk@18941 - --- packages/opengl/src/glext.pp | 150 ++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 72 deletions(-) diff --git a/packages/opengl/src/glext.pp b/packages/opengl/src/glext.pp index 0c69b2bcea..c982a8a5ca 100644 --- a/packages/opengl/src/glext.pp +++ b/packages/opengl/src/glext.pp @@ -4011,7 +4011,13 @@ var glRenderbufferStorageMultisample: procedure(target: GLenum; samples: GLsizei; internalformat: GLenum; width: GLsizei; height: GLsizei); extdecl; glFramebufferTextureLayer: procedure(target: GLenum; attachment: GLenum; texture: GLuint; level: GLint; layer: GLint); extdecl; -function Load_GL_ARB_framebuffer_object(): Boolean; +{ Using LoadAsCore = true means that we will *not* check + if the extension is advertised in glGetString(GL_EXTENSIONS) string. + This allows to successfully Load_GL_version_3_0 in an OpenGL 3.0 + forward-compatible context, where the "core extensions" do not have + to be mentioned inside glGetString(GL_EXTENSIONS). } + +function Load_GL_ARB_framebuffer_object(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_framebuffer_object DEPRECATED *****// const @@ -4032,7 +4038,7 @@ var glMapBufferRange: function(target: GLenum; offset: GLintptr; length: GLsizeiptr; access: GLbitfield): PGLvoid; extdecl; glFlushMappedBufferRange: procedure(target: GLenum; offset: GLintptr; length: GLsizeiptr); extdecl; -function Load_GL_ARB_map_buffer_range(): Boolean; +function Load_GL_ARB_map_buffer_range(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_vertex_array_object *****// const @@ -4043,7 +4049,7 @@ var glGenVertexArrays: procedure(n: GLsizei; arrays: PGLuint); extdecl; glIsVertexArray: function(_array: GLuint): GLboolean; extdecl; -function Load_GL_ARB_vertex_array_object(): Boolean; +function Load_GL_ARB_vertex_array_object(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_copy_buffer *****// const @@ -4052,7 +4058,7 @@ const var glCopyBufferSubData: procedure(readTarget: GLenum; writeTarget: GLenum; readOffset: GLintptr; writeOffset: GLintptr; size: GLsizeiptr); extdecl; -function Load_GL_ARB_copy_buffer(): Boolean; +function Load_GL_ARB_copy_buffer(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_uniform_buffer_object *****// const @@ -4098,7 +4104,7 @@ var glGetActiveUniformBlockName: procedure(_program: GLuint; uniformBlockIndex: GLuint; bufSize: GLsizei; length: PGLsizei; uniformBlockName: PGLchar); extdecl; glUniformBlockBinding: procedure(_program: GLuint; uniformBlockIndex: GLuint; uniformBlockBinding: GLuint); extdecl; -function Load_GL_ARB_uniform_buffer_object(): Boolean; +function Load_GL_ARB_uniform_buffer_object(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_draw_elements_base_vertex *****// var @@ -4107,7 +4113,7 @@ var glDrawElementsInstancedBaseVertex: procedure(mode: GLenum; count: GLsizei; _type: GLenum; const indices: PGLvoid; primcount: GLsizei; basevertex: GLint); extdecl; glMultiDrawElementsBaseVertex: procedure(mode: GLenum; const count: PGLsizei; _type: GLenum; const indices: PPGLvoid; primcount: GLsizei; const basevertex: PGLint); extdecl; -function Load_GL_ARB_draw_elements_base_vertex(): Boolean; +function Load_GL_ARB_draw_elements_base_vertex(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_provoking_vertex *****// const @@ -4118,7 +4124,7 @@ const var glProvokingVertex: procedure(mode: GLenum); extdecl; -function Load_GL_ARB_provoking_vertex(): Boolean; +function Load_GL_ARB_provoking_vertex(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_sync *****// type @@ -4151,7 +4157,7 @@ var glGetInteger64v: procedure(pname: GLenum; params: PGLint64); extdecl; glGetSynciv: procedure(sync: GLsync; pname: GLenum; bufSize: GLsizei; length: PGLsizei; values: PGLint); extdecl; -function Load_GL_ARB_sync(): Boolean; +function Load_GL_ARB_sync(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_texture_multisample *****// const @@ -4182,7 +4188,7 @@ var glGetMultisamplefv: procedure(pname: GLenum; index: GLuint; val: PGLfloat); extdecl; glSampleMaski: procedure(index: GLuint; mask: GLbitfield); extdecl; -function Load_GL_ARB_texture_multisample(): Boolean; +function Load_GL_ARB_texture_multisample(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_blend_func_extended *****// const @@ -4196,7 +4202,7 @@ var glBindFragDataLocationIndexed: procedure(_program: GLuint; colorNumber: GLuint; index: GLuint; const name: PGLchar); extdecl; glGetFragDataIndex: function(_program: GLuint; const name: PGLchar): GLint; extdecl; -function Load_GL_ARB_blend_func_extended(): Boolean; +function Load_GL_ARB_blend_func_extended(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_sampler_objects *****// const @@ -4217,7 +4223,7 @@ var glGetSamplerParameterfv: procedure(sampler: GLuint; pname: GLenum; params: PGLfloat); extdecl; glGetSamplerParameterIuiv: procedure(sampler: GLuint; pname: GLenum; params: PGLuint); extdecl; -function Load_GL_ARB_sampler_objects(): Boolean; +function Load_GL_ARB_sampler_objects(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_timer_query *****// const @@ -4228,7 +4234,7 @@ var glGetQueryObjecti64v: procedure(id: GLuint; pname: GLenum; params: PGLint64); extdecl; glGetQueryObjectui64v: procedure(id: GLuint; pname: GLenum; params: PGLuint64); extdecl; -function Load_GL_ARB_timer_query(): Boolean; +function Load_GL_ARB_timer_query(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_vertex_type_2_10_10_10_rev *****// @@ -4274,7 +4280,7 @@ var glVertexAttribP4ui: procedure(index: GLuint; _type: GLenum; normalized: GLboolean; value: GLuint); extdecl; glVertexAttribP4uiv: procedure(index: GLuint; _type: GLenum; normalized: GLboolean; const value: PGLuint); extdecl; -function Load_GL_ARB_vertex_type_2_10_10_10_rev(): Boolean; +function Load_GL_ARB_vertex_type_2_10_10_10_rev(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_gpu_shader_fp64 *****// // reuse GL_DOUBLE @@ -4338,7 +4344,7 @@ var glProgramUniformMatrix4x2dvEXT: procedure(_program: GLuint; location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLdouble); extdecl; glProgramUniformMatrix4x3dvEXT: procedure(_program: GLuint; location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLdouble); extdecl; -function Load_GL_ARB_gpu_shader_fp64(): Boolean; +function Load_GL_ARB_gpu_shader_fp64(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_shader_subroutine *****// const @@ -4362,7 +4368,7 @@ var glGetUniformSubroutineuiv: procedure(shadertype: GLenum; location: GLint; params: PGLuint); extdecl; glGetProgramStageiv: procedure(_program: GLuint; shadertype: GLenum; pname: GLenum; values: PGLint); extdecl; -function Load_GL_ARB_shader_subroutine(): Boolean; +function Load_GL_ARB_shader_subroutine(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_tessellation_shader *****// const @@ -4410,7 +4416,7 @@ var glPatchParameteri: procedure(pname: GLenum; value: GLint); extdecl; glPatchParameterfv: procedure(pname: GLenum; const values: PGLfloat); extdecl; -function Load_GL_ARB_tessellation_shader(): Boolean; +function Load_GL_ARB_tessellation_shader(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_transform_feedback2 *****// const @@ -4427,7 +4433,7 @@ var glResumeTransformFeedback: procedure(); extdecl; glDrawTransformFeedback: procedure(mode: GLenum; id: GLuint); extdecl; -function Load_GL_ARB_transform_feedback2(): Boolean; +function Load_GL_ARB_transform_feedback2(LoadAsCore: boolean = false): Boolean; //**** GL_ARB_transform_feedback3 *****// const @@ -4438,7 +4444,7 @@ var glEndQueryIndexed: procedure(target: GLenum; index: GLuint); extdecl; glGetQueryIndexediv: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLint); extdecl; -function Load_GL_ARB_transform_feedback3(): Boolean; +function Load_GL_ARB_transform_feedback3(LoadAsCore: boolean = false): Boolean; //***** GL_version_1_4 *****// @@ -9844,14 +9850,14 @@ begin end; -function Load_GL_ARB_framebuffer_object(): Boolean; +function Load_GL_ARB_framebuffer_object(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_framebuffer_object', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_framebuffer_object', extstring) then begin glIsRenderbuffer := wglGetProcAddress('glIsRenderbuffer'); if not Assigned(glIsRenderbuffer) then Exit; @@ -9897,14 +9903,14 @@ begin end; end; -function Load_GL_ARB_map_buffer_range(): Boolean; +function Load_GL_ARB_map_buffer_range(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_map_buffer_range', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_map_buffer_range', extstring) then begin glMapBufferRange := wglGetProcAddress('glMapBufferRange'); if not Assigned(glMapBufferRange) then Exit; @@ -9914,14 +9920,14 @@ begin end; end; -function Load_GL_ARB_vertex_array_object(): Boolean; +function Load_GL_ARB_vertex_array_object(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_vertex_array_object', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_vertex_array_object', extstring) then begin glBindVertexArray := wglGetProcAddress('glBindVertexArray'); if not Assigned(glBindVertexArray) then Exit; @@ -9935,14 +9941,14 @@ begin end; end; -function Load_GL_ARB_copy_buffer(): Boolean; +function Load_GL_ARB_copy_buffer(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_copy_buffer', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_copy_buffer', extstring) then begin glCopyBufferSubData := wglGetProcAddress('glCopyBufferSubData'); if not Assigned(glCopyBufferSubData) then Exit; @@ -9950,14 +9956,14 @@ begin end; end; -function Load_GL_ARB_uniform_buffer_object(): Boolean; +function Load_GL_ARB_uniform_buffer_object(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_uniform_buffer_object', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_uniform_buffer_object', extstring) then begin glGetUniformIndices := wglGetProcAddress('glGetUniformIndices'); if not Assigned(glGetUniformIndices) then Exit; @@ -9984,14 +9990,14 @@ begin end; end; -function Load_GL_ARB_draw_elements_base_vertex(): Boolean; +function Load_GL_ARB_draw_elements_base_vertex(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_draw_elements_base_vertex', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_draw_elements_base_vertex', extstring) then begin glDrawElementsBaseVertex := wglGetProcAddress('glDrawElementsBaseVertex'); if not Assigned(glDrawElementsBaseVertex) then Exit; @@ -10005,14 +10011,14 @@ begin end; end; -function Load_GL_ARB_provoking_vertex(): Boolean; +function Load_GL_ARB_provoking_vertex(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_provoking_vertex', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_provoking_vertex', extstring) then begin glProvokingVertex := wglGetProcAddress('glProvokingVertex'); if not Assigned(glProvokingVertex) then Exit; @@ -10020,14 +10026,14 @@ begin end; end; -function Load_GL_ARB_sync(): Boolean; +function Load_GL_ARB_sync(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_sync', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_sync', extstring) then begin glFenceSync := wglGetProcAddress('glFenceSync'); if not Assigned(glFenceSync) then Exit; @@ -10047,14 +10053,14 @@ begin end; end; -function Load_GL_ARB_texture_multisample(): Boolean; +function Load_GL_ARB_texture_multisample(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_texture_multisample', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_texture_multisample', extstring) then begin glTexImage2DMultisample := wglGetProcAddress('glTexImage2DMultisample'); if not Assigned(glTexImage2DMultisample) then Exit; @@ -10068,14 +10074,14 @@ begin end; end; -function Load_GL_ARB_sampler_objects(): Boolean; +function Load_GL_ARB_sampler_objects(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_sampler_objects', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_sampler_objects', extstring) then begin glGenSamplers := wglGetProcAddress('glGenSamplers'); if not Assigned(glGenSamplers) then Exit; @@ -10109,14 +10115,14 @@ begin end; end; -function Load_GL_ARB_blend_func_extended(): Boolean; +function Load_GL_ARB_blend_func_extended(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_blend_func_extended', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_blend_func_extended', extstring) then begin glBindFragDataLocationIndexed := wglGetProcAddress('glBindFragDataLocationIndexed'); if not Assigned(glBindFragDataLocationIndexed) then Exit; @@ -10126,14 +10132,14 @@ begin end; end; -function Load_GL_ARB_timer_query(): Boolean; +function Load_GL_ARB_timer_query(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_timer_query', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_timer_query', extstring) then begin glQueryCounter := wglGetProcAddress('glQueryCounter'); if not Assigned(glQueryCounter) then Exit; @@ -10145,14 +10151,14 @@ begin end; end; -function Load_GL_ARB_vertex_type_2_10_10_10_rev(): Boolean; +function Load_GL_ARB_vertex_type_2_10_10_10_rev(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_vertex_type_2_10_10_10_rev', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_vertex_type_2_10_10_10_rev', extstring) then begin glVertexP2ui := wglGetProcAddress('glVertexP2ui'); if not Assigned(glVertexP2ui) then Exit; @@ -10234,14 +10240,14 @@ begin end; end; -function Load_GL_ARB_gpu_shader_fp64(): Boolean; +function Load_GL_ARB_gpu_shader_fp64(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_gpu_shader_fp64', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_gpu_shader_fp64', extstring) then begin glUniform1d := wglGetProcAddress('glUniform1d'); if not Assigned(glUniform1d) then Exit; @@ -10324,14 +10330,14 @@ begin end; end; -function Load_GL_ARB_shader_subroutine(): Boolean; +function Load_GL_ARB_shader_subroutine(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_shader_subroutine', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_shader_subroutine', extstring) then begin glGetSubroutineUniformLocation := wglGetProcAddress('glGetSubroutineUniformLocation'); if not Assigned(glGetSubroutineUniformLocation) then Exit; @@ -10353,14 +10359,14 @@ begin end; end; -function Load_GL_ARB_tessellation_shader(): Boolean; +function Load_GL_ARB_tessellation_shader(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_tessellation_shader', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_tessellation_shader', extstring) then begin glPatchParameteri := wglGetProcAddress('glPatchParameteri'); if not Assigned(glPatchParameteri) then Exit; @@ -10370,14 +10376,14 @@ begin end; end; -function Load_GL_ARB_transform_feedback2(): Boolean; +function Load_GL_ARB_transform_feedback2(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_transform_feedback2', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_transform_feedback2', extstring) then begin glBindTransformFeedback := wglGetProcAddress('glBindTransformFeedback'); if not Assigned(glBindTransformFeedback) then Exit; @@ -10397,14 +10403,14 @@ begin end; end; -function Load_GL_ARB_transform_feedback3(): Boolean; +function Load_GL_ARB_transform_feedback3(LoadAsCore: boolean): Boolean; var extstring: String; begin Result := False; extstring := String(PChar(glGetString(GL_EXTENSIONS))); - if glext_ExtensionSupported('GL_ARB_transform_feedback3', extstring) then + if LoadAsCore or glext_ExtensionSupported('GL_ARB_transform_feedback3', extstring) then begin glDrawTransformFeedbackStream := wglGetProcAddress('glDrawTransformFeedbackStream'); if not Assigned(glDrawTransformFeedbackStream) then Exit; @@ -11113,9 +11119,9 @@ begin if not Assigned(glClearBufferfi) then Exit; glGetStringi := wglGetProcAddress('glGetStringi'); if not Assigned(glGetStringi) then Exit; - if not Load_GL_ARB_framebuffer_object() then Exit; - if not Load_GL_ARB_map_buffer_range() then Exit; - if not Load_GL_ARB_vertex_array_object() then Exit; + if not Load_GL_ARB_framebuffer_object(true) then Exit; + if not Load_GL_ARB_map_buffer_range(true) then Exit; + if not Load_GL_ARB_vertex_array_object(true) then Exit; Result := Load_GL_VERSION_2_1(); end; @@ -11130,8 +11136,8 @@ begin if not Assigned(glTexBuffer) then Exit; glPrimitiveRestartIndex := wglGetProcAddress('glPrimitiveRestartIndex'); if not Assigned(glPrimitiveRestartIndex) then Exit; - if not Load_GL_ARB_copy_buffer() then Exit; - if not Load_GL_ARB_uniform_buffer_object() then Exit; + if not Load_GL_ARB_copy_buffer(true) then Exit; + if not Load_GL_ARB_uniform_buffer_object(true) then Exit; Result := Load_GL_VERSION_3_0(); end; @@ -11146,31 +11152,31 @@ begin if not Assigned(glProgramParameteri) then Exit; glFramebufferTexture := wglGetProcAddress('glFramebufferTexture'); if not Assigned(glFramebufferTexture) then Exit; - if not Load_GL_ARB_draw_elements_base_vertex() then Exit; - if not Load_GL_ARB_provoking_vertex() then Exit; - if not Load_GL_ARB_sync() then Exit; - if not Load_GL_ARB_texture_multisample() then Exit; + if not Load_GL_ARB_draw_elements_base_vertex(true) then Exit; + if not Load_GL_ARB_provoking_vertex(true) then Exit; + if not Load_GL_ARB_sync(true) then Exit; + if not Load_GL_ARB_texture_multisample(true) then Exit; Result := Load_GL_VERSION_3_1(); end; function Load_GL_VERSION_3_3(): Boolean; begin Result := False; - if not Load_GL_ARB_blend_func_extended() then Exit; - if not Load_GL_ARB_sampler_objects() then Exit; - if not Load_GL_ARB_timer_query() then Exit; - if not Load_GL_ARB_vertex_type_2_10_10_10_rev() then Exit; + if not Load_GL_ARB_blend_func_extended(true) then Exit; + if not Load_GL_ARB_sampler_objects(true) then Exit; + if not Load_GL_ARB_timer_query(true) then Exit; + if not Load_GL_ARB_vertex_type_2_10_10_10_rev(true) then Exit; Result := Load_GL_VERSION_3_2(); end; function Load_GL_VERSION_4_0(): Boolean; begin Result := False; - if not Load_GL_ARB_gpu_shader_fp64() then Exit; - if not Load_GL_ARB_shader_subroutine() then Exit; - if not Load_GL_ARB_tessellation_shader() then Exit; - if not Load_GL_ARB_transform_feedback2() then Exit; - if not Load_GL_ARB_transform_feedback3() then Exit; + if not Load_GL_ARB_gpu_shader_fp64(true) then Exit; + if not Load_GL_ARB_shader_subroutine(true) then Exit; + if not Load_GL_ARB_tessellation_shader(true) then Exit; + if not Load_GL_ARB_transform_feedback2(true) then Exit; + if not Load_GL_ARB_transform_feedback3(true) then Exit; Result := Load_GL_VERSION_3_3(); end;