Beispiel #1
0
        public static ID3D11Device CreateD3Device()
        {
            Vortice.Direct3D.FeatureLevel[] supportedFeatureLevels = new[]
            {
                Vortice.Direct3D.FeatureLevel.Level_11_1,
                Vortice.Direct3D.FeatureLevel.Level_11_0,
                Vortice.Direct3D.FeatureLevel.Level_10_1,
                Vortice.Direct3D.FeatureLevel.Level_10_0,
            };

            DriverType[] supportedDrivers = new[]
            {
                DriverType.Hardware,
                DriverType.Warp,
            };

            Result result = default;

            foreach (DriverType driver in supportedDrivers)
            {
                result = D3D11.D3D11CreateDevice(null, driver, DeviceCreationFlags.BgraSupport, supportedFeatureLevels, out ID3D11Device device);
                if (result.Success)
                {
                    return(device);
                }
            }

            throw new SharpGenException(result);
        }
Beispiel #2
0
    /// <inheritdoc/>
    public override int CalculateSubResourceIndex(int mipSlice, int arraySlice, out int mipSize)
    {
        var desc = GetDescription();

        mipSize = D3D11.CalculateMipSize(mipSlice, desc.Depth);
        return(D3D11.CalculateSubResourceIndex(mipSlice, arraySlice, desc.MipLevels));
    }
Beispiel #3
0
        public Rectangle(D3D11 d3d, SelectionManager items, OrthogonalCamera camera)
        {
            //_models = items;
            _items  = items;
            _camera = camera;
            Device device = d3d.Device;

            //_color = new Vector4(0.0f, 0.0f, 0.0f, 0.1f);
            _color = new ColorVM(0.9f, 0.4f, 0.0f, 0.4f);
            //_color = new Vector4(0.9f, 0.4f, 0.0f, 0.4f);
            _isVisible = false;

            using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://*****:*****@"Shader\Tools.Rectangle.hlsl", "VS", "vs_5_0", shaderFlags, EffectFlags.None))
            {
                _vertexShader = ToDispose(new VertexShader(device, bytecode));
                _inputLayout  = ToDispose(new InputLayout(device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0) }));
            }
            using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://*****:*****@"Shader\Tools.Rectangle.hlsl", "PS", "ps_5_0", shaderFlags, EffectFlags.None))
            {
                _pixelShader = ToDispose(new PixelShader(device, bytecode));
            }

            _globalBuffer = ToDispose(new Buffer(device, Matrix.SizeInBytes + Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0));

            using (var dataStream = new DataStream(Vector3.SizeInBytes * 4, true, true))
            {
                dataStream.Write(new Vector3(0.0f, 0.0f, 1.0f));
                dataStream.Write(new Vector3(0.0f, 1.0f, 1.0f));
                dataStream.Write(new Vector3(1.0f, 1.0f, 1.0f));
                dataStream.Write(new Vector3(1.0f, 0.0f, 1.0f));

                dataStream.Position = 0;
                _buffer             = ToDispose(new Buffer(device, dataStream, Vector3.SizeInBytes * 4, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));
                _bufferBinding      = new VertexBufferBinding(_buffer, Vector3.SizeInBytes, 0);
            }
            using (var dataStream = new DataStream(sizeof(int) * 6, true, true))
            {
                dataStream.Write(0);
                dataStream.Write(1);
                dataStream.Write(2);
                dataStream.Write(2);
                dataStream.Write(3);
                dataStream.Write(0);
                dataStream.Position = 0;
                _indexBuffer        = ToDispose(new Buffer(device, dataStream, sizeof(int) * 6, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));
            }
        }
