UNPKG

pixi.js

Version:

PixiJS — The HTML5 Creation Engine =============

1 lines 6.47 kB
{"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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"}