shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$GpuEncoderSystem = function(global, require, module, exports) {
  global = require("module$node_modules$pixi_DOT_js$lib$extensions$Extensions");
  "use strict";
  class GpuEncoderSystem {
    constructor(renderer) {
      this._boundBindGroup = Object.create(null);
      this._boundVertexBuffer = Object.create(null);
      this._renderer = renderer;
    }
    renderStart() {
      this.commandFinished = new Promise(resolve => {
        this._resolveCommandFinished = resolve;
      });
      this.commandEncoder = this._renderer.gpu.device.createCommandEncoder();
    }
    beginRenderPass(gpuRenderTarget) {
      this.endRenderPass();
      this._clearCache();
      this.renderPassEncoder = this.commandEncoder.beginRenderPass(gpuRenderTarget.descriptor);
    }
    endRenderPass() {
      this.renderPassEncoder && this.renderPassEncoder.end();
      this.renderPassEncoder = null;
    }
    setViewport(viewport) {
      this.renderPassEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);
    }
    setPipelineFromGeometryProgramAndState(geometry, program, state, topology) {
      geometry = this._renderer.pipeline.getPipeline(geometry, program, state, topology);
      this.setPipeline(geometry);
    }
    setPipeline(pipeline) {
      this._boundPipeline !== pipeline && (this._boundPipeline = pipeline, this.renderPassEncoder.setPipeline(pipeline));
    }
    _setVertexBuffer(index, buffer) {
      this._boundVertexBuffer[index] !== buffer && (this._boundVertexBuffer[index] = buffer, this.renderPassEncoder.setVertexBuffer(index, this._renderer.buffer.updateBuffer(buffer)));
    }
    _setIndexBuffer(buffer) {
      if (this._boundIndexBuffer !== buffer) {
        this._boundIndexBuffer = buffer;
        var indexFormat = 2 === buffer.data.BYTES_PER_ELEMENT ? "uint16" : "uint32";
        this.renderPassEncoder.setIndexBuffer(this._renderer.buffer.updateBuffer(buffer), indexFormat);
      }
    }
    resetBindGroup(index) {
      this._boundBindGroup[index] = null;
    }
    setBindGroup(index, bindGroup, program) {
      this._boundBindGroup[index] !== bindGroup && (this._boundBindGroup[index] = bindGroup, bindGroup._touch(this._renderer.gc.now, this._renderer.tick), bindGroup = this._renderer.bindGroup.getBindGroup(bindGroup, program, index), this.renderPassEncoder.setBindGroup(index, bindGroup));
    }
    setGeometry(geometry, program) {
      program = this._renderer.pipeline.getBufferNamesToBind(geometry, program);
      for (const i in program) {
        this._setVertexBuffer(parseInt(i, 10), geometry.attributes[program[i]].buffer);
      }
      geometry.indexBuffer && this._setIndexBuffer(geometry.indexBuffer);
    }
    _setShaderBindGroups(shader, skipSync) {
      for (const i in shader.groups) {
        const bindGroup = shader.groups[i];
        skipSync || this._syncBindGroup(bindGroup);
        this.setBindGroup(i, bindGroup, shader.gpuProgram);
      }
    }
    _syncBindGroup(bindGroup) {
      for (const j in bindGroup.resources) {
        const resource = bindGroup.resources[j];
        resource.isUniformGroup && this._renderer.ubo.updateUniformGroup(resource);
      }
    }
    draw(options) {
      const {geometry, shader, state, topology, size, start, instanceCount, skipSync} = options;
      this.setPipelineFromGeometryProgramAndState(geometry, shader.gpuProgram, state, topology);
      this.setGeometry(geometry, shader.gpuProgram);
      this._setShaderBindGroups(shader, skipSync);
      geometry.indexBuffer ? this.renderPassEncoder.drawIndexed(size || geometry.indexBuffer.data.length, instanceCount ?? geometry.instanceCount, start || 0) : this.renderPassEncoder.draw(size || geometry.getSize(), instanceCount ?? geometry.instanceCount, start || 0);
    }
    finishRenderPass() {
      this.renderPassEncoder && (this.renderPassEncoder.end(), this.renderPassEncoder = null);
    }
    postrender() {
      this.finishRenderPass();
      this._gpu.device.queue.submit([this.commandEncoder.finish()]);
      this._resolveCommandFinished();
      this.commandEncoder = null;
    }
    restoreRenderPass() {
      var descriptor = this._renderer.renderTarget.adaptor.getDescriptor(this._renderer.renderTarget.renderTarget, !1, [0, 0, 0, 1], this._renderer.renderTarget.mipLevel, this._renderer.renderTarget.layer);
      this.renderPassEncoder = this.commandEncoder.beginRenderPass(descriptor);
      descriptor = this._boundPipeline;
      const boundVertexBuffer = {...this._boundVertexBuffer}, boundIndexBuffer = this._boundIndexBuffer, boundBindGroup = {...this._boundBindGroup};
      this._clearCache();
      const viewport = this._renderer.renderTarget.viewport;
      this.renderPassEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);
      this.setPipeline(descriptor);
      for (const i in boundVertexBuffer) {
        this._setVertexBuffer(i, boundVertexBuffer[i]);
      }
      for (const i in boundBindGroup) {
        this.setBindGroup(i, boundBindGroup[i], null);
      }
      this._setIndexBuffer(boundIndexBuffer);
    }
    _clearCache() {
      for (let i = 0; 16 > i; i++) {
        this._boundBindGroup[i] = null, this._boundVertexBuffer[i] = null;
      }
      this._boundPipeline = this._boundIndexBuffer = null;
    }
    destroy() {
      this._boundPipeline = this._boundIndexBuffer = this._boundVertexBuffer = this._boundBindGroup = this._gpu = this._renderer = null;
    }
    contextChange(gpu) {
      this._gpu = gpu;
    }
  }
  GpuEncoderSystem.extension = {type:[global.ExtensionType.WebGPUSystem], name:"encoder", priority:1};
  exports.GpuEncoderSystem = GpuEncoderSystem;
};

//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$GpuEncoderSystem.js.map
