63 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			63 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package command
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"github.com/vkngwrapper/core/v2/core1_0"
							 | 
						||
| 
								 | 
							
									"zworld/engine/renderapi/device"
							 | 
						||
| 
								 | 
							
									"zworld/engine/util"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Pool interface {
							 | 
						||
| 
								 | 
							
									device.Resource[core1_0.CommandPool]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Allocate(level core1_0.CommandBufferLevel) Buffer
							 | 
						||
| 
								 | 
							
									AllocateBuffers(level core1_0.CommandBufferLevel, count int) []Buffer
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type pool struct {
							 | 
						||
| 
								 | 
							
									ptr    core1_0.CommandPool
							 | 
						||
| 
								 | 
							
									device device.T
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func NewPool(device device.T, flags core1_0.CommandPoolCreateFlags, queueFamilyIdx int) Pool {
							 | 
						||
| 
								 | 
							
									ptr, _, err := device.Ptr().CreateCommandPool(nil, core1_0.CommandPoolCreateInfo{
							 | 
						||
| 
								 | 
							
										Flags:            flags,
							 | 
						||
| 
								 | 
							
										QueueFamilyIndex: queueFamilyIdx,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										panic(err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return &pool{
							 | 
						||
| 
								 | 
							
										ptr:    ptr,
							 | 
						||
| 
								 | 
							
										device: device,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (p *pool) Ptr() core1_0.CommandPool {
							 | 
						||
| 
								 | 
							
									return p.ptr
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (p *pool) Destroy() {
							 | 
						||
| 
								 | 
							
									p.ptr.Destroy(nil)
							 | 
						||
| 
								 | 
							
									p.ptr = nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (p *pool) Allocate(level core1_0.CommandBufferLevel) Buffer {
							 | 
						||
| 
								 | 
							
									buffers := p.AllocateBuffers(level, 1)
							 | 
						||
| 
								 | 
							
									return buffers[0]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (p *pool) AllocateBuffers(level core1_0.CommandBufferLevel, count int) []Buffer {
							 | 
						||
| 
								 | 
							
									ptrs, _, err := p.device.Ptr().AllocateCommandBuffers(core1_0.CommandBufferAllocateInfo{
							 | 
						||
| 
								 | 
							
										CommandPool:        p.ptr,
							 | 
						||
| 
								 | 
							
										Level:              level,
							 | 
						||
| 
								 | 
							
										CommandBufferCount: count,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										panic(err)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return util.Map(ptrs, func(ptr core1_0.CommandBuffer) Buffer {
							 | 
						||
| 
								 | 
							
										return newBuffer(p.device, p.ptr, ptr)
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								}
							 |