1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #ifndef __GL_UTILS_H__ 17 #define __GL_UTILS_H__ 18 19 #include <stdio.h> 20 #include <stdlib.h> 21 22 #ifdef GL_API 23 #undef GL_API 24 #endif 25 #define GL_API 26 27 #ifdef GL_APIENTRY 28 #undef GL_APIENTRY 29 #endif 30 31 #ifdef GL_APIENTRYP 32 #undef GL_APIENTRYP 33 #endif 34 #define GL_APIENTRYP 35 36 #ifndef ANDROID 37 #define GL_APIENTRY 38 #endif 39 40 #include <GLES/gl.h> 41 #include <GLES/glext.h> 42 #include <GLES2/gl2.h> 43 #include <GLES2/gl2ext.h> 44 45 #ifdef __cplusplus 46 extern "C" { 47 #endif 48 49 typedef enum { 50 INDIRECT_COMMAND_DRAWARRAYS = 0, 51 INDIRECT_COMMAND_DRAWELEMENTS = 1, 52 } IndirectCommandType; 53 54 size_t glSizeof(GLenum type); 55 size_t glUtilsParamSize(GLenum param); 56 void glUtilsPackPointerData(unsigned char *dst, unsigned char *str, 57 int size, GLenum type, unsigned int stride, 58 unsigned int datalen); 59 void glUtilsWritePackPointerData(void* stream, unsigned char *src, 60 int size, GLenum type, unsigned int stride, 61 unsigned int datalen); 62 int glUtilsPixelBitSize(GLenum format, GLenum type); 63 void glUtilsPackStrings(char *ptr, char **strings, GLint *length, GLsizei count); 64 int glUtilsCalcShaderSourceLen(char **strings, GLint *length, GLsizei count); 65 GLenum glUtilsColorAttachmentName(int i); 66 int glUtilsColorAttachmentIndex(GLenum attachment); 67 68 GLuint glUtilsIndirectStructSize(IndirectCommandType cmdType); 69 70 #ifdef __cplusplus 71 }; 72 #endif 73 74 namespace GLUtils { 75 76 template <class T> void minmax(const T *indices, int count, int *min, int *max) { 77 *min = -1; 78 *max = -1; 79 const T *ptr = indices; 80 for (int i = 0; i < count; i++) { 81 if (*min == -1 || *ptr < *min) *min = *ptr; 82 if (*max == -1 || *ptr > *max) *max = *ptr; 83 ptr++; 84 } 85 } 86 87 template <class T> void minmaxExcept 88 (const T *indices, int count, int *min, int *max, 89 bool shouldExclude, T whatExclude) { 90 91 if (!shouldExclude) return minmax(indices, count, min, max); 92 93 *min = -1; 94 *max = -1; 95 const T *ptr = indices; 96 for (int i = 0; i < count; i++) { 97 if (*ptr != whatExclude) { 98 if (*min == -1 || *ptr < *min) *min = *ptr; 99 if (*max == -1 || *ptr > *max) *max = *ptr; 100 } 101 ptr++; 102 } 103 } 104 105 template <class T> void shiftIndices(T *indices, int count, int offset) { 106 T *ptr = indices; 107 for (int i = 0; i < count; i++) { 108 *ptr += offset; 109 ptr++; 110 } 111 } 112 113 114 template <class T> void shiftIndices(const T *src, T *dst, int count, int offset) 115 { 116 for (int i = 0; i < count; i++) { 117 *dst = *src + offset; 118 dst++; 119 src++; 120 } 121 } 122 123 template <class T> void shiftIndicesExcept 124 (T *indices, int count, int offset, 125 bool shouldExclude, T whatExclude) { 126 127 if (!shouldExclude) return shiftIndices(indices, count, offset); 128 129 T *ptr = indices; 130 for (int i = 0; i < count; i++) { 131 if (*ptr != whatExclude) { 132 *ptr += offset; 133 } 134 ptr++; 135 } 136 } 137 138 template <class T> void shiftIndicesExcept 139 (const T *src, T *dst, int count, int offset, 140 bool shouldExclude, T whatExclude) { 141 142 if (!shouldExclude) return shiftIndices(src, dst, count, offset); 143 144 for (int i = 0; i < count; i++) { 145 if (*src == whatExclude) { 146 *dst = *src; 147 } else { 148 *dst = *src + offset; 149 } 150 dst++; 151 src++; 152 } 153 } 154 155 template<class T> T primitiveRestartIndex() { 156 return -1; 157 } 158 159 }; // namespace GLUtils 160 #endif 161