{"version":3,"file":"GpuBatchAdaptor.mjs","sources":["../../../../src/rendering/batcher/gpu/GpuBatchAdaptor.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { State } from '../../renderers/shared/state/State';\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 { Shader } from '../../renderers/shared/shader/Shader';\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 * @category 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 start(batchPipe: BatcherPipe, geometry: Geometry, shader: Shader): void\n    {\n        const renderer = batchPipe.renderer as WebGPURenderer;\n        const encoder = renderer.encoder as GpuEncoderSystem;\n        const program = shader.gpuProgram;\n\n        this._shader = shader;\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(\n                textureBatch.textures,\n                textureBatch.count,\n                renderer.limits.maxBatchableTextures\n            );\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            batch.topology\n        );\n\n        batch.bindGroup._touch(renderer.gc.now, renderer.tick);\n\n        encoder.setPipeline(pipeline);\n\n        encoder.renderPassEncoder.setBindGroup(1, gpuBindGroup);\n        encoder.renderPassEncoder.drawIndexed(batch.size, 1, batch.start);\n    }\n}\n"],"names":[],"mappings":";;;;;AAWA,MAAM,SAAA,GAAY,MAAM,KAAA,EAAM;AAOvB,MAAM,eAAA,CACb;AAAA,EAYW,KAAA,CAAM,SAAA,EAAwB,QAAA,EAAoB,MAAA,EACzD;AACI,IAAA,MAAM,WAAW,SAAA,CAAU,QAAA;AAC3B,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,MAAM,UAAU,MAAA,CAAO,UAAA;AAEvB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAEjB,IAAA,OAAA,CAAQ,WAAA,CAAY,UAAU,OAAO,CAAA;AAErC,IAAA,SAAA,CAAU,SAAA,GAAY,QAAA;AAGtB,IAAA,QAAA,CAAS,QAAA,CAAS,WAAA;AAAA,MACd,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,MAAM,uBAAA,GAA0B,SAAS,cAAA,CAAe,SAAA;AAOxD,IAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AAExB,IAAA,OAAA,CAAQ,YAAA,CAAa,CAAA,EAAG,uBAAA,EAAyB,OAAO,CAAA;AAAA,EAC5D;AAAA,EAEO,OAAA,CAAQ,WAAwB,KAAA,EACvC;AACI,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,UAAA;AAC7B,IAAA,MAAM,WAAW,SAAA,CAAU,QAAA;AAC3B,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,IAAA,IAAI,CAAC,MAAM,SAAA,EACX;AACI,MAAA,MAAM,eAAe,KAAA,CAAM,QAAA;AAE3B,MAAA,KAAA,CAAM,SAAA,GAAY,wBAAA;AAAA,QACd,YAAA,CAAa,QAAA;AAAA,QACb,YAAA,CAAa,KAAA;AAAA,QACb,SAAS,MAAA,CAAO;AAAA,OACpB;AAAA,IACJ;AAEA,IAAA,SAAA,CAAU,YAAY,KAAA,CAAM,SAAA;AAE5B,IAAA,MAAM,YAAA,GAAe,SAAS,SAAA,CAAU,YAAA;AAAA,MACpC,KAAA,CAAM,SAAA;AAAA,MAAW,OAAA;AAAA,MAAS;AAAA,KAC9B;AAEA,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,CAAS,WAAA;AAAA,MAC/B,IAAA,CAAK,SAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,CAAM;AAAA,KACV;AAEA,IAAA,KAAA,CAAM,UAAU,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,GAAA,EAAK,SAAS,IAAI,CAAA;AAErD,IAAA,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAE5B,IAAA,OAAA,CAAQ,iBAAA,CAAkB,YAAA,CAAa,CAAA,EAAG,YAAY,CAAA;AACtD,IAAA,OAAA,CAAQ,kBAAkB,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,MAAM,KAAK,CAAA;AAAA,EACpE;AACJ;AAAA;AAlFa,eAAA,CAGK,SAAA,GAAY;AAAA,EACtB,IAAA,EAAM;AAAA,IACF,aAAA,CAAc;AAAA,GAClB;AAAA,EACA,IAAA,EAAM;AACV,CAAA;;;;"}