//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ClearMultiviewGL:
//   A helper for clearing multiview side-by-side and layered framebuffers.
//

#ifndef LIBANGLE_RENDERER_GL_CLEARMULTIVIEWGL_H_
#define LIBANGLE_RENDERER_GL_CLEARMULTIVIEWGL_H_

#include "angle_gl.h"
#include "libANGLE/Error.h"
#include "libANGLE/angletypes.h"

namespace gl
{
class FramebufferState;
}  // namespace gl

namespace rx
{
class FunctionsGL;
class StateManagerGL;

class ClearMultiviewGL : angle::NonCopyable
{
  public:
    // Enum containing the different types of Clear* commands.
    enum class ClearCommandType
    {
        Clear,
        ClearBufferfv,
        ClearBufferuiv,
        ClearBufferiv,
        ClearBufferfi
    };

  public:
    ClearMultiviewGL(const FunctionsGL *functions, StateManagerGL *stateManager);
    ~ClearMultiviewGL();

    ClearMultiviewGL(const ClearMultiviewGL &rht) = delete;
    ClearMultiviewGL &operator=(const ClearMultiviewGL &rht) = delete;
    ClearMultiviewGL(ClearMultiviewGL &&rht)                 = delete;
    ClearMultiviewGL &operator=(ClearMultiviewGL &&rht) = delete;

    void clearMultiviewFBO(const gl::FramebufferState &state,
                           const gl::Rectangle &scissorBase,
                           ClearCommandType clearCommandType,
                           GLbitfield mask,
                           GLenum buffer,
                           GLint drawbuffer,
                           const uint8_t *values,
                           GLfloat depth,
                           GLint stencil);
    void initializeResources();

  private:
    void attachTextures(const gl::FramebufferState &state, int layer);
    void detachTextures(const gl::FramebufferState &state);
    void clearLayeredFBO(const gl::FramebufferState &state,
                         ClearCommandType clearCommandType,
                         GLbitfield mask,
                         GLenum buffer,
                         GLint drawbuffer,
                         const uint8_t *values,
                         GLfloat depth,
                         GLint stencil);
    void genericClear(ClearCommandType clearCommandType,
                      GLbitfield mask,
                      GLenum buffer,
                      GLint drawbuffer,
                      const uint8_t *values,
                      GLfloat depth,
                      GLint stencil);

    const FunctionsGL *mFunctions;
    StateManagerGL *mStateManager;

    GLuint mFramebuffer;
};
}  // namespace rx

#endif  // LIBANGLE_RENDERER_GL_CLEARMULTIVIEWGL_H_
