blob: b4abac6408513370538a67823fdb40f86b0a029b [file] [log] [blame]
Geoff Langf9a6f082015-01-22 13:32:49 -05001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// RendererGL.cpp: Implements the class methods for RendererGL.
8
9#include "libANGLE/renderer/gl/RendererGL.h"
10
11#include "common/debug.h"
Geoff Langc4152832015-02-20 09:57:29 -050012#include "libANGLE/Data.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040013#include "libANGLE/Surface.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050014#include "libANGLE/renderer/gl/BufferGL.h"
15#include "libANGLE/renderer/gl/CompilerGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050016#include "libANGLE/renderer/gl/FenceNVGL.h"
17#include "libANGLE/renderer/gl/FenceSyncGL.h"
18#include "libANGLE/renderer/gl/FramebufferGL.h"
Geoff Lang56cf9af2015-02-17 10:16:49 -050019#include "libANGLE/renderer/gl/FunctionsGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050020#include "libANGLE/renderer/gl/ProgramGL.h"
21#include "libANGLE/renderer/gl/QueryGL.h"
22#include "libANGLE/renderer/gl/RenderbufferGL.h"
23#include "libANGLE/renderer/gl/ShaderGL.h"
Geoff Lang94463d52015-02-18 13:09:37 -050024#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Lang4ad17092015-03-10 16:47:44 -040025#include "libANGLE/renderer/gl/SurfaceGL.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050026#include "libANGLE/renderer/gl/TextureGL.h"
27#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
28#include "libANGLE/renderer/gl/VertexArrayGL.h"
Geoff Langddc74462015-02-25 11:48:09 -050029#include "libANGLE/renderer/gl/renderergl_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050030
31namespace rx
32{
33
Geoff Lang56cf9af2015-02-17 10:16:49 -050034RendererGL::RendererGL(const FunctionsGL *functions)
35 : Renderer(),
Geoff Lang94463d52015-02-18 13:09:37 -050036 mFunctions(functions),
37 mStateManager(nullptr)
Geoff Lang56cf9af2015-02-17 10:16:49 -050038{
39 ASSERT(mFunctions);
Geoff Langc05f7062015-03-10 09:50:57 -070040 mStateManager = new StateManagerGL(mFunctions, getRendererCaps());
Geoff Lang56cf9af2015-02-17 10:16:49 -050041}
Geoff Langf9a6f082015-01-22 13:32:49 -050042
43RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -050044{
45 SafeDelete(mStateManager);
46}
Geoff Langf9a6f082015-01-22 13:32:49 -050047
48gl::Error RendererGL::flush()
49{
Geoff Lang2c919142015-04-01 14:44:13 -040050 mFunctions->flush();
51 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -050052}
53
54gl::Error RendererGL::finish()
55{
Geoff Lang2c919142015-04-01 14:44:13 -040056 mFunctions->finish();
57 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -050058}
59
60gl::Error RendererGL::drawArrays(const gl::Data &data, GLenum mode,
61 GLint first, GLsizei count, GLsizei instances)
62{
Geoff Lang7c82bc42015-03-09 16:18:08 -040063 gl::Error error = mStateManager->setDrawArraysState(data, first, count);
64 if (error.isError())
65 {
66 return error;
67 }
68
Geoff Langd6e50872015-02-24 12:42:26 -050069 mFunctions->drawArrays(mode, first, count);
70
71 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -050072}
73
74gl::Error RendererGL::drawElements(const gl::Data &data, GLenum mode, GLsizei count, GLenum type,
75 const GLvoid *indices, GLsizei instances,
76 const RangeUI &indexRange)
77{
Geoff Langd6e50872015-02-24 12:42:26 -050078 if (instances > 0)
79 {
80 UNIMPLEMENTED();
81 }
82
Geoff Lang7c82bc42015-03-09 16:18:08 -040083 const GLvoid *drawIndexPointer = nullptr;
84 gl::Error error = mStateManager->setDrawElementsState(data, count, type, indices, &drawIndexPointer);
85 if (error.isError())
86 {
87 return error;
88 }
89
90 mFunctions->drawElements(mode, count, type, drawIndexPointer);
Geoff Langd6e50872015-02-24 12:42:26 -050091
92 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -050093}
94
95CompilerImpl *RendererGL::createCompiler(const gl::Data &data)
96{
Geoff Langc4152832015-02-20 09:57:29 -050097 return new CompilerGL(data);
Geoff Langf9a6f082015-01-22 13:32:49 -050098}
99
100ShaderImpl *RendererGL::createShader(GLenum type)
101{
Geoff Lang295ed4c2015-02-20 09:58:25 -0500102 return new ShaderGL(type, mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500103}
104
105ProgramImpl *RendererGL::createProgram()
106{
Geoff Langb1f435e2015-02-20 10:01:01 -0500107 return new ProgramGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500108}
109
Geoff Lang4ad17092015-03-10 16:47:44 -0400110FramebufferImpl *RendererGL::createDefaultFramebuffer(const gl::Framebuffer::Data &data)
111{
112 return new FramebufferGL(data, mFunctions, mStateManager, true);
Geoff Langf9a6f082015-01-22 13:32:49 -0500113}
114
Jamie Madilld1405e52015-03-05 15:41:39 -0500115FramebufferImpl *RendererGL::createFramebuffer(const gl::Framebuffer::Data &data)
Geoff Langf9a6f082015-01-22 13:32:49 -0500116{
Geoff Lang4ad17092015-03-10 16:47:44 -0400117 return new FramebufferGL(data, mFunctions, mStateManager, false);
Geoff Langf9a6f082015-01-22 13:32:49 -0500118}
119
120TextureImpl *RendererGL::createTexture(GLenum target)
121{
Geoff Langc05f7062015-03-10 09:50:57 -0700122 return new TextureGL(target, mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500123}
124
125RenderbufferImpl *RendererGL::createRenderbuffer()
126{
Geoff Langa4903b72015-03-02 16:02:48 -0800127 return new RenderbufferGL(mFunctions, mStateManager, getRendererTextureCaps());
Geoff Langf9a6f082015-01-22 13:32:49 -0500128}
129
130BufferImpl *RendererGL::createBuffer()
131{
Geoff Lang36c79012015-02-24 11:47:20 -0500132 return new BufferGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500133}
134
135VertexArrayImpl *RendererGL::createVertexArray()
136{
Geoff Langba4c4a82015-02-24 12:38:46 -0500137 return new VertexArrayGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500138}
139
140QueryImpl *RendererGL::createQuery(GLenum type)
141{
142 return new QueryGL(type);
143}
144
145FenceNVImpl *RendererGL::createFenceNV()
146{
147 return new FenceNVGL();
148}
149
150FenceSyncImpl *RendererGL::createFenceSync()
151{
152 return new FenceSyncGL();
153}
154
155TransformFeedbackImpl *RendererGL::createTransformFeedback()
156{
157 return new TransformFeedbackGL();
158}
159
160void RendererGL::notifyDeviceLost()
161{
162 UNIMPLEMENTED();
163}
164
165bool RendererGL::isDeviceLost() const
166{
167 UNIMPLEMENTED();
168 return bool();
169}
170
171bool RendererGL::testDeviceLost()
172{
173 UNIMPLEMENTED();
174 return bool();
175}
176
177bool RendererGL::testDeviceResettable()
178{
179 UNIMPLEMENTED();
180 return bool();
181}
182
183VendorID RendererGL::getVendorId() const
184{
185 UNIMPLEMENTED();
186 return VendorID();
187}
188
189std::string RendererGL::getVendorString() const
190{
Geoff Lange42753b2015-04-08 13:46:33 -0400191 return std::string(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
Geoff Langf9a6f082015-01-22 13:32:49 -0500192}
193
194std::string RendererGL::getRendererDescription() const
195{
Geoff Lange42753b2015-04-08 13:46:33 -0400196 std::string nativeVendorString(reinterpret_cast<const char*>(mFunctions->getString(GL_VENDOR)));
197 std::string nativeRendererString(reinterpret_cast<const char*>(mFunctions->getString(GL_RENDERER)));
198
Geoff Lange42753b2015-04-08 13:46:33 -0400199 std::ostringstream rendererString;
200 rendererString << nativeVendorString << " " << nativeRendererString << " OpenGL";
Geoff Langa4903b72015-03-02 16:02:48 -0800201 if (mFunctions->openGLES)
Geoff Lange42753b2015-04-08 13:46:33 -0400202 {
203 rendererString << " ES";
204 }
Geoff Langa4903b72015-03-02 16:02:48 -0800205 rendererString << " " << mFunctions->majorVersion << "." << mFunctions->minorVersion;
Geoff Lange42753b2015-04-08 13:46:33 -0400206
207 return rendererString.str();
Geoff Langf9a6f082015-01-22 13:32:49 -0500208}
209
210void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps, gl::Extensions *outExtensions) const
211{
Geoff Langddc74462015-02-25 11:48:09 -0500212 nativegl_gl::GenerateCaps(mFunctions, outCaps, outTextureCaps, outExtensions);
Geoff Langf9a6f082015-01-22 13:32:49 -0500213}
214
215Workarounds RendererGL::generateWorkarounds() const
216{
217 Workarounds workarounds;
218 return workarounds;
219}
220
221}