/// <summary>Bind blend states for alpha blending</summary>
        public static void BindMaterialTextureBlendStates(MyRenderContext rc, MyFileTextureEnum textures)
        {
            textures &= ~MyFileTextureEnum.ALPHAMASK;
            switch (textures)
            {
            case MyFileTextureEnum.COLOR_METAL:
                rc.SetBlendState(MyBlendStateManager.BlendDecalNormal);
                break;

            case MyFileTextureEnum.NORMALMAP_GLOSS:
                rc.SetBlendState(MyBlendStateManager.BlendDecalColor);
                break;

            case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS:
                rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColor);
                break;

            case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS | MyFileTextureEnum.EXTENSIONS:
                rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColorExt);
                break;

            default:
                throw new Exception("Unknown texture bundle type");
            }
        }
Esempio n. 2
0
        internal static unsafe void FillBuffers(MyRenderableProxy proxy, MyRenderContext rc)
        {
            MyMapping mapping;

            mapping = MyMapping.MapDiscard(rc, proxy.ObjectBuffer);
            if (proxy.NonVoxelObjectData.IsValid)
            {
                mapping.WriteAndPosition(ref proxy.NonVoxelObjectData);
            }
            else if (proxy.VoxelCommonObjectData.IsValid)
            {
                mapping.WriteAndPosition(ref proxy.VoxelCommonObjectData);
            }
            mapping.WriteAndPosition(ref proxy.CommonObjectData);

            if (proxy.SkinningMatrices != null)
            {
                if (proxy.DrawSubmesh.BonesMapping == null)
                {
                    mapping.WriteAndPosition(proxy.SkinningMatrices, Math.Min(MyRender11Constants.SHADER_MAX_BONES, proxy.SkinningMatrices.Length));
                }
                else
                {
                    for (int j = 0; j < proxy.DrawSubmesh.BonesMapping.Length; j++)
                    {
                        mapping.WriteAndPosition(ref proxy.SkinningMatrices[proxy.DrawSubmesh.BonesMapping[j]]);
                    }
                }
            }
            mapping.Unmap();
        }
Esempio n. 3
0
        static unsafe IConstantBuffer GetObjectCB(MyRenderContext RC, MyInstanceComponent instance, float stateData)
        {
            Vector4 col0, col1, col2;

            instance.GetMatrixCols(0, out col0, out col1, out col2);
            Matrix matrix = Matrix.Identity;

            matrix.SetRow(0, col0);
            matrix.SetRow(1, col1);
            matrix.SetRow(2, col2);
            matrix = Matrix.Transpose(matrix);

            int cbSize = sizeof(MyObjectDataCommon);

            cbSize += sizeof(MyObjectDataNonVoxel);

            IConstantBuffer      cb           = MyCommon.GetObjectCB(cbSize);
            var                  mapping      = MyMapping.MapDiscard(RC, cb);
            MyObjectDataNonVoxel nonVoxelData = new MyObjectDataNonVoxel();

            mapping.WriteAndPosition(ref nonVoxelData);
            MyObjectDataCommon commonData = new MyObjectDataCommon();

            commonData.LocalMatrix = matrix;
            commonData.ColorMul    = Vector3.One;
            commonData.KeyColor    = new Vector3(0, -1f, 0f);
            commonData.CustomAlpha = stateData;

            mapping.WriteAndPosition(ref commonData);
            mapping.Unmap();
            return(cb);
        }
 internal static void DrawInstancedGBufferPass(MyRenderContext rc, int vertexCountPerInstance, int instanceCount, int startVertexLocation, int startInstanceLocation)
 {
     BeginDrawGBufferPass(rc);
     rc.DrawInstanced(vertexCountPerInstance, instanceCount, startVertexLocation, startInstanceLocation);
     SwitchDrawGBufferPass(rc);
     rc.DrawInstanced(vertexCountPerInstance, instanceCount, startVertexLocation, startInstanceLocation);
     EndDrawGBufferPass(rc);
 }
 internal static void DrawIndexedGBufferPass(MyRenderContext rc, int indexCount, int startIndexLocation, int baseVertexLocation)
 {
     BeginDrawGBufferPass(rc);
     rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     SwitchDrawGBufferPass(rc);
     rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     EndDrawGBufferPass(rc);
 }
 internal static void DrawGBufferPass(MyRenderContext rc, int vertexCount, int startVertexLocation)
 {
     BeginDrawGBufferPass(rc);
     rc.Draw(vertexCount, startVertexLocation);
     SwitchDrawGBufferPass(rc);
     rc.Draw(vertexCount, startVertexLocation);
     EndDrawGBufferPass(rc);
 }
