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

// Clear11.h: Framebuffer clear utility class.

#ifndef LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_
#define LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_

#include <map>
#include <vector>

#include "libANGLE/Error.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/angletypes.h"
#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"

namespace rx
{
class Renderer11;
class RenderTarget11;
struct ClearParameters;

template <typename T>
struct RtvDsvClearInfo
{
    T r, g, b, a;
    float z;
    float c1padding[3];
};

class Clear11 : angle::NonCopyable
{
  public:
    explicit Clear11(Renderer11 *renderer);
    ~Clear11();

    // Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is
    // currently applied.
    angle::Result clearFramebuffer(const gl::Context *context,
                                   const ClearParameters &clearParams,
                                   const gl::FramebufferState &fboData);

  private:
    class ShaderManager final : angle::NonCopyable
    {
      public:
        ShaderManager();
        ~ShaderManager();
        angle::Result getShadersAndLayout(const gl::Context *context,
                                          Renderer11 *renderer,
                                          const INT clearType,
                                          const uint32_t numRTs,
                                          const bool hasLayeredLayout,
                                          const d3d11::InputLayout **il,
                                          const d3d11::VertexShader **vs,
                                          const d3d11::GeometryShader **gs,
                                          const d3d11::PixelShader **ps);

      private:
        constexpr static size_t kNumShaders = D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT;

        d3d11::InputLayout mIl9;
        d3d11::LazyShader<ID3D11VertexShader> mVs9;
        d3d11::LazyShader<ID3D11PixelShader> mPsFloat9;
        d3d11::LazyShader<ID3D11VertexShader> mVs;
        d3d11::LazyShader<ID3D11VertexShader> mVsMultiview;
        d3d11::LazyShader<ID3D11GeometryShader> mGsMultiview;
        d3d11::LazyShader<ID3D11PixelShader> mPsDepth;
        std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsFloat;
        std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsUInt;
        std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsSInt;
    };

    bool useVertexBuffer() const;
    angle::Result ensureConstantBufferCreated(const gl::Context *context);
    angle::Result ensureVertexBufferCreated(const gl::Context *context);
    angle::Result ensureResourcesInitialized(const gl::Context *context);

    Renderer11 *mRenderer;
    bool mResourcesInitialized;

    // States
    d3d11::RasterizerState mScissorEnabledRasterizerState;
    d3d11::RasterizerState mScissorDisabledRasterizerState;
    gl::DepthStencilState mDepthStencilStateKey;
    d3d11::BlendStateKey mBlendStateKey;

    // Shaders and shader resources
    ShaderManager mShaderManager;
    d3d11::Buffer mConstantBuffer;
    d3d11::Buffer mVertexBuffer;

    // Buffer data and draw parameters
    RtvDsvClearInfo<float> mShaderData;
};

}  // namespace rx

#endif  // LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_
