public void FrameUpdate(PipelineCamera cam, ref PipelineCommandData data)
        {
            if (!Decal.decalDatas.isCreated)
            {
                return;
            }
            CommandBuffer buffer = data.buffer;

            handle.Complete();
            DecalStrct *resulPtr = decalCullResults.Ptr();

            if (cullJob.count > decalBuffer.count)
            {
                int oldCount = decalBuffer.count;
                decalBuffer.Dispose();
                decalBuffer = new ComputeBuffer((int)max(oldCount * 1.5f, cullJob.count), sizeof(DecalStrct));
            }
            decalBuffer.SetData(decalCullResults, 0, 0, cullJob.count);
            buffer.SetComputeTextureParam(cbdrShader, CBDRSharedData.DecalCull, ShaderIDs._XYPlaneTexture, lightingEvt.cbdr.xyPlaneTexture);
            buffer.SetComputeTextureParam(cbdrShader, CBDRSharedData.DecalCull, ShaderIDs._ZPlaneTexture, lightingEvt.cbdr.zPlaneTexture);
            buffer.SetComputeBufferParam(cbdrShader, CBDRSharedData.DecalCull, ShaderIDs._AllDecals, decalBuffer);
            buffer.SetComputeBufferParam(cbdrShader, CBDRSharedData.DecalCull, ShaderIDs._DecalIndexBuffer, decalIndexBuffer);
            buffer.SetComputeIntParam(cbdrShader, ShaderIDs._DecalCount, cullJob.count);
            buffer.DispatchCompute(cbdrShader, CBDRSharedData.DecalCull, 1, 1, CBDRSharedData.ZRES);
            buffer.SetGlobalTexture(ShaderIDs._DecalAtlas, decalAlbedoAtlas);
            buffer.SetGlobalTexture(ShaderIDs._DecalNormalAtlas, decalNormalAtlas);
            buffer.SetGlobalBuffer(ShaderIDs._DecalIndexBuffer, decalIndexBuffer);
            buffer.SetGlobalBuffer(ShaderIDs._AllDecals, decalBuffer);
            decalCullResults.Dispose();
            decalCompareResults.Dispose();
        }
            public void Execute()
            {
                MathLib.Quicksort(compares, 0, *count - 1);
                DecalStrct *tempDatas = stackalloc DecalStrct[*count];

                for (int i = 0; i < *count; ++i)
                {
                    tempDatas[i] = decalDatas[compares[i].index];
                }
                UnsafeUtility.MemCpy(decalDatas, tempDatas, *count * sizeof(DecalStrct));
            }