public bool AddDrawCommand(GlobalGeometryPartBlockNew part, Bucket sourceBucket, InstanceInfo instanceInfo) { var primitiveType = part.GlobalGeometryPartNewFlags.HasFlag( GlobalGeometryPartBlockNew.Flags.OverrideTriangleList) ? PrimitiveType.Triangles : PrimitiveType.TriangleStrip; if (primitiveType != PrimitiveType) { return(false); } if (sourceBucket != SourceBucket) { return(false); } var locations = sourceBucket[part]; var command = new DrawIndirectCmd( part.StripLength, instanceInfo.Count, // Divide by two because this is an offset and we need an index locations.IndexBaseOffset / sizeof(ushort) + part.StripStartIndex, locations.VertexBaseOffset, instanceInfo.BaseInstance); CommandBuffers.Add(command); return(true); }
/// <summary> /// Initialize the graphic library. /// </summary> public override void Initialize() { base.Initialize(); // - Create a Vulkan instance, this instance must be alive during all the game execution Library.Initialize(TargetSurface); // - Makes a new device manager PhysicalDevice.Initialize(TargetSurface); // - Initialize the physical device on this drawing area GraphicDevice.Initialize(); // - Initialize index and vert manager VertexManager.Setup(); IndexManager.Setup(); // - Makes syncronization semaphores and fances CPU<->GPU for (int i = 0; i < MaxFrameInFlight; ++i) { CommandBuffers.Add(null); Commands.Add(GraphicDevice.Handle.CreateCommandPool(GraphicDevice.GraphicQueueIndex, CommandPoolCreateFlags.ResetCommandBuffer)); ImageAvailableSemaphores.Add(GraphicDevice.Handle.CreateSemaphore()); RenderFinishedSemaphores.Add(GraphicDevice.Handle.CreateSemaphore()); InFlightFences.Add(GraphicDevice.Handle.CreateFence(FenceCreateFlags.Signaled)); } }
/// <summary> /// Register an image for rendering to /// </summary> /// <param name="image"></param> public CommandBuffer RegisterImage(VKImage image) { // Check arguments if (image is null) { throw new ArgumentNullException(nameof(image)); } // Check if active if (!Active) { throw new InvalidOperationException("Effect is not active"); } // Create new command buffer, register the image, and reord the command buffer var cmd = Graphics.GraphicsQueueFamily.CreateCommandBuffers(CommandBufferLevel.Primary, 1)[0]; CommandBuffers.Add(image, cmd); OnRegisterImage(image); OnRecordCommandBuffer(image, cmd); return(cmd); }