Exemple #1
0
        public unsafe void ExecuteAll(OpenGLCommandExecutor executor)
        {
            foreach (OpenGLCommandEntry entry in _commands)
            {
                switch (entry)
                {
                case BeginEntry be:
                    executor.Begin();
                    break;

                case ClearColorTargetEntry ccte:
                    executor.ClearColorTarget(ccte.Index, ccte.ClearColor);
                    break;

                case ClearDepthTargetEntry cdte:
                    executor.ClearDepthTarget(cdte.Depth);
                    break;

                case DrawEntry de:
                    executor.Draw(de.VertexCount, de.InstanceCount, de.VertexCount, de.InstanceCount);
                    break;

                case DrawIndexedEntry dIdx:
                    executor.DrawIndexed(dIdx.IndexCount, dIdx.InstanceCount, dIdx.IndexStart, dIdx.VertexOffset, dIdx.InstanceCount);
                    break;

                case DrawIndirectEntry dInd:
                    executor.DrawIndirect(dInd.IndirectBuffer, dInd.Offset, dInd.DrawCount, dInd.Stride);
                    break;

                case DrawIndexedIndirectEntry dIdxInd:
                    executor.DrawIndexedIndirect(dIdxInd.IndirectBuffer, dIdxInd.Offset, dIdxInd.DrawCount, dIdxInd.Stride);
                    break;

                case DispatchEntry dispatch:
                    executor.Dispatch(dispatch.GroupCountX, dispatch.GroupCountY, dispatch.GroupCountZ);
                    break;

                case DispatchIndirectEntry dispInd:
                    executor.DispatchIndirect(dispInd.IndirectBuffer, dispInd.Offset);
                    break;

                case EndEntry ee:
                    executor.End();
                    break;

                case SetFramebufferEntry sfbe:
                    executor.SetFramebuffer(sfbe.Framebuffer);
                    break;

                case SetIndexBufferEntry sibe:
                    executor.SetIndexBuffer(sibe.Buffer, sibe.Format);
                    break;

                case SetPipelineEntry spe:
                    executor.SetPipeline(spe.Pipeline);
                    break;

                case SetGraphicsResourceSetEntry srse:
                    executor.SetGraphicsResourceSet(srse.Slot, srse.ResourceSet);
                    break;

                case SetScissorRectEntry ssre:
                    executor.SetScissorRect(ssre.Index, ssre.X, ssre.Y, ssre.Width, ssre.Height);
                    break;

                case SetVertexBufferEntry svbe:
                    executor.SetVertexBuffer(svbe.Index, svbe.Buffer);
                    break;

                case SetViewportEntry sve:
                    executor.SetViewport(sve.Index, ref sve.Viewport);
                    break;

                case UpdateBufferEntry ube:
                    fixed(byte *dataPtr = &ube.StagingBlock.Array[0])
                    {
                        executor.UpdateBuffer(ube.Buffer, ube.BufferOffsetInBytes, (IntPtr)dataPtr, ube.StagingBlock.SizeInBytes);
                    }

                    ube.StagingBlock.Free();
                    break;

                case UpdateTextureEntry ute:
                    fixed(byte *dataPtr = &ute.StagingBlock.Array[0])
                    {
                        executor.UpdateTexture(
                            ute.Texture,
                            (IntPtr)dataPtr,
                            ute.X,
                            ute.Y,
                            ute.Z,
                            ute.Width,
                            ute.Height,
                            ute.Depth,
                            ute.MipLevel,
                            ute.ArrayLayer);
                    }

                    ute.StagingBlock.Free();
                    break;

                case UpdateTextureCubeEntry utce:
                    fixed(byte *dataPtr = &utce.StagingBlock.Array[0])
                    {
                        executor.UpdateTextureCube(
                            utce.TextureCube,
                            (IntPtr)dataPtr,
                            utce.Face,
                            utce.X,
                            utce.Y,
                            utce.Width,
                            utce.Height,
                            utce.MipLevel,
                            utce.ArrayLayer);
                    }

                    utce.StagingBlock.Free();
                    break;

                case ResolveTextureEntry rte:
                    executor.ResolveTexture(rte.Source, rte.Destination);
                    break;

                default:
                    throw new InvalidOperationException("Command type not handled: " + executor.GetType().Name);
                }
            }
        }
Exemple #2
0
        public void ExecuteAll(OpenGLCommandExecutor executor)
        {
            foreach (OpenGLCommandEntry entry in _commands)
            {
                switch (entry)
                {
                case BeginEntry be:
                    executor.Begin();
                    break;

                case ClearColorTargetEntry ccte:
                    executor.ClearColorTarget(ccte.Index, ccte.ClearColor);
                    break;

                case ClearDepthTargetEntry cdte:
                    executor.ClearDepthTarget(cdte.Depth);
                    break;

                case DrawEntry de:
                    executor.Draw(de.IndexCount, de.InstanceCount, de.IndexStart, de.VertexOffset, de.InstanceCount);
                    break;

                case EndEntry ee:
                    executor.End();
                    break;

                case SetFramebufferEntry sfbe:
                    executor.SetFramebuffer(sfbe.Framebuffer);
                    break;

                case SetIndexBufferEntry sibe:
                    executor.SetIndexBuffer(sibe.IndexBuffer);
                    break;

                case SetPipelineEntry spe:
                    executor.SetPipeline(spe.Pipeline);
                    break;

                case SetResourceSetEntry srse:
                    executor.SetResourceSet(srse.Slot, srse.ResourceSet);
                    break;

                case SetScissorRectEntry ssre:
                    executor.SetScissorRect(ssre.Index, ssre.X, ssre.Y, ssre.Width, ssre.Height);
                    break;

                case SetVertexBufferEntry svbe:
                    executor.SetVertexBuffer(svbe.Index, svbe.VertexBuffer);
                    break;

                case SetViewportEntry sve:
                    executor.SetViewport(sve.Index, ref sve.Viewport);
                    break;

                case UpdateBufferEntry ube:
                    executor.UpdateBuffer(ube.Buffer, ube.BufferOffsetInBytes, ube.StagingBlock);
                    break;

                case UpdateTextureEntry ute:
                    executor.UpdateTexture(
                        ute.Texture,
                        ute.StagingBlock,
                        ute.X,
                        ute.Y,
                        ute.Z,
                        ute.Width,
                        ute.Height,
                        ute.Depth,
                        ute.MipLevel,
                        ute.ArrayLayer);
                    break;

                case UpdateTextureCubeEntry utce:
                    executor.UpdateTextureCube(
                        utce.TextureCube,
                        utce.StagingBlock,
                        utce.Face,
                        utce.X,
                        utce.Y,
                        utce.Width,
                        utce.Height,
                        utce.MipLevel,
                        utce.ArrayLayer);
                    break;

                default:
                    throw new InvalidOperationException("Command type not handled: " + executor.GetType().Name);
                }
            }
        }