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); } } }
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); } } }