blob: ced11f4e476ee5ff9077f741c8bf20f655c5de8d [file] [log] [blame]
//
// Copyright 2015 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.
//
// RendererGL.h: Defines the class interface for RendererGL.
#ifndef LIBANGLE_RENDERER_GL_RENDERERGL_H_
#define LIBANGLE_RENDERER_GL_RENDERERGL_H_
#include <list>
#include <mutex>
#include <thread>
#include "libANGLE/Caps.h"
#include "libANGLE/Error.h"
#include "libANGLE/Version.h"
#include "libANGLE/renderer/gl/renderergl_utils.h"
#include "platform/FeaturesGL.h"
namespace angle
{
struct FrontendFeatures;
} // namespace angle
namespace gl
{
struct IndexRange;
class Path;
class State;
} // namespace gl
namespace egl
{
class AttributeMap;
} // namespace egl
namespace sh
{
struct BlockMemberInfo;
} // namespace sh
namespace rx
{
class BlitGL;
class ClearMultiviewGL;
class ContextImpl;
class DisplayGL;
class FunctionsGL;
class RendererGL;
class StateManagerGL;
// WorkerContext wraps a native GL context shared from the main context. It is used by the workers
// for khr_parallel_shader_compile.
class WorkerContext : angle::NonCopyable
{
public:
virtual ~WorkerContext() {}
virtual bool makeCurrent() = 0;
virtual void unmakeCurrent() = 0;
};
class ScopedWorkerContextGL
{
public:
ScopedWorkerContextGL(RendererGL *renderer, std::string *infoLog);
~ScopedWorkerContextGL();
bool operator()() const;
private:
RendererGL *mRenderer = nullptr;
bool mValid = false;
};
class RendererGL : angle::NonCopyable
{
public:
RendererGL(std::unique_ptr<FunctionsGL> functions,
const egl::AttributeMap &attribMap,
DisplayGL *display);
virtual ~RendererGL();
angle::Result flush();
angle::Result finish();
// CHROMIUM_path_rendering implementation
void stencilFillPath(const gl::State &state,
const gl::Path *path,
GLenum fillMode,
GLuint mask);
void stencilStrokePath(const gl::State &state,
const gl::Path *path,
GLint reference,
GLuint mask);
void coverFillPath(const gl::State &state, const gl::Path *path, GLenum coverMode);
void coverStrokePath(const gl::State &state, const gl::Path *path, GLenum coverMode);
void stencilThenCoverFillPath(const gl::State &state,
const gl::Path *path,
GLenum fillMode,
GLuint mask,
GLenum coverMode);
void stencilThenCoverStrokePath(const gl::State &state,
const gl::Path *path,
GLint reference,
GLuint mask,
GLenum coverMode);
void coverFillPathInstanced(const gl::State &state,
const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum transformType,
const GLfloat *transformValues);
void coverStrokePathInstanced(const gl::State &state,
const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum transformType,
const GLfloat *transformValues);
void stencilFillPathInstanced(const gl::State &state,
const std::vector<gl::Path *> &paths,
GLenum fillMode,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues);
void stencilStrokePathInstanced(const gl::State &state,
const std::vector<gl::Path *> &paths,
GLint reference,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues);
void stencilThenCoverFillPathInstanced(const gl::State &state,
const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLenum fillMode,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues);
void stencilThenCoverStrokePathInstanced(const gl::State &state,
const std::vector<gl::Path *> &paths,
GLenum coverMode,
GLint reference,
GLuint mask,
GLenum transformType,
const GLfloat *transformValues);
gl::GraphicsResetStatus getResetStatus();
// EXT_debug_marker
void insertEventMarker(GLsizei length, const char *marker);
void pushGroupMarker(GLsizei length, const char *marker);
void popGroupMarker();
// KHR_debug
void pushDebugGroup(GLenum source, GLuint id, const std::string &message);
void popDebugGroup();
std::string getVendorString() const;
std::string getRendererDescription() const;
GLint getGPUDisjoint();
GLint64 getTimestamp();
const gl::Version &getMaxSupportedESVersion() const;
const FunctionsGL *getFunctions() const { return mFunctions.get(); }
StateManagerGL *getStateManager() const { return mStateManager; }
const angle::FeaturesGL &getFeatures() const { return mFeatures; }
BlitGL *getBlitter() const { return mBlitter; }
ClearMultiviewGL *getMultiviewClearer() const { return mMultiviewClearer; }
MultiviewImplementationTypeGL getMultiviewImplementationType() const;
const gl::Caps &getNativeCaps() const;
const gl::TextureCapsMap &getNativeTextureCaps() const;
const gl::Extensions &getNativeExtensions() const;
const gl::Limitations &getNativeLimitations() const;
void initializeFrontendFeatures(angle::FrontendFeatures *features) const;
angle::Result dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
GLuint numGroupsZ);
angle::Result dispatchComputeIndirect(const gl::Context *context, GLintptr indirect);
angle::Result memoryBarrier(GLbitfield barriers);
angle::Result memoryBarrierByRegion(GLbitfield barriers);
bool bindWorkerContext(std::string *infoLog);
void unbindWorkerContext();
// Checks if the driver has the KHR_parallel_shader_compile or ARB_parallel_shader_compile
// extension.
bool hasNativeParallelCompile();
void setMaxShaderCompilerThreads(GLuint count);
static unsigned int getMaxWorkerContexts();
protected:
virtual WorkerContext *createWorkerContext(std::string *infoLog) = 0;
private:
void ensureCapsInitialized() const;
void generateCaps(gl::Caps *outCaps,
gl::TextureCapsMap *outTextureCaps,
gl::Extensions *outExtensions,
gl::Limitations *outLimitations) const;
mutable gl::Version mMaxSupportedESVersion;
std::unique_ptr<FunctionsGL> mFunctions;
StateManagerGL *mStateManager;
BlitGL *mBlitter;
ClearMultiviewGL *mMultiviewClearer;
bool mUseDebugOutput;
mutable bool mCapsInitialized;
mutable gl::Caps mNativeCaps;
mutable gl::TextureCapsMap mNativeTextureCaps;
mutable gl::Extensions mNativeExtensions;
mutable gl::Limitations mNativeLimitations;
mutable MultiviewImplementationTypeGL mMultiviewImplementationType;
// The thread-to-context mapping for the currently active worker threads.
std::unordered_map<std::thread::id, std::unique_ptr<WorkerContext>> mCurrentWorkerContexts;
// The worker contexts available to use.
std::list<std::unique_ptr<WorkerContext>> mWorkerContextPool;
// Protect the concurrent accesses to worker contexts.
std::mutex mWorkerMutex;
bool mNativeParallelCompileEnabled;
angle::FeaturesGL mFeatures;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_RENDERERGL_H_