From 4dba54c66c714beaf47f9e8cf3cda221149c9cc0 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Wed, 8 Mar 2017 13:15:10 -0800 Subject: [PATCH] Cleanup native OpenGL object creation --- lime/_backend/native/NativeCFFI.hx | 93 +++-- lime/_backend/native/NativeGLRenderContext.hx | 374 ++++++++++-------- lime/graphics/opengl/GLBuffer.hx | 9 +- lime/graphics/opengl/GLFramebuffer.hx | 9 +- lime/graphics/opengl/GLObject.hx | 60 --- lime/graphics/opengl/GLProgram.hx | 32 +- lime/graphics/opengl/GLQuery.hx | 13 +- lime/graphics/opengl/GLRenderbuffer.hx | 13 +- lime/graphics/opengl/GLSampler.hx | 13 +- lime/graphics/opengl/GLShader.hx | 16 +- lime/graphics/opengl/GLSync.hx | 13 +- lime/graphics/opengl/GLTexture.hx | 13 +- lime/graphics/opengl/GLTransformFeedback.hx | 13 +- lime/graphics/opengl/GLVertexArrayObject.hx | 13 +- project/include/system/CFFIPointer.h | 1 + .../src/graphics/opengl/OpenGLBindings.cpp | 286 ++++++++------ project/src/graphics/opengl/OpenGLBindings.h | 17 + project/src/system/CFFIPointer.cpp | 13 + 18 files changed, 539 insertions(+), 462 deletions(-) delete mode 100644 lime/graphics/opengl/GLObject.hx diff --git a/lime/_backend/native/NativeCFFI.hx b/lime/_backend/native/NativeCFFI.hx index 22450a949..8e4688503 100644 --- a/lime/_backend/native/NativeCFFI.hx +++ b/lime/_backend/native/NativeCFFI.hx @@ -1,6 +1,12 @@ package lime._backend.native; +import lime.graphics.opengl.GLBuffer; +import lime.graphics.opengl.GLFramebuffer; +import lime.graphics.opengl.GLProgram; +import lime.graphics.opengl.GLRenderbuffer; +import lime.graphics.opengl.GLShader; +import lime.graphics.opengl.GLTexture; import lime.system.CFFIPointer; import lime.utils.DataPointer; @@ -411,12 +417,12 @@ class NativeCFFI { #if (lime_cffi && !macro && lime_opengl) @:cffi private static function lime_gl_active_texture (texture:Int):Void; - @:cffi private static function lime_gl_attach_shader (program:CFFIPointer, shader:CFFIPointer):Void; - @:cffi private static function lime_gl_bind_attrib_location (program:CFFIPointer, index:Int, name:String):Void; - @:cffi private static function lime_gl_bind_buffer (target:Int, buffer:CFFIPointer):Void; - @:cffi private static function lime_gl_bind_framebuffer (target:Int, framebuffer:CFFIPointer):Void; - @:cffi private static function lime_gl_bind_renderbuffer (target:Int, renderbuffer:CFFIPointer):Void; - @:cffi private static function lime_gl_bind_texture (target:Int, texture:CFFIPointer):Void; + @:cffi private static function lime_gl_attach_shader (program:GLProgram, shader:GLShader):Void; + @:cffi private static function lime_gl_bind_attrib_location (program:GLProgram, index:Int, name:String):Void; + @:cffi private static function lime_gl_bind_buffer (target:Int, buffer:GLBuffer):Void; + @:cffi private static function lime_gl_bind_framebuffer (target:Int, framebuffer:GLFramebuffer):Void; + @:cffi private static function lime_gl_bind_renderbuffer (target:Int, renderbuffer:GLRenderbuffer):Void; + @:cffi private static function lime_gl_bind_texture (target:Int, texture:GLTexture):Void; @:cffi private static function lime_gl_blend_color (red:Float32, green:Float32, blue:Float32, alpha:Float32):Void; @:cffi private static function lime_gl_blend_equation (mode:Int):Void; @:cffi private static function lime_gl_blend_equation_separate (modeRGB:Int, modeAlpha:Int):Void; @@ -430,28 +436,28 @@ class NativeCFFI { @:cffi private static function lime_gl_clear_depth (depth:Float32):Void; @:cffi private static function lime_gl_clear_stencil (s:Int):Void; @:cffi private static function lime_gl_color_mask (red:Bool, green:Bool, blue:Bool, alpha:Bool):Void; - @:cffi private static function lime_gl_compile_shader (shader:CFFIPointer):Void; + @:cffi private static function lime_gl_compile_shader (shader:GLShader):Void; @:cffi private static function lime_gl_compressed_tex_image_2d (target:Int, level:Int, internalformat:Int, width:Int, height:Int, border:Int, imageSize:Int, srcData:DataPointer):Void; @:cffi private static function lime_gl_compressed_tex_sub_image_2d (target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, imageSize:Int, srcData:DataPointer):Void; @:cffi private static function lime_gl_copy_tex_image_2d (target:Int, level:Int, internalformat:Int, x:Int, y:Int, width:Int, height:Int, border:Int):Void; @:cffi private static function lime_gl_copy_tex_sub_image_2d (target:Int, level:Int, xoffset:Int, yoffset:Int, x:Int, y:Int, width:Int, height:Int):Void; - @:cffi private static function lime_gl_create_buffer ():CFFIPointer; - @:cffi private static function lime_gl_create_framebuffer ():CFFIPointer; - @:cffi private static function lime_gl_create_program ():CFFIPointer; - @:cffi private static function lime_gl_create_render_buffer ():CFFIPointer; - @:cffi private static function lime_gl_create_shader (type:Int):CFFIPointer; - @:cffi private static function lime_gl_create_texture ():CFFIPointer; + @:cffi private static function lime_gl_create_buffer ():GLBuffer; + @:cffi private static function lime_gl_create_framebuffer ():GLFramebuffer; + @:cffi private static function lime_gl_create_program ():GLProgram; + @:cffi private static function lime_gl_create_renderbuffer ():GLRenderbuffer; + @:cffi private static function lime_gl_create_shader (type:Int):GLShader; + @:cffi private static function lime_gl_create_texture ():GLTexture; @:cffi private static function lime_gl_cull_face (mode:Int):Void; - @:cffi private static function lime_gl_delete_buffer (buffer:CFFIPointer):Void; - @:cffi private static function lime_gl_delete_framebuffer (framebuffer:CFFIPointer):Void; - @:cffi private static function lime_gl_delete_program (program:CFFIPointer):Void; - @:cffi private static function lime_gl_delete_render_buffer (renderbuffer:CFFIPointer):Void; - @:cffi private static function lime_gl_delete_shader (shader:CFFIPointer):Void; - @:cffi private static function lime_gl_delete_texture (texture:CFFIPointer):Void; + @:cffi private static function lime_gl_delete_buffer (buffer:GLBuffer):Void; + @:cffi private static function lime_gl_delete_framebuffer (framebuffer:GLFramebuffer):Void; + @:cffi private static function lime_gl_delete_program (program:GLProgram):Void; + @:cffi private static function lime_gl_delete_renderbuffer (renderbuffer:GLRenderbuffer):Void; + @:cffi private static function lime_gl_delete_shader (shader:GLShader):Void; + @:cffi private static function lime_gl_delete_texture (texture:GLTexture):Void; @:cffi private static function lime_gl_depth_func (func:Int):Void; @:cffi private static function lime_gl_depth_mask (flag:Bool):Void; @:cffi private static function lime_gl_depth_range (zNear:Float32, zFar:Float32):Void; - @:cffi private static function lime_gl_detach_shader (program:CFFIPointer, shader:CFFIPointer):Void; + @:cffi private static function lime_gl_detach_shader (program:GLProgram, shader:GLShader):Void; @:cffi private static function lime_gl_disable (cap:Int):Void; @:cffi private static function lime_gl_disable_vertex_attrib_array (index:Int):Void; @:cffi private static function lime_gl_draw_arrays (mode:Int, first:Int, count:Int):Void; @@ -460,13 +466,13 @@ class NativeCFFI { @:cffi private static function lime_gl_enable_vertex_attrib_array (index:Int):Void; @:cffi private static function lime_gl_finish ():Void; @:cffi private static function lime_gl_flush ():Void; - @:cffi private static function lime_gl_framebuffer_renderbuffer (target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:CFFIPointer):Void; - @:cffi private static function lime_gl_framebuffer_texture2D (target:Int, attachment:Int, textarget:Int, texture:CFFIPointer, level:Int):Void; + @:cffi private static function lime_gl_framebuffer_renderbuffer (target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:GLRenderbuffer):Void; + @:cffi private static function lime_gl_framebuffer_texture2D (target:Int, attachment:Int, textarget:Int, texture:GLTexture, level:Int):Void; @:cffi private static function lime_gl_front_face (mode:Int):Void; @:cffi private static function lime_gl_generate_mipmap (target:Int):Void; - @:cffi private static function lime_gl_get_active_attrib (program:CFFIPointer, index:Int):Dynamic; - @:cffi private static function lime_gl_get_active_uniform (program:CFFIPointer, index:Int):Dynamic; - @:cffi private static function lime_gl_get_attrib_location (program:CFFIPointer, name:String):Int; + @:cffi private static function lime_gl_get_active_attrib (program:GLProgram, index:Int):Dynamic; + @:cffi private static function lime_gl_get_active_uniform (program:GLProgram, index:Int):Dynamic; + @:cffi private static function lime_gl_get_attrib_location (program:GLProgram, name:String):Int; @:cffi private static function lime_gl_get_boolean (pname:Int):Bool; @:cffi private static function lime_gl_get_booleanv (pname:Int):Array; @:cffi private static function lime_gl_get_buffer_parameter (target:Int, pname:Int):Dynamic; @@ -479,37 +485,38 @@ class NativeCFFI { @:cffi private static function lime_gl_get_integer (pname:Int):Int; @:cffi private static function lime_gl_get_integerv (pname:Int):Array; @:cffi private static function lime_gl_get_parameter (pname:Int):Dynamic; - @:cffi private static function lime_gl_get_program_info_log (program:CFFIPointer):Dynamic; - @:cffi private static function lime_gl_get_program_parameter (program:CFFIPointer, pname:Int):Dynamic; - @:cffi private static function lime_gl_get_render_buffer_parameter (target:Int, pname:Int):Dynamic; - @:cffi private static function lime_gl_get_shader_info_log (shader:CFFIPointer):Dynamic; - @:cffi private static function lime_gl_get_shader_parameter (shader:CFFIPointer, pname:Int):Dynamic; + @:cffi private static function lime_gl_get_program_info_log (program:GLProgram):Dynamic; + @:cffi private static function lime_gl_get_program_parameter (program:GLProgram, pname:Int):Dynamic; + @:cffi private static function lime_gl_get_renderbuffer_parameter (target:Int, pname:Int):Dynamic; + @:cffi private static function lime_gl_get_shader_info_log (shader:GLShader):Dynamic; + @:cffi private static function lime_gl_get_shader_parameter (shader:GLShader, pname:Int):Dynamic; @:cffi private static function lime_gl_get_shader_precision_format (shadertype:Int, precisiontype:Int):Dynamic; - @:cffi private static function lime_gl_get_shader_source (shader:CFFIPointer):Dynamic; + @:cffi private static function lime_gl_get_shader_source (shader:GLShader):Dynamic; @:cffi private static function lime_gl_get_string (pname:Int):Dynamic; @:cffi private static function lime_gl_get_supported_extensions (result:Dynamic):Void; @:cffi private static function lime_gl_get_tex_parameter (target:Int, pname:Int):Dynamic; - @:cffi private static function lime_gl_get_uniform (program:CFFIPointer, location:Int):Dynamic; - @:cffi private static function lime_gl_get_uniform_location (program:CFFIPointer, name:String):Int; + @:cffi private static function lime_gl_get_uniform (program:GLProgram, location:Int):Dynamic; + @:cffi private static function lime_gl_get_uniform_location (program:GLProgram, name:String):Int; @:cffi private static function lime_gl_get_vertex_attrib (index:Int, pname:Int):Dynamic; @:cffi private static function lime_gl_get_vertex_attrib_offset (index:Int, pname:Int):DataPointer; @:cffi private static function lime_gl_hint (target:Int, mode:Int):Void; - @:cffi private static function lime_gl_is_buffer (buffer:CFFIPointer):Bool; + @:cffi private static function lime_gl_is_buffer (buffer:GLBuffer):Bool; @:cffi private static function lime_gl_is_enabled (cap:Int):Bool; - @:cffi private static function lime_gl_is_framebuffer (framebuffer:CFFIPointer):Bool; - @:cffi private static function lime_gl_is_program (program:CFFIPointer):Bool; - @:cffi private static function lime_gl_is_renderbuffer (renderbuffer:CFFIPointer):Bool; - @:cffi private static function lime_gl_is_shader (shader:CFFIPointer):Bool; - @:cffi private static function lime_gl_is_texture (texture:CFFIPointer):Bool; + @:cffi private static function lime_gl_is_framebuffer (framebuffer:GLFramebuffer):Bool; + @:cffi private static function lime_gl_is_program (program:GLProgram):Bool; + @:cffi private static function lime_gl_is_renderbuffer (renderbuffer:GLRenderbuffer):Bool; + @:cffi private static function lime_gl_is_shader (shader:GLShader):Bool; + @:cffi private static function lime_gl_is_texture (texture:GLTexture):Bool; @:cffi private static function lime_gl_line_width (width:Float32):Void; - @:cffi private static function lime_gl_link_program (program:CFFIPointer):Void; + @:cffi private static function lime_gl_link_program (program:GLProgram):Void; + @:cffi private static function lime_gl_object_constructor (type:Int, constructor:Dynamic):Void; @:cffi private static function lime_gl_pixel_storei (pname:Int, param:Int):Void; @:cffi private static function lime_gl_polygon_offset (factor:Float32, units:Float32):Void; @:cffi private static function lime_gl_read_pixels (x:Int, y:Int, width:Int, height:Int, format:Int, type:Int, pixels:DataPointer):Void; @:cffi private static function lime_gl_renderbuffer_storage (target:Int, internalformat:Int, width:Int, height:Int):Void; @:cffi private static function lime_gl_sample_coverage (value:Float32, invert:Bool):Void; @:cffi private static function lime_gl_scissor (x:Int, y:Int, width:Int, height:Int):Void; - @:cffi private static function lime_gl_shader_source (shader:CFFIPointer, source:String):Void; + @:cffi private static function lime_gl_shader_source (shader:GLShader, source:String):Void; @:cffi private static function lime_gl_stencil_func (func:Int, ref:Int, mask:Int):Void; @:cffi private static function lime_gl_stencil_func_separate (face:Int, func:Int, ref:Int, mask:Int):Void; @:cffi private static function lime_gl_stencil_mask (mask:Int):Void; @@ -537,8 +544,8 @@ class NativeCFFI { @:cffi private static function lime_gl_uniform4i (location:Int, x:Int, y:Int, z:Int, w:Int):Void; @:cffi private static function lime_gl_uniform4iv (location:Int, v:Dynamic):Void; @:cffi private static function lime_gl_uniform_matrix (location:Int, transpose:Bool, buffer:Dynamic, count:Int):Void; - @:cffi private static function lime_gl_use_program (program:CFFIPointer):Void; - @:cffi private static function lime_gl_validate_program (program:CFFIPointer):Void; + @:cffi private static function lime_gl_use_program (program:GLProgram):Void; + @:cffi private static function lime_gl_validate_program (program:GLProgram):Void; @:cffi private static function lime_gl_version ():String; @:cffi private static function lime_gl_vertex_attrib1f (indx:Int, x:Float32):Void; @:cffi private static function lime_gl_vertex_attrib1fv (indx:Int, values:Dynamic):Void; diff --git a/lime/_backend/native/NativeGLRenderContext.hx b/lime/_backend/native/NativeGLRenderContext.hx index 0d2261ee0..1361d949a 100644 --- a/lime/_backend/native/NativeGLRenderContext.hx +++ b/lime/_backend/native/NativeGLRenderContext.hx @@ -1,6 +1,11 @@ package lime._backend.native; +import lime.graphics.opengl.GLQuery; +import lime.graphics.opengl.GLSampler; +import lime.graphics.opengl.GLSync; +import lime.graphics.opengl.GLTransformFeedback; +import lime.graphics.opengl.GLVertexArrayObject; import lime.graphics.opengl.ext.*; import lime.graphics.opengl.GLActiveInfo; import lime.graphics.opengl.GLBuffer; @@ -29,6 +34,7 @@ import lime.utils.Int32Array; @:allow(lime.ui.Window) @:access(lime._backend.native.NativeCFFI) +@:access(lime.graphics.opengl) class NativeGLRenderContext { @@ -685,6 +691,7 @@ class NativeGLRenderContext { private var __contextID:Int; private var __currentProgram:GLProgram; private var __framebufferBinding:GLFramebuffer; + private var __initialized:Bool; private var __isContextLost:Bool; private var __renderbufferBinding:GLRenderbuffer; private var __texture2DBinding:GLTexture; @@ -695,109 +702,7 @@ class NativeGLRenderContext { __contextID = __lastContextID++; - __extensionObjectTypes["AMD_compressed_3DC_texture"] = AMD_compressed_3DC_texture; - __extensionObjectTypes["AMD_compressed_ATC_texture"] = AMD_compressed_ATC_texture; - __extensionObjectTypes["AMD_performance_monitor"] = AMD_performance_monitor; - __extensionObjectTypes["AMD_program_binary_Z400"] = AMD_program_binary_Z400; - __extensionObjectTypes["ANGLE_framebuffer_blit"] = ANGLE_framebuffer_blit; - __extensionObjectTypes["ANGLE_framebuffer_multisample"] = ANGLE_framebuffer_multisample; - __extensionObjectTypes["ANGLE_instanced_arrays"] = ANGLE_instanced_arrays; - __extensionObjectTypes["ANGLE_pack_reverse_row_order"] = ANGLE_pack_reverse_row_order; - __extensionObjectTypes["ANGLE_texture_compression_dxt3"] = ANGLE_texture_compression_dxt3; - __extensionObjectTypes["ANGLE_texture_compression_dxt5"] = ANGLE_texture_compression_dxt5; - __extensionObjectTypes["ANGLE_texture_usage"] = ANGLE_texture_usage; - __extensionObjectTypes["ANGLE_translated_shader_source"] = ANGLE_translated_shader_source; - __extensionObjectTypes["APPLE_copy_texture_levels"] = APPLE_copy_texture_levels; - __extensionObjectTypes["APPLE_framebuffer_multisample"] = APPLE_framebuffer_multisample; - __extensionObjectTypes["APPLE_rgb_422"] = APPLE_rgb_422; - __extensionObjectTypes["APPLE_sync"] = APPLE_sync; - __extensionObjectTypes["APPLE_texture_format_BGRA8888"] = APPLE_texture_format_BGRA8888; - __extensionObjectTypes["APPLE_texture_max_level"] = APPLE_texture_max_level; - __extensionObjectTypes["ARM_mali_program_binary"] = ARM_mali_program_binary; - __extensionObjectTypes["ARM_mali_shader_binary"] = ARM_mali_shader_binary; - __extensionObjectTypes["ARM_rgba8"] = ARM_rgba8; - __extensionObjectTypes["DMP_shader_binary"] = DMP_shader_binary; - __extensionObjectTypes["EXT_bgra"] = EXT_bgra; - __extensionObjectTypes["EXT_blend_minmax"] = EXT_blend_minmax; - __extensionObjectTypes["EXT_color_buffer_float"] = EXT_color_buffer_float; - __extensionObjectTypes["EXT_color_buffer_half_float"] = EXT_color_buffer_half_float; - __extensionObjectTypes["EXT_debug_label"] = EXT_debug_label; - __extensionObjectTypes["EXT_debug_marker"] = EXT_debug_marker; - __extensionObjectTypes["EXT_discard_framebuffer"] = EXT_discard_framebuffer; - __extensionObjectTypes["EXT_map_buffer_range"] = EXT_map_buffer_range; - __extensionObjectTypes["EXT_multi_draw_arrays"] = EXT_multi_draw_arrays; - __extensionObjectTypes["EXT_multisampled_render_to_texture"] = EXT_multisampled_render_to_texture; - __extensionObjectTypes["EXT_multiview_draw_buffers"] = EXT_multiview_draw_buffers; - __extensionObjectTypes["EXT_occlusion_query_boolean"] = EXT_occlusion_query_boolean; - __extensionObjectTypes["EXT_read_format_bgra"] = EXT_read_format_bgra; - __extensionObjectTypes["EXT_robustness"] = EXT_robustness; - __extensionObjectTypes["EXT_sRGB"] = EXT_sRGB; - __extensionObjectTypes["EXT_separate_shader_objects"] = EXT_separate_shader_objects; - __extensionObjectTypes["EXT_shader_framebuffer_fetch"] = EXT_shader_framebuffer_fetch; - __extensionObjectTypes["EXT_shader_texture_lod"] = EXT_shader_texture_lod; - __extensionObjectTypes["EXT_shadow_samplers"] = EXT_shadow_samplers; - __extensionObjectTypes["EXT_texture_compression_dxt1"] = EXT_texture_compression_dxt1; - __extensionObjectTypes["EXT_texture_filter_anisotropic"] = EXT_texture_filter_anisotropic; - __extensionObjectTypes["EXT_texture_format_BGRA8888"] = EXT_texture_format_BGRA8888; - __extensionObjectTypes["EXT_texture_rg"] = EXT_texture_rg; - __extensionObjectTypes["EXT_texture_storage"] = EXT_texture_storage; - __extensionObjectTypes["EXT_texture_type_2_10_10_10_REV"] = EXT_texture_type_2_10_10_10_REV; - __extensionObjectTypes["EXT_unpack_subimage"] = EXT_unpack_subimage; - __extensionObjectTypes["FJ_shader_binary_GCCSO"] = FJ_shader_binary_GCCSO; - __extensionObjectTypes["IMG_multisampled_render_to_texture"] = IMG_multisampled_render_to_texture; - __extensionObjectTypes["IMG_program_binary"] = IMG_program_binary; - __extensionObjectTypes["IMG_read_format"] = IMG_read_format; - __extensionObjectTypes["IMG_shader_binary"] = IMG_shader_binary; - __extensionObjectTypes["IMG_texture_compression_pvrtc"] = IMG_texture_compression_pvrtc; - __extensionObjectTypes["KHR_debug"] = KHR_debug; - __extensionObjectTypes["KHR_texture_compression_astc_ldr"] = KHR_texture_compression_astc_ldr; - __extensionObjectTypes["NV_coverage_sample"] = NV_coverage_sample; - __extensionObjectTypes["NV_depth_nonlinear"] = NV_depth_nonlinear; - __extensionObjectTypes["NV_draw_buffers"] = NV_draw_buffers; - __extensionObjectTypes["NV_fbo_color_attachments"] = NV_fbo_color_attachments; - __extensionObjectTypes["NV_fence"] = NV_fence; - __extensionObjectTypes["NV_read_buffer"] = NV_read_buffer; - __extensionObjectTypes["NV_read_buffer_front"] = NV_read_buffer_front; - __extensionObjectTypes["NV_read_depth"] = NV_read_depth; - __extensionObjectTypes["NV_read_depth_stencil"] = NV_read_depth_stencil; - __extensionObjectTypes["NV_read_stencil"] = NV_read_stencil; - __extensionObjectTypes["NV_texture_compression_s3tc_update"] = NV_texture_compression_s3tc_update; - __extensionObjectTypes["NV_texture_npot_2D_mipmap"] = NV_texture_npot_2D_mipmap; - __extensionObjectTypes["OES_EGL_image"] = OES_EGL_image; - __extensionObjectTypes["OES_EGL_image_external"] = OES_EGL_image_external; - __extensionObjectTypes["OES_compressed_ETC1_RGB8_texture"] = OES_compressed_ETC1_RGB8_texture; - __extensionObjectTypes["OES_compressed_paletted_texture"] = OES_compressed_paletted_texture; - __extensionObjectTypes["OES_depth24"] = OES_depth24; - __extensionObjectTypes["OES_depth32"] = OES_depth32; - __extensionObjectTypes["OES_depth_texture"] = OES_depth_texture; - __extensionObjectTypes["OES_element_index_uint"] = OES_element_index_uint; - __extensionObjectTypes["OES_get_program_binary"] = OES_get_program_binary; - __extensionObjectTypes["OES_mapbuffer"] = OES_mapbuffer; - __extensionObjectTypes["OES_packed_depth_stencil"] = OES_packed_depth_stencil; - __extensionObjectTypes["OES_required_internalformat"] = OES_required_internalformat; - __extensionObjectTypes["OES_rgb8_rgba8"] = OES_rgb8_rgba8; - __extensionObjectTypes["OES_standard_derivatives"] = OES_standard_derivatives; - __extensionObjectTypes["OES_stencil1"] = OES_stencil1; - __extensionObjectTypes["OES_stencil4"] = OES_stencil4; - __extensionObjectTypes["OES_surfaceless_context"] = OES_surfaceless_context; - __extensionObjectTypes["OES_texture_3D"] = OES_texture_3D; - __extensionObjectTypes["OES_texture_float"] = OES_texture_float; - __extensionObjectTypes["OES_texture_float_linear"] = OES_texture_float_linear; - __extensionObjectTypes["OES_texture_half_float"] = OES_texture_half_float; - __extensionObjectTypes["OES_texture_half_float_linear"] = OES_texture_half_float_linear; - __extensionObjectTypes["OES_texture_npot"] = OES_texture_npot; - __extensionObjectTypes["OES_vertex_array_object"] = OES_vertex_array_object; - __extensionObjectTypes["OES_vertex_half_float"] = OES_vertex_half_float; - __extensionObjectTypes["OES_vertex_type_10_10_10_2"] = OES_vertex_type_10_10_10_2; - __extensionObjectTypes["QCOM_alpha_test"] = QCOM_alpha_test; - __extensionObjectTypes["QCOM_binning_control"] = QCOM_binning_control; - __extensionObjectTypes["QCOM_driver_control"] = QCOM_driver_control; - __extensionObjectTypes["QCOM_extended_get"] = QCOM_extended_get; - __extensionObjectTypes["QCOM_extended_get2"] = QCOM_extended_get2; - __extensionObjectTypes["QCOM_perfmon_global_mode"] = QCOM_perfmon_global_mode; - __extensionObjectTypes["QCOM_tiled_rendering"] = QCOM_tiled_rendering; - __extensionObjectTypes["QCOM_writeonly_rendering"] = QCOM_writeonly_rendering; - __extensionObjectTypes["VIV_shader_binary"] = VIV_shader_binary; + __initialize (); #if (lime_cffi && lime_opengl && !macro) var versionString:String = getParameter (VERSION); @@ -831,9 +736,14 @@ class NativeGLRenderContext { public function attachShader (program:GLProgram, shader:GLShader):Void { + if (program != null && shader != null && program.shaders.indexOf (shader) == -1) { + + program.shaders.push (shader); + + } + #if (lime_cffi && lime_opengl && !macro) - program.attach (shader); - NativeCFFI.lime_gl_attach_shader (program.id, shader.id); + NativeCFFI.lime_gl_attach_shader (program, shader); #end } @@ -842,7 +752,7 @@ class NativeGLRenderContext { public function bindAttribLocation (program:GLProgram, index:Int, name:String):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_bind_attrib_location (program.id, index, name); + NativeCFFI.lime_gl_bind_attrib_location (program, index, name); #end } @@ -854,7 +764,7 @@ class NativeGLRenderContext { if (target == ELEMENT_ARRAY_BUFFER) __elementBufferBinding = buffer; #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_bind_buffer (target, buffer == null ? null : buffer.id); + NativeCFFI.lime_gl_bind_buffer (target, buffer); #end } @@ -865,7 +775,7 @@ class NativeGLRenderContext { __framebufferBinding = framebuffer; #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_bind_framebuffer (target, framebuffer == null ? null : framebuffer.id); + NativeCFFI.lime_gl_bind_framebuffer (target, framebuffer); #end } @@ -876,7 +786,7 @@ class NativeGLRenderContext { __renderbufferBinding = renderbuffer; #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_bind_renderbuffer (target, renderbuffer == null ? null : renderbuffer.id); + NativeCFFI.lime_gl_bind_renderbuffer (target, renderbuffer); #end } @@ -888,7 +798,7 @@ class NativeGLRenderContext { if (target == TEXTURE_CUBE_MAP) __textureCubeMapBinding = texture; #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_bind_texture (target, texture == null ? null : texture.id); + NativeCFFI.lime_gl_bind_texture (target, texture); #end } @@ -1016,7 +926,7 @@ class NativeGLRenderContext { public function compileShader (shader:GLShader):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_compile_shader (shader.id); + NativeCFFI.lime_gl_compile_shader (shader); #end } @@ -1061,7 +971,7 @@ class NativeGLRenderContext { public function createBuffer ():GLBuffer { #if (lime_cffi && lime_opengl && !macro) - return new GLBuffer (__contextID, NativeCFFI.lime_gl_create_buffer ()); + return NativeCFFI.lime_gl_create_buffer (); #else return null; #end @@ -1072,7 +982,7 @@ class NativeGLRenderContext { public function createFramebuffer ():GLFramebuffer { #if (lime_cffi && lime_opengl && !macro) - return new GLFramebuffer (__contextID, NativeCFFI.lime_gl_create_framebuffer ()); + return NativeCFFI.lime_gl_create_framebuffer (); #else return null; #end @@ -1083,7 +993,7 @@ class NativeGLRenderContext { public function createProgram ():GLProgram { #if (lime_cffi && lime_opengl && !macro) - return new GLProgram (__contextID, NativeCFFI.lime_gl_create_program ()); + return NativeCFFI.lime_gl_create_program (); #else return null; #end @@ -1094,7 +1004,7 @@ class NativeGLRenderContext { public function createRenderbuffer ():GLRenderbuffer { #if (lime_cffi && lime_opengl && !macro) - return new GLRenderbuffer (__contextID, NativeCFFI.lime_gl_create_render_buffer ()); + return NativeCFFI.lime_gl_create_renderbuffer (); #else return null; #end @@ -1105,7 +1015,7 @@ class NativeGLRenderContext { public function createShader (type:Int):GLShader { #if (lime_cffi && lime_opengl && !macro) - return new GLShader (__contextID, NativeCFFI.lime_gl_create_shader (type)); + return NativeCFFI.lime_gl_create_shader (type); #else return null; #end @@ -1116,7 +1026,7 @@ class NativeGLRenderContext { public function createTexture ():GLTexture { #if (lime_cffi && lime_opengl && !macro) - return new GLTexture (__contextID, NativeCFFI.lime_gl_create_texture ()); + return NativeCFFI.lime_gl_create_texture (); #else return null; #end @@ -1136,8 +1046,7 @@ class NativeGLRenderContext { public function deleteBuffer (buffer:GLBuffer):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_delete_buffer (buffer.id); - buffer.invalidate (); + NativeCFFI.lime_gl_delete_buffer (buffer); #end } @@ -1146,8 +1055,7 @@ class NativeGLRenderContext { public function deleteFramebuffer (framebuffer:GLFramebuffer):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_delete_framebuffer (framebuffer.id); - framebuffer.invalidate (); + NativeCFFI.lime_gl_delete_framebuffer (framebuffer); #end } @@ -1156,8 +1064,7 @@ class NativeGLRenderContext { public function deleteProgram (program:GLProgram):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_delete_program (program.id); - program.invalidate (); + NativeCFFI.lime_gl_delete_program (program); #end } @@ -1166,8 +1073,7 @@ class NativeGLRenderContext { public function deleteRenderbuffer (renderbuffer:GLRenderbuffer):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_delete_render_buffer (renderbuffer.id); - renderbuffer.invalidate (); + NativeCFFI.lime_gl_delete_renderbuffer (renderbuffer); #end } @@ -1176,8 +1082,7 @@ class NativeGLRenderContext { public function deleteShader (shader:GLShader):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_delete_shader (shader.id); - shader.invalidate (); + NativeCFFI.lime_gl_delete_shader (shader); #end } @@ -1186,8 +1091,7 @@ class NativeGLRenderContext { public function deleteTexture (texture:GLTexture):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_delete_texture (texture.id); - texture.invalidate (); + NativeCFFI.lime_gl_delete_texture (texture); #end } @@ -1222,8 +1126,14 @@ class NativeGLRenderContext { public function detachShader (program:GLProgram, shader:GLShader):Void { + if (program != null) { + + program.shaders.remove (shader); + + } + #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_detach_shader (program.id, shader.id); + NativeCFFI.lime_gl_detach_shader (program, shader); #end } @@ -1304,7 +1214,7 @@ class NativeGLRenderContext { public function framebufferRenderbuffer (target:Int, attachment:Int, renderbuffertarget:Int, renderbuffer:GLRenderbuffer):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_framebuffer_renderbuffer (target, attachment, renderbuffertarget, renderbuffer.id); + NativeCFFI.lime_gl_framebuffer_renderbuffer (target, attachment, renderbuffertarget, renderbuffer); #end } @@ -1313,7 +1223,7 @@ class NativeGLRenderContext { public function framebufferTexture2D (target:Int, attachment:Int, textarget:Int, texture:GLTexture, level:Int):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_framebuffer_texture2D (target, attachment, textarget, texture.id, level); + NativeCFFI.lime_gl_framebuffer_texture2D (target, attachment, textarget, texture, level); #end } @@ -1340,7 +1250,7 @@ class NativeGLRenderContext { public function getActiveAttrib (program:GLProgram, index:Int):GLActiveInfo { #if (lime_cffi && lime_opengl && !macro) - var result:Dynamic = NativeCFFI.lime_gl_get_active_attrib (program.id, index); + var result:Dynamic = NativeCFFI.lime_gl_get_active_attrib (program, index); return result; #else return null; @@ -1352,7 +1262,7 @@ class NativeGLRenderContext { public function getActiveUniform (program:GLProgram, index:Int):GLActiveInfo { #if (lime_cffi && lime_opengl && !macro) - var result:Dynamic = NativeCFFI.lime_gl_get_active_uniform (program.id, index); + var result:Dynamic = NativeCFFI.lime_gl_get_active_uniform (program, index); return result; #else return null; @@ -1363,11 +1273,13 @@ class NativeGLRenderContext { public function getAttachedShaders (program:GLProgram):Array { - #if (lime_cffi && lime_opengl && !macro) - return program.getShaders (); - #else - return null; - #end + return program.shaders; + + //#if (lime_cffi && lime_opengl && !macro) + //return program.__attachedShaders; + //#else + //return null; + //#end } @@ -1375,7 +1287,7 @@ class NativeGLRenderContext { public function getAttribLocation (program:GLProgram, name:String):Int { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_attrib_location (program.id, name); + return NativeCFFI.lime_gl_get_attrib_location (program, name); #else return 0; #end @@ -1609,7 +1521,7 @@ class NativeGLRenderContext { public function getProgramInfoLog (program:GLProgram):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_program_info_log (program.id); + return NativeCFFI.lime_gl_get_program_info_log (program); #else return null; #end @@ -1620,7 +1532,7 @@ class NativeGLRenderContext { public function getProgramParameter (program:GLProgram, pname:Int):Dynamic { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_program_parameter (program.id, pname); + return NativeCFFI.lime_gl_get_program_parameter (program, pname); #else return 0; #end @@ -1631,7 +1543,7 @@ class NativeGLRenderContext { public function getRenderbufferParameter (target:Int, pname:Int):Dynamic { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_render_buffer_parameter (target, pname); + return NativeCFFI.lime_gl_get_renderbuffer_parameter (target, pname); #else return 0; #end @@ -1642,7 +1554,7 @@ class NativeGLRenderContext { public function getShaderInfoLog (shader:GLShader):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_shader_info_log (shader.id); + return NativeCFFI.lime_gl_get_shader_info_log (shader); #else return null; #end @@ -1653,7 +1565,7 @@ class NativeGLRenderContext { public function getShaderParameter (shader:GLShader, pname:Int):Dynamic { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_shader_parameter (shader.id, pname); + return NativeCFFI.lime_gl_get_shader_parameter (shader, pname); #else return 0; #end @@ -1676,7 +1588,7 @@ class NativeGLRenderContext { public function getShaderSource (shader:GLShader):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_shader_source (shader.id); + return NativeCFFI.lime_gl_get_shader_source (shader); #else return null; #end @@ -1736,7 +1648,7 @@ class NativeGLRenderContext { public function getUniform (program:GLProgram, location:GLUniformLocation):Dynamic { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_uniform (program.id, location); + return NativeCFFI.lime_gl_get_uniform (program, location); #else return null; #end @@ -1747,7 +1659,7 @@ class NativeGLRenderContext { public function getUniformLocation (program:GLProgram, name:String):GLUniformLocation { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_uniform_location (program.id, name); + return NativeCFFI.lime_gl_get_uniform_location (program, name); #else return 0; #end @@ -1789,7 +1701,7 @@ class NativeGLRenderContext { public function isBuffer (buffer:GLBuffer):Bool { #if (lime_cffi && lime_opengl && !macro) - return buffer != null && buffer.id > 0 && NativeCFFI.lime_gl_is_buffer (buffer.id); + return NativeCFFI.lime_gl_is_buffer (buffer); #else return false; #end @@ -1818,7 +1730,7 @@ class NativeGLRenderContext { public function isFramebuffer (framebuffer:GLFramebuffer):Bool { #if (lime_cffi && lime_opengl && !macro) - return framebuffer != null && framebuffer.id > 0 && NativeCFFI.lime_gl_is_framebuffer (framebuffer.id); + return NativeCFFI.lime_gl_is_framebuffer (framebuffer); #else return false; #end @@ -1829,7 +1741,7 @@ class NativeGLRenderContext { public function isProgram (program:GLProgram):Bool { #if (lime_cffi && lime_opengl && !macro) - return program != null && program.id > 0 && NativeCFFI.lime_gl_is_program (program.id); + return NativeCFFI.lime_gl_is_program (program); #else return false; #end @@ -1840,7 +1752,7 @@ class NativeGLRenderContext { public function isRenderbuffer (renderbuffer:GLRenderbuffer):Bool { #if (lime_cffi && lime_opengl && !macro) - return renderbuffer != null && renderbuffer.id > 0 && NativeCFFI.lime_gl_is_renderbuffer (renderbuffer.id); + return NativeCFFI.lime_gl_is_renderbuffer (renderbuffer); #else return false; #end @@ -1851,7 +1763,7 @@ class NativeGLRenderContext { public function isShader (shader:GLShader):Bool { #if (lime_cffi && lime_opengl && !macro) - return shader != null && shader.id > 0 && NativeCFFI.lime_gl_is_shader (shader.id); + return NativeCFFI.lime_gl_is_shader (shader); #else return false; #end @@ -1862,7 +1774,7 @@ class NativeGLRenderContext { public function isTexture (texture:GLTexture):Bool { #if (lime_cffi && lime_opengl && !macro) - return texture != null && texture.id > 0 && NativeCFFI.lime_gl_is_texture (texture.id); + return NativeCFFI.lime_gl_is_texture (texture); #else return false; #end @@ -1882,7 +1794,7 @@ class NativeGLRenderContext { public function linkProgram (program:GLProgram):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_link_program (program.id); + NativeCFFI.lime_gl_link_program (program); #end } @@ -1945,7 +1857,7 @@ class NativeGLRenderContext { public function shaderSource (shader:GLShader, source:String):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_shader_source (shader.id, source); + NativeCFFI.lime_gl_shader_source (shader, source); #end } @@ -2239,7 +2151,7 @@ class NativeGLRenderContext { __currentProgram = program; #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_use_program (program == null ? null : program.id); + NativeCFFI.lime_gl_use_program (program); #end } @@ -2248,7 +2160,7 @@ class NativeGLRenderContext { public function validateProgram (program:GLProgram):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_validate_program (program.id); + NativeCFFI.lime_gl_validate_program (program); #end } @@ -2366,4 +2278,150 @@ class NativeGLRenderContext { } + private function __initialize ():Void { + + if (!__initialized) { + + __extensionObjectTypes["AMD_compressed_3DC_texture"] = AMD_compressed_3DC_texture; + __extensionObjectTypes["AMD_compressed_ATC_texture"] = AMD_compressed_ATC_texture; + __extensionObjectTypes["AMD_performance_monitor"] = AMD_performance_monitor; + __extensionObjectTypes["AMD_program_binary_Z400"] = AMD_program_binary_Z400; + __extensionObjectTypes["ANGLE_framebuffer_blit"] = ANGLE_framebuffer_blit; + __extensionObjectTypes["ANGLE_framebuffer_multisample"] = ANGLE_framebuffer_multisample; + __extensionObjectTypes["ANGLE_instanced_arrays"] = ANGLE_instanced_arrays; + __extensionObjectTypes["ANGLE_pack_reverse_row_order"] = ANGLE_pack_reverse_row_order; + __extensionObjectTypes["ANGLE_texture_compression_dxt3"] = ANGLE_texture_compression_dxt3; + __extensionObjectTypes["ANGLE_texture_compression_dxt5"] = ANGLE_texture_compression_dxt5; + __extensionObjectTypes["ANGLE_texture_usage"] = ANGLE_texture_usage; + __extensionObjectTypes["ANGLE_translated_shader_source"] = ANGLE_translated_shader_source; + __extensionObjectTypes["APPLE_copy_texture_levels"] = APPLE_copy_texture_levels; + __extensionObjectTypes["APPLE_framebuffer_multisample"] = APPLE_framebuffer_multisample; + __extensionObjectTypes["APPLE_rgb_422"] = APPLE_rgb_422; + __extensionObjectTypes["APPLE_sync"] = APPLE_sync; + __extensionObjectTypes["APPLE_texture_format_BGRA8888"] = APPLE_texture_format_BGRA8888; + __extensionObjectTypes["APPLE_texture_max_level"] = APPLE_texture_max_level; + __extensionObjectTypes["ARM_mali_program_binary"] = ARM_mali_program_binary; + __extensionObjectTypes["ARM_mali_shader_binary"] = ARM_mali_shader_binary; + __extensionObjectTypes["ARM_rgba8"] = ARM_rgba8; + __extensionObjectTypes["DMP_shader_binary"] = DMP_shader_binary; + __extensionObjectTypes["EXT_bgra"] = EXT_bgra; + __extensionObjectTypes["EXT_blend_minmax"] = EXT_blend_minmax; + __extensionObjectTypes["EXT_color_buffer_float"] = EXT_color_buffer_float; + __extensionObjectTypes["EXT_color_buffer_half_float"] = EXT_color_buffer_half_float; + __extensionObjectTypes["EXT_debug_label"] = EXT_debug_label; + __extensionObjectTypes["EXT_debug_marker"] = EXT_debug_marker; + __extensionObjectTypes["EXT_discard_framebuffer"] = EXT_discard_framebuffer; + __extensionObjectTypes["EXT_map_buffer_range"] = EXT_map_buffer_range; + __extensionObjectTypes["EXT_multi_draw_arrays"] = EXT_multi_draw_arrays; + __extensionObjectTypes["EXT_multisampled_render_to_texture"] = EXT_multisampled_render_to_texture; + __extensionObjectTypes["EXT_multiview_draw_buffers"] = EXT_multiview_draw_buffers; + __extensionObjectTypes["EXT_occlusion_query_boolean"] = EXT_occlusion_query_boolean; + __extensionObjectTypes["EXT_read_format_bgra"] = EXT_read_format_bgra; + __extensionObjectTypes["EXT_robustness"] = EXT_robustness; + __extensionObjectTypes["EXT_sRGB"] = EXT_sRGB; + __extensionObjectTypes["EXT_separate_shader_objects"] = EXT_separate_shader_objects; + __extensionObjectTypes["EXT_shader_framebuffer_fetch"] = EXT_shader_framebuffer_fetch; + __extensionObjectTypes["EXT_shader_texture_lod"] = EXT_shader_texture_lod; + __extensionObjectTypes["EXT_shadow_samplers"] = EXT_shadow_samplers; + __extensionObjectTypes["EXT_texture_compression_dxt1"] = EXT_texture_compression_dxt1; + __extensionObjectTypes["EXT_texture_filter_anisotropic"] = EXT_texture_filter_anisotropic; + __extensionObjectTypes["EXT_texture_format_BGRA8888"] = EXT_texture_format_BGRA8888; + __extensionObjectTypes["EXT_texture_rg"] = EXT_texture_rg; + __extensionObjectTypes["EXT_texture_storage"] = EXT_texture_storage; + __extensionObjectTypes["EXT_texture_type_2_10_10_10_REV"] = EXT_texture_type_2_10_10_10_REV; + __extensionObjectTypes["EXT_unpack_subimage"] = EXT_unpack_subimage; + __extensionObjectTypes["FJ_shader_binary_GCCSO"] = FJ_shader_binary_GCCSO; + __extensionObjectTypes["IMG_multisampled_render_to_texture"] = IMG_multisampled_render_to_texture; + __extensionObjectTypes["IMG_program_binary"] = IMG_program_binary; + __extensionObjectTypes["IMG_read_format"] = IMG_read_format; + __extensionObjectTypes["IMG_shader_binary"] = IMG_shader_binary; + __extensionObjectTypes["IMG_texture_compression_pvrtc"] = IMG_texture_compression_pvrtc; + __extensionObjectTypes["KHR_debug"] = KHR_debug; + __extensionObjectTypes["KHR_texture_compression_astc_ldr"] = KHR_texture_compression_astc_ldr; + __extensionObjectTypes["NV_coverage_sample"] = NV_coverage_sample; + __extensionObjectTypes["NV_depth_nonlinear"] = NV_depth_nonlinear; + __extensionObjectTypes["NV_draw_buffers"] = NV_draw_buffers; + __extensionObjectTypes["NV_fbo_color_attachments"] = NV_fbo_color_attachments; + __extensionObjectTypes["NV_fence"] = NV_fence; + __extensionObjectTypes["NV_read_buffer"] = NV_read_buffer; + __extensionObjectTypes["NV_read_buffer_front"] = NV_read_buffer_front; + __extensionObjectTypes["NV_read_depth"] = NV_read_depth; + __extensionObjectTypes["NV_read_depth_stencil"] = NV_read_depth_stencil; + __extensionObjectTypes["NV_read_stencil"] = NV_read_stencil; + __extensionObjectTypes["NV_texture_compression_s3tc_update"] = NV_texture_compression_s3tc_update; + __extensionObjectTypes["NV_texture_npot_2D_mipmap"] = NV_texture_npot_2D_mipmap; + __extensionObjectTypes["OES_EGL_image"] = OES_EGL_image; + __extensionObjectTypes["OES_EGL_image_external"] = OES_EGL_image_external; + __extensionObjectTypes["OES_compressed_ETC1_RGB8_texture"] = OES_compressed_ETC1_RGB8_texture; + __extensionObjectTypes["OES_compressed_paletted_texture"] = OES_compressed_paletted_texture; + __extensionObjectTypes["OES_depth24"] = OES_depth24; + __extensionObjectTypes["OES_depth32"] = OES_depth32; + __extensionObjectTypes["OES_depth_texture"] = OES_depth_texture; + __extensionObjectTypes["OES_element_index_uint"] = OES_element_index_uint; + __extensionObjectTypes["OES_get_program_binary"] = OES_get_program_binary; + __extensionObjectTypes["OES_mapbuffer"] = OES_mapbuffer; + __extensionObjectTypes["OES_packed_depth_stencil"] = OES_packed_depth_stencil; + __extensionObjectTypes["OES_required_internalformat"] = OES_required_internalformat; + __extensionObjectTypes["OES_rgb8_rgba8"] = OES_rgb8_rgba8; + __extensionObjectTypes["OES_standard_derivatives"] = OES_standard_derivatives; + __extensionObjectTypes["OES_stencil1"] = OES_stencil1; + __extensionObjectTypes["OES_stencil4"] = OES_stencil4; + __extensionObjectTypes["OES_surfaceless_context"] = OES_surfaceless_context; + __extensionObjectTypes["OES_texture_3D"] = OES_texture_3D; + __extensionObjectTypes["OES_texture_float"] = OES_texture_float; + __extensionObjectTypes["OES_texture_float_linear"] = OES_texture_float_linear; + __extensionObjectTypes["OES_texture_half_float"] = OES_texture_half_float; + __extensionObjectTypes["OES_texture_half_float_linear"] = OES_texture_half_float_linear; + __extensionObjectTypes["OES_texture_npot"] = OES_texture_npot; + __extensionObjectTypes["OES_vertex_array_object"] = OES_vertex_array_object; + __extensionObjectTypes["OES_vertex_half_float"] = OES_vertex_half_float; + __extensionObjectTypes["OES_vertex_type_10_10_10_2"] = OES_vertex_type_10_10_10_2; + __extensionObjectTypes["QCOM_alpha_test"] = QCOM_alpha_test; + __extensionObjectTypes["QCOM_binning_control"] = QCOM_binning_control; + __extensionObjectTypes["QCOM_driver_control"] = QCOM_driver_control; + __extensionObjectTypes["QCOM_extended_get"] = QCOM_extended_get; + __extensionObjectTypes["QCOM_extended_get2"] = QCOM_extended_get2; + __extensionObjectTypes["QCOM_perfmon_global_mode"] = QCOM_perfmon_global_mode; + __extensionObjectTypes["QCOM_tiled_rendering"] = QCOM_tiled_rendering; + __extensionObjectTypes["QCOM_writeonly_rendering"] = QCOM_writeonly_rendering; + __extensionObjectTypes["VIV_shader_binary"] = VIV_shader_binary; + + #if (lime_cffi && lime_opengl && !macro) + NativeCFFI.lime_gl_object_constructor (GLObjectType.PROGRAM, function (id) return new GLProgram (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.SHADER, function (id) return new GLShader (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.BUFFER, function (id) return new GLBuffer (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.TEXTURE, function (id) return new GLTexture (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.FRAMEBUFFER, function (id) return new GLFramebuffer (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.RENDERBUFFER, function (id) return new GLRenderbuffer (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.VERTEX_ARRAY_OBJECT, function (id) return new GLVertexArrayObject (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.QUERY, function (id) return new GLQuery (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.SAMPLER, function (id) return new GLSampler (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.SYNC, function (id) return new GLSync (id)); + NativeCFFI.lime_gl_object_constructor (GLObjectType.TRANSFORM_FEEDBACK, function (id) return new GLTransformFeedback (id)); + #end + + } + + __initialized = true; + + } + + +} + + +@:enum private abstract GLObjectType(Int) to Int { + + var PROGRAM = 0; + var SHADER = 1; + var BUFFER = 2; + var TEXTURE = 3; + var FRAMEBUFFER = 4; + var RENDERBUFFER = 5; + var VERTEX_ARRAY_OBJECT = 6; + var QUERY = 7; + var SAMPLER = 8; + var SYNC = 9; + var TRANSFORM_FEEDBACK = 10; + } \ No newline at end of file diff --git a/lime/graphics/opengl/GLBuffer.hx b/lime/graphics/opengl/GLBuffer.hx index e1efbf7ca..7288f4fdf 100644 --- a/lime/graphics/opengl/GLBuffer.hx +++ b/lime/graphics/opengl/GLBuffer.hx @@ -7,12 +7,15 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLBuffer extends GLObject { +class GLBuffer { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Buffer"; + this.id = id; } diff --git a/lime/graphics/opengl/GLFramebuffer.hx b/lime/graphics/opengl/GLFramebuffer.hx index e0bb594dd..b321d7cea 100644 --- a/lime/graphics/opengl/GLFramebuffer.hx +++ b/lime/graphics/opengl/GLFramebuffer.hx @@ -7,12 +7,15 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLFramebuffer extends GLObject { +class GLFramebuffer { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Framebuffer"; + this.id = id; } diff --git a/lime/graphics/opengl/GLObject.hx b/lime/graphics/opengl/GLObject.hx deleted file mode 100644 index 52d469c4c..000000000 --- a/lime/graphics/opengl/GLObject.hx +++ /dev/null @@ -1,60 +0,0 @@ -package lime.graphics.opengl; - - -import lime.system.CFFIPointer; - -#if !lime_debug -@:fileXml('tags="haxe,release"') -@:noDebug -#end - - -class GLObject { - - /** The native GL handle/id. read only */ - public var id (default, null) : CFFIPointer; - /** The invalidated state. read only */ - public var invalidated (get, null) : Bool; - /** The valid state. read only */ - public var valid (get, null) : Bool; - - var version:Int; - - public function new (version:Int, id:CFFIPointer) { - - this.version = version; - this.id = id; - - } //new - - function getType() : String { - return "GLObject"; - } //getType - - public function invalidate() : Void { - id = null; - } //invalidate - - public function isValid() : Bool { - return id != null && version == GL.version; - } //isValid - - public function isInvalid() : Bool { - return !isValid (); - } //isInvalid - - public function toString() : String { - return getType() + "(" + id + ")"; - } //toString - -// Getters & Setters - - function get_invalidated() : Bool { - return isInvalid (); - } //get_invalidated - - function get_valid() : Bool { - return isValid (); - } //get_valid - -} \ No newline at end of file diff --git a/lime/graphics/opengl/GLProgram.hx b/lime/graphics/opengl/GLProgram.hx index 5ec65c669..1132fda99 100644 --- a/lime/graphics/opengl/GLProgram.hx +++ b/lime/graphics/opengl/GLProgram.hx @@ -7,37 +7,17 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLProgram extends GLObject { +class GLProgram { - public var shaders:Array; + private var id:Int; + private var shaders:Array; - public function new (version:Int, id:Dynamic) { + private function new (id:Int) { - super (version, id); - shaders = new Array (); - - } - - - public function attach (shader:GLShader):Void { - - shaders.push (shader); - - } - - - public function getShaders ():Array { - - return shaders.copy (); - - } - - - private override function getType ():String { - - return "Program"; + this.id = id; + shaders = []; } diff --git a/lime/graphics/opengl/GLQuery.hx b/lime/graphics/opengl/GLQuery.hx index abcd9fa83..430808dab 100644 --- a/lime/graphics/opengl/GLQuery.hx +++ b/lime/graphics/opengl/GLQuery.hx @@ -7,16 +7,19 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLQuery extends GLObject { +class GLQuery { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Query"; + this.id = id; } - - + + } diff --git a/lime/graphics/opengl/GLRenderbuffer.hx b/lime/graphics/opengl/GLRenderbuffer.hx index c9546e65c..5cdcf0b74 100644 --- a/lime/graphics/opengl/GLRenderbuffer.hx +++ b/lime/graphics/opengl/GLRenderbuffer.hx @@ -7,16 +7,19 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLRenderbuffer extends GLObject { +class GLRenderbuffer { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Renderbuffer"; + this.id = id; } - - + + } diff --git a/lime/graphics/opengl/GLSampler.hx b/lime/graphics/opengl/GLSampler.hx index 20d649091..a3fc9ded3 100644 --- a/lime/graphics/opengl/GLSampler.hx +++ b/lime/graphics/opengl/GLSampler.hx @@ -7,16 +7,19 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLSampler extends GLObject { +class GLSampler { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Sampler"; + this.id = id; } - - + + } diff --git a/lime/graphics/opengl/GLShader.hx b/lime/graphics/opengl/GLShader.hx index d58aff55a..19e1c9a37 100644 --- a/lime/graphics/opengl/GLShader.hx +++ b/lime/graphics/opengl/GLShader.hx @@ -7,19 +7,15 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLShader extends GLObject { +class GLShader { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Shader"; - - } - - - public override function isValid ():Bool { - - return id != 0 && id != null && version == GL.version; + this.id = id; } diff --git a/lime/graphics/opengl/GLSync.hx b/lime/graphics/opengl/GLSync.hx index cf8a84e7e..51ed8d06a 100644 --- a/lime/graphics/opengl/GLSync.hx +++ b/lime/graphics/opengl/GLSync.hx @@ -7,16 +7,19 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLSync extends GLObject { +class GLSync { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Sync"; + this.id = id; } - - + + } diff --git a/lime/graphics/opengl/GLTexture.hx b/lime/graphics/opengl/GLTexture.hx index 660dcc8a1..6043ea02c 100644 --- a/lime/graphics/opengl/GLTexture.hx +++ b/lime/graphics/opengl/GLTexture.hx @@ -7,16 +7,19 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLTexture extends GLObject { +class GLTexture { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "Texture"; + this.id = id; } - - + + } diff --git a/lime/graphics/opengl/GLTransformFeedback.hx b/lime/graphics/opengl/GLTransformFeedback.hx index 78aa42e5d..cfc84e8da 100644 --- a/lime/graphics/opengl/GLTransformFeedback.hx +++ b/lime/graphics/opengl/GLTransformFeedback.hx @@ -7,16 +7,19 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLTransformFeedback extends GLObject { +class GLTransformFeedback { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "TransformFeedback"; + this.id = id; } - - + + } diff --git a/lime/graphics/opengl/GLVertexArrayObject.hx b/lime/graphics/opengl/GLVertexArrayObject.hx index 983fb5e6d..720b66afc 100644 --- a/lime/graphics/opengl/GLVertexArrayObject.hx +++ b/lime/graphics/opengl/GLVertexArrayObject.hx @@ -7,16 +7,19 @@ package lime.graphics.opengl; #if (!js || !html5 || display) #end -class GLVertexArrayObject extends GLObject { +class GLVertexArrayObject { - private override function getType ():String { + private var id:Int; + + + private function new (id:Int) { - return "VertexArrayObject"; + this.id = id; } - - + + } diff --git a/project/include/system/CFFIPointer.h b/project/include/system/CFFIPointer.h index 5e7131c81..a4f5bb0a7 100644 --- a/project/include/system/CFFIPointer.h +++ b/project/include/system/CFFIPointer.h @@ -17,6 +17,7 @@ namespace lime { value CFFIPointer (void* ptr, hx::finalizer finalizer = 0); + value CFFIPointer (value handle, hx::finalizer finalizer = 0); } diff --git a/project/src/graphics/opengl/OpenGLBindings.cpp b/project/src/graphics/opengl/OpenGLBindings.cpp index 5d3356fa2..56ce9ce56 100644 --- a/project/src/graphics/opengl/OpenGLBindings.cpp +++ b/project/src/graphics/opengl/OpenGLBindings.cpp @@ -4,6 +4,7 @@ #include #include "OpenGL.h" #include "OpenGLBindings.h" +#include #include #include @@ -29,71 +30,80 @@ namespace lime { void *OpenGLBindings::handle = 0; int OpenGLBindings::defaultFramebuffer = 0; + + std::map objectConstructor; + std::map objectConstructorRoot; + int id_id = 0; + + GLuint GLObjectID (value object) { + + if (val_is_null (object)) { + + return 0; + + } else { + + return val_int (val_field (object, id_id)); + + } + + } + + void lime_gl_delete_buffer (value handle); void lime_gl_delete_framebuffer (value handle); void lime_gl_delete_program (value handle); - void lime_gl_delete_render_buffer (value handle); + void lime_gl_delete_renderbuffer (value handle); void lime_gl_delete_shader (value handle); void lime_gl_delete_texture (value handle); - enum GCObjectType { - - GC_BUFFER, - GC_FRAMEBUFFER, - GC_PROGRAM, - GC_RENDERBUFFER, - GC_SHADER, - GC_TEXTURE - - }; - - std::vector gc_gl_type; + std::vector gc_gl_type; std::vector gc_gl_id; Mutex gc_gl_mutex; - void gc_gl_buffer (value handle) { + void gc_gl_buffer (value buffer) { gc_gl_mutex.Lock (); - gc_gl_type.push_back (GC_BUFFER); - gc_gl_id.push_back (reinterpret_cast (val_data (handle))); + gc_gl_type.push_back (TYPE_BUFFER); + gc_gl_id.push_back (GLObjectID (buffer)); gc_gl_mutex.Unlock (); } - void gc_gl_framebuffer (value handle) { + void gc_gl_framebuffer (value framebuffer) { gc_gl_mutex.Lock (); - gc_gl_type.push_back (GC_FRAMEBUFFER); - gc_gl_id.push_back (reinterpret_cast (val_data (handle))); + gc_gl_type.push_back (TYPE_FRAMEBUFFER); + gc_gl_id.push_back (GLObjectID (framebuffer)); gc_gl_mutex.Unlock (); } - void gc_gl_program (value handle) { + void gc_gl_program (value program) { gc_gl_mutex.Lock (); - gc_gl_type.push_back (GC_PROGRAM); - gc_gl_id.push_back (reinterpret_cast (val_data (handle))); + gc_gl_type.push_back (TYPE_PROGRAM); + gc_gl_id.push_back (GLObjectID (program)); gc_gl_mutex.Unlock (); } - void gc_gl_render_buffer (value handle) { + void gc_gl_renderbuffer (value renderbuffer) { gc_gl_mutex.Lock (); - gc_gl_type.push_back (GC_RENDERBUFFER); - gc_gl_id.push_back (reinterpret_cast (val_data (handle))); + gc_gl_type.push_back (TYPE_RENDERBUFFER); + gc_gl_id.push_back (GLObjectID (renderbuffer)); gc_gl_mutex.Unlock (); @@ -108,42 +118,42 @@ namespace lime { if (size > 0) { - GCObjectType type; + GLObjectType type; GLuint id; for (int i = 0; i < size; i++) { - GCObjectType type = gc_gl_type[i]; - GLuint id = gc_gl_id[i]; + type = gc_gl_type[i]; + id = gc_gl_id[i]; switch (type) { - case GC_BUFFER: + case TYPE_BUFFER: glDeleteBuffers (1, &id); break; - case GC_FRAMEBUFFER: + case TYPE_FRAMEBUFFER: glDeleteFramebuffers (1, &id); break; - case GC_PROGRAM: + case TYPE_PROGRAM: glDeleteProgram (id); break; - case GC_RENDERBUFFER: + case TYPE_RENDERBUFFER: glDeleteRenderbuffers (1, &id); break; - case GC_SHADER: + case TYPE_SHADER: glDeleteShader (id); break; - case GC_TEXTURE: + case TYPE_TEXTURE: glDeleteTextures (1, &id); break; @@ -162,24 +172,24 @@ namespace lime { } - void gc_gl_shader (value handle) { + void gc_gl_shader (value shader) { gc_gl_mutex.Lock (); - gc_gl_type.push_back (GC_SHADER); - gc_gl_id.push_back (reinterpret_cast (val_data (handle))); + gc_gl_type.push_back (TYPE_SHADER); + gc_gl_id.push_back (GLObjectID (shader)); gc_gl_mutex.Unlock (); } - void gc_gl_texture (value handle) { + void gc_gl_texture (value texture) { gc_gl_mutex.Lock (); - gc_gl_type.push_back (GC_TEXTURE); - gc_gl_id.push_back (reinterpret_cast (val_data (handle))); + gc_gl_type.push_back (TYPE_TEXTURE); + gc_gl_id.push_back (GLObjectID (texture)); gc_gl_mutex.Unlock (); @@ -195,37 +205,33 @@ namespace lime { void lime_gl_attach_shader (value program, value shader) { - glAttachShader (reinterpret_cast (val_data (program)), reinterpret_cast (val_data (shader))); + glAttachShader (GLObjectID (program), GLObjectID (shader)); } - void lime_gl_bind_attrib_location (value handle, int index, HxString name) { + void lime_gl_bind_attrib_location (value program, int index, HxString name) { - glBindAttribLocation (reinterpret_cast (val_data (handle)), index, name.__s); + glBindAttribLocation (GLObjectID (program), index, name.__s); } void lime_gl_bind_buffer (int target, value buffer) { - glBindBuffer (target, val_is_null (buffer) ? 0 : reinterpret_cast (val_data (buffer))); + glBindBuffer (target, GLObjectID (buffer)); } void lime_gl_bind_framebuffer (int target, value framebuffer) { - GLuint id; + GLuint id = GLObjectID (framebuffer); - if (val_is_null (framebuffer)) { + if (!id) { id = OpenGLBindings::defaultFramebuffer; - } else { - - id = reinterpret_cast (val_data (framebuffer)); - } glBindFramebuffer (target, id); @@ -235,14 +241,14 @@ namespace lime { void lime_gl_bind_renderbuffer (int target, value renderbuffer) { - glBindRenderbuffer (target, val_is_null (renderbuffer) ? 0 : reinterpret_cast (val_data (renderbuffer))); + glBindRenderbuffer (target, GLObjectID (renderbuffer)); } void lime_gl_bind_texture (int target, value texture) { - glBindTexture (target, val_is_null (texture) ? 0 : reinterpret_cast (val_data (texture))); + glBindTexture (target, GLObjectID (texture)); } @@ -343,9 +349,9 @@ namespace lime { } - void lime_gl_compile_shader (value handle) { + void lime_gl_compile_shader (value shader) { - glCompileShader (reinterpret_cast (val_data (handle))); + glCompileShader (GLObjectID (shader)); } @@ -380,9 +386,9 @@ namespace lime { value lime_gl_create_buffer () { - GLuint buffer; - glGenBuffers (1, &buffer); - return CFFIPointer ((void*)(uintptr_t)buffer, gc_gl_buffer); + GLuint id; + glGenBuffers (1, &id); + return CFFIPointer (val_call1 (objectConstructor[TYPE_BUFFER], alloc_int (id)), gc_gl_buffer); } @@ -391,30 +397,32 @@ namespace lime { GLuint id = 0; glGenFramebuffers (1, &id); - return CFFIPointer ((void*)(uintptr_t)id, gc_gl_framebuffer); + return CFFIPointer (val_call1 (objectConstructor[TYPE_FRAMEBUFFER], alloc_int (id)), gc_gl_framebuffer); } value lime_gl_create_program () { - return CFFIPointer ((void*)(uintptr_t)glCreateProgram (), gc_gl_program); + GLuint id = glCreateProgram (); + return CFFIPointer (val_call1 (objectConstructor[TYPE_PROGRAM], alloc_int (id)), gc_gl_program); } - value lime_gl_create_render_buffer () { + value lime_gl_create_renderbuffer () { GLuint id = 0; glGenRenderbuffers (1, &id); - return CFFIPointer ((void*)(uintptr_t)id, gc_gl_render_buffer); + return CFFIPointer (val_call1 (objectConstructor[TYPE_RENDERBUFFER], alloc_int (id)), gc_gl_renderbuffer); } value lime_gl_create_shader (int type) { - return CFFIPointer ((void*)(uintptr_t)glCreateShader (type), gc_gl_shader); + GLuint id = glCreateShader (type); + return CFFIPointer (val_call1 (objectConstructor[TYPE_SHADER], alloc_int (id)), gc_gl_shader); } @@ -423,7 +431,7 @@ namespace lime { GLuint id = 0; glGenTextures (1, &id); - return CFFIPointer ((void*)(uintptr_t)id, gc_gl_texture); + return CFFIPointer (val_call1 (objectConstructor[TYPE_TEXTURE], alloc_int (id)), gc_gl_texture); } @@ -435,12 +443,13 @@ namespace lime { } - void lime_gl_delete_buffer (value handle) { + void lime_gl_delete_buffer (value buffer) { - if (!val_is_null (handle)) { + GLuint id = GLObjectID (buffer); + + if (id) { - GLuint id = reinterpret_cast (val_data (handle)); - val_gc (handle, 0); + val_gc (buffer, 0); glDeleteBuffers (1, &id); } @@ -448,12 +457,13 @@ namespace lime { } - void lime_gl_delete_framebuffer (value handle) { + void lime_gl_delete_framebuffer (value framebuffer) { - if (!val_is_null (handle)) { + GLuint id = GLObjectID (framebuffer); + + if (id) { - GLuint id = reinterpret_cast (val_data (handle)); - val_gc (handle, 0); + val_gc (framebuffer, 0); glDeleteFramebuffers (1, &id); } @@ -461,12 +471,13 @@ namespace lime { } - void lime_gl_delete_program (value handle) { + void lime_gl_delete_program (value program) { - if (!val_is_null (handle)) { + GLuint id = GLObjectID (program); + + if (id) { - GLuint id = reinterpret_cast (val_data (handle)); - val_gc (handle, 0); + val_gc (program, 0); glDeleteProgram (id); } @@ -474,12 +485,13 @@ namespace lime { } - void lime_gl_delete_render_buffer (value handle) { + void lime_gl_delete_renderbuffer (value renderbuffer) { - if (!val_is_null (handle)) { + GLuint id = GLObjectID (renderbuffer); + + if (id) { - GLuint id = reinterpret_cast (val_data (handle)); - val_gc (handle, 0); + val_gc (renderbuffer, 0); glDeleteRenderbuffers (1, &id); } @@ -487,12 +499,13 @@ namespace lime { } - void lime_gl_delete_shader (value handle) { + void lime_gl_delete_shader (value shader) { - if (!val_is_null (handle)) { + GLuint id = GLObjectID (shader); + + if (id) { - GLuint id = reinterpret_cast (val_data (handle)); - val_gc (handle, 0); + val_gc (shader, 0); glDeleteShader (id); } @@ -500,12 +513,13 @@ namespace lime { } - void lime_gl_delete_texture (value handle) { + void lime_gl_delete_texture (value texture) { - if (!val_is_null (handle)) { + GLuint id = GLObjectID (texture); + + if (id) { - GLuint id = reinterpret_cast (val_data (handle)); - val_gc (handle, 0); + val_gc (texture, 0); glDeleteTextures (1, &id); } @@ -540,7 +554,7 @@ namespace lime { void lime_gl_detach_shader (value program, value shader) { - glDetachShader (reinterpret_cast (val_data (program)), reinterpret_cast (val_data (shader))); + glDetachShader (GLObjectID (program), GLObjectID (shader)); } @@ -603,14 +617,14 @@ namespace lime { void lime_gl_framebuffer_renderbuffer (int target, int attachment, int renderbuffertarget, value renderbuffer) { - glFramebufferRenderbuffer (target, attachment, renderbuffertarget, reinterpret_cast (val_data (renderbuffer))); + glFramebufferRenderbuffer (target, attachment, renderbuffertarget, GLObjectID (renderbuffer)); } void lime_gl_framebuffer_texture2D (int target, int attachment, int textarget, value texture, int level) { - glFramebufferTexture2D (target, attachment, textarget, reinterpret_cast (val_data (texture)), level); + glFramebufferTexture2D (target, attachment, textarget, GLObjectID (texture), level); } @@ -629,7 +643,7 @@ namespace lime { } - value lime_gl_get_active_attrib (value handle, int index) { + value lime_gl_get_active_attrib (value program, int index) { value result = alloc_empty_object (); @@ -638,7 +652,7 @@ namespace lime { GLsizei size = 0; GLenum type = 0; - glGetActiveAttrib (reinterpret_cast (val_data (handle)), index, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &outLen, &size, &type, &buffer[0]); + glGetActiveAttrib (GLObjectID (program), index, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &outLen, &size, &type, &buffer[0]); buffer.resize (outLen); @@ -651,14 +665,14 @@ namespace lime { } - value lime_gl_get_active_uniform (value handle, int index) { + value lime_gl_get_active_uniform (value program, int index) { std::string buffer (GL_ACTIVE_UNIFORM_MAX_LENGTH, 0); GLsizei outLen = 0; GLsizei size = 0; GLenum type = 0; - glGetActiveUniform (reinterpret_cast (val_data (handle)), index, GL_ACTIVE_UNIFORM_MAX_LENGTH, &outLen, &size, &type, &buffer[0]); + glGetActiveUniform (GLObjectID (program), index, GL_ACTIVE_UNIFORM_MAX_LENGTH, &outLen, &size, &type, &buffer[0]); buffer.resize (outLen); @@ -672,9 +686,9 @@ namespace lime { } - int lime_gl_get_attrib_location (value handle, HxString name) { + int lime_gl_get_attrib_location (value program, HxString name) { - return glGetAttribLocation (reinterpret_cast (val_data (handle)), name.__s); + return glGetAttribLocation (GLObjectID (program), name.__s); } @@ -1049,7 +1063,7 @@ namespace lime { value lime_gl_get_program_info_log (value handle) { - GLuint program = reinterpret_cast (val_data (handle)); + GLuint program = GLObjectID (handle); GLint logSize = 0; glGetProgramiv (program, GL_INFO_LOG_LENGTH, &logSize); @@ -1069,10 +1083,10 @@ namespace lime { } - value lime_gl_get_program_parameter (value handle, int pname) { + value lime_gl_get_program_parameter (value program, int pname) { int result = 0; - glGetProgramiv (reinterpret_cast (val_data (handle)), pname, &result); + glGetProgramiv (GLObjectID (program), pname, &result); switch (pname) { @@ -1090,7 +1104,7 @@ namespace lime { } - value lime_gl_get_render_buffer_parameter (int target, int pname) { + value lime_gl_get_renderbuffer_parameter (int target, int pname) { int result = 0; glGetRenderbufferParameteriv (target, pname, &result); @@ -1101,7 +1115,7 @@ namespace lime { value lime_gl_get_shader_info_log (value handle) { - GLuint shader = reinterpret_cast (val_data (handle)); + GLuint shader = GLObjectID (handle); GLint logSize = 0; glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &logSize); @@ -1121,10 +1135,10 @@ namespace lime { } - value lime_gl_get_shader_parameter (value handle, int pname) { + value lime_gl_get_shader_parameter (value shader, int pname) { int result = 0; - glGetShaderiv (reinterpret_cast (val_data (handle)), pname, &result); + glGetShaderiv (GLObjectID (shader), pname, &result); switch (pname) { @@ -1165,10 +1179,12 @@ namespace lime { } - value lime_gl_get_shader_source (value handle) { + value lime_gl_get_shader_source (value shader) { + + GLuint id = GLObjectID (shader); int len = 0; - glGetShaderiv (reinterpret_cast (val_data (handle)), GL_SHADER_SOURCE_LENGTH, &len); + glGetShaderiv (id, GL_SHADER_SOURCE_LENGTH, &len); if (len == 0) { @@ -1177,7 +1193,7 @@ namespace lime { } char *buf = new char[len + 1]; - glGetShaderSource (reinterpret_cast (val_data (handle)), len + 1, 0, buf); + glGetShaderSource (id, len + 1, 0, buf); value result = alloc_string (buf); delete [] buf; @@ -1247,13 +1263,13 @@ namespace lime { } - value lime_gl_get_uniform (value handle, int location) { + value lime_gl_get_uniform (value program, int location) { char buf[1]; GLsizei outLen = 1; GLsizei size = 0; GLenum type = 0; - GLuint id = reinterpret_cast (val_data (handle)); + GLuint id = GLObjectID (program); glGetActiveUniform (id, location, 1, &outLen, &size, &type, buf); int ints = 0; @@ -1357,9 +1373,9 @@ namespace lime { } - int lime_gl_get_uniform_location (value handle, HxString name) { + int lime_gl_get_uniform_location (value program, HxString name) { - return glGetUniformLocation (reinterpret_cast (val_data (handle)), name.__s); + return glGetUniformLocation (GLObjectID (program), name.__s); } @@ -1391,7 +1407,7 @@ namespace lime { bool lime_gl_is_buffer (value handle) { - return glIsBuffer (reinterpret_cast (val_data (handle))); + return glIsBuffer (GLObjectID (handle)); } @@ -1405,35 +1421,35 @@ namespace lime { bool lime_gl_is_framebuffer (value handle) { - return glIsFramebuffer (reinterpret_cast (val_data (handle))); + return glIsFramebuffer (GLObjectID (handle)); } bool lime_gl_is_program (value handle) { - return glIsProgram (reinterpret_cast (val_data (handle))); + return glIsProgram (GLObjectID (handle)); } bool lime_gl_is_renderbuffer (value handle) { - return glIsRenderbuffer (reinterpret_cast (val_data (handle))); + return glIsRenderbuffer (GLObjectID (handle)); } bool lime_gl_is_shader (value handle) { - return glIsShader (reinterpret_cast (val_data (handle))); + return glIsShader (GLObjectID (handle)); } bool lime_gl_is_texture (value handle) { - return glIsTexture (reinterpret_cast (val_data (handle))); + return glIsTexture (GLObjectID (handle)); } @@ -1445,9 +1461,28 @@ namespace lime { } - void lime_gl_link_program (value handle) { + void lime_gl_link_program (value program) { - glLinkProgram (reinterpret_cast (val_data (handle))); + glLinkProgram (GLObjectID (program)); + + } + + + void lime_gl_object_constructor (int type, value constructor) { + + GLObjectType _type = (GLObjectType)type; + + value* root = alloc_root (); + *root = constructor; + + if (objectConstructorRoot[_type]) { + + free_root (objectConstructorRoot[_type]); + + } + + objectConstructorRoot[_type] = root; + objectConstructor[_type] = constructor; } @@ -1496,7 +1531,7 @@ namespace lime { void lime_gl_shader_source (value handle, HxString source) { - glShaderSource (reinterpret_cast (val_data (handle)), 1, &source.__s, 0); + glShaderSource (GLObjectID (handle), 1, &source.__s, 0); } @@ -1746,14 +1781,14 @@ namespace lime { void lime_gl_use_program (value handle) { - glUseProgram (val_is_null (handle) ? 0 : reinterpret_cast (val_data (handle))); + glUseProgram (GLObjectID (handle)); } void lime_gl_validate_program (value handle) { - glValidateProgram (reinterpret_cast (val_data (handle))); + glValidateProgram (GLObjectID (handle)); } @@ -1871,6 +1906,8 @@ namespace lime { initialized = true; + id_id = val_id ("id"); + #ifdef HX_LINUX OpenGLBindings::handle = dlopen ("libGL.so.1", RTLD_NOW|RTLD_GLOBAL); @@ -1931,14 +1968,14 @@ namespace lime { DEFINE_PRIME0 (lime_gl_create_buffer); DEFINE_PRIME0 (lime_gl_create_framebuffer); DEFINE_PRIME0 (lime_gl_create_program); - DEFINE_PRIME0 (lime_gl_create_render_buffer); + DEFINE_PRIME0 (lime_gl_create_renderbuffer); DEFINE_PRIME1 (lime_gl_create_shader); DEFINE_PRIME0 (lime_gl_create_texture); DEFINE_PRIME1v (lime_gl_cull_face); DEFINE_PRIME1v (lime_gl_delete_buffer); DEFINE_PRIME1v (lime_gl_delete_framebuffer); DEFINE_PRIME1v (lime_gl_delete_program); - DEFINE_PRIME1v (lime_gl_delete_render_buffer); + DEFINE_PRIME1v (lime_gl_delete_renderbuffer); DEFINE_PRIME1v (lime_gl_delete_shader); DEFINE_PRIME1v (lime_gl_delete_texture); DEFINE_PRIME2v (lime_gl_detach_shader); @@ -1974,7 +2011,7 @@ namespace lime { DEFINE_PRIME1 (lime_gl_get_parameter); DEFINE_PRIME1 (lime_gl_get_program_info_log); DEFINE_PRIME2 (lime_gl_get_program_parameter); - DEFINE_PRIME2 (lime_gl_get_render_buffer_parameter); + DEFINE_PRIME2 (lime_gl_get_renderbuffer_parameter); DEFINE_PRIME1 (lime_gl_get_shader_info_log); DEFINE_PRIME2 (lime_gl_get_shader_parameter); DEFINE_PRIME2 (lime_gl_get_shader_precision_format); @@ -1996,6 +2033,7 @@ namespace lime { DEFINE_PRIME1 (lime_gl_is_texture); DEFINE_PRIME1v (lime_gl_line_width); DEFINE_PRIME1v (lime_gl_link_program); + DEFINE_PRIME2v (lime_gl_object_constructor); DEFINE_PRIME2v (lime_gl_pixel_storei); DEFINE_PRIME2v (lime_gl_polygon_offset); DEFINE_PRIME7v (lime_gl_read_pixels); diff --git a/project/src/graphics/opengl/OpenGLBindings.h b/project/src/graphics/opengl/OpenGLBindings.h index fb9306438..677f905f8 100644 --- a/project/src/graphics/opengl/OpenGLBindings.h +++ b/project/src/graphics/opengl/OpenGLBindings.h @@ -23,6 +23,23 @@ namespace lime { }; + enum GLObjectType { + + TYPE_PROGRAM, + TYPE_SHADER, + TYPE_BUFFER, + TYPE_TEXTURE, + TYPE_FRAMEBUFFER, + TYPE_RENDERBUFFER, + TYPE_VERTEX_ARRAY_OBJECT, + TYPE_QUERY, + TYPE_SAMPLER, + TYPE_SYNC, + TYPE_TRANSFORM_FEEDBACK + + }; + + } diff --git a/project/src/system/CFFIPointer.cpp b/project/src/system/CFFIPointer.cpp index 10ad3d7e2..d8e49419e 100644 --- a/project/src/system/CFFIPointer.cpp +++ b/project/src/system/CFFIPointer.cpp @@ -27,4 +27,17 @@ namespace lime { } + value CFFIPointer (value handle, hx::finalizer finalizer) { + + if (!val_is_null (handle) && finalizer) { + + val_gc (handle, finalizer); + + } + + return handle; + + } + + } \ No newline at end of file