/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * 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.
 */

#include "cobalt/renderer/backend/egl/pbuffer_render_target.h"

#include <GLES2/gl2.h>

#include "cobalt/renderer/backend/egl/utils.h"

namespace cobalt {
namespace renderer {
namespace backend {

PBufferRenderTargetEGL::PBufferRenderTargetEGL(EGLDisplay display,
                                               EGLConfig config,
                                               const math::Size& dimensions)
    : display_(display), config_(config), size_(dimensions) {
  EGLint surface_attrib_list[] = {
      EGL_WIDTH, dimensions.width(),
      EGL_HEIGHT, dimensions.height(),
      EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
      EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,
      EGL_NONE,
  };

  surface_ =
    eglCreatePbufferSurface(display_, config_, surface_attrib_list);
  CHECK_EQ(EGL_SUCCESS, eglGetError());
}

const math::Size& PBufferRenderTargetEGL::GetSize() { return size_; }

EGLSurface PBufferRenderTargetEGL::GetSurface() const {
  return surface_;
}

PBufferRenderTargetEGL::~PBufferRenderTargetEGL() {
  EGL_CALL(eglDestroySurface(display_, surface_));
}

}  // namespace backend
}  // namespace renderer
}  // namespace cobalt