Esempio n. 7
0
 internal static void DrawIndexedInstancedIndirectGBufferPass(MyRenderContext rc, IBuffer bufferForArgsRef, int alignedByteOffsetForArgs)
 {
     BeginDrawGBufferPass(rc);
     rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     SwitchDrawGBufferPass(rc);
     rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     EndDrawGBufferPass(rc);
 }
Esempio n. 8
0
 internal static void DrawIndexedInstancedGBufferPass(MyRenderContext RC, int indexCountPerInstance, int instanceCount, int startIndexLocation, int baseVertexLocation, int startInstanceLocation)
 {
     BeginDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation);
     SwitchDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation);
     EndDrawGBufferPass(RC);
 }
Esempio n. 9
0
 internal static void DrawGBufferPass(MyRenderContext RC, int vertexCount, int startVertexLocation)
 {
     BeginDrawGBufferPass(RC);
     RC.DeviceContext.Draw(vertexCount, startVertexLocation);
     SwitchDrawGBufferPass(RC);
     RC.DeviceContext.Draw(vertexCount, startVertexLocation);
     EndDrawGBufferPass(RC);
 }
Esempio n. 10
0
 internal static void DrawIndexedInstancedIndirectGBufferPass(MyRenderContext RC, Buffer bufferForArgsRef, int alignedByteOffsetForArgs)
 {
     BeginDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     SwitchDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     EndDrawGBufferPass(RC);
 }
 public static void VSBindRawCB_FrameConstants(MyRenderContext RC)
 {
     if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN)
         RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT)
         RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT)
         RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
 }
Esempio n. 12
0
 public static void CSBindRawCB_FrameConstants(MyRenderContext rc)
 {
     if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN)
         rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT)
         rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT)
         rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
 }
        internal static void HandleDeviceReset()
        {
            ResetAdaptersList();
            DisposeDevice();
            CreateDevice(m_windowHandle, m_settings);

            MyRenderContext.OnDeviceReset();
            MyRenderContextPool.OnDeviceReset();

            OnDeviceReset();
        }
Esempio n. 14
0
 internal static void DrawIndexedBillboards(MyRenderContext RC, int indexCount, int startIndexLocation, int baseVertexLocation)
 {
     MyStereoRender.SetViewport(RC, MyStereoRegion.LEFT);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     RC.DeviceContext.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(RC, MyStereoRegion.RIGHT);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     RC.DeviceContext.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(RC, MyStereoRegion.FULLSCREEN);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
 }
 internal static void DrawIndexedBillboards(MyRenderContext rc, int indexCount, int startIndexLocation, int baseVertexLocation)
 {
     MyStereoRender.SetViewport(rc, MyStereoRegion.LEFT);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(rc, MyStereoRegion.RIGHT);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(rc, MyStereoRegion.FULLSCREEN);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
 }
 internal static void DrawIndexedInstancedIndirectGPUParticles(MyRenderContext rc, Buffer bufferForArgsRef, int alignedByteOffsetForArgs)
 {
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     SetViewport(rc, MyStereoRegion.LEFT);
     rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     SetViewport(rc, MyStereoRegion.RIGHT);
     rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     SetViewport(rc, MyStereoRegion.FULLSCREEN);
 }
Esempio n. 17
0
 internal static void DrawIndexedInstancedIndirectGPUParticles(MyRenderContext RC, Buffer bufferForArgsRef, int alignedByteOffsetForArgs)
 {
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     SetViewport(RC, MyStereoRegion.LEFT);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     SetViewport(RC, MyStereoRegion.RIGHT);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     SetViewport(RC, MyStereoRegion.FULLSCREEN);
 }
