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; } }
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"); }
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(); }
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; } }
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 }
internal static void OnDeviceReset() { if (m_buffer != null) { MyManagers.Buffers.Dispose(m_buffer); } m_buffer = null; Init(); }
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; }
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); }
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 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 }
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); }