public void Dispose() { GL.DeleteFramebuffer(GLFramebufferHandle); GL.DeleteRenderbuffer(GLDepthRenderBufferHandle); GL.DeleteTexture(GLSharedTextureHandle); Wgl.DXUnregisterObjectNV(DxGlContext.GlDeviceHandle, DxInteropRegisteredHandle); DXInterop.Release(DxRenderTargetHandle); }
public DxGlContext([NotNull] GLWpfControlSettings settings) { DXInterop.Direct3DCreate9Ex(DXInterop.DefaultSdkVersion, out var dxContextHandle); DxContextHandle = dxContextHandle; var deviceParameters = new PresentationParameters { Windowed = 1, SwapEffect = SwapEffect.Discard, DeviceWindowHandle = IntPtr.Zero, PresentationInterval = 0, BackBufferFormat = Format.X8R8G8B8, // this is like A8 R8 G8 B8, but avoids issues with Gamma correction being applied twice. BackBufferWidth = 1, BackBufferHeight = 1, AutoDepthStencilFormat = Format.Unknown, BackBufferCount = 1, EnableAutoDepthStencil = 0, Flags = 0, FullScreen_RefreshRateInHz = 0, MultiSampleQuality = 0, MultiSampleType = MultisampleType.None }; DXInterop.CreateDeviceEx( dxContextHandle, 0, DeviceType.HAL, // use hardware rasterization IntPtr.Zero, CreateFlags.HardwareVertexProcessing | CreateFlags.Multithreaded | CreateFlags.PureDevice, ref deviceParameters, IntPtr.Zero, out var dxDeviceHandle); DxDeviceHandle = dxDeviceHandle; // if the graphics context is null, we use the shared context. if (settings.ContextToUse != null) { GraphicsContext = settings.ContextToUse; } else { GraphicsContext = GetOrCreateSharedOpenGLContext(settings); } GlDeviceHandle = Wgl.DXOpenDeviceNV(dxDeviceHandle); }
public DxGLFramebuffer([NotNull] DxGlContext context, int width, int height, double dpiScaleX, double dpiScaleY) { DxGlContext = context; Width = width; Height = height; FramebufferWidth = (int)Math.Ceiling(width * dpiScaleX); FramebufferHeight = (int)Math.Ceiling(height * dpiScaleY); var dxSharedHandle = IntPtr.Zero; // Unused windows-vista legacy sharing handle. Must always be null. DXInterop.CreateRenderTarget( context.DxDeviceHandle, FramebufferWidth, FramebufferHeight, Format.X8R8G8B8,// this is like A8 R8 G8 B8, but avoids issues with Gamma correction being applied twice. MultisampleType.None, 0, false, out var dxRenderTargetHandle, ref dxSharedHandle); DxRenderTargetHandle = dxRenderTargetHandle; Wgl.DXSetResourceShareHandleNV(dxRenderTargetHandle, dxSharedHandle); GLFramebufferHandle = GL.GenFramebuffer(); GLSharedTextureHandle = GL.GenTexture(); var genHandle = Wgl.DXRegisterObjectNV( context.GlDeviceHandle, dxRenderTargetHandle, (uint)GLSharedTextureHandle, (uint)TextureTarget.Texture2D, WGL_NV_DX_interop.AccessReadWrite); DxInteropRegisteredHandle = genHandle; GL.BindFramebuffer(FramebufferTarget.Framebuffer, GLFramebufferHandle); GL.FramebufferTexture2D( FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, GLSharedTextureHandle, 0); GLDepthRenderBufferHandle = GL.GenRenderbuffer(); GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, GLDepthRenderBufferHandle); GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, FramebufferWidth, FramebufferHeight); GL.FramebufferRenderbuffer( FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, RenderbufferTarget.Renderbuffer, GLDepthRenderBufferHandle); GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); D3dImage = new D3DImage(96.0 * dpiScaleX, 96.0 * dpiScaleY); TranslateTransform = new TranslateTransform(0, height); FlipYTransform = new ScaleTransform(1, -1); }