1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // This file is here so other GLES2 related files can have a common set of
6 // includes where appropriate.
7
8 #ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_
9 #define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_
10
11 #include <limits>
12 #include <string>
13 #include <vector>
14
15 #include "gpu/command_buffer/common/gles2_utils_export.h"
16 #include "gpu/command_buffer/common/types.h"
17
18 namespace gpu {
19 namespace gles2 {
20
21 // Does a multiply and checks for overflow. If the multiply did not overflow
22 // returns true.
23
24 // Multiplies 2 32 bit unsigned numbers checking for overflow.
25 // If there was no overflow returns true.
SafeMultiplyUint32(uint32 a,uint32 b,uint32 * dst)26 inline bool SafeMultiplyUint32(uint32 a, uint32 b, uint32* dst) {
27 if (b == 0) {
28 *dst = 0;
29 return true;
30 }
31 uint32 v = a * b;
32 if (v / b != a) {
33 *dst = 0;
34 return false;
35 }
36 *dst = v;
37 return true;
38 }
39
40 // Does an add checking for overflow. If there was no overflow returns true.
SafeAddUint32(uint32 a,uint32 b,uint32 * dst)41 inline bool SafeAddUint32(uint32 a, uint32 b, uint32* dst) {
42 if (a + b < a) {
43 *dst = 0;
44 return false;
45 }
46 *dst = a + b;
47 return true;
48 }
49
50 // Does an add checking for overflow. If there was no overflow returns true.
SafeAddInt32(int32 a,int32 b,int32 * dst)51 inline bool SafeAddInt32(int32 a, int32 b, int32* dst) {
52 int64 sum64 = static_cast<int64>(a) + b;
53 int32 sum32 = static_cast<int32>(sum64);
54 bool safe = sum64 == static_cast<int64>(sum32);
55 *dst = safe ? sum32 : 0;
56 return safe;
57 }
58
59 // Utilties for GLES2 support.
60 class GLES2_UTILS_EXPORT GLES2Util {
61 public:
62 static const int kNumFaces = 6;
63
64 // Bits returned by GetChannelsForFormat
65 enum ChannelBits {
66 kRed = 0x1,
67 kGreen = 0x2,
68 kBlue = 0x4,
69 kAlpha = 0x8,
70 kDepth = 0x10000,
71 kStencil = 0x20000,
72
73 kRGB = kRed | kGreen | kBlue,
74 kRGBA = kRGB | kAlpha
75 };
76
77 struct EnumToString {
78 uint32 value;
79 const char* name;
80 };
81
GLES2Util()82 GLES2Util()
83 : num_compressed_texture_formats_(0),
84 num_shader_binary_formats_(0) {
85 }
86
num_compressed_texture_formats()87 int num_compressed_texture_formats() const {
88 return num_compressed_texture_formats_;
89 }
90
set_num_compressed_texture_formats(int num_compressed_texture_formats)91 void set_num_compressed_texture_formats(int num_compressed_texture_formats) {
92 num_compressed_texture_formats_ = num_compressed_texture_formats;
93 }
94
num_shader_binary_formats()95 int num_shader_binary_formats() const {
96 return num_shader_binary_formats_;
97 }
98
set_num_shader_binary_formats(int num_shader_binary_formats)99 void set_num_shader_binary_formats(int num_shader_binary_formats) {
100 num_shader_binary_formats_ = num_shader_binary_formats;
101 }
102
103 // Gets the number of values a particular id will return when a glGet
104 // function is called. If 0 is returned the id is invalid.
105 int GLGetNumValuesReturned(int id) const;
106
107 // Computes the size of a single group of elements from a format and type pair
108 static uint32 ComputeImageGroupSize(int format, int type);
109
110 // Computes the size of an image row including alignment padding
111 static bool ComputeImagePaddedRowSize(
112 int width, int format, int type, int unpack_alignment,
113 uint32* padded_row_size);
114
115 // Computes the size of image data for TexImage2D and TexSubImage2D.
116 // Optionally the unpadded and padded row sizes can be returned. If height < 2
117 // then the padded_row_size will be the same as the unpadded_row_size since
118 // padding is not necessary.
119 static bool ComputeImageDataSizes(
120 int width, int height, int format, int type, int unpack_alignment,
121 uint32* size, uint32* unpadded_row_size, uint32* padded_row_size);
122
123 static size_t RenderbufferBytesPerPixel(int format);
124
125 static uint32 GetGLDataTypeSizeForUniforms(int type);
126
127 static size_t GetGLTypeSizeForTexturesAndBuffers(uint32 type);
128
129 static uint32 GLErrorToErrorBit(uint32 gl_error);
130
131 static uint32 GLErrorBitToGLError(uint32 error_bit);
132
133 static uint32 IndexToGLFaceTarget(int index);
134
135 static uint32 GetPreferredGLReadPixelsFormat(uint32 internal_format);
136
137 static uint32 GetPreferredGLReadPixelsType(
138 uint32 internal_format, uint32 texture_type);
139
140 // Returns a bitmask for the channels the given format supports.
141 // See ChannelBits.
142 static uint32 GetChannelsForFormat(int format);
143
144 // Returns a bitmask for the channels the given attachment type needs.
145 static uint32 GetChannelsNeededForAttachmentType(
146 int type, uint32 max_color_attachments);
147
IsNPOT(uint32 value)148 static bool IsNPOT(uint32 value) {
149 return value > 0 && (value & (value - 1)) != 0;
150 }
151
152 static std::string GetStringEnum(uint32 value);
153 static std::string GetStringBool(uint32 value);
154 static std::string GetStringError(uint32 value);
155
156 // Parses a uniform name.
157 // array_pos: the position of the last '[' character in name.
158 // element_index: the index of the array element specifed in the name.
159 // getting_array: True if name refers to array.
160 // returns true of parsing was successful. Returing true does NOT mean
161 // it's a valid uniform name. On the otherhand, returning false does mean
162 // it's an invalid uniform name.
163 static bool ParseUniformName(
164 const std::string& name,
165 size_t* array_pos,
166 int* element_index,
167 bool* getting_array);
168
169 #include "../common/gles2_cmd_utils_autogen.h"
170
171 private:
172 static std::string GetQualifiedEnumString(
173 const EnumToString* table, size_t count, uint32 value);
174
175 static const EnumToString* const enum_to_string_table_;
176 static const size_t enum_to_string_table_len_;
177
178 int num_compressed_texture_formats_;
179 int num_shader_binary_formats_;
180 };
181
182 class GLES2_UTILS_EXPORT ContextCreationAttribHelper {
183 public:
184 ContextCreationAttribHelper();
185
186 void Serialize(std::vector<int32>* attribs);
187 bool Parse(const std::vector<int32>& attribs);
188
189 // -1 if invalid or unspecified.
190 int32 alpha_size_;
191 int32 blue_size_;
192 int32 green_size_;
193 int32 red_size_;
194 int32 depth_size_;
195 int32 stencil_size_;
196 int32 samples_;
197 int32 sample_buffers_;
198 bool buffer_preserved_;
199 bool share_resources_;
200 bool bind_generates_resource_;
201 bool fail_if_major_perf_caveat_;
202 };
203
204 } // namespace gles2
205 } // namespace gpu
206
207 #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_
208
209