Beispiel #4
0
 protected virtual void Dispose(bool disposing)
 {
     if (!isDisposed)
     {
         if (disposing)
         {
             if (D3D11 != null)
             {
                 D3D11.Dispose();
                 D3D11 = null;
             }
         }
         isDisposed = true;
     }
 }
        private void StartDesktopDuplicator(int adapterId, int outputId)
        {
            var adapter = factory.GetAdapter1(adapterId);

            D3D11.D3D11CreateDevice(adapter, DriverType.Unknown, DeviceCreationFlags.None, s_featureLevels, out device);

            var output  = adapter.GetOutput(outputId);
            var output1 = output.QueryInterface <IDXGIOutput1>();

            var bounds = output1.Description.DesktopCoordinates;
            var width  = bounds.Right - bounds.Left;
            var height = bounds.Bottom - bounds.Top;

            var textureDesc = new Texture2DDescription
            {
                CpuAccessFlags    = CpuAccessFlags.Read,
                BindFlags         = BindFlags.None,
                Format            = Format.B8G8R8A8_UNorm,
                Width             = width / 2,
                Height            = height / 2,
                OptionFlags       = ResourceOptionFlags.None,
                MipLevels         = 1,
                ArraySize         = 1,
                SampleDescription = { Count = 1, Quality = 0 },
                Usage             = Usage.Staging
            };

            stagingTexture = device.CreateTexture2D(textureDesc);

            var smallerTextureDesc = new Texture2DDescription
            {
                CpuAccessFlags    = CpuAccessFlags.None,
                BindFlags         = BindFlags.RenderTarget | BindFlags.ShaderResource,
                Format            = Format.B8G8R8A8_UNorm,
                Width             = width,
                Height            = height,
                OptionFlags       = ResourceOptionFlags.GenerateMips,
                MipLevels         = 4,
                ArraySize         = 1,
                SampleDescription = { Count = 1, Quality = 0 },
                Usage             = Usage.Default
            };

            smallerTexture     = device.CreateTexture2D(smallerTextureDesc);
            smallerTextureView = device.CreateShaderResourceView(smallerTexture);

            duplication = output1.DuplicateOutput(device);
        }
        public static Bitmap CaptureScreenFrames(int screenId)
        {
            var factory = DXGI.CreateDXGIFactory1 <IDXGIFactory1>();
            var adapter = factory.GetAdapter(0);
            var output  = adapter.GetOutput(screenId);
            var output1 = output.QueryInterface <IDXGIOutput1>();

            D3D11.D3D11CreateDevice(adapter, DriverType.Unknown, DeviceCreationFlags.None, s_featureLevels, out var device);

            var bounds      = output1.Description.DesktopCoordinates;
            var textureDesc = new Texture2DDescription
            {
                CpuAccessFlags    = CpuAccessFlags.Read,
                BindFlags         = BindFlags.None,
                Format            = Format.B8G8R8A8_UNorm,
                Width             = bounds.Right - bounds.Left,
                Height            = bounds.Bottom - bounds.Top,
                OptionFlags       = ResourceOptionFlags.None,
                MipLevels         = 1,
                ArraySize         = 1,
                SampleDescription = { Count = 1, Quality = 0 },
                Usage             = Vortice.Direct3D11.Usage.Staging
            };

            var duplication  = output1.DuplicateOutput(device);
            var currentFrame = device.CreateTexture2D(textureDesc);

            Thread.Sleep(100);

            duplication.AcquireNextFrame(500, out var frameInfo, out var desktopResource);

            var tempTexture = desktopResource.QueryInterface <ID3D11Texture2D>();

            device.ImmediateContext.CopyResource(currentFrame, tempTexture);

            var dataBox = device.ImmediateContext.Map(currentFrame, 0, MapMode.Read, Vortice.Direct3D11.MapFlags.None);

            var frame   = new Bitmap(1920, 1080, PixelFormat.Format32bppRgb);
            var mapDest = frame.LockBits(new Rectangle(0, 0, 1920, 1080), ImageLockMode.WriteOnly, frame.PixelFormat);

            for (int y = 0, sizeInBytesToCopy = 1920 * 4; y < 1080; y++)
            {
                MemoryHelpers.CopyMemory(mapDest.Scan0 + y * mapDest.Stride, dataBox.DataPointer + y * dataBox.RowPitch, sizeInBytesToCopy);
            }
            frame.UnlockBits(mapDest);

            return(frame);
        }
Beispiel #7
0
        void Run()
        {
            D3D11.D3D11CreateDevice(null, DriverType.Hardware, DeviceCreationFlags.None, null, out device, out deviceContext);

            var moduleHandle = GetModuleHandle(null);

            var wndClass = new WNDCLASSEX
            {
                Size                  = Unsafe.SizeOf <WNDCLASSEX>(),
                Styles                = WindowClassStyles.CS_HREDRAW | WindowClassStyles.CS_VREDRAW | WindowClassStyles.CS_OWNDC,
                WindowProc            = WndProc,
                InstanceHandle        = moduleHandle,
                CursorHandle          = LoadCursor(IntPtr.Zero, SystemCursor.IDC_ARROW),
                BackgroundBrushHandle = IntPtr.Zero,
                IconHandle            = IntPtr.Zero,
                ClassName             = "WndClass",
            };

            RegisterClassEx(ref wndClass);

            var win32window = new Win32Window(wndClass.ClassName, "Vortice ImGui", 800, 600);
            var mainWindow  = new MainWindow(win32window, device, deviceContext);

            windows.Add(mainWindow.Win32Window.Handle, mainWindow);

            mainWindow.Show();

            while (!quitRequested)
            {
                if (PeekMessage(out var msg, IntPtr.Zero, 0, 0, PM_REMOVE))
                {
                    TranslateMessage(ref msg);
                    DispatchMessage(ref msg);

                    if (msg.Value == (uint)WindowMessage.Quit)
                    {
                        quitRequested = true;
                        break;
                    }
                }

                foreach (var window in windows.Values)
                {
                    window.UpdateAndDraw();
                }
            }
        }
