From 08ae448257ccdd902dca64b8d789bec3da83d680 Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 8 Dec 2014 02:15:42 +0000 Subject: [PATCH] start adding d3d9 display method, but.. it was more work than gdi+, as I expected. I'll finish it another time. --- BizHawk.Client.Common/config/Config.cs | 2 +- .../BizHawk.Client.EmuHawk.csproj | 4 + .../DisplayManager/DisplayManager.cs | 5 +- BizHawk.Client.EmuHawk/Program.cs | 14 +- .../config/DisplayConfigLite.Designer.cs | 117 +++-- .../config/DisplayConfigLite.cs | 3 + BizHawk.sln | 15 + .../IGL_GdiPlus.cs | 14 +- .../IGL_TK.cs | 23 +- .../RetroShader.cs | 6 +- .../BizHawk.Bizware.BizwareGL.SlimDX.csproj | 79 +++ .../GLControlWrapper_SlimDX9.cs | 71 +++ .../IGL_SlimDX9.cs | 474 ++++++++++++++++++ .../AttributeUsage.cs | 10 + .../BizHawk.Bizware.BizwareGL.csproj | 1 + .../GraphicsControl.cs | 2 +- .../BizHawk.Bizware.BizwareGL/GuiRenderer.cs | 74 ++- Bizware/BizHawk.Bizware.BizwareGL/IGL.cs | 14 +- Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs | 1 + Bizware/BizHawk.Bizware.BizwareGL/Shader.cs | 1 + .../BizHawk.Bizware.BizwareGL/Texture2d.cs | 6 +- .../BizHawk.Bizware.BizwareGL/VertexLayout.cs | 5 +- 22 files changed, 853 insertions(+), 88 deletions(-) create mode 100644 Bizware/BizHawk.Bizware.BizwareGL.SlimDX/BizHawk.Bizware.BizwareGL.SlimDX.csproj create mode 100644 Bizware/BizHawk.Bizware.BizwareGL.SlimDX/GLControlWrapper_SlimDX9.cs create mode 100644 Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs create mode 100644 Bizware/BizHawk.Bizware.BizwareGL/AttributeUsage.cs diff --git a/BizHawk.Client.Common/config/Config.cs b/BizHawk.Client.Common/config/Config.cs index c9f72a265d..15ed2a38de 100644 --- a/BizHawk.Client.Common/config/Config.cs +++ b/BizHawk.Client.Common/config/Config.cs @@ -105,7 +105,7 @@ namespace BizHawk.Client.Common } } - public enum EDispMethod { OpenGL, GdiPlus }; + public enum EDispMethod { OpenGL, GdiPlus, SlimDX9 }; public enum EDispManagerAR { None, System, Custom }; diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj index 8193fbdd8e..cb28d204b5 100644 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj @@ -1444,6 +1444,10 @@ {5160CFB1-5389-47C1-B7F6-8A0DC97641EE} BizHawk.Bizware.BizwareGL.OpenTK + + {E6B436B1-A3CD-4C9A-8F76-5D7154726884} + BizHawk.Bizware.BizwareGL.SlimDX + {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465} BizHawk.Bizware.BizwareGL diff --git a/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs b/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs index 546feeee90..b504ecddae 100644 --- a/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs +++ b/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs @@ -46,6 +46,8 @@ namespace BizHawk.Client.EmuHawk if (GL is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK) Renderer = new GuiRenderer(GL); + else if (GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9) + Renderer = new GuiRenderer(GL); else Renderer = new GDIPlusGuiRenderer((BizHawk.Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus)GL); @@ -484,7 +486,8 @@ TESTEROO: if (!simulate) { //special codepath for GDI+ - if (GL is IGL_GdiPlus) + //TODO - make for gdi+ only. maybe other codepath for d3d + if (!(GL is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK)) { //wrap the videoprovider data in a BitmapBuffer (no point to refactoring that many IVideoProviders) bb = new BitmapBuffer(bufferWidth, bufferHeight, videoBuffer); diff --git a/BizHawk.Client.EmuHawk/Program.cs b/BizHawk.Client.EmuHawk/Program.cs index 3c597d4e43..38866f8fb7 100644 --- a/BizHawk.Client.EmuHawk/Program.cs +++ b/BizHawk.Client.EmuHawk/Program.cs @@ -79,13 +79,19 @@ namespace BizHawk.Client.EmuHawk //create IGL context. we do this whether or not the user has selected OpenGL, so that we can run opengl-based emulator cores GlobalWin.IGL_GL = new Bizware.BizwareGL.Drivers.OpenTK.IGL_TK(); - if(Global.Config.DispMethod == Config.EDispMethod.GdiPlus) - GlobalWin.GL = new Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus(); - else - GlobalWin.GL = new Bizware.BizwareGL.Drivers.OpenTK.IGL_TK(); + + //setup the GL context manager, needed for coping with multiple opengl cores vs opengl display method GlobalWin.GLManager = new GLManager(); GlobalWin.CR_GL = GlobalWin.GLManager.GetContextForIGL(GlobalWin.GL); + //now create the "GL" context for the display method. we can reuse the IGL_TK context if opengl display method is chosen + if (Global.Config.DispMethod == Config.EDispMethod.GdiPlus) + GlobalWin.GL = new Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus(); + else if (Global.Config.DispMethod == Config.EDispMethod.SlimDX9) + GlobalWin.GL = new Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9(); + else + GlobalWin.GL = GlobalWin.IGL_GL; + //WHY do we have to do this? some intel graphics drivers (ig7icd64.dll 10.18.10.3304 on an unknown chip on win8.1) are calling SetDllDirectory() for the process, which ruins stuff. //The relevant initialization happened just before in "create IGL context". //It isn't clear whether we need the earlier SetDllDirectory(), but I think we do. diff --git a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.Designer.cs b/BizHawk.Client.EmuHawk/config/DisplayConfigLite.Designer.cs index 7014a76e7e..bbbd3495a0 100644 --- a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.Designer.cs +++ b/BizHawk.Client.EmuHawk/config/DisplayConfigLite.Designer.cs @@ -63,11 +63,13 @@ this.tabControl1 = new System.Windows.Forms.TabControl(); this.tpAR = new System.Windows.Forms.TabPage(); this.tpDispMethod = new System.Windows.Forms.TabPage(); - this.tpMisc = new System.Windows.Forms.TabPage(); - this.groupBox3 = new System.Windows.Forms.GroupBox(); - this.rbGDIPlus = new System.Windows.Forms.RadioButton(); this.label6 = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); this.label7 = new System.Windows.Forms.Label(); + this.rbGDIPlus = new System.Windows.Forms.RadioButton(); + this.tpMisc = new System.Windows.Forms.TabPage(); + this.rbD3D9 = new System.Windows.Forms.RadioButton(); + this.label8 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.tbScanlineIntensity)).BeginInit(); this.grpFinalFilter.SuspendLayout(); @@ -75,8 +77,8 @@ this.tabControl1.SuspendLayout(); this.tpAR.SuspendLayout(); this.tpDispMethod.SuspendLayout(); - this.tpMisc.SuspendLayout(); this.groupBox3.SuspendLayout(); + this.tpMisc.SuspendLayout(); this.SuspendLayout(); // // btnCancel @@ -394,7 +396,7 @@ // this.rbOpenGL.AutoSize = true; this.rbOpenGL.Checked = true; - this.rbOpenGL.Location = new System.Drawing.Point(9, 19); + this.rbOpenGL.Location = new System.Drawing.Point(6, 80); this.rbOpenGL.Name = "rbOpenGL"; this.rbOpenGL.Size = new System.Drawing.Size(65, 17); this.rbOpenGL.TabIndex = 3; @@ -404,7 +406,7 @@ // // label5 // - this.label5.Location = new System.Drawing.Point(24, 39); + this.label5.Location = new System.Drawing.Point(21, 100); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(359, 47); this.label5.TabIndex = 16; @@ -451,6 +453,49 @@ this.tpDispMethod.Text = "Display Method"; this.tpDispMethod.UseVisualStyleBackColor = true; // + // label6 + // + this.label6.Location = new System.Drawing.Point(3, 227); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(359, 47); + this.label6.TabIndex = 18; + this.label6.Text = "Changes require restart of program to take effect.\r\n"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.label8); + this.groupBox3.Controls.Add(this.rbD3D9); + this.groupBox3.Controls.Add(this.label7); + this.groupBox3.Controls.Add(this.rbGDIPlus); + this.groupBox3.Controls.Add(this.label5); + this.groupBox3.Controls.Add(this.rbOpenGL); + this.groupBox3.Location = new System.Drawing.Point(4, 3); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(389, 221); + this.groupBox3.TabIndex = 16; + this.groupBox3.TabStop = false; + // + // label7 + // + this.label7.Location = new System.Drawing.Point(21, 170); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(359, 47); + this.label7.TabIndex = 18; + this.label7.Text = " • Mainly for compatibility purposes\r\n • Missing some features\r\n • Works better o" + + "ver Remote Desktop, etc.\r\n"; + // + // rbGDIPlus + // + this.rbGDIPlus.AutoSize = true; + this.rbGDIPlus.Checked = true; + this.rbGDIPlus.Location = new System.Drawing.Point(6, 150); + this.rbGDIPlus.Name = "rbGDIPlus"; + this.rbGDIPlus.Size = new System.Drawing.Size(50, 17); + this.rbGDIPlus.TabIndex = 17; + this.rbGDIPlus.TabStop = true; + this.rbGDIPlus.Text = "GDI+"; + this.rbGDIPlus.UseVisualStyleBackColor = true; + // // tpMisc // this.tpMisc.Controls.Add(this.label2); @@ -464,46 +509,26 @@ this.tpMisc.Text = "Misc"; this.tpMisc.UseVisualStyleBackColor = true; // - // groupBox3 + // rbD3D9 // - this.groupBox3.Controls.Add(this.label7); - this.groupBox3.Controls.Add(this.rbGDIPlus); - this.groupBox3.Controls.Add(this.label5); - this.groupBox3.Controls.Add(this.rbOpenGL); - this.groupBox3.Location = new System.Drawing.Point(4, 3); - this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(389, 165); - this.groupBox3.TabIndex = 16; - this.groupBox3.TabStop = false; + this.rbD3D9.AutoSize = true; + this.rbD3D9.Checked = true; + this.rbD3D9.Enabled = false; + this.rbD3D9.Location = new System.Drawing.Point(6, 10); + this.rbD3D9.Name = "rbD3D9"; + this.rbD3D9.Size = new System.Drawing.Size(73, 17); + this.rbD3D9.TabIndex = 19; + this.rbD3D9.TabStop = true; + this.rbD3D9.Text = "Direct3D9"; + this.rbD3D9.UseVisualStyleBackColor = true; // - // rbGDIPlus + // label8 // - this.rbGDIPlus.AutoSize = true; - this.rbGDIPlus.Checked = true; - this.rbGDIPlus.Location = new System.Drawing.Point(6, 89); - this.rbGDIPlus.Name = "rbGDIPlus"; - this.rbGDIPlus.Size = new System.Drawing.Size(50, 17); - this.rbGDIPlus.TabIndex = 17; - this.rbGDIPlus.TabStop = true; - this.rbGDIPlus.Text = "GDI+"; - this.rbGDIPlus.UseVisualStyleBackColor = true; - // - // label6 - // - this.label6.Location = new System.Drawing.Point(3, 171); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(359, 47); - this.label6.TabIndex = 18; - this.label6.Text = "Changes require restart of program to take effect.\r\n"; - // - // label7 - // - this.label7.Location = new System.Drawing.Point(24, 109); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(359, 47); - this.label7.TabIndex = 18; - this.label7.Text = " • Mainly for compatibility purposes\r\n • Missing some features\r\n • Works better o" + - "ver Remote Desktop, etc.\r\n"; + this.label8.Location = new System.Drawing.Point(24, 30); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(359, 47); + this.label8.TabIndex = 20; + this.label8.Text = " • Not working yet\r\n • Best compatibility\r\n • No support for custom shaders\r\n"; // // DisplayConfigLite // @@ -530,10 +555,10 @@ this.tpAR.ResumeLayout(false); this.tpAR.PerformLayout(); this.tpDispMethod.ResumeLayout(false); - this.tpMisc.ResumeLayout(false); - this.tpMisc.PerformLayout(); this.groupBox3.ResumeLayout(false); this.groupBox3.PerformLayout(); + this.tpMisc.ResumeLayout(false); + this.tpMisc.PerformLayout(); this.ResumeLayout(false); } @@ -579,5 +604,7 @@ private System.Windows.Forms.Label label7; private System.Windows.Forms.RadioButton rbGDIPlus; private System.Windows.Forms.TabPage tpMisc; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.RadioButton rbD3D9; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.cs b/BizHawk.Client.EmuHawk/config/DisplayConfigLite.cs index fd6f6f4c3f..98134ca6d8 100644 --- a/BizHawk.Client.EmuHawk/config/DisplayConfigLite.cs +++ b/BizHawk.Client.EmuHawk/config/DisplayConfigLite.cs @@ -38,6 +38,7 @@ namespace BizHawk.Client.EmuHawk.config rbOpenGL.Checked = Global.Config.DispMethod == Config.EDispMethod.OpenGL; rbGDIPlus.Checked = Global.Config.DispMethod == Config.EDispMethod.GdiPlus; + rbD3D9.Checked = Global.Config.DispMethod == Config.EDispMethod.SlimDX9; // null emulator config hack { @@ -113,6 +114,8 @@ namespace BizHawk.Client.EmuHawk.config Global.Config.DispMethod = Config.EDispMethod.OpenGL; if(rbGDIPlus.Checked) Global.Config.DispMethod = Config.EDispMethod.GdiPlus; + if(rbD3D9.Checked) + Global.Config.DispMethod = Config.EDispMethod.SlimDX9; Global.Config.DispUserFilterPath = PathSelection; GlobalWin.DisplayManager.RefreshUserShader(); diff --git a/BizHawk.sln b/BizHawk.sln index c81fc2f7f0..fce579a125 100644 --- a/BizHawk.sln +++ b/BizHawk.sln @@ -29,6 +29,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BizHawk.Client.DBMan", "Biz EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BizHawk.Bizware.BizwareGL.GdiPlus", "Bizware\BizHawk.Bizware.BizwareGL.GdiPlus\BizHawk.Bizware.BizwareGL.GdiPlus.csproj", "{337CA23E-65E7-44E1-9411-97EE08BB8116}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BizHawk.Bizware.BizwareGL.SlimDX", "Bizware\BizHawk.Bizware.BizwareGL.SlimDX\BizHawk.Bizware.BizwareGL.SlimDX.csproj", "{E6B436B1-A3CD-4C9A-8F76-5D7154726884}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -173,6 +175,18 @@ Global {337CA23E-65E7-44E1-9411-97EE08BB8116}.Release|Mixed Platforms.Build.0 = Release|Any CPU {337CA23E-65E7-44E1-9411-97EE08BB8116}.Release|Win32.ActiveCfg = Release|Any CPU {337CA23E-65E7-44E1-9411-97EE08BB8116}.Release|x86.ActiveCfg = Release|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Debug|Win32.ActiveCfg = Debug|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Release|Any CPU.Build.0 = Release|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Release|Win32.ActiveCfg = Release|Any CPU + {E6B436B1-A3CD-4C9A-8F76-5D7154726884}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -188,6 +202,7 @@ Global {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465} = {0540A9A6-977E-466D-8BD3-1D8590BD5282} {5160CFB1-5389-47C1-B7F6-8A0DC97641EE} = {0540A9A6-977E-466D-8BD3-1D8590BD5282} {337CA23E-65E7-44E1-9411-97EE08BB8116} = {0540A9A6-977E-466D-8BD3-1D8590BD5282} + {E6B436B1-A3CD-4C9A-8F76-5D7154726884} = {0540A9A6-977E-466D-8BD3-1D8590BD5282} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = BizHawk.Client.EmuHawk\BizHawk.Client.EmuHawk.csproj diff --git a/Bizware/BizHawk.Bizware.BizwareGL.GdiPlus/IGL_GdiPlus.cs b/Bizware/BizHawk.Bizware.BizwareGL.GdiPlus/IGL_GdiPlus.cs index 5dd3bdd024..dea33570f3 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL.GdiPlus/IGL_GdiPlus.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL.GdiPlus/IGL_GdiPlus.cs @@ -84,11 +84,10 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.GdiPlus public void Clear(OpenTK.Graphics.OpenGL.ClearBufferMask mask) { - - - } + public string API { get { return "GDIPLUS"; } } + public IBlendState CreateBlendState(BlendingFactorSrc colorSource, BlendEquationMode colorEquation, BlendingFactorDest colorDest, BlendingFactorSrc alphaSource, BlendEquationMode alphaEquation, BlendingFactorDest alphaDest) { @@ -106,7 +105,10 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.GdiPlus public IntPtr GenTexture() { return ResourceIDs.Alloc(ResourceIdManager.EResourceType.Texture); } - public void FreeTexture(IntPtr texHandle) { ResourceIDs.Free(texHandle); } + public void FreeTexture(Texture2d tex) + { + ResourceIDs.Free(tex.Id); + } public IntPtr GetEmptyHandle() { return new IntPtr(0); } public IntPtr GetEmptyUniformHandle() { return new IntPtr(-1); } @@ -214,7 +216,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.GdiPlus tw.SDBitmap = sdbmp; IntPtr id = GenTexture(); ResourceIDs.Lookup[id.ToInt32()] = tw; - return new Texture2d(this, id, bitmap.Width, bitmap.Height); + return new Texture2d(this, id, null, bitmap.Width, bitmap.Height); } public Texture2d LoadTexture(Stream stream) @@ -248,7 +250,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.GdiPlus var tw = new TextureWrapper(); tw.SDBitmap = sdbmp; ResourceIDs.Lookup[id.ToInt32()] = tw; - return new Texture2d(this, id, bmp.Width, bmp.Height); + return new Texture2d(this, id, null, bmp.Width, bmp.Height); } public unsafe BitmapBuffer ResolveTexture2d(Texture2d tex) diff --git a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs index 06142684b9..89b07af065 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs @@ -42,6 +42,8 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK //NOTE: this throws EGL exceptions anyway. I'm going to ignore it and whine about it later } + public string API { get { return "OPENGL"; } } + public IGL_TK() { //make an 'offscreen context' so we can at least do things without having to create a window @@ -87,7 +89,10 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK } public IntPtr GenTexture() { return new IntPtr(GL.GenTexture()); } - public void FreeTexture(IntPtr texHandle) { GL.DeleteTexture(texHandle.ToInt32()); } + public void FreeTexture(Texture2d tex) + { + GL.DeleteTexture(tex.Id.ToInt32()); + } public IntPtr GetEmptyHandle() { return new IntPtr(0); } public IntPtr GetEmptyUniformHandle() { return new IntPtr(-1); } @@ -367,13 +372,13 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK public Texture2d CreateTexture(int width, int height) { - IntPtr id = (this as IGL).GenTexture(); - return new Texture2d(this, id, width, height); + IntPtr id = GenTexture(); + return new Texture2d(this, id, null, width, height); } public Texture2d WrapGLTexture2d(IntPtr glTexId, int width, int height) { - return new Texture2d(this as IGL,glTexId, width, height); + return new Texture2d(this as IGL, glTexId, null, width, height); } public void LoadTextureData(Texture2d tex, BitmapBuffer bmp) @@ -399,8 +404,8 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK public unsafe RenderTarget CreateRenderTarget(int w, int h) { //create a texture for it - IntPtr texid = (this as IGL).GenTexture(); - Texture2d tex = new Texture2d(this, texid, w, h); + IntPtr texid = GenTexture(); + Texture2d tex = new Texture2d(this, texid, null, w, h); GL.BindTexture(TextureTarget.Texture2D,texid.ToInt32()); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, w, h, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); tex.SetMagFilter(TextureMagFilter.Nearest); @@ -438,10 +443,10 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK public Texture2d LoadTexture(BitmapBuffer bmp) { Texture2d ret = null; - IntPtr id = (this as IGL).GenTexture(); + IntPtr id = GenTexture(); try { - ret = new Texture2d(this, id, bmp.Width, bmp.Height); + ret = new Texture2d(this, id, null, bmp.Width, bmp.Height); GL.BindTexture(TextureTarget.Texture2D, id.ToInt32()); //picking a color order that matches doesnt seem to help, any. maybe my driver is accelerating it, or maybe it isnt a big deal. but its something to study on another day GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp.Width, bmp.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero); @@ -449,7 +454,7 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK } catch { - (this as IGL).FreeTexture(id); + GL.DeleteTexture(id.ToInt32()); throw; } diff --git a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/RetroShader.cs b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/RetroShader.cs index 20101be5df..5dc1275a8a 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/RetroShader.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/RetroShader.cs @@ -18,9 +18,9 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK Owner = owner as IGL_TK; VertexLayout = owner.CreateVertexLayout(); - VertexLayout.DefineVertexAttribute("VertexCoord", 0, 4, VertexAttribPointerType.Float, false, 40, 0); //VertexCoord - VertexLayout.DefineVertexAttribute("ColorShit", 1, 4, VertexAttribPointerType.Float, false, 40, 16); //COLOR - VertexLayout.DefineVertexAttribute("TexCoord", 2, 2, VertexAttribPointerType.Float, false, 40, 32); //TexCoord (is this vec2 or vec4? the glsl converted from cg had vec4 but the cg had vec2...) + VertexLayout.DefineVertexAttribute("VertexCoord", 0, 4, VertexAttribPointerType.Float, AttributeUsage.Unspecified, false, 40, 0); //VertexCoord + VertexLayout.DefineVertexAttribute("ColorShit", 1, 4, VertexAttribPointerType.Float, AttributeUsage.Unspecified, false, 40, 16); //COLOR + VertexLayout.DefineVertexAttribute("TexCoord", 2, 2, VertexAttribPointerType.Float, AttributeUsage.Unspecified, false, 40, 32); //TexCoord (is this vec2 or vec4? the glsl converted from cg had vec4 but the cg had vec2...) VertexLayout.Close(); string vsSource = "#define VERTEX\r\n" + source; diff --git a/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/BizHawk.Bizware.BizwareGL.SlimDX.csproj b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/BizHawk.Bizware.BizwareGL.SlimDX.csproj new file mode 100644 index 0000000000..d0385b0a19 --- /dev/null +++ b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/BizHawk.Bizware.BizwareGL.SlimDX.csproj @@ -0,0 +1,79 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {E6B436B1-A3CD-4C9A-8F76-5D7154726884} + Library + Properties + BizHawk.Bizware.BizwareGL.SlimDX + BizHawk.Bizware.BizwareGL.SlimDX + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + x86 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + + + + False + ..\..\References\OpenTK.dll + + + False + ..\..\References\SlimDX.dll + + + + + + + + + + + + + + {866F8D13-0678-4FF9-80A4-A3993FD4D8A3} + BizHawk.Common + + + {9F84A0B2-861E-4EF4-B89B-5E2A3F38A465} + BizHawk.Bizware.BizwareGL + + + + + Component + + + + + + \ No newline at end of file diff --git a/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/GLControlWrapper_SlimDX9.cs b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/GLControlWrapper_SlimDX9.cs new file mode 100644 index 0000000000..c5cbf17d30 --- /dev/null +++ b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/GLControlWrapper_SlimDX9.cs @@ -0,0 +1,71 @@ +using System; +using System.Drawing; +using System.Reflection; +using System.Threading; +using System.IO; +using System.Collections.Generic; +using System.Windows.Forms; + +using BizHawk.Bizware.BizwareGL; +using SlimDX.Direct3D9; + +namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX +{ + public class GLControlWrapper_SlimDX9 : Control, IGraphicsControl + { + + public GLControlWrapper_SlimDX9(IGL_SlimDX9 sdx) + { + this.sdx = sdx; + + //uhhh not sure what we need to be doing here + //SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + SetStyle(ControlStyles.Opaque, true); + SetStyle(ControlStyles.UserMouse, true); + + Resize += new EventHandler(GLControlWrapper_SlimDX_Resize); + } + + public bool Vsync; + + void GLControlWrapper_SlimDX_Resize(object sender, EventArgs e) + { + sdx.RefreshControlSwapChain(this); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + //if(MyBufferedGraphics != null) + } + + IGL_SlimDX9 sdx; + + public Control Control { get { return this; } } + public SwapChain SwapChain; + + public void SetVsync(bool state) + { + Vsync = state; + sdx.RefreshControlSwapChain(this); + } + + public void Begin() + { + + } + + public void End() + { + + } + + public void SwapBuffers() + { + + } + } +} \ No newline at end of file diff --git a/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs new file mode 100644 index 0000000000..53a2f71f3d --- /dev/null +++ b/Bizware/BizHawk.Bizware.BizwareGL.SlimDX/IGL_SlimDX9.cs @@ -0,0 +1,474 @@ +using System; +using System.Text; +using System.IO; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Windows.Forms; + +using swf = System.Windows.Forms; +using sd = System.Drawing; +using sdi = System.Drawing.Imaging; + +using BizHawk.Bizware.BizwareGL; + +using SlimDX.Direct3D9; +using d3d9=SlimDX.Direct3D9; +using OpenTK; +using OpenTK.Graphics; +using gl=OpenTK.Graphics.OpenGL; + +namespace BizHawk.Bizware.BizwareGL.Drivers.SlimDX +{ + + public class IGL_SlimDX9 : IGL + { + static Direct3D d3d; + private Device dev; + INativeWindow OffscreenNativeWindow; + + public string API { get { return "D3D9"; } } + + public IGL_SlimDX9() + { + if (d3d == null) + { + d3d = new Direct3D(); + } + + //make an 'offscreen context' so we can at least do things without having to create a window + OffscreenNativeWindow = new OpenTK.NativeWindow(); + OffscreenNativeWindow.ClientSize = new sd.Size(8, 8); + + CreateDevice(); + } + + private void DestroyDevice() + { + if (dev != null) + { + dev.Dispose(); + dev = null; + } + } + + public void CreateDevice() + { + DestroyDevice(); + + //just create some present params so we can get the device created + var pp = new PresentParameters + { + BackBufferWidth = 8, + BackBufferHeight = 8, + DeviceWindowHandle = OffscreenNativeWindow.WindowInfo.Handle, + PresentationInterval = PresentInterval.Immediate + }; + + var flags = CreateFlags.SoftwareVertexProcessing; + if ((d3d.GetDeviceCaps(0, DeviceType.Hardware).DeviceCaps & DeviceCaps.HWTransformAndLight) != 0) + { + flags = CreateFlags.HardwareVertexProcessing; + } + dev = new Device(d3d, 0, DeviceType.Hardware, pp.DeviceWindowHandle, flags, pp); + } + + void IDisposable.Dispose() + { + } + + public void Clear(OpenTK.Graphics.OpenGL.ClearBufferMask mask) + { + + + + } + + public IBlendState CreateBlendState(gl.BlendingFactorSrc colorSource, gl.BlendEquationMode colorEquation, gl.BlendingFactorDest colorDest, + gl.BlendingFactorSrc alphaSource, gl.BlendEquationMode alphaEquation, gl.BlendingFactorDest alphaDest) + { + return null; + } + + public void SetClearColor(sd.Color color) + { + + } + + public unsafe void BindArrayData(void* pData) + { + } + + + + public void FreeTexture(Texture2d tex) { + var dtex = tex.Opaque as d3d9.Texture; + dtex.Dispose(); + } + public IntPtr GetEmptyHandle() { return new IntPtr(0); } + public IntPtr GetEmptyUniformHandle() { return new IntPtr(-1); } + + class ShaderWrapper + { + public d3d9.ConstantTable ct; + public d3d9.VertexShader vs; + public d3d9.PixelShader ps; + } + + public Shader CreateFragmentShader(string source, bool required) + { + ShaderWrapper sw = new ShaderWrapper(); + string errors; + using (var bytecode = d3d9.ShaderBytecode.Compile(source, null, null, "psmain", "ps_2_0", ShaderFlags.None, out errors)) + { + sw.ct = bytecode.ConstantTable; + sw.ps = new PixelShader(dev, bytecode); + } + + Shader s = new Shader(this, IntPtr.Zero, true); + s.Opaque = sw; + return s; + } + + public Shader CreateVertexShader(string source, bool required) + { + ShaderWrapper sw = new ShaderWrapper(); + string errors; + using (var bytecode = d3d9.ShaderBytecode.Compile(source, null, null, "vsmain", "vs_2_0", ShaderFlags.None, out errors)) + { + sw.ct = bytecode.ConstantTable; + sw.vs = new VertexShader(dev, bytecode); + } + + Shader s = new Shader(this, IntPtr.Zero, true); + s.Opaque = sw; + return s; + } + + public void FreeShader(IntPtr shader) { } + + public void SetBlendState(IBlendState rsBlend) + { + //TODO for real + } + + class MyBlendState : IBlendState { } + static MyBlendState _rsBlendNone = new MyBlendState(), _rsBlendNormal = new MyBlendState(); + + public IBlendState BlendNone { get { return _rsBlendNone; } } + public IBlendState BlendNormal { get { return _rsBlendNormal; } } + + public Pipeline CreatePipeline(VertexLayout vertexLayout, Shader vertexShader, Shader fragmentShader, bool required) + { + VertexElement[] ves = new VertexElement[vertexLayout.Items.Count]; + foreach (var kvp in vertexLayout.Items) + { + var item = kvp.Value; + d3d9.DeclarationType decltype = DeclarationType.Float1; + switch (item.AttribType) + { + case gl.VertexAttribPointerType.Float: + if (item.Components == 1) decltype = DeclarationType.Float1; + else if (item.Components == 2) decltype = DeclarationType.Float2; + else if (item.Components == 3) decltype = DeclarationType.Float3; + else if (item.Components == 4) decltype = DeclarationType.Float4; + else throw new NotSupportedException(); + break; + default: + throw new NotSupportedException(); + } + + d3d9.DeclarationUsage usage = DeclarationUsage.Position; + byte usageIndex = 0; + switch(item.Usage) + { + case AttributeUsage.Position: + usage = DeclarationUsage.Position; + break; + case AttributeUsage.Texcoord0: + usage = DeclarationUsage.TextureCoordinate; + break; + case AttributeUsage.Texcoord1: + usage = DeclarationUsage.TextureCoordinate; + usageIndex = 1; + break; + case AttributeUsage.Color0: + usage = DeclarationUsage.Color; + break; + default: + throw new NotSupportedException(); + } + + ves[kvp.Key] = new VertexElement(0, (short)item.Offset, decltype, DeclarationMethod.Default, usage, usageIndex); + } + + var pw = new PipelineWrapper(); + pw.VertexDeclaration = new VertexDeclaration(dev, ves); + + Pipeline pipeline = new Pipeline(this,IntPtr.Zero,true, vertexLayout, new List()); + pipeline.Opaque = pw; + + return pipeline; + } + + class PipelineWrapper + { + public d3d9.VertexDeclaration VertexDeclaration; + } + + public VertexLayout CreateVertexLayout() { return new VertexLayout(this, new IntPtr(0)); } + + public void BindTexture2d(Texture2d tex) + { + + } + + public void SetTextureWrapMode(Texture2d tex, bool clamp) + { + + } + + public void DrawArrays(PrimitiveType mode, int first, int count) + { + + } + + public void BindPipeline(Pipeline pipeline) + { + + } + + public void SetPipelineUniform(PipelineUniform uniform, bool value) + { + + } + + public unsafe void SetPipelineUniformMatrix(PipelineUniform uniform, Matrix4 mat, bool transpose) + { + } + + public unsafe void SetPipelineUniformMatrix(PipelineUniform uniform, ref Matrix4 mat, bool transpose) + { + } + + public void SetPipelineUniform(PipelineUniform uniform, Vector4 value) + { + } + + public void SetPipelineUniform(PipelineUniform uniform, Vector2 value) + { + } + + public void SetPipelineUniform(PipelineUniform uniform, float value) + { + } + + public unsafe void SetPipelineUniform(PipelineUniform uniform, Vector4[] values) + { + } + + public void SetPipelineUniformSampler(PipelineUniform uniform, IntPtr texHandle) + { + + } + + public void TexParameter2d(gl.TextureParameterName pname, int param) + { + //if (CurrentBoundTexture == null) + // return; + + //TextureWrapper tw = TextureWrapperForTexture(CurrentBoundTexture); + //if (pname == TextureParameterName.TextureMinFilter) + // tw.MinFilter = (TextureMinFilter)param; + //if (pname == TextureParameterName.TextureMagFilter) + // tw.MagFilter = (TextureMagFilter)param; + } + + public Texture2d LoadTexture(sd.Bitmap bitmap) + { + using (var bmp = new BitmapBuffer(bitmap, new BitmapLoadOptions())) + return (this as IGL).LoadTexture(bmp); + } + + public Texture2d LoadTexture(Stream stream) + { + using (var bmp = new BitmapBuffer(stream, new BitmapLoadOptions())) + return (this as IGL).LoadTexture(bmp); + } + + public Texture2d CreateTexture(int width, int height) + { + return null; + } + + public Texture2d WrapGLTexture2d(IntPtr glTexId, int width, int height) + { + //TODO - need to rip the texturedata. we had code for that somewhere... + return null; + } + + public void LoadTextureData(Texture2d tex, BitmapBuffer bmp) + { + sdi.BitmapData bmp_data = bmp.LockBits(); + d3d9.Texture dtex = tex.Opaque as d3d9.Texture; + var dr = dtex.LockRectangle(0, LockFlags.None); + + //TODO - do we need to handle odd sizes, weird pitches here? + dr.Data.WriteRange(bmp_data.Scan0, bmp.Width * bmp.Height); + dtex.UnlockRectangle(0); + bmp.UnlockBits(bmp_data); + } + + + public Texture2d LoadTexture(BitmapBuffer bmp) + { + var tex = new d3d9.Texture(dev, bmp.Width, bmp.Height, 1, d3d9.Usage.None, d3d9.Format.A8R8G8B8, d3d9.Pool.Managed); + var ret = new Texture2d(this, IntPtr.Zero, tex, bmp.Width, bmp.Height); + LoadTextureData(ret, bmp); + return ret; + } + + public unsafe BitmapBuffer ResolveTexture2d(Texture2d tex) + { + //todo + return null; + } + + public Texture2d LoadTexture(string path) + { + //todo + //using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) + // return (this as IGL).LoadTexture(fs); + return null; + } + + public Matrix4 CreateGuiProjectionMatrix(int w, int h) + { + return CreateGuiProjectionMatrix(new sd.Size(w, h)); + } + + public Matrix4 CreateGuiViewMatrix(int w, int h) + { + return CreateGuiViewMatrix(new sd.Size(w, h)); + } + + public Matrix4 CreateGuiProjectionMatrix(sd.Size dims) + { + Matrix4 ret = Matrix4.Identity; + ret.M11 = 2.0f / (float)dims.Width; + ret.M22 = 2.0f / (float)dims.Height; + return ret; + } + + public Matrix4 CreateGuiViewMatrix(sd.Size dims) + { + Matrix4 ret = Matrix4.Identity; + ret.M22 = -1.0f; + ret.M41 = -(float)dims.Width * 0.5f; // -0.5f; + ret.M42 = (float)dims.Height * 0.5f; // +0.5f; + return ret; + } + + public void SetViewport(int x, int y, int width, int height) + { + } + + public void SetViewport(int width, int height) + { + } + + public void SetViewport(sd.Size size) + { + SetViewport(size.Width, size.Height); + } + + public void SetViewport(swf.Control control) + { + + } + + + public void BeginControl(GLControlWrapper_SlimDX9 control) + { + + } + + public void EndControl(GLControlWrapper_SlimDX9 control) + { + + } + + public void SwapControl(GLControlWrapper_SlimDX9 control) + { + } + + public void FreeRenderTarget(RenderTarget rt) + { + //int id = rt.Id.ToInt32(); + //var rtw = ResourceIDs.Lookup[id] as RenderTargetWrapper; + //rtw.Target.Dispose(); + //ResourceIDs.Free(rt.Id); + } + + public unsafe RenderTarget CreateRenderTarget(int w, int h) + { + //Texture2d tex = null; + //var rt = new RenderTarget(this, ResourceIDs.Alloc(ResourceIdManager.EResourceType.RenderTarget), tex); + //int id = rt.Id.ToInt32(); + //RenderTargetWrapper rtw = new RenderTargetWrapper(this); + //rtw.Target = rt; + //ResourceIDs.Lookup[id] = rtw; + //return rt; + return null; + } + + public void BindRenderTarget(RenderTarget rt) + { + //if (rt == null) + //{ + // //null means to use the default RT for the current control + // CurrentRenderTargetWrapper = CurrentControl.RenderTargetWrapper; + //} + //else + //{ + // CurrentRenderTargetWrapper = RenderTargetWrapperForRt(rt); + //} + } + + public void RefreshControlSwapChain(GLControlWrapper_SlimDX9 control) + { + if (control.SwapChain != null) + { + control.SwapChain.Dispose(); + control.SwapChain = null; + } + + var pp = new PresentParameters + { + BackBufferWidth = Math.Max(8,control.ClientSize.Width), + BackBufferHeight = Math.Max(8, control.ClientSize.Height), + BackBufferCount = 2, + BackBufferFormat = Format.X8R8G8B8, + DeviceWindowHandle = control.Handle, + Windowed = true, + PresentationInterval = control.Vsync ? PresentInterval.One : PresentInterval.Immediate + }; + + control.SwapChain = new SwapChain(dev, pp); + } + + public IGraphicsControl Internal_CreateGraphicsControl() + { + var ret = new GLControlWrapper_SlimDX9(this); + RefreshControlSwapChain(ret); + return ret; + } + + public void DrawArrays(gl.PrimitiveType mode, int first, int count) + { + + } + + } //class IGL_SlimDX + +} diff --git a/Bizware/BizHawk.Bizware.BizwareGL/AttributeUsage.cs b/Bizware/BizHawk.Bizware.BizwareGL/AttributeUsage.cs new file mode 100644 index 0000000000..10ad8a3cd9 --- /dev/null +++ b/Bizware/BizHawk.Bizware.BizwareGL/AttributeUsage.cs @@ -0,0 +1,10 @@ +namespace BizHawk.Bizware.BizwareGL +{ + public enum AttributeUsage + { + Unspecified, + Position, + Color0, + Texcoord0, Texcoord1, + } +} \ No newline at end of file diff --git a/Bizware/BizHawk.Bizware.BizwareGL/BizHawk.Bizware.BizwareGL.csproj b/Bizware/BizHawk.Bizware.BizwareGL/BizHawk.Bizware.BizwareGL.csproj index 1756272dc4..14538d4f4a 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/BizHawk.Bizware.BizwareGL.csproj +++ b/Bizware/BizHawk.Bizware.BizwareGL/BizHawk.Bizware.BizwareGL.csproj @@ -50,6 +50,7 @@ + diff --git a/Bizware/BizHawk.Bizware.BizwareGL/GraphicsControl.cs b/Bizware/BizHawk.Bizware.BizwareGL/GraphicsControl.cs index 6a37ba2d10..d648bfc887 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/GraphicsControl.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/GraphicsControl.cs @@ -19,7 +19,7 @@ namespace BizHawk.Bizware.BizwareGL //in case we need it //GLControl.GetType().GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(GLControl, new object[] { System.Windows.Forms.ControlStyles.UserMouse, true }); - + IGC = owner.Internal_CreateGraphicsControl(); Managed = IGC as Control; diff --git a/Bizware/BizHawk.Bizware.BizwareGL/GuiRenderer.cs b/Bizware/BizHawk.Bizware.BizwareGL/GuiRenderer.cs index 815c8c9107..1d18c8e2ab 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/GuiRenderer.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/GuiRenderer.cs @@ -26,16 +26,29 @@ namespace BizHawk.Bizware.BizwareGL Owner = owner; VertexLayout = owner.CreateVertexLayout(); - VertexLayout.DefineVertexAttribute("aPosition", 0, 2, VertexAttribPointerType.Float, false, 32, 0); - VertexLayout.DefineVertexAttribute("aTexcoord", 1, 2, VertexAttribPointerType.Float, false, 32, 8); - VertexLayout.DefineVertexAttribute("aColor", 2, 4, VertexAttribPointerType.Float, false, 32, 16); + VertexLayout.DefineVertexAttribute("aPosition", 0, 2, VertexAttribPointerType.Float, AttributeUsage.Position, false, 32, 0); + VertexLayout.DefineVertexAttribute("aTexcoord", 1, 2, VertexAttribPointerType.Float, AttributeUsage.Texcoord0, false, 32, 8); + VertexLayout.DefineVertexAttribute("aColor", 2, 4, VertexAttribPointerType.Float, AttributeUsage.Texcoord1, false, 32, 16); VertexLayout.Close(); _Projection = new MatrixStack(); _Modelview = new MatrixStack(); - var vs = Owner.CreateVertexShader(DefaultVertexShader,true); - var ps = Owner.CreateFragmentShader(DefaultPixelShader, true); + string psProgram, vsProgram; + + if (owner.API == "D3D9") + { + vsProgram = DefaultShader_d3d9; + psProgram = DefaultShader_d3d9; + } + else + { + vsProgram = DefaultVertexShader_gl; + psProgram = DefaultPixelShader_gl; + } + + var vs = Owner.CreateVertexShader(vsProgram, true); + var ps = Owner.CreateFragmentShader(psProgram, true); CurrPipeline = DefaultPipeline = Owner.CreatePipeline(VertexLayout, vs, ps, true); } @@ -346,7 +359,54 @@ namespace BizHawk.Bizware.BizwareGL bool BlendStateSet; #endif - public readonly string DefaultVertexShader = @" + + public readonly string DefaultShader_d3d9 = @" +float4x4 um44Modelview, um44Projection; +float4 uModulateColor; + +bool uSamplerEnable; +texture2D texture0; +sampler uSampler0 = sampler_state { Texture = (texture0); }; + +struct VS_INPUT +{ + float2 aPosition : POSITION; + float2 aTexcoord : TEXCOORD0; + float4 aColor : TEXCOORD1; +}; + +struct VS_OUTPUT +{ + float4 vPosition : POSITION; + float2 vTexcoord0 : TEXCOORD0; + float4 vCornerColor : TEXCOORD1; +}; + +struct PS_INPUT +{ + float2 vTexcoord0 : TEXCOORD0; + float4 vCornerColor : TEXCOORD1; +}; + +VS_OUTPUT vsmain(VS_INPUT src) +{ + VS_OUTPUT dst; + float4 temp = float4(src.aPosition,0,1); + dst.vPosition = mul(mul(temp,um44Modelview),um44Projection); + dst.vTexcoord0 = src.aTexcoord; + dst.vCornerColor = src.aColor * uModulateColor; + return dst; +} + +float4 psmain(PS_INPUT src) : COLOR +{ + float4 temp = src.vCornerColor; + if(uSamplerEnable) temp *= tex2D(uSampler0,src.vTexcoord0); + return temp; +} +"; + + public readonly string DefaultVertexShader_gl = @" #version 110 //opengl 2.0 ~ 2004 uniform mat4 um44Modelview, um44Projection; uniform vec4 uModulateColor; @@ -366,7 +426,7 @@ void main() vCornerColor = aColor * uModulateColor; }"; - public readonly string DefaultPixelShader = @" + public readonly string DefaultPixelShader_gl = @" #version 110 //opengl 2.0 ~ 2004 uniform bool uSamplerEnable; uniform sampler2D uSampler0; diff --git a/Bizware/BizHawk.Bizware.BizwareGL/IGL.cs b/Bizware/BizHawk.Bizware.BizwareGL/IGL.cs index 7f609e197b..d9b98fd91d 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/IGL.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/IGL.cs @@ -30,11 +30,6 @@ namespace BizHawk.Bizware.BizwareGL /// void SetClearColor(Color color); - /// - /// generates a texture handle - /// - IntPtr GenTexture(); - /// /// returns an empty handle /// @@ -121,9 +116,9 @@ namespace BizHawk.Bizware.BizwareGL void FreeShader(IntPtr shader); /// - /// frees the provided texture handle + /// frees the provided texture /// - void FreeTexture(IntPtr texHandle); + void FreeTexture(Texture2d tex); /// /// resolves the texture into a new BitmapBuffer @@ -268,5 +263,10 @@ namespace BizHawk.Bizware.BizwareGL void BindRenderTarget(RenderTarget rt); IGraphicsControl Internal_CreateGraphicsControl(); + + /// + /// returns a string representing the API employed by this context + /// + string API { get; } } } diff --git a/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs b/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs index 70ae1a48c5..a32bce24a0 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/Pipeline.cs @@ -69,6 +69,7 @@ namespace BizHawk.Bizware.BizwareGL public IntPtr Id { get; private set; } public VertexLayout VertexLayout { get; private set; } public bool Available { get; private set; } + public object Opaque; public void Dispose() { diff --git a/Bizware/BizHawk.Bizware.BizwareGL/Shader.cs b/Bizware/BizHawk.Bizware.BizwareGL/Shader.cs index 55a8998014..276f3e924a 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/Shader.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/Shader.cs @@ -19,6 +19,7 @@ namespace BizHawk.Bizware.BizwareGL public IntPtr Id { get; private set; } public bool Disposed { get; private set; } public bool Available { get; private set; } + public object Opaque; public void Dispose() { diff --git a/Bizware/BizHawk.Bizware.BizwareGL/Texture2d.cs b/Bizware/BizHawk.Bizware.BizwareGL/Texture2d.cs index 51509e510d..633fe04d76 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/Texture2d.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/Texture2d.cs @@ -23,14 +23,15 @@ namespace BizHawk.Bizware.BizwareGL public void Dispose() { - Owner.FreeTexture(Id); + Owner.FreeTexture(this); Id = Owner.GetEmptyHandle(); } - public Texture2d(IGL owner, IntPtr id, int width, int height) + public Texture2d(IGL owner, IntPtr id, object opaque, int width, int height) { Owner = owner; Id = id; + Opaque = opaque; Width = width; Height = height; } @@ -70,6 +71,7 @@ namespace BizHawk.Bizware.BizwareGL public IGL Owner { get; private set; } public IntPtr Id { get; private set; } + public object Opaque { get; private set; } //note.. this was a lame idea. convenient, but weird. lets just change this back to ints. public float Width { get; private set; } diff --git a/Bizware/BizHawk.Bizware.BizwareGL/VertexLayout.cs b/Bizware/BizHawk.Bizware.BizwareGL/VertexLayout.cs index a83b16e33e..8caeb3d679 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL/VertexLayout.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL/VertexLayout.cs @@ -23,11 +23,11 @@ namespace BizHawk.Bizware.BizwareGL //nothing to do yet.. } - public void DefineVertexAttribute(string name, int index, int components, VertexAttribPointerType attribType, bool normalized, int stride, int offset = 0) + public void DefineVertexAttribute(string name, int index, int components, VertexAttribPointerType attribType, AttributeUsage usage, bool normalized, int stride, int offset = 0) { if (Closed) throw new InvalidOperationException("Type is Closed and is now immutable."); - Items[index] = new LayoutItem { Name = name, Components = components, AttribType = attribType, Normalized = normalized, Stride = stride, Offset = offset }; + Items[index] = new LayoutItem { Name = name, Components = components, AttribType = attribType, Usage = usage, Normalized = normalized, Stride = stride, Offset = offset }; } /// @@ -46,6 +46,7 @@ namespace BizHawk.Bizware.BizwareGL public bool Normalized { get; internal set; } public int Stride { get; internal set; } public int Offset { get; internal set; } + public AttributeUsage Usage { get; internal set; } } public class MyDictionary : WorkingDictionary