/*
 * Copyright 2019 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef GrUtil_DEFINED
#define GrUtil_DEFINED

#include "include/core/SkTypes.h"

enum GrIntelGpuFamily {
    kUnknown_IntelGpuFamily,

    // 6th gen
    kSandyBridge_IntelGpuFamily,

    // 7th gen
    kIvyBridge_IntelGpuFamily,
    kValleyView_IntelGpuFamily, // aka BayTrail
    kHaswell_IntelGpuFamily,

    // 8th gen
    kCherryView_IntelGpuFamily, // aka Braswell
    kBroadwell_IntelGpuFamily,

    // 9th gen
    kApolloLake_IntelGpuFamily,
    kSkyLake_IntelGpuFamily,
    kGeminiLake_IntelGpuFamily,
    kKabyLake_IntelGpuFamily,
    kCoffeeLake_IntelGpuFamily,

    // 11th gen
    kIceLake_IntelGpuFamily,

    kFirstGen9_IntelGpuFamily = kApolloLake_IntelGpuFamily,
};

GrIntelGpuFamily GrGetIntelGpuFamily(uint32_t deviceID) {
    // https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units
    uint32_t maskedID = deviceID & 0xFF00;
    switch (maskedID) {
        case 0x0100:
            switch (deviceID & 0xFFF0) {
                case 0x0100:
                case 0x0110:
                case 0x0120:
                    return kSandyBridge_IntelGpuFamily;
                case 0x0150:
                    if (deviceID == 0x0155 || deviceID == 0x0157) {
                        return kValleyView_IntelGpuFamily;
                    }
                    if (deviceID == 0x0152 || deviceID == 0x015A) {
                        return kIvyBridge_IntelGpuFamily;
                    }
                    break;
                case 0x0160:
                    return kIvyBridge_IntelGpuFamily;
                default:
                    break;
            }
            break;
        case 0x0F00:
            return kValleyView_IntelGpuFamily;
        case 0x0400:
        case 0x0A00:
        case 0x0D00:
            return kHaswell_IntelGpuFamily;
        case 0x2200:
            return kCherryView_IntelGpuFamily;
        case 0x1600:
            return kBroadwell_IntelGpuFamily;
        case 0x5A00:
            return kApolloLake_IntelGpuFamily;
        case 0x1900:
            return kSkyLake_IntelGpuFamily;
        case 0x3100:
            return kGeminiLake_IntelGpuFamily;
        case 0x5900:
            return kKabyLake_IntelGpuFamily;
        case 0x3E00:
            return kCoffeeLake_IntelGpuFamily;
        case 0x8A00:
            return kIceLake_IntelGpuFamily;
        default:
            break;
    }
    return kUnknown_IntelGpuFamily;
}

#endif
