shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$GpuTextureSystem = function(global, require, module, exports) {
  var adapter = require("module$node_modules$pixi_DOT_js$lib$environment$adapter");
  global = require("module$node_modules$pixi_DOT_js$lib$extensions$Extensions");
  var GCManagedHash = require("module$node_modules$pixi_DOT_js$lib$utils$data$GCManagedHash"), UniformGroup = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$shader$UniformGroup"), CanvasPool = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$texture$CanvasPool"), BindGroup = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$shader$BindGroup"), gpuUploadBufferImageResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$uploaders$gpuUploadBufferImageResource"), 
  gpuUploadCompressedTextureResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$uploaders$gpuUploadCompressedTextureResource"), gpuUploadCubeTextureResource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$uploaders$gpuUploadCubeTextureResource"), gpuUploadImageSource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$uploaders$gpuUploadImageSource"), gpuUploadVideoSource = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$uploaders$gpuUploadVideoSource"), 
  GpuMipmapGenerator = require("module$node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$utils$GpuMipmapGenerator");
  "use strict";
  class GPUTextureGpuData {
    constructor(gpuTexture) {
      this.textureView = null;
      this.gpuTexture = gpuTexture;
    }
    destroy() {
      this.gpuTexture.destroy();
      this.gpuTexture = this.textureView = null;
    }
  }
  const node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$GpuTextureSystem$classdecl$var23 = class {
    constructor(renderer) {
      this._gpuSamplers = Object.create(null);
      this._bindGroupHash = Object.create(null);
      this._renderer = renderer;
      renderer.gc.addCollection(this, "_bindGroupHash", "hash");
      this._managedTextures = new GCManagedHash.GCManagedHash({renderer, type:"resource", onUnload:this.onSourceUnload.bind(this), name:"gpuTextureSource"});
      renderer = {image:gpuUploadImageSource.gpuUploadImageResource, buffer:gpuUploadBufferImageResource.gpuUploadBufferImageResource, video:gpuUploadVideoSource.gpuUploadVideoResource, compressed:gpuUploadCompressedTextureResource.gpuUploadCompressedTextureResource, ...node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$GpuTextureSystem$classdecl$var23.uploadExtensions};
      this._uploads = {...renderer, cube:gpuUploadCubeTextureResource.createGpuUploadCubeTextureResource(renderer)};
    }
    get managedTextures() {
      return Object.values(this._managedTextures.items);
    }
    contextChange(gpu) {
      this._gpu = gpu;
    }
    initSource(source) {
      return source._gpuData[this._renderer.uid]?.gpuTexture || this._initSource(source);
    }
    _initSource(source) {
      source.autoGenerateMipmaps && (source.mipLevelCount = Math.floor(Math.log2(Math.max(source.pixelWidth, source.pixelHeight))) + 1);
      if (1 < source.sampleCount) {
        var usage = GPUTextureUsage.RENDER_ATTACHMENT;
        source.transient && this._renderer.device.extensions.transientAttachment && (usage |= GPUTextureUsage.TRANSIENT_ATTACHMENT);
      } else {
        usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST, "compressed" !== source.uploadMethodId && (usage |= GPUTextureUsage.RENDER_ATTACHMENT, usage |= GPUTextureUsage.COPY_SRC);
      }
      const blockData = gpuUploadCompressedTextureResource.blockDataMap[source.format] || {blockBytes:4, blockWidth:1, blockHeight:1};
      usage = this._gpu.device.createTexture({label:source.label, size:{width:Math.ceil(source.pixelWidth / blockData.blockWidth) * blockData.blockWidth, height:Math.ceil(source.pixelHeight / blockData.blockHeight) * blockData.blockHeight, depthOrArrayLayers:source.arrayLayerCount}, format:source.format, sampleCount:source.sampleCount, mipLevelCount:source.mipLevelCount, dimension:source.dimension, usage});
      source._gpuData[this._renderer.uid] = new GPUTextureGpuData(usage);
      this._managedTextures.add(source) && (source.on("update", this.onSourceUpdate, this), source.on("resize", this.onSourceResize, this), source.on("updateMipmaps", this.onUpdateMipmaps, this));
      this.onSourceUpdate(source);
      return usage;
    }
    onSourceUpdate(source) {
      const gpuTexture = this.getGpuSource(source);
      if (gpuTexture && (this._uploads[source.uploadMethodId] && this._uploads[source.uploadMethodId].upload(source, gpuTexture, this._gpu), source.autoGenerateMipmaps && 1 < source.mipLevelCount)) {
        this.onUpdateMipmaps(source);
      }
    }
    onUpdateMipmaps(source) {
      this._mipmapGenerator || (this._mipmapGenerator = new GpuMipmapGenerator.GpuMipmapGenerator(this._gpu.device));
      source = this.getGpuSource(source);
      this._mipmapGenerator.generateMipmap(source);
    }
    onSourceUnload(source) {
      source.off("update", this.onSourceUpdate, this);
      source.off("resize", this.onSourceResize, this);
      source.off("updateMipmaps", this.onUpdateMipmaps, this);
    }
    onSourceResize(source) {
      source._gcLastUsed = this._renderer.gc.now;
      const gpuData = source._gpuData[this._renderer.uid], gpuTexture = gpuData?.gpuTexture;
      if (!gpuTexture) {
        this.initSource(source);
      } else if (gpuTexture.width !== source.pixelWidth || gpuTexture.height !== source.pixelHeight) {
        gpuData.destroy(), this._bindGroupHash[source.uid] = null, source._gpuData[this._renderer.uid] = null, this.initSource(source);
      }
    }
    _initSampler(sampler) {
      this._gpuSamplers[sampler._resourceId] = this._gpu.device.createSampler(sampler);
      return this._gpuSamplers[sampler._resourceId];
    }
    getGpuSampler(sampler) {
      return this._gpuSamplers[sampler._resourceId] || this._initSampler(sampler);
    }
    getGpuSource(source) {
      source._gcLastUsed = this._renderer.gc.now;
      return source._gpuData[this._renderer.uid]?.gpuTexture || this.initSource(source);
    }
    getTextureBindGroup(texture) {
      return this._bindGroupHash[texture.uid] || this._createTextureBindGroup(texture);
    }
    _createTextureBindGroup(texture) {
      const source = texture.source;
      this._bindGroupHash[texture.uid] = new BindGroup.BindGroup({0:source, 1:source.style, 2:new UniformGroup.UniformGroup({uTextureMatrix:{type:"mat3x3\x3cf32\x3e", value:texture.textureMatrix.mapCoord}})});
      return this._bindGroupHash[texture.uid];
    }
    getTextureView(texture) {
      texture = texture.source;
      texture._gcLastUsed = this._renderer.gc.now;
      let gpuData = texture._gpuData[this._renderer.uid];
      gpuData || (this.initSource(texture), gpuData = texture._gpuData[this._renderer.uid]);
      gpuData.textureView || (gpuData.textureView = gpuData.gpuTexture.createView({dimension:texture.viewDimension}));
      return gpuData.textureView;
    }
    generateCanvas(texture) {
      const renderer = this._renderer, commandEncoder = renderer.gpu.device.createCommandEncoder(), canvas = adapter.DOMAdapter.get().createCanvas();
      canvas.width = texture.source.pixelWidth;
      canvas.height = texture.source.pixelHeight;
      const context = canvas.getContext("webgpu");
      context.configure({device:renderer.gpu.device, usage:GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC, format:adapter.DOMAdapter.get().getNavigator().gpu.getPreferredCanvasFormat(), alphaMode:"premultiplied"});
      commandEncoder.copyTextureToTexture({texture:renderer.texture.getGpuSource(texture.source), origin:{x:0, y:0}}, {texture:context.getCurrentTexture()}, {width:canvas.width, height:canvas.height});
      renderer.gpu.device.queue.submit([commandEncoder.finish()]);
      return canvas;
    }
    getPixels(texture) {
      var webGPUCanvas = this.generateCanvas(texture);
      texture = CanvasPool.CanvasPool.getOptimalCanvasAndContext(webGPUCanvas.width, webGPUCanvas.height);
      const context = texture.context;
      context.drawImage(webGPUCanvas, 0, 0);
      const {width, height} = webGPUCanvas;
      webGPUCanvas = context.getImageData(0, 0, width, height);
      webGPUCanvas = new Uint8ClampedArray(webGPUCanvas.data.buffer);
      CanvasPool.CanvasPool.returnCanvasAndContext(texture);
      return {pixels:webGPUCanvas, width, height};
    }
    destroy() {
      this._managedTextures.destroy();
      for (const k of Object.keys(this._bindGroupHash)) {
        this._bindGroupHash[Number(k)]?.destroy();
      }
      this._bindGroupHash = this._gpuSamplers = this._mipmapGenerator = this._gpu = this._renderer = null;
    }
  };
  require = node_modules$pixi_DOT_js$lib$rendering$renderers$gpu$texture$GpuTextureSystem$classdecl$var23;
  require.extension = {type:[global.ExtensionType.WebGPUSystem], name:"texture"};
  require.uploadExtensions = Object.create(null);
  global.extensions.handleByMap(global.ExtensionType.TextureUploaderWebGPU, require.uploadExtensions);
  exports.GPUTextureGpuData = GPUTextureGpuData;
  exports.GpuTextureSystem = require;
};

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