// Copyright 2017 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_RASTERIZER_EGL_SHADER_PROGRAM_H_
#define COBALT_RENDERER_RASTERIZER_EGL_SHADER_PROGRAM_H_

#include "base/compiler_specific.h"
#include "cobalt/base/type_id.h"
#include "cobalt/renderer/rasterizer/egl/shader_base.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace egl {

class ShaderProgramManager;

// ShaderProgramBase represents a shader program with vertex and fragment
// shaders attached. This should be instantiated via the template ShaderProgram
// class.
class ShaderProgramBase {
 public:
  GLuint GetHandle() const { return handle_; }

 protected:
  // Shader programs should only be created and destroyed by the
  // ShaderProgramManager.
  friend class ShaderProgramManager;

  ShaderProgramBase();
  virtual ~ShaderProgramBase();
  void Create(ShaderBase* vertex_shader, ShaderBase* fragment_shader);
  void Destroy(ShaderBase* vertex_shader, ShaderBase* fragment_shader);

 private:
  GLuint handle_;
};

// This template ShaderProgram class represents a shader program with specific
// vertex and fragment shaders. The shaders must inherit from ShaderBase.
template <typename VertexShader, typename FragmentShader>
class ShaderProgram : public ShaderProgramBase {
 public:
  const VertexShader& GetVertexShader() const { return vertex_shader_; }
  const FragmentShader& GetFragmentShader() const { return fragment_shader_; }
  static base::TypeId GetTypeId() {
    return base::GetTypeId<ShaderProgram<VertexShader, FragmentShader> >();
  }

 private:
  // Shader programs should only be created and destroyed by the
  // ShaderProgramManager.
  friend class ShaderProgramManager;

  ShaderProgram() { Create(&vertex_shader_, &fragment_shader_); }
  ~ShaderProgram() override { Destroy(&vertex_shader_, &fragment_shader_); }

  VertexShader vertex_shader_;
  FragmentShader fragment_shader_;
};

}  // namespace egl
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_RASTERIZER_EGL_SHADER_PROGRAM_H_
