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