Exemple #1
0
        internal unsafe void MoveToGPU()
        {
            if (m_dirty)
            {
                Release();

                fixed(void *ptr = m_vertexStream0)
                {
                    m_VB_positions = MyManagers.Buffers.CreateSrv(
                        "MyMergeInstancing positions", m_vertices, Stride0,
                        new IntPtr(ptr));
                }

                fixed(void *ptr = m_vertexStream1)
                {
                    m_VB_rest = MyManagers.Buffers.CreateSrv(
                        "MyMergeInstancing rest", m_vertices, Stride1,
                        new IntPtr(ptr));
                }

                fixed(void *ptr = m_indexStream)
                {
                    m_IB = MyManagers.Buffers.CreateSrv(
                        "MyMergeInstancing", m_indices, IndexStride,
                        new IntPtr(ptr));
                }

                m_dirty = false;
            }
        }
Exemple #2
0
        internal unsafe static void Init()
        {
            m_cbCustomProjections = MyManagers.Buffers.CreateConstantBuffer("BilloardCustomProjections", sizeof(Matrix) * MAX_CUSTOM_PROJECTIONS_SIZE, usage: ResourceUsage.Dynamic);

            m_vs       = MyShaders.CreateVs("Transparent/Billboards.hlsl");
            m_ps       = MyShaders.CreatePs("Transparent/Billboards.hlsl");
            m_psOIT    = MyShaders.CreatePs("Transparent/Billboards.hlsl", new[] { new ShaderMacro("OIT", null) });
            m_vsLit    = MyShaders.CreateVs("Transparent/Billboards.hlsl", new[] { new ShaderMacro("LIT_PARTICLE", null) });
            m_psLit    = MyShaders.CreatePs("Transparent/Billboards.hlsl", new[] { new ShaderMacro("LIT_PARTICLE", null) });
            m_psLitOIT = MyShaders.CreatePs("Transparent/Billboards.hlsl", new[] { new ShaderMacro("LIT_PARTICLE", null), new ShaderMacro("OIT", null) });

            m_psAlphaCutout       = MyShaders.CreatePs("Transparent/Billboards.hlsl", new[] { new ShaderMacro("ALPHA_CUTOUT", null) });
            m_psAlphaCutoutAndLit = MyShaders.CreatePs("Transparent/Billboards.hlsl",
                                                       new[] { new ShaderMacro("ALPHA_CUTOUT", null), new ShaderMacro("LIT_PARTICLE", null) });
            m_psAlphaCutoutOIT = MyShaders.CreatePs("Transparent/Billboards.hlsl",
                                                    new[] { new ShaderMacro("ALPHA_CUTOUT", null), new ShaderMacro("OIT", null) });
            m_psAlphaCutoutAndLitOIT = MyShaders.CreatePs("Transparent/Billboards.hlsl",
                                                          new[] { new ShaderMacro("ALPHA_CUTOUT", null), new ShaderMacro("LIT_PARTICLE", null), new ShaderMacro("OIT", null) });

            m_psDebugUniformAccum    = MyShaders.CreatePs("Transparent/Billboards.hlsl", new[] { new ShaderMacro("DEBUG_UNIFORM_ACCUM", null) });
            m_psDebugUniformAccumOIT = MyShaders.CreatePs("Transparent/Billboards.hlsl", new[] { new ShaderMacro("DEBUG_UNIFORM_ACCUM", null), new ShaderMacro("OIT", null) });

            m_inputLayout = MyShaders.CreateIL(m_vs.BytecodeId, MyVertexLayouts.GetLayout(MyVertexInputComponentType.POSITION3, MyVertexInputComponentType.TEXCOORD0_H));

            InitBillboardsIndexBuffer();

            m_VB = MyManagers.Buffers.CreateVertexBuffer("MyBillboardRenderer", MAX_BILLBOARDS_SIZE * 4, sizeof(MyVertexFormatPositionTextureH), usage: ResourceUsage.Dynamic);

            var stride = sizeof(MyBillboardData);

            m_SB = MyManagers.Buffers.CreateSrv(
                "MyBillboardRenderer", MAX_BILLBOARDS_SIZE, stride,
                usage: ResourceUsage.Dynamic);
            m_atlas = new MyTextureAtlas("Textures\\Particles\\", "Textures\\Particles\\ParticlesAtlas.tai");
        }
Exemple #3
0
        public void Resize(ISrvBuffer buffer, int newElements, int newByteStride = -1, IntPtr?newData = null)
        {
            MyRenderProxy.Assert(newElements > 0);
            MyRenderProxy.Assert(newByteStride > 0 || newByteStride == -1);

            ResizeInternal(buffer as MySrvBuffer, newElements, newByteStride, newData);
        }
        internal static void OnDeviceReset()
        {
            if (m_buffer != null)
                MyManagers.Buffers.Dispose(m_buffer); m_buffer = null;

            Init();
        }
