Beispiel #1
0
        public override void GenerateShadowMaps(Device device, DeviceContext deviceContext, CRenderScene renderScene)
        {
            UserDefinedAnnotation annotation = deviceContext.QueryInterface <UserDefinedAnnotation>();

            annotation.BeginEvent("SpotLightShadowMap");

            deviceContext.Rasterizer.SetViewport(0.0f, 0.0f, CStaticRendererCvars.ShadowMapSize, CStaticRendererCvars.ShadowMapSize);

            deviceContext.ClearDepthStencilView(ShadowMapTexture.GetRenderTarget(), DepthStencilClearFlags.Depth, 1.0f, 0);
            deviceContext.OutputMerger.SetRenderTargets(ShadowMapTexture.GetRenderTarget());

            DepthStencilStateDescription depthStateDesc = new DepthStencilStateDescription()
            {
                IsDepthEnabled  = true,
                DepthWriteMask  = DepthWriteMask.All,
                DepthComparison = Comparison.Less,

                IsStencilEnabled = false,
                StencilReadMask  = 0xFF,
                StencilWriteMask = 0xFF,
            };

            DepthStencilState depthState = new DepthStencilState(device, depthStateDesc);

            deviceContext.OutputMerger.SetDepthStencilState(depthState);

            SSceneViewInfo viewInfo = new SSceneViewInfo()
            {
                FitProjectionToScene = false,
                Fov          = MathUtil.Pi / 2.0f,
                ScreenFar    = Range,
                ScreenNear   = 0.1f,
                ScreenHeight = CStaticRendererCvars.ShadowMapSize,
                ScreenWidth  = CStaticRendererCvars.ShadowMapSize,
                ScreenLeft   = 0.0f,
                ScreenTop    = 0.0f,
                ViewLocation = Transform.WorldPosition,
                ViewMatrix   = Matrix.Invert(Transform.WorldMatrix)
            };

            m_projectionMatrix        = Matrix.PerspectiveFovLH(viewInfo.Fov, 1.0f, viewInfo.ScreenNear, viewInfo.ScreenFar);
            viewInfo.ProjectionMatrix = m_projectionMatrix;
            viewInfo.CreateBoundingFrustum();

            depthState.Dispose();
            renderScene.RenderSceneDepth(device, deviceContext, in viewInfo);

            DepthStencilView nullDepthView = null;

            deviceContext.OutputMerger.SetRenderTargets(nullDepthView);

            annotation.EndEvent();
            annotation.Dispose();
        }