Beispiel #8
0
            public void Init(D3D11 d3d)
            {
                _device = d3d.Device;
                using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://*****:*****@"Shader\Models.Polygon.hlsl", "VS", "vs_5_0", shaderFlags, EffectFlags.None))
                {
                    _vertexShader = ToDispose(new VertexShader(_device, bytecode));
                    _inputLayout  = ToDispose(new InputLayout(_device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0) }));
                }
                //using (var bytecode = ShaderBytecode.CompileFromFile(@"Shader\Models.Polygon.hlsl", "PS", "ps_5_0", shaderFlags, EffectFlags.None))
                using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/Models.Polygon.hlsl", "PS", "ps_5_0"))

                {
                    _pixelShader = ToDispose(new PixelShader(_device, bytecode));
                }

                _globalBuffer = ToDispose(new Buffer(_device, Matrix.SizeInBytes + Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0));
            }
Beispiel #9
0
        public D3DGraphic(SystemConfiguration windowConfig)
        {
            this.windowConfig = windowConfig;

            ShaderName shaderName = ShaderName.Texture;
            IShape shape = new Box2();
            ModelShader.Get(shaderName, shape);

            d3d = new D3D11(windowConfig);
            camera = new Camera();

            model = new Bitmap(d3d.Device, ModelShader.GetShaderEffect, shaderName, this.windowConfig, new Vector2(256, 256));

            //model = new D3DModel(d3d.Device, ModelShader.GetModelForRender, ModelShader.GetIndexes);
            shader = new D3DShader(d3d.Device, ModelShader.GetShaderEffect, shaderName);

            graph.Add(d3d);
            graph.Add(model);
            graph.Add(shader);

            //camera.Position = new Vector3(-2, 1, -3);
             camera.Position = new Vector3(0.0f, 0.0f, -10.0f);
        }
        public void Render(D3D11 renderer)
        {
            device  = renderer.Device;
            context = device.ImmediateContext;
            target  = renderer.RenderTargetView;

            context.InputAssembler.InputLayout = vertLayout;

            context.VertexShader.Set(vertexShader);
            context.PixelShader.Set(pixelShader);

            spin += 0.05f;
            SetShaderConstants(context, new GlobalConstants()
            {
                Spin = spin
            });

            /*
             * for (int i = 0; i < 100; i ++) {
             *  buffer[i * 3 + 0] = new VertexStruct(new Vector2((float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1), new Color4((float) random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble(), 1));
             *  buffer[i * 3 + 1] = new VertexStruct(new Vector2((float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1), new Color4((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble(), 1));
             *  buffer[i * 3 + 2] = new VertexStruct(new Vector2((float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1), new Color4((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble(), 1));
             * }
             */

            buffer[0] = new VertexStruct(new Vector2(0, 0), new Color4(1, 1, 1, 1));
            buffer[1] = new VertexStruct(new Vector2(1, 0), new Color4(1, 1, 1, 1));
            buffer[2] = new VertexStruct(new Vector2(1, 1), new Color4(1, 0, 1, 1));

            buffer[3] = new VertexStruct(new Vector2(0, 0), new Color4(1, 1, 1, 1));
            buffer[4] = new VertexStruct(new Vector2(-1, -1), new Color4(0, 1, 1, 1));
            buffer[5] = new VertexStruct(new Vector2(-1, 0), new Color4(1, 1, 1, 1));

            context.ClearRenderTargetView(target, new Color4(0, 0, 0, 1));

            FlushNoteBuffer(context, buffer, 6);
        }
        public DefaultRenderer(D3D11 renderer)
        {
            random = new Random();

            device  = renderer.Device;
            context = device.ImmediateContext;
            target  = renderer.RenderTargetView;


            unsafe
            {
                dxBuffer = new Buffer(device, new BufferDescription()
                {
                    BindFlags           = BindFlags.VertexBuffer,
                    CpuAccessFlags      = CpuAccessFlags.Write,
                    OptionFlags         = ResourceOptionFlags.None,
                    SizeInBytes         = sizeof(VertexStruct) * buffer.Length,
                    Usage               = ResourceUsage.Dynamic,
                    StructureByteStride = 0
                });

                var constantsSize = sizeof(GlobalConstants);
                if (constantsSize % 16 != 0)
                {
                    constantsSize += 16 - (constantsSize % 16);
                }
                globalConstants = new Buffer(device, new BufferDescription()
                {
                    BindFlags           = BindFlags.ConstantBuffer,
                    CpuAccessFlags      = CpuAccessFlags.Write,
                    OptionFlags         = ResourceOptionFlags.None,
                    SizeInBytes         = constantsSize,
                    Usage               = ResourceUsage.Dynamic,
                    StructureByteStride = 0
                });
            }

            vertexShaderByteCode = ShaderBytecode.Compile(noteShaderData, "VS", "vs_4_0", ShaderFlags.None, EffectFlags.None);
            pixelShaderByteCode  = ShaderBytecode.Compile(noteShaderData, "PS", "ps_4_0", ShaderFlags.None, EffectFlags.None);

            vertexShader = new VertexShader(device, vertexShaderByteCode);
            pixelShader  = new PixelShader(device, pixelShaderByteCode);

            noteShader = new ShaderManager(
                device,
                ShaderBytecode.Compile(noteShaderData, "VS", "vs_4_0", ShaderFlags.None, EffectFlags.None),
                ShaderBytecode.Compile(noteShaderData, "PS", "ps_4_0", ShaderFlags.None, EffectFlags.None)
                );

            vertLayout = new InputLayout(device, ShaderSignature.GetInputSignature(vertexShaderByteCode), new[] {
                new InputElement("POSITION", 0, Format.R32G32_Float, 0, 0),
                new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 8, 0),
            });

            //disabling backface culling, as well as some other stuff
            RasterizerStateDescription renderStateDesc = new RasterizerStateDescription
            {
                CullMode                 = CullMode.None,
                DepthBias                = 0,
                DepthBiasClamp           = 0,
                FillMode                 = FillMode.Solid,
                IsAntialiasedLineEnabled = false,
                IsDepthClipEnabled       = false,
                IsFrontCounterClockwise  = false,
                IsMultisampleEnabled     = true,
                IsScissorEnabled         = false,
                SlopeScaledDepthBias     = 0
            };
            var rasterStateSolid = new RasterizerState(device, renderStateDesc);

            device.ImmediateContext.Rasterizer.State = rasterStateSolid;

            //transparency mode
            var renderTargetDesc = new RenderTargetBlendDescription();

            renderTargetDesc.IsBlendEnabled        = true;
            renderTargetDesc.SourceBlend           = BlendOption.SourceAlpha;
            renderTargetDesc.DestinationBlend      = BlendOption.InverseSourceAlpha;
            renderTargetDesc.BlendOperation        = BlendOperation.Add;
            renderTargetDesc.SourceAlphaBlend      = BlendOption.One;
            renderTargetDesc.DestinationAlphaBlend = BlendOption.One;
            renderTargetDesc.AlphaBlendOperation   = BlendOperation.Add;
            renderTargetDesc.RenderTargetWriteMask = ColorWriteMaskFlags.All;

            BlendStateDescription desc = new BlendStateDescription();

            desc.AlphaToCoverageEnable  = false;
            desc.IndependentBlendEnable = false;
            desc.RenderTarget[0]        = renderTargetDesc;

            var blendStateEnabled = new BlendState(device, desc);

            device.ImmediateContext.OutputMerger.SetBlendState(blendStateEnabled);
        }
