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

#include "src/gpu/GrSPIRVVaryingHandler.h"

/** Returns the number of locations take up by a given SkSLType. We assume that all
    scalar values are 32 bits. */
static inline int sksltype_to_location_size(SkSLType type) {
    // If a new GrSL type is added, this function will need to be updated.
    static_assert(kSkSLTypeCount == 41);

    switch(type) {
        case SkSLType::kVoid:
            return 0;
        case SkSLType::kFloat: // fall through
        case SkSLType::kHalf:
            return 1;
        case SkSLType::kFloat2: // fall through
        case SkSLType::kHalf2:
            return 1;
        case SkSLType::kFloat3:
        case SkSLType::kHalf3:
            return 1;
        case SkSLType::kFloat4:
        case SkSLType::kHalf4:
            return 1;
        case SkSLType::kInt2:
        case SkSLType::kUInt2:
        case SkSLType::kShort2:
        case SkSLType::kUShort2:
            return 1;
        case SkSLType::kInt3:
        case SkSLType::kUInt3:
        case SkSLType::kShort3:
        case SkSLType::kUShort3:
            return 1;
        case SkSLType::kInt4:
        case SkSLType::kUInt4:
        case SkSLType::kShort4:
        case SkSLType::kUShort4:
            return 1;
        case SkSLType::kFloat2x2:
        case SkSLType::kHalf2x2:
            return 2;
        case SkSLType::kFloat3x3:
        case SkSLType::kHalf3x3:
            return 3;
        case SkSLType::kFloat4x4:
        case SkSLType::kHalf4x4:
            return 4;
        case SkSLType::kTexture2DSampler:
            return 0;
        case SkSLType::kTextureExternalSampler:
             return 0;
        case SkSLType::kTexture2DRectSampler:
             return 0;
        case SkSLType::kBool:
        case SkSLType::kBool2:
        case SkSLType::kBool3:
        case SkSLType::kBool4:
             return 1;
        case SkSLType::kInt: // fall through
        case SkSLType::kShort:
             return 1;
        case SkSLType::kUInt: // fall through
        case SkSLType::kUShort:
             return 1;
        case SkSLType::kTexture2D:
             return 0;
        case SkSLType::kSampler:
             return 0;
        case SkSLType::kInput:
            return 0;
    }
    SK_ABORT("Unexpected type");
}

static void finalize_helper(GrSPIRVVaryingHandler::VarArray& vars) {
    int locationIndex = 0;
    for (GrShaderVar& var : vars.items()) {
        SkString location;
        location.appendf("location = %d", locationIndex);
        var.addLayoutQualifier(location.c_str());

        int elementSize = sksltype_to_location_size(var.getType());
        SkASSERT(elementSize > 0);
        int numElements = var.isArray() ? var.getArrayCount() : 1;
        SkASSERT(numElements > 0);
        locationIndex += elementSize * numElements;
    }
    // TODO: determine the layout limits for SPIR-V, and enforce them via asserts here.
}

void GrSPIRVVaryingHandler::onFinalize() {
    finalize_helper(fVertexInputs);
    finalize_helper(fVertexOutputs);
    finalize_helper(fFragInputs);
    finalize_helper(fFragOutputs);
}