Esempio n. 18
0
 public static void SetConstants(MyRenderContext rc, ref MyConstantsPack desc, int slot)
 {
     if ((desc.BindFlag & MyBindFlag.BIND_VS) > 0)
     {
         rc.VertexShader.SetConstantBuffer(slot, desc.CB);
     }
     if ((desc.BindFlag & MyBindFlag.BIND_PS) > 0)
     {
         rc.PixelShader.SetConstantBuffer(slot, desc.CB);
     }
     MyRender11.ProcessDebugOutput();
 }
Esempio n. 19
0
        private static void SwitchDrawGBufferPass(MyRenderContext RC)
        {
            SetViewport(RC, MyStereoRegion.RIGHT);

            var viewProjTranspose = Matrix.Transpose(EnvMatricesRightEye.ViewProjectionAt0);
            var mapping           = MyMapping.MapDiscard(RC.DeviceContext, MyCommon.ProjectionConstants);

            mapping.WriteAndPosition(ref viewProjTranspose);
            mapping.Unmap();
            RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants);
            //RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.VRFrameConstantsRightEye);
        }
Esempio n. 20
0
        private static void EndDrawGBufferPass(MyRenderContext RC)
        {
            SetViewport(RC, MyStereoRegion.FULLSCREEN);

            var viewProjTranspose = Matrix.Transpose(MyRender11.Environment.ViewProjectionAt0);
            var mapping           = MyMapping.MapDiscard(RC.DeviceContext, MyCommon.ProjectionConstants);

            mapping.WriteAndPosition(ref viewProjTranspose);
            mapping.Unmap();
            RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants);
            //RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
        }
Esempio n. 21
0
 public static void SetConstants(MyRenderContext rc, ref MyConstantsPack desc, int slot)
 {
     if ((desc.BindFlag & MyBindFlag.BIND_VS) > 0)
     {
         rc.VertexShader.SetConstantBuffer(slot, desc.CB);
     }
     if ((desc.BindFlag & MyBindFlag.BIND_PS) > 0)
     {
         rc.PixelShader.SetConstantBuffer(slot, desc.CB);
     }
     MyRender11.ProcessDebugOutput();
 }
        private static void BeginDrawGBufferPass(MyRenderContext rc)
        {
            SetViewport(rc, MyStereoRegion.LEFT);

            var viewProjTranspose = Matrix.Transpose(EnvMatricesLeftEye.ViewProjectionAt0);
            var mapping           = MyMapping.MapDiscard(rc, MyCommon.ProjectionConstants);

            mapping.WriteAndPosition(ref viewProjTranspose);
            mapping.Unmap();
            rc.AllShaderStages.SetConstantBuffer(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants);
            //RC.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.VRFrameConstantsLeftEye);
        }
Esempio n. 23
0
 public static void SetViewport(MyRenderContext RC, MyStereoRegion region)
 {
     SharpDX.ViewportF viewport = new SharpDX.ViewportF(0, 0, MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y);
     if (region == MyStereoRegion.LEFT)
     {
         viewport = new SharpDX.ViewportF(viewport.X, viewport.Y, viewport.Width / 2, viewport.Height);
     }
     else if (region == MyStereoRegion.RIGHT)
     {
         viewport = new SharpDX.ViewportF(viewport.X + viewport.Width / 2, viewport.Y, viewport.Width / 2, viewport.Height);
     }
     RC.DeviceContext.Rasterizer.SetViewport(viewport);
 }
Esempio n. 24
0
        internal static void BindProxyGeometry(MyRenderableProxy proxy, MyRenderContext rc)
        {
            MyMeshBuffers buffers = proxy.Mesh.Buffers;

            rc.SetVertexBuffer(0, buffers.VB0);
            rc.SetVertexBuffer(1, buffers.VB1);

            if (proxy.InstancingEnabled && proxy.Instancing.VB != null)
            {
                rc.SetVertexBuffer(2, proxy.Instancing.VB);
            }
            rc.SetIndexBuffer(buffers.IB);
        }
