{"version":3,"file":"webgpu-ySFSDlQo.mjs","names":["getSharderCode"],"sources":["../src/player/render/webgpu/bizBase.ts","../src/player/render/webgpu/sharder.ts","../src/player/render/webgpu/base.ts","../src/player/render/webgpu/index.ts"],"sourcesContent":["import logger from 'src/helper/logger'\nimport RenderCache from 'src/player/render/common/renderCache'\nimport VideoEntity from 'src/player/render/common/videoEntity'\nimport type {MixEvideoOptions, ResizeCanvasType} from 'src/type/mix'\nexport class BizBase {\n  public isPlay = false\n  public videoEntity: VideoEntity\n  public renderType = 'webgpu'\n  public renderCache: RenderCache\n\n  public version = 0\n  public op: MixEvideoOptions\n  public currentFrame = -1 //过滤重复帧\n  public video: HTMLVideoElement | undefined\n  //\n  public ofs!: HTMLCanvasElement\n  public ctx!: GPUCanvasContext\n  constructor(op: MixEvideoOptions) {\n    logger.debug('[Render In Webgl]')\n    this.op = op\n    this.createCanvas(op)\n    this.renderCache = new RenderCache(this.ofs, this.op)\n    this.videoEntity = new VideoEntity(op)\n  }\n  public destroy() {\n    this.videoEntity.destroy()\n    this.renderCache.destroy()\n    this.ofs.remove()\n  }\n  public createCanvas(op: MixEvideoOptions) {\n    this.ofs = document.createElement('canvas')\n    if (op.resizeCanvas) {\n      this.setSizeCanvas(this.ofs, op.resizeCanvas)\n    }\n    op.container.appendChild(this.ofs)\n  }\n  public get verriceArray() {\n    const {rgbX, rgbY, rgbW, rgbH, vW, vH, aX, aY, aW, aH} = this.getRgbaPos()\n    const rgbCoord = this.computeCoord(rgbX, rgbY, rgbW, rgbH, vW, vH)\n    const aCoord = this.computeCoord(aX, aY, aW, aH, vW, vH)\n    // biome-ignore format:\n    const vertexData = new Float32Array(\n      [\n        -1, 1, rgbCoord[0], rgbCoord[3], aCoord[0], aCoord[3],\n        1, 1, rgbCoord[1], rgbCoord[3], aCoord[1], aCoord[3],\n        -1, -1, rgbCoord[0], rgbCoord[2], aCoord[0], aCoord[2],\n        1, -1, rgbCoord[1], rgbCoord[2], aCoord[1], aCoord[2]\n    ],\n    )\n    // flipY\n    for (let i = 0; i < vertexData.length; i += 6) {\n      // vertexData[i + 3] = rgbCoord[3] - vertexData[i + 3]\n      vertexData[i + 5] = aCoord[3] - vertexData[i + 5]\n    }\n    return vertexData\n  }\n  public getRgbaPos() {\n    const descript = this.videoEntity.config?.descript\n    if (descript) {\n      //=================== 创建缓冲区\n      const {width: vW, height: vH} = descript\n      const [rgbX, rgbY, rgbW, rgbH] = descript.rgbFrame\n      let [aX, aY, aW, aH] = descript.alphaFrame\n      // 正向渲染的兼容算法\n      aY = vH - aH\n      return {rgbX, rgbY, rgbW, rgbH, vW, vH, aX, aY, aW, aH}\n    } else if (this.video) {\n      //默认为左右均分\n      const vW = this.video.videoWidth ? this.video.videoWidth : 1800\n      const vH = this.video.videoHeight ? this.video.videoHeight : 1000\n      const stageW = vW / 2\n      const [rgbX, rgbY, rgbW, rgbH] = this.op.alphaDirection === 'right' ? [0, 0, stageW, vH] : [stageW, 0, stageW, vH]\n      const [aX, aY, aW, aH] = this.op.alphaDirection === 'right' ? [stageW, 0, stageW, vH] : [0, 0, stageW, vH]\n      return {rgbX, rgbY, rgbW, rgbH, vW, vH, aX, aY, aW, aH}\n    }\n  }\n  public computeCoord(x: number, y: number, w: number, h: number, vw: number, vh: number) {\n    // leftX rightX bottomY topY\n    const leftX = x / vw\n    const rightX = (x + w) / vw\n    const bottomY = (vh - y - h) / vh\n    const topY = (vh - y) / vh\n    return [leftX, rightX, bottomY, topY]\n  }\n\n  public getScale() {\n    let scaleX = 1\n    let scaleY = 1\n    if (this.video && this.op.mode) {\n      const ofs = this.ofs\n      const canvasAspect = ofs.clientWidth / ofs.clientHeight\n      const videoAspect = ofs.width / ofs.height\n      ofs.setAttribute('class', `e-video-${this.op.mode.toLocaleLowerCase()}`)\n      switch (this.op.mode) {\n        case 'AspectFill':\n        case 'vertical': //fit vertical | AspectFill 竖屏\n          scaleY = 1\n          scaleX = videoAspect / canvasAspect\n          break\n        case 'AspectFit':\n        case 'horizontal': //fit horizontal | AspectFit 横屏\n          scaleX = 1\n          scaleY = canvasAspect / videoAspect\n          break\n        case 'contain':\n          scaleY = 1\n          scaleX = videoAspect / canvasAspect\n          if (scaleX > 1) {\n            scaleY = 1 / scaleX\n            scaleX = 1\n          }\n          break\n        case 'Fill':\n        case 'cover':\n          scaleY = 1\n          scaleX = videoAspect / canvasAspect\n          if (scaleX < 1) {\n            scaleY = 1 / scaleX\n            scaleX = 1\n          }\n          break\n      }\n    }\n    return [scaleX, scaleY]\n  }\n  public setSizeCanvas(canvas: HTMLCanvasElement, resizeCanvas: ResizeCanvasType) {\n    switch (resizeCanvas) {\n      case 'percent':\n        canvas.style.width = '100%'\n        canvas.style.height = '100%'\n        break\n      case 'percentH':\n        canvas.style.height = '100%'\n        break\n      case 'percentW':\n        canvas.style.width = '100%'\n        break\n      default:\n        break\n    }\n  }\n  public resizeCanvasToDisplaySize() {\n    const descript = this.videoEntity.config?.descript\n    const ofs = this.ofs\n    if (!descript) {\n      if (!this.video) return\n      const vw = this.video.videoWidth ? this.video.videoWidth / 2 : 900\n      const vh = this.video.videoHeight ? this.video.videoHeight : 1000\n      // 默认左右结构\n      ofs.width = vw\n      ofs.height = vh\n    } else {\n      // 实际渲染大小\n      const [x, y, w, h] = descript.rgbFrame\n      ofs.width = w\n      ofs.height = h\n    }\n  }\n}\n","import type {CacheType} from './base'\nconst generateTextureBindings = (count: number, start) =>\n  Array.from(\n    {length: count},\n    (_, i) => `@group(0) @binding(${i + start}) var imageTexture${i + 1}: texture_2d<f32>;`,\n  ).join('\\n')\n\nconst generateLastBind = cache =>\n  cache.lastIndex > cache.startIndex\n    ? `@group(0) @binding(${cache.lastIndex}) var<storage, read> imagePos: array<f32>;`\n    : ''\n\nconst genderateImgPos = (textureCount, cache) =>\n  cache.lastIndex > cache.startIndex\n    ? /* wgsl */ `\n  for (var i: i32 = 0; i < MAX_TEXTURES * PER_SIZE; i += PER_SIZE) {\n    let srcIndex = i32(imagePos[i]);\n    let x1 = imagePos[i + 1];\n    let x2 = imagePos[i + 2];\n    let y1 = imagePos[i + 3];\n    let y2 = imagePos[i + 4];\n    let mx1 = imagePos[i + 5];\n    let mx2 = imagePos[i + 6];\n    let my1 = imagePos[i + 7];\n    let my2 = imagePos[i + 8];\n\n    let isInBounds = srcIndex > 0 &&\n    input.v_texcoord.x > x1 && input.v_texcoord.x < x2 &&\n    input.v_texcoord.y > y1 && input.v_texcoord.y < y2;\n      \n      let srcTexcoord = vec2<f32>(\n          (input.v_texcoord.x - x1) / (x2 - x1),\n          (input.v_texcoord.y - y1) / (y2 - y1)\n      );\n      let maskTexcoord = vec2<f32>(\n          mx1 + srcTexcoord.x * (mx2 - mx1),\n          1.0-(my1 + srcTexcoord.y * (my2 - my1)) //Y轴反转\n      );\n\n      var srcColor = getSampleFromArray(srcIndex, srcTexcoord);\n      let maskColor = textureSampleBaseClampToEdge(u_image_video, u_image_video_sampler, maskTexcoord);\n      srcColor.a = srcColor.a * maskColor.r;\n\n      bgColor = select(\n        bgColor,\n        vec4<f32>(\n            srcColor.rgb * srcColor.a + bgColor.rgb * (1.0 - srcColor.a),\n            srcColor.a + bgColor.a * (1.0 - srcColor.a)\n        ),\n        isInBounds\n    );\n    }\n  `\n    : ''\n// ========================================================================\nexport default (cache: CacheType) => {\n  const textureCount = cache.lastIndex - cache.startIndex\n  //\n  const code = /* wgsl */ `\nstruct VertexOutput {\n    @builtin(position) pos: vec4<f32>,\n    @location(0) v_texcoord: vec2<f32>,\n    @location(1) v_alpha_texCoord: vec2<f32>\n}\n\nstruct VertexInput {\n    @location(0) a_position: vec2<f32>,\n    @location(1) a_texCoord: vec2<f32>,\n    @location(2) a_alpha_texCoord: vec2<f32>\n};\n\nstruct ImagePos {\n  index: i32,\n  x1: f32, x2: f32, y1: f32, y2: f32,\n  mx1: f32, mx2: f32, my1: f32, my2: f32,\n};\n\n@group(0) @binding(0) var u_image_video: texture_external;\n@group(0) @binding(1) var<uniform> u_scale: vec2<f32>;\n@group(0) @binding(2) var u_image_video_sampler: sampler;\n@group(0) @binding(3) var imageSampler: sampler;\n${generateTextureBindings(textureCount, cache.startIndex)}\n${generateLastBind(cache)}\n\nfn getSampleFromArray(ndx: i32, uv: vec2<f32>) -> vec4<f32> {\n  ${Array.from(\n    {length: textureCount},\n    (_, i) => /* wgsl */ `\n  let sample${i + 1} = textureSample(imageTexture${i + 1}, imageSampler, uv);`,\n  ).join('\\n')}\n  \n  var result: vec4<f32> = vec4<f32>(0.0);\n  ${Array.from(\n    {length: textureCount},\n    (_, i) => /* wgsl */ `\n  result = select(result, sample${i + 1}, ndx == ${i + 1});`,\n  ).join('\\n')}\n  \n  return result;\n}\n\nconst PER_SIZE: i32 = 9;\nconst MAX_TEXTURES: i32 = ${cache.maxTextures};\n\n@fragment\nfn fragMain(input: VertexOutput) -> @location(0) vec4f {\n  //\n  var v_texcoord = input.v_texcoord;\n  v_texcoord.y = 1.0 - v_texcoord.y;\n  var v_alpha_texCoord = input.v_alpha_texCoord;\n  //\n  var bgColor = textureSampleBaseClampToEdge(u_image_video, u_image_video_sampler, v_texcoord);\n  bgColor.a = textureSampleBaseClampToEdge(u_image_video, u_image_video_sampler, v_alpha_texCoord).r;\n  ${genderateImgPos(textureCount, cache)}\n  return bgColor;\n}\n\n@vertex\nfn vertMain(input: VertexInput) -> VertexOutput {\n  var output : VertexOutput;\n  output.pos = vec4<f32>(u_scale * input.a_position, 0.0, 1.0);\n  output.v_texcoord = input.a_texCoord;\n  output.v_alpha_texCoord = input.a_alpha_texCoord;\n  return output;\n}\n`\n  // console.log(code)\n  return {code}\n}\n","import type {VideoAnimateDescriptType} from 'src/type/mix'\nimport {BizBase} from './bizBase'\nimport getSharderCode from './sharder'\n//\nexport type CacheType = {\n  videoSampler: GPUSampler\n  imgSamper: GPUSampler\n  uScale: GPUBuffer\n  vertexBuffer: GPUBuffer // 顶点着色器\n  imgTextures: GPUTexture[]\n  lastIndex: number\n  startIndex: number\n  maxTextures: number\n}\nexport class RenderWebGPUBase extends BizBase {\n  public currentFrame = -1 //过滤重复帧\n  public PER_SIZE = 9\n\n  public adapter!: GPUAdapter\n  public device!: GPUDevice\n  public presentationFormat!: GPUTextureFormat\n  public pipeline!: GPURenderPipeline\n  private cache: CacheType = {\n    videoSampler: undefined,\n    imgSamper: undefined,\n    uScale: undefined,\n    vertexBuffer: undefined,\n    imgTextures: [],\n    lastIndex: 0,\n    startIndex: 0,\n    maxTextures: 0,\n  }\n  private textureMap: any = {}\n  public bindGroupLayout!: GPUBindGroupLayout\n  async initGPUContext() {\n    this.ctx = this.ofs.getContext('webgpu')\n    this.adapter = await navigator.gpu.requestAdapter({})\n    if (!this.adapter) {\n      throw new Error('WebGPU adapter not available')\n    }\n    this.device = await this.adapter.requestDevice()\n    if (!this.device) {\n      throw new Error('need a browser that supports WebGPU')\n    }\n    this.presentationFormat = navigator.gpu.getPreferredCanvasFormat()\n    this.ctx.configure({\n      device: this.device,\n      format: this.presentationFormat,\n      alphaMode: 'premultiplied',\n    })\n  }\n  async setup() {\n    await this.initGPUContext()\n    this.createbindGroup()\n    this.createPipe()\n  }\n  createbindGroup() {\n    const {cache, device} = this\n    // group layout\n    const entries: GPUBindGroupLayoutEntry[] = [\n      {\n        binding: 0,\n        visibility: GPUShaderStage.FRAGMENT,\n        externalTexture: {}, // video\n      },\n      {\n        binding: 1,\n        visibility: GPUShaderStage.VERTEX,\n        buffer: {type: 'uniform'}, // uScale\n      },\n      {\n        binding: 2,\n        visibility: GPUShaderStage.FRAGMENT,\n        sampler: {type: 'filtering'}, // videoSampler\n      },\n      {\n        binding: 3,\n        visibility: GPUShaderStage.FRAGMENT,\n        sampler: {type: 'filtering'}, // imageSampler\n      },\n    ]\n    const {effect} = this.videoEntity.config || {}\n    let i = 1\n    this.cache.lastIndex = 4\n    this.cache.startIndex = 4\n    // img texture\n    for (const k in effect) {\n      entries.push({\n        binding: this.cache.lastIndex,\n        visibility: GPUShaderStage.FRAGMENT,\n        texture: {},\n      })\n      // 4 img TextTure\n      const r = effect[k]\n      if (r.img) {\n        cache.imgTextures.push(this.createImageTexture(r.img as ImageBitmap))\n      }\n      this.textureMap[r[this.videoEntity.effectId]] = i++\n      //\n      this.cache.lastIndex++\n    }\n    const {descript} = this.videoEntity.config || {}\n    if (descript) {\n      entries.push({\n        binding: this.cache.lastIndex,\n        visibility: GPUShaderStage.FRAGMENT,\n        buffer: {\n          type: 'read-only-storage',\n        },\n      })\n    }\n    // createBindGroupLayout\n    this.bindGroupLayout = this.device.createBindGroupLayout({\n      entries,\n    })\n    // 01 u_scale\n    const u_scale = this.getScale()\n    cache.uScale = this.createBufferWrite(new Float32Array(u_scale))\n    // 02 videoSampler\n    cache.videoSampler = device.createSampler({\n      magFilter: 'linear',\n      minFilter: 'linear',\n      mipmapFilter: 'linear',\n      addressModeU: 'repeat',\n      addressModeV: 'repeat',\n    })\n    // 03 imgSamper\n    cache.imgSamper = device.createSampler({\n      magFilter: 'nearest',\n      minFilter: 'nearest',\n      addressModeU: 'clamp-to-edge',\n      addressModeV: 'clamp-to-edge',\n    })\n  }\n  createRender(frame: number) {\n    const {device, video, ctx, pipeline, cache} = this\n    //\n    const {descript} = this.videoEntity.config || {}\n    const lastBuffer = []\n    if (descript) {\n      lastBuffer.push({\n        binding: cache.lastIndex,\n        resource: {buffer: this.imgPosBindGroup(frame, descript)},\n      })\n    }\n    //\n    const commandEncoder = device.createCommandEncoder()\n    const textureView = ctx.getCurrentTexture().createView()\n    const renderPassDescriptor: GPURenderPassDescriptor = {\n      colorAttachments: [\n        {\n          view: textureView,\n          clearValue: [0, 0, 0, 1],\n          loadOp: 'clear',\n          storeOp: 'store',\n        },\n      ],\n    }\n    const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor)\n    passEncoder.setPipeline(pipeline)\n    //\n    const bindGroup = this.device.createBindGroup({\n      layout: this.bindGroupLayout,\n      entries: [\n        {binding: 0, resource: device.importExternalTexture({source: video})},\n        {binding: 1, resource: {buffer: cache.uScale}},\n        {binding: 2, resource: cache.videoSampler},\n        {binding: 3, resource: cache.imgSamper},\n        ...cache.imgTextures.map((texture, index) => ({\n          binding: index + 4,\n          resource: texture.createView(),\n        })),\n        ...lastBuffer,\n      ],\n    })\n    //\n    passEncoder.setBindGroup(0, bindGroup)\n    passEncoder.setVertexBuffer(0, cache.vertexBuffer)\n    //\n    // passEncoder.draw(6)\n    passEncoder.draw(4)\n    passEncoder.end()\n    device.queue.submit([commandEncoder.finish()])\n  }\n\n  public webgpuDestroy() {\n    this.cache.vertexBuffer.destroy()\n    this.device.destroy()\n  }\n  public destroy() {\n    this.webgpuDestroy()\n    super.destroy()\n  }\n  imgPosBindGroup(frame: number, descript: VideoAnimateDescriptType) {\n    const {device} = this\n    const frameData = this.videoEntity.getFrame(frame)\n    const frameItem = frameData ? frameData[this.videoEntity.data] : undefined\n    let posArr = []\n    const {width: vW, height: vH} = descript\n\n    if (frameItem) {\n      frameItem.forEach(o => {\n        posArr[posArr.length] = +this.textureMap[o[this.videoEntity.effectId]]\n        const [rgbX, rgbY] = descript.rgbFrame\n        const [x, y, w, h] = o[this.videoEntity.renderFrame]\n        const [mX, mY, mW, mH] = o[this.videoEntity.outputFrame]\n        const coord = this.computeCoord(x + rgbX, y + rgbY, w, h, vW, vH)\n        const mCoord = this.computeCoord(mX, mY, mW, mH, vW, vH)\n        posArr = posArr.concat(coord).concat(mCoord)\n      })\n    }\n    const size = (device.limits.maxSampledTexturesPerShaderStage - 1) * this.PER_SIZE\n    posArr = posArr.concat(new Array(size - posArr.length).fill(0))\n    const imagePosData = new Float32Array(posArr)\n    const imagePosBuffer = this.createBufferWrite(imagePosData, GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST)\n    return imagePosBuffer\n  }\n  private createImageTexture(source: ImageBitmap) {\n    const {device} = this\n    const texture = device.createTexture({\n      size: [source.width, source.height, 1],\n      format: 'rgba8unorm',\n      usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n    })\n    //\n    device.queue.copyExternalImageToTexture({source}, {texture: texture}, [source.width, source.height, 1])\n    return texture\n  }\n  createPipe() {\n    // 顶点着色器坐标\n    this.cache.vertexBuffer = this.createBufferMapped(this.verriceArray)\n    this.cache.maxTextures = this.device.limits.maxSampledTexturesPerShaderStage\n    //\n    const shaderModule = this.device.createShaderModule(getSharderCode(this.cache))\n    //\n    const pipelineLayout = this.device.createPipelineLayout({\n      bindGroupLayouts: [this.bindGroupLayout],\n    })\n    this.pipeline = this.device.createRenderPipeline({\n      // layout: 'auto',\n      layout: pipelineLayout,\n      vertex: {\n        module: shaderModule,\n        entryPoint: 'vertMain',\n        buffers: [\n          {\n            // 6 floats per vertex (2 for position, 2 for texCoord,2 for a_alpha_texCoord)\n            arrayStride: this.verriceArray.BYTES_PER_ELEMENT * 6,\n            attributes: [\n              {shaderLocation: 0, offset: 0, format: 'float32x2'},\n              {shaderLocation: 1, offset: 2 * this.verriceArray.BYTES_PER_ELEMENT, format: 'float32x2'},\n              {shaderLocation: 2, offset: 4 * this.verriceArray.BYTES_PER_ELEMENT, format: 'float32x2'},\n            ],\n          },\n        ],\n      },\n      fragment: {\n        module: shaderModule,\n        entryPoint: 'fragMain',\n        targets: [{format: this.presentationFormat}],\n      },\n      primitive: {\n        // topology: 'triangle-list', //\n        topology: 'triangle-strip', // 'triangle-strip' 模式可能在某些复杂场景下不如 'triangle-list' 灵活。\n        // stripIndexFormat: 'uint32',\n      },\n    })\n  }\n  private createBufferMapped(vertices: Float32Array, usage: GPUFlagsConstant = GPUBufferUsage.VERTEX) {\n    const vertexBuffer = this.device.createBuffer({\n      size: vertices.byteLength,\n      usage,\n      mappedAtCreation: true,\n    })\n    const vMappedBuffer = new Float32Array(vertexBuffer.getMappedRange())\n    vMappedBuffer.set(vertices)\n    vertexBuffer.unmap()\n    return vertexBuffer\n  }\n  private createBufferWrite(\n    vertices: Float32Array,\n    usage: GPUFlagsConstant = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n  ) {\n    const vertexBuffer = this.device.createBuffer({\n      size: vertices.byteLength,\n      usage,\n    })\n    this.device.queue.writeBuffer(vertexBuffer, 0, vertices.buffer as ArrayBuffer, vertices.byteOffset, vertices.byteLength)\n    return vertexBuffer\n  }\n}\n","import {RenderWebGPUBase} from './base'\nexport default class RenderWebGPU extends RenderWebGPUBase {\n  public videoSeekedEvent() {\n    // return this.renderCache.mCache.videoSeekedEvent()\n  }\n  public async setup(video?: HTMLVideoElement) {\n    if (!video) throw new Error('video must support!')\n    await this.renderCache.setup()\n    await this.videoEntity.setup()\n    this.video = video\n    this.resizeCanvasToDisplaySize()\n    await super.setup()\n  }\n\n  public render(frame = 0) {\n    if (!this.isPlay || !this.video || this.currentFrame === frame) return\n    this.currentFrame = frame\n    this.createRender(frame)\n  }\n}\n"],"mappings":"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"}