Beispiel #12
0
 public static void Init(D3D11 d3d, DXElement dxElement)
 {
     ShaderManager.Instance.Init(d3d);
     _dxElement = dxElement;
 }
Beispiel #13
0
            public void Init(D3D11 d3d)
            {
                _device = d3d.Device;

                #region BoundingRect
                using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingRect.hlsl", "VS", "vs_5_0"))
                {
                    _vertexShaderBoundingRect = ToDispose(new VertexShader(_device, bytecode));
                    _inputLayoutBoundingRect  = ToDispose(new InputLayout(_device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0) }));
                }
                using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingRect.hlsl", "PS", "ps_5_0"))

                {
                    _pixelShaderBoundingRect = ToDispose(new PixelShader(_device, bytecode));
                }

                _globalBufferBoundingRect = ToDispose(new Buffer(_device, Matrix.SizeInBytes + Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0));

                _colorBoundingRect = new Vector4(100.0f / 255.0f, 149.0f / 255.0f, 237.0f / 255.0f, 1.0f);

                using (var dataStream = new DataStream(Vector3.SizeInBytes * 5, true, true))
                {
                    dataStream.Write(new Vector3(0.0f, 0.0f, 0.0f));
                    dataStream.Write(new Vector3(0.0f, 1.0f, 0.0f));
                    dataStream.Write(new Vector3(1.0f, 1.0f, 0.0f));
                    dataStream.Write(new Vector3(1.0f, 0.0f, 0.0f));
                    dataStream.Write(new Vector3(0.0f, 0.0f, 0.0f));
                    dataStream.Position        = 0;
                    _bufferBoundingRect        = ToDispose(new Buffer(_device, dataStream, Vector3.SizeInBytes * 5, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));
                    _bufferBindingBoundingRect = new VertexBufferBinding(_bufferBoundingRect, Vector3.SizeInBytes, 0);
                }
                #endregion
                #region Nodes

                _colorNodesBorders = new Vector4(100.0f / 255.0f, 149.0f / 255.0f, 237.0f / 255.0f, 1.0f);
                _colorNodesFill    = new Vector4(1.0f, 1.0f, 1.0f, 1.0f);
                using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingNodes.hlsl", "VS", "vs_5_0"))
                {
                    _vertexShaderNodes = ToDispose(new VertexShader(_device, bytecode));
                    _inputLayoutNodes  = ToDispose(new InputLayout(_device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0, InputClassification.PerVertexData, 0) }));
                }
                using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingNodes.hlsl", "PS", "ps_5_0"))

                {
                    _pixelShaderNodes = ToDispose(new PixelShader(_device, bytecode));
                }

                _globalBufferNodes = ToDispose(new Buffer(_device, 2 * Matrix.SizeInBytes + 3 * Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0));

                using (var dataStream = new DataStream(Vector4.SizeInBytes * 32, true, true))
                {
                    dataStream.Write(new Vector4(-0.5f, -0.5f, -0.5f, -0.5f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, -0.5f, -0.5f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, -0.5f, -0.5f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, -0.5f, -0.5f));

                    dataStream.Write(new Vector4(-0.5f, -0.5f, 0.0f, -0.5f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, 0.0f, -0.5f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, 0.0f, -0.5f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, 0.0f, -0.5f));

                    dataStream.Write(new Vector4(-0.5f, -0.5f, 0.5f, -0.5f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, 0.5f, -0.5f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, 0.5f, -0.5f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, 0.5f, -0.5f));

                    dataStream.Write(new Vector4(-0.5f, -0.5f, -0.5f, 0.0f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, -0.5f, 0.0f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, -0.5f, 0.0f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, -0.5f, 0.0f));

                    dataStream.Write(new Vector4(-0.5f, -0.5f, 0.5f, 0.0f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, 0.5f, 0.0f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, 0.5f, 0.0f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, 0.5f, 0.0f));

                    dataStream.Write(new Vector4(-0.5f, -0.5f, -0.5f, +0.5f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, -0.5f, +0.5f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, -0.5f, +0.5f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, -0.5f, +0.5f));

                    dataStream.Write(new Vector4(-0.5f, -0.5f, 0.0f, +0.5f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, 0.0f, +0.5f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, 0.0f, +0.5f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, 0.0f, +0.5f));

                    dataStream.Write(new Vector4(-0.5f, -0.5f, 0.5f, +0.5f));
                    dataStream.Write(new Vector4(-0.5f, +0.5f, 0.5f, +0.5f));
                    dataStream.Write(new Vector4(+0.5f, +0.5f, 0.5f, +0.5f));
                    dataStream.Write(new Vector4(+0.5f, -0.5f, 0.5f, +0.5f));

                    dataStream.Position = 0;
                    _bufferNodes        = ToDispose(new Buffer(_device, dataStream, Vector4.SizeInBytes * 32, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));
                    _bufferBindingNodes = new VertexBufferBinding(_bufferNodes, Vector4.SizeInBytes, 0);
                }

                using (var dataStream = new DataStream(sizeof(int) * 64, true, true))
                {
                    dataStream.Write(0 + 0);
                    dataStream.Write(1 + 0);
                    dataStream.Write(1 + 0);
                    dataStream.Write(2 + 0);
                    dataStream.Write(2 + 0);
                    dataStream.Write(3 + 0);
                    dataStream.Write(3 + 0);
                    dataStream.Write(0 + 0);

                    dataStream.Write(0 + 4);
                    dataStream.Write(1 + 4);
                    dataStream.Write(1 + 4);
                    dataStream.Write(2 + 4);
                    dataStream.Write(2 + 4);
                    dataStream.Write(3 + 4);
                    dataStream.Write(3 + 4);
                    dataStream.Write(0 + 4);

                    dataStream.Write(0 + 8);
                    dataStream.Write(1 + 8);
                    dataStream.Write(1 + 8);
                    dataStream.Write(2 + 8);
                    dataStream.Write(2 + 8);
                    dataStream.Write(3 + 8);
                    dataStream.Write(3 + 8);
                    dataStream.Write(0 + 8);

                    dataStream.Write(0 + 12);
                    dataStream.Write(1 + 12);
                    dataStream.Write(1 + 12);
                    dataStream.Write(2 + 12);
                    dataStream.Write(2 + 12);
                    dataStream.Write(3 + 12);
                    dataStream.Write(3 + 12);
                    dataStream.Write(0 + 12);

                    dataStream.Write(0 + 16);
                    dataStream.Write(1 + 16);
                    dataStream.Write(1 + 16);
                    dataStream.Write(2 + 16);
                    dataStream.Write(2 + 16);
                    dataStream.Write(3 + 16);
                    dataStream.Write(3 + 16);
                    dataStream.Write(0 + 16);

                    dataStream.Write(0 + 20);
                    dataStream.Write(1 + 20);
                    dataStream.Write(1 + 20);
                    dataStream.Write(2 + 20);
                    dataStream.Write(2 + 20);
                    dataStream.Write(3 + 20);
                    dataStream.Write(3 + 20);
                    dataStream.Write(0 + 20);

                    dataStream.Write(0 + 24);
                    dataStream.Write(1 + 24);
                    dataStream.Write(1 + 24);
                    dataStream.Write(2 + 24);
                    dataStream.Write(2 + 24);
                    dataStream.Write(3 + 24);
                    dataStream.Write(3 + 24);
                    dataStream.Write(0 + 24);

                    dataStream.Write(0 + 28);
                    dataStream.Write(1 + 28);
                    dataStream.Write(1 + 28);
                    dataStream.Write(2 + 28);
                    dataStream.Write(2 + 28);
                    dataStream.Write(3 + 28);
                    dataStream.Write(3 + 28);
                    dataStream.Write(0 + 28);
                    dataStream.Position    = 0;
                    _indexBufferNodesLines = ToDispose(new Buffer(_device, dataStream, sizeof(int) * 64, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));
                }

                using (var dataStream = new DataStream(sizeof(int) * 6 * 8, true, true))
                {
                    dataStream.Write(0 + 0);
                    dataStream.Write(1 + 0);
                    dataStream.Write(2 + 0);
                    dataStream.Write(2 + 0);
                    dataStream.Write(3 + 0);
                    dataStream.Write(0 + 0);

                    dataStream.Write(0 + 4);
                    dataStream.Write(1 + 4);
                    dataStream.Write(2 + 4);
                    dataStream.Write(2 + 4);
                    dataStream.Write(3 + 4);
                    dataStream.Write(0 + 4);

                    dataStream.Write(0 + 8);
                    dataStream.Write(1 + 8);
                    dataStream.Write(2 + 8);
                    dataStream.Write(2 + 8);
                    dataStream.Write(3 + 8);
                    dataStream.Write(0 + 8);

                    dataStream.Write(0 + 12);
                    dataStream.Write(1 + 12);
                    dataStream.Write(2 + 12);
                    dataStream.Write(2 + 12);
                    dataStream.Write(3 + 12);
                    dataStream.Write(0 + 12);

                    dataStream.Write(0 + 16);
                    dataStream.Write(1 + 16);
                    dataStream.Write(2 + 16);
                    dataStream.Write(2 + 16);
                    dataStream.Write(3 + 16);
                    dataStream.Write(0 + 16);

                    dataStream.Write(0 + 20);
                    dataStream.Write(1 + 20);
                    dataStream.Write(2 + 20);
                    dataStream.Write(2 + 20);
                    dataStream.Write(3 + 20);
                    dataStream.Write(0 + 20);

                    dataStream.Write(0 + 24);
                    dataStream.Write(1 + 24);
                    dataStream.Write(2 + 24);
                    dataStream.Write(2 + 24);
                    dataStream.Write(3 + 24);
                    dataStream.Write(0 + 24);

                    dataStream.Write(0 + 28);
                    dataStream.Write(1 + 28);
                    dataStream.Write(2 + 28);
                    dataStream.Write(2 + 28);
                    dataStream.Write(3 + 28);
                    dataStream.Write(0 + 28);

                    dataStream.Position        = 0;
                    _indexBufferNodesTriangles = ToDispose(new Buffer(_device, dataStream, sizeof(int) * 6 * 8, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0));
                }

                #endregion
            }
