Avi Drissman | 05dfbc82 | 2022-09-13 21:25:34 | [diff] [blame] | 1 | // Copyright 2012 The Chromium Authors |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Arthur Sonzogni | 720f1c95 | 2024-07-25 16:17:51 | [diff] [blame] | 5 | #ifdef UNSAFE_BUFFERS_BUILD |
| 6 | // TODO(crbug.com/40285824): Remove this and convert code to safer constructs. |
| 7 | #pragma allow_unsafe_buffers |
| 8 | #endif |
| 9 | |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 10 | #include "gpu/command_buffer/service/test_helper.h" |
thakis@chromium.org | a36c7b41 | 2010-10-14 21:17:06 | [diff] [blame] | 11 | |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 12 | #include <stddef.h> |
| 13 | #include <stdint.h> |
| 14 | |
dmurph@chromium.org | 65dfc60 | 2012-07-23 20:39:39 | [diff] [blame] | 15 | #include <algorithm> |
Kalvin Lee | 9e2c2e8 | 2025-04-16 22:37:42 | [diff] [blame] | 16 | #include <array> |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 17 | #include <cstdint> |
brettw@chromium.org | f4ebe77 | 2013-02-02 00:21:39 | [diff] [blame] | 18 | #include <string> |
dmurph@chromium.org | 65dfc60 | 2012-07-23 20:39:39 | [diff] [blame] | 19 | |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 20 | #include "base/containers/span.h" |
| 21 | #include "base/numerics/safe_conversions.h" |
zmo@chromium.org | 185de2a | 2013-04-04 22:57:11 | [diff] [blame] | 22 | #include "base/strings/string_number_conversions.h" |
Sunny Sachanandani | eb4c2a9 | 2021-06-04 23:00:38 | [diff] [blame] | 23 | #include "build/build_config.h" |
gman@chromium.org | 17cfbe0e | 2013-03-07 01:26:08 | [diff] [blame] | 24 | #include "gpu/command_buffer/service/buffer_manager.h" |
kloveless@chromium.org | d3eba34 | 2013-04-18 21:11:50 | [diff] [blame] | 25 | #include "gpu/command_buffer/service/error_state_mock.h" |
kkinnunen | c8b449e158 | 2015-11-02 07:57:51 | [diff] [blame] | 26 | #include "gpu/command_buffer/service/feature_info.h" |
bulach@chromium.org | 61eeb33f | 2011-07-26 15:30:31 | [diff] [blame] | 27 | #include "gpu/command_buffer/service/gl_utils.h" |
zmo@chromium.org | 185de2a | 2013-04-04 22:57:11 | [diff] [blame] | 28 | #include "gpu/command_buffer/service/gpu_switches.h" |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 29 | #include "gpu/command_buffer/service/mocks.h" |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 30 | #include "gpu/command_buffer/service/program_manager.h" |
gman@chromium.org | 02965c2 | 2013-03-09 02:40:07 | [diff] [blame] | 31 | #include "gpu/command_buffer/service/texture_manager.h" |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 32 | #include "testing/gtest/include/gtest/gtest.h" |
gman@chromium.org | e16b025 | 2012-12-07 09:07:49 | [diff] [blame] | 33 | #include "ui/gl/gl_mock.h" |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 34 | #include "ui/gl/gl_version_info.h" |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 35 | |
| 36 | using ::testing::_; |
| 37 | using ::testing::DoAll; |
| 38 | using ::testing::InSequence; |
| 39 | using ::testing::MatcherCast; |
| 40 | using ::testing::Pointee; |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 41 | using ::testing::NotNull; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 42 | using ::testing::Return; |
| 43 | using ::testing::SetArrayArgument; |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 44 | using ::testing::SetArgPointee; |
kainino | 803bcd7b | 2016-08-31 02:52:29 | [diff] [blame] | 45 | using ::testing::SetArgPointee; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 46 | using ::testing::StrEq; |
| 47 | using ::testing::StrictMock; |
| 48 | |
| 49 | namespace gpu { |
| 50 | namespace gles2 { |
| 51 | |
zmo | 88043c08 | 2014-10-09 20:38:55 | [diff] [blame] | 52 | namespace { |
| 53 | |
| 54 | template<typename T> |
| 55 | T ConstructShaderVariable( |
| 56 | GLenum type, GLint array_size, GLenum precision, |
| 57 | bool static_use, const std::string& name) { |
| 58 | T var; |
| 59 | var.type = type; |
Olli Etuaho | 263298eb | 2017-10-19 20:06:18 | [diff] [blame] | 60 | var.setArraySize(array_size); |
zmo | 88043c08 | 2014-10-09 20:38:55 | [diff] [blame] | 61 | var.precision = precision; |
| 62 | var.staticUse = static_use; |
| 63 | var.name = name; |
| 64 | var.mappedName = name; // No name hashing. |
| 65 | return var; |
| 66 | } |
| 67 | |
| 68 | } // namespace anonymous |
| 69 | |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 70 | // GCC requires these declarations, but MSVC requires they not be present |
| 71 | #ifndef COMPILER_MSVC |
| 72 | const GLuint TestHelper::kServiceBlackTexture2dId; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 73 | const GLuint TestHelper::kServiceDefaultTexture2dId; |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 74 | const GLuint TestHelper::kServiceBlackTexture3dId; |
| 75 | const GLuint TestHelper::kServiceDefaultTexture3dId; |
| 76 | const GLuint TestHelper::kServiceBlackTexture2dArrayId; |
| 77 | const GLuint TestHelper::kServiceDefaultTexture2dArrayId; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 78 | const GLuint TestHelper::kServiceBlackTextureCubemapId; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 79 | const GLuint TestHelper::kServiceDefaultTextureCubemapId; |
bulach@chromium.org | 61eeb33f | 2011-07-26 15:30:31 | [diff] [blame] | 80 | const GLuint TestHelper::kServiceBlackExternalTextureId; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 81 | const GLuint TestHelper::kServiceDefaultExternalTextureId; |
| 82 | const GLuint TestHelper::kServiceBlackRectangleTextureId; |
| 83 | const GLuint TestHelper::kServiceDefaultRectangleTextureId; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 84 | |
gman@chromium.org | 84afefa | 2011-10-19 21:45:53 | [diff] [blame] | 85 | const GLint TestHelper::kMaxSamples; |
gman@chromium.org | 5094b0f | 2010-11-09 19:45:24 | [diff] [blame] | 86 | const GLint TestHelper::kMaxRenderbufferSize; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 87 | const GLint TestHelper::kMaxTextureSize; |
| 88 | const GLint TestHelper::kMaxCubeMapTextureSize; |
sandersd | 9d0bb83 | 2014-12-17 01:24:55 | [diff] [blame] | 89 | const GLint TestHelper::kMaxRectangleTextureSize; |
zmo | ea06a6f | 2015-04-30 01:15:46 | [diff] [blame] | 90 | const GLint TestHelper::kMax3DTextureSize; |
zmo | 9bdab5d | 2016-05-05 04:35:27 | [diff] [blame] | 91 | const GLint TestHelper::kMaxArrayTextureLayers; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 92 | const GLint TestHelper::kNumVertexAttribs; |
| 93 | const GLint TestHelper::kNumTextureUnits; |
| 94 | const GLint TestHelper::kMaxTextureImageUnits; |
| 95 | const GLint TestHelper::kMaxVertexTextureImageUnits; |
| 96 | const GLint TestHelper::kMaxFragmentUniformVectors; |
gman@chromium.org | 915a59a1 | 2010-09-30 21:29:11 | [diff] [blame] | 97 | const GLint TestHelper::kMaxFragmentUniformComponents; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 98 | const GLint TestHelper::kMaxVaryingVectors; |
gman@chromium.org | 915a59a1 | 2010-09-30 21:29:11 | [diff] [blame] | 99 | const GLint TestHelper::kMaxVaryingFloats; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 100 | const GLint TestHelper::kMaxVertexUniformVectors; |
gman@chromium.org | 915a59a1 | 2010-09-30 21:29:11 | [diff] [blame] | 101 | const GLint TestHelper::kMaxVertexUniformComponents; |
cwallez | e96e24b | 2016-03-15 00:18:48 | [diff] [blame] | 102 | const GLint TestHelper::kMaxVertexOutputComponents; |
| 103 | const GLint TestHelper::kMaxFragmentInputComponents; |
| 104 | const GLint TestHelper::kMaxProgramTexelOffset; |
| 105 | const GLint TestHelper::kMinProgramTexelOffset; |
zmo | 706399be | 2016-04-21 00:01:08 | [diff] [blame] | 106 | const GLint TestHelper::kMaxTransformFeedbackSeparateAttribs; |
| 107 | const GLint TestHelper::kMaxUniformBufferBindings; |
| 108 | const GLint TestHelper::kUniformBufferOffsetAlignment; |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 109 | #endif |
| 110 | |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 111 | std::vector<std::string> TestHelper::split_extensions_; |
| 112 | |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 113 | void TestHelper::SetupTextureInitializationExpectations( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 114 | ::gl::MockGLInterface* gl, |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 115 | GLenum target, |
| 116 | bool use_default_textures) { |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 117 | InSequence sequence; |
| 118 | |
| 119 | bool needs_initialization = (target != GL_TEXTURE_EXTERNAL_OES); |
| 120 | bool needs_faces = (target == GL_TEXTURE_CUBE_MAP); |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 121 | bool is_3d_or_2d_array_target = (target == GL_TEXTURE_3D || |
| 122 | target == GL_TEXTURE_2D_ARRAY); |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 123 | |
| 124 | static GLuint texture_2d_ids[] = { |
| 125 | kServiceBlackTexture2dId, |
| 126 | kServiceDefaultTexture2dId }; |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 127 | static GLuint texture_3d_ids[] = { |
| 128 | kServiceBlackTexture3dId, |
| 129 | kServiceDefaultTexture3dId }; |
| 130 | static GLuint texture_2d_array_ids[] = { |
| 131 | kServiceBlackTexture2dArrayId, |
| 132 | kServiceDefaultTexture2dArrayId }; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 133 | static GLuint texture_cube_map_ids[] = { |
| 134 | kServiceBlackTextureCubemapId, |
| 135 | kServiceDefaultTextureCubemapId }; |
| 136 | static GLuint texture_external_oes_ids[] = { |
| 137 | kServiceBlackExternalTextureId, |
| 138 | kServiceDefaultExternalTextureId }; |
| 139 | static GLuint texture_rectangle_arb_ids[] = { |
| 140 | kServiceBlackRectangleTextureId, |
| 141 | kServiceDefaultRectangleTextureId }; |
| 142 | |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 143 | base::span<const GLuint> texture_ids = {}; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 144 | switch (target) { |
| 145 | case GL_TEXTURE_2D: |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 146 | texture_ids = texture_2d_ids; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 147 | break; |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 148 | case GL_TEXTURE_3D: |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 149 | texture_ids = texture_3d_ids; |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 150 | break; |
| 151 | case GL_TEXTURE_2D_ARRAY: |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 152 | texture_ids = texture_2d_array_ids; |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 153 | break; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 154 | case GL_TEXTURE_CUBE_MAP: |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 155 | texture_ids = texture_cube_map_ids; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 156 | break; |
| 157 | case GL_TEXTURE_EXTERNAL_OES: |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 158 | texture_ids = texture_external_oes_ids; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 159 | break; |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 160 | case GL_TEXTURE_RECTANGLE_ANGLE: |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 161 | texture_ids = texture_rectangle_arb_ids; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 162 | break; |
| 163 | default: |
Peter BostrÃļm | a11556e | 2024-10-31 04:49:10 | [diff] [blame] | 164 | NOTREACHED(); |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 165 | } |
| 166 | |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 167 | int array_size = use_default_textures ? 2 : 1; |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 168 | |
| 169 | EXPECT_CALL(*gl, GenTextures(array_size, _)) |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 170 | .WillOnce(SetArrayArgument<1>( |
| 171 | texture_ids.data(), |
| 172 | texture_ids.subspan(base::checked_cast<size_t>(array_size)).data())) |
| 173 | .RetiresOnSaturation(); |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 174 | for (int ii = 0; ii < array_size; ++ii) { |
| 175 | EXPECT_CALL(*gl, BindTexture(target, texture_ids[ii])) |
| 176 | .Times(1) |
| 177 | .RetiresOnSaturation(); |
| 178 | if (needs_initialization) { |
| 179 | if (needs_faces) { |
Kalvin Lee | 9e2c2e8 | 2025-04-16 22:37:42 | [diff] [blame] | 180 | static auto faces = std::to_array<GLenum>({ |
| 181 | GL_TEXTURE_CUBE_MAP_POSITIVE_X, |
| 182 | GL_TEXTURE_CUBE_MAP_NEGATIVE_X, |
| 183 | GL_TEXTURE_CUBE_MAP_POSITIVE_Y, |
| 184 | GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, |
| 185 | GL_TEXTURE_CUBE_MAP_POSITIVE_Z, |
| 186 | GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, |
| 187 | }); |
Daniel Cheng | adafb3a | 2022-02-28 07:38:22 | [diff] [blame] | 188 | for (size_t face = 0; face < std::size(faces); ++face) { |
Peter Kasting | 905a2a9 | 2021-08-24 21:53:34 | [diff] [blame] | 189 | EXPECT_CALL(*gl, TexImage2D(faces[face], 0, GL_RGBA, 1, 1, 0, GL_RGBA, |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 190 | GL_UNSIGNED_BYTE, _)) |
| 191 | .Times(1) |
| 192 | .RetiresOnSaturation(); |
| 193 | } |
| 194 | } else { |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 195 | if (is_3d_or_2d_array_target) { |
| 196 | EXPECT_CALL(*gl, TexImage3D(target, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, |
| 197 | GL_UNSIGNED_BYTE, _)) |
| 198 | .Times(1) |
| 199 | .RetiresOnSaturation(); |
| 200 | } else { |
| 201 | EXPECT_CALL(*gl, TexImage2D(target, 0, GL_RGBA, 1, 1, 0, GL_RGBA, |
| 202 | GL_UNSIGNED_BYTE, _)) |
| 203 | .Times(1) |
| 204 | .RetiresOnSaturation(); |
| 205 | } |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 206 | } |
| 207 | } |
| 208 | } |
| 209 | EXPECT_CALL(*gl, BindTexture(target, 0)) |
| 210 | .Times(1) |
| 211 | .RetiresOnSaturation(); |
| 212 | } |
| 213 | |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 214 | void TestHelper::SetupTextureManagerInitExpectations( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 215 | ::gl::MockGLInterface* gl, |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 216 | bool is_es3_enabled, |
qiankun.miao | 17ad0f1c | 2016-09-09 20:14:05 | [diff] [blame] | 217 | bool is_es3_capable, |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 218 | const gfx::ExtensionSet& extensions, |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 219 | bool use_default_textures) { |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 220 | InSequence sequence; |
| 221 | |
qiankun.miao | 17ad0f1c | 2016-09-09 20:14:05 | [diff] [blame] | 222 | if (is_es3_capable) { |
| 223 | EXPECT_CALL(*gl, BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0)) |
| 224 | .Times(1) |
| 225 | .RetiresOnSaturation(); |
| 226 | } |
| 227 | |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 228 | SetupTextureInitializationExpectations( |
| 229 | gl, GL_TEXTURE_2D, use_default_textures); |
| 230 | SetupTextureInitializationExpectations( |
| 231 | gl, GL_TEXTURE_CUBE_MAP, use_default_textures); |
bulach@chromium.org | 61eeb33f | 2011-07-26 15:30:31 | [diff] [blame] | 232 | |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 233 | if (is_es3_enabled) { |
| 234 | SetupTextureInitializationExpectations( |
| 235 | gl, GL_TEXTURE_3D, use_default_textures); |
| 236 | SetupTextureInitializationExpectations( |
| 237 | gl, GL_TEXTURE_2D_ARRAY, use_default_textures); |
| 238 | } |
| 239 | |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 240 | bool ext_image_external = |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 241 | gfx::HasExtension(extensions, "GL_OES_EGL_image_external"); |
Zhenyao Mo | cdfc4cc | 2024-07-03 18:15:26 | [diff] [blame] | 242 | bool angle_texture_rectangle = |
| 243 | gfx::HasExtension(extensions, "GL_ANGLE_texture_rectangle"); |
bulach@chromium.org | 61eeb33f | 2011-07-26 15:30:31 | [diff] [blame] | 244 | |
| 245 | if (ext_image_external) { |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 246 | SetupTextureInitializationExpectations( |
| 247 | gl, GL_TEXTURE_EXTERNAL_OES, use_default_textures); |
kbr@chromium.org | e51bdf3 | 2011-11-23 22:21:46 | [diff] [blame] | 248 | } |
Zhenyao Mo | cdfc4cc | 2024-07-03 18:15:26 | [diff] [blame] | 249 | if (angle_texture_rectangle) { |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 250 | SetupTextureInitializationExpectations(gl, GL_TEXTURE_RECTANGLE_ANGLE, |
| 251 | use_default_textures); |
bulach@chromium.org | 61eeb33f | 2011-07-26 15:30:31 | [diff] [blame] | 252 | } |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 253 | } |
| 254 | |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 255 | void TestHelper::SetupTextureDestructionExpectations( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 256 | ::gl::MockGLInterface* gl, |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 257 | GLenum target, |
| 258 | bool use_default_textures) { |
| 259 | if (!use_default_textures) |
| 260 | return; |
| 261 | |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 262 | GLuint texture_id = 0; |
| 263 | switch (target) { |
| 264 | case GL_TEXTURE_2D: |
| 265 | texture_id = kServiceDefaultTexture2dId; |
| 266 | break; |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 267 | case GL_TEXTURE_3D: |
| 268 | texture_id = kServiceDefaultTexture3dId; |
| 269 | break; |
| 270 | case GL_TEXTURE_2D_ARRAY: |
| 271 | texture_id = kServiceDefaultTexture2dArrayId; |
| 272 | break; |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 273 | case GL_TEXTURE_CUBE_MAP: |
| 274 | texture_id = kServiceDefaultTextureCubemapId; |
| 275 | break; |
| 276 | case GL_TEXTURE_EXTERNAL_OES: |
| 277 | texture_id = kServiceDefaultExternalTextureId; |
| 278 | break; |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 279 | case GL_TEXTURE_RECTANGLE_ANGLE: |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 280 | texture_id = kServiceDefaultRectangleTextureId; |
| 281 | break; |
| 282 | default: |
Peter BostrÃļm | a11556e | 2024-10-31 04:49:10 | [diff] [blame] | 283 | NOTREACHED(); |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 284 | } |
| 285 | |
| 286 | EXPECT_CALL(*gl, DeleteTextures(1, Pointee(texture_id))) |
| 287 | .Times(1) |
| 288 | .RetiresOnSaturation(); |
| 289 | } |
| 290 | |
| 291 | void TestHelper::SetupTextureManagerDestructionExpectations( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 292 | ::gl::MockGLInterface* gl, |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 293 | bool is_es3_enabled, |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 294 | const gfx::ExtensionSet& extensions, |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 295 | bool use_default_textures) { |
| 296 | SetupTextureDestructionExpectations(gl, GL_TEXTURE_2D, use_default_textures); |
| 297 | SetupTextureDestructionExpectations( |
| 298 | gl, GL_TEXTURE_CUBE_MAP, use_default_textures); |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 299 | |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 300 | if (is_es3_enabled) { |
| 301 | SetupTextureDestructionExpectations( |
| 302 | gl, GL_TEXTURE_3D, use_default_textures); |
| 303 | SetupTextureDestructionExpectations( |
| 304 | gl, GL_TEXTURE_2D_ARRAY,use_default_textures); |
| 305 | } |
| 306 | |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 307 | bool ext_image_external = |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 308 | gfx::HasExtension(extensions, "GL_OES_EGL_image_external"); |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 309 | bool angle_texture_rectangle = |
| 310 | gfx::HasExtension(extensions, "GL_ANGLE_texture_rectangle"); |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 311 | |
| 312 | if (ext_image_external) { |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 313 | SetupTextureDestructionExpectations( |
| 314 | gl, GL_TEXTURE_EXTERNAL_OES, use_default_textures); |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 315 | } |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 316 | if (angle_texture_rectangle) { |
| 317 | SetupTextureDestructionExpectations(gl, GL_TEXTURE_RECTANGLE_ANGLE, |
| 318 | use_default_textures); |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 319 | } |
| 320 | |
qiankun.miao | 4e2f0d0 | 2015-09-18 03:34:48 | [diff] [blame] | 321 | EXPECT_CALL(*gl, DeleteTextures(TextureManager::kNumDefaultTextures, _)) |
gman@chromium.org | 1075a53 | 2012-06-13 00:52:33 | [diff] [blame] | 322 | .Times(1) |
| 323 | .RetiresOnSaturation(); |
| 324 | } |
| 325 | |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 326 | void TestHelper::SetupContextGroupInitExpectations( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 327 | ::gl::MockGLInterface* gl, |
vmiura@chromium.org | 5ebf59f | 2014-04-08 03:51:57 | [diff] [blame] | 328 | const DisallowedFeatures& disallowed_features, |
| 329 | const char* extensions, |
| 330 | const char* gl_version, |
kylechar | 933c6fc | 2025-09-04 17:29:47 | [diff] [blame] | 331 | ContextType context_type) { |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 332 | InSequence sequence; |
| 333 | |
kainino | e20d23ac | 2016-11-03 01:03:45 | [diff] [blame] | 334 | bool enable_es3 = !(context_type == CONTEXT_TYPE_OPENGLES2 || |
| 335 | context_type == CONTEXT_TYPE_WEBGL1); |
| 336 | |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 337 | gfx::ExtensionSet extension_set(gfx::MakeExtensionSet(extensions)); |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 338 | gl::GLVersionInfo gl_info(gl_version, "", extension_set); |
gman@chromium.org | 915a59a1 | 2010-09-30 21:29:11 | [diff] [blame] | 339 | |
kainino | 803bcd7b | 2016-08-31 02:52:29 | [diff] [blame] | 340 | SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", gl_version, |
kainino | e20d23ac | 2016-11-03 01:03:45 | [diff] [blame] | 341 | context_type); |
gman@chromium.org | 5094b0f | 2010-11-09 19:45:24 | [diff] [blame] | 342 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_RENDERBUFFER_SIZE, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 343 | .WillOnce(SetArgPointee<1>(kMaxRenderbufferSize)) |
gman@chromium.org | 5094b0f | 2010-11-09 19:45:24 | [diff] [blame] | 344 | .RetiresOnSaturation(); |
Zhenyao Mo | 08f60e83 | 2024-07-09 19:12:23 | [diff] [blame] | 345 | if (gfx::HasExtension(extension_set, "GL_EXT_framebuffer_multisample") || |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 346 | gfx::HasExtension(extension_set, |
| 347 | "GL_EXT_multisampled_render_to_texture") || |
Zhenyao Mo | fadb6156 | 2024-06-17 19:40:58 | [diff] [blame] | 348 | gl_info.is_es3) { |
gman@chromium.org | 84afefa | 2011-10-19 21:45:53 | [diff] [blame] | 349 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_SAMPLES, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 350 | .WillOnce(SetArgPointee<1>(kMaxSamples)) |
gman@chromium.org | 84afefa | 2011-10-19 21:45:53 | [diff] [blame] | 351 | .RetiresOnSaturation(); |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 352 | } else if (gfx::HasExtension(extension_set, |
| 353 | "GL_IMG_multisampled_render_to_texture")) { |
sievers@chromium.org | 49cabed | 2013-11-13 18:15:18 | [diff] [blame] | 354 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_SAMPLES_IMG, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 355 | .WillOnce(SetArgPointee<1>(kMaxSamples)) |
sievers@chromium.org | 49cabed | 2013-11-13 18:15:18 | [diff] [blame] | 356 | .RetiresOnSaturation(); |
gman@chromium.org | 84afefa | 2011-10-19 21:45:53 | [diff] [blame] | 357 | } |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 358 | |
kainino | 313016a | 2017-02-17 19:55:22 | [diff] [blame] | 359 | if (enable_es3 || |
| 360 | (!enable_es3 && |
Zhenyao Mo | fadb6156 | 2024-06-17 19:40:58 | [diff] [blame] | 361 | (gfx::HasExtension(extension_set, "GL_EXT_draw_buffers") || |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 362 | (gl_info.is_es3 && |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 363 | gfx::HasExtension(extension_set, "GL_NV_draw_buffers"))))) { |
cwallez | dc1c9eb | 2016-05-26 03:11:56 | [diff] [blame] | 364 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 365 | .WillOnce(SetArgPointee<1>(8)) |
cwallez | dc1c9eb | 2016-05-26 03:11:56 | [diff] [blame] | 366 | .RetiresOnSaturation(); |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 367 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_DRAW_BUFFERS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 368 | .WillOnce(SetArgPointee<1>(8)) |
cwallez | dc1c9eb | 2016-05-26 03:11:56 | [diff] [blame] | 369 | .RetiresOnSaturation(); |
| 370 | } |
| 371 | |
Zhenyao Mo | e531bb32 | 2024-07-09 17:34:02 | [diff] [blame] | 372 | if (gfx::HasExtension(extension_set, "GL_EXT_blend_func_extended")) { |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 373 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 374 | .WillOnce(SetArgPointee<1>(8)) |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 375 | .RetiresOnSaturation(); |
| 376 | } |
| 377 | |
Zhenyao Mo | f302828 | 2024-07-03 17:31:43 | [diff] [blame] | 378 | if (gl_info.IsAtLeastGLES(3, 0)) { |
zmo | 706399be | 2016-04-21 00:01:08 | [diff] [blame] | 379 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 380 | .WillOnce(SetArgPointee<1>(kMaxTransformFeedbackSeparateAttribs)) |
zmo | 706399be | 2016-04-21 00:01:08 | [diff] [blame] | 381 | .RetiresOnSaturation(); |
| 382 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 383 | .WillOnce(SetArgPointee<1>(kMaxUniformBufferBindings)) |
zmo | 706399be | 2016-04-21 00:01:08 | [diff] [blame] | 384 | .RetiresOnSaturation(); |
| 385 | EXPECT_CALL(*gl, GetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 386 | .WillOnce(SetArgPointee<1>(kUniformBufferOffsetAlignment)) |
zmo | 706399be | 2016-04-21 00:01:08 | [diff] [blame] | 387 | .RetiresOnSaturation(); |
| 388 | } |
| 389 | |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 390 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 391 | .WillOnce(SetArgPointee<1>(kNumVertexAttribs)) |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 392 | .RetiresOnSaturation(); |
| 393 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 394 | .WillOnce(SetArgPointee<1>(kNumTextureUnits)) |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 395 | .RetiresOnSaturation(); |
| 396 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_TEXTURE_SIZE, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 397 | .WillOnce(SetArgPointee<1>(kMaxTextureSize)) |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 398 | .RetiresOnSaturation(); |
| 399 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 400 | .WillOnce(SetArgPointee<1>(kMaxCubeMapTextureSize)) |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 401 | .RetiresOnSaturation(); |
Zhenyao Mo | f302828 | 2024-07-03 17:31:43 | [diff] [blame] | 402 | if (gl_info.IsAtLeastGLES(3, 0)) { |
zmo | ea06a6f | 2015-04-30 01:15:46 | [diff] [blame] | 403 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_3D_TEXTURE_SIZE, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 404 | .WillOnce(SetArgPointee<1>(kMax3DTextureSize)) |
zmo | ea06a6f | 2015-04-30 01:15:46 | [diff] [blame] | 405 | .RetiresOnSaturation(); |
| 406 | } |
Zhenyao Mo | f302828 | 2024-07-03 17:31:43 | [diff] [blame] | 407 | if (gl_info.IsAtLeastGLES(3, 0)) { |
zmo | 9bdab5d | 2016-05-05 04:35:27 | [diff] [blame] | 408 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 409 | .WillOnce(SetArgPointee<1>(kMaxArrayTextureLayers)) |
zmo | 9bdab5d | 2016-05-05 04:35:27 | [diff] [blame] | 410 | .RetiresOnSaturation(); |
| 411 | } |
Zhenyao Mo | cdfc4cc | 2024-07-03 18:15:26 | [diff] [blame] | 412 | if (gfx::HasExtension(extension_set, "GL_ANGLE_texture_rectangle")) { |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 413 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 414 | .WillOnce(SetArgPointee<1>(kMaxRectangleTextureSize)) |
sandersd | 9d0bb83 | 2014-12-17 01:24:55 | [diff] [blame] | 415 | .RetiresOnSaturation(); |
| 416 | } |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 417 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 418 | .WillOnce(SetArgPointee<1>(kMaxTextureImageUnits)) |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 419 | .RetiresOnSaturation(); |
| 420 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 421 | .WillOnce(SetArgPointee<1>(kMaxVertexTextureImageUnits)) |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 422 | .RetiresOnSaturation(); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 423 | |
Zhenyao Mo | 4dff3bd9 | 2024-06-28 15:21:04 | [diff] [blame] | 424 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, _)) |
| 425 | .WillOnce(SetArgPointee<1>(kMaxFragmentUniformVectors)) |
| 426 | .RetiresOnSaturation(); |
| 427 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VARYING_VECTORS, _)) |
| 428 | .WillOnce(SetArgPointee<1>(kMaxVaryingVectors)) |
| 429 | .RetiresOnSaturation(); |
| 430 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, _)) |
| 431 | .WillOnce(SetArgPointee<1>(kMaxVertexUniformVectors)) |
| 432 | .RetiresOnSaturation(); |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 433 | |
cwallez | e96e24b | 2016-03-15 00:18:48 | [diff] [blame] | 434 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_VERTEX_OUTPUT_COMPONENTS, _)) |
| 435 | .Times(testing::Between(0, 1)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 436 | .WillRepeatedly(SetArgPointee<1>(kMaxVertexOutputComponents)) |
cwallez | e96e24b | 2016-03-15 00:18:48 | [diff] [blame] | 437 | .RetiresOnSaturation(); |
| 438 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_FRAGMENT_INPUT_COMPONENTS, _)) |
| 439 | .Times(testing::Between(0, 1)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 440 | .WillRepeatedly(SetArgPointee<1>(kMaxFragmentInputComponents)) |
cwallez | e96e24b | 2016-03-15 00:18:48 | [diff] [blame] | 441 | .RetiresOnSaturation(); |
| 442 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_PROGRAM_TEXEL_OFFSET, _)) |
| 443 | .Times(testing::Between(0, 1)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 444 | .WillRepeatedly(SetArgPointee<1>(kMaxProgramTexelOffset)) |
cwallez | e96e24b | 2016-03-15 00:18:48 | [diff] [blame] | 445 | .RetiresOnSaturation(); |
| 446 | EXPECT_CALL(*gl, GetIntegerv(GL_MIN_PROGRAM_TEXEL_OFFSET, _)) |
| 447 | .Times(testing::Between(0, 1)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 448 | .WillRepeatedly(SetArgPointee<1>(kMinProgramTexelOffset)) |
cwallez | e96e24b | 2016-03-15 00:18:48 | [diff] [blame] | 449 | .RetiresOnSaturation(); |
| 450 | |
kylechar | 933c6fc | 2025-09-04 17:29:47 | [diff] [blame] | 451 | bool use_default_textures = false; |
Zhenyao Mo | f302828 | 2024-07-03 17:31:43 | [diff] [blame] | 452 | SetupTextureManagerInitExpectations(gl, enable_es3, |
| 453 | gl_info.IsAtLeastGLES(3, 0), |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 454 | extension_set, use_default_textures); |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 455 | } |
| 456 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 457 | void TestHelper::SetupFeatureInfoInitExpectations(::gl::MockGLInterface* gl, |
| 458 | const char* extensions) { |
Zhenyao Mo | 13081744 | 2024-07-10 20:41:09 | [diff] [blame] | 459 | SetupFeatureInfoInitExpectationsWithGLVersion( |
| 460 | gl, extensions, "ANGLE", "OpenGL ES 2.0", CONTEXT_TYPE_OPENGLES2); |
gman@chromium.org | 5c67c703 | 2012-05-15 18:21:22 | [diff] [blame] | 461 | } |
| 462 | |
zmo@chromium.org | 185de2a | 2013-04-04 22:57:11 | [diff] [blame] | 463 | void TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 464 | ::gl::MockGLInterface* gl, |
| 465 | const char* extensions, |
| 466 | const char* gl_renderer, |
| 467 | const char* gl_version, |
kainino | e20d23ac | 2016-11-03 01:03:45 | [diff] [blame] | 468 | ContextType context_type) { |
gman@chromium.org | 915a59a1 | 2010-09-30 21:29:11 | [diff] [blame] | 469 | InSequence sequence; |
| 470 | |
kainino | e20d23ac | 2016-11-03 01:03:45 | [diff] [blame] | 471 | bool enable_es3 = context_type == CONTEXT_TYPE_WEBGL2 || |
| 472 | context_type == CONTEXT_TYPE_OPENGLES3; |
| 473 | |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 474 | gfx::ExtensionSet extension_set(gfx::MakeExtensionSet(extensions)); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 475 | // Persistent storage is needed for the split extension string. |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 476 | split_extensions_ = |
| 477 | std::vector<std::string>(extension_set.begin(), extension_set.end()); |
| 478 | gl::GLVersionInfo gl_info(gl_version, gl_renderer, extension_set); |
Zhenyao Mo | 08f60e83 | 2024-07-09 19:12:23 | [diff] [blame] | 479 | EXPECT_CALL(*gl, GetString(GL_EXTENSIONS)) |
| 480 | .WillOnce(Return(reinterpret_cast<const uint8_t*>(extensions))) |
| 481 | .RetiresOnSaturation(); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 482 | |
kbr | 53edb99 | 2015-08-06 01:16:29 | [diff] [blame] | 483 | EXPECT_CALL(*gl, GetString(GL_VERSION)) |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 484 | .WillOnce(Return(reinterpret_cast<const uint8_t*>(gl_version))) |
kbr | 53edb99 | 2015-08-06 01:16:29 | [diff] [blame] | 485 | .RetiresOnSaturation(); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 486 | EXPECT_CALL(*gl, GetString(GL_RENDERER)) |
avi | f15d60a | 2015-12-21 17:06:33 | [diff] [blame] | 487 | .WillOnce(Return(reinterpret_cast<const uint8_t*>(gl_renderer))) |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 488 | .RetiresOnSaturation(); |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 489 | |
Zhenyao Mo | fadb6156 | 2024-06-17 19:40:58 | [diff] [blame] | 490 | if (gl_info.is_es3 || |
Antoine Labour | ae9d975a | 2018-11-17 00:47:45 | [diff] [blame] | 491 | gfx::HasExtension(extension_set, "GL_ARB_pixel_buffer_object") || |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 492 | gfx::HasExtension(extension_set, "GL_NV_pixel_buffer_object")) { |
kainino | 803bcd7b | 2016-08-31 02:52:29 | [diff] [blame] | 493 | EXPECT_CALL(*gl, GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, _)) |
| 494 | .WillOnce(SetArgPointee<1>(0)) |
| 495 | .RetiresOnSaturation(); |
| 496 | } |
| 497 | |
Zhenyao Mo | fadb6156 | 2024-06-17 19:40:58 | [diff] [blame] | 498 | if (gfx::HasExtension(extension_set, "GL_ARB_texture_float") || |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 499 | (gl_info.is_es3 && |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 500 | gfx::HasExtension(extension_set, "GL_OES_texture_float") && |
| 501 | gfx::HasExtension(extension_set, "GL_EXT_color_buffer_float"))) { |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 502 | static const auto tx_ids = std::to_array<GLuint>({101, 102}); |
| 503 | static const auto fb_ids = std::to_array<GLuint>({103, 104}); |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 504 | const GLsizei width = 16; |
| 505 | EXPECT_CALL(*gl, GetIntegerv(GL_FRAMEBUFFER_BINDING, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 506 | .WillOnce(SetArgPointee<1>(fb_ids[0])) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 507 | .RetiresOnSaturation(); |
| 508 | EXPECT_CALL(*gl, GetIntegerv(GL_TEXTURE_BINDING_2D, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 509 | .WillOnce(SetArgPointee<1>(tx_ids[0])) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 510 | .RetiresOnSaturation(); |
| 511 | EXPECT_CALL(*gl, GenTextures(1, _)) |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 512 | .WillOnce(SetArrayArgument<1>( |
| 513 | base::span<const GLuint>(tx_ids).subspan(1u).data(), |
| 514 | base::span<const GLuint>(tx_ids).subspan(2u).data())) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 515 | .RetiresOnSaturation(); |
| 516 | EXPECT_CALL(*gl, GenFramebuffersEXT(1, _)) |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 517 | .WillOnce(SetArrayArgument<1>( |
| 518 | base::span<const GLuint>(fb_ids).subspan(1u).data(), |
| 519 | base::span<const GLuint>(fb_ids).subspan(2u).data())) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 520 | .RetiresOnSaturation(); |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 521 | EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[1])) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 522 | .Times(1) |
| 523 | .RetiresOnSaturation(); |
| 524 | EXPECT_CALL(*gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, |
| 525 | GL_NEAREST)) |
| 526 | .Times(1) |
| 527 | .RetiresOnSaturation(); |
| 528 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, width, 0, |
| 529 | GL_RGBA, GL_FLOAT, _)) |
| 530 | .Times(1) |
| 531 | .RetiresOnSaturation(); |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 532 | EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[1])) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 533 | .Times(1) |
| 534 | .RetiresOnSaturation(); |
| 535 | EXPECT_CALL(*gl, FramebufferTexture2DEXT(GL_FRAMEBUFFER, |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 536 | GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tx_ids[1], 0)) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 537 | .Times(1) |
| 538 | .RetiresOnSaturation(); |
| 539 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 540 | .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) |
| 541 | .RetiresOnSaturation(); |
qiankun.miao | bd9c658 | 2016-11-03 15:26:55 | [diff] [blame] | 542 | GLenum status_rgba = GL_FRAMEBUFFER_COMPLETE; |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 543 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, width, width, 0, |
| 544 | GL_RGB, GL_FLOAT, _)) |
| 545 | .Times(1) |
| 546 | .RetiresOnSaturation(); |
kbr | c9f0e10c | 2015-03-31 19:49:12 | [diff] [blame] | 547 | if (gl_info.is_es3) { |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 548 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 549 | .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)) |
| 550 | .RetiresOnSaturation(); |
| 551 | } else { |
| 552 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 553 | .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) |
| 554 | .RetiresOnSaturation(); |
kainino | e20d23ac | 2016-11-03 01:03:45 | [diff] [blame] | 555 | } |
bajones | 2c9d718 | 2016-03-11 18:16:28 | [diff] [blame] | 556 | |
kbr | 75c6426 | 2017-02-05 00:34:11 | [diff] [blame] | 557 | if (status_rgba == GL_FRAMEBUFFER_COMPLETE && enable_es3) { |
kainino | e20d23ac | 2016-11-03 01:03:45 | [diff] [blame] | 558 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_R16F, width, width, |
| 559 | 0, GL_RED, GL_FLOAT, _)) |
| 560 | .Times(1) |
| 561 | .RetiresOnSaturation(); |
| 562 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 563 | .Times(1) |
| 564 | .RetiresOnSaturation(); |
| 565 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, width, width, |
| 566 | 0, GL_RG, GL_FLOAT, _)) |
| 567 | .Times(1) |
| 568 | .RetiresOnSaturation(); |
| 569 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 570 | .Times(1) |
| 571 | .RetiresOnSaturation(); |
| 572 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, width, |
| 573 | 0, GL_RGBA, GL_FLOAT, _)) |
| 574 | .Times(1) |
| 575 | .RetiresOnSaturation(); |
| 576 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 577 | .Times(1) |
| 578 | .RetiresOnSaturation(); |
| 579 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_R32F, width, width, |
| 580 | 0, GL_RED, GL_FLOAT, _)) |
| 581 | .Times(1) |
| 582 | .RetiresOnSaturation(); |
| 583 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 584 | .Times(1) |
| 585 | .RetiresOnSaturation(); |
| 586 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RG32F, width, width, |
| 587 | 0, GL_RG, GL_FLOAT, _)) |
| 588 | .Times(1) |
| 589 | .RetiresOnSaturation(); |
| 590 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 591 | .Times(1) |
| 592 | .RetiresOnSaturation(); |
| 593 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_R11F_G11F_B10F, |
| 594 | width, width, 0, GL_RGB, GL_FLOAT, _)) |
| 595 | .Times(1) |
| 596 | .RetiresOnSaturation(); |
| 597 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 598 | .Times(1) |
| 599 | .RetiresOnSaturation(); |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 600 | } |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 601 | if (!enable_es3 && |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 602 | !gfx::HasExtension(extension_set, "GL_EXT_color_buffer_half_float") && |
Zhenyao Mo | e531bb32 | 2024-07-09 17:34:02 | [diff] [blame] | 603 | gl_info.IsAtLeastGLES(3, 0)) { |
Zhenyao Mo | c82b9b9a | 2017-09-26 01:27:03 | [diff] [blame] | 604 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, width, 0, |
| 605 | GL_RGBA, GL_HALF_FLOAT, nullptr)) |
ccameron | 8507215 | 2017-02-24 19:53:23 | [diff] [blame] | 606 | .Times(1) |
| 607 | .RetiresOnSaturation(); |
| 608 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 609 | .Times(1) |
| 610 | .RetiresOnSaturation(); |
| 611 | } |
bajones | 2c9d718 | 2016-03-11 18:16:28 | [diff] [blame] | 612 | |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 613 | EXPECT_CALL(*gl, DeleteFramebuffersEXT(1, _)) |
| 614 | .Times(1) |
| 615 | .RetiresOnSaturation(); |
| 616 | EXPECT_CALL(*gl, DeleteTextures(1, _)) |
| 617 | .Times(1) |
| 618 | .RetiresOnSaturation(); |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 619 | EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[0])) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 620 | .Times(1) |
| 621 | .RetiresOnSaturation(); |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 622 | EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[0])) |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 623 | .Times(1) |
| 624 | .RetiresOnSaturation(); |
danakj | e649f57 | 2015-01-08 23:35:58 | [diff] [blame] | 625 | #if DCHECK_IS_ON() |
wangxianzhu@chromium.org | c02cb801 | 2014-03-14 18:39:53 | [diff] [blame] | 626 | EXPECT_CALL(*gl, GetError()) |
| 627 | .WillOnce(Return(GL_NO_ERROR)) |
| 628 | .RetiresOnSaturation(); |
| 629 | #endif |
oetuaho@nvidia.com | 17a96119 | 2014-02-14 15:20:52 | [diff] [blame] | 630 | } |
oetuaho | 0decd44 | 2014-10-13 08:40:46 | [diff] [blame] | 631 | |
kainino | 313016a | 2017-02-17 19:55:22 | [diff] [blame] | 632 | if (enable_es3 || |
| 633 | (!enable_es3 && |
Zhenyao Mo | fadb6156 | 2024-06-17 19:40:58 | [diff] [blame] | 634 | (gfx::HasExtension(extension_set, "GL_EXT_draw_buffers") || |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 635 | gfx::HasExtension(extension_set, "GL_ARB_draw_buffers") || |
Antoine Labour | 20d1620 | 2017-09-05 23:05:29 | [diff] [blame] | 636 | (gl_info.is_es3 && |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 637 | gfx::HasExtension(extension_set, "GL_NV_draw_buffers"))))) { |
oetuaho | 0decd44 | 2014-10-13 08:40:46 | [diff] [blame] | 638 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 639 | .WillOnce(SetArgPointee<1>(8)) |
oetuaho | 0decd44 | 2014-10-13 08:40:46 | [diff] [blame] | 640 | .RetiresOnSaturation(); |
Geoff Lang | 8fc21cd | 2025-05-26 13:13:29 | [diff] [blame] | 641 | EXPECT_CALL(*gl, GetIntegerv(GL_MAX_DRAW_BUFFERS, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 642 | .WillOnce(SetArgPointee<1>(8)) |
oetuaho | 0decd44 | 2014-10-13 08:40:46 | [diff] [blame] | 643 | .RetiresOnSaturation(); |
| 644 | } |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 645 | |
Kenneth Russell | 47d9ef7 | 2023-07-18 01:17:03 | [diff] [blame] | 646 | // These expectations are for IsGL_REDSupportedOnFBOs(), which is |
| 647 | // skipped universally on macOS, and by default (with a Finch |
| 648 | // kill-switch) on Android. |
| 649 | #if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_ANDROID) |
Zhenyao Mo | fadb6156 | 2024-06-17 19:40:58 | [diff] [blame] | 650 | if (gl_info.is_es3 || gfx::HasExtension(extension_set, "GL_EXT_texture_rg") || |
Michael Spang | be9d9eb | 2018-06-21 20:02:04 | [diff] [blame] | 651 | (gfx::HasExtension(extension_set, "GL_ARB_texture_rg"))) { |
Antoine Labour | 5e48f90 | 2017-11-06 21:46:21 | [diff] [blame] | 652 | #if DCHECK_IS_ON() |
| 653 | EXPECT_CALL(*gl, GetError()) |
| 654 | .WillOnce(Return(GL_NO_ERROR)) |
| 655 | .RetiresOnSaturation(); |
| 656 | #endif |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 657 | static const auto tx_ids = std::to_array<GLuint>({101, 102}); |
| 658 | static const auto fb_ids = std::to_array<GLuint>({103, 104}); |
Kenneth Russell | 734c5f1 | 2023-01-22 19:42:51 | [diff] [blame] | 659 | const GLsizei width = 8; |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 660 | EXPECT_CALL(*gl, GetIntegerv(GL_FRAMEBUFFER_BINDING, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 661 | .WillOnce(SetArgPointee<1>(fb_ids[0])) |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 662 | .RetiresOnSaturation(); |
| 663 | EXPECT_CALL(*gl, GetIntegerv(GL_TEXTURE_BINDING_2D, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 664 | .WillOnce(SetArgPointee<1>(tx_ids[0])) |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 665 | .RetiresOnSaturation(); |
| 666 | EXPECT_CALL(*gl, GenTextures(1, _)) |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 667 | .WillOnce(SetArrayArgument<1>( |
| 668 | base::span<const GLuint>(tx_ids).subspan(1u).data(), |
| 669 | base::span<const GLuint>(tx_ids).subspan(2u).data())) |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 670 | .RetiresOnSaturation(); |
| 671 | EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[1])) |
| 672 | .Times(1) |
| 673 | .RetiresOnSaturation(); |
hendrikw | bef24f5c | 2014-12-05 01:01:42 | [diff] [blame] | 674 | EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, _, width, width, 0, |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 675 | GL_RED_EXT, GL_UNSIGNED_BYTE, _)) |
| 676 | .Times(1) |
| 677 | .RetiresOnSaturation(); |
| 678 | EXPECT_CALL(*gl, GenFramebuffersEXT(1, _)) |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 679 | .WillOnce(SetArrayArgument<1>( |
| 680 | base::span<const GLuint>(fb_ids).subspan(1u).data(), |
| 681 | base::span<const GLuint>(fb_ids).subspan(2u).data())) |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 682 | .RetiresOnSaturation(); |
| 683 | EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[1])) |
| 684 | .Times(1) |
| 685 | .RetiresOnSaturation(); |
| 686 | EXPECT_CALL(*gl, FramebufferTexture2DEXT(GL_FRAMEBUFFER, |
| 687 | GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tx_ids[1], 0)) |
| 688 | .Times(1) |
| 689 | .RetiresOnSaturation(); |
| 690 | EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) |
| 691 | .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) |
| 692 | .RetiresOnSaturation(); |
| 693 | EXPECT_CALL(*gl, DeleteFramebuffersEXT(1, _)) |
| 694 | .Times(1) |
| 695 | .RetiresOnSaturation(); |
| 696 | EXPECT_CALL(*gl, DeleteTextures(1, _)) |
| 697 | .Times(1) |
| 698 | .RetiresOnSaturation(); |
| 699 | EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, fb_ids[0])) |
| 700 | .Times(1) |
| 701 | .RetiresOnSaturation(); |
| 702 | EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, tx_ids[0])) |
| 703 | .Times(1) |
| 704 | .RetiresOnSaturation(); |
danakj | e649f57 | 2015-01-08 23:35:58 | [diff] [blame] | 705 | #if DCHECK_IS_ON() |
hendrikw | 83f2fb5 | 2014-12-02 03:30:40 | [diff] [blame] | 706 | EXPECT_CALL(*gl, GetError()) |
| 707 | .WillOnce(Return(GL_NO_ERROR)) |
| 708 | .RetiresOnSaturation(); |
| 709 | #endif |
| 710 | } |
Xiaohan Wang | fa22d3e | 2022-01-15 02:02:43 | [diff] [blame] | 711 | #endif // !BUILDFLAG(IS_MAC) |
gman@chromium.org | 915a59a1 | 2010-09-30 21:29:11 | [diff] [blame] | 712 | } |
| 713 | |
dmurph@chromium.org | 65dfc60 | 2012-07-23 20:39:39 | [diff] [blame] | 714 | void TestHelper::SetupProgramSuccessExpectations( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 715 | ::gl::MockGLInterface* gl, |
kkinnunen | c8b449e158 | 2015-11-02 07:57:51 | [diff] [blame] | 716 | const FeatureInfo* feature_info, |
| 717 | AttribInfo* attribs, |
| 718 | size_t num_attribs, |
| 719 | UniformInfo* uniforms, |
| 720 | size_t num_uniforms, |
| 721 | VaryingInfo* varyings, |
| 722 | size_t num_varyings, |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 723 | base::span<ProgramOutputInfo> program_outputs, |
| 724 | size_t spanification_suspected_redundant_num_program_outputs, |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 725 | GLuint service_id) { |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 726 | // TODO(crbug.com/431824301): Remove unneeded parameter once validated to be |
| 727 | // redundant in M143. |
| 728 | CHECK(spanification_suspected_redundant_num_program_outputs == |
| 729 | program_outputs.size(), |
| 730 | base::NotFatalUntil::M143); |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 731 | EXPECT_CALL(*gl, GetProgramiv(service_id, GL_LINK_STATUS, _)) |
| 732 | .WillOnce(SetArgPointee<2>(1)) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 733 | .RetiresOnSaturation(); |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 734 | EXPECT_CALL(*gl, GetProgramiv(service_id, GL_INFO_LOG_LENGTH, _)) |
| 735 | .WillOnce(SetArgPointee<2>(0)) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 736 | .RetiresOnSaturation(); |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 737 | EXPECT_CALL(*gl, GetProgramiv(service_id, GL_ACTIVE_ATTRIBUTES, _)) |
| 738 | .WillOnce(SetArgPointee<2>(num_attribs)) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 739 | .RetiresOnSaturation(); |
| 740 | size_t max_attrib_len = 0; |
| 741 | for (size_t ii = 0; ii < num_attribs; ++ii) { |
| 742 | size_t len = strlen(attribs[ii].name) + 1; |
| 743 | max_attrib_len = std::max(max_attrib_len, len); |
| 744 | } |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 745 | EXPECT_CALL(*gl, GetProgramiv(service_id, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, _)) |
| 746 | .WillOnce(SetArgPointee<2>(max_attrib_len)) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 747 | .RetiresOnSaturation(); |
gman@chromium.org | 3f00df9 | 2012-06-19 00:44:58 | [diff] [blame] | 748 | |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 749 | for (size_t ii = 0; ii < num_attribs; ++ii) { |
| 750 | const AttribInfo& info = attribs[ii]; |
| 751 | EXPECT_CALL(*gl, |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 752 | GetActiveAttrib(service_id, ii, max_attrib_len, _, _, _, _)) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 753 | .WillOnce(DoAll( |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 754 | SetArgPointee<3>(strlen(info.name)), SetArgPointee<4>(info.size), |
| 755 | SetArgPointee<5>(info.type), |
| 756 | SetArrayArgument<6>(info.name, info.name + strlen(info.name) + 1))) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 757 | .RetiresOnSaturation(); |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 758 | if (!ProgramManager::HasBuiltInPrefix(info.name)) { |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 759 | EXPECT_CALL(*gl, GetAttribLocation(service_id, StrEq(info.name))) |
| 760 | .WillOnce(Return(info.location)) |
| 761 | .RetiresOnSaturation(); |
| 762 | } |
| 763 | } |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 764 | EXPECT_CALL(*gl, GetProgramiv(service_id, GL_ACTIVE_UNIFORMS, _)) |
| 765 | .WillOnce(SetArgPointee<2>(num_uniforms)) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 766 | .RetiresOnSaturation(); |
gman@chromium.org | 3f00df9 | 2012-06-19 00:44:58 | [diff] [blame] | 767 | |
kkinnunen | 8fbcba14 | 2015-11-23 08:25:25 | [diff] [blame] | 768 | if (num_uniforms > 0) { |
| 769 | size_t max_uniform_len = 0; |
| 770 | for (size_t ii = 0; ii < num_uniforms; ++ii) { |
| 771 | size_t len = strlen(uniforms[ii].name) + 1; |
| 772 | max_uniform_len = std::max(max_uniform_len, len); |
| 773 | } |
| 774 | EXPECT_CALL(*gl, GetProgramiv(service_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 775 | .WillOnce(SetArgPointee<2>(max_uniform_len)) |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 776 | .RetiresOnSaturation(); |
gman@chromium.org | 2be6abf3 | 2012-06-26 00:28:33 | [diff] [blame] | 777 | for (size_t ii = 0; ii < num_uniforms; ++ii) { |
| 778 | const UniformInfo& info = uniforms[ii]; |
kkinnunen | 8fbcba14 | 2015-11-23 08:25:25 | [diff] [blame] | 779 | EXPECT_CALL(*gl, |
| 780 | GetActiveUniform(service_id, ii, max_uniform_len, _, _, _, _)) |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 781 | .WillOnce(DoAll(SetArgPointee<3>(strlen(info.name)), |
| 782 | SetArgPointee<4>(info.size), |
| 783 | SetArgPointee<5>(info.type), |
kkinnunen | 8fbcba14 | 2015-11-23 08:25:25 | [diff] [blame] | 784 | SetArrayArgument<6>( |
| 785 | info.name, info.name + strlen(info.name) + 1))) |
| 786 | .RetiresOnSaturation(); |
| 787 | |
Bo Liu | 3d66a60a | 2017-06-26 22:26:35 | [diff] [blame] | 788 | // Corresponds to early out in Program::UpdateUniforms |
| 789 | if (!info.size) |
| 790 | return; |
| 791 | |
kkinnunen | 8fbcba14 | 2015-11-23 08:25:25 | [diff] [blame] | 792 | if (info.real_location != -1) { |
gman@chromium.org | 2be6abf3 | 2012-06-26 00:28:33 | [diff] [blame] | 793 | EXPECT_CALL(*gl, GetUniformLocation(service_id, StrEq(info.name))) |
| 794 | .WillOnce(Return(info.real_location)) |
gman@chromium.org | 3f00df9 | 2012-06-19 00:44:58 | [diff] [blame] | 795 | .RetiresOnSaturation(); |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 796 | } |
kkinnunen | 8fbcba14 | 2015-11-23 08:25:25 | [diff] [blame] | 797 | if (info.size > 1) { |
| 798 | std::string base_name = info.name; |
| 799 | size_t array_pos = base_name.rfind("[0]"); |
| 800 | if (base_name.size() > 3 && array_pos == base_name.size() - 3) { |
| 801 | base_name = base_name.substr(0, base_name.size() - 3); |
| 802 | } |
| 803 | for (GLsizei jj = 1; jj < info.size; ++jj) { |
| 804 | std::string element_name(std::string(base_name) + "[" + |
Raul Tambre | 3658454 | 2019-02-07 23:42:08 | [diff] [blame] | 805 | base::NumberToString(jj) + "]"); |
kkinnunen | 8fbcba14 | 2015-11-23 08:25:25 | [diff] [blame] | 806 | EXPECT_CALL(*gl, GetUniformLocation(service_id, StrEq(element_name))) |
| 807 | .WillOnce(Return(info.real_location + jj * 2)) |
| 808 | .RetiresOnSaturation(); |
gman@chromium.org | 2be6abf3 | 2012-06-26 00:28:33 | [diff] [blame] | 809 | } |
| 810 | } |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 811 | } |
| 812 | } |
kkinnunen | c8b449e158 | 2015-11-02 07:57:51 | [diff] [blame] | 813 | |
Zhenyao Mo | f302828 | 2024-07-03 17:31:43 | [diff] [blame] | 814 | if (feature_info->gl_version_info().IsAtLeastGLES(3, 0) && |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 815 | !feature_info->disable_shader_translator()) { |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 816 | for (size_t ii = 0; |
| 817 | ii < spanification_suspected_redundant_num_program_outputs; ++ii) { |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 818 | ProgramOutputInfo& info = program_outputs[ii]; |
| 819 | if (ProgramManager::HasBuiltInPrefix(info.name)) |
| 820 | continue; |
| 821 | |
| 822 | EXPECT_CALL(*gl, GetFragDataLocation(service_id, StrEq(info.name))) |
| 823 | .WillOnce(Return(info.color_name)) |
| 824 | .RetiresOnSaturation(); |
| 825 | if (feature_info->feature_flags().ext_blend_func_extended) { |
| 826 | EXPECT_CALL(*gl, GetFragDataIndex(service_id, StrEq(info.name))) |
| 827 | .WillOnce(Return(info.index)) |
| 828 | .RetiresOnSaturation(); |
| 829 | } else { |
| 830 | // Test case must not use indices, or the context of the testcase has to |
| 831 | // support the dual source blending. |
| 832 | DCHECK(info.index == 0); |
| 833 | } |
kkinnunen | c8b449e158 | 2015-11-02 07:57:51 | [diff] [blame] | 834 | } |
| 835 | } |
gman@chromium.org | 0abf43e3 | 2012-05-10 23:36:23 | [diff] [blame] | 836 | } |
| 837 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 838 | void TestHelper::SetupShaderExpectations(::gl::MockGLInterface* gl, |
kkinnunen | c8b449e158 | 2015-11-02 07:57:51 | [diff] [blame] | 839 | const FeatureInfo* feature_info, |
| 840 | AttribInfo* attribs, |
| 841 | size_t num_attribs, |
| 842 | UniformInfo* uniforms, |
| 843 | size_t num_uniforms, |
| 844 | GLuint service_id) { |
| 845 | InSequence s; |
| 846 | |
| 847 | EXPECT_CALL(*gl, LinkProgram(service_id)).Times(1).RetiresOnSaturation(); |
| 848 | |
| 849 | SetupProgramSuccessExpectations(gl, feature_info, attribs, num_attribs, |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 850 | uniforms, num_uniforms, nullptr, 0, {}, 0, |
| 851 | service_id); |
kkinnunen | c8b449e158 | 2015-11-02 07:57:51 | [diff] [blame] | 852 | } |
| 853 | |
| 854 | void TestHelper::SetupShaderExpectationsWithVaryings( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 855 | ::gl::MockGLInterface* gl, |
kkinnunen | c8b449e158 | 2015-11-02 07:57:51 | [diff] [blame] | 856 | const FeatureInfo* feature_info, |
| 857 | AttribInfo* attribs, |
| 858 | size_t num_attribs, |
| 859 | UniformInfo* uniforms, |
| 860 | size_t num_uniforms, |
| 861 | VaryingInfo* varyings, |
| 862 | size_t num_varyings, |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 863 | base::span<ProgramOutputInfo> program_outputs, |
| 864 | size_t spanification_suspected_redundant_num_program_outputs, |
dmurph@chromium.org | 65dfc60 | 2012-07-23 20:39:39 | [diff] [blame] | 865 | GLuint service_id) { |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 866 | // TODO(crbug.com/431824301): Remove unneeded parameter once validated to be |
| 867 | // redundant in M143. |
| 868 | CHECK(spanification_suspected_redundant_num_program_outputs == |
| 869 | program_outputs.size(), |
| 870 | base::NotFatalUntil::M143); |
dmurph@chromium.org | 65dfc60 | 2012-07-23 20:39:39 | [diff] [blame] | 871 | InSequence s; |
| 872 | |
| 873 | EXPECT_CALL(*gl, |
| 874 | LinkProgram(service_id)) |
| 875 | .Times(1) |
| 876 | .RetiresOnSaturation(); |
| 877 | |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 878 | SetupProgramSuccessExpectations( |
| 879 | gl, feature_info, attribs, num_attribs, uniforms, num_uniforms, varyings, |
Stephen Nusko | f4e5340 | 2025-07-23 13:39:44 | [diff] [blame] | 880 | num_varyings, program_outputs, |
| 881 | spanification_suspected_redundant_num_program_outputs, service_id); |
dmurph@chromium.org | 65dfc60 | 2012-07-23 20:39:39 | [diff] [blame] | 882 | } |
| 883 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 884 | void TestHelper::DoBufferData(::gl::MockGLInterface* gl, |
| 885 | MockErrorState* error_state, |
| 886 | BufferManager* manager, |
| 887 | Buffer* buffer, |
| 888 | GLenum target, |
| 889 | GLsizeiptr size, |
| 890 | GLenum usage, |
| 891 | const GLvoid* data, |
| 892 | GLenum error) { |
kloveless@chromium.org | d3eba34 | 2013-04-18 21:11:50 | [diff] [blame] | 893 | EXPECT_CALL(*error_state, CopyRealGLErrorsToWrapper(_, _, _)) |
gman@chromium.org | 17cfbe0e | 2013-03-07 01:26:08 | [diff] [blame] | 894 | .Times(1) |
| 895 | .RetiresOnSaturation(); |
| 896 | if (manager->IsUsageClientSideArray(usage)) { |
zmo | 4c0c353 | 2015-05-22 20:04:48 | [diff] [blame] | 897 | EXPECT_CALL(*gl, BufferData(target, 0, _, usage)) |
gman@chromium.org | 17cfbe0e | 2013-03-07 01:26:08 | [diff] [blame] | 898 | .Times(1) |
| 899 | .RetiresOnSaturation(); |
| 900 | } else { |
zmo | 4c0c353 | 2015-05-22 20:04:48 | [diff] [blame] | 901 | EXPECT_CALL(*gl, BufferData(target, size, _, usage)) |
gman@chromium.org | 17cfbe0e | 2013-03-07 01:26:08 | [diff] [blame] | 902 | .Times(1) |
| 903 | .RetiresOnSaturation(); |
| 904 | } |
kloveless@chromium.org | d3eba34 | 2013-04-18 21:11:50 | [diff] [blame] | 905 | EXPECT_CALL(*error_state, PeekGLError(_, _, _)) |
gman@chromium.org | 17cfbe0e | 2013-03-07 01:26:08 | [diff] [blame] | 906 | .WillOnce(Return(error)) |
| 907 | .RetiresOnSaturation(); |
zmo | 4c0c353 | 2015-05-22 20:04:48 | [diff] [blame] | 908 | manager->DoBufferData(error_state, buffer, target, size, usage, data); |
gman@chromium.org | 17cfbe0e | 2013-03-07 01:26:08 | [diff] [blame] | 909 | } |
| 910 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 911 | void TestHelper::SetTexParameteriWithExpectations(::gl::MockGLInterface* gl, |
| 912 | MockErrorState* error_state, |
| 913 | TextureManager* manager, |
| 914 | TextureRef* texture_ref, |
| 915 | GLenum pname, |
| 916 | GLint value, |
| 917 | GLenum error) { |
gman@chromium.org | 02965c2 | 2013-03-09 02:40:07 | [diff] [blame] | 918 | if (error == GL_NO_ERROR) { |
ccameron | dfb2f20 | 2015-10-09 23:17:59 | [diff] [blame] | 919 | EXPECT_CALL(*gl, TexParameteri(texture_ref->texture()->target(), |
| 920 | pname, value)) |
| 921 | .Times(1) |
| 922 | .RetiresOnSaturation(); |
gman@chromium.org | 02965c2 | 2013-03-09 02:40:07 | [diff] [blame] | 923 | } else if (error == GL_INVALID_ENUM) { |
kloveless@chromium.org | d3eba34 | 2013-04-18 21:11:50 | [diff] [blame] | 924 | EXPECT_CALL(*error_state, SetGLErrorInvalidEnum(_, _, _, value, _)) |
gman@chromium.org | 02965c2 | 2013-03-09 02:40:07 | [diff] [blame] | 925 | .Times(1) |
| 926 | .RetiresOnSaturation(); |
| 927 | } else { |
zmo@chromium.org | 737191ee7 | 2014-03-09 08:02:42 | [diff] [blame] | 928 | EXPECT_CALL(*error_state, SetGLErrorInvalidParami(_, _, error, _, _, _)) |
gman@chromium.org | 02965c2 | 2013-03-09 02:40:07 | [diff] [blame] | 929 | .Times(1) |
| 930 | .RetiresOnSaturation(); |
| 931 | } |
zmo@chromium.org | 737191ee7 | 2014-03-09 08:02:42 | [diff] [blame] | 932 | manager->SetParameteri("", error_state, texture_ref, pname, value); |
gman@chromium.org | 02965c2 | 2013-03-09 02:40:07 | [diff] [blame] | 933 | } |
| 934 | |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 935 | // static |
| 936 | void TestHelper::SetShaderStates( |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 937 | ::gl::MockGLInterface* gl, |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 938 | Shader* shader, |
| 939 | bool expected_valid, |
| 940 | const std::string* const expected_log_info, |
| 941 | const std::string* const expected_translated_source, |
| 942 | const int* const expected_shader_version, |
| 943 | const AttributeMap* const expected_attrib_map, |
| 944 | const UniformMap* const expected_uniform_map, |
| 945 | const VaryingMap* const expected_varying_map, |
| 946 | const InterfaceBlockMap* const expected_interface_block_map, |
Geoff Lang | 30efb7b | 2017-08-09 14:59:23 | [diff] [blame] | 947 | const OutputVariableList* const expected_output_variable_list, |
| 948 | OptionsAffectingCompilationString* options_affecting_compilation) { |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 949 | const std::string empty_log_info; |
| 950 | const std::string* log_info = (expected_log_info && !expected_valid) ? |
| 951 | expected_log_info : &empty_log_info; |
| 952 | const std::string empty_translated_source; |
| 953 | const std::string* translated_source = |
| 954 | (expected_translated_source && expected_valid) ? |
| 955 | expected_translated_source : &empty_translated_source; |
oetuaho | e6bdcf3 | 2015-05-07 16:45:25 | [diff] [blame] | 956 | int default_shader_version = 100; |
| 957 | const int* shader_version = (expected_shader_version && expected_valid) ? |
| 958 | expected_shader_version : &default_shader_version; |
zmo | 88043c08 | 2014-10-09 20:38:55 | [diff] [blame] | 959 | const AttributeMap empty_attrib_map; |
| 960 | const AttributeMap* attrib_map = (expected_attrib_map && expected_valid) ? |
| 961 | expected_attrib_map : &empty_attrib_map; |
| 962 | const UniformMap empty_uniform_map; |
| 963 | const UniformMap* uniform_map = (expected_uniform_map && expected_valid) ? |
| 964 | expected_uniform_map : &empty_uniform_map; |
| 965 | const VaryingMap empty_varying_map; |
| 966 | const VaryingMap* varying_map = (expected_varying_map && expected_valid) ? |
| 967 | expected_varying_map : &empty_varying_map; |
yunchao.he | e4edccd | 2015-11-06 00:45:18 | [diff] [blame] | 968 | const InterfaceBlockMap empty_interface_block_map; |
| 969 | const InterfaceBlockMap* interface_block_map = |
| 970 | (expected_interface_block_map && expected_valid) ? |
| 971 | expected_interface_block_map : &empty_interface_block_map; |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 972 | const OutputVariableList empty_output_variable_list; |
| 973 | const OutputVariableList* output_variable_list = |
| 974 | (expected_output_variable_list && expected_valid) |
| 975 | ? expected_output_variable_list |
| 976 | : &empty_output_variable_list; |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 977 | |
dyen | 0ff9e440 | 2015-02-12 22:27:43 | [diff] [blame] | 978 | MockShaderTranslator* mock_translator = new MockShaderTranslator; |
| 979 | scoped_refptr<ShaderTranslatorInterface> translator(mock_translator); |
| 980 | EXPECT_CALL(*mock_translator, Translate(_, |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 981 | NotNull(), // log_info |
| 982 | NotNull(), // translated_source |
| 983 | NotNull(), // shader_version |
| 984 | NotNull(), // attrib_map |
| 985 | NotNull(), // uniform_map |
| 986 | NotNull(), // varying_map |
| 987 | NotNull(), // interface_block_map |
kainino | 78c79d2 | 2017-05-04 18:45:30 | [diff] [blame] | 988 | NotNull())) // output_variable_list |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 989 | .WillOnce(DoAll( |
| 990 | SetArgPointee<1>(*log_info), SetArgPointee<2>(*translated_source), |
| 991 | SetArgPointee<3>(*shader_version), SetArgPointee<4>(*attrib_map), |
| 992 | SetArgPointee<5>(*uniform_map), SetArgPointee<6>(*varying_map), |
| 993 | SetArgPointee<7>(*interface_block_map), |
| 994 | SetArgPointee<8>(*output_variable_list), Return(expected_valid))) |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 995 | .RetiresOnSaturation(); |
Geoff Lang | 30efb7b | 2017-08-09 14:59:23 | [diff] [blame] | 996 | EXPECT_CALL(*mock_translator, GetStringForOptionsThatWouldAffectCompilation()) |
| 997 | .WillOnce(Return(options_affecting_compilation)) |
| 998 | .RetiresOnSaturation(); |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 999 | if (expected_valid) { |
tzik | ddef0218 | 2018-08-14 07:08:33 | [diff] [blame] | 1000 | EXPECT_CALL(*gl, ShaderSource(shader->service_id(), 1, _, nullptr)) |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 1001 | .Times(1) |
| 1002 | .RetiresOnSaturation(); |
| 1003 | EXPECT_CALL(*gl, CompileShader(shader->service_id())) |
| 1004 | .Times(1) |
| 1005 | .RetiresOnSaturation(); |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 1006 | EXPECT_CALL(*gl, GetShaderiv(shader->service_id(), GL_COMPILE_STATUS, |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 1007 | NotNull())) // status |
thestig | e147d68 | 2017-05-05 07:31:31 | [diff] [blame] | 1008 | .WillOnce(SetArgPointee<2>(GL_TRUE)) |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 1009 | .RetiresOnSaturation(); |
| 1010 | } |
dyen | 0ff9e440 | 2015-02-12 22:27:43 | [diff] [blame] | 1011 | shader->RequestCompile(translator, Shader::kGL); |
| 1012 | shader->DoCompile(); |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 1013 | } |
| 1014 | |
| 1015 | // static |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 1016 | void TestHelper::SetShaderStates(::gl::MockGLInterface* gl, |
| 1017 | Shader* shader, |
| 1018 | bool valid) { |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 1019 | SetShaderStates(gl, shader, valid, nullptr, nullptr, nullptr, nullptr, |
Geoff Lang | 30efb7b | 2017-08-09 14:59:23 | [diff] [blame] | 1020 | nullptr, nullptr, nullptr, nullptr, nullptr); |
| 1021 | } |
| 1022 | |
| 1023 | // static |
| 1024 | void TestHelper::SetShaderStates( |
| 1025 | ::gl::MockGLInterface* gl, |
| 1026 | Shader* shader, |
| 1027 | bool valid, |
| 1028 | const std::string& options_affecting_compilation) { |
| 1029 | scoped_refptr<OptionsAffectingCompilationString> options = |
| 1030 | base::MakeRefCounted<OptionsAffectingCompilationString>( |
| 1031 | options_affecting_compilation); |
| 1032 | SetShaderStates(gl, shader, valid, nullptr, nullptr, nullptr, nullptr, |
| 1033 | nullptr, nullptr, nullptr, nullptr, options.get()); |
zmo | 576a049 | 2014-09-13 01:12:32 | [diff] [blame] | 1034 | } |
| 1035 | |
zmo | 88043c08 | 2014-10-09 20:38:55 | [diff] [blame] | 1036 | // static |
| 1037 | sh::Attribute TestHelper::ConstructAttribute( |
| 1038 | GLenum type, GLint array_size, GLenum precision, |
| 1039 | bool static_use, const std::string& name) { |
| 1040 | return ConstructShaderVariable<sh::Attribute>( |
| 1041 | type, array_size, precision, static_use, name); |
| 1042 | } |
| 1043 | |
| 1044 | // static |
| 1045 | sh::Uniform TestHelper::ConstructUniform( |
| 1046 | GLenum type, GLint array_size, GLenum precision, |
| 1047 | bool static_use, const std::string& name) { |
| 1048 | return ConstructShaderVariable<sh::Uniform>( |
| 1049 | type, array_size, precision, static_use, name); |
| 1050 | } |
| 1051 | |
| 1052 | // static |
| 1053 | sh::Varying TestHelper::ConstructVarying( |
| 1054 | GLenum type, GLint array_size, GLenum precision, |
| 1055 | bool static_use, const std::string& name) { |
| 1056 | return ConstructShaderVariable<sh::Varying>( |
| 1057 | type, array_size, precision, static_use, name); |
| 1058 | } |
| 1059 | |
Kai Ninomiya | e9cc630 | 2017-05-19 21:49:13 | [diff] [blame] | 1060 | // static |
| 1061 | sh::InterfaceBlockField TestHelper::ConstructInterfaceBlockField( |
| 1062 | GLenum type, |
| 1063 | GLint array_size, |
| 1064 | GLenum precision, |
| 1065 | bool static_use, |
| 1066 | const std::string& name) { |
| 1067 | return ConstructShaderVariable<sh::InterfaceBlockField>( |
| 1068 | type, array_size, precision, static_use, name); |
| 1069 | } |
| 1070 | |
| 1071 | // static |
| 1072 | sh::InterfaceBlock TestHelper::ConstructInterfaceBlock( |
| 1073 | GLint array_size, |
| 1074 | sh::BlockLayoutType layout, |
| 1075 | bool is_row_major_layout, |
| 1076 | bool static_use, |
| 1077 | const std::string& name, |
| 1078 | const std::string& instance_name, |
| 1079 | const std::vector<sh::InterfaceBlockField>& fields) { |
| 1080 | sh::InterfaceBlock var; |
| 1081 | var.arraySize = array_size; |
| 1082 | var.layout = layout; |
| 1083 | var.isRowMajorLayout = is_row_major_layout; |
| 1084 | var.staticUse = static_use; |
| 1085 | var.name = name; |
| 1086 | var.mappedName = name; // No name hashing. |
| 1087 | var.instanceName = instance_name; |
| 1088 | var.fields = fields; |
| 1089 | return var; |
| 1090 | } |
| 1091 | |
kkinnunen | 8cefb23 | 2015-12-04 09:36:31 | [diff] [blame] | 1092 | sh::OutputVariable TestHelper::ConstructOutputVariable( |
| 1093 | GLenum type, |
| 1094 | GLint array_size, |
| 1095 | GLenum precision, |
| 1096 | bool static_use, |
| 1097 | const std::string& name) { |
| 1098 | return ConstructShaderVariable<sh::OutputVariable>( |
| 1099 | type, array_size, precision, static_use, name); |
| 1100 | } |
| 1101 | |
gman@chromium.org | 00f893d | 2010-08-24 18:55:49 | [diff] [blame] | 1102 | } // namespace gles2 |
| 1103 | } // namespace gpu |