Esempio n. 1
0
        public NetworkPipeline CreatePipeline(params Type[] stages)
        {
#if ENABLE_UNITY_COLLECTIONS_CHECKS
            if (m_Pipelines.Length > 255)
            {
                throw new InvalidOperationException("Cannot create more than 255 pipelines on a single driver");
            }
#endif
            var receiveCap = 0;
            var sharedCap  = 0;
            var sendCap    = 0;
            var headerCap  = 0;
            var pipeline   = new PipelineImpl();
            pipeline.FirstStageIndex = m_StageList.Length;
            pipeline.NumStages       = stages.Length;
            for (int i = 0; i < stages.Length; i++)
            {
                var stageId = m_StageCollection.GetStageId(stages[i]);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
                if (stageId < 0)
                {
                    throw new InvalidOperationException("Trying to create pipeline with invalid stage " + stages[i]);
                }
#endif
                m_StageList.Add(stageId);
                receiveCap += m_StageCollection.GetReceiveCapacity(stageId);
                sendCap    += m_StageCollection.GetSendCapacity(stageId);
                headerCap  += m_StageCollection.GetHeaderCapacity(stageId);
                sharedCap  += m_StageCollection.GetSharedStateCapacity(stageId);
            }

            // Make sure all data buffers are 4-byte aligned
            receiveCap = (receiveCap + 3) & (~3);
            sendCap    = (sendCap + 3) & (~3);
            sharedCap  = (sharedCap + 3) & (~3);

            pipeline.receiveBufferOffset          = sizePerConnection[RecveiveSizeOffset];
            sizePerConnection[RecveiveSizeOffset] = sizePerConnection[RecveiveSizeOffset] + receiveCap;

            pipeline.sendBufferOffset         = sizePerConnection[SendSizeOffset];
            sizePerConnection[SendSizeOffset] = sizePerConnection[SendSizeOffset] + sendCap;

            pipeline.sharedBufferOffset         = sizePerConnection[SharedSizeOffset];
            sizePerConnection[SharedSizeOffset] = sizePerConnection[SharedSizeOffset] + sharedCap;

            pipeline.headerCapacity = headerCap;

            m_Pipelines.Add(pipeline);
            return(new NetworkPipeline {
                Id = m_Pipelines.Length
            });
        }
Esempio n. 2
0
            private void ProcessSendStage(int startStage, int internalBufferOffset, int internalSharedBufferOffset,
                                          PipelineImpl p, ref NativeList <int> resumeQ, ref NetworkPipelineContext ctx, ref InboundBufferVec inboundBuffer, ref bool needsUpdate)
            {
                bool needsResume = false;

                ctx.internalProcessBuffer = Unsafe_GetSliceFromReadOnlyArray(sendBuffer, internalBufferOffset,
                                                                             m_StageCollection.GetSendCapacity(m_StageList[p.FirstStageIndex + startStage]));

                ctx.internalSharedProcessBuffer =
                    Unsafe_GetSliceFromReadOnlyArray(sharedBuffer, internalSharedBufferOffset,
                                                     m_StageCollection.GetSharedStateCapacity(m_StageList[p.FirstStageIndex + startStage]));

                inboundBuffer = m_StageCollection.InvokeSend(m_StageList[p.FirstStageIndex + startStage], ctx,
                                                             inboundBuffer, ref needsResume, ref needsUpdate);
                if (needsResume)
                {
                    resumeQ.Add(startStage);
                }
            }
            private unsafe void ProcessSendStage(int startStage, int internalBufferOffset, int internalSharedBufferOffset,
                                                 PipelineImpl p, ref NativeList <int> resumeQ, ref NetworkPipelineContext ctx, ref InboundSendBuffer inboundBuffer, ref NetworkPipelineStage.Requests requests)
            {
                var pipelineStage = m_StageCollection[m_StageList[p.FirstStageIndex + startStage]];

                ctx.staticInstanceBuffer        = (byte *)m_StaticInstanceBuffer.GetUnsafeReadOnlyPtr() + pipelineStage.StaticStateStart;
                ctx.staticInstanceBufferLength  = pipelineStage.StaticStateCapcity;
                ctx.internalProcessBuffer       = (byte *)sendBuffer.GetUnsafeReadOnlyPtr() + internalBufferOffset;
                ctx.internalProcessBufferLength = pipelineStage.SendCapacity;

                ctx.internalSharedProcessBuffer       = (byte *)sharedBuffer.GetUnsafeReadOnlyPtr() + internalSharedBufferOffset;
                ctx.internalSharedProcessBufferLength = pipelineStage.SharedStateCapacity;

                requests = NetworkPipelineStage.Requests.None;
                pipelineStage.Send.Ptr.Invoke(ref ctx, ref inboundBuffer, ref requests);
                if ((requests & NetworkPipelineStage.Requests.Resume) != 0)
                {
                    resumeQ.Add(startStage);
                }
            }