/*
 * Copyright 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.graphics.cts;

import static android.opengl.EGL14.*;

import android.graphics.SurfaceTexture;
import android.opengl.EGL14;
import android.opengl.EGLConfig;
import android.opengl.EGLContext;
import android.opengl.EGLDisplay;
import android.opengl.EGLSurface;

import androidx.test.filters.SmallTest;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

@SmallTest
@RunWith(BlockJUnit4ClassRunner.class)
public class ASurfaceTextureTest {

  static {
    System.loadLibrary("ctsgraphics_jni");
  }

  private static final String TAG = ANativeWindowTest.class.getSimpleName();
  private static final boolean DEBUG = false;

  private EGLDisplay mEglDisplay = EGL_NO_DISPLAY;
  private EGLConfig mEglConfig = null;
  private EGLSurface mEglPbuffer = EGL_NO_SURFACE;
  private EGLContext mEglContext = EGL_NO_CONTEXT;

  @Before
  public void setup() throws Throwable {
    mEglDisplay = EGL14.eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if (mEglDisplay == EGL_NO_DISPLAY) {
      throw new RuntimeException("no EGL display");
    }
    int[] major = new int[1];
    int[] minor = new int[1];
    if (!EGL14.eglInitialize(mEglDisplay, major, 0, minor, 0)) {
      throw new RuntimeException("error in eglInitialize");
    }

    // If we could rely on having EGL_KHR_surfaceless_context and EGL_KHR_context_no_config, we
    // wouldn't have to create a config or pbuffer at all.

    int[] numConfigs = new int[1];
    EGLConfig[] configs = new EGLConfig[1];
    if (!EGL14.eglChooseConfig(mEglDisplay,
        new int[] {
            EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
            EGL_NONE},
        0, configs, 0, 1, numConfigs, 0)) {
      throw new RuntimeException("eglChooseConfig failed");
    }
    mEglConfig = configs[0];

    mEglPbuffer = EGL14.eglCreatePbufferSurface(mEglDisplay, mEglConfig,
        new int[] {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE}, 0);
    if (mEglPbuffer == EGL_NO_SURFACE) {
      throw new RuntimeException("eglCreatePbufferSurface failed");
    }

    mEglContext = EGL14.eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT,
        new int[] {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}, 0);
    if (mEglContext == EGL_NO_CONTEXT) {
      throw new RuntimeException("eglCreateContext failed");
    }

    if (!EGL14.eglMakeCurrent(mEglDisplay, mEglPbuffer, mEglPbuffer, mEglContext)) {
      throw new RuntimeException("eglMakeCurrent failed");
    }
  }

  @Test
  public void testBasic() {
    // create a detached SurfaceTexture
    SurfaceTexture consumer = new SurfaceTexture(false);
    consumer.setDefaultBufferSize(640, 480);
    nBasicTests(consumer);
  }

  private static native void nBasicTests(SurfaceTexture consumer);
}