Exemple #5
0
 internal void Release()
 {
     if (m_VB_positions != null)
     {
         MyManagers.Buffers.Dispose(m_VB_positions); m_VB_positions = null;
         MyManagers.Buffers.Dispose(m_VB_rest); m_VB_rest           = null;
         MyManagers.Buffers.Dispose(m_IB); m_IB = null;
     }
 }
Exemple #6
0
        private static void InitDevice()
        {
            m_particleBuffer = MyManagers.Buffers.CreateSrvUav(
                "MyGPUParticleRenderer::particleBuffer", MyGPUEmitters.MAX_PARTICLES, PARTICLE_STRIDE);
            m_deadListBuffer = MyManagers.Buffers.CreateUav(
                "MyGPUParticleRenderer::deadListBuffer", MyGPUEmitters.MAX_PARTICLES, sizeof(uint),
                uavType: MyUavType.Append);
            m_skippedParticleCountBuffer = MyManagers.Buffers.CreateSrvUav(
                "MyGPUParticleRenderer::skippedParticleCountBuffer", 1, sizeof(uint),
                uavType: MyUavType.Counter);

            // Create a staging buffer that is used to read GPU atomic counter into that can then be mapped for reading
            // back to the CPU for debugging purposes
            m_debugCounterBuffers[0] = MyManagers.Buffers.CreateRead("MyGPUParticleRenderer::debugCounterBuffers[0]", 1, sizeof(uint));
            m_debugCounterBuffers[1] = MyManagers.Buffers.CreateRead("MyGPUParticleRenderer::debugCounterBuffers[1]", 1, sizeof(uint));

            m_activeListConstantBuffer = MyManagers.Buffers.CreateConstantBuffer("MyGPUParticleRenderer::activeListConstantBuffer", 4 * sizeof(uint));

            m_emitterConstantBuffer   = MyManagers.Buffers.CreateConstantBuffer("MyGPUParticleRenderer::emitterConstantBuffer", EMITTERCONSTANTBUFFER_SIZE, usage: ResourceUsage.Dynamic);
            m_emitterStructuredBuffer = MyManagers.Buffers.CreateSrv(
                "MyGPUParticleRenderer::emitterStructuredBuffer", MyGPUEmitters.MAX_LIVE_EMITTERS, EMITTERDATA_SIZE,
                usage: ResourceUsage.Dynamic);

            m_aliveIndexBuffer = MyManagers.Buffers.CreateSrvUav(
                "MyGPUParticleRenderer::aliveIndexBuffer", MyGPUEmitters.MAX_PARTICLES, sizeof(float),
                uavType: MyUavType.Counter);

            m_indirectDrawArgsBuffer = MyManagers.Buffers.CreateIndirectArgsBuffer("MyGPUParticleRenderer::indirectDrawArgsBuffer", 5, sizeof(uint));

            unsafe
            {
                uint[] indices = new uint[MyGPUEmitters.MAX_PARTICLES * 6];
                for (uint i = 0, index = 0, vertex = 0; i < MyGPUEmitters.MAX_PARTICLES; i++)
                {
                    indices[index + 0] = vertex + 0;
                    indices[index + 1] = vertex + 1;
                    indices[index + 2] = vertex + 2;

                    indices[index + 3] = vertex + 2;
                    indices[index + 4] = vertex + 1;
                    indices[index + 5] = vertex + 3;

                    vertex += 4;
                    index  += 6;
                }

                fixed(uint *ptr = indices)
                {
                    m_ib = MyManagers.Buffers.CreateIndexBuffer(
                        "MyGPUParticleRenderer::indexBuffer", MyGPUEmitters.MAX_PARTICLES * 6, new IntPtr(ptr),
                        MyIndexBufferFormat.UInt, ResourceUsage.Immutable);
                }
            }

            //MyRender11.BlendAlphaPremult
        }
Exemple #7
0
        internal static void OnDeviceReset()
        {
            if (m_buffer != null)
            {
                MyManagers.Buffers.Dispose(m_buffer);
            }
            m_buffer = null;

            Init();
        }
