return {
  tag = 'texture-transfer',
  summary = 'Replace pixels in the Texture.',
  description = [[
    Sets pixels in the texture.  The source data can be an `Image` with the pixels to upload, or
    another `Texture` object to copy from.
  ]],
  arguments = {
    source = {
      type = 'Texture | Image',
      description = 'The source texture or image to copy to this texture.'
    },
    texture = {
      type = 'Texture',
      description = 'The texture to copy from.'
    },
    dstx = {
      type = 'number',
      default = '0',
      description = 'The x offset to copy to.'
    },
    dsty = {
      type = 'number',
      default = '0',
      description = 'The y offset to copy to.'
    },
    dstlayer = {
      type = 'number',
      default = '1',
      description = 'The index of the layer to copy to.'
    },
    dstmipmap = {
      type = 'number',
      default = '1',
      description = 'The index of the mipmap level to copy to.'
    },
    srcx = {
      type = 'number',
      default = '0',
      description = 'The x offset to copy from.'
    },
    srcy = {
      type = 'number',
      default = '0',
      description = 'The y offset to copy from.'
    },
    srclayer = {
      type = 'number',
      default = '1',
      description = 'The index of the layer to copy from.'
    },
    srcmipmap = {
      type = 'number',
      default = '1',
      description = 'The index of the mipmap level to copy from.'
    },
    width = {
      type = 'number',
      default = 'nil',
      description = [[
        The width of the region of pixels to copy.  If nil, the maximum possible width will be used,
        based on the widths of the source/destination and the offset parameters.
      ]]
    },
    height = {
      type = 'number',
      default = 'nil',
      description = [[
        The height of the region of pixels to copy.  If nil, the maximum possible height will be
        used, based on the heights of the source/destination and the offset parameters.
      ]]
    },
    layers = {
      type = 'number',
      default = 'nil',
      description = 'The number of layers to copy.  If nil, copies as many layers as possible.'
    },
    srcwidth = {
      type = 'number',
      default = 'width',
      description = [[
        The width of the region in the source texture to copy.  If it doesn't match `width`, the
        copy will be scaled up or down to fit.
      ]]
    },
    srcheight = {
      type = 'number',
      default = 'width',
      description = [[
        The height of the region in the source texture to copy.  If it doesn't match `height`, the
        copy will be scaled up or down to fit.
      ]]
    },
    srcdepth = {
      type = 'number',
      default = 'layers',
      description = 'The depth of the region in the source texture to copy (`3d` textures only).'
    },
    filter = {
      type = 'FilterMode',
      default = [['linear']],
      description = [[
        The filtering mode used to scale the copy when the source and destination sizes don't match.
      ]]
    }
  },
  returns = {},
  variants = {
    {
      arguments = { 'source', 'dstx', 'dsty', 'dstlayer', 'dstmipmap', 'srcx', 'srcy', 'srclayer', 'srcmipmap', 'width', 'height', 'layers' },
      returns = {}
    }
  },
  notes = [[
    Note that calling `Texture:setPixels(Image)` will only update the first mipmap of the texture,
    leaving the other mipmaps as-is.  You may want to regenerate the texture's mipmaps afterwards by
    calling `Texture:generateMipmaps`, or disable mipmaps entirely by setting `mipmaps` to false in
    `lovr.graphics.newTexture`.

    The destination and source textures must have been created with the `transfer` usage.

    Images can't be copied to multisample textures.  Multisample textures can be copied between each
    other as long as there isn't any scaling.

    Copying between textures requires them to have the same format.

    When using different region sizes in a texture-to-texture copy:

    - It is not possible to mix 3D with non-3D textures.
    - Not every texture format is supported, use `lovr.graphics.isFormatSupported` to check.
    - The formats do not need to match, unless they're depth formats.
  ]],
  related = {
    'Texture:newReadback',
    'Texture:generateMipmaps',
    'Image:paste'
  }
}
