ResourceFormat MakeResourceFormat()

in renderdoc/driver/metal/metal_common.cpp [777:1160]


ResourceFormat MakeResourceFormat(MTL::PixelFormat mtlFormat)
{
  ResourceFormat ret;

  if(mtlFormat == MTL::PixelFormatInvalid)
  {
    ret.type = ResourceFormatType::Undefined;
    ret.compByteWidth = 0;
    ret.compCount = 0;
    ret.compType = CompType::Typeless;
    return ret;
  }

  struct ResourceFormatInfo
  {
    ResourceFormatType type;
    CompType compType;
    uint8_t compCount;
    uint8_t compByteWidth;
    bool bgra;
  };

  ResourceFormatInfo info;
  switch(mtlFormat)
  {
    case MTL::PixelFormatA8Unorm:
      info = {ResourceFormatType::A8, CompType::UNorm, 1, 1, false};
      break;
    case MTL::PixelFormatR8Unorm:
      info = {ResourceFormatType::Regular, CompType::UNorm, 1, 1, false};
      break;
    case MTL::PixelFormatR8Unorm_sRGB:
      info = {ResourceFormatType::Regular, CompType::UNormSRGB, 1, 1, false};
      break;
    case MTL::PixelFormatR8Snorm:
      info = {ResourceFormatType::Regular, CompType::SNorm, 1, 1, false};
      break;
    case MTL::PixelFormatR8Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 1, 1, false};
      break;
    case MTL::PixelFormatR8Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 1, 1, false};
      break;
    case MTL::PixelFormatR16Unorm:
      info = {ResourceFormatType::Regular, CompType::UNorm, 1, 2, false};
      break;
    case MTL::PixelFormatR16Snorm:
      info = {ResourceFormatType::Regular, CompType::SNorm, 1, 2, false};
      break;
    case MTL::PixelFormatR16Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 1, 2, false};
      break;
    case MTL::PixelFormatR16Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 1, 2, false};
      break;
    case MTL::PixelFormatR16Float:
      info = {ResourceFormatType::Regular, CompType::Float, 1, 2, false};
      break;
    case MTL::PixelFormatRG8Unorm:
      info = {ResourceFormatType::Regular, CompType::UNorm, 2, 1, false};
      break;
    case MTL::PixelFormatRG8Unorm_sRGB:
      info = {ResourceFormatType::Regular, CompType::UNormSRGB, 2, 1, false};
      break;
    case MTL::PixelFormatRG8Snorm:
      info = {ResourceFormatType::Regular, CompType::SNorm, 2, 1, false};
      break;
    case MTL::PixelFormatRG8Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 2, 1, false};
      break;
    case MTL::PixelFormatRG8Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 2, 1, false};
      break;
    case MTL::PixelFormatB5G6R5Unorm:
      info = {ResourceFormatType::R5G6B5, CompType::UNorm, 3, 1, true};
      break;
    case MTL::PixelFormatA1BGR5Unorm:
      info = {ResourceFormatType::R5G5B5A1, CompType::UNorm, 4, 1, true};
      break;
    case MTL::PixelFormatABGR4Unorm:
      info = {ResourceFormatType::R4G4B4A4, CompType::UNorm, 4, 1, true};
      break;
    case MTL::PixelFormatBGR5A1Unorm:
      info = {ResourceFormatType::R5G5B5A1, CompType::UNorm, 4, 1, true};
      break;
    case MTL::PixelFormatR32Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 1, 4, false};
      break;
    case MTL::PixelFormatR32Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 1, 4, false};
      break;
    case MTL::PixelFormatR32Float:
      info = {ResourceFormatType::Regular, CompType::Float, 1, 4, false};
      break;
    case MTL::PixelFormatRG16Unorm:
      info = {ResourceFormatType::Regular, CompType::UNorm, 2, 2, false};
      break;
    case MTL::PixelFormatRG16Snorm:
      info = {ResourceFormatType::Regular, CompType::SNorm, 2, 2, false};
      break;
    case MTL::PixelFormatRG16Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 2, 2, false};
      break;
    case MTL::PixelFormatRG16Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 2, 2, false};
      break;
    case MTL::PixelFormatRG16Float:
      info = {ResourceFormatType::Regular, CompType::Float, 2, 2, false};
      break;
    case MTL::PixelFormatRGBA8Unorm:
      info = {ResourceFormatType::Regular, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatRGBA8Unorm_sRGB:
      info = {ResourceFormatType::Regular, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatRGBA8Snorm:
      info = {ResourceFormatType::Regular, CompType::SNorm, 4, 1, false};
      break;
    case MTL::PixelFormatRGBA8Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 4, 1, false};
      break;
    case MTL::PixelFormatRGBA8Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 4, 1, false};
      break;
    case MTL::PixelFormatBGRA8Unorm:
      info = {ResourceFormatType::Regular, CompType::UNorm, 4, 1, true};
      break;
    case MTL::PixelFormatBGRA8Unorm_sRGB:
      info = {ResourceFormatType::Regular, CompType::UNormSRGB, 4, 1, true};
      break;
    case MTL::PixelFormatRGB10A2Unorm:
      info = {ResourceFormatType::R10G10B10A2, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatRGB10A2Uint:
      info = {ResourceFormatType::R10G10B10A2, CompType::UInt, 4, 1, false};
      break;
    case MTL::PixelFormatRG11B10Float:
      info = {ResourceFormatType::R11G11B10, CompType::Float, 3, 1, false};
      break;
    case MTL::PixelFormatRGB9E5Float:
      info = {ResourceFormatType::R9G9B9E5, CompType::Float, 3, 1, false};
      break;
    case MTL::PixelFormatBGR10A2Unorm:
      info = {ResourceFormatType::R10G10B10A2, CompType::UNorm, 4, 1, true};
      break;
    case MTL::PixelFormatRG32Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 2, 4, false};
      break;
    case MTL::PixelFormatRG32Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 2, 4, false};
      break;
    case MTL::PixelFormatRG32Float:
      info = {ResourceFormatType::Regular, CompType::Float, 2, 4, false};
      break;
    case MTL::PixelFormatRGBA16Unorm:
      info = {ResourceFormatType::Regular, CompType::UNorm, 4, 2, false};
      break;
    case MTL::PixelFormatRGBA16Snorm:
      info = {ResourceFormatType::Regular, CompType::SNorm, 4, 2, false};
      break;
    case MTL::PixelFormatRGBA16Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 4, 2, false};
      break;
    case MTL::PixelFormatRGBA16Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 4, 2, false};
      break;
    case MTL::PixelFormatRGBA16Float:
      info = {ResourceFormatType::Regular, CompType::Float, 4, 2, false};
      break;
    case MTL::PixelFormatRGBA32Uint:
      info = {ResourceFormatType::Regular, CompType::UInt, 4, 4, false};
      break;
    case MTL::PixelFormatRGBA32Sint:
      info = {ResourceFormatType::Regular, CompType::SInt, 4, 4, false};
      break;
    case MTL::PixelFormatRGBA32Float:
      info = {ResourceFormatType::Regular, CompType::Float, 4, 4, false};
      break;
    case MTL::PixelFormatBC1_RGBA:
      info = {ResourceFormatType::BC1, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatBC1_RGBA_sRGB:
      info = {ResourceFormatType::BC1, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatBC2_RGBA:
      info = {ResourceFormatType::BC2, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatBC2_RGBA_sRGB:
      info = {ResourceFormatType::BC2, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatBC3_RGBA:
      info = {ResourceFormatType::BC3, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatBC3_RGBA_sRGB:
      info = {ResourceFormatType::BC3, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatBC4_RUnorm:
      info = {ResourceFormatType::BC4, CompType::UNorm, 1, 1, false};
      break;
    case MTL::PixelFormatBC4_RSnorm:
      info = {ResourceFormatType::BC4, CompType::SNorm, 1, 1, false};
      break;
    case MTL::PixelFormatBC5_RGUnorm:
      info = {ResourceFormatType::BC5, CompType::UNorm, 2, 1, false};
      break;
    case MTL::PixelFormatBC5_RGSnorm:
      info = {ResourceFormatType::BC5, CompType::SNorm, 2, 1, false};
      break;
    case MTL::PixelFormatBC6H_RGBFloat:
      info = {ResourceFormatType::BC6, CompType::Float, 3, 1, false};
      break;
    case MTL::PixelFormatBC6H_RGBUfloat:
      info = {ResourceFormatType::BC6, CompType::UNorm, 3, 1, false};
      break;
    case MTL::PixelFormatBC7_RGBAUnorm:
      info = {ResourceFormatType::BC7, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatBC7_RGBAUnorm_sRGB:
      info = {ResourceFormatType::BC7, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGB_2BPP:
      info = {ResourceFormatType::PVRTC, CompType::UNorm, 3, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGB_2BPP_sRGB:
      info = {ResourceFormatType::PVRTC, CompType::UNormSRGB, 3, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGB_4BPP:
      info = {ResourceFormatType::PVRTC, CompType::UNorm, 3, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGB_4BPP_sRGB:
      info = {ResourceFormatType::PVRTC, CompType::UNormSRGB, 3, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGBA_2BPP:
      info = {ResourceFormatType::PVRTC, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGBA_2BPP_sRGB:
      info = {ResourceFormatType::PVRTC, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGBA_4BPP:
      info = {ResourceFormatType::PVRTC, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatPVRTC_RGBA_4BPP_sRGB:
      info = {ResourceFormatType::PVRTC, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatEAC_R11Unorm:
      info = {ResourceFormatType::EAC, CompType::UNorm, 1, 1, false};
      break;
    case MTL::PixelFormatEAC_R11Snorm:
      info = {ResourceFormatType::EAC, CompType::SNorm, 1, 1, false};
      break;
    case MTL::PixelFormatEAC_RG11Unorm:
      info = {ResourceFormatType::EAC, CompType::UNorm, 2, 1, false};
      break;
    case MTL::PixelFormatEAC_RG11Snorm:
      info = {ResourceFormatType::EAC, CompType::SNorm, 2, 1, false};
      break;
    case MTL::PixelFormatEAC_RGBA8:
      info = {ResourceFormatType::EAC, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatEAC_RGBA8_sRGB:
      info = {ResourceFormatType::EAC, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatETC2_RGB8:
      info = {ResourceFormatType::ETC2, CompType::UNorm, 3, 1, false};
      break;
    case MTL::PixelFormatETC2_RGB8_sRGB:
      info = {ResourceFormatType::ETC2, CompType::UNormSRGB, 3, 1, false};
      break;
    case MTL::PixelFormatETC2_RGB8A1:
      info = {ResourceFormatType::ETC2, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatETC2_RGB8A1_sRGB:
      info = {ResourceFormatType::ETC2, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatASTC_4x4_sRGB:
    case MTL::PixelFormatASTC_5x4_sRGB:
    case MTL::PixelFormatASTC_5x5_sRGB:
    case MTL::PixelFormatASTC_6x5_sRGB:
    case MTL::PixelFormatASTC_6x6_sRGB:
    case MTL::PixelFormatASTC_8x5_sRGB:
    case MTL::PixelFormatASTC_8x6_sRGB:
    case MTL::PixelFormatASTC_8x8_sRGB:
    case MTL::PixelFormatASTC_10x5_sRGB:
    case MTL::PixelFormatASTC_10x6_sRGB:
    case MTL::PixelFormatASTC_10x8_sRGB:
    case MTL::PixelFormatASTC_10x10_sRGB:
    case MTL::PixelFormatASTC_12x10_sRGB:
    case MTL::PixelFormatASTC_12x12_sRGB:
      info = {ResourceFormatType::ASTC, CompType::UNormSRGB, 4, 1, false};
      break;
    case MTL::PixelFormatASTC_4x4_LDR:
    case MTL::PixelFormatASTC_5x4_LDR:
    case MTL::PixelFormatASTC_5x5_LDR:
    case MTL::PixelFormatASTC_6x5_LDR:
    case MTL::PixelFormatASTC_6x6_LDR:
    case MTL::PixelFormatASTC_8x5_LDR:
    case MTL::PixelFormatASTC_8x6_LDR:
    case MTL::PixelFormatASTC_8x8_LDR:
    case MTL::PixelFormatASTC_10x5_LDR:
    case MTL::PixelFormatASTC_10x6_LDR:
    case MTL::PixelFormatASTC_10x8_LDR:
    case MTL::PixelFormatASTC_10x10_LDR:
    case MTL::PixelFormatASTC_12x10_LDR:
    case MTL::PixelFormatASTC_12x12_LDR:
      info = {ResourceFormatType::ASTC, CompType::UNorm, 4, 1, false};
      break;
    case MTL::PixelFormatASTC_4x4_HDR:
    case MTL::PixelFormatASTC_5x4_HDR:
    case MTL::PixelFormatASTC_5x5_HDR:
    case MTL::PixelFormatASTC_6x5_HDR:
    case MTL::PixelFormatASTC_6x6_HDR:
    case MTL::PixelFormatASTC_8x5_HDR:
    case MTL::PixelFormatASTC_8x6_HDR:
    case MTL::PixelFormatASTC_8x8_HDR:
    case MTL::PixelFormatASTC_10x5_HDR:
    case MTL::PixelFormatASTC_10x6_HDR:
    case MTL::PixelFormatASTC_10x8_HDR:
    case MTL::PixelFormatASTC_10x10_HDR:
    case MTL::PixelFormatASTC_12x10_HDR:
    case MTL::PixelFormatASTC_12x12_HDR:
      info = {ResourceFormatType::ASTC, CompType::Float, 4, 1, false};
      break;
    case MTL::PixelFormatGBGR422:
      info = {ResourceFormatType::YUV8, CompType::UNorm, 3, 1, false};
      break;
    case MTL::PixelFormatBGRG422:
      info = {ResourceFormatType::YUV8, CompType::UNorm, 3, 1, true};
      break;
    case MTL::PixelFormatDepth16Unorm:
      info = {ResourceFormatType::Regular, CompType::Depth, 1, 2, false};
      break;
    case MTL::PixelFormatDepth32Float:
      info = {ResourceFormatType::Regular, CompType::Depth, 1, 4, false};
      break;
    case MTL::PixelFormatStencil8:
      info = {ResourceFormatType::S8, CompType::Depth, 1, 1, false};
      break;
    case MTL::PixelFormatDepth24Unorm_Stencil8:
      info = {ResourceFormatType::D24S8, CompType::Depth, 2, 1, false};
      break;
    case MTL::PixelFormatDepth32Float_Stencil8:
      info = {ResourceFormatType::D32S8, CompType::Depth, 2, 1, false};
      break;
    case MTL::PixelFormatX32_Stencil8:
      info = {ResourceFormatType::S8, CompType::Depth, 1, 1, false};
      break;
    case MTL::PixelFormatX24_Stencil8:
      info = {ResourceFormatType::S8, CompType::Depth, 1, 1, false};
      break;
    case MTL::PixelFormatBGRA10_XR:
      info = {ResourceFormatType::R10G10B10A2, CompType::UNorm, 4, 1, true};
      break;
    case MTL::PixelFormatBGRA10_XR_sRGB:
      info = {ResourceFormatType::R10G10B10A2, CompType::UNormSRGB, 4, 1, true};
      break;
    case MTL::PixelFormatBGR10_XR:
      info = {ResourceFormatType::R10G10B10A2, CompType::UNorm, 3, 1, true};
      break;
    case MTL::PixelFormatBGR10_XR_sRGB:
      info = {ResourceFormatType::R10G10B10A2, CompType::UNormSRGB, 3, 1, true};
      break;
    case MTL::PixelFormatInvalid: RDCERR("Unexpected MTL::PixelFormatInvalid"); break;
  };

  ret.type = info.type;
  ret.compType = info.compType;
  ret.compCount = info.compCount;
  ret.compByteWidth = info.compByteWidth;
  ret.SetBGRAOrder(info.bgra);

  if(IsYUVFormat(mtlFormat))
  {
    ret.SetYUVPlaneCount(1);

    switch(mtlFormat)
    {
      case MTL::PixelFormatGBGR422:
      case MTL::PixelFormatBGRG422: ret.SetYUVSubsampling(422); break;
      default: RDCERR("Unexpected YUV Format MTL::PixelFormat: %d", mtlFormat);
    }
  }

  return ret;
}