//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// TextureExternalUpdateTest.cpp: Tests for GL_ANGLE_texture_external_update

#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"

namespace angle
{

class TextureExternalUpdateTest : public ANGLETest
{};

// Test basic usage of glInvalidateTextureANGLE
TEST_P(TextureExternalUpdateTest, Invalidate)
{
    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_external_update"));

    glInvalidateTextureANGLE(GL_TEXTURE_2D);
    EXPECT_GL_NO_ERROR();

    glInvalidateTextureANGLE(GL_TEXTURE_EXTERNAL_OES);
    if (EnsureGLExtensionEnabled("GL_OES_EGL_image_external"))
    {
        EXPECT_GL_NO_ERROR();
    }
    else
    {
        EXPECT_GL_ERROR(GL_INVALID_ENUM);
    }
}

// Test basic usage of glTexImage2DExternalANGLE
TEST_P(TextureExternalUpdateTest, TexImage2DExternal)
{
    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_external_update"));

    GLenum bindingPoint = GL_TEXTURE_2D;
    if (EnsureGLExtensionEnabled("GL_OES_EGL_image_external"))
    {
        // If external textures are available, try calling glTexImage2DExternalANGLE on them instead
        // because it would be disallowed for regular glTexImage2D calls.
        bindingPoint = GL_TEXTURE_EXTERNAL_OES;
    }

    GLTexture texture;
    glBindTexture(bindingPoint, texture);

    glTexImage2DExternalANGLE(bindingPoint, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
    EXPECT_GL_NO_ERROR();

    // No data to verify because the texture has not actually been modified externally
}

// Test the native ID query
TEST_P(TextureExternalUpdateTest, NativeID)
{
    ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_external_update"));

    GLTexture texture;
    glBindTexture(GL_TEXTURE_2D, texture);

    GLint nativeId = 0;
    glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_NATIVE_ID_ANGLE, &nativeId);
    EXPECT_GL_NO_ERROR();
    EXPECT_NE(0, nativeId);
}

// Use this to select which configurations (e.g. which renderer, which GLES major version) these
// tests should be run against.
ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(TextureExternalUpdateTest);

}  // namespace angle
