blob: a4a5115436154c0189891b5363f90ebeb7c9edf1 [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 Langf9a6f082015-01-22 13:32:49 -050013#include "libANGLE/renderer/gl/BufferGL.h"
14#include "libANGLE/renderer/gl/CompilerGL.h"
15#include "libANGLE/renderer/gl/DefaultAttachmentGL.h"
16#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 Langf9a6f082015-01-22 13:32:49 -050025#include "libANGLE/renderer/gl/TextureGL.h"
26#include "libANGLE/renderer/gl/TransformFeedbackGL.h"
27#include "libANGLE/renderer/gl/VertexArrayGL.h"
28
29namespace rx
30{
31
Geoff Lang56cf9af2015-02-17 10:16:49 -050032RendererGL::RendererGL(const FunctionsGL *functions)
33 : Renderer(),
Geoff Lang94463d52015-02-18 13:09:37 -050034 mFunctions(functions),
35 mStateManager(nullptr)
Geoff Lang56cf9af2015-02-17 10:16:49 -050036{
37 ASSERT(mFunctions);
Geoff Lang94463d52015-02-18 13:09:37 -050038 mStateManager = new StateManagerGL(mFunctions);
Geoff Lang56cf9af2015-02-17 10:16:49 -050039}
Geoff Langf9a6f082015-01-22 13:32:49 -050040
41RendererGL::~RendererGL()
Geoff Lang94463d52015-02-18 13:09:37 -050042{
43 SafeDelete(mStateManager);
44}
Geoff Langf9a6f082015-01-22 13:32:49 -050045
46gl::Error RendererGL::flush()
47{
48 UNIMPLEMENTED();
49 return gl::Error(GL_INVALID_OPERATION);
50}
51
52gl::Error RendererGL::finish()
53{
54 UNIMPLEMENTED();
55 return gl::Error(GL_INVALID_OPERATION);
56}
57
58gl::Error RendererGL::drawArrays(const gl::Data &data, GLenum mode,
59 GLint first, GLsizei count, GLsizei instances)
60{
Geoff Langd6e50872015-02-24 12:42:26 -050061 mStateManager->setDrawState(*data.state);
62 mFunctions->drawArrays(mode, first, count);
63
64 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -050065}
66
67gl::Error RendererGL::drawElements(const gl::Data &data, GLenum mode, GLsizei count, GLenum type,
68 const GLvoid *indices, GLsizei instances,
69 const RangeUI &indexRange)
70{
Geoff Langd6e50872015-02-24 12:42:26 -050071 if (instances > 0)
72 {
73 UNIMPLEMENTED();
74 }
75
76 mStateManager->setDrawState(*data.state);
77 mFunctions->drawElements(mode, count, type, indices);
78
79 return gl::Error(GL_NO_ERROR);
Geoff Langf9a6f082015-01-22 13:32:49 -050080}
81
82CompilerImpl *RendererGL::createCompiler(const gl::Data &data)
83{
Geoff Langc4152832015-02-20 09:57:29 -050084 return new CompilerGL(data);
Geoff Langf9a6f082015-01-22 13:32:49 -050085}
86
87ShaderImpl *RendererGL::createShader(GLenum type)
88{
Geoff Lang295ed4c2015-02-20 09:58:25 -050089 return new ShaderGL(type, mFunctions);
Geoff Langf9a6f082015-01-22 13:32:49 -050090}
91
92ProgramImpl *RendererGL::createProgram()
93{
Geoff Langb1f435e2015-02-20 10:01:01 -050094 return new ProgramGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -050095}
96
97DefaultAttachmentImpl *RendererGL::createDefaultAttachment(GLenum type, egl::Surface *surface)
98{
99 return new DefaultAttachmentGL();
100}
101
102FramebufferImpl *RendererGL::createFramebuffer()
103{
104 return new FramebufferGL();
105}
106
107TextureImpl *RendererGL::createTexture(GLenum target)
108{
109 return new TextureGL();
110}
111
112RenderbufferImpl *RendererGL::createRenderbuffer()
113{
114 return new RenderbufferGL();
115}
116
117BufferImpl *RendererGL::createBuffer()
118{
Geoff Lang36c79012015-02-24 11:47:20 -0500119 return new BufferGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500120}
121
122VertexArrayImpl *RendererGL::createVertexArray()
123{
Geoff Langba4c4a82015-02-24 12:38:46 -0500124 return new VertexArrayGL(mFunctions, mStateManager);
Geoff Langf9a6f082015-01-22 13:32:49 -0500125}
126
127QueryImpl *RendererGL::createQuery(GLenum type)
128{
129 return new QueryGL(type);
130}
131
132FenceNVImpl *RendererGL::createFenceNV()
133{
134 return new FenceNVGL();
135}
136
137FenceSyncImpl *RendererGL::createFenceSync()
138{
139 return new FenceSyncGL();
140}
141
142TransformFeedbackImpl *RendererGL::createTransformFeedback()
143{
144 return new TransformFeedbackGL();
145}
146
147void RendererGL::notifyDeviceLost()
148{
149 UNIMPLEMENTED();
150}
151
152bool RendererGL::isDeviceLost() const
153{
154 UNIMPLEMENTED();
155 return bool();
156}
157
158bool RendererGL::testDeviceLost()
159{
160 UNIMPLEMENTED();
161 return bool();
162}
163
164bool RendererGL::testDeviceResettable()
165{
166 UNIMPLEMENTED();
167 return bool();
168}
169
170VendorID RendererGL::getVendorId() const
171{
172 UNIMPLEMENTED();
173 return VendorID();
174}
175
176std::string RendererGL::getVendorString() const
177{
178 UNIMPLEMENTED();
179 return std::string();
180}
181
182std::string RendererGL::getRendererDescription() const
183{
Geoff Langf1e85922015-02-23 14:40:04 -0500184 //UNIMPLEMENTED();
Geoff Langf9a6f082015-01-22 13:32:49 -0500185 return std::string();
186}
187
188void RendererGL::generateCaps(gl::Caps *outCaps, gl::TextureCapsMap* outTextureCaps, gl::Extensions *outExtensions) const
189{
190 // Set some minimum GLES2 caps, TODO: query for real GL caps
191 outCaps->maxElementIndex = static_cast<GLint64>(std::numeric_limits<unsigned int>::max());
192 outCaps->max3DTextureSize = 0;
193 outCaps->max2DTextureSize = 1024;
194 outCaps->maxCubeMapTextureSize = outCaps->max2DTextureSize;
195 outCaps->maxArrayTextureLayers = 1;
196 outCaps->maxLODBias = 0.0f;
197 outCaps->maxRenderbufferSize = outCaps->max2DTextureSize;
198 outCaps->maxDrawBuffers = 1;
199 outCaps->maxColorAttachments = 1;
200 outCaps->maxViewportWidth = outCaps->max2DTextureSize;
201 outCaps->maxViewportHeight = outCaps->maxViewportWidth;
202 outCaps->minAliasedPointSize = 1.0f;
203 outCaps->maxAliasedPointSize = 1.0f;
204 outCaps->minAliasedLineWidth = 1.0f;
205 outCaps->maxAliasedLineWidth = 1.0f;
206 outCaps->maxElementsIndices = 0;
207 outCaps->maxElementsVertices = 0;
208 outCaps->maxServerWaitTimeout = 0;
209 outCaps->maxVertexAttributes = 16;
210 outCaps->maxVertexUniformVectors = 256;
211 outCaps->maxVertexUniformVectors = outCaps->maxVertexUniformVectors * 4;
212 outCaps->maxVertexUniformBlocks = 0;
213 outCaps->maxVertexOutputComponents = 16;
214 outCaps->maxVertexTextureImageUnits = outCaps->maxTextureImageUnits;
215 outCaps->maxFragmentUniformVectors = 256;
216 outCaps->maxFragmentUniformComponents = outCaps->maxFragmentUniformVectors * 4;
217 outCaps->maxFragmentUniformBlocks = 0;
218 outCaps->maxFragmentInputComponents = outCaps->maxVertexOutputComponents;
219 outCaps->maxTextureImageUnits = 16;
220 outCaps->minProgramTexelOffset = 0;
221 outCaps->maxProgramTexelOffset = 0;
222 outCaps->maxUniformBufferBindings = 0;
223 outCaps->maxUniformBlockSize = 0;
224 outCaps->uniformBufferOffsetAlignment = 0;
225 outCaps->maxCombinedUniformBlocks = 0;
226 outCaps->maxCombinedVertexUniformComponents = 0;
227 outCaps->maxCombinedFragmentUniformComponents = 0;
228 outCaps->maxVaryingComponents = 0;
229 outCaps->maxVaryingVectors = outCaps->maxVertexOutputComponents / 4;
230 outCaps->maxCombinedTextureImageUnits = outCaps->maxVertexTextureImageUnits + outCaps->maxTextureImageUnits;
231 outCaps->maxTransformFeedbackInterleavedComponents = 0;
232 outCaps->maxTransformFeedbackSeparateAttributes = 0;
233 outCaps->maxTransformFeedbackSeparateComponents = 0;
234
235 gl::TextureCaps supportedTextureFormat;
236 supportedTextureFormat.texturable = true;
237 supportedTextureFormat.filterable = true;
238 supportedTextureFormat.renderable = true;
239
240 outTextureCaps->insert(GL_RGB565, supportedTextureFormat);
241 outTextureCaps->insert(GL_RGBA4, supportedTextureFormat);
242 outTextureCaps->insert(GL_RGB5_A1, supportedTextureFormat);
243 outTextureCaps->insert(GL_RGB8_OES, supportedTextureFormat);
244 outTextureCaps->insert(GL_RGBA8_OES, supportedTextureFormat);
245
246 outTextureCaps->insert(GL_DEPTH_COMPONENT16, supportedTextureFormat);
247 outTextureCaps->insert(GL_STENCIL_INDEX8, supportedTextureFormat);
248
249 outExtensions->setTextureExtensionSupport(*outTextureCaps);
250 outExtensions->textureNPOT = true;
251 outExtensions->textureStorage = true;
252}
253
254Workarounds RendererGL::generateWorkarounds() const
255{
256 Workarounds workarounds;
257 return workarounds;
258}
259
260}