blob: 6f138deb6e7d0d159c0e655fa51460a5d89ab9ab [file] [log] [blame]
Markus Tavenrathcb9609f2018-12-26 00:52:44 +09001//
Jamie Madill60a50cf2018-12-29 16:04:05 -05002// Copyright 2018 The ANGLE Project Authors. All rights reserved.
Markus Tavenrathcb9609f2018-12-26 00:52:44 +09003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Context.inl.h: Defines inline functions of gl::Context class
8// Has to be included after libANGLE/Context.h when using one
9// of the defined functions
10
11#ifndef LIBANGLE_CONTEXT_INL_H_
12#define LIBANGLE_CONTEXT_INL_H_
13
14#include "libANGLE/GLES1Renderer.h"
15#include "libANGLE/renderer/ContextImpl.h"
16
17#define ANGLE_HANDLE_ERR(X) \
18 (void)(X); \
19 return;
20#define ANGLE_CONTEXT_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_HANDLE_ERR);
21
22namespace gl
23{
Jamie Madill60a50cf2018-12-29 16:04:05 -050024constexpr angle::PackedEnumMap<PrimitiveMode, GLsizei> kMinimumPrimitiveCounts = {{
25 {PrimitiveMode::Points, 1},
26 {PrimitiveMode::Lines, 2},
27 {PrimitiveMode::LineLoop, 2},
28 {PrimitiveMode::LineStrip, 2},
29 {PrimitiveMode::Triangles, 3},
30 {PrimitiveMode::TriangleStrip, 3},
31 {PrimitiveMode::TriangleFan, 3},
32 {PrimitiveMode::LinesAdjacency, 2},
33 {PrimitiveMode::LineStripAdjacency, 2},
34 {PrimitiveMode::TrianglesAdjacency, 3},
35 {PrimitiveMode::TriangleStripAdjacency, 3},
36}};
37
38ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const Context *context,
39 GLsizei count,
40 GLsizei instanceCount)
41{
42 if (context->getStateCache().isTransformFeedbackActiveUnpaused())
43 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -050044 TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Jamie Madill60a50cf2018-12-29 16:04:05 -050045 transformFeedback->onVerticesDrawn(context, count, instanceCount);
46 }
47}
48
49// Return true if the draw is a no-op, else return false.
50// A no-op draw occurs if the count of vertices is less than the minimum required to
51// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
52ANGLE_INLINE bool Context::noopDraw(PrimitiveMode mode, GLsizei count)
53{
54 return count < kMinimumPrimitiveCounts[mode];
55}
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090056
57ANGLE_INLINE angle::Result Context::syncDirtyBits()
58{
Jamie Madillc3dc5d42018-12-30 12:12:04 -050059 const State::DirtyBits &dirtyBits = mState.getDirtyBits();
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090060 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
Jamie Madillc3dc5d42018-12-30 12:12:04 -050061 mState.clearDirtyBits();
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090062 return angle::Result::Continue;
63}
64
65ANGLE_INLINE angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
66{
Jamie Madillc3dc5d42018-12-30 12:12:04 -050067 const State::DirtyBits &dirtyBits = (mState.getDirtyBits() & bitMask);
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090068 ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
Jamie Madillc3dc5d42018-12-30 12:12:04 -050069 mState.clearDirtyBits(dirtyBits);
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090070 return angle::Result::Continue;
71}
72
73ANGLE_INLINE angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask)
74{
Jamie Madillc3dc5d42018-12-30 12:12:04 -050075 return mState.syncDirtyObjects(this, objectMask);
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090076}
77
78ANGLE_INLINE angle::Result Context::prepareForDraw(PrimitiveMode mode)
79{
80 if (mGLES1Renderer)
81 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -050082 ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mState));
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090083 }
84
85 ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects));
86 ASSERT(!isRobustResourceInitEnabled() ||
Jamie Madillc3dc5d42018-12-30 12:12:04 -050087 !mState.getDrawFramebuffer()->hasResourceThatNeedsInit());
Markus Tavenrathcb9609f2018-12-26 00:52:44 +090088 return syncDirtyBits();
89}
90
Jamie Madill60a50cf2018-12-29 16:04:05 -050091ANGLE_INLINE void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
92{
93 // No-op if count draws no primitives for given mode
94 if (noopDraw(mode, count))
95 {
96 return;
97 }
98
99 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
100 ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
101 MarkTransformFeedbackBufferUsage(this, count, 1);
102}
103
Markus Tavenrathcb9609f2018-12-26 00:52:44 +0900104ANGLE_INLINE void Context::drawElements(PrimitiveMode mode,
105 GLsizei count,
106 DrawElementsType type,
107 const void *indices)
108{
109 // No-op if count draws no primitives for given mode
110 if (noopDraw(mode, count))
111 {
112 return;
113 }
114
115 ANGLE_CONTEXT_TRY(prepareForDraw(mode));
116 ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
117}
118
Jamie Madill60a50cf2018-12-29 16:04:05 -0500119ANGLE_INLINE void StateCache::onBufferBindingChange(Context *context)
120{
121 updateBasicDrawStatesError();
122 updateBasicDrawElementsError();
123}
124
125ANGLE_INLINE void Context::bindBuffer(BufferBinding target, GLuint buffer)
126{
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500127 Buffer *bufferObject =
128 mState.mBufferManager->checkBufferAllocation(mImplementation.get(), buffer);
129 mState.setBufferBinding(this, target, bufferObject);
Jamie Madill60a50cf2018-12-29 16:04:05 -0500130 mStateCache.onBufferBindingChange(this);
131}
132
Markus Tavenrathcb9609f2018-12-26 00:52:44 +0900133} // namespace gl
134
135#endif // LIBANGLE_CONTEXT_INL_H_