// 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.

#include "cobalt/renderer/rasterizer/egl/draw_clear.h"

#include <GLES2/gl2.h>

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

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

DrawClear::DrawClear(GraphicsState* graphics_state, const BaseState& base_state,
                     const render_tree::ColorRGBA& clear_color)
    : DrawObject(base_state), clear_color_(GetDrawColor(clear_color)) {}

void DrawClear::ExecuteUpdateVertexBuffer(
    GraphicsState* graphics_state, ShaderProgramManager* program_manager) {
  SB_UNREFERENCED_PARAMETER(graphics_state);
  SB_UNREFERENCED_PARAMETER(program_manager);
}

void DrawClear::ExecuteRasterize(GraphicsState* graphics_state,
                                 ShaderProgramManager* program_manager) {
  SB_UNREFERENCED_PARAMETER(program_manager);

  graphics_state->Scissor(base_state_.scissor.x(), base_state_.scissor.y(),
                          base_state_.scissor.width(),
                          base_state_.scissor.height());

  graphics_state->Clear(clear_color_.r(), clear_color_.g(), clear_color_.b(),
                        clear_color_.a());
}

base::TypeId DrawClear::GetTypeId() const {
  return base::GetTypeId<DrawClear>();
}

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