Beispiel #14
0
 public static void Init(D3D11 d3d)
 {
     ShaderManager.Instance.Init(d3d);
 }
            public static DesktopDuplicatorInternal CreateDesktopDuplicator(ILogger logger, int adapterIndex, int outputDeviceIndex)
            {
                var dd = new DesktopDuplicatorInternal
                {
                    _outputDeviceIndex = outputDeviceIndex
                };

                var createFactoryResult = DXGI.CreateDXGIFactory1(out IDXGIFactory1 factory);

                if (!createFactoryResult.Success)
                {
                    throw new DesktopDuplicationException("Couldn't create a DXGI Factory.");
                }

                IDXGIAdapter1 adapter = null;
                IDXGIOutput   output  = null;

                try
                {
                    var result = factory.EnumAdapters1(adapterIndex, out adapter);
                    if (result.Failure)
                    {
                        throw new DesktopDuplicationException($"An error occurred attempting to retrieve the adapter at the specified index ({adapterIndex}): {result}");
                    }

                    if (adapter == null)
                    {
                        throw new DesktopDuplicationException($"An adapter was not found at the specified index ({adapterIndex}).");
                    }

                    logger.LogInformation($"Using adapter at index {adapterIndex} - {adapter.Description.Description}");

                    var createD3dDeviceResult = D3D11.D3D11CreateDevice(adapter, DriverType.Unknown, DeviceCreationFlags.None, null, out dd._d3dDevice, out dd._immediateContext);
                    if (!createD3dDeviceResult.Success)
                    {
                        throw new DesktopDuplicationException("Couldn't create a D3D device from the specified adapter.");
                    }

                    using var device = dd._d3dDevice.QueryInterface <IDXGIDevice>();
                    var outputResult = adapter.EnumOutputs(outputDeviceIndex, out output);
                    if (outputResult.Failure)
                    {
                        throw new DesktopDuplicationException($"An error occurred attempting to retrieve the output device at the specified index ({outputDeviceIndex}): {outputResult}");
                    }

                    if (output == null)
                    {
                        throw new DesktopDuplicationException($"An output was not found at the specified index ({outputDeviceIndex}).");
                    }

                    logger.LogInformation($"Using output device on adapter {adapterIndex} at index {outputDeviceIndex}.");

                    var output6 = output.QueryInterface <IDXGIOutput6>();
                    try
                    {
                        // Copy the values to a new rect.
                        var rectTemp = output6.Description.DesktopCoordinates;
                        dd._desktopRect = new RawRect(rectTemp.Left, rectTemp.Top, rectTemp.Right, rectTemp.Bottom);

                        dd._outputDuplication = output6.DuplicateOutput(device);

                        var stagingTexture = new Texture2DDescription()
                        {
                            CpuAccessFlags    = CpuAccessFlags.Read,
                            BindFlags         = BindFlags.None,
                            Format            = dd._outputDuplication.Description.ModeDescription.Format,
                            Width             = Math.Abs(dd._desktopRect.Right - dd._desktopRect.Left),
                            Height            = Math.Abs(dd._desktopRect.Bottom - dd._desktopRect.Top),
                            OptionFlags       = ResourceOptionFlags.None,
                            MipLevels         = 1,
                            ArraySize         = 1,
                            SampleDescription = { Count = 1, Quality = 0 },
                            Usage             = Usage.Staging // << can be read by CPU
                        };

                        // Initialize the Output Duplication -- If this isn't done occassionally an 'Unsupported' result will occur with DuplicationOutput1
                        dd._desktopImageTexture = dd._d3dDevice.CreateTexture2D(stagingTexture);
                    }
                    catch (SharpGenException ex)
                    {
                        if (ex.Descriptor.NativeApiCode == "DXGI_ERROR_UNSUPPORTED")
                        {
                            throw new DesktopDuplicationException("Unsupported desktop mode or scenario.");
                        }
                        else if (ex.Descriptor.NativeApiCode == "DXGI_ERROR_NOT_CURRENTLY_AVAILABLE")
                        {
                            throw new DesktopDuplicationException("There is already the maximum number of applications using the Desktop Duplication API running, please close one of the applications and try again.");
                        }
                        else
                        {
                            throw;
                        }
                    }
                }
                finally
                {
                    if (output != null)
                    {
                        output.Dispose();
                    }

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

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

                return(dd);
            }
        public bool Init(IntPtr WindowHandle)
        {
            var factory            = DXGI.CreateDXGIFactory1 <IDXGIFactory1>();
            var adapter            = factory.GetAdapter1(0);
            var monitor            = adapter.GetOutput(0);
            var modes              = monitor.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced);
            var rational           = new Rational(0, 1);
            var adapterDescription = adapter.Description;

            //VideoCardMemory = adapterDescription.DedicatedVideoMemory >> 10 >> 10;
            //VideoCardDescription = adapterDescription.Description.Trim('\0');
            monitor.Dispose();
            adapter.Dispose();

            var swapChainDesc = new SwapChainDescription()
            {
                BufferCount       = 2,
                BufferDescription = new ModeDescription(1920, 1080, rational, Format.R8G8B8A8_UNorm),
                Usage             = Usage.RenderTargetOutput,
                OutputWindow      = WindowHandle,
                SampleDescription = new SampleDescription(1, 0),
                IsWindowed        = true,
                Flags             = SwapChainFlags.None,
                SwapEffect        = SwapEffect.Discard
            };

            // Create Device and DeviceContext
            ID3D11Device        TempDevice        = null;
            ID3D11DeviceContext TempDeviceContext = null;

            D3D11.D3D11CreateDevice(adapter, DriverType.Hardware, DeviceCreationFlags.None, null, out TempDevice, out TempDeviceContext);

            Device        = TempDevice.QueryInterface <ID3D11Device1>();
            DeviceContext = TempDeviceContext.QueryInterface <ID3D11DeviceContext1>();
            TempDevice.Dispose();
            TempDeviceContext.Dispose();

            // Create SwapChain
            SwapChain = factory.CreateSwapChain(Device, swapChainDesc);
            factory.MakeWindowAssociation(WindowHandle, WindowAssociationFlags.IgnoreAltEnter);

            var backBuffer = SwapChain.GetBuffer <ID3D11Texture2D>(0);

            m_RenderTargetView = Device.CreateRenderTargetView(backBuffer);
            backBuffer.Dispose();

            // Create blend state
            BlendDescription bsd = new BlendDescription()
            {
                AlphaToCoverageEnable  = false,//true,
                IndependentBlendEnable = false,
            };

            bsd.RenderTarget[0].BlendOperationAlpha   = BlendOperation.Add;
            bsd.RenderTarget[0].BlendOperation        = BlendOperation.Add;
            bsd.RenderTarget[0].DestinationBlendAlpha = Blend.One;
            bsd.RenderTarget[0].DestinationBlend      = Blend.InverseSourceAlpha;
            bsd.RenderTarget[0].IsBlendEnabled        = true;
            bsd.RenderTarget[0].RenderTargetWriteMask = ColorWriteEnable.All;
            bsd.RenderTarget[0].SourceBlendAlpha      = Blend.Zero;
            bsd.RenderTarget[0].SourceBlend           = Blend.SourceAlpha;
            bsd.AlphaToCoverageEnable = true;

            ID3D11BlendState bsAlpha = Device.CreateBlendState(bsd);

            // Set Blend State
            DeviceContext.OMSetBlendState(bsAlpha);
            BuildDepthStencilView(1920, 1080);

            // Create rasterizers
            m_RSDesc = new RasterizerDescription()
            {
                AntialiasedLineEnable = false,
                CullMode              = CullMode.Back,
                DepthBias             = 0,
                DepthBiasClamp        = .0f,
                DepthClipEnable       = false,
                FillMode              = FillMode.Solid,
                FrontCounterClockwise = true,
                MultisampleEnable     = true,
                ScissorEnable         = false,
                SlopeScaledDepthBias  = .0f
            };

            m_RSCullSolid     = Device.CreateRasterizerState(m_RSDesc);
            m_RSDesc.CullMode = CullMode.None;
            m_RSSolid         = Device.CreateRasterizerState(m_RSDesc);
            m_RSDesc.FillMode = FillMode.Wireframe;
            m_RSWireFrame     = Device.CreateRasterizerState(m_RSDesc);
            m_RSDesc.CullMode = CullMode.Back;
            m_RSCullWireFrame = Device.CreateRasterizerState(m_RSDesc);

            UpdateRasterizer();
            return(true);
        }