void RenderPass(Common.Region dc, Common.Size ReqSize) { renderTime.Start(); // Resize the form and backbuffer to noForm.Size Resize(ReqSize); Win32Util.Size w32Size = new Win32Util.Size((int)ReqSize.width, (int)ReqSize.height); Win32Util.SetWindowSize(w32Size, w32.handle); // Allow noform size to change as requested..like a layout hook (truncating layout passes with the render passes for performance) RenderSizeChanged(ReqSize); // Do Drawing stuff // 1) render to fbo throw new NotImplementedException(); // Create Color Texture uint ColorTexture; int FboWidth = (int)ReqSize.width; int FboHeight = (int)ReqSize.height; GL.GenTextures(1, out ColorTexture); GL.BindTexture(TextureTarget.Texture2D, ColorTexture); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Clamp); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Clamp); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, FboWidth, FboHeight, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero); // create fbo uint FboHandle; GL.Ext.GenFramebuffers(1, out FboHandle); GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, FboHandle); GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, ColorTexture, 0); // draw to fbo..? noForm.DrawBase(this, dc); // unbind fbo GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0); // return to visible framebuffer GL.DrawBuffer(DrawBufferMode.Back); // 2) go through dirty rects and copy to the window context throw new NotImplementedException(); foreach (var dr in dc.AsRectangles()) { //dostuff } // 3) call swapbuffers on window context... throw new NotImplementedException(); currentFps = 1f / (float)renderTime.Elapsed.TotalSeconds; renderTime.Reset(); }
void RenderPass(Common.Region dc, Common.Size ReqSize) { renderTime.Start(); // Resize the form and backbuffer to noForm.Size Resize(ReqSize); Win32Util.Size w32Size = new Win32Util.Size((int)ReqSize.width, (int)ReqSize.height); Win32Util.SetWindowSize(w32Size, winHandle); // FIXME blocks when closing->endrender event is locked... // Allow noform size to change as requested..like a layout hook (truncating layout passes with the render passes for performance) RenderSizeChanged(ReqSize); // Do Drawing stuff DrawingSize rtSize = new DrawingSize((int)d2dRenderTarget.Size.Width, (int)d2dRenderTarget.Size.Height); using (Texture2D t2d = new Texture2D(backBuffer.Device, backBuffer.Description)) { using (Surface1 srf = t2d.QueryInterface <Surface1>()) { using (RenderTarget trt = new RenderTarget(d2dFactory, srf, new RenderTargetProperties(d2dRenderTarget.PixelFormat))) { _backRenderer.renderTarget = trt; trt.BeginDraw(); noForm.DrawBase(this, dc); trt.EndDraw(); foreach (var rc in dc.AsRectangles()) { t2d.Device.CopySubresourceRegion(t2d, 0, new ResourceRegion() { Left = (int)rc.left, Right = (int)rc.right, Top = (int)rc.top, Bottom = (int)rc.bottom, Back = 1, Front = 0 }, backBuffer, 0, (int)rc.left, (int)rc.top, 0); } } } } swapchain.Present(0, PresentFlags.None); //System.Threading.Thread.Sleep(1000); lastFrameRenderDuration = 1f / (float)renderTime.Elapsed.TotalSeconds; renderTime.Reset(); }
void RenderPass(Common.Region dc, Common.Size ReqSize) { renderTime.Start(); // FIXME so much object spam and disposal in this very high frequency function (also inside Resize called belw). My poor megabytes! // Resize the form and backbuffer to noForm.Size, and fire the noForms sizechanged Resize(ReqSize); // make size... Win32Util.Size w32Size = new Win32Util.Size((int)ReqSize.width, (int)ReqSize.height); Win32Util.SetWindowSize(w32Size, hWnd); // Allow noform size to change as requested..like a layout hook (truncating layout passes with the render passes for performance) RenderSizeChanged(ReqSize); lock (noForm) { // Do Drawing stuff DrawingSize rtSize = new DrawingSize((int)d2dRenderTarget.Size.Width, (int)d2dRenderTarget.Size.Height); using (Texture2D t2d = new Texture2D(backBuffer.Device, backBuffer.Description)) { using (Surface1 srf = t2d.QueryInterface <Surface1>()) { using (RenderTarget trt = new RenderTarget(d2dFactory, srf, new RenderTargetProperties(d2dRenderTarget.PixelFormat))) { _backRenderer.renderTarget = trt; trt.BeginDraw(); noForm.DrawBase(this, dc); // Fill with transparency the edgeBuffer! trt.FillRectangle(new RectangleF(0, noForm.Size.height, noForm.Size.width + edgeBufferSize, noForm.Size.height + edgeBufferSize), scbTrans); trt.FillRectangle(new RectangleF(noForm.Size.width, 0, noForm.Size.width + edgeBufferSize, noForm.Size.height + edgeBufferSize), scbTrans); trt.EndDraw(); foreach (var rc in dc.AsRectangles()) { t2d.Device.CopySubresourceRegion(t2d, 0, new ResourceRegion() { Left = (int)rc.left, Right = (int)rc.right, Top = (int)rc.top, Bottom = (int)rc.bottom, Back = 1, Front = 0 }, backBuffer, 0, (int)rc.left, (int)rc.top, 0); } } } } // Present DC to windows (ugh layered windows sad times) IntPtr dxHdc = surface.GetDC(false); System.Drawing.Graphics dxdc = System.Drawing.Graphics.FromHdc(dxHdc); Win32Util.Point dstPoint = new Win32Util.Point((int)(noForm.Location.X), (int)(noForm.Location.Y)); Win32Util.Point srcPoint = new Win32Util.Point(0, 0); Win32Util.Size pSize = new Win32Util.Size(rtSize.Width, rtSize.Height); Win32Util.BLENDFUNCTION bf = new Win32Util.BLENDFUNCTION() { SourceConstantAlpha = 255, AlphaFormat = Win32Util.AC_SRC_ALPHA, BlendFlags = 0, BlendOp = 0 }; bool suc = Win32Util.UpdateLayeredWindow(hWnd, someDC, ref dstPoint, ref pSize, dxHdc, ref srcPoint, 1, ref bf, 2); surface.ReleaseDC(); dxdc.Dispose(); } lastFrameRenderDuration = 1f / (float)renderTime.Elapsed.TotalSeconds; renderTime.Reset(); }
void RenderPass(Region dc, Size ReqSize) { renderTime.Start(); double w = ReqSize.width, h = ReqSize.height; // Resize the window Win32Util.Size w32Size = new Win32Util.Size((int)ReqSize.width, (int)ReqSize.height); Win32Util.SetWindowSize(w32Size, w32.handle); // Allow noform size to change as requested..like a layout hook (truncating layout passes with the render passes for performance) RenderSizeChanged(ReqSize); foreach (var tex in new int[] { _backRenderer.T2D_Draw, _backRenderer.T2D_Window }) { GL.BindTexture(TextureTarget.Texture2D, tex); // bind to texture, set things, GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)w, (int)h, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorder); GL.BindTexture(TextureTarget.Texture2D, 0);// unbind from texture } // bind to framebuffer, and bind its output to the texture GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, _backRenderer.FBO_Draw); GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, _backRenderer.T2D_Draw, 0); // Alpha... GL.Enable(EnableCap.Texture2D); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); // set up ortho GL.Viewport(0, 0, (int)w, (int)h); GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); GL.Ortho(0.0, w, 0.0, h, 0.0, 1.0); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); // draw on fbo noForm.DrawBase(this, dc); rprocessor.ProcessRenderBuffer(_backRenderer.renderData); // Intermediate render to window buffer... GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, _backRenderer.FBO_Window); GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, _backRenderer.T2D_Window, 0); // Alpha... GL.Disable(EnableCap.Blend); // we just want to emplace. // set up ortho GL.Viewport(0, 0, (int)w, (int)h); GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); GL.Ortho(0.0, w, 0.0, h, 0.0, 1.0); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); // Texture mapping... GL.Enable(EnableCap.Texture2D); // Draw the Color Texture - only parts of it!! GL.BindTexture(TextureTarget.Texture2D, _backRenderer.T2D_Draw); GL.Color4(1f, 1f, 1f, 1f); GL.Begin(PrimitiveType.Quads); foreach (var d in dc.AsRectangles()) { double fl = d.left / w; double fr = d.right / w; double ft = d.top / h; double fb = d.bottom / h; double l = d.left; double r = d.right; double t = d.top; double b = d.bottom; //FIXME lazy...use drawarrays GL.TexCoord2(fl, ft); GL.Vertex2(l, t); GL.TexCoord2(fr, ft); GL.Vertex2(r, t); GL.TexCoord2(fr, fb); GL.Vertex2(r, b); GL.TexCoord2(fl, fb); GL.Vertex2(l, b); } GL.End(); GL.BindTexture(TextureTarget.Texture2D, 0); // bind to window (FBO Zero!) GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0); // Texture mapping... GL.Enable(EnableCap.Texture2D); // set up ortho GL.Viewport(0, 0, (int)w, (int)h); GL.MatrixMode(MatrixMode.Projection); GL.LoadIdentity(); GL.Ortho(0.0, w, 0.0, h, 0.0, 1.0); GL.MatrixMode(MatrixMode.Modelview); GL.LoadIdentity(); GL.BindTexture(TextureTarget.Texture2D, _backRenderer.T2D_Window); GL.Color4(1f, 1f, 1f, 1f); GL.Disable(EnableCap.Blend); // we just want to emplace. //FIXME lazy also... GL.Begin(PrimitiveType.Quads); GL.TexCoord2(0f, 1f); GL.Vertex2(0.0, 0.0); GL.TexCoord2(1f, 1f); GL.Vertex2(w, 0.0); GL.TexCoord2(1f, 0f); GL.Vertex2(w, h); GL.TexCoord2(0f, 0f); GL.Vertex2(0.0, h); GL.End(); GL.BindTexture(TextureTarget.Texture2D, 0); // Swap buffers on window FBO glContext.SwapBuffers(); lastFrameRenderDuration = 1f / (float)renderTime.Elapsed.TotalSeconds; renderTime.Reset(); }