private void updateMemoryUsage(int level, long newUsage) { levelMemoryUsage ??= new List <long>(); while (level >= levelMemoryUsage.Count) { levelMemoryUsage.Add(0); } levelMemoryUsage[level] = newUsage; memoryLease?.Dispose(); memoryLease = NativeMemoryTracker.AddMemory(this, getMemoryUsage()); }
protected override void DoUpload(ITextureUpload upload, IntPtr dataPointer) { if (!(upload is VideoTextureUpload videoUpload)) { return; } // Do we need to generate a new texture? if (textureIds == null) { Debug.Assert(memoryLease == null); memoryLease = NativeMemoryTracker.AddMemory(this, Width * Height * 3 / 2); textureIds = new int[3]; GL.GenTextures(textureIds.Length, textureIds); for (uint i = 0; i < textureIds.Length; i++) { GLWrapper.BindTexture(textureIds[i]); int width = videoUpload.GetPlaneWidth(i); int height = videoUpload.GetPlaneHeight(i); textureSize += width * height; GL.TexImage2D(TextureTarget2d.Texture2D, 0, TextureComponentCount.R8, width, height, 0, PixelFormat.Red, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); } } for (uint i = 0; i < textureIds.Length; i++) { GLWrapper.BindTexture(textureIds[i]); GL.PixelStore(PixelStoreParameter.UnpackRowLength, videoUpload.Frame->linesize[i]); GL.TexSubImage2D(TextureTarget2d.Texture2D, 0, 0, 0, videoUpload.GetPlaneWidth(i), videoUpload.GetPlaneHeight(i), PixelFormat.Red, PixelType.UnsignedByte, (IntPtr)videoUpload.Frame->data[i]); } GL.PixelStore(PixelStoreParameter.UnpackRowLength, 0); UploadComplete = true; }
internal SampleBass(byte[] data, ConcurrentQueue <Task> customPendingActions = null, int concurrency = DEFAULT_CONCURRENCY) : base(concurrency) { if (customPendingActions != null) { PendingActions = customPendingActions; } if (data.Length > 0) { EnqueueAction(() => { sampleId = loadSample(data); memoryLease = NativeMemoryTracker.AddMemory(this, data.Length); }); } }
public void Bind(Vector2 size) { size = Vector2.Clamp(size, Vector2.One, new Vector2(GLWrapper.MaxRenderBufferSize)); // See: https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture.txt // + https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html // OpenGL ES allows the driver to discard renderbuffer contents after they are presented to the screen, so the storage must always be re-initialised for embedded devices. // Such discard does not exist on non-embedded platforms, so they are only re-initialised when required. if (GLWrapper.IsEmbedded || internalSize.X < size.X || internalSize.Y < size.Y) { GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, renderBuffer); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, format, (int)Math.Ceiling(size.X), (int)Math.Ceiling(size.Y)); if (!GLWrapper.IsEmbedded) { memoryLease?.Dispose(); memoryLease = NativeMemoryTracker.AddMemory(this, (long)(size.X * size.Y * sizePerPixel)); } internalSize = size; } }