Esempio n. 25
0
        internal MyRenderingWork_LoopPassThenObject(MyRenderContext deferredRc, List <MyRenderingWorkItem> subworks)
        {
            m_isDeferred = true;

            m_subworks = subworks;

            AddDeferredContext(deferredRc);
            foreach (var subwork in subworks)
            {
                AddPass(subwork.Pass);
                subwork.Pass.SetContext(deferredRc);
            }
        }
        internal void Init(MyRenderContext deferredRc, List<MyRenderingWorkItem> subworks)
        {
            m_isDeferred = true;

            m_subworks.AddList(subworks);

            AddDeferredContext(deferredRc);
            foreach (var subwork in subworks)
            {
                AddPass(subwork.Pass);
                subwork.Pass.SetContext(deferredRc);
            }
        }
Esempio n. 27
0
        internal void Init(MyRenderContext deferredRc, List <MyRenderingWorkItem> subworks)
        {
            m_isDeferred = true;

            m_subworks.AddList(subworks);

            AddDeferredContext(deferredRc);
            foreach (var subwork in subworks)
            {
                AddPass(subwork.Pass);
                subwork.Pass.SetContext(deferredRc);
            }
        }
Esempio n. 28
0
        static void BindResources(MyRenderContext RC, bool dualSourceBlending)
        {
            if (dualSourceBlending)
            {
                RC.BindGBuffer0ForWrite(MyGBuffer.Main, DepthStencilAccess.DepthReadOnly);
            }
            else
            {
                RC.BindGBufferForWrite(MyGBuffer.Main, DepthStencilAccess.DepthReadOnly);
            }

            RC.BindSRV(0, MyGBuffer.Main.DepthStencil.Depth);
            RC.DeviceContext.PixelShader.SetShaderResource(1, MyRender11.m_gbuffer1Copy.ShaderView);
        }
Esempio n. 29
0
 internal static void SetSrvs(MyRenderContext rc, ref MySrvTable desc)
 {
     if ((desc.BindFlag & MyBindFlag.BIND_VS) > 0)
     {
         for (int i = 0; i < desc.Srvs.Length; i++)
             rc.VertexShader.SetRawSrv(desc.StartSlot + i, desc.Srvs[i]);
     }
     if ((desc.BindFlag & MyBindFlag.BIND_PS) > 0)
     {
         for (int i = 0; i < desc.Srvs.Length; i++)
             rc.PixelShader.SetRawSrv(desc.StartSlot + i, desc.Srvs[i]);
     }
     MyRender11.ProcessDebugOutput();
 }
Esempio n. 30
0
        static void DrawHighlightedPart(MyRenderContext RC, MyPart part, MyInstanceLodState state)
        {
            // settings per part (using MyPart.cs):

            MyShaderBundle shaderBundle = part.GetShaderBundle(state);

            RC.SetInputLayout(shaderBundle.InputLayout);
            RC.VertexShader.Set(shaderBundle.VertexShader);
            RC.PixelShader.Set(shaderBundle.PixelShader);

            // (using MyHighlightPass.cs):
            RC.SetRasterizerState(null);

            RC.DrawIndexed(part.IndicesCount, part.StartIndex, part.StartVertex);
        }
 public static void CSBindRawCB_FrameConstants(MyRenderContext rc)
 {
     if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN)
     {
         rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     }
     else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT)
     {
         rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     }
     else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT)
     {
         rc.ComputeShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     }
 }
Esempio n. 32
0
 public static void VSBindRawCB_FrameConstants(MyRenderContext RC)
 {
     if (MyStereoRender.RenderRegion == MyStereoRegion.FULLSCREEN)
     {
         RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     }
     else if (MyStereoRender.RenderRegion == MyStereoRegion.LEFT)
     {
         RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     }
     else if (MyStereoRender.RenderRegion == MyStereoRegion.RIGHT)
     {
         RC.DeviceContext.VertexShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     }
 }
