{"version":3,"file":"GpuBatchAdaptor.mjs","sources":["../../../../src/rendering/batcher/gpu/GpuBatchAdaptor.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { compileHighShaderGpuProgram } from '../../high-shader/compileHighShaderToProgram';\nimport { colorBit } from '../../high-shader/shader-bits/colorBit';\nimport { generateTextureBatchBit } from '../../high-shader/shader-bits/generateTextureBatchBit';\nimport { roundPixelsBit } from '../../high-shader/shader-bits/roundPixelsBit';\nimport { Shader } from '../../renderers/shared/shader/Shader';\nimport { State } from '../../renderers/shared/state/State';\nimport { getMaxTexturesPerBatch } from '../gl/utils/maxRecommendedTextures';\nimport { getTextureBatchBindGroup } from './getTextureBatchBindGroup';\n\nimport type { GpuEncoderSystem } from '../../renderers/gpu/GpuEncoderSystem';\nimport type { WebGPURenderer } from '../../renderers/gpu/WebGPURenderer';\nimport type { Geometry } from '../../renderers/shared/geometry/Geometry';\nimport type { Batch } from '../shared/Batcher';\nimport type { BatcherAdaptor, BatcherPipe } from '../shared/BatcherPipe';\n\nconst tempState = State.for2d();\n\n/**\n * A BatcherAdaptor that uses the GPU to render batches.\n * @memberof rendering\n * @ignore\n */\nexport class GpuBatchAdaptor implements BatcherAdaptor\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUPipesAdaptor,\n        ],\n        name: 'batch',\n    } as const;\n\n    private _shader: Shader;\n    private _geometry: Geometry;\n\n    public init()\n    {\n        const gpuProgram = compileHighShaderGpuProgram({\n            name: 'batch',\n            bits: [\n                colorBit,\n                generateTextureBatchBit(getMaxTexturesPerBatch()),\n                roundPixelsBit,\n            ]\n        });\n\n        this._shader = new Shader({\n            gpuProgram,\n            groups: {\n                // these will be dynamically allocated\n            },\n        });\n    }\n\n    public start(batchPipe: BatcherPipe, geometry: Geometry): void\n    {\n        const renderer = batchPipe.renderer as WebGPURenderer;\n        const encoder = renderer.encoder as GpuEncoderSystem;\n        const program = this._shader.gpuProgram;\n\n        this._geometry = geometry;\n\n        encoder.setGeometry(geometry, program);\n\n        tempState.blendMode = 'normal';\n\n        // this just initiates the pipeline, so we can then set bind groups on it\n        renderer.pipeline.getPipeline(\n            geometry,\n            program,\n            tempState\n        );\n\n        const globalUniformsBindGroup = renderer.globalUniforms.bindGroup;\n\n        // low level - we need to reset the bind group at location 1 to null\n        // this is because we directly manipulate the bound buffer in the execute function for\n        // performance reasons.\n        // setting it to null ensures that the next bind group we set at location 1 will\n        // be the one we want.\n        encoder.resetBindGroup(1);\n\n        encoder.setBindGroup(0, globalUniformsBindGroup, program);\n    }\n\n    public execute(batchPipe: BatcherPipe, batch: Batch): void\n    {\n        const program = this._shader.gpuProgram;\n        const renderer = batchPipe.renderer as WebGPURenderer;\n        const encoder = renderer.encoder as GpuEncoderSystem;\n\n        if (!batch.bindGroup)\n        {\n            const textureBatch = batch.textures;\n\n            batch.bindGroup = getTextureBatchBindGroup(textureBatch.textures, textureBatch.count);\n        }\n\n        tempState.blendMode = batch.blendMode;\n\n        const gpuBindGroup = renderer.bindGroup.getBindGroup(\n            batch.bindGroup, program, 1\n        );\n\n        const pipeline = renderer.pipeline.getPipeline(\n            this._geometry,\n            program,\n            tempState\n        );\n\n        batch.bindGroup._touch(renderer.textureGC.count);\n\n        encoder.setPipeline(pipeline);\n\n        encoder.renderPassEncoder.setBindGroup(1, gpuBindGroup);\n        encoder.renderPassEncoder.drawIndexed(batch.size, 1, batch.start);\n    }\n\n    public destroy(): void\n    {\n        this._shader.destroy(true);\n        this._shader = null;\n    }\n}\n"],"names":[],"mappings":"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"}