{"version":3,"file":"glUploadImageResource.mjs","sources":["../../../../../../src/rendering/renderers/gl/texture/uploaders/glUploadImageResource.ts"],"sourcesContent":["import type { CanvasSource } from '../../../shared/texture/sources/CanvasSource';\nimport type { ImageSource } from '../../../shared/texture/sources/ImageSource';\nimport type { GlRenderingContext } from '../../context/GlRenderingContext';\nimport type { GlTexture } from '../GlTexture';\nimport type { GLTextureUploader } from './GLTextureUploader';\n\n/** @internal */\nexport const glUploadImageResource = {\n\n    id: 'image',\n\n    upload(\n        source: ImageSource | CanvasSource,\n        glTexture: GlTexture,\n        gl: GlRenderingContext,\n        webGLVersion: number,\n        targetOverride?: number,\n        forceAllocation = false\n    )\n    {\n        const target = targetOverride || glTexture.target;\n\n        const textureWidth = source.pixelWidth;\n        const textureHeight = source.pixelHeight;\n\n        const resourceWidth = source.resourceWidth;\n        const resourceHeight = source.resourceHeight;\n\n        const isWebGL2 = webGLVersion === 2;\n        const needsAllocation = forceAllocation || glTexture.width !== textureWidth || glTexture.height !== textureHeight;\n        const resourceFitsTexture = resourceWidth >= textureWidth && resourceHeight >= textureHeight;\n        const resource = source.resource as TexImageSource;\n\n        const uploadFunction = isWebGL2 ? uploadImageWebGL2 : uploadImageWebGL1;\n\n        uploadFunction(\n            gl,\n            target,\n            glTexture,\n            textureWidth,\n            textureHeight,\n            resourceWidth,\n            resourceHeight,\n            resource,\n            needsAllocation,\n            resourceFitsTexture\n        );\n\n        glTexture.width = textureWidth;\n        glTexture.height = textureHeight;\n    }\n} as GLTextureUploader;\n\nfunction uploadImageWebGL2(\n    gl: GlRenderingContext,\n    target: number,\n    glTexture: GlTexture,\n    textureWidth: number,\n    textureHeight: number,\n    resourceWidth: number,\n    resourceHeight: number,\n    resource: TexImageSource,\n    needsAllocation: boolean,\n    resourceFitsTexture: boolean\n): void\n{\n    if (!resourceFitsTexture)\n    {\n        // Allocate the full texture and upload the (smaller) resource into it.\n        if (needsAllocation)\n        {\n            gl.texImage2D(\n                target,\n                0,\n                glTexture.internalFormat,\n                textureWidth,\n                textureHeight,\n                0,\n                glTexture.format,\n                glTexture.type,\n                null\n            );\n        }\n\n        gl.texSubImage2D(\n            target,\n            0,\n            0,\n            0,\n            resourceWidth,\n            resourceHeight,\n            glTexture.format,\n            glTexture.type,\n            resource\n        );\n\n        return;\n    }\n\n    if (!needsAllocation)\n    {\n        // Texture already allocated at the correct size; update in-place.\n        gl.texSubImage2D(\n            target,\n            0,\n            0,\n            0,\n            glTexture.format,\n            glTexture.type,\n            resource\n        );\n\n        return;\n    }\n\n    // WebGL2 supports the sized texImage2D overload with TexImageSource.\n    gl.texImage2D(\n        target,\n        0,\n        glTexture.internalFormat,\n        textureWidth,\n        textureHeight,\n        0,\n        glTexture.format,\n        glTexture.type,\n        resource\n    );\n}\n\nfunction uploadImageWebGL1(\n    gl: GlRenderingContext,\n    target: number,\n    glTexture: GlTexture,\n    textureWidth: number,\n    textureHeight: number,\n    _resourceWidth: number,\n    _resourceHeight: number,\n    resource: TexImageSource,\n    needsAllocation: boolean,\n    resourceFitsTexture: boolean\n): void\n{\n    if (!resourceFitsTexture)\n    {\n        // Allocate the full texture and upload the (smaller) resource into it.\n        if (needsAllocation)\n        {\n            gl.texImage2D(\n                target,\n                0,\n                glTexture.internalFormat,\n                textureWidth,\n                textureHeight,\n                0,\n                glTexture.format,\n                glTexture.type,\n                null\n            );\n        }\n\n        gl.texSubImage2D(\n            target,\n            0,\n            0,\n            0,\n            glTexture.format,\n            glTexture.type,\n            resource\n        );\n\n        return;\n    }\n\n    if (!needsAllocation)\n    {\n        // Texture already allocated at the correct size; update in-place.\n        gl.texSubImage2D(\n            target,\n            0,\n            0,\n            0,\n            glTexture.format,\n            glTexture.type,\n            resource\n        );\n\n        return;\n    }\n\n    // WebGL1 uses the unsized TexImageSource overload.\n    gl.texImage2D(\n        target,\n        0,\n        glTexture.internalFormat,\n        glTexture.format,\n        glTexture.type,\n        resource\n    );\n}\n"],"names":[],"mappings":"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"}