Esempio n. 33
0
        public static unsafe void MoveConstants(MyRenderContext rc, ref MyConstantsPack desc)
        {
            if (desc.CB == null)
                return;
            // IMPORTANT: It is optimisation but that has not been very well implemented, it is not considered multithread approach, usage of buffers in multiple passes, 
            // reset device and and refillage of the buffers. More complex task to do it properly
            //if (m_staticData.m_constantsVersion.Get(desc.CB) != desc.Version)
            //{
            //    m_staticData.m_constantsVersion[desc.CB] = desc.Version;

                var mapping = MyMapping.MapDiscard(rc, desc.CB);
                mapping.WriteAndPosition(desc.Data, 0, desc.Data.Length);
                mapping.Unmap();
            //}
            //MyRender11.ProcessDebugOutput();
        }
Esempio n. 34
0
        private static MyMapping MapRead(MyRenderContext rc, IResource resource, int bufferSize)
        {
            MyMapping mapping;

            mapping.m_rc         = rc;
            mapping.m_resource   = resource.Resource;
            mapping.m_bufferSize = bufferSize;
            mapping.m_dataBox    = rc.MapSubresource(resource, 0, MapMode.Read, MapFlags.None);

            if (mapping.m_dataBox.IsEmpty)
            {
                throw new MyRenderException("Resource mapping failed!");
            }
            mapping.m_dataPointer = mapping.m_dataBox.DataPointer;

            return(mapping);
        }
Esempio n. 35
0
        internal static void Combine(RwTexId targetArray, MyShadowCascades firstCascades, MyShadowCascades secondCascades)
        {
            if (!MyRender11.Settings.EnableShadows)
            {
                return;
            }

            ProfilerShort.Begin("MyShadowCascadesPostProcess.Combine");
            MyGpuProfiler.IC_BeginBlock("MyShadowCascadesPostProcess.Combine");

            firstCascades.FillConstantBuffer(firstCascades.CascadeConstantBuffer);
            secondCascades.FillConstantBuffer(secondCascades.CascadeConstantBuffer);
            secondCascades.PostProcessor.MarkCascadesInStencil(secondCascades.CascadeInfo);

            MyRenderContext renderContext = MyRenderContext.Immediate;
            DeviceContext   deviceContext = renderContext.DeviceContext;

            deviceContext.PixelShader.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
            deviceContext.PixelShader.SetConstantBuffer(10, firstCascades.CascadeConstantBuffer);
            deviceContext.PixelShader.SetConstantBuffer(11, secondCascades.CascadeConstantBuffer);
            deviceContext.PixelShader.SetConstantBuffer(12, m_inverseConstants);

            for (int subresourceIndex = 0; subresourceIndex < targetArray.Description2d.ArraySize; ++subresourceIndex)
            {
                renderContext.BindGBufferForRead(0, MyGBuffer.Main);
                deviceContext.OutputMerger.SetTargets((DepthStencilView)null, (RenderTargetView)targetArray.SubresourceRtv(subresourceIndex));
                deviceContext.PixelShader.SetShaderResource(0, firstCascades.CascadeShadowmapArray.SubresourceSrv(subresourceIndex));
                deviceContext.PixelShader.SetShaderResource(1, secondCascades.CascadeShadowmapArray.ShaderView);
                //deviceContext.PixelShader.SetShaderResource(4, MyGBuffer.Main.DepthStencil.m_SRV_stencil);
                renderContext.SetPS(m_combinePS);

                Matrix inverseCascadeMatrix = MatrixD.Transpose(MatrixD.Invert(firstCascades.CascadeInfo[subresourceIndex].CurrentLocalToProjection * MyMatrixHelpers.ClipspaceToTexture));
                var    mapping = MyMapping.MapDiscard(m_inverseConstants);
                mapping.WriteAndPosition(ref inverseCascadeMatrix);
                mapping.Unmap();

                MyScreenPass.DrawFullscreenQuad(new MyViewport(0, 0, targetArray.Description2d.Width, targetArray.Description2d.Height));
            }

            deviceContext.OutputMerger.SetTargets(null as DepthStencilView, null as RenderTargetView);
            deviceContext.PixelShader.SetShaderResource(0, null);
            deviceContext.PixelShader.SetShaderResource(1, null);
            deviceContext.PixelShader.SetShaderResource(2, null);
            MyGpuProfiler.IC_EndBlock();
            ProfilerShort.End();
        }
