test_web_graphics_context_3d.h revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright 2013 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 5#ifndef CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_ 6#define CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_ 7 8#include <vector> 9 10#include "base/compiler_specific.h" 11#include "base/containers/hash_tables.h" 12#include "base/containers/scoped_ptr_hash_map.h" 13#include "base/memory/ref_counted.h" 14#include "base/memory/scoped_ptr.h" 15#include "base/memory/weak_ptr.h" 16#include "base/stl_util.h" 17#include "base/synchronization/lock.h" 18#include "cc/output/context_provider.h" 19#include "cc/test/fake_web_graphics_context_3d.h" 20#include "cc/test/ordered_texture_map.h" 21#include "cc/test/test_texture.h" 22#include "third_party/khronos/GLES2/gl2.h" 23#include "ui/gfx/rect.h" 24 25namespace cc { 26class TestContextSupport; 27 28class TestWebGraphicsContext3D : public FakeWebGraphicsContext3D { 29 public: 30 static scoped_ptr<TestWebGraphicsContext3D> Create(); 31 32 virtual ~TestWebGraphicsContext3D(); 33 34 virtual bool makeContextCurrent(); 35 36 virtual void reshapeWithScaleFactor( 37 int width, int height, float scale_factor); 38 39 virtual bool isContextLost(); 40 41 virtual void attachShader(blink::WebGLId program, blink::WebGLId shader); 42 virtual void bindFramebuffer( 43 blink::WGC3Denum target, blink::WebGLId framebuffer); 44 virtual void bindRenderbuffer( 45 blink::WGC3Denum target, blink::WebGLId renderbuffer); 46 virtual void bindTexture( 47 blink::WGC3Denum target, 48 blink::WebGLId texture_id); 49 50 virtual void texParameteri(blink::WGC3Denum target, 51 blink::WGC3Denum pname, 52 blink::WGC3Dint param); 53 virtual void getTexParameteriv(blink::WGC3Denum target, 54 blink::WGC3Denum pname, 55 blink::WGC3Dint* value); 56 57 virtual blink::WGC3Denum checkFramebufferStatus(blink::WGC3Denum target); 58 59 virtual Attributes getContextAttributes(); 60 61 virtual blink::WebString getString(blink::WGC3Denum name); 62 virtual blink::WGC3Dint getUniformLocation( 63 blink::WebGLId program, 64 const blink::WGC3Dchar* name); 65 virtual blink::WGC3Dsizeiptr getVertexAttribOffset( 66 blink::WGC3Duint index, 67 blink::WGC3Denum pname); 68 69 virtual blink::WGC3Dboolean isBuffer(blink::WebGLId buffer); 70 virtual blink::WGC3Dboolean isEnabled(blink::WGC3Denum cap); 71 virtual blink::WGC3Dboolean isFramebuffer(blink::WebGLId framebuffer); 72 virtual blink::WGC3Dboolean isProgram(blink::WebGLId program); 73 virtual blink::WGC3Dboolean isRenderbuffer(blink::WebGLId renderbuffer); 74 virtual blink::WGC3Dboolean isShader(blink::WebGLId shader); 75 virtual blink::WGC3Dboolean isTexture(blink::WebGLId texture); 76 77 virtual void useProgram(blink::WebGLId program); 78 79 virtual void genBuffers(blink::WGC3Dsizei count, blink::WebGLId* ids); 80 virtual void genFramebuffers(blink::WGC3Dsizei count, blink::WebGLId* ids); 81 virtual void genRenderbuffers(blink::WGC3Dsizei count, blink::WebGLId* ids); 82 virtual void genTextures(blink::WGC3Dsizei count, blink::WebGLId* ids); 83 84 virtual void deleteBuffers(blink::WGC3Dsizei count, blink::WebGLId* ids); 85 virtual void deleteFramebuffers( 86 blink::WGC3Dsizei count, blink::WebGLId* ids); 87 virtual void deleteRenderbuffers( 88 blink::WGC3Dsizei count, blink::WebGLId* ids); 89 virtual void deleteTextures(blink::WGC3Dsizei count, blink::WebGLId* ids); 90 91 virtual blink::WebGLId createBuffer(); 92 virtual blink::WebGLId createFramebuffer(); 93 virtual blink::WebGLId createRenderbuffer(); 94 virtual blink::WebGLId createTexture(); 95 96 virtual void deleteBuffer(blink::WebGLId id); 97 virtual void deleteFramebuffer(blink::WebGLId id); 98 virtual void deleteRenderbuffer(blink::WebGLId id); 99 virtual void deleteTexture(blink::WebGLId id); 100 101 virtual blink::WebGLId createProgram(); 102 virtual blink::WebGLId createShader(blink::WGC3Denum); 103 virtual blink::WebGLId createExternalTexture(); 104 105 virtual void deleteProgram(blink::WebGLId id); 106 virtual void deleteShader(blink::WebGLId id); 107 108 virtual void endQueryEXT(blink::WGC3Denum target); 109 virtual void getQueryObjectuivEXT( 110 blink::WebGLId query, 111 blink::WGC3Denum pname, 112 blink::WGC3Duint* params); 113 114 virtual void getIntegerv( 115 blink::WGC3Denum pname, 116 blink::WGC3Dint* value); 117 118 virtual void genMailboxCHROMIUM(blink::WGC3Dbyte* mailbox); 119 virtual void produceTextureCHROMIUM(blink::WGC3Denum target, 120 const blink::WGC3Dbyte* mailbox) { } 121 virtual void consumeTextureCHROMIUM(blink::WGC3Denum target, 122 const blink::WGC3Dbyte* mailbox) { } 123 124 virtual void setContextLostCallback( 125 WebGraphicsContextLostCallback* callback); 126 127 virtual void loseContextCHROMIUM(blink::WGC3Denum current, 128 blink::WGC3Denum other); 129 130 virtual void setSwapBuffersCompleteCallbackCHROMIUM( 131 WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* callback); 132 133 virtual void prepareTexture(); 134 virtual void postSubBufferCHROMIUM(int x, int y, int width, int height); 135 virtual void finish(); 136 virtual void flush(); 137 138 virtual void bindBuffer(blink::WGC3Denum target, blink::WebGLId buffer); 139 virtual void bufferData(blink::WGC3Denum target, 140 blink::WGC3Dsizeiptr size, 141 const void* data, 142 blink::WGC3Denum usage); 143 virtual void* mapBufferCHROMIUM(blink::WGC3Denum target, 144 blink::WGC3Denum access); 145 virtual blink::WGC3Dboolean unmapBufferCHROMIUM(blink::WGC3Denum target); 146 147 virtual blink::WGC3Duint createImageCHROMIUM( 148 blink::WGC3Dsizei width, 149 blink::WGC3Dsizei height, 150 blink::WGC3Denum internalformat); 151 virtual void destroyImageCHROMIUM(blink::WGC3Duint image_id); 152 virtual void getImageParameterivCHROMIUM( 153 blink::WGC3Duint image_id, 154 blink::WGC3Denum pname, 155 blink::WGC3Dint* params); 156 virtual void* mapImageCHROMIUM( 157 blink::WGC3Duint image_id, 158 blink::WGC3Denum access); 159 virtual void unmapImageCHROMIUM(blink::WGC3Duint image_id); 160 161 const ContextProvider::Capabilities& test_capabilities() const { 162 return test_capabilities_; 163 } 164 165 // When set, MakeCurrent() will fail after this many times. 166 void set_times_make_current_succeeds(int times) { 167 times_make_current_succeeds_ = times; 168 } 169 void set_times_bind_texture_succeeds(int times) { 170 times_bind_texture_succeeds_ = times; 171 } 172 void set_times_end_query_succeeds(int times) { 173 times_end_query_succeeds_ = times; 174 } 175 void set_times_gen_mailbox_succeeds(int times) { 176 times_gen_mailbox_succeeds_ = times; 177 } 178 179 // When set, mapImageCHROMIUM and mapBufferCHROMIUM will return NULL after 180 // this many times. 181 void set_times_map_image_chromium_succeeds(int times) { 182 times_map_image_chromium_succeeds_ = times; 183 } 184 void set_times_map_buffer_chromium_succeeds(int times) { 185 times_map_buffer_chromium_succeeds_ = times; 186 } 187 188 size_t NumTextures() const; 189 blink::WebGLId TextureAt(int i) const; 190 191 size_t NumUsedTextures() const { return used_textures_.size(); } 192 bool UsedTexture(int texture) const { 193 return ContainsKey(used_textures_, texture); 194 } 195 void ResetUsedTextures() { used_textures_.clear(); } 196 197 void set_support_swapbuffers_complete_callback(bool support) { 198 test_capabilities_.swapbuffers_complete_callback = support; 199 } 200 void set_have_extension_io_surface(bool have) { 201 test_capabilities_.iosurface = have; 202 test_capabilities_.texture_rectangle = have; 203 } 204 void set_have_extension_egl_image(bool have) { 205 test_capabilities_.egl_image_external = have; 206 } 207 void set_have_post_sub_buffer(bool have) { 208 test_capabilities_.post_sub_buffer = have; 209 } 210 void set_have_discard_framebuffer(bool have) { 211 test_capabilities_.discard_framebuffer = have; 212 } 213 void set_support_compressed_texture_etc1(bool support) { 214 test_capabilities_.texture_format_etc1 = support; 215 } 216 void set_support_texture_storage(bool support) { 217 test_capabilities_.texture_storage = support; 218 } 219 220 // When this context is lost, all contexts in its share group are also lost. 221 void add_share_group_context(blink::WebGraphicsContext3D* context3d) { 222 shared_contexts_.push_back(context3d); 223 } 224 225 void set_max_texture_size(int size) { max_texture_size_ = size; } 226 227 static const blink::WebGLId kExternalTextureId; 228 virtual blink::WebGLId NextTextureId(); 229 virtual void RetireTextureId(blink::WebGLId id); 230 231 virtual blink::WebGLId NextBufferId(); 232 virtual void RetireBufferId(blink::WebGLId id); 233 234 virtual blink::WebGLId NextImageId(); 235 virtual void RetireImageId(blink::WebGLId id); 236 237 size_t GetTransferBufferMemoryUsedBytes() const; 238 void SetMaxTransferBufferUsageBytes(size_t max_transfer_buffer_usage_bytes); 239 size_t GetPeakTransferBufferMemoryUsedBytes() const { 240 return peak_transfer_buffer_memory_used_bytes_; 241 } 242 243 void set_test_support(TestContextSupport* test_support) { 244 test_support_ = test_support; 245 } 246 247 int width() const { return width_; } 248 int height() const { return height_; } 249 bool reshape_called() const { return reshape_called_; } 250 void clear_reshape_called() { reshape_called_ = false; } 251 float scale_factor() const { return scale_factor_; } 252 253 enum UpdateType { 254 NoUpdate = 0, 255 PrepareTexture, 256 PostSubBuffer 257 }; 258 259 gfx::Rect update_rect() const { return update_rect_; } 260 261 UpdateType last_update_type() { 262 return last_update_type_; 263 } 264 265 protected: 266 struct TextureTargets { 267 TextureTargets(); 268 ~TextureTargets(); 269 270 void BindTexture(blink::WGC3Denum target, blink::WebGLId id); 271 void UnbindTexture(blink::WebGLId id); 272 273 blink::WebGLId BoundTexture(blink::WGC3Denum target); 274 275 private: 276 typedef base::hash_map<blink::WGC3Denum, blink::WebGLId> TargetTextureMap; 277 TargetTextureMap bound_textures_; 278 }; 279 280 struct Buffer { 281 Buffer(); 282 ~Buffer(); 283 284 blink::WGC3Denum target; 285 scoped_ptr<uint8[]> pixels; 286 size_t size; 287 288 private: 289 DISALLOW_COPY_AND_ASSIGN(Buffer); 290 }; 291 292 struct Image { 293 Image(); 294 ~Image(); 295 296 scoped_ptr<uint8[]> pixels; 297 298 private: 299 DISALLOW_COPY_AND_ASSIGN(Image); 300 }; 301 302 struct Namespace : public base::RefCountedThreadSafe<Namespace> { 303 Namespace(); 304 305 // Protects all fields. 306 base::Lock lock; 307 unsigned next_buffer_id; 308 unsigned next_image_id; 309 unsigned next_texture_id; 310 base::ScopedPtrHashMap<unsigned, Buffer> buffers; 311 base::ScopedPtrHashMap<unsigned, Image> images; 312 OrderedTextureMap textures; 313 314 private: 315 friend class base::RefCountedThreadSafe<Namespace>; 316 ~Namespace(); 317 DISALLOW_COPY_AND_ASSIGN(Namespace); 318 }; 319 320 TestWebGraphicsContext3D(); 321 322 void CallAllSyncPointCallbacks(); 323 void SwapBuffersComplete(); 324 void CreateNamespace(); 325 blink::WebGLId BoundTextureId(blink::WGC3Denum target); 326 scoped_refptr<TestTexture> BoundTexture(blink::WGC3Denum target); 327 void CheckTextureIsBound(blink::WGC3Denum target); 328 329 unsigned context_id_; 330 Attributes attributes_; 331 ContextProvider::Capabilities test_capabilities_; 332 int times_make_current_succeeds_; 333 int times_bind_texture_succeeds_; 334 int times_end_query_succeeds_; 335 int times_gen_mailbox_succeeds_; 336 bool context_lost_; 337 int times_map_image_chromium_succeeds_; 338 int times_map_buffer_chromium_succeeds_; 339 WebGraphicsContextLostCallback* context_lost_callback_; 340 WebGraphicsSwapBuffersCompleteCallbackCHROMIUM* swap_buffers_callback_; 341 base::hash_set<unsigned> used_textures_; 342 unsigned next_program_id_; 343 base::hash_set<unsigned> program_set_; 344 unsigned next_shader_id_; 345 base::hash_set<unsigned> shader_set_; 346 std::vector<blink::WebGraphicsContext3D*> shared_contexts_; 347 int max_texture_size_; 348 bool reshape_called_; 349 int width_; 350 int height_; 351 float scale_factor_; 352 TestContextSupport* test_support_; 353 gfx::Rect update_rect_; 354 UpdateType last_update_type_; 355 356 unsigned bound_buffer_; 357 TextureTargets texture_targets_; 358 359 size_t peak_transfer_buffer_memory_used_bytes_; 360 361 scoped_refptr<Namespace> namespace_; 362 static Namespace* shared_namespace_; 363 364 base::WeakPtrFactory<TestWebGraphicsContext3D> weak_ptr_factory_; 365}; 366 367} // namespace cc 368 369#endif // CC_TEST_TEST_WEB_GRAPHICS_CONTEXT_3D_H_ 370