ID3DXEffect::OnLostDevice()

I fixed a bug yesterday in Snowball related to a lost graphics device. I noticed that when I would use CTRL + ALT + DELETE, my apps were crashing. Turned out it was due to not recovering properly from a lost device.

The root of the problem was that I needed to call the ID3DXEffect::OnLostDevice() method when the device was being lost. This allows the effect to recover from the lost device. I've made the Effect class in Snowball now do this automatically.

Getting started with SlimDX

March 31, 2011.netdirectx

*Update 2013-09-29: At this point SlimDX is quite out of date and I would recommend starting with SharpDX.

Since I tried OpenTK, I decided to give SlimDX a try as well. So, here's a simple getting started app:

using System;
using System.Drawing;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct3D9;
using SlimDX.Windows;

namespace SlimDXApp1
{
    public partial class SlimDXApp1Form : RenderForm
    {
        struct Vertex
        {
            public Vector4 Position;
            public int Color;
        }

        Device device;
        VertexDeclaration vertexDeclaration;
        
        public SlimDXApp1Form()
            : base("SlimDXApp1")
        {
            this.ClientSize = new Size(800, 600);

            this.device = new Device(new Direct3D(), 0, DeviceType.Hardware, this.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters()
            {
                BackBufferWidth = this.ClientSize.Width,
                BackBufferHeight = this.ClientSize.Height
            });

            this.vertexDeclaration = new VertexDeclaration(this.device, new[] {
                new VertexElement(0, 0, DeclarationType.Float4, DeclarationMethod.Default, DeclarationUsage.PositionTransformed, 0),
                new VertexElement(0, 16, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
                VertexElement.VertexDeclarationEnd
            });
        }

        public void Run()
        {
            MessagePump.Run(this, () =>
            {
                this.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
                this.device.BeginScene();

                this.device.VertexDeclaration = this.vertexDeclaration;

                this.device.DrawUserPrimitives<Vertex>(PrimitiveType.TriangleList, 1, new[] {
                    new Vertex() { Color = Color.Red.ToArgb(), Position = new Vector4(400.0f, 100.0f, 0.5f, 1.0f) },
                    new Vertex() { Color = Color.Blue.ToArgb(), Position = new Vector4(650.0f, 500.0f, 0.5f, 1.0f) },
                    new Vertex() { Color = Color.Green.ToArgb(), Position = new Vector4(150.0f, 500.0f, 0.5f, 1.0f) }
                });
                
                this.device.EndScene();
                this.device.Present();
            });
        }

        [STAThread]
        static void Main()
        {
            SlimDXApp1Form form = new SlimDXApp1Form();
            form.Run();

            // Cleans up COM handles
            foreach(var item in ObjectTable.Objects)
                item.Dispose();
        }
    }
}