Esempio n. 36
0
        private static MyMapping MapDiscard(MyRenderContext rc, Resource buffer, int bufferSize)
        {
            MyMapping mapping;

            mapping.m_rc         = rc;
            mapping.m_buffer     = buffer;
            mapping.m_bufferSize = bufferSize;
            mapping.m_dataBox    = rc.MapSubresource(buffer, 0, MapMode.WriteDiscard, MapFlags.None);

            if (mapping.m_dataBox.IsEmpty)
            {
                throw new MyRenderException("Resource mapping failed!");
            }
            mapping.m_dataPointer = mapping.m_dataBox.DataPointer;

            return(mapping);
        }
 internal static void DrawIndexedBillboards(MyRenderContext RC, int indexCount, int startIndexLocation, int baseVertexLocation)
 {
     MyStereoRender.SetViewport(RC, MyStereoRegion.LEFT);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     RC.DeviceContext.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(RC, MyStereoRegion.RIGHT);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     RC.DeviceContext.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(RC, MyStereoRegion.FULLSCREEN);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
 }
 static internal void FreeRC(MyRenderContext rc)
 {
     Debug.Assert(rc.OkToRelease);
     m_pool.Return(rc);
 }
Esempio n. 39
0
 internal static CommandList JoinAndGetCommandList(MyRenderContext rc)
 {
     MyGpuProfiler.Join(rc.ProfilingQueries);
     return rc.FinishCommandList(false);
 }
Esempio n. 40
0
 internal static void DrawIndexedBillboards(MyRenderContext rc, int indexCount, int startIndexLocation, int baseVertexLocation)
 {
     MyStereoRender.SetViewport(rc, MyStereoRegion.LEFT);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(rc, MyStereoRegion.RIGHT);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     rc.DrawIndexed(indexCount, startIndexLocation, baseVertexLocation);
     MyStereoRender.SetViewport(rc, MyStereoRegion.FULLSCREEN);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
 }
Esempio n. 41
0
        internal static void BindProxyGeometry(MyRenderableProxy proxy, MyRenderContext renderContext)
        {
            MyMeshBuffers buffers;
            
            if(proxy.Mesh != LodMeshId.NULL)
                buffers = proxy.Mesh.Buffers;
            else
                buffers = proxy.MergedMesh.Buffers;

            bool firstChanged = renderContext.UpdateVB(0, buffers.VB0.Buffer, buffers.VB0.Stride);
            bool secondChanged = renderContext.UpdateVB(1, buffers.VB1.Buffer, buffers.VB1.Stride);
            
            if (firstChanged && secondChanged)
            {
                renderContext.DeviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(buffers.VB0.Buffer, buffers.VB0.Stride, 0));
                renderContext.DeviceContext.InputAssembler.SetVertexBuffers(1, new VertexBufferBinding(buffers.VB1.Buffer, buffers.VB1.Stride, 0));
                renderContext.Stats.SetVB++;
            }
            else if (firstChanged)
            {
                renderContext.DeviceContext.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(buffers.VB0.Buffer, buffers.VB0.Stride, 0));
                renderContext.Stats.SetVB++;
            }
            else if (secondChanged)
            {
                renderContext.DeviceContext.InputAssembler.SetVertexBuffers(1, new VertexBufferBinding(buffers.VB1.Buffer, buffers.VB1.Stride, 0));
                renderContext.Stats.SetVB++;
            }
            
            if (proxy.InstancingEnabled && proxy.Instancing.VB.Index != -1)
            {
                renderContext.DeviceContext.InputAssembler.SetVertexBuffers(2, new VertexBufferBinding(proxy.Instancing.VB.Buffer, proxy.Instancing.VB.Stride, 0));
                renderContext.Stats.SetVB++;
            }
            renderContext.SetIB(buffers.IB.Buffer, buffers.IB.Format);
        }
