public void TestComputeShader() { const string CSVersion = "cs_5_0"; var rc = EngineNS.CEngine.Instance.RenderContext; var macros = new CShaderDefinitions(); macros.SetDefine("USE_STRUCTURED_BUFFERS", ""); var shaderFile = RName.GetRName("Shaders/Compute/test1.compute").Address; var shaderRName_extractID = RName.GetRName("Shaders/Compute/test1.compute"); var shaderRName_calcRate = RName.GetRName("Shaders/Compute/calcrate.compute"); //var shaderRName_clearID = RName.GetRName("Shaders/Compute/clearid.compute"); var csMain0 = rc.CreateShaderDesc(shaderRName_extractID, "CSMain", EShaderType.EST_ComputeShader, macros, CIPlatform.Instance.PlatformType); var csMain1 = rc.CreateShaderDesc(shaderRName_calcRate, "CSMain1", EShaderType.EST_ComputeShader, macros, CIPlatform.Instance.PlatformType); //var csMain2 = rc.CreateShaderDesc(shaderRName_clearID, "CSMain_Clear", EShaderType.EST_ComputeShader, macros, CIPlatform.Instance.PlatformType); var csExtractID = rc.CreateComputeShader(csMain0); var csCalcRate = rc.CreateComputeShader(csMain1); //var csClearID = rc.CreateComputeShader(csMain2); uint numElem = 8; var bfDesc = new CGpuBufferDesc(); bfDesc.SetMode(false, true); bfDesc.ByteWidth = 4 * numElem; bfDesc.StructureByteStride = 4; var buffer = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero); var uavDesc = new CUnorderedAccessViewDesc(); uavDesc.ToDefault(); uavDesc.Buffer.NumElements = numElem; var uav = rc.CreateUnorderedAccessView(buffer, uavDesc); var buffer1 = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero); var uav1 = rc.CreateUnorderedAccessView(buffer1, uavDesc); var cmd = rc.ImmCommandList; cmd.SetComputeShader(csExtractID); UInt32[] pUAVInitialCounts = new UInt32[1] { 1, }; var dsv = this.RenderPolicy.BaseSceneView.FrameBuffer.GetSRV_DepthStencil(); var viewWidth = this.RenderPolicy.BaseSceneView.Viewport.Width; var viewHeight = this.RenderPolicy.BaseSceneView.Viewport.Height; System.Diagnostics.Trace.WriteLine("[TestComputeShader] Framebuffer width :" + viewWidth.ToString() + ", height: " + viewHeight.ToString()); var camVP = this.RenderPolicy.Camera.CameraData.ViewProjection; //var srcTex = CEngine.Instance.TextureManager.GetShaderRView(rc, RName.GetRName("Texture/testActorID.txpic"), true); //if (srcTex != null) //{ // srcTex.PreUse(true); // cmd.CSSetShaderResource(0, srcTex); //} cmd.CSSetShaderResource(0, dsv); cmd.CSSetUnorderedAccessView(0, uav, pUAVInitialCounts); //uint texSizeW = 1092; //uint texSizeH = 516; cmd.CSDispatch((uint)viewWidth / 4, (uint)viewHeight / 4, 1); System.Diagnostics.Trace.WriteLine("[TestComputeShader] Dispatch width :" + viewWidth.ToString() + ", height: " + viewHeight.ToString()); //uint texSize = 512; //cmd.CSDispatch(texSize/8, texSize/8, 1); var blob = new EngineNS.Support.CBlobObject(); buffer.GetBufferData(rc, blob); var idArray = blob.ToUInts(); // fill uav1, clear uav0 cmd.SetComputeShader(csCalcRate); UInt32[] pUAVInitialCounts1 = new UInt32[1] { 1, }; var tempBufferData = new uint[8]; tempBufferData[0] = 9543; tempBufferData[1] = 3756; tempBufferData[2] = 2716; tempBufferData[3] = 297; tempBufferData[4] = 961; tempBufferData[5] = 45046; tempBufferData[6] = 0; tempBufferData[7] = 5686; unsafe { fixed(uint *pData = &tempBufferData[0]) { var buffer2 = rc.CreateGpuBuffer(bfDesc, (IntPtr)pData); var uav2 = rc.CreateUnorderedAccessView(buffer2, uavDesc); cmd.CSSetUnorderedAccessView(0, uav2, pUAVInitialCounts); } } //cmd.CSSetUnorderedAccessView(0, uav, pUAVInitialCounts); cmd.CSSetUnorderedAccessView(1, uav1, pUAVInitialCounts); var cbIndex = csMain1.FindCBufferDesc("CaptureEnv"); if (cbIndex != uint.MaxValue) { var cbuffer = rc.CreateConstantBuffer(csMain1, cbIndex); var varIdx = cbuffer.FindVar("rateWeight"); cbuffer.SetValue(varIdx, new EngineNS.Quaternion(100, 1000, 10000, 100000), 0); cbuffer.FlushContent(rc.ImmCommandList); var cbDesc = new EngineNS.CConstantBufferDesc(); if (csMain1.GetCBufferDesc(cbIndex, ref cbDesc)) { if (cbDesc.Type == EngineNS.ECBufferRhiType.SIT_CBUFFER) { cmd.CSSetConstantBuffer(cbDesc.CSBindPoint, cbuffer); } } } cmd.CSDispatch(8, 1, 1); // gbuffer1 buffer.GetBufferData(rc, blob); idArray = blob.ToUInts(); var blob1 = new EngineNS.Support.CBlobObject(); buffer1.GetBufferData(rc, blob1); var idArray1 = blob1.ToBytes(); var idUintArray1 = blob1.ToUInts(); }
public async System.Threading.Tasks.Task Init(RName name, bool shadow) { mMaxNumber = DefaultMaxNumber; mInstDataArray = new VSInstantData[mMaxNumber]; mPosData = new Vector3[mMaxNumber]; mScaleData = new Vector4[mMaxNumber]; mRotateData = new Quaternion[mMaxNumber]; mF41Data = new UInt32_4[mMaxNumber]; unsafe { var rc = CEngine.Instance.RenderContext; CVertexBufferDesc desc = new CVertexBufferDesc(); desc.CPUAccess = (UInt32)ECpuAccess.CAS_WRITE; desc.ByteWidth = (UInt32)(sizeof(Vector3) * mMaxNumber); desc.Stride = (UInt32)sizeof(Vector3); mPosVB = rc.CreateVertexBuffer(desc); desc.ByteWidth = (UInt32)(sizeof(Vector4) * mMaxNumber); desc.Stride = (UInt32)sizeof(Vector4); mScaleVB = rc.CreateVertexBuffer(desc); desc.ByteWidth = (UInt32)(sizeof(Quaternion) * mMaxNumber); desc.Stride = (UInt32)sizeof(Quaternion); mRotateVB = rc.CreateVertexBuffer(desc); desc.ByteWidth = (UInt32)(sizeof(Vector4) * mMaxNumber); desc.Stride = (UInt32)sizeof(Vector4); mF41VB = rc.CreateVertexBuffer(desc); var bfDesc = new CGpuBufferDesc(); bfDesc.SetMode(true, false); bfDesc.ByteWidth = (uint)(mMaxNumber * sizeof(VSInstantData)); bfDesc.StructureByteStride = (uint)sizeof(VSInstantData); mInstDataBuffer = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero); var srvDesc = new ISRVDesc(); srvDesc.ToDefault(); srvDesc.ViewDimension = EResourceDimension.RESOURCE_DIMENSION_BUFFER; srvDesc.Buffer.ElementOffset = 0; srvDesc.Buffer.NumElements = (uint)mMaxNumber; mInstDataView = rc.CreateShaderResourceViewFromBuffer(mInstDataBuffer, srvDesc); } MeshActor = await Actor.GActor.NewMeshActorAsync(name); MeshComp = MeshActor.GetComponent <GMeshComponent>(); var modifier = MeshComp.SceneMesh.MdfQueue.FindModifier <CGfxInstancingModifier>(); if (modifier == null) { modifier = new CGfxInstancingModifier(); MeshComp.SceneMesh.MdfQueue.AddModifier(modifier); } if (shadow) { modifier.SetShadowHost(this); } else { modifier.SetHost(this); } MeshComp.IsIdentityDrawTransform = true; MeshActor.Placement.Location = Vector3.Zero; CEngine.Instance.HitProxyManager.MapActor(MeshActor); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstPos, mPosVB); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstScale, mScaleVB); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstQuat, mRotateVB); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_F4_1, mF41VB); mAttachSRVs.VSBindTexture(13, mInstDataView); }
public void PushInstance(ref Vector3 pos, ref Vector3 scale, ref Quaternion quat, ref UInt32_4 f41, int lightNum) { var rc = CEngine.Instance.RenderContext; if (mCurSize == mMaxNumber) { var savedNum = mMaxNumber; mMaxNumber = mCurSize * 2; VSInstantData[] newInstData = null; Vector3[] newPos = null; Vector4[] newScale = null; Quaternion[] newQuat = null; UInt32_4[] newF41 = null; if (CRenderContext.ShaderModel >= 4) { newInstData = new VSInstantData[mMaxNumber]; } else { newPos = new Vector3[mMaxNumber]; newScale = new Vector4[mMaxNumber]; newQuat = new Quaternion[mMaxNumber]; newF41 = new UInt32_4[mMaxNumber]; } unsafe { if (CRenderContext.ShaderModel >= 4) { fixed(VSInstantData *src = &mInstDataArray[0]) fixed(VSInstantData * dest = &newInstData[0]) { CoreSDK.SDK_Memory_Copy(dest, src, (UInt32)(sizeof(VSInstantData) * savedNum)); } var bfDesc = new CGpuBufferDesc(); bfDesc.SetMode(true, false); bfDesc.ByteWidth = (uint)(mMaxNumber * sizeof(VSInstantData)); bfDesc.StructureByteStride = (uint)sizeof(VSInstantData); mInstDataBuffer = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero); var srvDesc = new ISRVDesc(); srvDesc.ToDefault(); srvDesc.ViewDimension = EResourceDimension.RESOURCE_DIMENSION_BUFFER; srvDesc.Buffer.ElementOffset = 0; srvDesc.Buffer.NumElements = (uint)mMaxNumber; mInstDataView = rc.CreateShaderResourceViewFromBuffer(mInstDataBuffer, srvDesc); mAttachSRVs.VSBindTexture(13, mInstDataView); } else { fixed(Vector3 *src = &mPosData[0]) fixed(Vector3 * dest = &newPos[0]) { CoreSDK.SDK_Memory_Copy(dest, src, (UInt32)(sizeof(Vector3) * savedNum)); } fixed(Vector4 *src = &mScaleData[0]) fixed(Vector4 * dest = &newScale[0]) { CoreSDK.SDK_Memory_Copy(dest, src, (UInt32)(sizeof(Vector3) * savedNum)); } fixed(Quaternion *src = &mRotateData[0]) fixed(Quaternion * dest = &newQuat[0]) { CoreSDK.SDK_Memory_Copy(dest, src, (UInt32)(sizeof(Quaternion) * savedNum)); } fixed(UInt32_4 *src = &mF41Data[0]) fixed(UInt32_4 * dest = &newF41[0]) { CoreSDK.SDK_Memory_Copy(dest, src, (UInt32)(sizeof(UInt32_4) * savedNum)); } CVertexBufferDesc desc = new CVertexBufferDesc(); desc.ByteWidth = (UInt32)(sizeof(Vector3) * mMaxNumber); desc.Stride = (UInt32)sizeof(Vector3); mPosVB = rc.CreateVertexBuffer(desc); desc.ByteWidth = (UInt32)(sizeof(Vector4) * mMaxNumber); desc.Stride = (UInt32)sizeof(Vector4); mScaleVB = rc.CreateVertexBuffer(desc); desc.ByteWidth = (UInt32)(sizeof(Quaternion) * mMaxNumber); desc.Stride = (UInt32)sizeof(Quaternion); mRotateVB = rc.CreateVertexBuffer(desc); desc.ByteWidth = (UInt32)(sizeof(Vector4) * mMaxNumber); desc.Stride = (UInt32)sizeof(Vector4); mF41VB = rc.CreateVertexBuffer(desc); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstPos, mPosVB); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstScale, mScaleVB); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_InstQuat, mRotateVB); mAttachVBs.BindVertexBuffer(EVertexSteamType.VST_F4_1, mF41VB); } } mInstDataArray = newInstData; mPosData = newPos; mScaleData = newScale; mRotateData = newQuat; mF41Data = newF41; } if (CRenderContext.ShaderModel >= 4) { mInstDataArray[mCurSize].WorldMatrix = Matrix.Transformation(scale, quat, pos); mInstDataArray[mCurSize].WorldMatrix.Transpose(); mInstDataArray[mCurSize].CustomData.x = (uint)lightNum; mInstDataArray[mCurSize].PointLightIndices = f41; } else { mPosData[mCurSize] = pos; mScaleData[mCurSize].X = scale.X; mScaleData[mCurSize].Y = scale.Y; mScaleData[mCurSize].Z = scale.Z; mScaleData[mCurSize].W = lightNum; mRotateData[mCurSize] = quat; mF41Data[mCurSize] = f41; } mCurSize++; }
public unsafe void UpdateGpuBuffer(CRenderContext rc, EngineNS.CCommandList cmd, Graphics.CGfxCamera Camera) { if (UseVTF) { UpdateGpuBufferVTF(rc, cmd, Camera); } else { var bfDesc = new CGpuBufferDesc(); //mAllVertexSRV { bfDesc.SetMode(false, false); bfDesc.ByteWidth = (uint)(mAllVertices.Count * sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuSceneVertex)); bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuSceneVertex); var copyArray = mAllVertices.ToArray(); fixed(EngineNS.Bricks.GpuDriven.Cluster.GpuSceneVertex *p = ©Array[0]) { bufferAllVertex = rc.CreateGpuBuffer(bfDesc, (IntPtr)p); } var srvDesc = new ISRVDesc(); srvDesc.ToDefault(); srvDesc.ViewDimension = EResourceDimension.RESOURCE_DIMENSION_BUFFER; srvDesc.Buffer.ElementOffset = 0; srvDesc.Buffer.NumElements = (uint)mAllVertices.Count; mAllVertexSRV = rc.CreateShaderResourceViewFromBuffer(bufferAllVertex, srvDesc); } //uavMeshInstanceArray { bfDesc.SetMode(false, true); bfDesc.ByteWidth = (uint)(GpuInstanceDatas.Count * sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData)); bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData); var copyArray = GpuInstanceDatas.ToArray(); fixed(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData *p = ©Array[0]) { bufferMeshInstanceArray = rc.CreateGpuBuffer(bfDesc, (IntPtr)p); //bufferMeshInstanceArray.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth); } var uavDesc = new CUnorderedAccessViewDesc(); uavDesc.ToDefault(); uavDesc.Buffer.NumElements = (uint)GpuInstanceDatas.Count; uavMeshInstanceArray = rc.CreateUnorderedAccessView(bufferMeshInstanceArray, uavDesc); var srvDesc = new ISRVDesc(); srvDesc.ToDefault(); srvDesc.ViewDimension = EResourceDimension.RESOURCE_DIMENSION_BUFFER; srvDesc.Buffer.ElementOffset = 0; srvDesc.Buffer.NumElements = (uint)GpuInstanceDatas.Count; mMeshInstanceSRV = rc.CreateShaderResourceViewFromBuffer(bufferMeshInstanceArray, srvDesc); } } if (UseComputeShader) { var bfDesc = new CGpuBufferDesc(); if (uavMeshInstanceArray == null) { bfDesc.SetMode(false, true); bfDesc.ByteWidth = (uint)(GpuInstanceDatas.Count * sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData)); bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData); var copyArray = GpuInstanceDatas.ToArray(); fixed(EngineNS.Bricks.GpuDriven.GpuScene.GpuMeshInstanceData *p = ©Array[0]) { bufferMeshInstanceArray = rc.CreateGpuBuffer(bfDesc, (IntPtr)p); //bufferMeshInstanceArray.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth); } var uavDesc = new CUnorderedAccessViewDesc(); uavDesc.ToDefault(); uavDesc.Buffer.NumElements = (uint)GpuInstanceDatas.Count; uavMeshInstanceArray = rc.CreateUnorderedAccessView(bufferMeshInstanceArray, uavDesc); var srvDesc = new ISRVDesc(); srvDesc.ToDefault(); srvDesc.ViewDimension = EResourceDimension.RESOURCE_DIMENSION_BUFFER; srvDesc.Buffer.ElementOffset = 0; srvDesc.Buffer.NumElements = (uint)GpuInstanceDatas.Count; mMeshInstanceSRV = rc.CreateShaderResourceViewFromBuffer(bufferMeshInstanceArray, srvDesc); } //uavClusterArray { bfDesc.SetMode(false, true); bfDesc.ByteWidth = (uint)(GpuClusters.Count * sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuCluster)); bfDesc.StructureByteStride = (uint)sizeof(EngineNS.Bricks.GpuDriven.Cluster.GpuCluster); var copyArray = GpuClusters.ToArray(); fixed(EngineNS.Bricks.GpuDriven.Cluster.GpuCluster *p = ©Array[0]) { bufferClusterArray = rc.CreateGpuBuffer(bfDesc, (IntPtr)p); //bufferClusterArray.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth); } var uavDesc = new CUnorderedAccessViewDesc(); uavDesc.ToDefault(); uavDesc.Buffer.NumElements = (uint)GpuClusters.Count; uavClusterArray = rc.CreateUnorderedAccessView(bufferClusterArray, uavDesc); } //uavStaticSceneAllFaces { bfDesc.SetMode(false, true); bfDesc.ByteWidth = (uint)(AllIndices.Count * sizeof(uint)); bfDesc.StructureByteStride = (uint)sizeof(uint); var copyArray = AllIndices.ToArray(); fixed(uint *p = ©Array[0]) { bufferStaticSceneAllFaces = rc.CreateGpuBuffer(bfDesc, (IntPtr)p); //bufferStaticSceneAllFaces.UpdateBufferData(cmd, (IntPtr)p, bfDesc.ByteWidth); } var uavDesc = new CUnorderedAccessViewDesc(); uavDesc.ToDefault(); uavDesc.Buffer.NumElements = (uint)(AllIndices.Count); uavStaticSceneAllFaces = rc.CreateUnorderedAccessView(bufferStaticSceneAllFaces, uavDesc); } //uavStaticSceneDrawFaces { bfDesc.SetMode(false, true); int MaxInstanceNumber = 20; bfDesc.ByteWidth = (uint)(AllIndices.Count * MaxInstanceNumber * sizeof(uint)); bfDesc.StructureByteStride = (uint)sizeof(uint); bfDesc.MiscFlags = (UInt32)EResourceMiscFlag.BUFFER_ALLOW_RAW_VIEWS; bfDesc.BindFlags |= (UInt32)EBindFlag.INDEX_BUFFER; bfDesc.CPUAccessFlags = 0; bufferStaticSceneDrawFaces = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero); var uavDesc = new CUnorderedAccessViewDesc(); uavDesc.ToDefault(); uavDesc.Format = EPixelFormat.PXF_R32_TYPELESS; uavDesc.Buffer.NumElements = (uint)(AllIndices.Count * MaxInstanceNumber); uavDesc.Buffer.Flags = (UInt32)EUAVBufferFlag.UAV_FLAG_RAW; uavStaticSceneDrawFaces = rc.CreateUnorderedAccessView(bufferStaticSceneDrawFaces, uavDesc); var ibDesc = new CIndexBufferDesc(); ibDesc.CPUAccess = 0; ibDesc.InitData = IntPtr.Zero; ibDesc.ByteWidth = bfDesc.ByteWidth; ibDesc.Type = EIndexBufferType.IBT_Int32; mDrawIndexBuffer = rc.CreateIndexBufferFromBuffer(ibDesc, bufferStaticSceneDrawFaces); } //uavIndirectDrawArgs { bfDesc.SetMode(false, true); bfDesc.ByteWidth = 20; //(uint)(1 * sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs)); bfDesc.StructureByteStride = 4; //(uint)sizeof(EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs); bfDesc.MiscFlags = (UInt32)(EResourceMiscFlag.DRAWINDIRECT_ARGS | EResourceMiscFlag.BUFFER_ALLOW_RAW_VIEWS); bfDesc.CPUAccessFlags = 0; bufferIndirectDrawArgs = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero); var uavDesc = new CUnorderedAccessViewDesc(); uavDesc.ToDefault(); uavDesc.Format = EPixelFormat.PXF_R32_TYPELESS; uavDesc.Buffer.NumElements = (uint)(5); uavDesc.Buffer.Flags = (UInt32)EUAVBufferFlag.UAV_FLAG_RAW; uavIndirectDrawArgs = rc.CreateUnorderedAccessView(bufferIndirectDrawArgs, uavDesc); var drawAgrs = new EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs(); drawAgrs.InstanceCount = 1; drawAgrs.StartInstanceLocation = 0; drawAgrs.IndexCountPerInstance = 0; bufferIndirectDrawArgs.UpdateBufferData(cmd, (IntPtr)(&drawAgrs), bfDesc.ByteWidth); } ComputeDispatch(rc, cmd, Camera); } else { CIndexBufferDesc ibDesc = new CIndexBufferDesc(EIndexBufferType.IBT_Int32); ibDesc.CPUAccess = (UInt32)ECpuAccess.CAS_WRITE; ibDesc.ByteWidth = (uint)(mAllIndices.Count * sizeof(UInt32) * 20); mCpuDrawIndexBuffer = rc.CreateIndexBuffer(ibDesc); } //CEngine.Instance.EventPoster.RunOn(() => //{ // var blobDrawArgs = new EngineNS.Support.CBlobObject(); // bufferIndirectDrawArgs.GetBufferData(rc, blobDrawArgs); // EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs* pArg = (EngineNS.Bricks.GpuDriven.GpuScene.GpuDrawArgs*)blobDrawArgs.Data.ToPointer(); // if (pArg != null) // { // mDrawArgs = *pArg; // } // return null; //}, Thread.Async.EAsyncTarget.Main); }