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.
5 #include "cc/test/test_web_graphics_context_3d.h"
10 #include "base/bind.h"
11 #include "base/lazy_instance.h"
12 #include "base/logging.h"
13 #include "base/message_loop/message_loop.h"
14 #include "cc/test/test_context_support.h"
15 #include "gpu/GLES2/gl2extchromium.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "third_party/khronos/GLES2/gl2ext.h"
21 static unsigned s_context_id
= 1;
23 const GLuint
TestWebGraphicsContext3D::kExternalTextureId
= 1337;
25 static base::LazyInstance
<base::Lock
>::Leaky
26 g_shared_namespace_lock
= LAZY_INSTANCE_INITIALIZER
;
28 TestWebGraphicsContext3D::Namespace
*
29 TestWebGraphicsContext3D::shared_namespace_
= NULL
;
31 TestWebGraphicsContext3D::Namespace::Namespace()
35 next_renderbuffer_id(1) {
38 TestWebGraphicsContext3D::Namespace::~Namespace() {
39 g_shared_namespace_lock
.Get().AssertAcquired();
40 if (shared_namespace_
== this)
41 shared_namespace_
= NULL
;
45 scoped_ptr
<TestWebGraphicsContext3D
> TestWebGraphicsContext3D::Create() {
46 return make_scoped_ptr(new TestWebGraphicsContext3D());
49 TestWebGraphicsContext3D::TestWebGraphicsContext3D()
50 : context_id_(s_context_id
++),
51 times_bind_texture_succeeds_(-1),
52 times_end_query_succeeds_(-1),
54 times_map_buffer_chromium_succeeds_(-1),
55 current_used_transfer_buffer_usage_bytes_(0),
56 max_used_transfer_buffer_usage_bytes_(0),
57 next_program_id_(1000),
58 next_shader_id_(2000),
59 next_framebuffer_id_(1),
60 current_framebuffer_(0),
61 max_texture_size_(2048),
62 reshape_called_(false),
67 last_update_type_(NO_UPDATE
),
68 next_insert_sync_point_(1),
69 last_waited_sync_point_(0),
72 weak_ptr_factory_(this) {
74 set_support_image(true);
77 TestWebGraphicsContext3D::~TestWebGraphicsContext3D() {
78 base::AutoLock
lock(g_shared_namespace_lock
.Get());
82 void TestWebGraphicsContext3D::CreateNamespace() {
83 base::AutoLock
lock(g_shared_namespace_lock
.Get());
84 if (shared_namespace_
) {
85 namespace_
= shared_namespace_
;
87 namespace_
= new Namespace
;
88 shared_namespace_
= namespace_
.get();
92 void TestWebGraphicsContext3D::reshapeWithScaleFactor(
93 int width
, int height
, float scale_factor
) {
94 reshape_called_
= true;
97 scale_factor_
= scale_factor
;
100 bool TestWebGraphicsContext3D::isContextLost() {
101 return context_lost_
;
104 GLenum
TestWebGraphicsContext3D::checkFramebufferStatus(
107 return GL_FRAMEBUFFER_UNDEFINED_OES
;
108 return GL_FRAMEBUFFER_COMPLETE
;
111 GLint
TestWebGraphicsContext3D::getUniformLocation(
113 const GLchar
* name
) {
117 GLsizeiptr
TestWebGraphicsContext3D::getVertexAttribOffset(
123 GLboolean
TestWebGraphicsContext3D::isBuffer(
128 GLboolean
TestWebGraphicsContext3D::isEnabled(
133 GLboolean
TestWebGraphicsContext3D::isFramebuffer(
134 GLuint framebuffer
) {
138 GLboolean
TestWebGraphicsContext3D::isProgram(
143 GLboolean
TestWebGraphicsContext3D::isRenderbuffer(
144 GLuint renderbuffer
) {
148 GLboolean
TestWebGraphicsContext3D::isShader(
153 GLboolean
TestWebGraphicsContext3D::isTexture(
158 void TestWebGraphicsContext3D::genBuffers(GLsizei count
, GLuint
* ids
) {
159 for (int i
= 0; i
< count
; ++i
)
160 ids
[i
] = NextBufferId();
163 void TestWebGraphicsContext3D::genFramebuffers(
164 GLsizei count
, GLuint
* ids
) {
165 for (int i
= 0; i
< count
; ++i
)
166 ids
[i
] = NextFramebufferId();
169 void TestWebGraphicsContext3D::genRenderbuffers(
170 GLsizei count
, GLuint
* ids
) {
171 for (int i
= 0; i
< count
; ++i
)
172 ids
[i
] = NextRenderbufferId();
175 void TestWebGraphicsContext3D::genTextures(GLsizei count
, GLuint
* ids
) {
176 for (int i
= 0; i
< count
; ++i
) {
177 ids
[i
] = NextTextureId();
178 DCHECK_NE(ids
[i
], kExternalTextureId
);
180 base::AutoLock
lock(namespace_
->lock
);
181 for (int i
= 0; i
< count
; ++i
)
182 namespace_
->textures
.Append(ids
[i
], new TestTexture());
185 void TestWebGraphicsContext3D::deleteBuffers(GLsizei count
, GLuint
* ids
) {
186 for (int i
= 0; i
< count
; ++i
)
187 RetireBufferId(ids
[i
]);
190 void TestWebGraphicsContext3D::deleteFramebuffers(
191 GLsizei count
, GLuint
* ids
) {
192 for (int i
= 0; i
< count
; ++i
) {
194 RetireFramebufferId(ids
[i
]);
195 if (ids
[i
] == current_framebuffer_
)
196 current_framebuffer_
= 0;
201 void TestWebGraphicsContext3D::deleteRenderbuffers(
202 GLsizei count
, GLuint
* ids
) {
203 for (int i
= 0; i
< count
; ++i
)
204 RetireRenderbufferId(ids
[i
]);
207 void TestWebGraphicsContext3D::deleteTextures(GLsizei count
, GLuint
* ids
) {
208 for (int i
= 0; i
< count
; ++i
)
209 RetireTextureId(ids
[i
]);
210 base::AutoLock
lock(namespace_
->lock
);
211 for (int i
= 0; i
< count
; ++i
) {
212 namespace_
->textures
.Remove(ids
[i
]);
213 texture_targets_
.UnbindTexture(ids
[i
]);
217 GLuint
TestWebGraphicsContext3D::createBuffer() {
223 GLuint
TestWebGraphicsContext3D::createFramebuffer() {
225 genFramebuffers(1, &id
);
229 GLuint
TestWebGraphicsContext3D::createRenderbuffer() {
231 genRenderbuffers(1, &id
);
235 GLuint
TestWebGraphicsContext3D::createTexture() {
241 void TestWebGraphicsContext3D::deleteBuffer(GLuint id
) {
242 deleteBuffers(1, &id
);
245 void TestWebGraphicsContext3D::deleteFramebuffer(GLuint id
) {
246 deleteFramebuffers(1, &id
);
249 void TestWebGraphicsContext3D::deleteRenderbuffer(GLuint id
) {
250 deleteRenderbuffers(1, &id
);
253 void TestWebGraphicsContext3D::deleteTexture(GLuint id
) {
254 deleteTextures(1, &id
);
257 unsigned TestWebGraphicsContext3D::createProgram() {
258 unsigned program
= next_program_id_
++ | context_id_
<< 16;
259 program_set_
.insert(program
);
263 GLuint
TestWebGraphicsContext3D::createShader(GLenum
) {
264 unsigned shader
= next_shader_id_
++ | context_id_
<< 16;
265 shader_set_
.insert(shader
);
269 GLuint
TestWebGraphicsContext3D::createExternalTexture() {
270 base::AutoLock
lock(namespace_
->lock
);
271 namespace_
->textures
.Append(kExternalTextureId
, new TestTexture());
272 return kExternalTextureId
;
275 void TestWebGraphicsContext3D::deleteProgram(GLuint id
) {
276 if (!program_set_
.count(id
))
277 ADD_FAILURE() << "deleteProgram called on unknown program " << id
;
278 program_set_
.erase(id
);
281 void TestWebGraphicsContext3D::deleteShader(GLuint id
) {
282 if (!shader_set_
.count(id
))
283 ADD_FAILURE() << "deleteShader called on unknown shader " << id
;
284 shader_set_
.erase(id
);
287 void TestWebGraphicsContext3D::attachShader(GLuint program
, GLuint shader
) {
288 if (!program_set_
.count(program
))
289 ADD_FAILURE() << "attachShader called with unknown program " << program
;
290 if (!shader_set_
.count(shader
))
291 ADD_FAILURE() << "attachShader called with unknown shader " << shader
;
294 void TestWebGraphicsContext3D::useProgram(GLuint program
) {
297 if (!program_set_
.count(program
))
298 ADD_FAILURE() << "useProgram called on unknown program " << program
;
301 void TestWebGraphicsContext3D::bindFramebuffer(
302 GLenum target
, GLuint framebuffer
) {
303 base::AutoLock
lock_for_framebuffer_access(namespace_
->lock
);
304 if (framebuffer
!= 0 &&
305 framebuffer_set_
.find(framebuffer
) == framebuffer_set_
.end()) {
306 ADD_FAILURE() << "bindFramebuffer called with unknown framebuffer";
307 } else if (framebuffer
!= 0 && (framebuffer
>> 16) != context_id_
) {
309 << "bindFramebuffer called with framebuffer from other context";
311 current_framebuffer_
= framebuffer
;
315 void TestWebGraphicsContext3D::bindRenderbuffer(
316 GLenum target
, GLuint renderbuffer
) {
319 base::AutoLock
lock_for_renderbuffer_access(namespace_
->lock
);
320 if (renderbuffer
!= 0 &&
321 namespace_
->renderbuffer_set
.find(renderbuffer
) ==
322 namespace_
->renderbuffer_set
.end()) {
323 ADD_FAILURE() << "bindRenderbuffer called with unknown renderbuffer";
324 } else if ((renderbuffer
>> 16) != context_id_
) {
326 << "bindRenderbuffer called with renderbuffer from other context";
330 void TestWebGraphicsContext3D::bindTexture(
331 GLenum target
, GLuint texture_id
) {
332 if (times_bind_texture_succeeds_
>= 0) {
333 if (!times_bind_texture_succeeds_
) {
334 loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB
,
335 GL_INNOCENT_CONTEXT_RESET_ARB
);
337 --times_bind_texture_succeeds_
;
342 base::AutoLock
lock(namespace_
->lock
);
343 DCHECK(namespace_
->textures
.ContainsId(texture_id
));
344 texture_targets_
.BindTexture(target
, texture_id
);
345 used_textures_
.insert(texture_id
);
348 GLuint
TestWebGraphicsContext3D::BoundTextureId(
350 return texture_targets_
.BoundTexture(target
);
353 scoped_refptr
<TestTexture
> TestWebGraphicsContext3D::BoundTexture(
355 // The caller is expected to lock the namespace for texture access.
356 namespace_
->lock
.AssertAcquired();
357 return namespace_
->textures
.TextureForId(BoundTextureId(target
));
360 scoped_refptr
<TestTexture
> TestWebGraphicsContext3D::UnboundTexture(
362 // The caller is expected to lock the namespace for texture access.
363 namespace_
->lock
.AssertAcquired();
364 return namespace_
->textures
.TextureForId(texture
);
367 void TestWebGraphicsContext3D::CheckTextureIsBound(GLenum target
) {
368 DCHECK(BoundTextureId(target
));
371 GLuint
TestWebGraphicsContext3D::createQueryEXT() { return 1u; }
373 void TestWebGraphicsContext3D::endQueryEXT(GLenum target
) {
374 if (times_end_query_succeeds_
>= 0) {
375 if (!times_end_query_succeeds_
) {
376 loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB
,
377 GL_INNOCENT_CONTEXT_RESET_ARB
);
379 --times_end_query_succeeds_
;
383 void TestWebGraphicsContext3D::getQueryObjectuivEXT(
387 // If the context is lost, behave as if result is available.
388 if (pname
== GL_QUERY_RESULT_AVAILABLE_EXT
)
392 void TestWebGraphicsContext3D::getIntegerv(
395 if (pname
== GL_MAX_TEXTURE_SIZE
)
396 *value
= max_texture_size_
;
397 else if (pname
== GL_ACTIVE_TEXTURE
)
398 *value
= GL_TEXTURE0
;
399 else if (pname
== GL_UNPACK_ALIGNMENT
)
400 *value
= unpack_alignment_
;
401 else if (pname
== GL_FRAMEBUFFER_BINDING
)
402 *value
= current_framebuffer_
;
405 void TestWebGraphicsContext3D::getProgramiv(GLuint program
,
408 if (pname
== GL_LINK_STATUS
)
412 void TestWebGraphicsContext3D::getShaderiv(GLuint shader
,
415 if (pname
== GL_COMPILE_STATUS
)
419 void TestWebGraphicsContext3D::getShaderPrecisionFormat(GLenum shadertype
,
420 GLenum precisiontype
,
423 // Return the minimum precision requirements of the GLES2
425 switch (precisiontype
) {
446 case GL_MEDIUM_FLOAT
:
462 void TestWebGraphicsContext3D::genMailboxCHROMIUM(GLbyte
* mailbox
) {
463 static char mailbox_name1
= '1';
464 static char mailbox_name2
= '1';
465 mailbox
[0] = mailbox_name1
;
466 mailbox
[1] = mailbox_name2
;
468 if (++mailbox_name1
== 0) {
474 GLuint
TestWebGraphicsContext3D::createAndConsumeTextureCHROMIUM(
476 const GLbyte
* mailbox
) {
477 GLuint texture_id
= createTexture();
478 consumeTextureCHROMIUM(target
, mailbox
);
482 void TestWebGraphicsContext3D::loseContextCHROMIUM(GLenum current
,
486 context_lost_
= true;
487 if (!context_lost_callback_
.is_null())
488 context_lost_callback_
.Run();
490 for (size_t i
= 0; i
< shared_contexts_
.size(); ++i
)
491 shared_contexts_
[i
]->loseContextCHROMIUM(current
, other
);
492 shared_contexts_
.clear();
495 void TestWebGraphicsContext3D::finish() {
496 test_support_
->CallAllSyncPointCallbacks();
499 void TestWebGraphicsContext3D::flush() {
500 test_support_
->CallAllSyncPointCallbacks();
503 GLint
TestWebGraphicsContext3D::getAttribLocation(GLuint program
,
504 const GLchar
* name
) {
508 GLenum
TestWebGraphicsContext3D::getError() { return GL_NO_ERROR
; }
510 void TestWebGraphicsContext3D::bindBuffer(GLenum target
,
512 bound_buffer_
= buffer
;
515 unsigned context_id
= buffer
>> 16;
516 unsigned buffer_id
= buffer
& 0xffff;
517 base::AutoLock
lock(namespace_
->lock
);
519 DCHECK_LT(buffer_id
, namespace_
->next_buffer_id
);
520 DCHECK_EQ(context_id
, context_id_
);
522 base::ScopedPtrHashMap
<unsigned, scoped_ptr
<Buffer
>>& buffers
=
524 if (buffers
.count(bound_buffer_
) == 0)
525 buffers
.set(bound_buffer_
, make_scoped_ptr(new Buffer
).Pass());
527 buffers
.get(bound_buffer_
)->target
= target
;
530 void TestWebGraphicsContext3D::bufferData(GLenum target
,
534 base::AutoLock
lock(namespace_
->lock
);
535 base::ScopedPtrHashMap
<unsigned, scoped_ptr
<Buffer
>>& buffers
=
537 DCHECK_GT(buffers
.count(bound_buffer_
), 0u);
538 DCHECK_EQ(target
, buffers
.get(bound_buffer_
)->target
);
539 Buffer
* buffer
= buffers
.get(bound_buffer_
);
541 buffer
->pixels
= nullptr;
545 size_t old_size
= buffer
->size
;
547 buffer
->pixels
.reset(new uint8
[size
]);
550 memcpy(buffer
->pixels
.get(), data
, size
);
551 if (buffer
->target
== GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM
)
552 current_used_transfer_buffer_usage_bytes_
+= buffer
->size
- old_size
;
553 max_used_transfer_buffer_usage_bytes_
=
554 std::max(max_used_transfer_buffer_usage_bytes_
,
555 current_used_transfer_buffer_usage_bytes_
);
558 void TestWebGraphicsContext3D::pixelStorei(GLenum pname
, GLint param
) {
560 case GL_UNPACK_ALIGNMENT
:
561 // Param should be a power of two <= 8.
562 EXPECT_EQ(0, param
& (param
- 1));
569 unpack_alignment_
= param
;
580 void* TestWebGraphicsContext3D::mapBufferCHROMIUM(GLenum target
,
582 base::AutoLock
lock(namespace_
->lock
);
583 base::ScopedPtrHashMap
<unsigned, scoped_ptr
<Buffer
>>& buffers
=
585 DCHECK_GT(buffers
.count(bound_buffer_
), 0u);
586 DCHECK_EQ(target
, buffers
.get(bound_buffer_
)->target
);
587 if (times_map_buffer_chromium_succeeds_
>= 0) {
588 if (!times_map_buffer_chromium_succeeds_
) {
591 --times_map_buffer_chromium_succeeds_
;
594 return buffers
.get(bound_buffer_
)->pixels
.get();
597 GLboolean
TestWebGraphicsContext3D::unmapBufferCHROMIUM(
599 base::AutoLock
lock(namespace_
->lock
);
600 base::ScopedPtrHashMap
<unsigned, scoped_ptr
<Buffer
>>& buffers
=
602 DCHECK_GT(buffers
.count(bound_buffer_
), 0u);
603 DCHECK_EQ(target
, buffers
.get(bound_buffer_
)->target
);
604 buffers
.get(bound_buffer_
)->pixels
= nullptr;
608 GLuint
TestWebGraphicsContext3D::createImageCHROMIUM(ClientBuffer buffer
,
611 GLenum internalformat
) {
612 DCHECK_EQ(GL_RGBA
, static_cast<int>(internalformat
));
613 GLuint image_id
= NextImageId();
614 base::AutoLock
lock(namespace_
->lock
);
615 base::hash_set
<unsigned>& images
= namespace_
->images
;
616 images
.insert(image_id
);
620 void TestWebGraphicsContext3D::destroyImageCHROMIUM(
623 base::AutoLock
lock(namespace_
->lock
);
624 base::hash_set
<unsigned>& images
= namespace_
->images
;
625 if (!images
.count(id
))
626 ADD_FAILURE() << "destroyImageCHROMIUM called on unknown image " << id
;
630 GLuint
TestWebGraphicsContext3D::createGpuMemoryBufferImageCHROMIUM(
633 GLenum internalformat
,
635 DCHECK_EQ(GL_RGBA
, static_cast<int>(internalformat
));
636 GLuint image_id
= NextImageId();
637 base::AutoLock
lock(namespace_
->lock
);
638 base::hash_set
<unsigned>& images
= namespace_
->images
;
639 images
.insert(image_id
);
643 unsigned TestWebGraphicsContext3D::insertSyncPoint() {
644 return next_insert_sync_point_
++;
647 void TestWebGraphicsContext3D::waitSyncPoint(unsigned sync_point
) {
649 last_waited_sync_point_
= sync_point
;
652 size_t TestWebGraphicsContext3D::NumTextures() const {
653 base::AutoLock
lock(namespace_
->lock
);
654 return namespace_
->textures
.Size();
657 GLuint
TestWebGraphicsContext3D::TextureAt(int i
) const {
658 base::AutoLock
lock(namespace_
->lock
);
659 return namespace_
->textures
.IdAt(i
);
662 GLuint
TestWebGraphicsContext3D::NextTextureId() {
663 base::AutoLock
lock(namespace_
->lock
);
664 GLuint texture_id
= namespace_
->next_texture_id
++;
665 DCHECK(texture_id
< (1 << 16));
666 texture_id
|= context_id_
<< 16;
670 void TestWebGraphicsContext3D::RetireTextureId(GLuint id
) {
671 base::AutoLock
lock(namespace_
->lock
);
672 unsigned context_id
= id
>> 16;
673 unsigned texture_id
= id
& 0xffff;
675 DCHECK_LT(texture_id
, namespace_
->next_texture_id
);
676 DCHECK_EQ(context_id
, context_id_
);
679 GLuint
TestWebGraphicsContext3D::NextBufferId() {
680 base::AutoLock
lock(namespace_
->lock
);
681 GLuint buffer_id
= namespace_
->next_buffer_id
++;
682 DCHECK(buffer_id
< (1 << 16));
683 buffer_id
|= context_id_
<< 16;
687 void TestWebGraphicsContext3D::RetireBufferId(GLuint id
) {
688 base::AutoLock
lock(namespace_
->lock
);
689 unsigned context_id
= id
>> 16;
690 unsigned buffer_id
= id
& 0xffff;
692 DCHECK_LT(buffer_id
, namespace_
->next_buffer_id
);
693 DCHECK_EQ(context_id
, context_id_
);
696 GLuint
TestWebGraphicsContext3D::NextImageId() {
697 base::AutoLock
lock(namespace_
->lock
);
698 GLuint image_id
= namespace_
->next_image_id
++;
699 DCHECK(image_id
< (1 << 16));
700 image_id
|= context_id_
<< 16;
704 void TestWebGraphicsContext3D::RetireImageId(GLuint id
) {
705 base::AutoLock
lock(namespace_
->lock
);
706 unsigned context_id
= id
>> 16;
707 unsigned image_id
= id
& 0xffff;
709 DCHECK_LT(image_id
, namespace_
->next_image_id
);
710 DCHECK_EQ(context_id
, context_id_
);
713 GLuint
TestWebGraphicsContext3D::NextFramebufferId() {
714 base::AutoLock
lock_for_framebuffer_access(namespace_
->lock
);
715 GLuint id
= next_framebuffer_id_
++;
716 DCHECK(id
< (1 << 16));
717 id
|= context_id_
<< 16;
718 framebuffer_set_
.insert(id
);
722 void TestWebGraphicsContext3D::RetireFramebufferId(GLuint id
) {
723 base::AutoLock
lock_for_framebuffer_access(namespace_
->lock
);
724 DCHECK(framebuffer_set_
.find(id
) != framebuffer_set_
.end());
725 framebuffer_set_
.erase(id
);
728 GLuint
TestWebGraphicsContext3D::NextRenderbufferId() {
729 base::AutoLock
lock_for_renderbuffer_access(namespace_
->lock
);
730 GLuint id
= namespace_
->next_renderbuffer_id
++;
731 DCHECK(id
< (1 << 16));
732 id
|= context_id_
<< 16;
733 namespace_
->renderbuffer_set
.insert(id
);
737 void TestWebGraphicsContext3D::RetireRenderbufferId(GLuint id
) {
738 base::AutoLock
lock_for_renderbuffer_access(namespace_
->lock
);
739 DCHECK(namespace_
->renderbuffer_set
.find(id
) !=
740 namespace_
->renderbuffer_set
.end());
741 namespace_
->renderbuffer_set
.erase(id
);
744 void TestWebGraphicsContext3D::SetMaxTransferBufferUsageBytes(
745 size_t max_transfer_buffer_usage_bytes
) {
746 test_capabilities_
.max_transfer_buffer_usage_bytes
=
747 max_transfer_buffer_usage_bytes
;
750 TestWebGraphicsContext3D::TextureTargets::TextureTargets() {
751 // Initialize default bindings.
752 bound_textures_
[GL_TEXTURE_2D
] = 0;
753 bound_textures_
[GL_TEXTURE_EXTERNAL_OES
] = 0;
754 bound_textures_
[GL_TEXTURE_RECTANGLE_ARB
] = 0;
757 TestWebGraphicsContext3D::TextureTargets::~TextureTargets() {}
759 void TestWebGraphicsContext3D::TextureTargets::BindTexture(
762 // Make sure this is a supported target by seeing if it was bound to before.
763 DCHECK(bound_textures_
.find(target
) != bound_textures_
.end());
764 bound_textures_
[target
] = id
;
767 void TestWebGraphicsContext3D::texParameteri(GLenum target
,
770 CheckTextureIsBound(target
);
771 base::AutoLock
lock_for_texture_access(namespace_
->lock
);
772 scoped_refptr
<TestTexture
> texture
= BoundTexture(target
);
773 DCHECK(texture
->IsValidParameter(pname
));
774 texture
->params
[pname
] = param
;
777 void TestWebGraphicsContext3D::getTexParameteriv(GLenum target
,
780 CheckTextureIsBound(target
);
781 base::AutoLock
lock_for_texture_access(namespace_
->lock
);
782 scoped_refptr
<TestTexture
> texture
= BoundTexture(target
);
783 DCHECK(texture
->IsValidParameter(pname
));
784 TestTexture::TextureParametersMap::iterator it
= texture
->params
.find(pname
);
785 if (it
!= texture
->params
.end())
789 void TestWebGraphicsContext3D::TextureTargets::UnbindTexture(
791 // Bind zero to any targets that the id is bound to.
792 for (TargetTextureMap::iterator it
= bound_textures_
.begin();
793 it
!= bound_textures_
.end();
795 if (it
->second
== id
)
800 GLuint
TestWebGraphicsContext3D::TextureTargets::BoundTexture(
802 DCHECK(bound_textures_
.find(target
) != bound_textures_
.end());
803 return bound_textures_
[target
];
806 TestWebGraphicsContext3D::Buffer::Buffer() : target(0), size(0) {}
808 TestWebGraphicsContext3D::Buffer::~Buffer() {}
810 TestWebGraphicsContext3D::Image::Image() {}
812 TestWebGraphicsContext3D::Image::~Image() {}