Esempio n. 42
0
        internal static void BindProxyGeometry(MyRenderableProxy proxy, MyRenderContext rc)
        {
            MyMeshBuffers buffers;
            
            if(proxy.Mesh != LodMeshId.NULL)
                buffers = proxy.Mesh.Buffers;
            else
                buffers = proxy.MergedMesh.Buffers;

            rc.SetVertexBuffer(0, buffers.VB0);
            rc.SetVertexBuffer(1, buffers.VB1);
            
            if (proxy.InstancingEnabled && proxy.Instancing.VB != null)
            {
                rc.SetVertexBuffer(2, proxy.Instancing.VB);

            }
            rc.SetIndexBuffer(buffers.IB);
        }
 public static void SetViewport(MyRenderContext RC, MyStereoRegion region)
 {
     SharpDX.ViewportF viewport = new SharpDX.ViewportF(0, 0, MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y);
     if (region == MyStereoRegion.LEFT)
         viewport = new SharpDX.ViewportF(viewport.X, viewport.Y, viewport.Width / 2, viewport.Height);
     else if (region == MyStereoRegion.RIGHT)
         viewport = new SharpDX.ViewportF(viewport.X + viewport.Width / 2, viewport.Y, viewport.Width / 2, viewport.Height);
     RC.DeviceContext.Rasterizer.SetViewport(viewport);
 }
Esempio n. 44
0
 internal void AddDeferredContext(MyRenderContext rc)
 {
     Contexts.Add(rc);
 }
 static MyRenderContextPool()
 {
     Immediate = new MyRenderContext(MyRender11.ImmediateContext, false);
 }
Esempio n. 46
0
 internal void Cleanup()
 {
     m_RC = null;
 }
Esempio n. 47
0
 internal void SetContext(MyRenderContext rc)
 {
     Debug.Assert(!m_isImmediate && m_RC == null);
     m_RC = rc;
 }
 internal static void DrawIndexedInstancedIndirectGPUParticles(MyRenderContext RC, Buffer bufferForArgsRef, int alignedByteOffsetForArgs)
 {
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     SetViewport(RC, MyStereoRegion.LEFT);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     SetViewport(RC, MyStereoRegion.RIGHT);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     SetViewport(RC, MyStereoRegion.FULLSCREEN);
 }
Esempio n. 49
0
        internal MyRenderingWork_LoopPassThenObject(MyRenderContext deferredRc, List<MyRenderingWorkItem> subworks)
        {
            m_isDeferred = true;

            m_subworks = subworks;

            AddDeferredContext(deferredRc);
            foreach(var subwork in subworks)
            {
                AddPass(subwork.Pass);
                subwork.Pass.SetContext(deferredRc);
            }
        }
 // this method set viewport that is related to the current MyStereoRender.RenderRegion flag
 public static void SetViewport(MyRenderContext RC)
 {
     SetViewport(RC, MyStereoRender.RenderRegion);
 }
Esempio n. 51
0
 protected void AddDeferredContext(MyRenderContext rc)
 {
     Contexts.Add(rc);
 }
        private static void SwitchDrawGBufferPass(MyRenderContext RC)
        {
            SetViewport(RC, MyStereoRegion.RIGHT);

            var viewProjTranspose = Matrix.Transpose(EnvMatricesRightEye.ViewProjectionAt0);
            var mapping = MyMapping.MapDiscard(RC.DeviceContext, MyCommon.ProjectionConstants);
            mapping.WriteAndPosition(ref viewProjTranspose);
            mapping.Unmap();
            RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants);
            //RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.VRFrameConstantsRightEye);
        }
