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

#include "tests/Test.h"

#include "include/gpu/graphite/BackendTexture.h"
#include "include/gpu/graphite/Context.h"
#include "include/gpu/graphite/Recorder.h"
#include "include/gpu/graphite/mtl/MtlGraphiteTypes.h"

#import <Metal/Metal.h>

using namespace skgpu::graphite;

namespace {
    const SkISize kSize = {16, 16};
}

DEF_GRAPHITE_TEST_FOR_METAL_CONTEXT(MtlBackendTextureTest, reporter, context) {
    auto recorder = context->makeRecorder();

    MtlTextureInfo textureInfo;
    textureInfo.fSampleCount = 1;
    textureInfo.fMipmapped = skgpu::Mipmapped::kNo;
    textureInfo.fFormat = MTLPixelFormatRGBA8Unorm;
    textureInfo.fStorageMode = MTLStorageModePrivate;
    textureInfo.fUsage = MTLTextureUsageShaderRead;

    // TODO: For now we are just testing the basic case of RGBA single sample because that is what
    // we've added to the backend. However, once we expand the backend support to handle all the
    // formats this test should iterate over a large set of combinations. See the Ganesh
    // MtlBackendAllocationTest for example of doing this.

    auto beTexture = recorder->createBackendTexture(kSize, textureInfo);
    REPORTER_ASSERT(reporter, beTexture.isValid());
    recorder->deleteBackendTexture(beTexture);

    // It should also pass if we set the usage to be a render target
    textureInfo.fUsage |= MTLTextureUsageRenderTarget;
    beTexture = recorder->createBackendTexture(kSize, textureInfo);
    REPORTER_ASSERT(reporter, beTexture.isValid());
    recorder->deleteBackendTexture(beTexture);

    // It should fail with a format that isn't one of our supported formats
    textureInfo.fFormat = MTLPixelFormatRGB9E5Float;
    beTexture = recorder->createBackendTexture(kSize, textureInfo);
    REPORTER_ASSERT(reporter, !beTexture.isValid());
    recorder->deleteBackendTexture(beTexture);

    // It should fail with a sample count greater than 1
    textureInfo.fFormat = MTLPixelFormatRGBA8Unorm;
    textureInfo.fSampleCount = 4;
    beTexture = recorder->createBackendTexture(kSize, textureInfo);
    REPORTER_ASSERT(reporter, !beTexture.isValid());
    recorder->deleteBackendTexture(beTexture);
}
