gl_map_buffer_range_unittest.cc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. // Copyright 2016 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. #include <GLES2/gl2.h>
  5. #include <GLES2/gl2ext.h>
  6. #include <GLES2/gl2extchromium.h>
  7. #include <GLES3/gl3.h>
  8. #include <stdint.h>
  9. #include "build/build_config.h"
  10. #include "gpu/command_buffer/service/context_group.h"
  11. #include "gpu/command_buffer/tests/gl_manager.h"
  12. #include "gpu/command_buffer/tests/gl_test_utils.h"
  13. #include "gpu/config/gpu_test_config.h"
  14. #include "testing/gmock/include/gmock/gmock.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. #define SHADER(Src) #Src
  17. namespace gpu {
  18. class ES3MapBufferRangeTest : public testing::Test {
  19. protected:
  20. static const GLsizei kCanvasSize = 4;
  21. void SetUp() override {
  22. GLManager::Options options;
  23. options.size = gfx::Size(kCanvasSize, kCanvasSize);
  24. options.context_type = CONTEXT_TYPE_OPENGLES3;
  25. gl_.Initialize(options);
  26. }
  27. bool ShouldSkipTest() const {
  28. // If a driver isn't capable of supporting ES3 context, creating
  29. // ContextGroup will fail.
  30. // See crbug.com/654709.
  31. return (!gl_.decoder() || !gl_.decoder()->GetContextGroup());
  32. }
  33. void TearDown() override { gl_.Destroy(); }
  34. GLuint SetupSimpleProgram(GLint* ret_position_loc) {
  35. static const char* v_shader_src =
  36. SHADER(attribute vec2 a_position;
  37. void main() { gl_Position = vec4(a_position, 0.0, 1.0); });
  38. static const char* f_shader_src =
  39. SHADER(precision mediump float;
  40. void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); });
  41. GLuint program = GLTestHelper::LoadProgram(v_shader_src, f_shader_src);
  42. EXPECT_LT(0u, program);
  43. glUseProgram(program);
  44. *ret_position_loc = glGetAttribLocation(program, "a_position");
  45. EXPECT_LE(0, *ret_position_loc);
  46. return program;
  47. }
  48. GLuint SetupTransformFeedbackProgram(GLint* ret_position_loc) {
  49. static const char* v_shader_src =
  50. "#version 300 es\n"
  51. "in vec2 a_position;\n"
  52. "out vec3 var0;\n"
  53. "out vec2 var1;\n"
  54. "void main() {\n"
  55. " var0 = vec3(a_position, 0.5);\n"
  56. " var1 = a_position;\n"
  57. " gl_Position = vec4(a_position, 0.0, 1.0);\n"
  58. "}";
  59. static const char* f_shader_src =
  60. "#version 300 es\n"
  61. "precision mediump float;\n"
  62. "out vec4 color;\n"
  63. "in vec3 var0;\n"
  64. "in vec2 var1;\n"
  65. "void main() {\n"
  66. " color = vec4(0.0, 1.0, 0.0, 1.0);\n"
  67. "}";
  68. static const char* varyings[] = {"var0", "var1"};
  69. GLuint program = GLTestHelper::LoadProgram(v_shader_src, f_shader_src);
  70. EXPECT_LT(0u, program);
  71. glTransformFeedbackVaryings(program, 2, varyings, GL_SEPARATE_ATTRIBS);
  72. glLinkProgram(program);
  73. GLint link_status = GL_FALSE;
  74. glGetProgramiv(program, GL_LINK_STATUS, &link_status);
  75. EXPECT_EQ(GL_TRUE, link_status);
  76. glUseProgram(program);
  77. *ret_position_loc = glGetAttribLocation(program, "a_position");
  78. EXPECT_LE(0, *ret_position_loc);
  79. return program;
  80. }
  81. GLManager gl_;
  82. };
  83. TEST_F(ES3MapBufferRangeTest, DrawArraysAndInstanced) {
  84. if (ShouldSkipTest())
  85. return;
  86. const uint8_t kRedColor[] = {255, 0, 0, 255};
  87. const uint8_t kBlackColor[] = {0, 0, 0, 255};
  88. const GLsizei kPrimCount = 4;
  89. GLint position_loc = 0;
  90. SetupSimpleProgram(&position_loc);
  91. GLTestHelper::CheckGLError("no errors", __LINE__);
  92. GLuint buffer = GLTestHelper::SetupUnitQuad(position_loc);
  93. GLTestHelper::CheckGLError("no errors", __LINE__);
  94. EXPECT_LT(0u, buffer);
  95. glClearColor(0.0, 0.0, 0.0, 1.0);
  96. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  97. glDrawArrays(GL_TRIANGLES, 0, 6);
  98. GLTestHelper::CheckGLError("no errors", __LINE__);
  99. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  100. kRedColor, nullptr));
  101. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  102. glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, kPrimCount);
  103. GLTestHelper::CheckGLError("no errors", __LINE__);
  104. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  105. kRedColor, nullptr));
  106. glMapBufferRange(GL_ARRAY_BUFFER, 0, 6, GL_MAP_READ_BIT);
  107. GLTestHelper::CheckGLError("no errors", __LINE__);
  108. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  109. glDrawArrays(GL_TRIANGLES, 0, 6);
  110. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  111. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  112. kBlackColor, nullptr));
  113. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  114. glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, kPrimCount);
  115. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  116. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  117. kBlackColor, nullptr));
  118. // The following test is necessary to make sure draw calls do not just check
  119. // bound buffers, but actual buffers that are attached to the enabled vertex
  120. // attribs.
  121. glBindBuffer(GL_ARRAY_BUFFER, 0);
  122. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  123. glDrawArrays(GL_TRIANGLES, 0, 6);
  124. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  125. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  126. kBlackColor, nullptr));
  127. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  128. glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, kPrimCount);
  129. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  130. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  131. kBlackColor, nullptr));
  132. glBindBuffer(GL_ARRAY_BUFFER, buffer);
  133. glUnmapBuffer(GL_ARRAY_BUFFER);
  134. GLTestHelper::CheckGLError("no errors", __LINE__);
  135. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  136. glDrawArrays(GL_TRIANGLES, 0, 6);
  137. GLTestHelper::CheckGLError("no errors", __LINE__);
  138. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  139. kRedColor, nullptr));
  140. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  141. glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, kPrimCount);
  142. GLTestHelper::CheckGLError("no errors", __LINE__);
  143. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  144. kRedColor, nullptr));
  145. }
  146. TEST_F(ES3MapBufferRangeTest, DrawElementsAndInstanced) {
  147. if (ShouldSkipTest())
  148. return;
  149. const uint8_t kRedColor[] = {255, 0, 0, 255};
  150. const uint8_t kBlackColor[] = {0, 0, 0, 255};
  151. const GLsizei kPrimCount = 4;
  152. GLint position_loc = 0;
  153. SetupSimpleProgram(&position_loc);
  154. GLTestHelper::CheckGLError("no errors", __LINE__);
  155. std::vector<GLuint> buffers =
  156. GLTestHelper::SetupIndexedUnitQuad(position_loc);
  157. GLTestHelper::CheckGLError("no errors", __LINE__);
  158. EXPECT_EQ(2u, buffers.size());
  159. EXPECT_LT(0u, buffers[0]);
  160. EXPECT_LT(0u, buffers[1]);
  161. glClearColor(0.0, 0.0, 0.0, 1.0);
  162. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  163. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
  164. GLTestHelper::CheckGLError("no errors", __LINE__);
  165. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  166. kRedColor, nullptr));
  167. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  168. glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
  169. kPrimCount);
  170. GLTestHelper::CheckGLError("no errors", __LINE__);
  171. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  172. kRedColor, nullptr));
  173. glMapBufferRange(GL_ARRAY_BUFFER, 0, 6, GL_MAP_READ_BIT);
  174. GLTestHelper::CheckGLError("no errors", __LINE__);
  175. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  176. glDrawArrays(GL_TRIANGLES, 0, 6);
  177. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  178. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  179. kBlackColor, nullptr));
  180. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  181. glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
  182. kPrimCount);
  183. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  184. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  185. kBlackColor, nullptr));
  186. // The following test is necessary to make sure draw calls do not just check
  187. // bound buffers, but actual buffers that are attached to the enabled vertex
  188. // attribs.
  189. glBindBuffer(GL_ARRAY_BUFFER, 0);
  190. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  191. glDrawArrays(GL_TRIANGLES, 0, 6);
  192. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  193. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  194. kBlackColor, nullptr));
  195. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  196. glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
  197. kPrimCount);
  198. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  199. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  200. kBlackColor, nullptr));
  201. glBindBuffer(GL_ARRAY_BUFFER, buffers[0]);
  202. glUnmapBuffer(GL_ARRAY_BUFFER);
  203. GLTestHelper::CheckGLError("no errors", __LINE__);
  204. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  205. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
  206. GLTestHelper::CheckGLError("no errors", __LINE__);
  207. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  208. kRedColor, nullptr));
  209. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  210. glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
  211. kPrimCount);
  212. GLTestHelper::CheckGLError("no errors", __LINE__);
  213. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  214. kRedColor, nullptr));
  215. glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, 6, GL_MAP_READ_BIT);
  216. GLTestHelper::CheckGLError("no errors", __LINE__);
  217. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  218. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
  219. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  220. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  221. kBlackColor, nullptr));
  222. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  223. glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
  224. kPrimCount);
  225. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  226. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  227. kBlackColor, nullptr));
  228. glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
  229. GLTestHelper::CheckGLError("no errors", __LINE__);
  230. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  231. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
  232. GLTestHelper::CheckGLError("no errors", __LINE__);
  233. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  234. kRedColor, nullptr));
  235. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  236. glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
  237. kPrimCount);
  238. GLTestHelper::CheckGLError("no errors", __LINE__);
  239. EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
  240. kRedColor, nullptr));
  241. }
  242. TEST_F(ES3MapBufferRangeTest, ReadPixels) {
  243. if (ShouldSkipTest())
  244. return;
  245. // TODO(crbug.com/angleproject/5213) consistent driver errors on this config.
  246. if (GPUTestBotConfig::CurrentConfigMatches("Linux AMD"))
  247. return;
  248. GLuint buffer = 0;
  249. glGenBuffers(1, &buffer);
  250. EXPECT_LT(0u, buffer);
  251. glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer);
  252. glBufferData(GL_PIXEL_PACK_BUFFER, 4 * kCanvasSize * kCanvasSize, 0,
  253. GL_STATIC_READ);
  254. glReadPixels(0, 0, kCanvasSize, kCanvasSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  255. GLTestHelper::CheckGLError("no errors", __LINE__);
  256. glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
  257. GLTestHelper::CheckGLError("no errors", __LINE__);
  258. glReadPixels(0, 0, kCanvasSize, kCanvasSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  259. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  260. glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
  261. GLTestHelper::CheckGLError("no errors", __LINE__);
  262. #if BUILDFLAG(IS_MAC)
  263. // TODO(crbug.com/1230038): This step causes a crash on mac intel-uhd bot.
  264. if (GPUTestBotConfig::CurrentConfigMatches("Mac Intel 0x3e9b"))
  265. return;
  266. #endif
  267. glReadPixels(0, 0, kCanvasSize, kCanvasSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  268. GLTestHelper::CheckGLError("no errors", __LINE__);
  269. }
  270. TEST_F(ES3MapBufferRangeTest, TexImageAndSubImage2D) {
  271. if (ShouldSkipTest())
  272. return;
  273. const GLsizei kTextureSize = 4;
  274. GLuint buffer = 0;
  275. glGenBuffers(1, &buffer);
  276. EXPECT_LT(0u, buffer);
  277. glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
  278. glBufferData(GL_PIXEL_UNPACK_BUFFER, 4 * kTextureSize * kTextureSize, 0,
  279. GL_STATIC_READ);
  280. GLuint tex = 0;
  281. glGenTextures(1, &tex);
  282. EXPECT_LT(0u, tex);
  283. glBindTexture(GL_TEXTURE_2D, tex);
  284. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTextureSize, kTextureSize, 0,
  285. GL_RGBA, GL_UNSIGNED_BYTE, 0);
  286. GLTestHelper::CheckGLError("no errors", __LINE__);
  287. glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTextureSize, kTextureSize, GL_RGBA,
  288. GL_UNSIGNED_BYTE, 0);
  289. GLTestHelper::CheckGLError("no errors", __LINE__);
  290. glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 6, GL_MAP_READ_BIT);
  291. GLTestHelper::CheckGLError("no errors", __LINE__);
  292. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTextureSize, kTextureSize, 0,
  293. GL_RGBA, GL_UNSIGNED_BYTE, 0);
  294. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  295. glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTextureSize, kTextureSize, GL_RGBA,
  296. GL_UNSIGNED_BYTE, 0);
  297. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  298. glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
  299. GLTestHelper::CheckGLError("no errors", __LINE__);
  300. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTextureSize, kTextureSize, 0,
  301. GL_RGBA, GL_UNSIGNED_BYTE, 0);
  302. GLTestHelper::CheckGLError("no errors", __LINE__);
  303. glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTextureSize, kTextureSize, GL_RGBA,
  304. GL_UNSIGNED_BYTE, 0);
  305. GLTestHelper::CheckGLError("no errors", __LINE__);
  306. }
  307. TEST_F(ES3MapBufferRangeTest, TexImageAndSubImage3D) {
  308. if (ShouldSkipTest())
  309. return;
  310. const GLsizei kTextureSize = 4;
  311. GLuint buffer = 0;
  312. glGenBuffers(1, &buffer);
  313. EXPECT_LT(0u, buffer);
  314. glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
  315. glBufferData(GL_PIXEL_UNPACK_BUFFER,
  316. 4 * kTextureSize * kTextureSize * kTextureSize, 0,
  317. GL_STATIC_READ);
  318. GLuint tex = 0;
  319. glGenTextures(1, &tex);
  320. EXPECT_LT(0u, tex);
  321. glBindTexture(GL_TEXTURE_3D, tex);
  322. glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kTextureSize, kTextureSize,
  323. kTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  324. GLTestHelper::CheckGLError("no errors", __LINE__);
  325. glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, kTextureSize, kTextureSize,
  326. kTextureSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  327. GLTestHelper::CheckGLError("no errors", __LINE__);
  328. glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 6, GL_MAP_READ_BIT);
  329. GLTestHelper::CheckGLError("no errors", __LINE__);
  330. glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kTextureSize, kTextureSize,
  331. kTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  332. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  333. glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, kTextureSize, kTextureSize,
  334. kTextureSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  335. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  336. glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
  337. GLTestHelper::CheckGLError("no errors", __LINE__);
  338. glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kTextureSize, kTextureSize,
  339. kTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  340. GLTestHelper::CheckGLError("no errors", __LINE__);
  341. glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, kTextureSize, kTextureSize,
  342. kTextureSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  343. GLTestHelper::CheckGLError("no errors", __LINE__);
  344. }
  345. // TODO(zmo): Add tests for CompressedTex* functions.
  346. TEST_F(ES3MapBufferRangeTest, TransformFeedback) {
  347. if (ShouldSkipTest())
  348. return;
  349. GLuint transform_feedback = 0;
  350. glGenTransformFeedbacks(1, &transform_feedback);
  351. glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transform_feedback);
  352. GLTestHelper::CheckGLError("no errors", __LINE__);
  353. GLuint transform_feedback_buffer[2];
  354. glGenBuffers(2, transform_feedback_buffer);
  355. EXPECT_LT(0u, transform_feedback_buffer[0]);
  356. EXPECT_LT(0u, transform_feedback_buffer[1]);
  357. glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0,
  358. transform_feedback_buffer[0]);
  359. glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 3 * 6 * sizeof(float), 0,
  360. GL_STATIC_READ);
  361. glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1,
  362. transform_feedback_buffer[1]);
  363. glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 2 * 6 * sizeof(float), 0,
  364. GL_STATIC_READ);
  365. GLTestHelper::CheckGLError("no errors", __LINE__);
  366. GLint position_loc = 0;
  367. SetupTransformFeedbackProgram(&position_loc);
  368. GLTestHelper::CheckGLError("no errors", __LINE__);
  369. GLuint buffer = GLTestHelper::SetupUnitQuad(position_loc);
  370. GLTestHelper::CheckGLError("no errors", __LINE__);
  371. EXPECT_LT(0u, buffer);
  372. glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
  373. GLTestHelper::CheckGLError("no errors", __LINE__);
  374. glBeginTransformFeedback(GL_TRIANGLES);
  375. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  376. glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
  377. GLTestHelper::CheckGLError("no errors", __LINE__);
  378. glBeginTransformFeedback(GL_TRIANGLES);
  379. GLTestHelper::CheckGLError("no errors", __LINE__);
  380. glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
  381. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  382. // Bind the used buffer to another binding target and try to map it using
  383. // that target - should still fail.
  384. glBindBuffer(GL_PIXEL_PACK_BUFFER, transform_feedback_buffer[0]);
  385. GLTestHelper::CheckGLError("no errors", __LINE__);
  386. glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 6, GL_MAP_READ_BIT);
  387. EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
  388. glEndTransformFeedback();
  389. GLTestHelper::CheckGLError("no errors", __LINE__);
  390. glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
  391. GLTestHelper::CheckGLError("no errors", __LINE__);
  392. glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
  393. GLTestHelper::CheckGLError("no errors", __LINE__);
  394. }
  395. TEST_F(ES3MapBufferRangeTest, GetBufferParameteriv) {
  396. if (ShouldSkipTest())
  397. return;
  398. GLuint buffer;
  399. glGenBuffers(1, &buffer);
  400. EXPECT_LT(0u, buffer);
  401. glBindBuffer(GL_ARRAY_BUFFER, buffer);
  402. glBufferData(GL_ARRAY_BUFFER, 64, 0, GL_STATIC_READ);
  403. GLbitfield access = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT;
  404. glMapBufferRange(GL_ARRAY_BUFFER, 16, 32, access);
  405. GLint param = 0;
  406. glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_ACCESS_FLAGS, &param);
  407. EXPECT_EQ(access, static_cast<GLbitfield>(param));
  408. glUnmapBuffer(GL_ARRAY_BUFFER);
  409. param = 0;
  410. glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_ACCESS_FLAGS, &param);
  411. EXPECT_EQ(0u, static_cast<GLbitfield>(param));
  412. GLTestHelper::CheckGLError("no errors", __LINE__);
  413. }
  414. TEST_F(ES3MapBufferRangeTest, CopyBufferSubData) {
  415. if (ShouldSkipTest())
  416. return;
  417. const GLsizeiptr kSize = 64;
  418. const GLsizeiptr kHalfSize = kSize / 2;
  419. const GLintptr kReadOffset = 0;
  420. const GLintptr kWriteOffset = kHalfSize;
  421. const GLsizeiptr kCopySize = 5;
  422. const uint8_t kValue0 = 3;
  423. const uint8_t kValue1 = 21;
  424. GLuint buffer;
  425. glGenBuffers(1, &buffer);
  426. EXPECT_NE(0u, buffer);
  427. glBindBuffer(GL_ARRAY_BUFFER, buffer);
  428. glBufferData(GL_ARRAY_BUFFER, kSize, nullptr, GL_STREAM_DRAW);
  429. std::array<uint8_t, kHalfSize> data0;
  430. data0.fill(kValue0);
  431. glBufferSubData(GL_ARRAY_BUFFER, 0, kHalfSize, data0.data());
  432. std::array<uint8_t, kHalfSize> data1;
  433. data1.fill(kValue1);
  434. glBufferSubData(GL_ARRAY_BUFFER, kHalfSize, kHalfSize, data1.data());
  435. GLTestHelper::CheckGLError("no errors", __LINE__);
  436. // Verify the data is initialized.
  437. const uint8_t* map_ptr = static_cast<uint8_t*>(
  438. glMapBufferRange(GL_ARRAY_BUFFER, 0, kSize, GL_MAP_READ_BIT));
  439. ASSERT_NE(nullptr, map_ptr);
  440. EXPECT_EQ(0, memcmp(map_ptr, data0.data(), kHalfSize));
  441. EXPECT_EQ(0, memcmp(map_ptr + kHalfSize, data1.data(), kHalfSize));
  442. glUnmapBuffer(GL_ARRAY_BUFFER);
  443. glCopyBufferSubData(GL_ARRAY_BUFFER, GL_ARRAY_BUFFER, kReadOffset,
  444. kWriteOffset, kCopySize);
  445. GLTestHelper::CheckGLError("no errors", __LINE__);
  446. // Verify the data is copied.
  447. map_ptr = static_cast<uint8_t*>(
  448. glMapBufferRange(GL_ARRAY_BUFFER, 0, kSize, GL_MAP_READ_BIT));
  449. ASSERT_NE(nullptr, map_ptr);
  450. for (GLsizeiptr ii = 0; ii < kHalfSize; ++ii) {
  451. EXPECT_EQ(kValue0, map_ptr[ii]);
  452. }
  453. for (GLsizeiptr ii = kHalfSize; ii < kSize; ++ii) {
  454. if (ii >= kWriteOffset && ii < kWriteOffset + kCopySize) {
  455. EXPECT_EQ(kValue0, map_ptr[ii]);
  456. } else {
  457. EXPECT_EQ(kValue1, map_ptr[ii]);
  458. }
  459. }
  460. }
  461. TEST_F(ES3MapBufferRangeTest, Delete) {
  462. // Test that we can unbind a mapped buffer and deleting it still unmaps it.
  463. if (ShouldSkipTest())
  464. return;
  465. const int kNumBuffers = 3;
  466. const int kSize = sizeof(GLuint);
  467. GLuint buffers[kNumBuffers];
  468. glGenBuffers(kNumBuffers, buffers);
  469. // Set each buffer to contain its name.
  470. for (int i = 0; i < kNumBuffers; ++i) {
  471. EXPECT_NE(0u, buffers[i]);
  472. glBindBuffer(GL_ARRAY_BUFFER, buffers[i]);
  473. glBufferData(GL_ARRAY_BUFFER, sizeof(GLuint), &buffers[i], GL_STREAM_DRAW);
  474. glBindBuffer(GL_ARRAY_BUFFER, 0);
  475. }
  476. GLTestHelper::CheckGLError("no errors", __LINE__);
  477. glBindBuffer(GL_ARRAY_BUFFER, buffers[2]);
  478. // Use a different binding point to map the buffer than we originally used,
  479. // to test if we are improperly using Buffer::initial_target() anywhere.
  480. glBindBuffer(GL_COPY_READ_BUFFER, buffers[0]);
  481. const GLuint* map_ptr_0 = static_cast<GLuint*>(
  482. glMapBufferRange(GL_COPY_READ_BUFFER, 0, kSize, GL_MAP_READ_BIT));
  483. ASSERT_NE(nullptr, map_ptr_0);
  484. EXPECT_EQ(buffers[0], *map_ptr_0);
  485. glBindBuffer(GL_COPY_READ_BUFFER, buffers[1]);
  486. // The buffer is no longer bound. Delete it.
  487. glDeleteBuffers(1, &buffers[0]);
  488. GLint copy_read_buffer = 0;
  489. glGetIntegerv(GL_COPY_READ_BUFFER_BINDING, &copy_read_buffer);
  490. EXPECT_EQ(copy_read_buffer, (GLint)buffers[1]);
  491. GLint array_buffer = 0;
  492. glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &array_buffer);
  493. EXPECT_EQ(array_buffer, (GLint)buffers[2]);
  494. // Make sure buffers[1] [2] are truly still bound by mapping them and
  495. // checking the contents.
  496. const GLuint* map_ptr_1 = static_cast<GLuint*>(
  497. glMapBufferRange(GL_COPY_READ_BUFFER, 0, kSize, GL_MAP_READ_BIT));
  498. ASSERT_NE(nullptr, map_ptr_1);
  499. EXPECT_EQ(buffers[1], *map_ptr_1);
  500. glUnmapBuffer(GL_COPY_READ_BUFFER);
  501. const GLuint* map_ptr_2 = static_cast<GLuint*>(
  502. glMapBufferRange(GL_ARRAY_BUFFER, 0, kSize, GL_MAP_READ_BIT));
  503. ASSERT_NE(nullptr, map_ptr_2);
  504. EXPECT_EQ(buffers[2], *map_ptr_2);
  505. glUnmapBuffer(GL_ARRAY_BUFFER);
  506. GLTestHelper::CheckGLError("no errors", __LINE__);
  507. }
  508. // TODO(zmo): add tests for uniform buffer mapping.
  509. } // namespace gpu