• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2016 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 // ContextNULL.cpp:
7 //    Implements the class methods for ContextNULL.
8 //
9 
10 #include "libANGLE/renderer/null/ContextNULL.h"
11 
12 #include "common/debug.h"
13 
14 #include "libANGLE/Context.h"
15 #include "libANGLE/renderer/OverlayImpl.h"
16 #include "libANGLE/renderer/null/BufferNULL.h"
17 #include "libANGLE/renderer/null/CompilerNULL.h"
18 #include "libANGLE/renderer/null/DisplayNULL.h"
19 #include "libANGLE/renderer/null/FenceNVNULL.h"
20 #include "libANGLE/renderer/null/FramebufferNULL.h"
21 #include "libANGLE/renderer/null/ImageNULL.h"
22 #include "libANGLE/renderer/null/ProgramNULL.h"
23 #include "libANGLE/renderer/null/ProgramPipelineNULL.h"
24 #include "libANGLE/renderer/null/QueryNULL.h"
25 #include "libANGLE/renderer/null/RenderbufferNULL.h"
26 #include "libANGLE/renderer/null/SamplerNULL.h"
27 #include "libANGLE/renderer/null/ShaderNULL.h"
28 #include "libANGLE/renderer/null/SyncNULL.h"
29 #include "libANGLE/renderer/null/TextureNULL.h"
30 #include "libANGLE/renderer/null/TransformFeedbackNULL.h"
31 #include "libANGLE/renderer/null/VertexArrayNULL.h"
32 
33 namespace rx
34 {
35 
AllocationTrackerNULL(size_t maxTotalAllocationSize)36 AllocationTrackerNULL::AllocationTrackerNULL(size_t maxTotalAllocationSize)
37     : mAllocatedBytes(0), mMaxBytes(maxTotalAllocationSize)
38 {}
39 
~AllocationTrackerNULL()40 AllocationTrackerNULL::~AllocationTrackerNULL()
41 {
42     // ASSERT that all objects with the NULL renderer clean up after themselves
43     ASSERT(mAllocatedBytes == 0);
44 }
45 
updateMemoryAllocation(size_t oldSize,size_t newSize)46 bool AllocationTrackerNULL::updateMemoryAllocation(size_t oldSize, size_t newSize)
47 {
48     ASSERT(mAllocatedBytes >= oldSize);
49 
50     size_t sizeAfterRelease    = mAllocatedBytes - oldSize;
51     size_t sizeAfterReallocate = sizeAfterRelease + newSize;
52     if (sizeAfterReallocate < sizeAfterRelease || sizeAfterReallocate > mMaxBytes)
53     {
54         // Overflow or allocation would be too large
55         return false;
56     }
57 
58     mAllocatedBytes = sizeAfterReallocate;
59     return true;
60 }
61 
ContextNULL(const gl::State & state,gl::ErrorSet * errorSet,AllocationTrackerNULL * allocationTracker)62 ContextNULL::ContextNULL(const gl::State &state,
63                          gl::ErrorSet *errorSet,
64                          AllocationTrackerNULL *allocationTracker)
65     : ContextImpl(state, errorSet), mAllocationTracker(allocationTracker)
66 {
67     ASSERT(mAllocationTracker != nullptr);
68 
69     mExtensions                        = gl::Extensions();
70     mExtensions.fenceNV                = true;
71     mExtensions.framebufferBlit        = true;
72     mExtensions.instancedArraysANGLE   = true;
73     mExtensions.instancedArraysEXT     = true;
74     mExtensions.pixelBufferObjectNV    = true;
75     mExtensions.mapBufferOES           = true;
76     mExtensions.mapBufferRange         = true;
77     mExtensions.copyTexture            = true;
78     mExtensions.copyCompressedTexture  = true;
79     mExtensions.textureRectangle       = true;
80     mExtensions.textureUsage           = true;
81     mExtensions.vertexArrayObjectOES   = true;
82     mExtensions.debugMarker            = true;
83     mExtensions.translatedShaderSource = true;
84 
85     mExtensions.textureStorage               = true;
86     mExtensions.rgb8rgba8OES                 = true;
87     mExtensions.textureCompressionDXT1       = true;
88     mExtensions.textureCompressionDXT3       = true;
89     mExtensions.textureCompressionDXT5       = true;
90     mExtensions.textureCompressionS3TCsRGB   = true;
91     mExtensions.textureCompressionASTCHDRKHR = true;
92     mExtensions.textureCompressionASTCLDRKHR = true;
93     mExtensions.textureCompressionASTCOES    = true;
94     mExtensions.compressedETC1RGB8TextureOES = true;
95     mExtensions.compressedETC1RGB8SubTexture = true;
96     mExtensions.lossyETCDecode               = true;
97     mExtensions.geometryShader               = true;
98 
99     mExtensions.eglImageOES                 = true;
100     mExtensions.eglImageExternalOES         = true;
101     mExtensions.eglImageExternalEssl3OES    = true;
102     mExtensions.eglImageArray               = true;
103     mExtensions.eglStreamConsumerExternalNV = true;
104 
105     const gl::Version maxClientVersion(3, 1);
106     mCaps = GenerateMinimumCaps(maxClientVersion, mExtensions);
107 
108     InitMinimumTextureCapsMap(maxClientVersion, mExtensions, &mTextureCaps);
109 }
110 
~ContextNULL()111 ContextNULL::~ContextNULL() {}
112 
initialize()113 angle::Result ContextNULL::initialize()
114 {
115     return angle::Result::Continue;
116 }
117 
flush(const gl::Context * context)118 angle::Result ContextNULL::flush(const gl::Context *context)
119 {
120     return angle::Result::Continue;
121 }
122 
finish(const gl::Context * context)123 angle::Result ContextNULL::finish(const gl::Context *context)
124 {
125     return angle::Result::Continue;
126 }
127 
drawArrays(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count)128 angle::Result ContextNULL::drawArrays(const gl::Context *context,
129                                       gl::PrimitiveMode mode,
130                                       GLint first,
131                                       GLsizei count)
132 {
133     return angle::Result::Continue;
134 }
135 
drawArraysInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount)136 angle::Result ContextNULL::drawArraysInstanced(const gl::Context *context,
137                                                gl::PrimitiveMode mode,
138                                                GLint first,
139                                                GLsizei count,
140                                                GLsizei instanceCount)
141 {
142     return angle::Result::Continue;
143 }
144 
drawArraysInstancedBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount,GLuint baseInstance)145 angle::Result ContextNULL::drawArraysInstancedBaseInstance(const gl::Context *context,
146                                                            gl::PrimitiveMode mode,
147                                                            GLint first,
148                                                            GLsizei count,
149                                                            GLsizei instanceCount,
150                                                            GLuint baseInstance)
151 {
152     return angle::Result::Continue;
153 }
154 
drawElements(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices)155 angle::Result ContextNULL::drawElements(const gl::Context *context,
156                                         gl::PrimitiveMode mode,
157                                         GLsizei count,
158                                         gl::DrawElementsType type,
159                                         const void *indices)
160 {
161     return angle::Result::Continue;
162 }
163 
drawElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)164 angle::Result ContextNULL::drawElementsBaseVertex(const gl::Context *context,
165                                                   gl::PrimitiveMode mode,
166                                                   GLsizei count,
167                                                   gl::DrawElementsType type,
168                                                   const void *indices,
169                                                   GLint baseVertex)
170 {
171     return angle::Result::Continue;
172 }
173 
drawElementsInstanced(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances)174 angle::Result ContextNULL::drawElementsInstanced(const gl::Context *context,
175                                                  gl::PrimitiveMode mode,
176                                                  GLsizei count,
177                                                  gl::DrawElementsType type,
178                                                  const void *indices,
179                                                  GLsizei instances)
180 {
181     return angle::Result::Continue;
182 }
183 
drawElementsInstancedBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex)184 angle::Result ContextNULL::drawElementsInstancedBaseVertex(const gl::Context *context,
185                                                            gl::PrimitiveMode mode,
186                                                            GLsizei count,
187                                                            gl::DrawElementsType type,
188                                                            const void *indices,
189                                                            GLsizei instances,
190                                                            GLint baseVertex)
191 {
192     return angle::Result::Continue;
193 }
194 
drawElementsInstancedBaseVertexBaseInstance(const gl::Context * context,gl::PrimitiveMode mode,GLsizei count,gl::DrawElementsType type,const void * indices,GLsizei instances,GLint baseVertex,GLuint baseInstance)195 angle::Result ContextNULL::drawElementsInstancedBaseVertexBaseInstance(const gl::Context *context,
196                                                                        gl::PrimitiveMode mode,
197                                                                        GLsizei count,
198                                                                        gl::DrawElementsType type,
199                                                                        const void *indices,
200                                                                        GLsizei instances,
201                                                                        GLint baseVertex,
202                                                                        GLuint baseInstance)
203 {
204     return angle::Result::Continue;
205 }
206 
drawRangeElements(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices)207 angle::Result ContextNULL::drawRangeElements(const gl::Context *context,
208                                              gl::PrimitiveMode mode,
209                                              GLuint start,
210                                              GLuint end,
211                                              GLsizei count,
212                                              gl::DrawElementsType type,
213                                              const void *indices)
214 {
215     return angle::Result::Continue;
216 }
217 
drawRangeElementsBaseVertex(const gl::Context * context,gl::PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,gl::DrawElementsType type,const void * indices,GLint baseVertex)218 angle::Result ContextNULL::drawRangeElementsBaseVertex(const gl::Context *context,
219                                                        gl::PrimitiveMode mode,
220                                                        GLuint start,
221                                                        GLuint end,
222                                                        GLsizei count,
223                                                        gl::DrawElementsType type,
224                                                        const void *indices,
225                                                        GLint baseVertex)
226 {
227     return angle::Result::Continue;
228 }
229 
drawArraysIndirect(const gl::Context * context,gl::PrimitiveMode mode,const void * indirect)230 angle::Result ContextNULL::drawArraysIndirect(const gl::Context *context,
231                                               gl::PrimitiveMode mode,
232                                               const void *indirect)
233 {
234     return angle::Result::Continue;
235 }
236 
drawElementsIndirect(const gl::Context * context,gl::PrimitiveMode mode,gl::DrawElementsType type,const void * indirect)237 angle::Result ContextNULL::drawElementsIndirect(const gl::Context *context,
238                                                 gl::PrimitiveMode mode,
239                                                 gl::DrawElementsType type,
240                                                 const void *indirect)
241 {
242     return angle::Result::Continue;
243 }
244 
getResetStatus()245 gl::GraphicsResetStatus ContextNULL::getResetStatus()
246 {
247     return gl::GraphicsResetStatus::NoError;
248 }
249 
getVendorString() const250 std::string ContextNULL::getVendorString() const
251 {
252     return "NULL";
253 }
254 
getRendererDescription() const255 std::string ContextNULL::getRendererDescription() const
256 {
257     return "NULL";
258 }
259 
insertEventMarker(GLsizei length,const char * marker)260 angle::Result ContextNULL::insertEventMarker(GLsizei length, const char *marker)
261 {
262     return angle::Result::Continue;
263 }
264 
pushGroupMarker(GLsizei length,const char * marker)265 angle::Result ContextNULL::pushGroupMarker(GLsizei length, const char *marker)
266 {
267     return angle::Result::Continue;
268 }
269 
popGroupMarker()270 angle::Result ContextNULL::popGroupMarker()
271 {
272     return angle::Result::Continue;
273 }
274 
pushDebugGroup(const gl::Context * context,GLenum source,GLuint id,const std::string & message)275 angle::Result ContextNULL::pushDebugGroup(const gl::Context *context,
276                                           GLenum source,
277                                           GLuint id,
278                                           const std::string &message)
279 {
280     return angle::Result::Continue;
281 }
282 
popDebugGroup(const gl::Context * context)283 angle::Result ContextNULL::popDebugGroup(const gl::Context *context)
284 {
285     return angle::Result::Continue;
286 }
287 
syncState(const gl::Context * context,const gl::State::DirtyBits & dirtyBits,const gl::State::DirtyBits & bitMask)288 angle::Result ContextNULL::syncState(const gl::Context *context,
289                                      const gl::State::DirtyBits &dirtyBits,
290                                      const gl::State::DirtyBits &bitMask)
291 {
292     return angle::Result::Continue;
293 }
294 
getGPUDisjoint()295 GLint ContextNULL::getGPUDisjoint()
296 {
297     return 0;
298 }
299 
getTimestamp()300 GLint64 ContextNULL::getTimestamp()
301 {
302     return 0;
303 }
304 
onMakeCurrent(const gl::Context * context)305 angle::Result ContextNULL::onMakeCurrent(const gl::Context *context)
306 {
307     return angle::Result::Continue;
308 }
309 
getNativeCaps() const310 gl::Caps ContextNULL::getNativeCaps() const
311 {
312     return mCaps;
313 }
314 
getNativeTextureCaps() const315 const gl::TextureCapsMap &ContextNULL::getNativeTextureCaps() const
316 {
317     return mTextureCaps;
318 }
319 
getNativeExtensions() const320 const gl::Extensions &ContextNULL::getNativeExtensions() const
321 {
322     return mExtensions;
323 }
324 
getNativeLimitations() const325 const gl::Limitations &ContextNULL::getNativeLimitations() const
326 {
327     return mLimitations;
328 }
329 
createCompiler()330 CompilerImpl *ContextNULL::createCompiler()
331 {
332     return new CompilerNULL();
333 }
334 
createShader(const gl::ShaderState & data)335 ShaderImpl *ContextNULL::createShader(const gl::ShaderState &data)
336 {
337     return new ShaderNULL(data);
338 }
339 
createProgram(const gl::ProgramState & data)340 ProgramImpl *ContextNULL::createProgram(const gl::ProgramState &data)
341 {
342     return new ProgramNULL(data);
343 }
344 
createFramebuffer(const gl::FramebufferState & data)345 FramebufferImpl *ContextNULL::createFramebuffer(const gl::FramebufferState &data)
346 {
347     return new FramebufferNULL(data);
348 }
349 
createTexture(const gl::TextureState & state)350 TextureImpl *ContextNULL::createTexture(const gl::TextureState &state)
351 {
352     return new TextureNULL(state);
353 }
354 
createRenderbuffer(const gl::RenderbufferState & state)355 RenderbufferImpl *ContextNULL::createRenderbuffer(const gl::RenderbufferState &state)
356 {
357     return new RenderbufferNULL(state);
358 }
359 
createBuffer(const gl::BufferState & state)360 BufferImpl *ContextNULL::createBuffer(const gl::BufferState &state)
361 {
362     return new BufferNULL(state, mAllocationTracker);
363 }
364 
createVertexArray(const gl::VertexArrayState & data)365 VertexArrayImpl *ContextNULL::createVertexArray(const gl::VertexArrayState &data)
366 {
367     return new VertexArrayNULL(data);
368 }
369 
createQuery(gl::QueryType type)370 QueryImpl *ContextNULL::createQuery(gl::QueryType type)
371 {
372     return new QueryNULL(type);
373 }
374 
createFenceNV()375 FenceNVImpl *ContextNULL::createFenceNV()
376 {
377     return new FenceNVNULL();
378 }
379 
createSync()380 SyncImpl *ContextNULL::createSync()
381 {
382     return new SyncNULL();
383 }
384 
createTransformFeedback(const gl::TransformFeedbackState & state)385 TransformFeedbackImpl *ContextNULL::createTransformFeedback(const gl::TransformFeedbackState &state)
386 {
387     return new TransformFeedbackNULL(state);
388 }
389 
createSampler(const gl::SamplerState & state)390 SamplerImpl *ContextNULL::createSampler(const gl::SamplerState &state)
391 {
392     return new SamplerNULL(state);
393 }
394 
createProgramPipeline(const gl::ProgramPipelineState & state)395 ProgramPipelineImpl *ContextNULL::createProgramPipeline(const gl::ProgramPipelineState &state)
396 {
397     return new ProgramPipelineNULL(state);
398 }
399 
createMemoryObject()400 MemoryObjectImpl *ContextNULL::createMemoryObject()
401 {
402     UNREACHABLE();
403     return nullptr;
404 }
405 
createSemaphore()406 SemaphoreImpl *ContextNULL::createSemaphore()
407 {
408     UNREACHABLE();
409     return nullptr;
410 }
411 
createOverlay(const gl::OverlayState & state)412 OverlayImpl *ContextNULL::createOverlay(const gl::OverlayState &state)
413 {
414     return new OverlayImpl(state);
415 }
416 
dispatchCompute(const gl::Context * context,GLuint numGroupsX,GLuint numGroupsY,GLuint numGroupsZ)417 angle::Result ContextNULL::dispatchCompute(const gl::Context *context,
418                                            GLuint numGroupsX,
419                                            GLuint numGroupsY,
420                                            GLuint numGroupsZ)
421 {
422     return angle::Result::Continue;
423 }
424 
dispatchComputeIndirect(const gl::Context * context,GLintptr indirect)425 angle::Result ContextNULL::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
426 {
427     return angle::Result::Continue;
428 }
429 
memoryBarrier(const gl::Context * context,GLbitfield barriers)430 angle::Result ContextNULL::memoryBarrier(const gl::Context *context, GLbitfield barriers)
431 {
432     return angle::Result::Continue;
433 }
434 
memoryBarrierByRegion(const gl::Context * context,GLbitfield barriers)435 angle::Result ContextNULL::memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers)
436 {
437     return angle::Result::Continue;
438 }
439 
handleError(GLenum errorCode,const char * message,const char * file,const char * function,unsigned int line)440 void ContextNULL::handleError(GLenum errorCode,
441                               const char *message,
442                               const char *file,
443                               const char *function,
444                               unsigned int line)
445 {
446     std::stringstream errorStream;
447     errorStream << "Internal NULL back-end error: " << message << ".";
448     mErrors->handleError(errorCode, errorStream.str().c_str(), file, function, line);
449 }
450 }  // namespace rx
451