/libs/rs/rsComponent.cpp

https://github.com/anryl/android_frameworks_base · C++ · 337 lines · 289 code · 30 blank · 18 comment · 30 complexity · c3a1039504e3bcf059e2c816d72fc559 MD5 · raw file

  1. /*
  2. * Copyright (C) 2009 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. #include "rsComponent.h"
  17. #include <GLES/gl.h>
  18. using namespace android;
  19. using namespace android::renderscript;
  20. Component::Component()
  21. {
  22. set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
  23. }
  24. Component::~Component()
  25. {
  26. }
  27. void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize)
  28. {
  29. mType = dt;
  30. mKind = dk;
  31. mNormalized = norm;
  32. mVectorSize = vecSize;
  33. rsAssert(vecSize <= 4);
  34. mBits = 0;
  35. mTypeBits = 0;
  36. mIsFloat = false;
  37. mIsSigned = false;
  38. mIsPixel = false;
  39. switch(mKind) {
  40. case RS_KIND_PIXEL_L:
  41. case RS_KIND_PIXEL_A:
  42. mIsPixel = true;
  43. rsAssert(mVectorSize == 1);
  44. rsAssert(mNormalized == true);
  45. break;
  46. case RS_KIND_PIXEL_LA:
  47. mIsPixel = true;
  48. rsAssert(mVectorSize == 2);
  49. rsAssert(mNormalized == true);
  50. break;
  51. case RS_KIND_PIXEL_RGB:
  52. mIsPixel = true;
  53. rsAssert(mVectorSize == 3);
  54. rsAssert(mNormalized == true);
  55. break;
  56. case RS_KIND_PIXEL_RGBA:
  57. mIsPixel = true;
  58. rsAssert(mVectorSize == 4);
  59. rsAssert(mNormalized == true);
  60. break;
  61. default:
  62. break;
  63. }
  64. switch(mType) {
  65. case RS_TYPE_NONE:
  66. return;
  67. case RS_TYPE_UNSIGNED_5_6_5:
  68. mVectorSize = 3;
  69. mBits = 16;
  70. mNormalized = true;
  71. rsAssert(mKind == RS_KIND_PIXEL_RGB);
  72. return;
  73. case RS_TYPE_UNSIGNED_5_5_5_1:
  74. mVectorSize = 4;
  75. mBits = 16;
  76. mNormalized = true;
  77. rsAssert(mKind == RS_KIND_PIXEL_RGBA);
  78. return;
  79. case RS_TYPE_UNSIGNED_4_4_4_4:
  80. mVectorSize = 4;
  81. mBits = 16;
  82. mNormalized = true;
  83. rsAssert(mKind == RS_KIND_PIXEL_RGBA);
  84. return;
  85. case RS_TYPE_ELEMENT:
  86. case RS_TYPE_TYPE:
  87. case RS_TYPE_ALLOCATION:
  88. case RS_TYPE_SAMPLER:
  89. case RS_TYPE_SCRIPT:
  90. case RS_TYPE_MESH:
  91. case RS_TYPE_PROGRAM_FRAGMENT:
  92. case RS_TYPE_PROGRAM_VERTEX:
  93. case RS_TYPE_PROGRAM_RASTER:
  94. case RS_TYPE_PROGRAM_STORE:
  95. rsAssert(mVectorSize == 1);
  96. rsAssert(mNormalized == false);
  97. rsAssert(mKind == RS_KIND_USER);
  98. mBits = 32;
  99. mTypeBits = 32;
  100. return;
  101. case RS_TYPE_FLOAT_16:
  102. mTypeBits = 16;
  103. mIsFloat = true;
  104. break;
  105. case RS_TYPE_FLOAT_32:
  106. mTypeBits = 32;
  107. mIsFloat = true;
  108. break;
  109. case RS_TYPE_FLOAT_64:
  110. mTypeBits = 64;
  111. mIsFloat = true;
  112. break;
  113. case RS_TYPE_SIGNED_8:
  114. mTypeBits = 8;
  115. mIsSigned = true;
  116. break;
  117. case RS_TYPE_SIGNED_16:
  118. mTypeBits = 16;
  119. mIsSigned = true;
  120. break;
  121. case RS_TYPE_SIGNED_32:
  122. mTypeBits = 32;
  123. mIsSigned = true;
  124. break;
  125. case RS_TYPE_SIGNED_64:
  126. mTypeBits = 64;
  127. mIsSigned = true;
  128. break;
  129. case RS_TYPE_UNSIGNED_8:
  130. mTypeBits = 8;
  131. break;
  132. case RS_TYPE_UNSIGNED_16:
  133. mTypeBits = 16;
  134. break;
  135. case RS_TYPE_UNSIGNED_32:
  136. mTypeBits = 32;
  137. break;
  138. case RS_TYPE_UNSIGNED_64:
  139. mTypeBits = 64;
  140. break;
  141. }
  142. mBits = mTypeBits * mVectorSize;
  143. }
  144. uint32_t Component::getGLType() const
  145. {
  146. switch (mType) {
  147. case RS_TYPE_UNSIGNED_5_6_5: return GL_UNSIGNED_SHORT_5_6_5;
  148. case RS_TYPE_UNSIGNED_5_5_5_1: return GL_UNSIGNED_SHORT_5_5_5_1;
  149. case RS_TYPE_UNSIGNED_4_4_4_4: return GL_UNSIGNED_SHORT_4_4_4_4;
  150. //case RS_TYPE_FLOAT_16: return GL_HALF_FLOAT;
  151. case RS_TYPE_FLOAT_32: return GL_FLOAT;
  152. case RS_TYPE_UNSIGNED_8: return GL_UNSIGNED_BYTE;
  153. case RS_TYPE_UNSIGNED_16: return GL_UNSIGNED_SHORT;
  154. case RS_TYPE_SIGNED_8: return GL_BYTE;
  155. case RS_TYPE_SIGNED_16: return GL_SHORT;
  156. default: break;
  157. }
  158. return 0;
  159. }
  160. uint32_t Component::getGLFormat() const
  161. {
  162. switch (mKind) {
  163. case RS_KIND_PIXEL_L: return GL_LUMINANCE;
  164. case RS_KIND_PIXEL_A: return GL_ALPHA;
  165. case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
  166. case RS_KIND_PIXEL_RGB: return GL_RGB;
  167. case RS_KIND_PIXEL_RGBA: return GL_RGBA;
  168. default: break;
  169. }
  170. return 0;
  171. }
  172. static const char * gCTypeStrings[] = {
  173. 0,
  174. 0,//"F16",
  175. "float",
  176. "double",
  177. "char",
  178. "short",
  179. "int",
  180. 0,//"S64",
  181. "char",//U8",
  182. "short",//U16",
  183. "int",//U32",
  184. 0,//"U64",
  185. 0,//"UP_565",
  186. 0,//"UP_5551",
  187. 0,//"UP_4444",
  188. 0,//"ELEMENT",
  189. 0,//"TYPE",
  190. 0,//"ALLOCATION",
  191. 0,//"SAMPLER",
  192. 0,//"SCRIPT",
  193. 0,//"MESH",
  194. 0,//"PROGRAM_FRAGMENT",
  195. 0,//"PROGRAM_VERTEX",
  196. 0,//"PROGRAM_RASTER",
  197. 0,//"PROGRAM_STORE",
  198. };
  199. static const char * gCVecTypeStrings[] = {
  200. 0,
  201. 0,//"F16",
  202. "vecF32",
  203. "vecF64",
  204. "vecI8",
  205. "vecI16",
  206. "vecI32",
  207. 0,//"S64",
  208. "vecU8",//U8",
  209. "vecU16",//U16",
  210. "vecU32",//U32",
  211. 0,//"U64",
  212. 0,//"UP_565",
  213. 0,//"UP_5551",
  214. 0,//"UP_4444",
  215. 0,//"ELEMENT",
  216. 0,//"TYPE",
  217. 0,//"ALLOCATION",
  218. 0,//"SAMPLER",
  219. 0,//"SCRIPT",
  220. 0,//"MESH",
  221. 0,//"PROGRAM_FRAGMENT",
  222. 0,//"PROGRAM_VERTEX",
  223. 0,//"PROGRAM_RASTER",
  224. 0,//"PROGRAM_STORE",
  225. };
  226. String8 Component::getCType() const
  227. {
  228. char buf[64];
  229. if (mVectorSize == 1) {
  230. return String8(gCTypeStrings[mType]);
  231. }
  232. // Yuck, acc WAR
  233. // Appears to have problems packing chars
  234. if (mVectorSize == 4 && mType == RS_TYPE_UNSIGNED_8) {
  235. return String8("int");
  236. }
  237. String8 s(gCVecTypeStrings[mType]);
  238. sprintf(buf, "_%i_t", mVectorSize);
  239. s.append(buf);
  240. return s;
  241. }
  242. String8 Component::getGLSLType() const
  243. {
  244. if (mType == RS_TYPE_SIGNED_32) {
  245. switch(mVectorSize) {
  246. case 1: return String8("int");
  247. case 2: return String8("ivec2");
  248. case 3: return String8("ivec3");
  249. case 4: return String8("ivec4");
  250. }
  251. }
  252. if (mType == RS_TYPE_FLOAT_32) {
  253. switch(mVectorSize) {
  254. case 1: return String8("float");
  255. case 2: return String8("vec2");
  256. case 3: return String8("vec3");
  257. case 4: return String8("vec4");
  258. }
  259. }
  260. return String8();
  261. }
  262. static const char * gTypeStrings[] = {
  263. "NONE",
  264. "F16",
  265. "F32",
  266. "F64",
  267. "S8",
  268. "S16",
  269. "S32",
  270. "S64",
  271. "U8",
  272. "U16",
  273. "U32",
  274. "U64",
  275. "UP_565",
  276. "UP_5551",
  277. "UP_4444",
  278. "ELEMENT",
  279. "TYPE",
  280. "ALLOCATION",
  281. "SAMPLER",
  282. "SCRIPT",
  283. "MESH",
  284. "PROGRAM_FRAGMENT",
  285. "PROGRAM_VERTEX",
  286. "PROGRAM_RASTER",
  287. "PROGRAM_STORE",
  288. };
  289. static const char * gKindStrings[] = {
  290. "USER",
  291. "COLOR",
  292. "POSITION",
  293. "TEXTURE",
  294. "NORMAL",
  295. "INDEX",
  296. "POINT_SIZE",
  297. "PIXEL_L",
  298. "PIXEL_A",
  299. "PIXEL_LA",
  300. "PIXEL_RGB",
  301. "PIXEL_RGBA",
  302. };
  303. void Component::dumpLOGV(const char *prefix) const
  304. {
  305. LOGV("%s Component: %s, %s, vectorSize=%i, bits=%i",
  306. prefix, gTypeStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
  307. }