Exemple #1
0
 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);
        }
Exemple #3
0
        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);
        }