diff --git a/lime/_backend/native/NativeCFFI.hx b/lime/_backend/native/NativeCFFI.hx index b28375a48..9a06b7b19 100644 --- a/lime/_backend/native/NativeCFFI.hx +++ b/lime/_backend/native/NativeCFFI.hx @@ -18,6 +18,7 @@ import lime.utils.DataPointer; #if hl import lime._backend.native.NativeApplication; import lime.graphics.cairo.CairoGlyph; +import lime.graphics.opengl.GL; import lime.math.Matrix3; import lime.math.Vector2; import lime.media.openal.ALContext; @@ -312,7 +313,7 @@ class NativeCFFI { @:hlNative("lime", "lime_renderer_get_context") private static function lime_renderer_get_context (handle:CFFIPointer):Float { return 0; } @:hlNative("lime", "lime_renderer_get_scale") private static function lime_renderer_get_scale (handle:CFFIPointer):Float { return 0; } @:hlNative("lime", "lime_renderer_get_type") private static function lime_renderer_get_type (handle:CFFIPointer):hl.Bytes { return null; } - @:hlNative("lime", "lime_renderer_lock") private static function lime_renderer_lock (handle:CFFIPointer):Dynamic { return null; } + @:hlNative("lime", "lime_renderer_lock") private static function lime_renderer_lock (handle:CFFIPointer, object:Dynamic):Dynamic { return null; } @:hlNative("lime", "lime_renderer_make_current") private static function lime_renderer_make_current (handle:CFFIPointer):Void {} @:hlNative("lime", "lime_renderer_read_pixels") private static function lime_renderer_read_pixels (handle:CFFIPointer, rect:Rectangle, imageBuffer:ImageBuffer):Dynamic { return null; } @:hlNative("lime", "lime_renderer_unlock") private static function lime_renderer_unlock (handle:CFFIPointer):Void {} @@ -1065,7 +1066,7 @@ class NativeCFFI { @:cffi private static function lime_gl_map_buffer_range (target:Int, offset:DataPointer, length:Int, access:Int):DataPointer; @:cffi private static function lime_gl_object_deregister (object:Dynamic):Void; @:cffi private static function lime_gl_object_from_id (id:Int, type:Int):Dynamic; - @:cffi private static function lime_gl_object_register (id:Int, type:Int, object:Dynamic):Void; + @:cffi private static function lime_gl_object_register (id:Int, type:Int, object:Dynamic):Dynamic; @:cffi private static function lime_gl_pause_transform_feedback ():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; @@ -1225,7 +1226,7 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_disable_vertex_attrib_array") private static function lime_gl_disable_vertex_attrib_array (index:Int):Void {} @:hlNative("lime", "lime_gl_draw_arrays") private static function lime_gl_draw_arrays (mode:Int, first:Int, count:Int):Void {} @:hlNative("lime", "lime_gl_draw_arrays_instanced") private static function lime_gl_draw_arrays_instanced (mode:Int, first:Int, count:Int, instanceCount:Int):Void {} - @:hlNative("lime", "lime_gl_draw_buffers") private static function lime_gl_draw_buffers (buffers:hl.NativeArray):Void {} + @:hlNative("lime", "lime_gl_draw_buffers") private static function lime_gl_draw_buffers (buffers:hl.NativeArray):Void {} @:hlNative("lime", "lime_gl_draw_elements") private static function lime_gl_draw_elements (mode:Int, count:Int, type:Int, offset:DataPointer):Void {} @:hlNative("lime", "lime_gl_draw_elements_instanced") private static function lime_gl_draw_elements_instanced (mode:Int, count:Int, type:Int, offset:DataPointer, instanceCount:Int):Void {} @:hlNative("lime", "lime_gl_draw_range_elements") private static function lime_gl_draw_range_elements (mode:Int, start:Int, end:Int, count:Int, type:Int, offset:DataPointer):Void {} @@ -1241,22 +1242,22 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_framebuffer_texture_layer") private static function lime_gl_framebuffer_texture_layer (target:Int, attachment:Int, texture:Int, level:Int, layer:Int):Void {} @:hlNative("lime", "lime_gl_front_face") private static function lime_gl_front_face (mode:Int):Void {} @:hlNative("lime", "lime_gl_generate_mipmap") private static function lime_gl_generate_mipmap (target:Int):Void {} - @:hlNative("lime", "lime_gl_get_active_attrib") private static function lime_gl_get_active_attrib (program:Int, index:Int):Dynamic { return null; } - @:hlNative("lime", "lime_gl_get_active_uniform") private static function lime_gl_get_active_uniform (program:Int, index:Int):Dynamic { return null; } + @:hlNative("lime", "lime_gl_get_active_attrib") private static function lime_gl_get_active_attrib (program:Int, index:Int, object:Dynamic):Dynamic { return null; } + @:hlNative("lime", "lime_gl_get_active_uniform") private static function lime_gl_get_active_uniform (program:Int, index:Int, object:Dynamic):Dynamic { return null; } @:hlNative("lime", "lime_gl_get_active_uniform_blocki") private static function lime_gl_get_active_uniform_blocki (program:Int, uniformBlockIndex:Int, pname:Int):Int { return 0; } @:hlNative("lime", "lime_gl_get_active_uniform_blockiv") private static function lime_gl_get_active_uniform_blockiv (program:Int, uniformBlockIndex:Int, pname:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_active_uniform_block_name") private static function lime_gl_get_active_uniform_block_name (program:Int, uniformBlockIndex:Int):hl.Bytes { return null; } - @:hlNative("lime", "lime_gl_get_active_uniformsiv") private static function lime_gl_get_active_uniformsiv (program:Int, uniformIndices:hl.NativeArray, pname:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_attached_shaders") private static function lime_gl_get_attached_shaders (program:Int):hl.NativeArray { return null; } + @:hlNative("lime", "lime_gl_get_active_uniformsiv") private static function lime_gl_get_active_uniformsiv (program:Int, uniformIndices:hl.NativeArray, pname:Int, params:DataPointer):Void {} + @:hlNative("lime", "lime_gl_get_attached_shaders") private static function lime_gl_get_attached_shaders (program:Int):hl.NativeArray { return null; } @:hlNative("lime", "lime_gl_get_attrib_location") private static function lime_gl_get_attrib_location (program:Int, name:String):Int { return 0; } @:hlNative("lime", "lime_gl_get_boolean") private static function lime_gl_get_boolean (pname:Int):Bool { return false; } @:hlNative("lime", "lime_gl_get_booleanv") private static function lime_gl_get_booleanv (pname:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_buffer_parameteri") private static function lime_gl_get_buffer_parameteri (target:Int, pname:Int):Int { return 0; } @:hlNative("lime", "lime_gl_get_buffer_parameteri64v") private static function lime_gl_get_buffer_parameteri64v (target:Int, index:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_buffer_parameteriv") private static function lime_gl_get_buffer_parameteriv (target:Int, pname:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_buffer_pointerv") private static function lime_gl_get_buffer_pointerv (target:Int, pname:Int):DataPointer { return null; } + @:hlNative("lime", "lime_gl_get_buffer_pointerv") private static function lime_gl_get_buffer_pointerv (target:Int, pname:Int):DataPointer { return 0; } @:hlNative("lime", "lime_gl_get_buffer_sub_data") private static function lime_gl_get_buffer_sub_data (target:Int, offset:DataPointer, size:Int, data:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_context_attributes") private static function lime_gl_get_context_attributes ():Dynamic { return null; } + @:hlNative("lime", "lime_gl_get_context_attributes") private static function lime_gl_get_context_attributes (object:Dynamic):Dynamic { return null; } @:hlNative("lime", "lime_gl_get_error") private static function lime_gl_get_error ():Int { return 0; } @:hlNative("lime", "lime_gl_get_extension") private static function lime_gl_get_extension (name:String):CFFIPointer { return null; } @:hlNative("lime", "lime_gl_get_float") private static function lime_gl_get_float (pname:Int):hl.F32 { return 0; } @@ -1270,7 +1271,7 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_get_integerv") private static function lime_gl_get_integerv (pname:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_integeri_v") private static function lime_gl_get_integeri_v (pname:Int, index:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_internalformativ") private static function lime_gl_get_internalformativ (target:Int, internalformat:Int, pname:Int, bufSize:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_program_binary") private static function lime_gl_get_program_binary (program:Int, binaryFormat:Int, bytes:Dynamic):Void {} + @:hlNative("lime", "lime_gl_get_program_binary") private static function lime_gl_get_program_binary (program:Int, binaryFormat:Int, bytes:Bytes):Void {} @:hlNative("lime", "lime_gl_get_program_info_log") private static function lime_gl_get_program_info_log (program:Int):hl.Bytes { return null; } @:hlNative("lime", "lime_gl_get_programi") private static function lime_gl_get_programi (program:Int, pname:Int):Int { return 0; } @:hlNative("lime", "lime_gl_get_programiv") private static function lime_gl_get_programiv (program:Int, pname:Int, params:DataPointer):Void {} @@ -1287,9 +1288,9 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_get_shader_info_log") private static function lime_gl_get_shader_info_log (shader:Int):hl.Bytes { return null; } @:hlNative("lime", "lime_gl_get_shaderi") private static function lime_gl_get_shaderi (shader:Int, pname:Int):Int { return 0; } @:hlNative("lime", "lime_gl_get_shaderiv") private static function lime_gl_get_shaderiv (shader:Int, pname:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_shader_precision_format") private static function lime_gl_get_shader_precision_format (shadertype:Int, precisiontype:Int):Dynamic { return null; } + @:hlNative("lime", "lime_gl_get_shader_precision_format") private static function lime_gl_get_shader_precision_format (shadertype:Int, precisiontype:Int, object:Dynamic):Dynamic { return null; } @:hlNative("lime", "lime_gl_get_shader_source") private static function lime_gl_get_shader_source (shader:Int):hl.Bytes { return null; } - @:hlNative("lime", "lime_gl_get_string") private static function lime_gl_get_string (pname:Int):Dynamic { return null; } + @:hlNative("lime", "lime_gl_get_string") private static function lime_gl_get_string (pname:Int):hl.Bytes { return null; } @:hlNative("lime", "lime_gl_get_stringi") private static function lime_gl_get_stringi (pname:Int, index:Int):hl.Bytes { return null; } @:hlNative("lime", "lime_gl_get_sync_parameteri") private static function lime_gl_get_sync_parameteri (sync:CFFIPointer, pname:Int):Int { return 0; } @:hlNative("lime", "lime_gl_get_sync_parameteriv") private static function lime_gl_get_sync_parameteriv (sync:CFFIPointer, pname:Int, params:DataPointer):Void {} @@ -1297,7 +1298,7 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_get_tex_parameterfv") private static function lime_gl_get_tex_parameterfv (target:Int, pname:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_tex_parameteri") private static function lime_gl_get_tex_parameteri (target:Int, pname:Int):Int { return 0; } @:hlNative("lime", "lime_gl_get_tex_parameteriv") private static function lime_gl_get_tex_parameteriv (target:Int, pname:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_transform_feedback_varying") private static function lime_gl_get_transform_feedback_varying (program:Int, index:Int):Dynamic { return null; } + @:hlNative("lime", "lime_gl_get_transform_feedback_varying") private static function lime_gl_get_transform_feedback_varying (program:Int, index:Int, object:Dynamic):Dynamic { return null; } @:hlNative("lime", "lime_gl_get_uniformf") private static function lime_gl_get_uniformf (program:Int, location:Int):hl.F32 { return 0; } @:hlNative("lime", "lime_gl_get_uniformfv") private static function lime_gl_get_uniformfv (program:Int, location:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_uniformi") private static function lime_gl_get_uniformi (program:Int, location:Int):Int { return 0; } @@ -1314,10 +1315,10 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_get_vertex_attribiiv") private static function lime_gl_get_vertex_attribiiv (index:Int, pname:Int, params:DataPointer):Void {} @:hlNative("lime", "lime_gl_get_vertex_attribiui") private static function lime_gl_get_vertex_attribiui (index:Int, pname:Int):Int { return 0; } @:hlNative("lime", "lime_gl_get_vertex_attribiuiv") private static function lime_gl_get_vertex_attribiuiv (index:Int, pname:Int, params:DataPointer):Void {} - @:hlNative("lime", "lime_gl_get_vertex_attrib_pointerv") private static function lime_gl_get_vertex_attrib_pointerv (index:Int, pname:Int):DataPointer { return null; } + @:hlNative("lime", "lime_gl_get_vertex_attrib_pointerv") private static function lime_gl_get_vertex_attrib_pointerv (index:Int, pname:Int):DataPointer { return 0; } @:hlNative("lime", "lime_gl_hint") private static function lime_gl_hint (target:Int, mode:Int):Void {} - @:hlNative("lime", "lime_gl_invalidate_framebuffer") private static function lime_gl_invalidate_framebuffer (target:Int, attachments:Dynamic):Void {} - @:hlNative("lime", "lime_gl_invalidate_sub_framebuffer") private static function lime_gl_invalidate_sub_framebuffer (target:Int, attachments:Dynamic, x:Int, y:Int, width:Int, height:Int):Void {} + @:hlNative("lime", "lime_gl_invalidate_framebuffer") private static function lime_gl_invalidate_framebuffer (target:Int, attachments:hl.NativeArray):Void {} + @:hlNative("lime", "lime_gl_invalidate_sub_framebuffer") private static function lime_gl_invalidate_sub_framebuffer (target:Int, attachments:hl.NativeArray, x:Int, y:Int, width:Int, height:Int):Void {} @:hlNative("lime", "lime_gl_is_buffer") private static function lime_gl_is_buffer (buffer:Int):Bool { return false; } @:hlNative("lime", "lime_gl_is_enabled") private static function lime_gl_is_enabled (cap:Int):Bool { return false; } @:hlNative("lime", "lime_gl_is_framebuffer") private static function lime_gl_is_framebuffer (framebuffer:Int):Bool { return false; } @@ -1332,10 +1333,10 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_is_vertex_array") private static function lime_gl_is_vertex_array (vertexArray:Int):Bool { return false; } @:hlNative("lime", "lime_gl_line_width") private static function lime_gl_line_width (width:hl.F32):Void {} @:hlNative("lime", "lime_gl_link_program") private static function lime_gl_link_program (program:Int):Void {} - @:hlNative("lime", "lime_gl_map_buffer_range") private static function lime_gl_map_buffer_range (target:Int, offset:DataPointer, length:Int, access:Int):DataPointer { return null; } - @:hlNative("lime", "lime_gl_object_deregister") private static function lime_gl_object_deregister (object:CFFIPointer):Void {} - @:hlNative("lime", "lime_gl_object_from_id") private static function lime_gl_object_from_id (id:Int, type:Int):CFFIPointer { return null; } - @:hlNative("lime", "lime_gl_object_register") private static function lime_gl_object_register (id:Int, type:Int, object:CFFIPointer):Void {} + @:hlNative("lime", "lime_gl_map_buffer_range") private static function lime_gl_map_buffer_range (target:Int, offset:DataPointer, length:Int, access:Int):DataPointer { return 0; } + @:hlNative("lime", "lime_gl_object_deregister") private static function lime_gl_object_deregister (object:GLObject):Void {} + @:hlNative("lime", "lime_gl_object_from_id") private static function lime_gl_object_from_id (id:Int, type:Int):GLObject { return null; } + @:hlNative("lime", "lime_gl_object_register") private static function lime_gl_object_register (id:Int, type:Int, object:GLObject):CFFIPointer { return null; } @:hlNative("lime", "lime_gl_pause_transform_feedback") private static function lime_gl_pause_transform_feedback ():Void {} @:hlNative("lime", "lime_gl_pixel_storei") private static function lime_gl_pixel_storei (pname:Int, param:Int):Void {} @:hlNative("lime", "lime_gl_polygon_offset") private static function lime_gl_polygon_offset (factor:hl.F32, units:hl.F32):Void {} @@ -1351,7 +1352,7 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_sampler_parameterf") private static function lime_gl_sampler_parameterf (sampler:Int, pname:Int, param:hl.F32):Void {} @:hlNative("lime", "lime_gl_sampler_parameteri") private static function lime_gl_sampler_parameteri (sampler:Int, pname:Int, param:Int):Void {} @:hlNative("lime", "lime_gl_scissor") private static function lime_gl_scissor (x:Int, y:Int, width:Int, height:Int):Void {} - @:hlNative("lime", "lime_gl_shader_binary") private static function lime_gl_shader_binary (shaders:Dynamic, binaryformat:Int, binary:DataPointer, length:Int):Void {} + @:hlNative("lime", "lime_gl_shader_binary") private static function lime_gl_shader_binary (shaders:hl.NativeArray, binaryformat:Int, binary:DataPointer, length:Int):Void {} @:hlNative("lime", "lime_gl_shader_source") private static function lime_gl_shader_source (shader:Int, source:String):Void {} @:hlNative("lime", "lime_gl_stencil_func") private static function lime_gl_stencil_func (func:Int, ref:Int, mask:Int):Void {} @:hlNative("lime", "lime_gl_stencil_func_separate") private static function lime_gl_stencil_func_separate (face:Int, func:Int, ref:Int, mask:Int):Void {} @@ -1367,7 +1368,7 @@ class NativeCFFI { @:hlNative("lime", "lime_gl_tex_storage_3d") private static function lime_gl_tex_storage_3d (target:Int, level:Int, internalformat:Int, width:Int, height:Int, depth:Int):Void {} @:hlNative("lime", "lime_gl_tex_sub_image_2d") private static function lime_gl_tex_sub_image_2d (target:Int, level:Int, xoffset:Int, yoffset:Int, width:Int, height:Int, format:Int, type:Int, data:DataPointer):Void {} @:hlNative("lime", "lime_gl_tex_sub_image_3d") private static function lime_gl_tex_sub_image_3d (target:Int, level:Int, xoffset:Int, yoffset:Int, zoffset:Int, width:Int, height:Int, depth:Int, format:Int, type:Int, data:DataPointer):Void {} - @:hlNative("lime", "lime_gl_transform_feedback_varyings") private static function lime_gl_transform_feedback_varyings (program:Int, varyings:Dynamic, bufferMode:Int):Void {} + @:hlNative("lime", "lime_gl_transform_feedback_varyings") private static function lime_gl_transform_feedback_varyings (program:Int, varyings:hl.NativeArray, bufferMode:Int):Void {} @:hlNative("lime", "lime_gl_uniform1f") private static function lime_gl_uniform1f (location:Int, v0:hl.F32):Void {} @:hlNative("lime", "lime_gl_uniform1fv") private static function lime_gl_uniform1fv (location:Int, count:Int, v:DataPointer):Void {} @:hlNative("lime", "lime_gl_uniform1i") private static function lime_gl_uniform1i (location:Int, v0:Int):Void {} diff --git a/lime/_backend/native/NativeGLRenderContext.hx b/lime/_backend/native/NativeGLRenderContext.hx index a52d41ad3..95ce2dd94 100644 --- a/lime/_backend/native/NativeGLRenderContext.hx +++ b/lime/_backend/native/NativeGLRenderContext.hx @@ -1140,7 +1140,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_buffer (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.BUFFER, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.BUFFER, object); return object; #else return null; @@ -1155,7 +1155,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_framebuffer (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.FRAMEBUFFER, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.FRAMEBUFFER, object); return object; #else return null; @@ -1170,7 +1170,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_program (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.PROGRAM, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.PROGRAM, object); return object; #else return null; @@ -1185,7 +1185,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_query (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.QUERY, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.QUERY, object); return object; #else return null; @@ -1200,7 +1200,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_renderbuffer (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.RENDERBUFFER, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.RENDERBUFFER, object); return object; #else return null; @@ -1215,7 +1215,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_sampler (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.SAMPLER, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.SAMPLER, object); return object; #else return null; @@ -1230,7 +1230,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_shader (type); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.SHADER, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.SHADER, object); return object; #else return null; @@ -1245,7 +1245,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_texture (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.TEXTURE, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.TEXTURE, object); return object; #else return null; @@ -1260,7 +1260,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_transform_feedback (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.TRANSFORM_FEEDBACK, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.TRANSFORM_FEEDBACK, object); return object; #else return null; @@ -1275,7 +1275,7 @@ class NativeGLRenderContext { var id = NativeCFFI.lime_gl_create_vertex_array (); if (id == 0) return null; var object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, GLObjectType.VERTEX_ARRAY_OBJECT, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, GLObjectType.VERTEX_ARRAY_OBJECT, object); return object; #else return null; @@ -1483,6 +1483,11 @@ class NativeGLRenderContext { public function drawBuffers (buffers:Array):Void { #if (lime_cffi && lime_opengl && !macro) + #if hl + var _buffers = new hl.NativeArray (buffers.length); + for (i in 0...buffers.length) _buffers[i] = buffers[i]; + var buffers = _buffers; + #end NativeCFFI.lime_gl_draw_buffers (buffers); #end @@ -1629,8 +1634,12 @@ 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 (__getObjectID (program), index); - return result; + #if hl + var object:{ size:Int, type:Int, name:hl.Bytes } = { size: 0, type: 0, name: null }; + return NativeCFFI.lime_gl_get_active_attrib (__getObjectID (program), index, object); + #else + return NativeCFFI.lime_gl_get_active_attrib (__getObjectID (program), index); + #end #else return null; #end @@ -1641,8 +1650,12 @@ 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 (__getObjectID (program), index); - return result; + #if hl + var object:{ size:Int, type:Int, name:hl.Bytes } = { size: 0, type: 0, name: null }; + return NativeCFFI.lime_gl_get_active_uniform (__getObjectID (program), index, object); + #else + return NativeCFFI.lime_gl_get_active_uniform (__getObjectID (program), index); + #end #else return null; #end @@ -1673,7 +1686,11 @@ class NativeGLRenderContext { public function getActiveUniformBlockName (program:GLProgram, uniformBlockIndex:Int):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_active_uniform_block_name (__getObjectID (program), uniformBlockIndex); + var result = NativeCFFI.lime_gl_get_active_uniform_block_name (__getObjectID (program), uniformBlockIndex); + #if hl + var result = @:privateAccess String.fromUTF8 (result); + #end + return result; #else return null; #end @@ -1702,7 +1719,12 @@ class NativeGLRenderContext { public function getActiveUniformsiv (program:GLProgram, uniformIndices:Array, pname:Int, params:DataPointer):Void { #if (lime_cffi && lime_opengl && !macro) - NativeCFFI.lime_gl_get_active_uniformsiv (__getObjectID (program), uniformIndices, pname, params); + #if hl + var _uniformIndices = new hl.NativeArray (uniformIndices.length); + for (i in 0...uniformIndices.length) _uniformIndices[i] = uniformIndices[i]; + var uniformIndices = _uniformIndices; + #end + NativeCFFI.lime_gl_get_active_uniformsiv (__getObjectID (program), _uniformIndices, pname, params); #end } @@ -1711,7 +1733,15 @@ class NativeGLRenderContext { public function getAttachedShaders (program:GLProgram):Array { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_attached_shaders (__getObjectID (program)); + var result = NativeCFFI.lime_gl_get_attached_shaders (__getObjectID (program)); + #if hl + var _result = new Array (); + for (i in 0...result.length) { + _result.push (GLShader.fromInt (result[i])); + } + var result = _result; + #end + return result; #else return null; #end @@ -1809,7 +1839,12 @@ class NativeGLRenderContext { public function getContextAttributes ():GLContextAttributes { #if (lime_cffi && lime_opengl && !macro) + #if hl + var object:Dynamic = { alpha: false, depth: false, stencil: false, antialias: false }; + var base:Dynamic = NativeCFFI.lime_gl_get_context_attributes (object); + #else var base:Dynamic = NativeCFFI.lime_gl_get_context_attributes (); + #end base.premultipliedAlpha = false; base.preserveDrawingBuffer = false; return base; @@ -2183,7 +2218,11 @@ class NativeGLRenderContext { public function getProgramInfoLog (program:GLProgram):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_program_info_log (__getObjectID (program)); + var result = NativeCFFI.lime_gl_get_program_info_log (__getObjectID (program)); + #if hl + var result = @:privateAccess String.fromUTF8 (result); + #end + return result; #else return null; #end @@ -2353,7 +2392,11 @@ class NativeGLRenderContext { public function getShaderInfoLog (shader:GLShader):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_shader_info_log (__getObjectID (shader)); + var result = NativeCFFI.lime_gl_get_shader_info_log (__getObjectID (shader)); + #if hl + var result = @:privateAccess String.fromUTF8 (result); + #end + return result; #else return null; #end @@ -2371,8 +2414,11 @@ class NativeGLRenderContext { public function getShaderPrecisionFormat (shadertype:Int, precisiontype:Int):GLShaderPrecisionFormat { #if (lime_cffi && lime_opengl && !macro) - var result:Dynamic = NativeCFFI.lime_gl_get_shader_precision_format (shadertype, precisiontype); - return result; + #if hl + return NativeCFFI.lime_gl_get_shader_precision_format (shadertype, precisiontype, { rangeMin: 0, rangeMax: 0, precision: 0 }); + #else + return NativeCFFI.lime_gl_get_shader_precision_format (shadertype, precisiontype); + #end #else return null; #end @@ -2383,7 +2429,11 @@ class NativeGLRenderContext { public function getShaderSource (shader:GLShader):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_shader_source (__getObjectID (shader)); + var result = NativeCFFI.lime_gl_get_shader_source (__getObjectID (shader)); + #if hl + var result = @:privateAccess String.fromUTF8 (result); + #end + return result; #else return null; #end @@ -2394,7 +2444,11 @@ class NativeGLRenderContext { public function getString (name:Int):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_string (name); + var result = NativeCFFI.lime_gl_get_string (name); + #if hl + var result = @:privateAccess String.fromUTF8 (result); + #end + return result; #else return null; #end @@ -2405,7 +2459,11 @@ class NativeGLRenderContext { public function getStringi (name:Int, index:Int):String { #if (lime_cffi && lime_opengl && !macro) - return NativeCFFI.lime_gl_get_stringi (name, index); + var result = NativeCFFI.lime_gl_get_stringi (name, index); + #if hl + var result = @:privateAccess String.fromUTF8 (result); + #end + return result; #else return null; #end @@ -2538,8 +2596,14 @@ class NativeGLRenderContext { public function getTransformFeedbackVarying (program:GLProgram, index:Int):GLActiveInfo { #if (lime_cffi && lime_opengl && !macro) + #if hl + var object:{ size:Int, type:Int, name:hl.Bytes } = { size: 0, type: 0, name: null }; + var result:Dynamic = NativeCFFI.lime_gl_get_transform_feedback_varying (__getObjectID (program), index, object); + return result; + #else var result:Dynamic = NativeCFFI.lime_gl_get_transform_feedback_varying (__getObjectID (program), index); return result; + #end #else return null; #end @@ -2832,6 +2896,11 @@ class NativeGLRenderContext { public function invalidateFramebuffer (target:Int, attachments:Array):Void { #if (lime_cffi && lime_opengl && !macro) + #if hl + var _attachments = new hl.NativeArray (attachments.length); + for (i in 0...attachments.length) _attachments[i] = attachments[i]; + var attachments = _attachments; + #end NativeCFFI.lime_gl_invalidate_framebuffer (target, attachments); #end @@ -2841,6 +2910,11 @@ class NativeGLRenderContext { public function invalidateSubFramebuffer (target:Int, attachments:Array, x:Int, y:Int, width:Int, height:Int):Void { #if (lime_cffi && lime_opengl && !macro) + #if hl + var _attachments = new hl.NativeArray (attachments.length); + for (i in 0...attachments.length) _attachments[i] = attachments[i]; + var attachments = _attachments; + #end NativeCFFI.lime_gl_invalidate_sub_framebuffer (target, attachments, x, y, width, height); #end @@ -3153,6 +3227,11 @@ class NativeGLRenderContext { public function shaderBinary (shaders:Array, binaryformat:Int, binary:DataPointer, length:Int):Void { #if (lime_cffi && lime_opengl && !macro) + #if hl + var _shaders = new hl.NativeArray (shaders.length); + for (i in 0...shaders.length) _shaders[i] = shaders[i].id; + var shaders = _shaders; + #end NativeCFFI.lime_gl_shader_binary (shaders, binaryformat, binary, length); #end @@ -3297,6 +3376,11 @@ class NativeGLRenderContext { public function transformFeedbackVaryings (program:GLProgram, varyings:Array, bufferMode:Int):Void { #if (lime_cffi && lime_opengl && !macro) + #if hl + var _varyings = new hl.NativeArray (varyings.length); + for (i in 0...varyings.length) _varyings[i] = varyings[i].charCodeAt (0); + var varyings = _varyings; + #end NativeCFFI.lime_gl_transform_feedback_varyings (__getObjectID (program), varyings, bufferMode); #end diff --git a/lime/_backend/native/NativeRenderer.hx b/lime/_backend/native/NativeRenderer.hx index 7a5eb9e7c..f9eab448c 100644 --- a/lime/_backend/native/NativeRenderer.hx +++ b/lime/_backend/native/NativeRenderer.hx @@ -47,6 +47,7 @@ class NativeRenderer { public function new (parent:Renderer) { this.parent = parent; + cacheLock = null; } @@ -67,11 +68,13 @@ class NativeRenderer { #else #if hl - var type = @:privateAccess String.fromUCS2 (NativeCFFI.lime_renderer_get_type (handle)); + var type = @:privateAccess String.fromUTF8 (NativeCFFI.lime_renderer_get_type (handle)); #else var type:String = NativeCFFI.lime_renderer_get_type (handle); #end + trace (type); + switch (type) { case "opengl": @@ -233,7 +236,7 @@ class NativeRenderer { if (!useHardware) { #if lime_cairo - var lock:Dynamic = NativeCFFI.lime_renderer_lock (handle); + var lock:Dynamic = NativeCFFI.lime_renderer_lock (handle #if hl, { width: 0, height: 0, pixels: 0., pitch: 0 } #end); if (lock != null && (cacheLock == null || cacheLock.pixels != lock.pixels || cacheLock.width != lock.width || cacheLock.height != lock.height)) { diff --git a/lime/graphics/opengl/GL.hx b/lime/graphics/opengl/GL.hx index e0ddd1c26..b5b0bc855 100644 --- a/lime/graphics/opengl/GL.hx +++ b/lime/graphics/opengl/GL.hx @@ -3,6 +3,7 @@ package lime.graphics.opengl; import haxe.io.Bytes; import haxe.Int64; +import lime.system.CFFIPointer; import lime.utils.ArrayBufferView; import lime.utils.ArrayBuffer; import lime.utils.BytePointer; @@ -3128,10 +3129,12 @@ class GL { #if (!js || !html5 || display) @:access(lime._backend.native.NativeCFFI) +#if hl @:keep #end @:dox(hide) @:noCompletion class GLObject { private var id:Int; + private var ptr:CFFIPointer; private var refs:Array; @@ -3156,7 +3159,7 @@ class GL { } object = new GLObject (id); - NativeCFFI.lime_gl_object_register (id, type, object); + object.ptr = NativeCFFI.lime_gl_object_register (id, type, object); return object; #else return null; diff --git a/lime/system/Clipboard.hx b/lime/system/Clipboard.hx index 8e2f11984..51eae48ad 100644 --- a/lime/system/Clipboard.hx +++ b/lime/system/Clipboard.hx @@ -36,7 +36,7 @@ class Clipboard { #if (lime_cffi && !macro) #if hl - _text = @:privateAccess String.fromUCS2 (NativeCFFI.lime_clipboard_get_text ()); + _text = @:privateAccess String.fromUTF8 (NativeCFFI.lime_clipboard_get_text ()); #else _text = NativeCFFI.lime_clipboard_get_text (); #end diff --git a/lime/system/System.hx b/lime/system/System.hx index 284ba7d35..bd5875b61 100644 --- a/lime/system/System.hx +++ b/lime/system/System.hx @@ -468,7 +468,7 @@ class System { } #if hl - path = @:privateAccess String.fromUCS2 (NativeCFFI.lime_system_get_directory (type, company, file)); + path = @:privateAccess String.fromUTF8 (NativeCFFI.lime_system_get_directory (type, company, file)); #else path = NativeCFFI.lime_system_get_directory (type, company, file); #end @@ -476,7 +476,7 @@ class System { } else { #if hl - path = @:privateAccess String.fromUCS2 (NativeCFFI.lime_system_get_directory (type, null, null)); + path = @:privateAccess String.fromUTF8 (NativeCFFI.lime_system_get_directory (type, null, null)); #else path = NativeCFFI.lime_system_get_directory (type, null, null); #end @@ -721,7 +721,7 @@ class System { #if (windows || ios || tvos) #if hl - __deviceModel = @:privateAccess String.fromUCS2 (NativeCFFI.lime_system_get_device_model ()); + __deviceModel = @:privateAccess String.fromUTF8 (NativeCFFI.lime_system_get_device_model ()); #else __deviceModel = NativeCFFI.lime_system_get_device_model (); #end @@ -756,7 +756,7 @@ class System { #if (windows && !html5) #if hl - __deviceVendor = @:privateAccess String.fromUCS2 (NativeCFFI.lime_system_get_device_vendor ()); + __deviceVendor = @:privateAccess String.fromUTF8 (NativeCFFI.lime_system_get_device_vendor ()); #else __deviceVendor = NativeCFFI.lime_system_get_device_vendor (); #end @@ -857,7 +857,7 @@ class System { #if (windows && !html5) #if hl - var label:String = @:privateAccess String.fromUCS2 (NativeCFFI.lime_system_get_platform_label ()); + var label:String = @:privateAccess String.fromUTF8 (NativeCFFI.lime_system_get_platform_label ()); #else var label:String = NativeCFFI.lime_system_get_platform_label (); #end @@ -925,7 +925,7 @@ class System { #if (windows && !html5) #if hl - __platformVersion = @:privateAccess String.fromUCS2 (NativeCFFI.lime_system_get_platform_version ()); + __platformVersion = @:privateAccess String.fromUTF8 (NativeCFFI.lime_system_get_platform_version ()); #else __platformVersion = NativeCFFI.lime_system_get_platform_version (); #end diff --git a/lime/ui/Gamepad.hx b/lime/ui/Gamepad.hx index 83be8fd33..91013dec4 100644 --- a/lime/ui/Gamepad.hx +++ b/lime/ui/Gamepad.hx @@ -85,7 +85,7 @@ class Gamepad { #if (lime_cffi && !macro) #if hl - return @:privateAccess String.fromUCS2 (NativeCFFI.lime_gamepad_get_device_guid (this.id)); + return @:privateAccess String.fromUTF8 (NativeCFFI.lime_gamepad_get_device_guid (this.id)); #else return NativeCFFI.lime_gamepad_get_device_guid (this.id); #end @@ -103,7 +103,7 @@ class Gamepad { #if (lime_cffi && !macro) #if hl - return @:privateAccess String.fromUCS2 (NativeCFFI.lime_gamepad_get_device_name (this.id)); + return @:privateAccess String.fromUTF8 (NativeCFFI.lime_gamepad_get_device_name (this.id)); #else return NativeCFFI.lime_gamepad_get_device_name (this.id); #end diff --git a/lime/ui/Joystick.hx b/lime/ui/Joystick.hx index bbd1118fe..a549436da 100644 --- a/lime/ui/Joystick.hx +++ b/lime/ui/Joystick.hx @@ -85,7 +85,7 @@ class Joystick { #if (lime_cffi && !macro) #if hl - return @:privateAccess String.fromUCS2 (NativeCFFI.lime_joystick_get_device_guid (this.id)); + return @:privateAccess String.fromUTF8 (NativeCFFI.lime_joystick_get_device_guid (this.id)); #else return NativeCFFI.lime_joystick_get_device_guid (this.id); #end @@ -103,7 +103,7 @@ class Joystick { #if (lime_cffi && !macro) #if hl - return @:privateAccess String.fromUCS2 (NativeCFFI.lime_joystick_get_device_name (this.id)); + return @:privateAccess String.fromUTF8 (NativeCFFI.lime_joystick_get_device_name (this.id)); #else return NativeCFFI.lime_joystick_get_device_name (this.id); #end diff --git a/project/include/graphics/Renderer.h b/project/include/graphics/Renderer.h index c534f7033..cc1a662c9 100644 --- a/project/include/graphics/Renderer.h +++ b/project/include/graphics/Renderer.h @@ -21,7 +21,7 @@ namespace lime { virtual void Flip () = 0; virtual void* GetContext () = 0; virtual double GetScale () = 0; - virtual void* Lock (bool useCFFIValue) = 0; + virtual void* Lock (bool useCFFIValue, void* object) = 0; virtual void MakeCurrent () = 0; virtual void ReadPixels (ImageBuffer *buffer, Rectangle *rect) = 0; virtual const char* Type () = 0; diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp index d44049298..7690407a5 100644 --- a/project/src/ExternalInterface.cpp +++ b/project/src/ExternalInterface.cpp @@ -2776,14 +2776,14 @@ namespace lime { value lime_renderer_lock (value renderer) { - return (value)((Renderer*)val_data (renderer))->Lock (true); + return (value)((Renderer*)val_data (renderer))->Lock (true, NULL); } - HL_PRIM vdynamic* hl_lime_renderer_lock (HL_CFFIPointer* renderer) { + HL_PRIM vdynamic* hl_lime_renderer_lock (HL_CFFIPointer* renderer, vdynamic* object) { - return (vdynamic*)((Renderer*)renderer->ptr)->Lock (false); + return (vdynamic*)((Renderer*)renderer->ptr)->Lock (false, object); } @@ -4233,7 +4233,7 @@ namespace lime { DEFINE_HL_PRIM (_F64, lime_renderer_get_context, _TCFFIPOINTER); DEFINE_HL_PRIM (_F64, lime_renderer_get_scale, _TCFFIPOINTER); DEFINE_HL_PRIM (_BYTES, lime_renderer_get_type, _TCFFIPOINTER); - DEFINE_HL_PRIM (_DYN, lime_renderer_lock, _TCFFIPOINTER); + DEFINE_HL_PRIM (_DYN, lime_renderer_lock, _TCFFIPOINTER _DYN); DEFINE_HL_PRIM (_VOID, lime_renderer_make_current, _TCFFIPOINTER); DEFINE_HL_PRIM (_DYN, lime_renderer_read_pixels, _TCFFIPOINTER _TRECTANGLE _TIMAGEBUFFER); DEFINE_HL_PRIM (_VOID, lime_renderer_unlock, _TCFFIPOINTER); diff --git a/project/src/backend/sdl/SDLRenderer.cpp b/project/src/backend/sdl/SDLRenderer.cpp index 98dda86f2..6caed85af 100644 --- a/project/src/backend/sdl/SDLRenderer.cpp +++ b/project/src/backend/sdl/SDLRenderer.cpp @@ -191,8 +191,7 @@ namespace lime { } - - void* SDLRenderer::Lock (bool useCFFIValue) { + void* SDLRenderer::Lock (bool useCFFIValue, void* object) { if (sdlRenderer) { @@ -238,7 +237,9 @@ namespace lime { const int id_pixels = hl_hash_utf8 ("pixels"); const int id_pitch = hl_hash_utf8 ("pitch"); - vdynamic* result = hl_alloc_dynamic (&hlt_dynobj); + // TODO: Allocate a new object here? + + vdynamic* result = (vdynamic*)object; if (SDL_LockTexture (sdlTexture, NULL, &pixels, &pitch) == 0) { diff --git a/project/src/backend/sdl/SDLRenderer.h b/project/src/backend/sdl/SDLRenderer.h index b94dbd459..ba605d5aa 100644 --- a/project/src/backend/sdl/SDLRenderer.h +++ b/project/src/backend/sdl/SDLRenderer.h @@ -19,7 +19,7 @@ namespace lime { virtual void Flip (); virtual void* GetContext (); virtual double GetScale (); - virtual void* Lock (bool useCFFIValue); + virtual void* Lock (bool useCFFIValue, void* object); virtual void MakeCurrent (); virtual void ReadPixels (ImageBuffer *buffer, Rectangle *rect); virtual const char* Type (); diff --git a/project/src/graphics/opengl/OpenGLBindings.cpp b/project/src/graphics/opengl/OpenGLBindings.cpp index d18449966..4c4f6e09e 100644 --- a/project/src/graphics/opengl/OpenGLBindings.cpp +++ b/project/src/graphics/opengl/OpenGLBindings.cpp @@ -1558,15 +1558,15 @@ namespace lime { } - HL_PRIM value hl_lime_gl_fence_sync (int condition, int flags) { + HL_PRIM HL_CFFIPointer* hl_lime_gl_fence_sync (int condition, int flags) { #ifdef LIME_GLES3_API GLsync result = glFenceSync (condition, flags); - value handle = CFFIPointer (result, gc_gl_object); + HL_CFFIPointer* handle = HLCFFIPointer (result, (hl_finalizer)gc_gl_object); glObjectPtrs[handle] = result; return handle; #else - return alloc_null (); + return NULL; #endif } @@ -1696,9 +1696,9 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_active_attrib (int program, int index) { + HL_PRIM vdynamic* hl_lime_gl_get_active_attrib (int program, int index, void* object) { - vdynamic* result = hl_alloc_dynamic (&hlt_dynobj); + vdynamic* result = (vdynamic*)object; char buffer[GL_ACTIVE_ATTRIBUTE_MAX_LENGTH]; GLsizei outLen = 0; @@ -1715,7 +1715,7 @@ namespace lime { const int id_name = hl_hash_utf8 ("name"); hl_dyn_seti (result, id_size, &hlt_i32, size); - hl_dyn_seti (result, id_size, &hlt_i32, type); + hl_dyn_seti (result, id_type, &hlt_i32, type); hl_dyn_setp (result, id_name, &hlt_bytes, _buffer); return result; @@ -1744,12 +1744,12 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_active_uniform (int program, int index) { + HL_PRIM vdynamic* hl_lime_gl_get_active_uniform (int program, int index, void* object) { char* buffer[GL_ACTIVE_UNIFORM_MAX_LENGTH]; GLsizei outLen = 0; GLsizei size = 0; - GLenum type = 0; + GLenum type = 0; glGetActiveUniform (program, index, GL_ACTIVE_UNIFORM_MAX_LENGTH, &outLen, &size, &type, (GLchar*)&buffer); @@ -1760,9 +1760,10 @@ namespace lime { const int id_type = hl_hash_utf8 ("type"); const int id_name = hl_hash_utf8 ("name"); - vdynamic* result = hl_alloc_dynamic (&hlt_dynobj); + vdynamic* result = (vdynamic*)object; + hl_dyn_seti (result, id_size, &hlt_i32, size); - hl_dyn_seti (result, id_size, &hlt_i32, type); + hl_dyn_seti (result, id_type, &hlt_i32, type); hl_dyn_setp (result, id_name, &hlt_bytes, _buffer); return result; @@ -2075,9 +2076,9 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_context_attributes () { + HL_PRIM vdynamic* hl_lime_gl_get_context_attributes (void* object) { - vdynamic* result = hl_alloc_dynamic (&hlt_dynobj); + vdynamic* result = (vdynamic*)object; const int id_alpha = hl_hash_utf8 ("alpha"); const int id_depth = hl_hash_utf8 ("depth"); @@ -2805,7 +2806,7 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_shader_precision_format (int shadertype, int precisiontype) { + HL_PRIM vdynamic* hl_lime_gl_get_shader_precision_format (int shadertype, int precisiontype, void* object) { #ifdef LIME_GLES @@ -2814,7 +2815,7 @@ namespace lime { glGetShaderPrecisionFormat (shadertype, precisiontype, range, &precision); - vdynamic* result = hl_alloc_dynamic (&hlt_dynobj); + vdynamic* result = (vdynamic*)object; const int id_rangeMin = hl_hash_utf8 ("rangeMin"); const int id_rangeMax = hl_hash_utf8 ("rangeMax"); @@ -3091,10 +3092,10 @@ namespace lime { } - HL_PRIM vdynamic* hl_lime_gl_get_transform_feedback_varying (int program, int index) { + HL_PRIM vdynamic* hl_lime_gl_get_transform_feedback_varying (int program, int index, void* object) { #ifdef LIME_GLES3_API - vdynamic* result = hl_alloc_dynamic (&hlt_dynobj); + vdynamic* result = (vdynamic*)object; GLint maxLength = 0; glGetProgramiv (program, GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, &maxLength); @@ -3759,7 +3760,29 @@ namespace lime { void lime_gl_object_deregister (value object) { - val_gc (object, 0); + if (glObjectIDs.find (object) != glObjectIDs.end ()) { + + GLuint id = glObjectIDs[object]; + GLObjectType type = glObjectTypes[object]; + + glObjects[type].erase (id); + glObjectTypes.erase (object); + glObjectIDs.erase (object); + + } + + if (glObjectPtrs.find (object) != glObjectPtrs.end ()) { + + value handle = (value)glObjectPtrs[object]; + val_gc (handle, 0); + glObjectPtrs.erase (object); + + } + + } + + + HL_PRIM void hl_lime_gl_object_deregister (void* object) { if (glObjectIDs.find (object) != glObjectIDs.end ()) { @@ -3772,21 +3795,12 @@ namespace lime { } - } - - - HL_PRIM void hl_lime_gl_object_deregister (HL_CFFIPointer* object) { - - object->finalizer = NULL; - - if (glObjectIDs.find (object) != glObjectIDs.end ()) { + if (glObjectPtrs.find (object) != glObjectPtrs.end ()) { - GLuint id = glObjectIDs[object]; - GLObjectType type = glObjectTypes[object]; - - glObjects[type].erase (id); - glObjectTypes.erase (object); - glObjectIDs.erase (object); + HL_CFFIPointer* handle = (HL_CFFIPointer*)glObjectPtrs[object]; + handle->finalizer = NULL; + delete handle; + glObjectPtrs.erase (object); } @@ -3810,13 +3824,13 @@ namespace lime { } - HL_PRIM HL_CFFIPointer* hl_lime_gl_object_from_id (int id, int type) { + HL_PRIM void* hl_lime_gl_object_from_id (int id, int type) { GLObjectType _type = (GLObjectType)type; if (glObjects[_type].find (id) != glObjects[_type].end ()) { - return (HL_CFFIPointer*)glObjects[_type][id]; + return glObjects[_type][id]; } else { @@ -3827,9 +3841,10 @@ namespace lime { } - void lime_gl_object_register (int id, int type, value object) { + value lime_gl_object_register (int id, int type, value object) { GLObjectType _type = (GLObjectType)type; + value handle = CFFIPointer (object, gc_gl_object); //if (glObjects[_type].find (id) != glObjects[_type].end ()) { // @@ -3846,15 +3861,17 @@ namespace lime { glObjectTypes[object] = (GLObjectType)type; glObjectIDs[object] = id; glObjects[_type][id] = object; + glObjectPtrs[object] = handle; - val_gc (object, gc_gl_object); + return handle; } - HL_PRIM void hl_lime_gl_object_register (int id, int type, HL_CFFIPointer* object) { + HL_PRIM HL_CFFIPointer* hl_lime_gl_object_register (int id, int type, void* object) { GLObjectType _type = (GLObjectType)type; + HL_CFFIPointer* handle = HLCFFIPointer ((vdynamic*)object, (hl_finalizer)gc_gl_object); //if (glObjects[_type].find (id) != glObjects[_type].end ()) { // @@ -3871,8 +3888,9 @@ namespace lime { glObjectTypes[object] = (GLObjectType)type; glObjectIDs[object] = id; glObjects[_type][id] = object; + glObjectPtrs[object] = handle; - object->finalizer = (void*)gc_gl_object; + return handle; } @@ -4164,7 +4182,8 @@ namespace lime { HL_PRIM void hl_lime_gl_shader_source (int handle, hl_vstring* source) { - glShaderSource (handle, 1, source ? (const char**)&source->bytes : NULL, 0); + const char* _source = source ? hl_to_utf8 (source->bytes) : NULL; + glShaderSource (handle, 1, (const char**)&_source, 0); } @@ -5498,7 +5517,7 @@ namespace lime { DEFINE_PRIME4 (lime_gl_map_buffer_range); DEFINE_PRIME1v (lime_gl_object_deregister); DEFINE_PRIME2 (lime_gl_object_from_id); - DEFINE_PRIME3v (lime_gl_object_register); + DEFINE_PRIME3 (lime_gl_object_register); DEFINE_PRIME0v (lime_gl_pause_transform_feedback); DEFINE_PRIME2v (lime_gl_pixel_storei); DEFINE_PRIME2v (lime_gl_polygon_offset); @@ -5590,12 +5609,14 @@ namespace lime { #define _TBYTES _OBJ (_I32 _BYTES) #define _TCFFIPOINTER _DYN + #define _TGLOBJECT _OBJ (_I32 _TCFFIPOINTER _OBJ (_ARR)) + DEFINE_HL_PRIM (_VOID, lime_gl_active_texture, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_attach_shader, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_begin_query, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_begin_transform_feedback, _I32); - DEFINE_HL_PRIM (_VOID, lime_gl_bind_attrib_location, _I32 _I32); + DEFINE_HL_PRIM (_VOID, lime_gl_bind_attrib_location, _I32 _I32 _STRING); DEFINE_HL_PRIM (_VOID, lime_gl_bind_buffer, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_bind_buffer_base, _I32 _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_bind_buffer_range, _I32 _I32 _I32 _F64 _I32); @@ -5639,7 +5660,7 @@ namespace lime { DEFINE_HL_PRIM (_I32, lime_gl_create_query, _NO_ARG); DEFINE_HL_PRIM (_I32, lime_gl_create_renderbuffer, _NO_ARG); DEFINE_HL_PRIM (_I32, lime_gl_create_sampler, _NO_ARG); - DEFINE_HL_PRIM (_I32, lime_gl_create_shader, _NO_ARG); + DEFINE_HL_PRIM (_I32, lime_gl_create_shader, _I32); DEFINE_HL_PRIM (_I32, lime_gl_create_texture, _NO_ARG); DEFINE_HL_PRIM (_I32, lime_gl_create_transform_feedback, _NO_ARG); DEFINE_HL_PRIM (_I32, lime_gl_create_vertex_array, _NO_ARG); @@ -5670,8 +5691,8 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_enable, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_enable_vertex_attrib_array, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_end_query, _I32); - DEFINE_HL_PRIM (_VOID, lime_gl_end_transform_feedback, _I32); - DEFINE_HL_PRIM (_VOID, lime_gl_fence_sync, _I32 _I32); + DEFINE_HL_PRIM (_VOID, lime_gl_end_transform_feedback, _NO_ARG); + DEFINE_HL_PRIM (_TCFFIPOINTER, lime_gl_fence_sync, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_finish, _NO_ARG); DEFINE_HL_PRIM (_VOID, lime_gl_flush, _NO_ARG); DEFINE_HL_PRIM (_VOID, lime_gl_framebuffer_renderbuffer, _I32 _I32 _I32 _I32); @@ -5679,8 +5700,8 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_framebuffer_texture2D, _I32 _I32 _I32 _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_front_face, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_generate_mipmap, _I32); - DEFINE_HL_PRIM (_DYN, lime_gl_get_active_attrib, _I32 _I32); - DEFINE_HL_PRIM (_DYN, lime_gl_get_active_uniform, _I32 _I32); + DEFINE_HL_PRIM (_DYN, lime_gl_get_active_attrib, _I32 _I32 _DYN); + DEFINE_HL_PRIM (_DYN, lime_gl_get_active_uniform, _I32 _I32 _DYN); DEFINE_HL_PRIM (_I32, lime_gl_get_active_uniform_blocki, _I32 _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_active_uniform_blockiv, _I32 _I32 _I32 _F64); DEFINE_HL_PRIM (_BYTES, lime_gl_get_active_uniform_block_name, _I32 _I32); @@ -5694,7 +5715,7 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_get_buffer_parameteri64v, _I32 _I32 _F64); DEFINE_HL_PRIM (_F64, lime_gl_get_buffer_pointerv, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_buffer_sub_data, _I32 _F64 _I32 _F64); - DEFINE_HL_PRIM (_DYN, lime_gl_get_context_attributes, _NO_ARG); + DEFINE_HL_PRIM (_DYN, lime_gl_get_context_attributes, _DYN); DEFINE_HL_PRIM (_I32, lime_gl_get_error, _NO_ARG); DEFINE_HL_PRIM (_DYN, lime_gl_get_extension, _STRING); DEFINE_HL_PRIM (_F32, lime_gl_get_float, _I32); @@ -5725,7 +5746,7 @@ namespace lime { DEFINE_HL_PRIM (_BYTES, lime_gl_get_shader_info_log, _I32); DEFINE_HL_PRIM (_I32, lime_gl_get_shaderi, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_shaderiv, _I32 _I32 _F64); - DEFINE_HL_PRIM (_DYN, lime_gl_get_shader_precision_format, _I32 _I32); + DEFINE_HL_PRIM (_DYN, lime_gl_get_shader_precision_format, _I32 _I32 _DYN); DEFINE_HL_PRIM (_BYTES, lime_gl_get_shader_source, _I32); DEFINE_HL_PRIM (_BYTES, lime_gl_get_string, _I32); DEFINE_HL_PRIM (_BYTES, lime_gl_get_stringi, _I32 _I32); @@ -5735,7 +5756,7 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_get_tex_parameterfv, _I32 _I32 _F64); DEFINE_HL_PRIM (_I32, lime_gl_get_tex_parameteri, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_tex_parameteriv, _I32 _I32 _F64); - DEFINE_HL_PRIM (_DYN, lime_gl_get_transform_feedback_varying, _I32 _I32); + DEFINE_HL_PRIM (_DYN, lime_gl_get_transform_feedback_varying, _I32 _I32 _DYN); DEFINE_HL_PRIM (_F32, lime_gl_get_uniformf, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_get_uniformfv, _I32 _I32 _F64); DEFINE_HL_PRIM (_I32, lime_gl_get_uniformi, _I32 _I32); @@ -5771,9 +5792,9 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_line_width, _F32); DEFINE_HL_PRIM (_VOID, lime_gl_link_program, _I32); DEFINE_HL_PRIM (_F64, lime_gl_map_buffer_range, _I32 _F64 _I32 _I32); - DEFINE_HL_PRIM (_VOID, lime_gl_object_deregister, _TCFFIPOINTER); - DEFINE_HL_PRIM (_TCFFIPOINTER, lime_gl_object_from_id, _I32 _I32); - DEFINE_HL_PRIM (_VOID, lime_gl_object_register, _I32 _I32 _TCFFIPOINTER); + DEFINE_HL_PRIM (_VOID, lime_gl_object_deregister, _TGLOBJECT); + DEFINE_HL_PRIM (_TGLOBJECT, lime_gl_object_from_id, _I32 _I32); + DEFINE_HL_PRIM (_TCFFIPOINTER, lime_gl_object_register, _I32 _I32 _TGLOBJECT); DEFINE_HL_PRIM (_VOID, lime_gl_pause_transform_feedback, _NO_ARG); DEFINE_HL_PRIM (_VOID, lime_gl_pixel_storei, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_polygon_offset, _F32 _F32); @@ -5797,7 +5818,7 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_stencil_mask_separate, _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_stencil_op, _I32 _I32 _I32); DEFINE_HL_PRIM (_VOID, lime_gl_stencil_op_separate, _I32 _I32 _I32 _I32); - DEFINE_HL_PRIM (_VOID, lime_gl_tex_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64); + DEFINE_HL_PRIM (_VOID, lime_gl_tex_image_2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64); DEFINE_HL_PRIM (_VOID, lime_gl_tex_image_3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _F64); DEFINE_HL_PRIM (_VOID, lime_gl_tex_parameterf, _I32 _I32 _F32); DEFINE_HL_PRIM (_VOID, lime_gl_tex_parameteri, _I32 _I32 _I32); @@ -5840,7 +5861,7 @@ namespace lime { DEFINE_HL_PRIM (_VOID, lime_gl_uniform_matrix4fv, _I32 _I32 _BOOL _F64); DEFINE_HL_PRIM (_VOID, lime_gl_uniform_matrix4x2fv, _I32 _I32 _BOOL _F64); DEFINE_HL_PRIM (_VOID, lime_gl_uniform_matrix4x3fv, _I32 _I32 _BOOL _F64); - DEFINE_HL_PRIM (_VOID, lime_gl_unmap_buffer, _I32); + DEFINE_HL_PRIM (_BOOL, lime_gl_unmap_buffer, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_use_program, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_validate_program, _I32); DEFINE_HL_PRIM (_VOID, lime_gl_vertex_attrib_divisor, _I32 _I32);