summaryrefslogtreecommitdiff
path: root/chromium/gpu/command_buffer/common/gles2_cmd_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/gpu/command_buffer/common/gles2_cmd_utils.h')
-rw-r--r--chromium/gpu/command_buffer/common/gles2_cmd_utils.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils.h b/chromium/gpu/command_buffer/common/gles2_cmd_utils.h
new file mode 100644
index 00000000000..4bc4b1b7fcc
--- /dev/null
+++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils.h
@@ -0,0 +1,200 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file is here so other GLES2 related files can have a common set of
+// includes where appropriate.
+
+#ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_
+#define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_
+
+#include <limits>
+#include <string>
+#include <vector>
+
+#include "gpu/command_buffer/common/gles2_utils_export.h"
+#include "gpu/command_buffer/common/types.h"
+
+namespace gpu {
+namespace gles2 {
+
+// Does a multiply and checks for overflow. If the multiply did not overflow
+// returns true.
+
+// Multiplies 2 32 bit unsigned numbers checking for overflow.
+// If there was no overflow returns true.
+inline bool SafeMultiplyUint32(uint32 a, uint32 b, uint32* dst) {
+ if (b == 0) {
+ *dst = 0;
+ return true;
+ }
+ uint32 v = a * b;
+ if (v / b != a) {
+ *dst = 0;
+ return false;
+ }
+ *dst = v;
+ return true;
+}
+
+// Does an add checking for overflow. If there was no overflow returns true.
+inline bool SafeAddUint32(uint32 a, uint32 b, uint32* dst) {
+ if (a + b < a) {
+ *dst = 0;
+ return false;
+ }
+ *dst = a + b;
+ return true;
+}
+
+// Does an add checking for overflow. If there was no overflow returns true.
+inline bool SafeAddInt32(int32 a, int32 b, int32* dst) {
+ int64 sum64 = static_cast<int64>(a) + b;
+ int32 sum32 = static_cast<int32>(sum64);
+ bool safe = sum64 == static_cast<int64>(sum32);
+ *dst = safe ? sum32 : 0;
+ return safe;
+}
+
+// Utilties for GLES2 support.
+class GLES2_UTILS_EXPORT GLES2Util {
+ public:
+ static const int kNumFaces = 6;
+
+ // Bits returned by GetChannelsForFormat
+ enum ChannelBits {
+ kRed = 0x1,
+ kGreen = 0x2,
+ kBlue = 0x4,
+ kAlpha = 0x8,
+ kDepth = 0x10000,
+ kStencil = 0x20000,
+
+ kRGB = kRed | kGreen | kBlue,
+ kRGBA = kRGB | kAlpha
+ };
+
+ struct EnumToString {
+ uint32 value;
+ const char* name;
+ };
+
+ GLES2Util()
+ : num_compressed_texture_formats_(0),
+ num_shader_binary_formats_(0) {
+ }
+
+ int num_compressed_texture_formats() const {
+ return num_compressed_texture_formats_;
+ }
+
+ void set_num_compressed_texture_formats(int num_compressed_texture_formats) {
+ num_compressed_texture_formats_ = num_compressed_texture_formats;
+ }
+
+ int num_shader_binary_formats() const {
+ return num_shader_binary_formats_;
+ }
+
+ void set_num_shader_binary_formats(int num_shader_binary_formats) {
+ num_shader_binary_formats_ = num_shader_binary_formats;
+ }
+
+ // Gets the number of values a particular id will return when a glGet
+ // function is called. If 0 is returned the id is invalid.
+ int GLGetNumValuesReturned(int id) const;
+
+ // Computes the size of a single group of elements from a format and type pair
+ static uint32 ComputeImageGroupSize(int format, int type);
+
+ // Computes the size of an image row including alignment padding
+ static bool ComputeImagePaddedRowSize(
+ int width, int format, int type, int unpack_alignment,
+ uint32* padded_row_size);
+
+ // Computes the size of image data for TexImage2D and TexSubImage2D.
+ // Optionally the unpadded and padded row sizes can be returned. If height < 2
+ // then the padded_row_size will be the same as the unpadded_row_size since
+ // padding is not necessary.
+ static bool ComputeImageDataSizes(
+ int width, int height, int format, int type, int unpack_alignment,
+ uint32* size, uint32* unpadded_row_size, uint32* padded_row_size);
+
+ static size_t RenderbufferBytesPerPixel(int format);
+
+ static uint32 GetGLDataTypeSizeForUniforms(int type);
+
+ static size_t GetGLTypeSizeForTexturesAndBuffers(uint32 type);
+
+ static uint32 GLErrorToErrorBit(uint32 gl_error);
+
+ static uint32 GLErrorBitToGLError(uint32 error_bit);
+
+ static uint32 IndexToGLFaceTarget(int index);
+
+ // Returns a bitmask for the channels the given format supports.
+ // See ChannelBits.
+ static uint32 GetChannelsForFormat(int format);
+
+ // Returns a bitmask for the channels the given attachment type needs.
+ static uint32 GetChannelsNeededForAttachmentType(
+ int type, uint32 max_color_attachments);
+
+ static bool IsNPOT(uint32 value) {
+ return value > 0 && (value & (value - 1)) != 0;
+ }
+
+ static std::string GetStringEnum(uint32 value);
+ static std::string GetStringBool(uint32 value);
+ static std::string GetStringError(uint32 value);
+
+ // Parses a uniform name.
+ // array_pos: the position of the last '[' character in name.
+ // element_index: the index of the array element specifed in the name.
+ // getting_array: True if name refers to array.
+ // returns true of parsing was successful. Returing true does NOT mean
+ // it's a valid uniform name. On the otherhand, returning false does mean
+ // it's an invalid uniform name.
+ static bool ParseUniformName(
+ const std::string& name,
+ size_t* array_pos,
+ int* element_index,
+ bool* getting_array);
+
+ #include "../common/gles2_cmd_utils_autogen.h"
+
+ private:
+ static std::string GetQualifiedEnumString(
+ const EnumToString* table, size_t count, uint32 value);
+
+ static const EnumToString* const enum_to_string_table_;
+ static const size_t enum_to_string_table_len_;
+
+ int num_compressed_texture_formats_;
+ int num_shader_binary_formats_;
+};
+
+class GLES2_UTILS_EXPORT ContextCreationAttribParser {
+ public:
+ ContextCreationAttribParser();
+ bool Parse(const std::vector<int32>& attribs);
+
+ // -1 if invalid or unspecified.
+ int32 alpha_size_;
+ int32 blue_size_;
+ int32 green_size_;
+ int32 red_size_;
+ int32 depth_size_;
+ int32 stencil_size_;
+ int32 samples_;
+ int32 sample_buffers_;
+ bool buffer_preserved_;
+ bool share_resources_;
+ bool bind_generates_resource_;
+};
+
+} // namespace gles2
+} // namespace gpu
+
+#endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_
+