Exemple #8
0
 private static void DoneDevice()
 {
     MyManagers.Buffers.Dispose(m_ib); m_ib = null;
     MyManagers.Buffers.Dispose(m_activeListConstantBuffer); m_activeListConstantBuffer = null;
     MyManagers.Buffers.Dispose(m_indirectDrawArgsBuffer); m_indirectDrawArgsBuffer     = null;
     MyManagers.Buffers.Dispose(m_debugCounterBuffers); m_debugCounterBuffers           = new IReadBuffer[m_debugCounterBuffers.Length];
     MyManagers.Buffers.Dispose(m_aliveIndexBuffer); m_aliveIndexBuffer = null;
     MyManagers.Buffers.Dispose(m_deadListBuffer); m_deadListBuffer     = null;
     MyManagers.Buffers.Dispose(m_skippedParticleCountBuffer); m_skippedParticleCountBuffer = null;
     MyManagers.Buffers.Dispose(m_particleBuffer); m_particleBuffer = null;
     MyManagers.Buffers.Dispose(m_emitterConstantBuffer); m_emitterConstantBuffer     = null;
     MyManagers.Buffers.Dispose(m_emitterStructuredBuffer); m_emitterStructuredBuffer = null;
 }
        internal void OnDeviceReset()
        {
            if (m_indirectionBuffer != null)
            {
                MyManagers.Buffers.Dispose(m_indirectionBuffer);
            }
            m_indirectionBuffer = null;
            if (m_instanceBuffer != null)
            {
                MyManagers.Buffers.Dispose(m_instanceBuffer);
            }
            m_instanceBuffer = null;

            Array.Clear(m_srvs, 0, m_srvs.Length);

            m_tableDirty         = true;
            m_instancesDataDirty = true;
        }
Exemple #10
0
        internal static unsafe void Init()
        {
            //MyRender11.RegisterSettingsChangedListener(new OnSettingsChangedDelegate(RecreateShadersForSettings));

            m_directionalEnvironmentLightPixel  = MyShaders.CreatePs("Lighting/LightDir.hlsl");
            m_directionalEnvironmentLightSample = MyShaders.CreatePs("Lighting/LightDir.hlsl", MyRender11.ShaderSampleFrequencyDefine());

            m_pointlightsTiledPixel  = MyShaders.CreatePs("Lighting/LightPoint.hlsl");
            m_pointlightsTiledSample = MyShaders.CreatePs("Lighting/LightPoint.hlsl", MyRender11.ShaderSampleFrequencyDefine());

            m_preparePointLights = MyShaders.CreateCs("Lighting/PrepareLights.hlsl", new[] { new ShaderMacro("NUMTHREADS", TILE_SIZE) });

            m_spotlightProxyVs  = MyShaders.CreateVs("Lighting/LightSpot.hlsl");
            m_spotlightPsPixel  = MyShaders.CreatePs("Lighting/LightSpot.hlsl");
            m_spotlightPsSample = MyShaders.CreatePs("Lighting/LightSpot.hlsl", MyRender11.ShaderSampleFrequencyDefine());
            m_spotlightProxyIl  = MyShaders.CreateIL(m_spotlightProxyVs.BytecodeId, MyVertexLayouts.GetLayout(MyVertexInputComponentType.POSITION_PACKED));

            m_pointlightCullHwBuffer = MyManagers.Buffers.CreateSrv(
                "MyLightRendering", MyRender11Constants.MAX_POINT_LIGHTS, sizeof(MyPointlightConstants),
                usage: ResourceUsage.Dynamic);
        }
