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

// RendererWGL.h: Renderer class for GL on Windows.  Owns a WGL context object.

#ifndef LIBANGLE_RENDERER_GL_WGL_RENDERERWGL_H_
#define LIBANGLE_RENDERER_GL_WGL_RENDERERWGL_H_

#include "libANGLE/renderer/gl/RendererGL.h"
#include "libANGLE/renderer/gl/wgl/FunctionsWGL.h"

namespace rx
{
class DisplayWGL;

class RendererWGL : public RendererGL
{
  public:
    RendererWGL(std::unique_ptr<FunctionsGL> functionsGL,
                const egl::AttributeMap &attribMap,
                DisplayWGL *display,
                HGLRC context,
                HGLRC sharedContext,
                const std::vector<int> workerContextAttribs);
    ~RendererWGL() override;

    HGLRC getContext() const;

  private:
    WorkerContext *createWorkerContext(std::string *infoLog) override;
    DisplayWGL *mDisplay;
    HGLRC mContext;
    HGLRC mSharedContext;
    const std::vector<int> mWorkerContextAttribs;
};
}  // namespace rx

#endif  // LIBANGLE_RENDERER_GL_WGL_RENDERERWGL_H_
