1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // renderer_utils:
7*8975f5c5SAndroid Build Coastguard Worker // Helper methods pertaining to most or all back-ends.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_RENDERER_UTILS_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_RENDERER_UTILS_H_
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker #include <cstdint>
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Worker #include <limits>
16*8975f5c5SAndroid Build Coastguard Worker #include <map>
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker #include "GLSLANG/ShaderLang.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ImageIndex.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h"
23*8975f5c5SAndroid Build Coastguard Worker
24*8975f5c5SAndroid Build Coastguard Worker namespace angle
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker struct FeatureSetBase;
27*8975f5c5SAndroid Build Coastguard Worker struct Format;
28*8975f5c5SAndroid Build Coastguard Worker struct ImageLoadContext;
29*8975f5c5SAndroid Build Coastguard Worker enum class FormatID;
30*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
31*8975f5c5SAndroid Build Coastguard Worker
32*8975f5c5SAndroid Build Coastguard Worker namespace gl
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker struct FormatType;
35*8975f5c5SAndroid Build Coastguard Worker struct InternalFormat;
36*8975f5c5SAndroid Build Coastguard Worker class ProgramExecutable;
37*8975f5c5SAndroid Build Coastguard Worker class State;
38*8975f5c5SAndroid Build Coastguard Worker } // namespace gl
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker namespace egl
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker class AttributeMap;
43*8975f5c5SAndroid Build Coastguard Worker struct DisplayState;
44*8975f5c5SAndroid Build Coastguard Worker } // namespace egl
45*8975f5c5SAndroid Build Coastguard Worker
46*8975f5c5SAndroid Build Coastguard Worker namespace sh
47*8975f5c5SAndroid Build Coastguard Worker {
48*8975f5c5SAndroid Build Coastguard Worker struct BlockMemberInfo;
49*8975f5c5SAndroid Build Coastguard Worker }
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Worker namespace rx
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker class ContextImpl;
54*8975f5c5SAndroid Build Coastguard Worker
55*8975f5c5SAndroid Build Coastguard Worker // The possible rotations of the surface/draw framebuffer, particularly for the Vulkan back-end on
56*8975f5c5SAndroid Build Coastguard Worker // Android.
57*8975f5c5SAndroid Build Coastguard Worker enum class SurfaceRotation
58*8975f5c5SAndroid Build Coastguard Worker {
59*8975f5c5SAndroid Build Coastguard Worker Identity,
60*8975f5c5SAndroid Build Coastguard Worker Rotated90Degrees,
61*8975f5c5SAndroid Build Coastguard Worker Rotated180Degrees,
62*8975f5c5SAndroid Build Coastguard Worker Rotated270Degrees,
63*8975f5c5SAndroid Build Coastguard Worker FlippedIdentity,
64*8975f5c5SAndroid Build Coastguard Worker FlippedRotated90Degrees,
65*8975f5c5SAndroid Build Coastguard Worker FlippedRotated180Degrees,
66*8975f5c5SAndroid Build Coastguard Worker FlippedRotated270Degrees,
67*8975f5c5SAndroid Build Coastguard Worker
68*8975f5c5SAndroid Build Coastguard Worker InvalidEnum,
69*8975f5c5SAndroid Build Coastguard Worker EnumCount = InvalidEnum,
70*8975f5c5SAndroid Build Coastguard Worker };
71*8975f5c5SAndroid Build Coastguard Worker
72*8975f5c5SAndroid Build Coastguard Worker bool IsRotatedAspectRatio(SurfaceRotation rotation);
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Worker using SpecConstUsageBits = angle::PackedEnumBitSet<sh::vk::SpecConstUsage, uint32_t>;
75*8975f5c5SAndroid Build Coastguard Worker
76*8975f5c5SAndroid Build Coastguard Worker void RotateRectangle(const SurfaceRotation rotation,
77*8975f5c5SAndroid Build Coastguard Worker const bool flipY,
78*8975f5c5SAndroid Build Coastguard Worker const int framebufferWidth,
79*8975f5c5SAndroid Build Coastguard Worker const int framebufferHeight,
80*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &incoming,
81*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle *outgoing);
82*8975f5c5SAndroid Build Coastguard Worker
83*8975f5c5SAndroid Build Coastguard Worker using MipGenerationFunction = void (*)(size_t sourceWidth,
84*8975f5c5SAndroid Build Coastguard Worker size_t sourceHeight,
85*8975f5c5SAndroid Build Coastguard Worker size_t sourceDepth,
86*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData,
87*8975f5c5SAndroid Build Coastguard Worker size_t sourceRowPitch,
88*8975f5c5SAndroid Build Coastguard Worker size_t sourceDepthPitch,
89*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData,
90*8975f5c5SAndroid Build Coastguard Worker size_t destRowPitch,
91*8975f5c5SAndroid Build Coastguard Worker size_t destDepthPitch);
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker typedef void (*PixelReadFunction)(const uint8_t *source, uint8_t *dest);
94*8975f5c5SAndroid Build Coastguard Worker typedef void (*PixelWriteFunction)(const uint8_t *source, uint8_t *dest);
95*8975f5c5SAndroid Build Coastguard Worker typedef void (*FastCopyFunction)(const uint8_t *source,
96*8975f5c5SAndroid Build Coastguard Worker int srcXAxisPitch,
97*8975f5c5SAndroid Build Coastguard Worker int srcYAxisPitch,
98*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest,
99*8975f5c5SAndroid Build Coastguard Worker int destXAxisPitch,
100*8975f5c5SAndroid Build Coastguard Worker int destYAxisPitch,
101*8975f5c5SAndroid Build Coastguard Worker int width,
102*8975f5c5SAndroid Build Coastguard Worker int height);
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker class FastCopyFunctionMap
105*8975f5c5SAndroid Build Coastguard Worker {
106*8975f5c5SAndroid Build Coastguard Worker public:
107*8975f5c5SAndroid Build Coastguard Worker struct Entry
108*8975f5c5SAndroid Build Coastguard Worker {
109*8975f5c5SAndroid Build Coastguard Worker angle::FormatID formatID;
110*8975f5c5SAndroid Build Coastguard Worker FastCopyFunction func;
111*8975f5c5SAndroid Build Coastguard Worker };
112*8975f5c5SAndroid Build Coastguard Worker
FastCopyFunctionMap()113*8975f5c5SAndroid Build Coastguard Worker constexpr FastCopyFunctionMap() : FastCopyFunctionMap(nullptr, 0) {}
114*8975f5c5SAndroid Build Coastguard Worker
FastCopyFunctionMap(const Entry * data,size_t size)115*8975f5c5SAndroid Build Coastguard Worker constexpr FastCopyFunctionMap(const Entry *data, size_t size) : mSize(size), mData(data) {}
116*8975f5c5SAndroid Build Coastguard Worker
117*8975f5c5SAndroid Build Coastguard Worker bool has(angle::FormatID formatID) const;
118*8975f5c5SAndroid Build Coastguard Worker FastCopyFunction get(angle::FormatID formatID) const;
119*8975f5c5SAndroid Build Coastguard Worker
120*8975f5c5SAndroid Build Coastguard Worker private:
121*8975f5c5SAndroid Build Coastguard Worker size_t mSize;
122*8975f5c5SAndroid Build Coastguard Worker const Entry *mData;
123*8975f5c5SAndroid Build Coastguard Worker };
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker struct PackPixelsParams
126*8975f5c5SAndroid Build Coastguard Worker {
127*8975f5c5SAndroid Build Coastguard Worker PackPixelsParams();
128*8975f5c5SAndroid Build Coastguard Worker PackPixelsParams(const gl::Rectangle &area,
129*8975f5c5SAndroid Build Coastguard Worker const angle::Format &destFormat,
130*8975f5c5SAndroid Build Coastguard Worker GLuint outputPitch,
131*8975f5c5SAndroid Build Coastguard Worker bool reverseRowOrderIn,
132*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *packBufferIn,
133*8975f5c5SAndroid Build Coastguard Worker ptrdiff_t offset);
134*8975f5c5SAndroid Build Coastguard Worker
135*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle area;
136*8975f5c5SAndroid Build Coastguard Worker const angle::Format *destFormat;
137*8975f5c5SAndroid Build Coastguard Worker GLuint outputPitch;
138*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *packBuffer;
139*8975f5c5SAndroid Build Coastguard Worker bool reverseRowOrder;
140*8975f5c5SAndroid Build Coastguard Worker ptrdiff_t offset;
141*8975f5c5SAndroid Build Coastguard Worker SurfaceRotation rotation;
142*8975f5c5SAndroid Build Coastguard Worker };
143*8975f5c5SAndroid Build Coastguard Worker
144*8975f5c5SAndroid Build Coastguard Worker void PackPixels(const PackPixelsParams ¶ms,
145*8975f5c5SAndroid Build Coastguard Worker const angle::Format &sourceFormat,
146*8975f5c5SAndroid Build Coastguard Worker int inputPitch,
147*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source,
148*8975f5c5SAndroid Build Coastguard Worker uint8_t *destination);
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker angle::Result GetPackPixelsParams(const gl::InternalFormat &sizedFormatInfo,
151*8975f5c5SAndroid Build Coastguard Worker GLuint outputPitch,
152*8975f5c5SAndroid Build Coastguard Worker const gl::PixelPackState &packState,
153*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *packBuffer,
154*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area,
155*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &clippedArea,
156*8975f5c5SAndroid Build Coastguard Worker rx::PackPixelsParams *paramsOut,
157*8975f5c5SAndroid Build Coastguard Worker GLuint *skipBytesOut);
158*8975f5c5SAndroid Build Coastguard Worker
159*8975f5c5SAndroid Build Coastguard Worker using InitializeTextureDataFunction = void (*)(size_t width,
160*8975f5c5SAndroid Build Coastguard Worker size_t height,
161*8975f5c5SAndroid Build Coastguard Worker size_t depth,
162*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
163*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
164*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch);
165*8975f5c5SAndroid Build Coastguard Worker
166*8975f5c5SAndroid Build Coastguard Worker using LoadImageFunction = void (*)(const angle::ImageLoadContext &context,
167*8975f5c5SAndroid Build Coastguard Worker size_t width,
168*8975f5c5SAndroid Build Coastguard Worker size_t height,
169*8975f5c5SAndroid Build Coastguard Worker size_t depth,
170*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input,
171*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch,
172*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch,
173*8975f5c5SAndroid Build Coastguard Worker uint8_t *output,
174*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch,
175*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch);
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker struct LoadImageFunctionInfo
178*8975f5c5SAndroid Build Coastguard Worker {
LoadImageFunctionInfoLoadImageFunctionInfo179*8975f5c5SAndroid Build Coastguard Worker LoadImageFunctionInfo() : loadFunction(nullptr), requiresConversion(false) {}
LoadImageFunctionInfoLoadImageFunctionInfo180*8975f5c5SAndroid Build Coastguard Worker LoadImageFunctionInfo(LoadImageFunction loadFunction, bool requiresConversion)
181*8975f5c5SAndroid Build Coastguard Worker : loadFunction(loadFunction), requiresConversion(requiresConversion)
182*8975f5c5SAndroid Build Coastguard Worker {}
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker LoadImageFunction loadFunction;
185*8975f5c5SAndroid Build Coastguard Worker bool requiresConversion;
186*8975f5c5SAndroid Build Coastguard Worker };
187*8975f5c5SAndroid Build Coastguard Worker
188*8975f5c5SAndroid Build Coastguard Worker using LoadFunctionMap = LoadImageFunctionInfo (*)(GLenum);
189*8975f5c5SAndroid Build Coastguard Worker
190*8975f5c5SAndroid Build Coastguard Worker bool ShouldUseDebugLayers(const egl::AttributeMap &attribs);
191*8975f5c5SAndroid Build Coastguard Worker
192*8975f5c5SAndroid Build Coastguard Worker void CopyImageCHROMIUM(const uint8_t *sourceData,
193*8975f5c5SAndroid Build Coastguard Worker size_t sourceRowPitch,
194*8975f5c5SAndroid Build Coastguard Worker size_t sourcePixelBytes,
195*8975f5c5SAndroid Build Coastguard Worker size_t sourceDepthPitch,
196*8975f5c5SAndroid Build Coastguard Worker PixelReadFunction pixelReadFunction,
197*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData,
198*8975f5c5SAndroid Build Coastguard Worker size_t destRowPitch,
199*8975f5c5SAndroid Build Coastguard Worker size_t destPixelBytes,
200*8975f5c5SAndroid Build Coastguard Worker size_t destDepthPitch,
201*8975f5c5SAndroid Build Coastguard Worker PixelWriteFunction pixelWriteFunction,
202*8975f5c5SAndroid Build Coastguard Worker GLenum destUnsizedFormat,
203*8975f5c5SAndroid Build Coastguard Worker GLenum destComponentType,
204*8975f5c5SAndroid Build Coastguard Worker size_t width,
205*8975f5c5SAndroid Build Coastguard Worker size_t height,
206*8975f5c5SAndroid Build Coastguard Worker size_t depth,
207*8975f5c5SAndroid Build Coastguard Worker bool unpackFlipY,
208*8975f5c5SAndroid Build Coastguard Worker bool unpackPremultiplyAlpha,
209*8975f5c5SAndroid Build Coastguard Worker bool unpackUnmultiplyAlpha);
210*8975f5c5SAndroid Build Coastguard Worker
211*8975f5c5SAndroid Build Coastguard Worker // Incomplete textures are 1x1 textures filled with black, used when samplers are incomplete.
212*8975f5c5SAndroid Build Coastguard Worker // This helper class encapsulates handling incomplete textures. Because the GL back-end
213*8975f5c5SAndroid Build Coastguard Worker // can take advantage of the driver's incomplete textures, and because clearing multisample
214*8975f5c5SAndroid Build Coastguard Worker // textures is so difficult, we can keep an instance of this class in the back-end instead
215*8975f5c5SAndroid Build Coastguard Worker // of moving the logic to the Context front-end.
216*8975f5c5SAndroid Build Coastguard Worker
217*8975f5c5SAndroid Build Coastguard Worker // This interface allows us to call-back to init a multisample texture.
218*8975f5c5SAndroid Build Coastguard Worker class MultisampleTextureInitializer
219*8975f5c5SAndroid Build Coastguard Worker {
220*8975f5c5SAndroid Build Coastguard Worker public:
~MultisampleTextureInitializer()221*8975f5c5SAndroid Build Coastguard Worker virtual ~MultisampleTextureInitializer() {}
222*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result initializeMultisampleTextureToBlack(const gl::Context *context,
223*8975f5c5SAndroid Build Coastguard Worker gl::Texture *glTexture) = 0;
224*8975f5c5SAndroid Build Coastguard Worker };
225*8975f5c5SAndroid Build Coastguard Worker
226*8975f5c5SAndroid Build Coastguard Worker class IncompleteTextureSet final : angle::NonCopyable
227*8975f5c5SAndroid Build Coastguard Worker {
228*8975f5c5SAndroid Build Coastguard Worker public:
229*8975f5c5SAndroid Build Coastguard Worker IncompleteTextureSet();
230*8975f5c5SAndroid Build Coastguard Worker ~IncompleteTextureSet();
231*8975f5c5SAndroid Build Coastguard Worker
232*8975f5c5SAndroid Build Coastguard Worker void onDestroy(const gl::Context *context);
233*8975f5c5SAndroid Build Coastguard Worker
234*8975f5c5SAndroid Build Coastguard Worker angle::Result getIncompleteTexture(const gl::Context *context,
235*8975f5c5SAndroid Build Coastguard Worker gl::TextureType type,
236*8975f5c5SAndroid Build Coastguard Worker gl::SamplerFormat format,
237*8975f5c5SAndroid Build Coastguard Worker MultisampleTextureInitializer *multisampleInitializer,
238*8975f5c5SAndroid Build Coastguard Worker gl::Texture **textureOut);
239*8975f5c5SAndroid Build Coastguard Worker
240*8975f5c5SAndroid Build Coastguard Worker private:
241*8975f5c5SAndroid Build Coastguard Worker using TextureMapWithSamplerFormat = angle::PackedEnumMap<gl::SamplerFormat, gl::TextureMap>;
242*8975f5c5SAndroid Build Coastguard Worker
243*8975f5c5SAndroid Build Coastguard Worker TextureMapWithSamplerFormat mIncompleteTextures;
244*8975f5c5SAndroid Build Coastguard Worker };
245*8975f5c5SAndroid Build Coastguard Worker
246*8975f5c5SAndroid Build Coastguard Worker // Helpers to set a matrix uniform value based on GLSL or HLSL semantics.
247*8975f5c5SAndroid Build Coastguard Worker // The return value indicate if the data was updated or not.
248*8975f5c5SAndroid Build Coastguard Worker template <int cols, int rows>
249*8975f5c5SAndroid Build Coastguard Worker struct SetFloatUniformMatrixGLSL
250*8975f5c5SAndroid Build Coastguard Worker {
251*8975f5c5SAndroid Build Coastguard Worker static void Run(unsigned int arrayElementOffset,
252*8975f5c5SAndroid Build Coastguard Worker unsigned int elementCount,
253*8975f5c5SAndroid Build Coastguard Worker GLsizei countIn,
254*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
255*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value,
256*8975f5c5SAndroid Build Coastguard Worker uint8_t *targetData);
257*8975f5c5SAndroid Build Coastguard Worker };
258*8975f5c5SAndroid Build Coastguard Worker
259*8975f5c5SAndroid Build Coastguard Worker template <int cols, int rows>
260*8975f5c5SAndroid Build Coastguard Worker struct SetFloatUniformMatrixHLSL
261*8975f5c5SAndroid Build Coastguard Worker {
262*8975f5c5SAndroid Build Coastguard Worker static void Run(unsigned int arrayElementOffset,
263*8975f5c5SAndroid Build Coastguard Worker unsigned int elementCount,
264*8975f5c5SAndroid Build Coastguard Worker GLsizei countIn,
265*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
266*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value,
267*8975f5c5SAndroid Build Coastguard Worker uint8_t *targetData);
268*8975f5c5SAndroid Build Coastguard Worker };
269*8975f5c5SAndroid Build Coastguard Worker
270*8975f5c5SAndroid Build Coastguard Worker // Helper method to de-tranpose a matrix uniform for an API query.
271*8975f5c5SAndroid Build Coastguard Worker void GetMatrixUniform(GLenum type, GLfloat *dataOut, const GLfloat *source, bool transpose);
272*8975f5c5SAndroid Build Coastguard Worker
273*8975f5c5SAndroid Build Coastguard Worker template <typename NonFloatT>
274*8975f5c5SAndroid Build Coastguard Worker void GetMatrixUniform(GLenum type, NonFloatT *dataOut, const NonFloatT *source, bool transpose);
275*8975f5c5SAndroid Build Coastguard Worker
276*8975f5c5SAndroid Build Coastguard Worker // Contains a CPU-side buffer and its data layout, used as a shadow buffer for default uniform
277*8975f5c5SAndroid Build Coastguard Worker // blocks in VK and WGPU backends.
278*8975f5c5SAndroid Build Coastguard Worker struct BufferAndLayout final : private angle::NonCopyable
279*8975f5c5SAndroid Build Coastguard Worker {
280*8975f5c5SAndroid Build Coastguard Worker BufferAndLayout();
281*8975f5c5SAndroid Build Coastguard Worker ~BufferAndLayout();
282*8975f5c5SAndroid Build Coastguard Worker
283*8975f5c5SAndroid Build Coastguard Worker // Shadow copies of the shader uniform data.
284*8975f5c5SAndroid Build Coastguard Worker angle::MemoryBuffer uniformData;
285*8975f5c5SAndroid Build Coastguard Worker
286*8975f5c5SAndroid Build Coastguard Worker // Tells us where to write on a call to a setUniform method. They are arranged in uniform
287*8975f5c5SAndroid Build Coastguard Worker // location order.
288*8975f5c5SAndroid Build Coastguard Worker std::vector<sh::BlockMemberInfo> uniformLayout;
289*8975f5c5SAndroid Build Coastguard Worker };
290*8975f5c5SAndroid Build Coastguard Worker
291*8975f5c5SAndroid Build Coastguard Worker template <typename T>
292*8975f5c5SAndroid Build Coastguard Worker void UpdateBufferWithLayout(GLsizei count,
293*8975f5c5SAndroid Build Coastguard Worker uint32_t arrayIndex,
294*8975f5c5SAndroid Build Coastguard Worker int componentCount,
295*8975f5c5SAndroid Build Coastguard Worker const T *v,
296*8975f5c5SAndroid Build Coastguard Worker const sh::BlockMemberInfo &layoutInfo,
297*8975f5c5SAndroid Build Coastguard Worker angle::MemoryBuffer *uniformData);
298*8975f5c5SAndroid Build Coastguard Worker
299*8975f5c5SAndroid Build Coastguard Worker template <typename T>
300*8975f5c5SAndroid Build Coastguard Worker void ReadFromBufferWithLayout(int componentCount,
301*8975f5c5SAndroid Build Coastguard Worker uint32_t arrayIndex,
302*8975f5c5SAndroid Build Coastguard Worker T *dst,
303*8975f5c5SAndroid Build Coastguard Worker const sh::BlockMemberInfo &layoutInfo,
304*8975f5c5SAndroid Build Coastguard Worker const angle::MemoryBuffer *uniformData);
305*8975f5c5SAndroid Build Coastguard Worker
306*8975f5c5SAndroid Build Coastguard Worker using DefaultUniformBlockMap = gl::ShaderMap<std::shared_ptr<BufferAndLayout>>;
307*8975f5c5SAndroid Build Coastguard Worker
308*8975f5c5SAndroid Build Coastguard Worker template <typename T>
309*8975f5c5SAndroid Build Coastguard Worker void SetUniform(const gl::ProgramExecutable *executable,
310*8975f5c5SAndroid Build Coastguard Worker GLint location,
311*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
312*8975f5c5SAndroid Build Coastguard Worker const T *v,
313*8975f5c5SAndroid Build Coastguard Worker GLenum entryPointType,
314*8975f5c5SAndroid Build Coastguard Worker DefaultUniformBlockMap *defaultUniformBlocks,
315*8975f5c5SAndroid Build Coastguard Worker gl::ShaderBitSet *defaultUniformBlocksDirty);
316*8975f5c5SAndroid Build Coastguard Worker
317*8975f5c5SAndroid Build Coastguard Worker template <int cols, int rows>
318*8975f5c5SAndroid Build Coastguard Worker void SetUniformMatrixfv(const gl::ProgramExecutable *executable,
319*8975f5c5SAndroid Build Coastguard Worker GLint location,
320*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
321*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
322*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value,
323*8975f5c5SAndroid Build Coastguard Worker DefaultUniformBlockMap *defaultUniformBlocks,
324*8975f5c5SAndroid Build Coastguard Worker gl::ShaderBitSet *defaultUniformBlocksDirty);
325*8975f5c5SAndroid Build Coastguard Worker
326*8975f5c5SAndroid Build Coastguard Worker template <typename T>
327*8975f5c5SAndroid Build Coastguard Worker void GetUniform(const gl::ProgramExecutable *executable,
328*8975f5c5SAndroid Build Coastguard Worker GLint location,
329*8975f5c5SAndroid Build Coastguard Worker T *v,
330*8975f5c5SAndroid Build Coastguard Worker GLenum entryPointType,
331*8975f5c5SAndroid Build Coastguard Worker const DefaultUniformBlockMap *defaultUniformBlocks);
332*8975f5c5SAndroid Build Coastguard Worker
333*8975f5c5SAndroid Build Coastguard Worker const angle::Format &GetFormatFromFormatType(GLenum format, GLenum type);
334*8975f5c5SAndroid Build Coastguard Worker
335*8975f5c5SAndroid Build Coastguard Worker angle::Result ComputeStartVertex(ContextImpl *contextImpl,
336*8975f5c5SAndroid Build Coastguard Worker const gl::IndexRange &indexRange,
337*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex,
338*8975f5c5SAndroid Build Coastguard Worker GLint *firstVertexOut);
339*8975f5c5SAndroid Build Coastguard Worker
340*8975f5c5SAndroid Build Coastguard Worker angle::Result GetVertexRangeInfo(const gl::Context *context,
341*8975f5c5SAndroid Build Coastguard Worker GLint firstVertex,
342*8975f5c5SAndroid Build Coastguard Worker GLsizei vertexOrIndexCount,
343*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexTypeOrInvalid,
344*8975f5c5SAndroid Build Coastguard Worker const void *indices,
345*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex,
346*8975f5c5SAndroid Build Coastguard Worker GLint *startVertexOut,
347*8975f5c5SAndroid Build Coastguard Worker size_t *vertexCountOut);
348*8975f5c5SAndroid Build Coastguard Worker
349*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle ClipRectToScissor(const gl::State &glState, const gl::Rectangle &rect, bool invertY);
350*8975f5c5SAndroid Build Coastguard Worker
351*8975f5c5SAndroid Build Coastguard Worker // Helper method to intialize a FeatureSet with overrides from the DisplayState
352*8975f5c5SAndroid Build Coastguard Worker void ApplyFeatureOverrides(angle::FeatureSetBase *features,
353*8975f5c5SAndroid Build Coastguard Worker const angle::FeatureOverrides &overrides);
354*8975f5c5SAndroid Build Coastguard Worker
355*8975f5c5SAndroid Build Coastguard Worker template <typename In>
LineLoopRestartIndexCountHelper(GLsizei indexCount,const uint8_t * srcPtr)356*8975f5c5SAndroid Build Coastguard Worker uint32_t LineLoopRestartIndexCountHelper(GLsizei indexCount, const uint8_t *srcPtr)
357*8975f5c5SAndroid Build Coastguard Worker {
358*8975f5c5SAndroid Build Coastguard Worker constexpr In restartIndex = gl::GetPrimitiveRestartIndexFromType<In>();
359*8975f5c5SAndroid Build Coastguard Worker const In *inIndices = reinterpret_cast<const In *>(srcPtr);
360*8975f5c5SAndroid Build Coastguard Worker uint32_t numIndices = 0;
361*8975f5c5SAndroid Build Coastguard Worker // See CopyLineLoopIndicesWithRestart() below for more info on how
362*8975f5c5SAndroid Build Coastguard Worker // numIndices is calculated.
363*8975f5c5SAndroid Build Coastguard Worker GLsizei loopStartIndex = 0;
364*8975f5c5SAndroid Build Coastguard Worker for (GLsizei curIndex = 0; curIndex < indexCount; curIndex++)
365*8975f5c5SAndroid Build Coastguard Worker {
366*8975f5c5SAndroid Build Coastguard Worker In vertex = inIndices[curIndex];
367*8975f5c5SAndroid Build Coastguard Worker if (vertex != restartIndex)
368*8975f5c5SAndroid Build Coastguard Worker {
369*8975f5c5SAndroid Build Coastguard Worker numIndices++;
370*8975f5c5SAndroid Build Coastguard Worker }
371*8975f5c5SAndroid Build Coastguard Worker else
372*8975f5c5SAndroid Build Coastguard Worker {
373*8975f5c5SAndroid Build Coastguard Worker if (curIndex > loopStartIndex)
374*8975f5c5SAndroid Build Coastguard Worker {
375*8975f5c5SAndroid Build Coastguard Worker numIndices += 2;
376*8975f5c5SAndroid Build Coastguard Worker }
377*8975f5c5SAndroid Build Coastguard Worker loopStartIndex = curIndex + 1;
378*8975f5c5SAndroid Build Coastguard Worker }
379*8975f5c5SAndroid Build Coastguard Worker }
380*8975f5c5SAndroid Build Coastguard Worker if (indexCount > loopStartIndex)
381*8975f5c5SAndroid Build Coastguard Worker {
382*8975f5c5SAndroid Build Coastguard Worker numIndices++;
383*8975f5c5SAndroid Build Coastguard Worker }
384*8975f5c5SAndroid Build Coastguard Worker return numIndices;
385*8975f5c5SAndroid Build Coastguard Worker }
386*8975f5c5SAndroid Build Coastguard Worker
GetLineLoopWithRestartIndexCount(gl::DrawElementsType glIndexType,GLsizei indexCount,const uint8_t * srcPtr)387*8975f5c5SAndroid Build Coastguard Worker inline uint32_t GetLineLoopWithRestartIndexCount(gl::DrawElementsType glIndexType,
388*8975f5c5SAndroid Build Coastguard Worker GLsizei indexCount,
389*8975f5c5SAndroid Build Coastguard Worker const uint8_t *srcPtr)
390*8975f5c5SAndroid Build Coastguard Worker {
391*8975f5c5SAndroid Build Coastguard Worker switch (glIndexType)
392*8975f5c5SAndroid Build Coastguard Worker {
393*8975f5c5SAndroid Build Coastguard Worker case gl::DrawElementsType::UnsignedByte:
394*8975f5c5SAndroid Build Coastguard Worker return LineLoopRestartIndexCountHelper<uint8_t>(indexCount, srcPtr);
395*8975f5c5SAndroid Build Coastguard Worker case gl::DrawElementsType::UnsignedShort:
396*8975f5c5SAndroid Build Coastguard Worker return LineLoopRestartIndexCountHelper<uint16_t>(indexCount, srcPtr);
397*8975f5c5SAndroid Build Coastguard Worker case gl::DrawElementsType::UnsignedInt:
398*8975f5c5SAndroid Build Coastguard Worker return LineLoopRestartIndexCountHelper<uint32_t>(indexCount, srcPtr);
399*8975f5c5SAndroid Build Coastguard Worker default:
400*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
401*8975f5c5SAndroid Build Coastguard Worker return 0;
402*8975f5c5SAndroid Build Coastguard Worker }
403*8975f5c5SAndroid Build Coastguard Worker }
404*8975f5c5SAndroid Build Coastguard Worker
405*8975f5c5SAndroid Build Coastguard Worker // Writes the line-strip vertices for a line loop to outPtr,
406*8975f5c5SAndroid Build Coastguard Worker // where outLimit is calculated as in GetPrimitiveRestartIndexCount.
407*8975f5c5SAndroid Build Coastguard Worker template <typename In, typename Out>
CopyLineLoopIndicesWithRestart(GLsizei indexCount,const uint8_t * srcPtr,uint8_t * outPtr)408*8975f5c5SAndroid Build Coastguard Worker void CopyLineLoopIndicesWithRestart(GLsizei indexCount, const uint8_t *srcPtr, uint8_t *outPtr)
409*8975f5c5SAndroid Build Coastguard Worker {
410*8975f5c5SAndroid Build Coastguard Worker constexpr In restartIndex = gl::GetPrimitiveRestartIndexFromType<In>();
411*8975f5c5SAndroid Build Coastguard Worker constexpr Out outRestartIndex = gl::GetPrimitiveRestartIndexFromType<Out>();
412*8975f5c5SAndroid Build Coastguard Worker const In *inIndices = reinterpret_cast<const In *>(srcPtr);
413*8975f5c5SAndroid Build Coastguard Worker Out *outIndices = reinterpret_cast<Out *>(outPtr);
414*8975f5c5SAndroid Build Coastguard Worker GLsizei loopStartIndex = 0;
415*8975f5c5SAndroid Build Coastguard Worker for (GLsizei curIndex = 0; curIndex < indexCount; curIndex++)
416*8975f5c5SAndroid Build Coastguard Worker {
417*8975f5c5SAndroid Build Coastguard Worker In vertex = inIndices[curIndex];
418*8975f5c5SAndroid Build Coastguard Worker if (vertex != restartIndex)
419*8975f5c5SAndroid Build Coastguard Worker {
420*8975f5c5SAndroid Build Coastguard Worker *(outIndices++) = static_cast<Out>(vertex);
421*8975f5c5SAndroid Build Coastguard Worker }
422*8975f5c5SAndroid Build Coastguard Worker else
423*8975f5c5SAndroid Build Coastguard Worker {
424*8975f5c5SAndroid Build Coastguard Worker if (curIndex > loopStartIndex)
425*8975f5c5SAndroid Build Coastguard Worker {
426*8975f5c5SAndroid Build Coastguard Worker // Emit an extra vertex only if the loop is not empty.
427*8975f5c5SAndroid Build Coastguard Worker *(outIndices++) = inIndices[loopStartIndex];
428*8975f5c5SAndroid Build Coastguard Worker // Then restart the strip.
429*8975f5c5SAndroid Build Coastguard Worker *(outIndices++) = outRestartIndex;
430*8975f5c5SAndroid Build Coastguard Worker }
431*8975f5c5SAndroid Build Coastguard Worker loopStartIndex = curIndex + 1;
432*8975f5c5SAndroid Build Coastguard Worker }
433*8975f5c5SAndroid Build Coastguard Worker }
434*8975f5c5SAndroid Build Coastguard Worker if (indexCount > loopStartIndex)
435*8975f5c5SAndroid Build Coastguard Worker {
436*8975f5c5SAndroid Build Coastguard Worker // Close the last loop if not empty.
437*8975f5c5SAndroid Build Coastguard Worker *(outIndices++) = inIndices[loopStartIndex];
438*8975f5c5SAndroid Build Coastguard Worker }
439*8975f5c5SAndroid Build Coastguard Worker }
440*8975f5c5SAndroid Build Coastguard Worker
441*8975f5c5SAndroid Build Coastguard Worker void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy);
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawArraysGeneral(ContextImpl *contextImpl,
444*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
445*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
446*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts,
447*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
448*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount);
449*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawArraysIndirectGeneral(ContextImpl *contextImpl,
450*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
451*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
452*8975f5c5SAndroid Build Coastguard Worker const void *indirect,
453*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount,
454*8975f5c5SAndroid Build Coastguard Worker GLsizei stride);
455*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawArraysInstancedGeneral(ContextImpl *contextImpl,
456*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
457*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
458*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts,
459*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
460*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
461*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount);
462*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawElementsGeneral(ContextImpl *contextImpl,
463*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
464*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
465*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
466*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type,
467*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices,
468*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount);
469*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawElementsIndirectGeneral(ContextImpl *contextImpl,
470*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
471*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
472*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type,
473*8975f5c5SAndroid Build Coastguard Worker const void *indirect,
474*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount,
475*8975f5c5SAndroid Build Coastguard Worker GLsizei stride);
476*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawElementsInstancedGeneral(ContextImpl *contextImpl,
477*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
478*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
479*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
480*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type,
481*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices,
482*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
483*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount);
484*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawArraysInstancedBaseInstanceGeneral(ContextImpl *contextImpl,
485*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
486*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
487*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts,
488*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
489*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
490*8975f5c5SAndroid Build Coastguard Worker const GLuint *baseInstances,
491*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount);
492*8975f5c5SAndroid Build Coastguard Worker angle::Result MultiDrawElementsInstancedBaseVertexBaseInstanceGeneral(ContextImpl *contextImpl,
493*8975f5c5SAndroid Build Coastguard Worker const gl::Context *context,
494*8975f5c5SAndroid Build Coastguard Worker gl::PrimitiveMode mode,
495*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
496*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType type,
497*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices,
498*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
499*8975f5c5SAndroid Build Coastguard Worker const GLint *baseVertices,
500*8975f5c5SAndroid Build Coastguard Worker const GLuint *baseInstances,
501*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount);
502*8975f5c5SAndroid Build Coastguard Worker
503*8975f5c5SAndroid Build Coastguard Worker // RAII object making sure reset uniforms is called no matter whether there's an error in draw calls
504*8975f5c5SAndroid Build Coastguard Worker class ResetBaseVertexBaseInstance : angle::NonCopyable
505*8975f5c5SAndroid Build Coastguard Worker {
506*8975f5c5SAndroid Build Coastguard Worker public:
507*8975f5c5SAndroid Build Coastguard Worker ResetBaseVertexBaseInstance(gl::ProgramExecutable *executable,
508*8975f5c5SAndroid Build Coastguard Worker bool resetBaseVertex,
509*8975f5c5SAndroid Build Coastguard Worker bool resetBaseInstance);
510*8975f5c5SAndroid Build Coastguard Worker
511*8975f5c5SAndroid Build Coastguard Worker ~ResetBaseVertexBaseInstance();
512*8975f5c5SAndroid Build Coastguard Worker
513*8975f5c5SAndroid Build Coastguard Worker private:
514*8975f5c5SAndroid Build Coastguard Worker gl::ProgramExecutable *mExecutable;
515*8975f5c5SAndroid Build Coastguard Worker bool mResetBaseVertex;
516*8975f5c5SAndroid Build Coastguard Worker bool mResetBaseInstance;
517*8975f5c5SAndroid Build Coastguard Worker };
518*8975f5c5SAndroid Build Coastguard Worker
519*8975f5c5SAndroid Build Coastguard Worker angle::FormatID ConvertToSRGB(angle::FormatID formatID);
520*8975f5c5SAndroid Build Coastguard Worker angle::FormatID ConvertToLinear(angle::FormatID formatID);
521*8975f5c5SAndroid Build Coastguard Worker bool IsOverridableLinearFormat(angle::FormatID formatID);
522*8975f5c5SAndroid Build Coastguard Worker
523*8975f5c5SAndroid Build Coastguard Worker template <bool swizzledLuma = true>
524*8975f5c5SAndroid Build Coastguard Worker const gl::ColorGeneric AdjustBorderColor(const angle::ColorGeneric &borderColorGeneric,
525*8975f5c5SAndroid Build Coastguard Worker const angle::Format &format,
526*8975f5c5SAndroid Build Coastguard Worker bool stencilMode);
527*8975f5c5SAndroid Build Coastguard Worker
528*8975f5c5SAndroid Build Coastguard Worker template <typename LargerInt>
LimitToInt(const LargerInt physicalDeviceValue)529*8975f5c5SAndroid Build Coastguard Worker GLint LimitToInt(const LargerInt physicalDeviceValue)
530*8975f5c5SAndroid Build Coastguard Worker {
531*8975f5c5SAndroid Build Coastguard Worker static_assert(sizeof(LargerInt) >= sizeof(int32_t), "Incorrect usage of LimitToInt");
532*8975f5c5SAndroid Build Coastguard Worker return static_cast<GLint>(
533*8975f5c5SAndroid Build Coastguard Worker std::min(physicalDeviceValue, static_cast<LargerInt>(std::numeric_limits<int32_t>::max())));
534*8975f5c5SAndroid Build Coastguard Worker }
535*8975f5c5SAndroid Build Coastguard Worker
536*8975f5c5SAndroid Build Coastguard Worker bool TextureHasAnyRedefinedLevels(const gl::CubeFaceArray<gl::TexLevelMask> &redefinedLevels);
537*8975f5c5SAndroid Build Coastguard Worker bool IsTextureLevelRedefined(const gl::CubeFaceArray<gl::TexLevelMask> &redefinedLevels,
538*8975f5c5SAndroid Build Coastguard Worker gl::TextureType textureType,
539*8975f5c5SAndroid Build Coastguard Worker gl::LevelIndex level);
540*8975f5c5SAndroid Build Coastguard Worker
541*8975f5c5SAndroid Build Coastguard Worker enum class TextureLevelDefinition
542*8975f5c5SAndroid Build Coastguard Worker {
543*8975f5c5SAndroid Build Coastguard Worker Compatible = 0,
544*8975f5c5SAndroid Build Coastguard Worker Incompatible = 1,
545*8975f5c5SAndroid Build Coastguard Worker
546*8975f5c5SAndroid Build Coastguard Worker InvalidEnum = 2
547*8975f5c5SAndroid Build Coastguard Worker };
548*8975f5c5SAndroid Build Coastguard Worker
549*8975f5c5SAndroid Build Coastguard Worker enum class TextureLevelAllocation
550*8975f5c5SAndroid Build Coastguard Worker {
551*8975f5c5SAndroid Build Coastguard Worker WithinAllocatedImage = 0,
552*8975f5c5SAndroid Build Coastguard Worker OutsideAllocatedImage = 1,
553*8975f5c5SAndroid Build Coastguard Worker
554*8975f5c5SAndroid Build Coastguard Worker InvalidEnum = 2
555*8975f5c5SAndroid Build Coastguard Worker };
556*8975f5c5SAndroid Build Coastguard Worker // Returns true if the image should be released after the level is redefined, false otherwise.
557*8975f5c5SAndroid Build Coastguard Worker bool TextureRedefineLevel(const TextureLevelAllocation levelAllocation,
558*8975f5c5SAndroid Build Coastguard Worker const TextureLevelDefinition levelDefinition,
559*8975f5c5SAndroid Build Coastguard Worker bool immutableFormat,
560*8975f5c5SAndroid Build Coastguard Worker uint32_t levelCount,
561*8975f5c5SAndroid Build Coastguard Worker const uint32_t layerIndex,
562*8975f5c5SAndroid Build Coastguard Worker const gl::ImageIndex &index,
563*8975f5c5SAndroid Build Coastguard Worker gl::LevelIndex imageFirstAllocatedLevel,
564*8975f5c5SAndroid Build Coastguard Worker gl::CubeFaceArray<gl::TexLevelMask> *redefinedLevels);
565*8975f5c5SAndroid Build Coastguard Worker
566*8975f5c5SAndroid Build Coastguard Worker void TextureRedefineGenerateMipmapLevels(gl::LevelIndex baseLevel,
567*8975f5c5SAndroid Build Coastguard Worker gl::LevelIndex maxLevel,
568*8975f5c5SAndroid Build Coastguard Worker gl::LevelIndex firstGeneratedLevel,
569*8975f5c5SAndroid Build Coastguard Worker gl::CubeFaceArray<gl::TexLevelMask> *redefinedLevels);
570*8975f5c5SAndroid Build Coastguard Worker
571*8975f5c5SAndroid Build Coastguard Worker enum class ImageMipLevels
572*8975f5c5SAndroid Build Coastguard Worker {
573*8975f5c5SAndroid Build Coastguard Worker EnabledLevels = 0,
574*8975f5c5SAndroid Build Coastguard Worker FullMipChainForGenerateMipmap = 1,
575*8975f5c5SAndroid Build Coastguard Worker
576*8975f5c5SAndroid Build Coastguard Worker InvalidEnum = 2,
577*8975f5c5SAndroid Build Coastguard Worker };
578*8975f5c5SAndroid Build Coastguard Worker
579*8975f5c5SAndroid Build Coastguard Worker enum class PipelineType
580*8975f5c5SAndroid Build Coastguard Worker {
581*8975f5c5SAndroid Build Coastguard Worker Graphics = 0,
582*8975f5c5SAndroid Build Coastguard Worker Compute = 1,
583*8975f5c5SAndroid Build Coastguard Worker
584*8975f5c5SAndroid Build Coastguard Worker InvalidEnum = 2,
585*8975f5c5SAndroid Build Coastguard Worker EnumCount = 2,
586*8975f5c5SAndroid Build Coastguard Worker };
587*8975f5c5SAndroid Build Coastguard Worker
588*8975f5c5SAndroid Build Coastguard Worker // Return the log of samples. Assumes |sampleCount| is a power of 2. The result can be used to
589*8975f5c5SAndroid Build Coastguard Worker // index an array based on sample count.
PackSampleCount(int32_t sampleCount)590*8975f5c5SAndroid Build Coastguard Worker inline size_t PackSampleCount(int32_t sampleCount)
591*8975f5c5SAndroid Build Coastguard Worker {
592*8975f5c5SAndroid Build Coastguard Worker if (sampleCount == 0)
593*8975f5c5SAndroid Build Coastguard Worker {
594*8975f5c5SAndroid Build Coastguard Worker sampleCount = 1;
595*8975f5c5SAndroid Build Coastguard Worker }
596*8975f5c5SAndroid Build Coastguard Worker
597*8975f5c5SAndroid Build Coastguard Worker // We currently only support up to 16xMSAA.
598*8975f5c5SAndroid Build Coastguard Worker ASSERT(1 <= sampleCount && sampleCount <= 16);
599*8975f5c5SAndroid Build Coastguard Worker ASSERT(gl::isPow2(sampleCount));
600*8975f5c5SAndroid Build Coastguard Worker return gl::ScanForward(static_cast<uint32_t>(sampleCount));
601*8975f5c5SAndroid Build Coastguard Worker }
602*8975f5c5SAndroid Build Coastguard Worker
603*8975f5c5SAndroid Build Coastguard Worker } // namespace rx
604*8975f5c5SAndroid Build Coastguard Worker
605*8975f5c5SAndroid Build Coastguard Worker // MultiDraw macro patterns
606*8975f5c5SAndroid Build Coastguard Worker // These macros are to avoid too much code duplication as we don't want to have if detect for
607*8975f5c5SAndroid Build Coastguard Worker // hasDrawID/BaseVertex/BaseInstance inside for loop in a multiDrawANGLE call Part of these are put
608*8975f5c5SAndroid Build Coastguard Worker // in the header as we want to share with specialized context impl on some platforms for multidraw
609*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_DRAW_ID_UNIFORM_0(drawID) \
610*8975f5c5SAndroid Build Coastguard Worker {}
611*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_DRAW_ID_UNIFORM_1(drawID) executable->setDrawIDUniform(drawID)
612*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_DRAW_ID_UNIFORM(cond) ANGLE_SET_DRAW_ID_UNIFORM_##cond
613*8975f5c5SAndroid Build Coastguard Worker
614*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_BASE_VERTEX_UNIFORM_0(baseVertex) \
615*8975f5c5SAndroid Build Coastguard Worker {}
616*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_BASE_VERTEX_UNIFORM_1(baseVertex) executable->setBaseVertexUniform(baseVertex);
617*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_BASE_VERTEX_UNIFORM(cond) ANGLE_SET_BASE_VERTEX_UNIFORM_##cond
618*8975f5c5SAndroid Build Coastguard Worker
619*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_BASE_INSTANCE_UNIFORM_0(baseInstance) \
620*8975f5c5SAndroid Build Coastguard Worker {}
621*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_BASE_INSTANCE_UNIFORM_1(baseInstance) \
622*8975f5c5SAndroid Build Coastguard Worker executable->setBaseInstanceUniform(baseInstance)
623*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_SET_BASE_INSTANCE_UNIFORM(cond) ANGLE_SET_BASE_INSTANCE_UNIFORM_##cond
624*8975f5c5SAndroid Build Coastguard Worker
625*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_NOOP_DRAW_ context->noopDraw(mode, counts[drawID])
626*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_NOOP_DRAW_INSTANCED \
627*8975f5c5SAndroid Build Coastguard Worker context->noopDrawInstanced(mode, counts[drawID], instanceCounts[drawID])
628*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_NOOP_DRAW(_instanced) ANGLE_NOOP_DRAW##_instanced
629*8975f5c5SAndroid Build Coastguard Worker
630*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE_ \
631*8975f5c5SAndroid Build Coastguard Worker gl::MarkTransformFeedbackBufferUsage(context, counts[drawID], 1)
632*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE_INSTANCED \
633*8975f5c5SAndroid Build Coastguard Worker gl::MarkTransformFeedbackBufferUsage(context, counts[drawID], instanceCounts[drawID])
634*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE(instanced) \
635*8975f5c5SAndroid Build Coastguard Worker ANGLE_MARK_TRANSFORM_FEEDBACK_USAGE##instanced
636*8975f5c5SAndroid Build Coastguard Worker
637*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_RENDERER_UTILS_H_
638