xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/renderer_utils.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 &params,
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