// Copyright 2015 The Cobalt Authors. 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.

#ifndef COBALT_RENDERER_BACKEND_EGL_PBUFFER_RENDER_TARGET_H_
#define COBALT_RENDERER_BACKEND_EGL_PBUFFER_RENDER_TARGET_H_

#include "cobalt/math/size.h"
#include "cobalt/renderer/backend/egl/render_target.h"
#include "cobalt/renderer/egl_and_gles.h"

namespace cobalt {
namespace renderer {
namespace backend {

// A PBuffer render target provides an encapsulation around an EGL PBO
// (Pixel Buffer Object) which can be used as an offscreen rendering target.
class PBufferRenderTargetEGL : public RenderTargetEGL {
 public:
  PBufferRenderTargetEGL(
      EGLDisplay display, EGLConfig config, const math::Size& dimensions);

  const math::Size& GetSize() const override;

  EGLSurface GetSurface() const override;

  EGLDisplay display() const { return display_; }
  EGLConfig config() const { return config_; }

  bool CreationError() override { return surface_ == EGL_NO_SURFACE; }

 private:
  ~PBufferRenderTargetEGL() override;

  EGLDisplay display_;
  EGLConfig config_;
  EGLSurface surface_;

  math::Size size_;
};

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

#endif  // COBALT_RENDERER_BACKEND_EGL_PBUFFER_RENDER_TARGET_H_