Beispiel #2
0
 public static void WithEvent(this DeviceContext context, string name, Action action)
 {
     using (UserDefinedAnnotation annotator = context.QueryInterface <UserDefinedAnnotation>()) {
         annotator.BeginEvent(name);
         try {
             action();
         } finally {
             annotator.EndEvent();
         }
     }
 }
        public void EndRender()
        {
            ImGui.Render();

            unsafe
            {
                ImDrawDataPtr drawData = ImGui.GetDrawData();
                if (drawData.CmdListsCount <= 0)
                {
                    return;
                }

                UserDefinedAnnotation annotation = m_d3DeviceContext.QueryInterface <UserDefinedAnnotation>();
                annotation.BeginEvent("ImguiPass");

                // Grow buffers in case they are to small
                if (m_vertexBufferSize < drawData.TotalVtxCount || m_indexBufferSize < drawData.TotalIdxCount)
                {
                    m_indexBufferSize  = (int)(drawData.TotalIdxCount * 1.5f);
                    m_vertexBufferSize = (int)(drawData.TotalVtxCount * 1.5f);

                    CreateVertexIndexBuffer();
                }

                m_d3DeviceContext.MapSubresource(m_vertexBuffer, MapMode.WriteDiscard, MapFlags.None, out DataStream vertexStream);
                m_d3DeviceContext.MapSubresource(m_indexBuffer, MapMode.WriteDiscard, MapFlags.None, out DataStream indexStream);
                for (int i = 0; i < drawData.CmdListsCount; i++)
                {
                    ImDrawListPtr drawList  = drawData.CmdListsRange[i];
                    IntPtr        vertexPtr = drawList.VtxBuffer.Data;
                    vertexStream.Write(vertexPtr, 0, drawList.VtxBuffer.Size * Utilities.SizeOf <ImDrawVert>());

                    IntPtr indexPtr = drawList.IdxBuffer.Data;
                    indexStream.Write(indexPtr, 0, drawList.IdxBuffer.Size * Utilities.SizeOf <ushort>());
                }
                m_d3DeviceContext.UnmapSubresource(m_vertexBuffer, 0);
                m_d3DeviceContext.UnmapSubresource(m_indexBuffer, 0);

                float offset = 0.0f;

                Matrix mvpMatrix = Matrix.OrthoOffCenterLH(offset, m_imguiIO.DisplaySize.X + offset, m_imguiIO.DisplaySize.Y + offset, offset, -1.0f, 1.0f);
                mvpMatrix.Transpose();

                SShaderParameter parameter;
                parameter.parameterType = EShaderParameterType.Matrix;
                parameter.parameterData = mvpMatrix;
                m_shaderParameters[new SHashedName("mvpMatrix")] = parameter;

                SShaderParameter fontTextureParams;
                fontTextureParams.parameterType = EShaderParameterType.Texture;
                fontTextureParams.parameterData = m_boundTextures[m_fontAtlasId];
                m_shaderParameters[new SHashedName("texture")] = fontTextureParams;

                m_shader.SetShaderParameters(m_d3DeviceContext, m_shaderParameters);
                m_shader.SetActive(m_d3DeviceContext);

                m_d3DeviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(m_vertexBuffer, Utilities.SizeOf <ImDrawVert>(), 0));
                m_d3DeviceContext.InputAssembler.SetIndexBuffer(m_indexBuffer, Format.R16_UInt, 0);
                m_d3DeviceContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;

                RawViewportF[]    prevViewports       = m_d3DeviceContext.Rasterizer.GetViewports <RawViewportF>();
                RasterizerState   prevRasterizerState = m_d3DeviceContext.Rasterizer.State;
                DepthStencilState prevDepthState      = m_d3DeviceContext.OutputMerger.DepthStencilState;
                BlendState        prevBlendState      = m_d3DeviceContext.OutputMerger.BlendState;
                Rectangle[]       prevScissorRects    = new Rectangle[8];
                m_d3DeviceContext.Rasterizer.GetScissorRectangles(prevScissorRects);


                Viewport viewport = new Viewport(0, 0, m_screenWidth, m_screenHeight, 0.0f, 1.0f);
                m_d3DeviceContext.Rasterizer.SetViewport(viewport);
                m_d3DeviceContext.OutputMerger.DepthStencilState = m_depthStencilState;
                m_d3DeviceContext.OutputMerger.BlendState        = m_blendState;
                m_d3DeviceContext.Rasterizer.State = m_rasterizerState;

                int vertexOffset = 0;
                int indexOffset  = 0;

                for (int i = 0; i < drawData.CmdListsCount; i++)
                {
                    ImDrawListPtr drawList = drawData.CmdListsRange[i];
                    for (int n = 0; n < drawList.CmdBuffer.Size; n++)
                    {
                        ImDrawCmdPtr command = drawList.CmdBuffer[n];
                        if (!m_boundTextures.ContainsKey(command.TextureId))
                        {
                            throw new InvalidOperationException("Requested texture was not bound to imgui, please check your binding");
                        }

                        CTextureSampler textureSampler = m_boundTextures[command.TextureId];

                        m_d3DeviceContext.Rasterizer.SetScissorRectangle((int)command.ClipRect.X, (int)command.ClipRect.Y, (int)command.ClipRect.Z, (int)command.ClipRect.W);
                        m_d3DeviceContext.PixelShader.SetSampler(0, textureSampler.SamplerState);
                        m_d3DeviceContext.PixelShader.SetShaderResource(0, textureSampler.Texture.GetTexture());

                        m_d3DeviceContext.DrawIndexed((int)command.ElemCount, indexOffset, vertexOffset);
                        indexOffset += (int)command.ElemCount;
                    }

                    vertexOffset += drawList.VtxBuffer.Size;
                }

                m_d3DeviceContext.Rasterizer.SetScissorRectangles(prevScissorRects);
                m_d3DeviceContext.OutputMerger.BlendState        = prevBlendState;
                m_d3DeviceContext.OutputMerger.DepthStencilState = prevDepthState;
                m_d3DeviceContext.Rasterizer.State = prevRasterizerState;
                m_d3DeviceContext.Rasterizer.SetViewports(prevViewports);

                prevRasterizerState?.Dispose();
                prevBlendState?.Dispose();
                prevDepthState?.Dispose();

                annotation.EndEvent();
                annotation.Dispose();
            }
        }
