Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/libANGLE/Context.inl.h
1693 views
1
//
2
// Copyright 2018 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
// 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
22
namespace gl
23
{
24
constexpr 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
38
ANGLE_INLINE void MarkTransformFeedbackBufferUsage(const Context *context,
39
GLsizei count,
40
GLsizei instanceCount)
41
{
42
if (context->getStateCache().isTransformFeedbackActiveUnpaused())
43
{
44
TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
45
transformFeedback->onVerticesDrawn(context, count, instanceCount);
46
}
47
}
48
49
ANGLE_INLINE void MarkShaderStorageUsage(const Context *context)
50
{
51
for (size_t index : context->getStateCache().getActiveShaderStorageBufferIndices())
52
{
53
Buffer *buffer = context->getState().getIndexedShaderStorageBuffer(index).get();
54
if (buffer)
55
{
56
buffer->onDataChanged();
57
}
58
}
59
60
for (size_t index : context->getStateCache().getActiveImageUnitIndices())
61
{
62
const ImageUnit &imageUnit = context->getState().getImageUnit(index);
63
const Texture *texture = imageUnit.texture.get();
64
if (texture)
65
{
66
texture->onStateChange(angle::SubjectMessage::ContentsChanged);
67
}
68
}
69
}
70
71
// Return true if the draw is a no-op, else return false.
72
// If there is no active program for the vertex or fragment shader stages, the results of vertex
73
// and fragment shader execution will respectively be undefined. However, this is not
74
// an error. ANGLE will treat this as a no-op.
75
// A no-op draw occurs if the count of vertices is less than the minimum required to
76
// have a valid primitive for this mode (0 for points, 0-1 for lines, 0-2 for tris).
77
ANGLE_INLINE bool Context::noopDraw(PrimitiveMode mode, GLsizei count) const
78
{
79
if (!mStateCache.getCanDraw())
80
{
81
return true;
82
}
83
84
return count < kMinimumPrimitiveCounts[mode];
85
}
86
87
ANGLE_INLINE angle::Result Context::syncDirtyBits()
88
{
89
const State::DirtyBits &dirtyBits = mState.getDirtyBits();
90
ANGLE_TRY(mImplementation->syncState(this, dirtyBits, mAllDirtyBits));
91
mState.clearDirtyBits();
92
return angle::Result::Continue;
93
}
94
95
ANGLE_INLINE angle::Result Context::syncDirtyBits(const State::DirtyBits &bitMask)
96
{
97
const State::DirtyBits &dirtyBits = (mState.getDirtyBits() & bitMask);
98
ANGLE_TRY(mImplementation->syncState(this, dirtyBits, bitMask));
99
mState.clearDirtyBits(dirtyBits);
100
return angle::Result::Continue;
101
}
102
103
ANGLE_INLINE angle::Result Context::syncDirtyObjects(const State::DirtyObjects &objectMask,
104
Command command)
105
{
106
return mState.syncDirtyObjects(this, objectMask, command);
107
}
108
109
ANGLE_INLINE angle::Result Context::prepareForDraw(PrimitiveMode mode)
110
{
111
if (mGLES1Renderer)
112
{
113
ANGLE_TRY(mGLES1Renderer->prepareForDraw(mode, this, &mState));
114
}
115
116
ANGLE_TRY(syncDirtyObjects(mDrawDirtyObjects, Command::Draw));
117
ASSERT(!isRobustResourceInitEnabled() ||
118
!mState.getDrawFramebuffer()->hasResourceThatNeedsInit());
119
return syncDirtyBits();
120
}
121
122
ANGLE_INLINE void Context::drawArrays(PrimitiveMode mode, GLint first, GLsizei count)
123
{
124
// No-op if count draws no primitives for given mode
125
if (noopDraw(mode, count))
126
{
127
ANGLE_CONTEXT_TRY(mImplementation->handleNoopDrawEvent());
128
return;
129
}
130
131
ANGLE_CONTEXT_TRY(prepareForDraw(mode));
132
ANGLE_CONTEXT_TRY(mImplementation->drawArrays(this, mode, first, count));
133
MarkTransformFeedbackBufferUsage(this, count, 1);
134
}
135
136
ANGLE_INLINE void Context::drawElements(PrimitiveMode mode,
137
GLsizei count,
138
DrawElementsType type,
139
const void *indices)
140
{
141
// No-op if count draws no primitives for given mode
142
if (noopDraw(mode, count))
143
{
144
ANGLE_CONTEXT_TRY(mImplementation->handleNoopDrawEvent());
145
return;
146
}
147
148
ANGLE_CONTEXT_TRY(prepareForDraw(mode));
149
ANGLE_CONTEXT_TRY(mImplementation->drawElements(this, mode, count, type, indices));
150
}
151
152
ANGLE_INLINE void StateCache::onBufferBindingChange(Context *context)
153
{
154
updateBasicDrawStatesError();
155
updateBasicDrawElementsError();
156
}
157
158
ANGLE_INLINE void Context::bindBuffer(BufferBinding target, BufferID buffer)
159
{
160
Buffer *bufferObject =
161
mState.mBufferManager->checkBufferAllocation(mImplementation.get(), buffer);
162
mState.setBufferBinding(this, target, bufferObject);
163
mStateCache.onBufferBindingChange(this);
164
}
165
166
} // namespace gl
167
168
#endif // LIBANGLE_CONTEXT_INL_H_
169
170