{"version":3,"file":"GpuEncoderSystem.mjs","sources":["../../../../src/rendering/renderers/gpu/GpuEncoderSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\n\nimport type { Rectangle } from '../../../maths/shapes/Rectangle';\nimport type { Buffer } from '../shared/buffer/Buffer';\nimport type { Topology } from '../shared/geometry/const';\nimport type { Geometry } from '../shared/geometry/Geometry';\nimport type { Shader } from '../shared/shader/Shader';\nimport type { UniformGroup } from '../shared/shader/UniformGroup';\nimport type { State } from '../shared/state/State';\nimport type { System } from '../shared/system/System';\nimport type { GPU } from './GpuDeviceSystem';\nimport type { GpuRenderTarget } from './renderTarget/GpuRenderTarget';\nimport type { GpuRenderTargetAdaptor } from './renderTarget/GpuRenderTargetAdaptor';\nimport type { BindGroup } from './shader/BindGroup';\nimport type { GpuProgram } from './shader/GpuProgram';\nimport type { WebGPURenderer } from './WebGPURenderer';\n\n/**\n * The system that handles encoding commands for the GPU.\n * @memberof rendering\n */\nexport class GpuEncoderSystem implements System\n{\n    /** @ignore */\n    public static extension = {\n        type: [ExtensionType.WebGPUSystem],\n        name: 'encoder',\n        priority: 1\n    } as const;\n\n    public commandEncoder: GPUCommandEncoder;\n    public renderPassEncoder: GPURenderPassEncoder;\n    public commandFinished: Promise<void>;\n\n    private _resolveCommandFinished: (value: void) => void;\n\n    private _gpu: GPU;\n    private _boundBindGroup: Record<number, BindGroup> = Object.create(null);\n    private _boundVertexBuffer: Record<number, Buffer> = Object.create(null);\n    private _boundIndexBuffer: Buffer;\n    private _boundPipeline: GPURenderPipeline;\n\n    private readonly _renderer: WebGPURenderer;\n\n    constructor(renderer: WebGPURenderer)\n    {\n        this._renderer = renderer;\n    }\n\n    public renderStart(): void\n    {\n        this.commandFinished = new Promise((resolve) =>\n        {\n            this._resolveCommandFinished = resolve;\n        });\n\n        // generate a render pass description..\n        // create an encoder..\n        this.commandEncoder = this._renderer.gpu.device.createCommandEncoder();\n    }\n\n    public beginRenderPass(gpuRenderTarget: GpuRenderTarget)\n    {\n        this.endRenderPass();\n\n        this._clearCache();\n\n        this.renderPassEncoder = this.commandEncoder.beginRenderPass(gpuRenderTarget.descriptor);\n    }\n\n    public endRenderPass()\n    {\n        if (this.renderPassEncoder)\n        {\n            this.renderPassEncoder.end();\n        }\n\n        this.renderPassEncoder = null;\n    }\n\n    public setViewport(viewport: Rectangle): void\n    {\n        this.renderPassEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);\n    }\n\n    public setPipelineFromGeometryProgramAndState(\n        geometry: Geometry,\n        program: GpuProgram,\n        state: any,\n        topology?: Topology,\n    ): void\n    {\n        const pipeline = this._renderer.pipeline.getPipeline(geometry, program, state, topology);\n\n        this.setPipeline(pipeline);\n    }\n\n    public setPipeline(pipeline: GPURenderPipeline)\n    {\n        if (this._boundPipeline === pipeline) return;\n        this._boundPipeline = pipeline;\n\n        this.renderPassEncoder.setPipeline(pipeline);\n    }\n\n    private _setVertexBuffer(index: number, buffer: Buffer)\n    {\n        if (this._boundVertexBuffer[index] === buffer) return;\n\n        this._boundVertexBuffer[index] = buffer;\n\n        this.renderPassEncoder.setVertexBuffer(index, this._renderer.buffer.updateBuffer(buffer));\n    }\n\n    private _setIndexBuffer(buffer: Buffer)\n    {\n        if (this._boundIndexBuffer === buffer) return;\n\n        this._boundIndexBuffer = buffer;\n\n        const indexFormat = buffer.data.BYTES_PER_ELEMENT === 2 ? 'uint16' : 'uint32';\n\n        this.renderPassEncoder.setIndexBuffer(this._renderer.buffer.updateBuffer(buffer), indexFormat);\n    }\n\n    public resetBindGroup(index: number)\n    {\n        this._boundBindGroup[index] = null;\n    }\n\n    public setBindGroup(index: number, bindGroup: BindGroup, program: GpuProgram)\n    {\n        if (this._boundBindGroup[index] === bindGroup) return;\n        this._boundBindGroup[index] = bindGroup;\n\n        bindGroup._touch(this._renderer.textureGC.count);\n\n        // TODO getting the bind group works as it looks at th e assets and generates a key\n        // should this just be hidden behind a dirty flag?\n        const gpuBindGroup = this._renderer.bindGroup.getBindGroup(bindGroup, program, index);\n\n        // mark each item as having been used..\n        this.renderPassEncoder.setBindGroup(index, gpuBindGroup);\n    }\n\n    public setGeometry(geometry: Geometry, program: GpuProgram)\n    {\n        for (const i in program.attributeData)\n        {\n            this._setVertexBuffer(program.attributeData[i].location, geometry.attributes[i].buffer);\n        }\n\n        if (geometry.indexBuffer)\n        {\n            this._setIndexBuffer(geometry.indexBuffer);\n        }\n    }\n\n    private _setShaderBindGroups(shader: Shader, skipSync?: boolean)\n    {\n        for (const i in shader.groups)\n        {\n            const bindGroup = shader.groups[i] as BindGroup;\n\n            // update any uniforms?\n            if (!skipSync)\n            {\n                this._syncBindGroup(bindGroup);\n            }\n\n            this.setBindGroup(i as unknown as number, bindGroup, shader.gpuProgram);\n        }\n    }\n\n    private _syncBindGroup(bindGroup: BindGroup)\n    {\n        for (const j in bindGroup.resources)\n        {\n            const resource = bindGroup.resources[j];\n\n            if ((resource as UniformGroup).isUniformGroup)\n            {\n                this._renderer.ubo.updateUniformGroup(resource as UniformGroup);\n            }\n        }\n    }\n\n    public draw(options: {\n        geometry: Geometry;\n        shader: Shader;\n        state?: State;\n        topology?: Topology;\n        size?: number;\n        start?: number;\n        instanceCount?: number;\n        skipSync?: boolean;\n    })\n    {\n        const { geometry, shader, state, topology, size, start, instanceCount, skipSync } = options;\n\n        this.setPipelineFromGeometryProgramAndState(geometry, shader.gpuProgram, state, topology);\n        this.setGeometry(geometry, shader.gpuProgram);\n        this._setShaderBindGroups(shader, skipSync);\n\n        if (geometry.indexBuffer)\n        {\n            this.renderPassEncoder.drawIndexed(\n                size || geometry.indexBuffer.data.length,\n                instanceCount || geometry.instanceCount,\n                start || 0\n            );\n        }\n        else\n        {\n            this.renderPassEncoder.draw(size || geometry.getSize(), instanceCount || geometry.instanceCount, start || 0);\n        }\n    }\n\n    public finishRenderPass()\n    {\n        if (this.renderPassEncoder)\n        {\n            this.renderPassEncoder.end();\n            this.renderPassEncoder = null;\n        }\n    }\n\n    public postrender()\n    {\n        this.finishRenderPass();\n\n        this._gpu.device.queue.submit([this.commandEncoder.finish()]);\n\n        this._resolveCommandFinished();\n\n        this.commandEncoder = null;\n    }\n\n    // restores a render pass if finishRenderPass was called\n    // not optimised as really used for debugging!\n    // used when we want to stop drawing and log a texture..\n    public restoreRenderPass()\n    {\n        const descriptor = (this._renderer.renderTarget.adaptor as GpuRenderTargetAdaptor).getDescriptor(\n            this._renderer.renderTarget.renderTarget,\n            false,\n            [0, 0, 0, 1],\n        );\n\n        this.renderPassEncoder = this.commandEncoder.beginRenderPass(descriptor);\n\n        const boundPipeline = this._boundPipeline;\n        const boundVertexBuffer = { ...this._boundVertexBuffer };\n        const boundIndexBuffer = this._boundIndexBuffer;\n        const boundBindGroup = { ...this._boundBindGroup };\n\n        this._clearCache();\n\n        const viewport = this._renderer.renderTarget.viewport;\n\n        this.renderPassEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);\n\n        // reinstate the cache...\n\n        this.setPipeline(boundPipeline);\n\n        for (const i in boundVertexBuffer)\n        {\n            this._setVertexBuffer(i as unknown as number, boundVertexBuffer[i]);\n        }\n\n        for (const i in boundBindGroup)\n        {\n            this.setBindGroup(i as unknown as number, boundBindGroup[i], null);\n        }\n\n        this._setIndexBuffer(boundIndexBuffer);\n    }\n\n    private _clearCache()\n    {\n        for (let i = 0; i < 16; i++)\n        {\n            this._boundBindGroup[i] = null;\n            this._boundVertexBuffer[i] = null;\n        }\n\n        this._boundIndexBuffer = null;\n        this._boundPipeline = null;\n    }\n\n    public destroy()\n    {\n        (this._renderer as null) = null;\n        this._gpu = null;\n        this._boundBindGroup = null;\n        this._boundVertexBuffer = null;\n        this._boundIndexBuffer = null;\n        this._boundPipeline = null;\n    }\n\n    protected contextChange(gpu: GPU): void\n    {\n        this._gpu = gpu;\n    }\n}\n"],"names":[],"mappings":"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"}