Beispiel #4
0
 public static void SetMarker(this DeviceContext context, string name)
 {
     using (UserDefinedAnnotation annotator = context.QueryInterface <UserDefinedAnnotation>()) {
         annotator.SetMarker(name);
     }
 }
Beispiel #5
0
        public D3D11GraphicsDevice(bool validation, PresentationParameters presentationParameters)
            : base(GraphicsBackend.Direct3D11, presentationParameters)
        {
#if DEBUG
            SharpDX.Configuration.EnableObjectTracking      = true;
            SharpDX.Configuration.ThrowOnShaderCompileError = false;
#endif
            // Create factory first.
            using (var dxgifactory = new DXGI.Factory1())
            {
                var adapterCount = dxgifactory.GetAdapterCount1();
                for (var i = 0; i < adapterCount; i++)
                {
                    var adapter = dxgifactory.GetAdapter1(i);
                    var desc    = adapter.Description1;

                    // Don't select the Basic Render Driver adapter.
                    if ((desc.Flags & DXGI.AdapterFlags.Software) != DXGI.AdapterFlags.None)
                    {
                        continue;
                    }

                    var creationFlags = DeviceCreationFlags.BgraSupport /* | DeviceCreationFlags.VideoSupport*/;

                    if (validation)
                    {
                        creationFlags |= DeviceCreationFlags.Debug;
                    }

                    try
                    {
                        D3DDevice = new Device(adapter, creationFlags, s_featureLevels);
                    }
                    catch (SharpDXException)
                    {
                        // Remove debug flag not being supported.
                        creationFlags &= ~DeviceCreationFlags.Debug;

                        D3DDevice = new Device(adapter, creationFlags, s_featureLevels);
                    }

                    Features.VendorId   = desc.VendorId;
                    Features.DeviceId   = desc.DeviceId;
                    Features.DeviceName = desc.Description;
                    Log.Debug($"Direct3D Adapter ({i}): VID:{desc.VendorId}, PID:{desc.DeviceId} - {desc.Description}");
                    break;
                }
            }

            FeatureLevel = D3DDevice.FeatureLevel;
            D3DContext   = D3DDevice.ImmediateContext;
            D3DDevice1   = D3DDevice.QueryInterfaceOrNull <Device1>();
            if (D3DDevice1 != null)
            {
                D3DContext1   = D3DContext.QueryInterface <DeviceContext1>();
                D3DAnnotation = D3DContext.QueryInterface <UserDefinedAnnotation>();
            }

            // Detect multithreading
            D3DDevice1.CheckThreadingSupport(out _supportsConcurrentResources, out _supportsCommandLists);
            if (_supportsConcurrentResources &&
                _supportsCommandLists)
            {
                Features.Multithreading = true;
            }

            // Create queue's
            GraphicsQueue = new D3D11CommandQueue(this);

            //ImmediateContext = new D3D11CommandContext(this, Device.ImmediateContext1);
            _mainSwapchain = new D3D11Swapchain(this, presentationParameters);
        }