Summary description for D3DGpuProgramManager.
Inheritance: Axiom.Graphics.GpuProgramManager
Ejemplo n.º 1
0
        public override void Shutdown()
        {
            base.Shutdown();

            _activeD3DDriver = null;


            if (_deviceManager != null)
            {
                _deviceManager.Dispose();
                _deviceManager = null;
            }

            if (_driverList != null)
            {
                _driverList.Dispose();
                _driverList = null;
            }

            _activeD3DDriver = null;

            LogManager.Instance.Write( "D3D9 : Shutting down cleanly." );

            if (textureManager != null)
            {
                textureManager.Dispose();
                textureManager = null;
            }

            if (_hardwareBufferManager != null)
            {
                _hardwareBufferManager.Dispose();
                _hardwareBufferManager = null;
            }

            if ( _gpuProgramManager == null )
                return;
 
            _gpuProgramManager.Dispose();
            _gpuProgramManager = null;
        }
Ejemplo n.º 2
0
        public D3DRenderSystem()
        {
            LogManager.Instance.Write("D3D9 : {0} created.", Name);

            // update singleton access pointer.
            _D3D9RenderSystem = this;

            // set pointers to NULL
            _pD3D = null;
            _driverList = null;
            _activeD3DDriver = null;
            textureManager = null;
            _hardwareBufferManager = null;
            _gpuProgramManager = null;
            _useNVPerfHUD = false;
            _hlslProgramFactory = null;
            _deviceManager = null;
            //_perStageConstantSupport = false;

            // Create the resource manager.
            _resourceManager = new D3D9ResourceManager();

            // init lights
            for (var i = 0; i < MaxLights; i++)
                lights[i] = null;
            
            // Create our Direct3D object
            _pD3D = new Direct3D();
            if (_pD3D == null)
                throw new AxiomException( "Failed to create Direct3D9 object" );

            InitConfigOptions();

            // fsaa options
            _fsaaHint = "";
            _fsaaSamples = 0;

            // init the texture stage descriptions
            for ( var i = 0; i < Config.MaxTextureLayers; i++ )
            {
                _texStageDesc[ i ].autoTexCoordType = TexCoordCalcMethod.None;
                _texStageDesc[ i ].coordIndex = 0;
                _texStageDesc[ i ].texType = D3DTextureType.Normal;
                _texStageDesc[ i ].tex = null;
                _texStageDesc[ i ].vertexTex = null;
            }
        }
        public override RenderWindow CreateRenderWindow(string name, int width, int height, bool isFullscreen, params object[] miscParams)
        {
            // Check we're not creating a secondary window when the primary
            // was fullscreen
            if (primaryWindow != null && primaryWindow.IsFullScreen) {
                throw new Exception("Cannot create secondary windows when the primary is full screen");
            } else if (primaryWindow != null && isFullscreen) {
                throw new Exception("Cannot create full screen secondary windows");
            }

            // Make sure we don't already have a render target of the
            // same name as the one supplied
            foreach (RenderTarget x in renderTargets) {
                if (x.Name == name)
                    throw new Exception("A render target of the same name '" + name +
                                        "' already exists.  You cannot create a new window with this name.");
            }

            RenderWindow win = new D3DRenderWindow(activeD3DDriver, primaryWindow != null);
            // create the window
            win.Create(name, width, height, isFullscreen, miscParams);
            // add the new render target
            AttachRenderTarget(win);

            // If this is the first window, get the D3D device and create the texture manager
            if (primaryWindow == null) {
                primaryWindow = (D3DRenderWindow)win;
                device = (Device)win.GetCustomAttribute("D3DDEVICE");

                // by creating our texture manager, singleton TextureManager will hold our implementation
                textureManager = new D3DTextureManager(device);

                // by creating our Gpu program manager, singleton GpuProgramManager will hold our implementation
                gpuProgramMgr = new D3DGpuProgramManager(device);

                // intializes the HardwareBufferManager singleton
                hardwareBufferManager = new D3DHardwareBufferManager(device);

                // Initialise the capabilities structures
                InitCapabilities();

                CreateAndApplyCache();
            } else {
                secondaryWindows.Add(win);
            }
            return win;
        }
        public override RenderWindow Initialize(bool autoCreateWindow, string windowTitle)
        {
            LogManager.Instance.Write("[D3D9] : Subsystem Initializing");

            // Axiom specific
            WindowEventMonitor.Instance.MessagePump = Win32MessageHandling.MessagePump;

            // Init using current settings
            _activeD3DDriver = D3DHelper.GetDriverInfo(_pD3D)[ConfigOptions["Rendering Device"].Value];
            if (_activeD3DDriver == null)
                throw new ArgumentException("Problems finding requested Direct3D driver!");


            driverVersion.Major = _activeD3DDriver.AdapterIdentifier.DriverVersion.Major;
            driverVersion.Minor = _activeD3DDriver.AdapterIdentifier.DriverVersion.Minor;
            driverVersion.Release = _activeD3DDriver.AdapterIdentifier.DriverVersion.MajorRevision;
            driverVersion.Build = _activeD3DDriver.AdapterIdentifier.DriverVersion.MinorRevision;

            // Create the device manager.
            _deviceManager = new D3D9DeviceManager();

            // Create the texture manager for use by others        
            textureManager = new D3DTextureManager();

            // Also create hardware buffer manager
            _hardwareBufferManager = new D3DHardwareBufferManager();

            // Create the GPU program manager    
            _gpuProgramManager = new D3DGpuProgramManager();

            _hlslProgramFactory = new HLSLProgramFactory();

            RenderWindow renderWindow = null;

            if (autoCreateWindow)
            {
                var fullScreen = (ConfigOptions["Full Screen"].Value == "Yes");

                var optVm = ConfigOptions["Video Mode"];
                var vm = optVm.Value;
                var width = int.Parse(vm.Substring(0, vm.IndexOf("x")));
                var height = int.Parse(vm.Substring(vm.IndexOf("x") + 1, vm.IndexOf("@") - (vm.IndexOf("x") + 1)));
                var bpp = int.Parse(vm.Substring(vm.IndexOf("@") + 1, vm.IndexOf("-") - (vm.IndexOf("@") + 1)));

                // sRGB window option
                ConfigOption opt;
                var hwGamma = ConfigOptions.TryGetValue("sRGB Gamma Conversion", out opt) && (opt.Value == "Yes");

                var miscParams = new NamedParameterList();
                miscParams.Add("title", windowTitle); // Axiom only?
                miscParams.Add("colorDepth", bpp);
                miscParams.Add("FSAA", _fsaaSamples);
                miscParams.Add("FSAAHint", _fsaaHint);
                miscParams.Add("vsync", vSync);
                miscParams.Add("vsyncInterval", vSyncInterval);
                miscParams.Add("useNVPerfHUD", _useNVPerfHUD);
                miscParams.Add("gamma", hwGamma);
                miscParams.Add("monitorIndex", _activeD3DDriver.AdapterNumber);

                // create the render window
                renderWindow = CreateRenderWindow("Main Window", width, height, fullScreen, miscParams);

                // If we have 16bit depth buffer enable w-buffering.
                Debug.Assert(renderWindow != null);
                wBuffer = (renderWindow.ColorDepth == 16);
            }

            LogManager.Instance.Write("***************************************");
            LogManager.Instance.Write("*** D3D9 : Subsystem Initialized OK ***");
            LogManager.Instance.Write("***************************************");

            // call superclass method
            base.Initialize( autoCreateWindow, windowTitle );

            // Configure SlimDX
            SlimDX.Configuration.ThrowOnError = true;
            SlimDX.Configuration.AddResultWatch(ResultCode.DeviceLost, ResultWatchFlags.AlwaysIgnore);
            SlimDX.Configuration.AddResultWatch(ResultCode.WasStillDrawing, ResultWatchFlags.AlwaysIgnore);

#if DEBUG
            SlimDX.Configuration.DetectDoubleDispose = false;
            SlimDX.Configuration.EnableObjectTracking = true;
#else
            SlimDX.Configuration.DetectDoubleDispose = false;
            SlimDX.Configuration.EnableObjectTracking = false;
#endif

            return renderWindow;
        }
        private D3D.Device InitDevice(bool isFullscreen, bool depthBuffer, int width, int height, int colorDepth, Control target)
        {
            if(device != null) {
                return device;
            }

            // we don't care about event handlers
            Device.IsUsingEventHandlers = false;

            D3D.Device newDevice;

            PresentParameters presentParams = CreatePresentationParams(isFullscreen, depthBuffer, width, height, colorDepth);

            // create the D3D Device, trying for the best vertex support first, and settling for less if necessary
            try {
                // hardware vertex processing
                int adapterNum = 0;
                DeviceType type = DeviceType.Hardware;
            #if DEBUG
                for ( int i = 0; i < Manager.Adapters.Count; i++ ) {
                    if (Manager.Adapters[i].Information.Description == "NVIDIA NVPerfHUD")
                    {
                        adapterNum = i;
                        type = DeviceType.Reference;
                    }
                }
            #endif
                // use this with NVPerfHUD
                newDevice = new D3D.Device(adapterNum, type, target, CreateFlags.HardwareVertexProcessing, presentParams);
                // newDevice = new D3D.Device(0, DeviceType.Hardware, target, CreateFlags.HardwareVertexProcessing, presentParams);
            }
            catch(Exception) {
                try {
                    // doh, how bout mixed vertex processing
                    newDevice = new D3D.Device(0, DeviceType.Hardware, target, CreateFlags.MixedVertexProcessing, presentParams);
                }
                catch(Exception) {
                    // what the...ok, how bout software vertex procssing.  if this fails, then I don't even know how they are seeing
                    // anything at all since they obviously don't have a video card installed
                    newDevice = new D3D.Device(0, DeviceType.Hardware, target, CreateFlags.SoftwareVertexProcessing, presentParams);
                }
            }

            // CMH - end

            // save the device capabilites
            d3dCaps = newDevice.DeviceCaps;

            // by creating our texture manager, singleton TextureManager will hold our implementation
            textureMgr = new D3DTextureManager(newDevice);

            // by creating our Gpu program manager, singleton GpuProgramManager will hold our implementation
            gpuProgramMgr = new D3DGpuProgramManager(newDevice);

            // intializes the HardwareBufferManager singleton
            hardwareBufferManager = new D3DHardwareBufferManager(newDevice);

            return newDevice;
        }