Esempio n. 53
0
        internal static unsafe void FillBuffers(MyRenderableProxy proxy, MyRenderContext rc)
        {
            MyMapping mapping;
            mapping = MyMapping.MapDiscard(rc, proxy.ObjectBuffer);
            if(proxy.NonVoxelObjectData.IsValid)
            {
                mapping.WriteAndPosition(ref proxy.NonVoxelObjectData);
            }
            else if (proxy.VoxelCommonObjectData.IsValid)
            {
                mapping.WriteAndPosition(ref proxy.VoxelCommonObjectData);
            }
            mapping.WriteAndPosition(ref proxy.CommonObjectData);

            if (proxy.SkinningMatrices != null)
            {
                if (proxy.DrawSubmesh.BonesMapping == null)
                {
                    mapping.WriteAndPosition(proxy.SkinningMatrices, Math.Min(MyRender11Constants.SHADER_MAX_BONES, proxy.SkinningMatrices.Length));
                }
                else
                {
                    for (int j = 0; j < proxy.DrawSubmesh.BonesMapping.Length; j++)
                    {
                        mapping.WriteAndPosition(ref proxy.SkinningMatrices[proxy.DrawSubmesh.BonesMapping[j]]);
                    }
                }
            }
            mapping.Unmap();
        }
        private static void EndDrawGBufferPass(MyRenderContext RC)
        {
            SetViewport(RC, MyStereoRegion.FULLSCREEN);

            var viewProjTranspose = Matrix.Transpose(MyRender11.Environment.ViewProjectionAt0);
            var mapping = MyMapping.MapDiscard(RC.DeviceContext, MyCommon.ProjectionConstants);
            mapping.WriteAndPosition(ref viewProjTranspose);
            mapping.Unmap();
            RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants);
            //RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
        }
Esempio n. 55
0
 internal static void DrawIndexedInstancedIndirectGPUParticles(MyRenderContext rc, IBuffer bufferForArgsRef, int alignedByteOffsetForArgs)
 {
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoLeftEye);
     SetViewport(rc, MyStereoRegion.LEFT);
     rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstantsStereoRightEye);
     SetViewport(rc, MyStereoRegion.RIGHT);
     rc.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     rc.AllShaderStages.SetConstantBuffer(MyCommon.FRAME_SLOT, MyCommon.FrameConstants);
     SetViewport(rc, MyStereoRegion.FULLSCREEN);
 }
Esempio n. 56
0
 public static void BindShaderBundle(MyRenderContext rc, MyMaterialShadersBundleId id)
 {
     rc.SetInputLayout(id.IL);
     rc.VertexShader.Set(id.VS);
     rc.PixelShader.Set(id.PS);
 }
 internal static void DrawIndexedInstancedGBufferPass(MyRenderContext RC, int indexCountPerInstance, int instanceCount, int startIndexLocation, int baseVertexLocation, int startInstanceLocation)
 {
     BeginDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation);
     SwitchDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstanced(indexCountPerInstance, instanceCount, startIndexLocation, baseVertexLocation, startInstanceLocation);
     EndDrawGBufferPass(RC);
 }
 internal static void DrawIndexedInstancedIndirectGBufferPass(MyRenderContext RC, Buffer bufferForArgsRef, int alignedByteOffsetForArgs)
 {
     BeginDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     SwitchDrawGBufferPass(RC);
     RC.DeviceContext.DrawIndexedInstancedIndirect(bufferForArgsRef, alignedByteOffsetForArgs);
     EndDrawGBufferPass(RC);
 }
 internal static void DrawGBufferPass(MyRenderContext RC, int vertexCount, int startVertexLocation)
 {
     BeginDrawGBufferPass(RC);
     RC.DeviceContext.Draw(vertexCount, startVertexLocation);
     SwitchDrawGBufferPass(RC);
     RC.DeviceContext.Draw(vertexCount, startVertexLocation);
     EndDrawGBufferPass(RC);
 }
Esempio n. 60
0
        internal virtual void Cleanup()
        {
            m_RC = null;
            if(Locals != null)
                Locals.Clear();
            Stats.Clear();
            m_joined = false;

            m_currentProfilingBlock_renderableType = -1;
            m_currentProfilingBlock_renderableMaterial = string.Empty;

            m_isImmediate = false;
            ViewProjection = default(Matrix);
            Viewport = default(MyViewport);
            DebugName = string.Empty;
            ProcessingMask = 0;
        }