Exemple #11
0
 void CreateResizeOrFill <TDataElement>(string name, ref ISrvBuffer buffer, int size, TDataElement[] data, IntPtr rawData)
     where TDataElement : struct
 {
     if (buffer != null && buffer.ElementCount < size)
     {
         MyManagers.Buffers.Resize(buffer, size, newData: rawData);
     }
     if (buffer == null)
     {
         // We can't create ptr to a generic array here, we have to get it through param :'(
         buffer = MyManagers.Buffers.CreateSrv(
             name, size, Marshal.SizeOf <TDataElement>(),
             rawData, ResourceUsage.Dynamic);
     }
     else
     {
         var mapping = MyMapping.MapDiscard(MyImmediateRC.RC, buffer);
         mapping.WriteAndPosition(data, data.Length * Marshal.SizeOf <TDataElement>());
         mapping.Unmap();
     }
 }
 private static void DoneDevice()
 {
     MyManagers.Buffers.Dispose(m_ib); m_ib = null;
     MyManagers.Buffers.Dispose(m_activeListConstantBuffer); m_activeListConstantBuffer = null;
     MyManagers.Buffers.Dispose(m_indirectDrawArgsBuffer); m_indirectDrawArgsBuffer = null;
     MyManagers.Buffers.Dispose(m_debugCounterBuffers); m_debugCounterBuffers = new IReadBuffer[m_debugCounterBuffers.Length];
     MyManagers.Buffers.Dispose(m_aliveIndexBuffer); m_aliveIndexBuffer = null;
     MyManagers.Buffers.Dispose(m_deadListBuffer); m_deadListBuffer = null;
     MyManagers.Buffers.Dispose(m_skippedParticleCountBuffer); m_skippedParticleCountBuffer = null;
     MyManagers.Buffers.Dispose(m_particleBuffer); m_particleBuffer = null;
     MyManagers.Buffers.Dispose(m_emitterConstantBuffer); m_emitterConstantBuffer = null;
     MyManagers.Buffers.Dispose(m_emitterStructuredBuffer); m_emitterStructuredBuffer = null;
 }
        private static void InitDevice()
        {
            m_particleBuffer = MyManagers.Buffers.CreateSrvUav(
                "MyGPUParticleRenderer::particleBuffer", MyGPUEmitters.MAX_PARTICLES, PARTICLE_STRIDE);
            m_deadListBuffer = MyManagers.Buffers.CreateUav(
                "MyGPUParticleRenderer::deadListBuffer", MyGPUEmitters.MAX_PARTICLES, sizeof(uint),
                uavType: MyUavType.Append);
            m_skippedParticleCountBuffer = MyManagers.Buffers.CreateSrvUav(
                "MyGPUParticleRenderer::skippedParticleCountBuffer", 1, sizeof(uint),
                uavType: MyUavType.Counter);

            // Create a staging buffer that is used to read GPU atomic counter into that can then be mapped for reading 
            // back to the CPU for debugging purposes
            m_debugCounterBuffers[0] = MyManagers.Buffers.CreateRead("MyGPUParticleRenderer::debugCounterBuffers[0]", 1, sizeof(uint));
            m_debugCounterBuffers[1] = MyManagers.Buffers.CreateRead("MyGPUParticleRenderer::debugCounterBuffers[1]", 1, sizeof(uint));

            m_activeListConstantBuffer = MyManagers.Buffers.CreateConstantBuffer("MyGPUParticleRenderer::activeListConstantBuffer", 4 * sizeof(uint));

            m_emitterConstantBuffer = MyManagers.Buffers.CreateConstantBuffer("MyGPUParticleRenderer::emitterConstantBuffer", EMITTERCONSTANTBUFFER_SIZE, usage: ResourceUsage.Dynamic);
            m_emitterStructuredBuffer = MyManagers.Buffers.CreateSrv(
                "MyGPUParticleRenderer::emitterStructuredBuffer", MyGPUEmitters.MAX_LIVE_EMITTERS, EMITTERDATA_SIZE,
                usage: ResourceUsage.Dynamic);

            m_aliveIndexBuffer = MyManagers.Buffers.CreateSrvUav(
                "MyGPUParticleRenderer::aliveIndexBuffer", MyGPUEmitters.MAX_PARTICLES, sizeof(float),
                uavType: MyUavType.Counter);

            m_indirectDrawArgsBuffer = MyManagers.Buffers.CreateIndirectArgsBuffer("MyGPUParticleRenderer::indirectDrawArgsBuffer", 5, sizeof(uint));

            unsafe
            {
                uint[] indices = new uint[MyGPUEmitters.MAX_PARTICLES * 6];
                for (uint i = 0, index = 0, vertex = 0; i < MyGPUEmitters.MAX_PARTICLES; i++)
                {
                    indices[index + 0] = vertex + 0;
                    indices[index + 1] = vertex + 1;
                    indices[index + 2] = vertex + 2;

                    indices[index + 3] = vertex + 2;
                    indices[index + 4] = vertex + 1;
                    indices[index + 5] = vertex + 3;

                    vertex += 4;
                    index += 6;
                }
                fixed (uint* ptr = indices)
                {
                    m_ib = MyManagers.Buffers.CreateIndexBuffer(
                        "MyGPUParticleRenderer::indexBuffer", MyGPUEmitters.MAX_PARTICLES * 6, new IntPtr(ptr),
                        MyIndexBufferFormat.UInt, ResourceUsage.Immutable);
                }
            }

            //MyRender11.BlendAlphaPremult
        }
Exemple #14
0
 internal unsafe static void Init()
 {
     m_buffer = MyManagers.Buffers.CreateSrv(
         "MySceneMaterials", 4096, sizeof(MyPerMaterialData),
         usage: ResourceUsage.Dynamic);
 }
 public void Resize(ISrvBuffer buffer, int newElements, int newByteStride = -1, IntPtr?newData = null)
 {
     ResizeInternal(buffer as MySrvBuffer, newElements, newByteStride, newData);
 }
 internal unsafe static void Init()
 {
     m_buffer = MyManagers.Buffers.CreateSrv(
         "MySceneMaterials", 4096, sizeof(MyPerMaterialData),
         usage: ResourceUsage.Dynamic);
 }